Lately, I’ve been involved in many interviews with junior and regular developers, which made me think about the career choices in the beginning of my own journey. I also got provoked by some opinions I have read lately, so let me bring you along for a short retrospective about generalists and experts.
Software developer vs. programmer
Mostly to get it out of the way, I think it’s worthwhile to take a look at this differentiation, which certainly is not a definition, but rather a way of understanding the difference between a software developer and a programmer, so we can discuss the topic further with a common understanding of the terminology.
I see programmers as people capable of writing code fast. Those guys are usually proficient and nimble in technology and for them to work efficiently, they need specific tasks on a granular level, e.g. implementing a connection to Cosmos DB hosted on Azure, or implementing the front end of the app according to detailed specifications.
On the other side of the coin, we’ve got software developers, who tend not to be as quick as programmers in writing code, but have other qualities. Those guys are capable of understanding the business issue, they figure out a way to approach it, talk with the end-user and jog down at least basic requirements, which they can pick up and write the full solution. They can work with business issues, or (partly analyzed) user stories, e.g. loading of user details is too slow, or saving invoice details need to update the account balance.
From this differentiation, we can safely assume that programmers can work much faster, but require more help, or part of the work done by somebody else. They’re also more focused on a single technology, as they need to be proficient to be effective.
I can safely say that in my beginnings I wanted to be a programmer – I wanted to sit beside a giant desk and jog down lines of code in an instant, as soon as something would be required (in a typical movie-hacker manner). Soon, however, my character kicked in, and I realized that I prefer solving customer issues, rather than straight up coding, which led me in the direction of a software developer role, which is a much better fit for me.
During my experience, I’ve also learned to look from the perspective of my clients and employers, and usually, I think they are looking for problem-solvers, not the fastest programmers (of course, we’ve got some exceptions, as programmers can be extremely useful in a specific environment).
Generalist vs. expert
This is another approach to the same topic, which seems similar on the surface, but I think it’s actually going a step further.
Generalists are people that try to understand many technologies on a basic level and use the right tools for the job (ever heard a phrase: when all you’ve got is a hammer, everything starts looking like nails? – they strive not to fall within that trap). They also do not focus on a single domain, going a bit deeper to understand many solutions across different fields, as you can use game systems in the medical field, casino mechanisms in gaming (ever heard of loot boxes?), or blockchain concepts in art (here comes NFT, right?).
On the other side of the coin, we’ve got experts, who focus on a specific aspect – either a specific programming language, specific framework, or a specific domain. Being an expert has many advantages – people with great knowledge are always sought after, especially if that knowledge is new (how valuable are experts in blockchain currently?) or, on the contrary, almost forgotten (I still hear legends about Fortran programmers making ridiculous salaries). Moreover, experts can sell books or courses with relative ease. Being an expert however can be volatile, as if you focus solely on a particular framework and that technology becomes obsolete, you’re down on your luck (imagine being a Silverlight expert now).
Fine, but how does it tie back together?
My theory is: imagine a 2D plot, where on the first axis you put generalists and experts, while the second axis presents software developers and programmers. This way, you are presented with four possible archetypes ranging from generalist software developers up to expert programmers and this is getting pretty interesting.
I thought extremes are most common
My initial impression was that extremes are most common (generalist software developers and expert programmers), but boy… I’m sure I was wrong.
- A generalist programmer would be someone with general knowledge across a few domains, but focused solely on programming, getting their tasks well defined by a Business Analyst or a Product Owner – that sounds like a developer working for a large corporation.
- An expert software developer would be someone who puts focus on a particular domain and doesn’t require much guidance, as their technical knowledge is versatile – that sounds like a finance developer.
- A generalist software developer would be a jack of all trades, master of none, someone capable of finding solutions spanning multiple domains and multiple technologies – sounds like a very versatile developer, capable of working on .NET and Golang code at the same time, or a CTO perhaps, but having knowledge that vast would mean not being on top of all possible ecosystems all the time.
- An expert programmer would be hyper-focused on a particular technology and specific domain, a true expert – like a physics C++ developer, working on a ragdoll model for a game engine or perhaps a master of Kotlin, focusing on a code alone.
As with many theories and attempts at such differentiation, this might not be useful to everyone, but I find it interesting.
Try to imagine what your company actually needs, when you’re building a team – expert programmers sound great, as they will plow through tasks like there’s no tomorrow, but maybe hiring a whole team with such competencies would be straight up useless, as you would have to specify each task very well to see any progress. I’m sure having a generalist software developer can be very beneficial when there’s a lot of designing and figuring out the way to create new software, but having a whole team of such dreamers could be disastrous for the project.
Ask yourself: where do you see yourself on this chart? Are you happy with your choice, or do you feel like it’s time for a shift?
Personally: I mentioned I wanted to be an expert programmer in my early days. Now I’m sure I’m more suited for the role of an expert software developer, which I’ve been doing for the past few years (focusing on .NET, but being a full-stack developer, designing databases or UI). And lately, with my curious head, I think I might be shifting into a generalist software developer role, but we’ll see what the future holds for me.
P.S. If you are an interviewer, just as I am, and you want to have fun with this theory – try to figure out for yourself where your next interviewee lands on my chart.
Have a good day, guys!
Marcin Kern, Senior Software Engineer in Rite NRG.
My experience spans writing and designing desktop applications, websites and cloud solutions. Entirety of my 9-year-long commercial experience consists of writing .NET exclusively, although through the past few years I’ve added a Frontend spin to the mix in the form of React. I’ve also spent a lot of time advocating Agile, as I believe it can be very useful if it’s understood and done right.
Outside of work I’m a dad of a happy 1 year old boy, husband, video-game lover (Amazon, bring me Lost Ark already, I can’t wait!), I like digital painting and enjoying a nice sauna. I also enjoy learning programming languages, when my curiosity gets the better of me.