It's the last day of the decade and I'm taking the opportunity to reflect on the most important lessons I've learned regarding work. I want to talk about the most important of them all. The one I would emphasise to anyone coming into a career even vaguely related to software today, if I could only choose one.
Just build the product.
Building software is really fun. There are few things I enjoy doing more. Creating something useful using nothing but the raw materials of ideas, with essentially limitless possibilities, with your own creativity as the only physical limit on what's possible.
It's amazing. And it's why I got into it and am still doing it, entering a second decade with more enthusiasm than ever.
A thought excercise: think about the first thing you ever built. Creating it, playing with it, tweaking it, and enjoying that process was endlessly fascinating. Do you remember that first moment when it actually did something!? What an incredible moment. After that you were sat with your eyes glued to your screen for hours, perhaps forgetting to eat, perhaps forgetting to sleep, just toying around with this thing. Ring any bells? Amazing, wasn't it?
Ok, now -- what language was it written in? Which editor did you use? Use any open source libraries? In the best way? How long did it take to run the build? Was it easy to debug? Was it as memory efficient as it could have been? Were you building it on a really slick machine? What was your keyboard set up?
How did you feel reading the first paragraph? And how about the second? Which set of feelings felt like more important drivers for you working in software? Which felt more important full stop? Which should take priority?
Which did you spend more time, energy and effort on this past year?
If it was the first set, stop reading, and go build stuff! You've figured this out already.
If it was the second, well done for being honest, I'm with you. Now read on and spend a moment to reflect on why that is.
Most people, probably all people doing software for long enough, are going to at some point find themselves prioritising the second category of concern more and more. It seems to be a pit of success. It's a good thing to start falling into it, because it means you're succeeding as an engineer. As you do better, like any expert, you're going to improve your tools and techniques, so you can continue to do even better.
This is a natural positively reinforced cycle. But it's not a spiral staircase with something great, and reachable, at the top. Instead, it's a pit, with a bottom. After about a decade of falling into the pit, doing a bit more digging here and there, exploring it, you're going to find your feet solidly on the bottom.
You know it's a pit, you know its shape, and you know where the bottom is. This moment is when you have to look up, take what you've learned, climb out of the pit and just go and build stuff. What you don't want to do is continue digging further downwards, thinking there's unreached gold there you can discover if only you go a little bit further. There isn't. The gold is out there.
It's important to learn how to use your tools well, but once you have, stop prioritising that. They're good enough now, you know how to use them. Don't get trapped in this local maximum of optimisation. Go and build stuff.
You can spend ever more money on tennis rackets, you can do a lot of research on types of strings. You can change your opinion 3 times on the best type of string. You can look forward to models in 5 years that will be 8% lighter yet more powerful. Hey, you might even play a bit better with that racket, it's true. But Rafa Nadal is still beating you every single time with a $10 beginner's racket. Not most times, not 99% of the time. 100% of the time. Every time.
Once you've basically learned how to use tools, it's time to stop focusing on the tools and to start focusing on your game, probably driven by your love of it. This is going to be the dominant factor in your progress from here on, and also in your enjoyment. You're never going to improve faster by focusing more on your tools than your game.
Whenever you start searching around, spending more than half an hour on anything tool related, step back and analyse what the payoff of this is going to be. Yeah, stay current. Spend that 30 mins every once in a while. But always remember why you are doing this. Remember that first thing you built and the questions above. In another year, when you ask the same questions about this thing you're building now, what will seem more important then?
Whatever it is you're thinking will give you some marginal gain, it's just that - marginal. It doesn't matter. Do it the way you already know. Build features, not toolchains.
Just build the product.