First was the depressing feeling that, after seven years, I’ve become an expert in nothing in particular, instead working on whatever seemed mildly interesting at the time (iOS development, Android development, desktop UI stuff, Chrome internals, refactoring, server development, data processing pipelines, sync code, whatever) without becoming an expert in anything. It’s been productive, sure – I was promoted twice and am now a “senior” engineer – but I don’t feel like I’m still growing in a technical sense, but rather in a large-organization sense, and the idea of doing this for the next thirty years was depressing to consider.
Then I had a conversation with a former colleague, who suggested that it’s actually okay to want to work on something that one is excited about. Like, that’s a legitimate preference and totally reasonable to pursue. This seems obvious, but I’ve spent most the past seven years intentionally not caring much about what I do and instead focusing my energy on hobbies, like German or travel or cooking or reading or whatever. This advice just came at the right time, right after Advent of Code and writing all those virtual machines and interpreters and trying out Rust and Go in 2019, and it stuck with me.
A third event was a episode where two colleagues and I wanted to build a new microservice in Go. It seemed like the perfect chance – a new server, three engineers with experience and interest, institutional support – but organization reaons won out in the end: lots of Googlers don’t want to write Go; some existing code and libraries we’d need to use would have to be rewritten; no other teams near us are using it. This was fairly demotivating: I was looking to do something new and interesting based on my recent work and it didn’t pan out. I wrote most of a fairly-long blog post about this and institutional conservatism and career development but didn’t end up posting it because, honestly, the right outcome was to not write the thing in Go and the right thing for me to do was to find some other way to feel fulfilled, and after a few days of fiddling with the post my frustration dissipated and I moved on.
The final step was a conversation with my manager, in which we decided that one way forward in my career and a step to specializing was to become an expert on the internals of $PRODUCT_WE_WORK_ON, basically do a ton of refactoring and cleanups to improve the a codebase that’s so poorly factored, buggy, thread-unsafe, and inefficient that we’re four months behind on a launch simply because we’re still fixing bugs caused by tech debt. Honestly, the idea of this being the area I might have ended up trying to become an expert in was more demoralizing the closer I got to starting. I spent some time thinking about what I’m actually interested in, realized the obvious (I spent almost all of my 2019 rediscovery of programming in on languages, both their implementation as well as learning new ones), and decided to look for a languages job.
I found one! I’m joining a team on Monday that maintains an internal configuration language. It’s kind of gnarly and has confusing semantics and nobody likes it, but it’s a real language, with an interpreter and garbage collection and a debugger and libraries and first-class functions and so on, as well as thousands and thousands of client teams. And they want to improve the semantics somewhat this year, and they have real interesting work and senior engineers who’ve worked on this one thing for years. I’m very excited to see how this language implementation stuff works in the real world, outside of my toy projects. I already picked up Structure and Interpretation of Computer Programs (I read half of it a decade ago, between my math undergrad and my CS masters, and I’ve intended to come back to it ever since) as well as Types and Programming Languages and Engineering a Compiler to try to learn the fundamentals.
Very excited about this move.