My dad started teaching me Basic when I was about 7 years old, and since about that age I knew that I wanted to build software for a living. It was obviously a fun and useful thing to do, and something that I could do well. But there is a big — and I mean Grand Canyon-scale BIG — difference between “programming” and working as a professional software engineer.

Here are, in no particular order, some things that nobody told me about working in tech as a software engineer:

That it is normal to have more lines of tests than production code. That having no choice but to use vi early in my career would mean that I can never leave those keybindings behind. That we spend a ridiculous amount of time setting up builds, releases and general tooling. Sometimes as much or more time that you spend coding. (And don’t even get me started about operations, on-call and all the other pieces that turn “programming” into “a product in hands of users”.) That my gender or my age or my ethnicity or my sexual orientation or my weight or my clothes might (will!) have an impact on the perceived quality of the software I build. (Or, in other words, that this is not really a meritocracy, and doing a good job is not nearly enough.) That writing code is only a small part of what goes into shipping production software. That so much of my work life would be subordinate to the choices of barely-clued-in VCs, and overwhelmed first-time founders with no industry experience. That everything old is continuously made new again — from MySpace to Facebook, from IRC to Slack. PHP is cool again, and functional programming is trending. That having decent people skills makes my technical skills suspect, in the eyes of some. That learning to manage my own energy and mindset is the most important skill through gnarly debugging and hairy code reviews alike. That you can have more than a 100% base salary difference doing the same job, depending on if you work at a small startup or one of the large companies. That not all software engineering roles have the same cachet in the eyes of the local culture. (Alternatively: that good frontend and test automation specialists are grossly undervalued.) That the idea that working at a small startup will make you rich is outdated. Barely anyone IPOs these days, and you can save up more easily if you work for a bigger, stable company. That CSS is the most complex modern programming language. That internships should always be paid at market rate. That spunky online book vendor would become synonymous with distributed infrastructure. That the new Altavista competitor would become a less bad Microsoft Office. That the new version of My Space would help damage democracies the world over. That, 15-ish years in, my main professional contributions could be summarized as: nudging folks to write better and/or more tests, and getting people to talk to each other. That the best technology doesn’t necessarily win. In fact, it often doesn’t. That I would be this suspicious when the tests pass on first try, and have to invert my assertions to force a test failure and convince myself that things are working as intended. (Aside: Why is this not a standard feature of testing frameworks? I want some way to re-run tests flipping some of the assertions, to make sure they are testing what I think they are.) That appropriate use of emojis would become such an important communication skill. That it is all people, all the way down. They are (mostly) lovely, and not nearly as hard-shelled as turtles.

What is something that surprised you about working as a software engineer?

Originally published on https://anaulin.org/blog/.