Thoughts after six years and becoming a 'senior' engineer


Where did the time go?

I’ve been working as a developer for six years by this point. I’ve worked exclusively on the frontend, the backend, and even have more than a little devops experience under my belt by this point. I’ve worked for huge companies, for tiny startups, built my own webapps, and am starting to feel like I’ve seen it all. I haven’t of course, but it often feels like it.

I’ve spent a lot of time this last year networking (better late than never), and have met hundreds of delightful people who work in the tech space, and dozens of prospective juniors who are desperate to break into the market, and it’s almost bittersweet. So here I am to write just a little about the process, how things have gone, and maybe a bit of new dangers with LLM’s and the new, hyper escalated tutorial hell that is now possible thanks to AI, as well as to some of the deeper thoughts that I’ve put some thought into about the field for over half a decade now.

Starting Out

This one is for the hopefuls, the students, and the people who are trying to learn how this all works. It can be an intensely frustrating time, and at first, you are focused on ‘learning how to code’. Someone told you it’s how to make good money, and it’s a dusty vague thought in the back of your mind that somehow, we write things, and then computers do those things. The middle part of the process is pretty grey. There’s something about … compilers? and machine code? Whatever. That’s not going to stop you, so you download a code interpreter and create your hello_world in whatever language you end up picking.

It’s at this point I believe that programmers get hooked. You’ve done something, created something, and then the machine did it. Magic! How do you feel like this all the time?

So you learn a framework. You follow tutorials. You copy paste, copy paste, copy paste, and then realize you learned absolutely nothing. Oh no! I think maybe half of hopeful juniors get stuck here, and never escape. This is called tutorial hell. And now, with the advent of ChatGPT, tutorial hell is even harder to escape. Now, you can use AI to generate code in a way that seems even more magic than before. You give it english, and it can spit out functions, or even entire files of what seems like code that always works.

This is a trap. This is the venus fly trap of programming, and you are almost guaranteed to fall into it. And it might not even be your fault. I recently met an undergrad student who’s internship gave them chatgpt subscriptions and told them that’s all they needed for resources. Crazy. Queue my old man yells at clouds rant.

This new tutorial hell is so seductive since it feeds you code that looks good. It has to be right! And since you don’t know any better about efficiency, it works well enough. and unfortunately, well enough is only half the struggle. If you’ve ever read or watched some of Uncle Bob’s clean code, working code is only the first half of the step. The next is that it must work well. And if you don’t know what you’re doing, you’ll miss the hints that these solutions are well, kinda bad. LLMs will allow you to dig a hole straight downwards while reassuring you every step of the way that it’s a good move.

I’m getting a little frustrated with seeing juniors fall into this pit, and it seems too comfortable to escape from. I wish them well.

The nature of programming (for the builders)

This might seem like it got a bit off track, but bear with me here. The nature of programming isn’t writing code. That’s right. It’s really not. The nature of programming is building complex systems that do something. That listens to something. That updates something. Maybe they change this kind of data into that kind of data. That’s it. We’re just data jockeys, mutating stores of information while shoving it from here to there. This bears to note that there’s about ‘three’ kinds of tribes of developers. This is because there’s three kinds of problems. (Well, four really, but we’re not going to focus on the hackers this time)

The first are math related. These are our poets. These are some of the true geniuses that 30 years ago created an algorithm, and then many of the other math poets then spent decades trying to improve that by .00001% efficiency. A lot of other programmers use the systems these guys build, and we are very grateful.

The second is all physics based. These are the hardware engineers, the guys who build the things the rest of us put our code on.

The third are the builders, like me. We take these tools, and the hardware, and put all the pieces together. Sometimes the code works, and sometimes it doesn’t. When I started this profession, I was in love with the idea of the hollywood programmer. The single programmer in a dark room that interacted with no one, and wrote world-changing code by themselves. I’m not entirely sure anymore if this kind of person actually exists, besides the few who maintain some OSS that do things like run all the math on the web.

Programming isn’t just code. Programming is a flow of logic, and then we add it to computers. We take algorithms that others have made, and hardware others have made, and then shuffle that data around using API’s. and http, ftp, tcp, udp, and all the other network protocols, to build things that people can use to make their lives easier.

And it’s social! Oh my word it is social. That job of sitting in the dark room alone? I never found it. Instead I’ve grown to love being on a team. I’ve worked with some of the smartest people I could ever hope to meet, and been inspired by them, and hopefully have inspired in return. I’ve grown to love it from the quiet little fellow I was in the past, and take great comfort in helping others move towards being all that they can be. So programming isn’t even just about the code shuffling, but also about the people. I read somewhere that if you want to go fast, go alone. If you want to go far, go together.

On work

Jobs. Can’t live with them. Can’t live without them… Unless we all move back to the savanah and little grass huts.

Interesting work can be hard to find, and with the market the way it is right now, even just work can be hard to find. It’s a far cry from a few years ago from when I’d sometimes have 10 recruiter phone calls before lunch. For this, I have surrendered the illusion of control I once had. As long as there are interesting problems to solve, I’m happy.

On testing

I have acquired a deep and lasting dislike of mocking for tests, especially on the frontend. In fact, many frontend tests feel like exercises in futility, and even if they get written, having them added to the CICD pipeline is its own beast. On the occurrences I get to use something cozy like rust, code coverage feels like a blessing. The rest of the time, keeping them updated while other code changes, and other engineers on my team change code without changing tests can feel like a burden. I’m not sure how to fix this going forward, since controlling others actions is an exercise in futility.

On school

I finished my masters program this year, and while I’m grateful for the connections I made, and the things I learned… I also really could have learned most of it on my own anyways. But it opened doors that were closed to me beforehand, and I enjoyed the process. It’s a great place to meet passionate people who are interested in changing the world.

On interviews

I’m really not sure why we keep doing technical interviews of little algorithm challenges, but I don’t think anyone has found a better solution yet. Maybe one day. The really neat part of programming is that anyone can do it, and we don’t have to get accredited like traditional engineers. The problem here is that it’s really hard to weed out the ones who just can’t really do the job, or have hired someone to take the tests for them, or have a second tab open, with you guessed it, some flavor of LLM spitting out the answers.

On languages

Your language you use almost barely matters anymore. There. I said it. We have rust on the web, and python on embedded devices. There are no more rules.

However, if you work on the frontend, you are almost guaranteed to be using javascript or typescript. For the rest though, even Rust these days has production ready backend libraries like Actix or Axum.

However, if you can use a strictly typed language, I highly recommend it. The more time goes by, the more I have grown to loath untyped systems.

Conclusion

Overall, the more I’ve learned, the more I realized that I will never be able to learn everything. This field is simply too wide to become an amazing designer, and devops, SRE, frontend, and backend engineer. You can be OK at a lot of them at the same time, but the deep cuts require specialization, and that’s OK. It seems like computers are here to stay, and with any luck we’ll get to be the ones still building amazing things in 20 or 30 years time.