(Like this article? Read more Wednesday Wisdom! No time to read? No worries! This article will also become available as a podcast on Thursday)
People who regularly talk to me have been known to comment on the fact that the things we talk about sometimes end up in the pages of these articles. And indeed, if you and I discuss an issue that I think is particularly interesting or which I think is potentially relevant to other people, I add it as a topic to my “ideas” document. Today’s topic didn’t make it to the ideas document though, because no fewer than two lovely people asked me a similar and urgent question in the span of a single week, so I decided to answer them with this week’s article.
The question was (in essence) this one: Given all the things that are going on, what should we focus on to grow, become more senior, and have a shot at a decent career?
In many ways the answer to this question is a followup to my “Career advice in three parts” article, so if you haven’t read that one, you might want to start there.
The question arises because of the chaos in our industry combined with its depth, breadth, and speed of development. Lots of people are being laid off and consequently lots of people are on the hunt for a new job. Given that competition, how should one position oneself to be an attractive hire?
A few years ago you might have thought that developing globally distributed services was the thing to focus on. Then it was machine learning. And now it is artificial intelligence. The speed with which these topics came up, gained popularity, and became (at least somewhat) technically mature is quite simply staggering. At the same time, whenever you interview, you are still asked if you could please find a loop in a linked list, invert a binary tree, or sort 1 million integers in 2 MB of RAM. So we are not only faced with choosing the hip and happening thing to focus on, but also with the conundrum of how to become an expert in that hip and happening thing while keeping very basic skills up to date.
At least the answer to the last question is easy, so let me start there: Companies are not mistaken that hands-on coding skills are still relevant. This is even true for senior people whose jobs mostly consist of reading and writing design documents and sitting in meetings. Unfortunately, most companies interview for coding skills in the dumbest possible way. I am afraid that is something that cannot be helped; inertia is surely the most potent force in the universe and, on top of that, great interviewing is sadly unnecessary in a world where there seems to be more supply than demand and where companies are probably thinking they can afford to be wasteful. So the answer here is simple: Make sure you keep coding during your entire career to stay in the groove and when it becomes time to interview, prepare like a mofo by doing LeetCode until your fingers hurt. It is what I do.
This seems like a great moment to plug the book Beyond Cracking the Coding Interview by Aline Lerner and her associates. I am in the fortunate circumstance to have been a reviewer for some of the content in that book and if you ever want a job as a software engineer, ever, anywhere, you need this book.
Transparency notice: I did not get paid for this plug but I did get a free copy of the book so that I could verify how exactly my sage review comments have been unwisely ignored.
This leaves the other question: What to focus on? There are so many things to choose from! How to make sure that we choose the right thing?
Safety notice: Here, dear reader, I would like you to brace for impact because I am going to say a few things that might be upsetting to some.
First and most important of all: Learn to distinguish between the meatballs and the gravy. In any dish, even though the gravy tastes good, the meatballs are what it is about and that is really what people are ordering Gravy is good, we all love gravy, but without the meatballs, we don’t have a need for it.
Our field consists of meatballs and gravy too. Take testing as an example. I love testing and I truly wonder how anyone, ever, makes anything without developing comprehensive tests, because the moment I refactor my own code, even during the initial development process, I invariably break things. Entire volumes have been written about testing and its importance. That said, testing is the gravy. Testing experts are seldom in high regard or in high demand. If you rock up at a job interview with a resume that shows that your main experience is in developing intricate and comprehensive test suites, that is not going to work well for you, unless the position is specifically for a test engineering role. If you are a meatball expert, being able to make the gravy too increases your market value, but there is rarely any call for people who can only make the gravy. Testing is important, but it is the gravy, never the meatball.
I could go on and harp on other fields, at the risk of upsetting even more people, but hopefully you get the message. I am not saying you should never ever consider the gravy, but if you do, know that you are and what the consequences of that are.
With that out of the way we should ask ourselves the following: What do you like? This is important, because in order to get any good at something, you are going to have to spend about 10,000 hours on it so you better like it, because if not, you are not going to find the energy to spend that amount of time.
Here is an example from my own experience: In the 1990s it was obvious that Windows NT was going to be big and I spent considerable time building expertise on this platform. However, I eventually got out of that game because I actually do not like Windows. I do not like working with it, I do not like troubleshooting it, and I do not like writing software for it. I think Powershell is dumb, the Win32 API garbage, and the Microsoft Frustration Classes terrible. I have one Windows laptop in my house and it is only used to play games and to build Windows versions of some open source software I maintain.
Even though Windows is still huge, I made the right decision (for me) not to specialize into it any further than I already had because I just don’t like it and that would prove to be a barrier to becoming really good at it. On top of that, it would be life draining and soul sucking to spend my days clicking through the registry and writing IF ERRORLEVEL commands. Give me the Korn shell any day!
So what you like is very important, but I want you to apply some smarts to answering this question. We live in a world where people are too often (and vacuously) told to “follow their passion” and consequently we have many young people graduating from college with hopeless degrees that do not offer any hope of gainful employment. What you like is important, and I would never tell someone to choose a field just because it can make you money, but liking something is not enough. As my dear old mother used to say: “It is nice to have a hobby!”
She first said this to me when I was choosing the courses in secondary school that I would graduate in. Dutch was compulsory and so was one foreign language (I foolishly chose English). Math, Physics, and Chemistry were obvious choices for me. I needed a sixth one and I was contemplating History. “No”, my mum told me: “You are already interested in history and you will probably always study that in some way, shape, or form. It is nice to have a hobby; choose something useful!” So I chose Economics, a choice I never regretted.
Even in our field there are many topics that are fun and interesting but do not offer any prospects for a good career. Staying with the metaphor I introduced above, you will find that a lot of these topics are in fact the gravy rather than the meatballs. But, even if they are the meatballs, how big are these meatballs and how many people are buying them? Take FreeBSD Unix for example. It might be your life, and to be clear, it is amazing and I love it dearly, but all things considered it does not offer many great opportunities for a great career.
Cue hate mail from the BSD people. Did you read the bit above that said that I love it dearly and that I think it is amazing?
We now need to turn to some really deep self-reflection: How good are you, really? The reason I am asking you to engage in this potentially painful self-reflection is that I generally only advise people to pick areas where they have a chance of riding to the top. By no means do you need to be a genius to have a great career (I am the living proof), but you do want to have some hope in hell to master your chosen topic. Looking at myself: I am not very good at maths. I realize that compared to the general population I am probably a math wizard, but compared to people who are actually good at maths, I am terrible. That means that I should probably not try and strike out in fields like artificial intelligence research that really require you to have your linear algebra down. Math adjacent topics are great for me though, which is why I am currently building supercomputers for running AI workloads.
Of course you can always try and become an AI influencer on LinkedIn, because that clearly requires no understanding of maths, or AI, or anything really.
In order to become senior you need to have a senior attitude but also superior knowledge about the technology that you are working with. Do not waste your time digging into something that you will not become a master in!
But, all the aforementioned notwithstanding, my most important message for you is: Do not fret about it! Or at least, not too much…
The question as posed at the start of this article betrays a worry that everyone else is laser focused on their careers and that if you are not, you are going to miss out. Nothing could be further from the truth. Sure, you need to apply some thought to what you are doing, but the question is in essence a scheduling question and, as I told my students decades ago when I was explaining the operating system scheduler to them: Scheduling is easy as long as you have 20/20 vision into the future. If you don’t, you need to make some reasonable assumptions about the future and place your best bets.
More than any choice for a particular field, what has always carried me forward is that I did my best to gain an in-depth understanding of whatever I was doing, peeking under the hood of whatever abstraction layer was offered to me to figure out what was going on down there. Even if the thing I studied didn’t become huge, the knowledge I gained always served me in good stead further down the line. When I started coding C++, I was greatly helped by the fact that I could code assembler so that I understood how virtual functions actually worked. When the Internet came, I was greatly helped by the fact that I understood TCP/IP down to the wire, including many details of the protocols involved like SMTP and DNS. When containers came, the fact that I really understood the internals of the Unix kernel helped me wrap my head around the strengths and limitations of process groups and namespaces.
Many things that I studied never went anywhere (did someone say BeOS?), but everything I learnt I took with me and eventually came in useful somewhere. The choice you need to make is one for solid execution. Never be content with not knowing how something works. You might not have time to dive into now, but file it for later study and then come back to it. Technology is not magic, everything can be understood and it is the desire to do so and tenacity required to make that happen that will prove to be your greatest career asset.
It is impossible to make the right choice given that nobody knows the future. But with some clear thinking you can make a good choice and then as long as you execute correctly on it, you will be well positioned to shift to the next big thing once you have figured out what it is. Rather than worrying about making the best choice, focus on making a good one and execute on that in the best possible way.
Tiny copy editing note: the link to "sort 1 million integers in 2 MB of RAM" links out to the "invert a binary tree" page.
Life in America has changed you, Jos. I hope you're changing it as well!
Thanks for your "cold shower" posts.