The Insanity of Being a Software Engineer

Is something I think about often because I can’t help but wonder if most other jobs are like this.

Being a software engineer is tough. You need to know a couple of programming languages and tools right from the get-go. But that won’t cut it. Companies expect you to know whatever particular framework they use. That might be Rails or Django or Laravel or something else. You’ll also need CSS. It’ll take you a lifetime to learn — and you still won’t know why the layout’s breaking — but knowing just enough to get by is feasible.

It’s unlikely that you won’t have to deal with JavaScript. Maybe you’re lucky and you just need to sprinkle in the occasional jQuery in the legacy app you’re maintaining. But things change.

At some point, the people at Facebook built React. Turns out that company with tens of thousands of engineers had two specialties all along: front-end and back-end. The programming hive-mind collectively decides that React is now the right way to build software but, at the same time, companies decide they can’t afford more engineers. Lo and behold the full-stack engineer is born and you’re it. Get to learning React and building REST APIs on top of the back-end tech you already know.

It won’t stop there. You know you need types, right? Add TypeScript. Are you really going to be managing state in React like a pleb? Add Redux. Feeling smart because you dodged both of those? Have fun figuring out to how to configure webpack/esbuild/rollup, plus Prettier, plus ESLint.

“Ok”, you say. “But I can keep doing things the way that I’ve been doing them. It worked fine. I don’t need React”. Of course you can. You can absolutely deviate from the way things are done everywhere in your fast-moving, money-burning startup. Just tell your boss that you’re available to teach the new hires — who’ve only ever heard of React — about the joys of server-side rendering.

Oh and, turns out we were just getting started.

Back when dinosaurs roamed the earth there was a type of professional called a System Administrator. Their whole job was to make sure that your backend was working nicely. They handled infrastructure changes, upgrading the database, system upgrades, keeping the daemon running, restarts, everything. Then came DevOps. Some cash-strapped company somewhere decided that now all of this would be handled by the engineers and everyone agreed. Now you need to learn Docker. Oh, your whole app is just a single statically linked binary and you don’t need Docker? Learn Ansible and I hope you have fun figuring out the options you need to pass to SystemD.

And you’re not even halfway there. Now you gotta learn AWS. You won’t be using the GUI to configure your infrastructure like a peasant so you better learn Terraform or Pulumi or whatever.

You do a good job. You’re promoted to manager. You need to learn a whole other job. But that’s ok because it’s the end-game. Bliss. Here’s some of the stuff you’ll need to do:

  1. Guesstimate deadlines
  2. Assign tasks to teammates
  3. Spec tasks
  4. Participate in annual reviews
  5. Provide valuable feedback during product meetings

You better hope your company has quadrupled in number of employees by this point or you’ll be doing management plus all of the above.

And it can always get worse. A recruiter reached out to me a couple of days ago about an engineering position for a secret company. They decided that they required senior level skills in Rails, Hotwire and, incredibly, native mobile development. Why not add kernel and compiler development in there as well for good measure?

Software gets more complicated. All of this complexity is there for a reason. But what happened to specializing? When a house is being built, tons of people are involved: architects, civil engineers, plumbers, electricians, bricklayers, interior designers, roofers, surveyors, pavers, you name it. You don’t expect a single person, or even a whole single company, to be able to do all of those.

Maybe a future where we can build a whole app with a couple of prompts isn’t so bad.