Photo: Software Engineer
Photo by Christina @ wocintechchat.com on Unsplash

Today, the world is experiencing a shortage of software engineers. This is not a new thing - I, for one, have been reading about it for years.

Our industry is rapidly changing, with new frameworks replacing old ones, technologies coming in and out of fashion, and new programming languages becoming 'a thing' almost every month.

The pace of innovation has greatly accelerated in recent years and will probably continue to do so.

What should a developer focus on?

When thinking about this question, I look at what the most successful tech companies are doing. They mostly hire generalists!

Sure there are a lot of cases where a more specialized engineer is needed (Linux Kernel development, eBPF, etc.), but in most cases an engineer who understands basic programming and Operating System constructs can easily adapt to whatever the employer is using.

If you're just starting out, choose a programming language and learn it well! Explore its ins and outs, and you'll find yourself learning a lot about areas you didn't know existed. Choosing the language is essential though; right now, in 2021, I'd place my bet on one of Golang, Javascript/Typescript, Kotlin, Python, Java, or Rust.

If you master a language, learn another. Build a side-project and go for it, full-stack.

Early in my career, I started with PHP. At the time, there were no Cloud services to which I could deploy, so I also had to learn how to host my sites - so I learned how to administer Apache. Of course, Apache had to be installed somewhere, so I learned Linux. And the data needed to be stored and queryable, so I learned MySQL. This used to be called the LAMP stack; it was "full-stack," before the term existed.

Today, one can simply build projects and deploy them in Google Cloud or AWS with little knowledge of how it all works - but that's where the true generalist comes into play. Avoid the "Siren's Call" and build everything yourself - for fun!

  • buy a domain
  • configure its DNS records
  • set up a VM (or VPS), and then Linux
  • install and update system dependencies
  • optionally, use something like Docker to run containers
  • deploy an App Server
  • deploy your code
  • install a Database
  • tune it
  • cache data and figure out how to invalidate it
  • set-up an Observability stack; create alerts
  • tune your app and database
  • load-balance traffic
  • set up a CDN
  • learn about email (MX-records, SPF, DKIM, DMARC)
  • integrate with third-party service providers (e.g., ConvertKit)
  • automate everything (e.g., Terraform, Ansible, a CI/CD pipeline, hooks)
  • do it all again with other technologies/languages
  • teach others / write about it - only then will you attain true knowledge!

I hope this post was useful! Since this is posted in my digital garden, I will keep it up-to-date and keep developing it!

If you want to get notified of any changes, please subscribe to my newsletter (the form is in the footer!)

Thanks!

If you enjoyed this post, please share it with your friends!