This post is a chapter from my book, The Complete Software Developer's Career Guide. I'm writing the book live on this site week-by-week. If you enter your favorite email address here, I'll send you the prior chapters and get you caught up - then send every new chapter as it comes out!
I don’t even need an outline to write this chapter.
Of all the topics I talk about, this is perhaps one of the most exhausted; continually asked about, questioned, and evaluated.
I’ve talked about this topic so much that I dedicated an entire YouTube playlist to all the videos I’ve done on the topic, and that list is continually growing.
What am I talking about?
The age-old debate of whether or not you should become a specialist or a generalist.
Should you become a “jack-of-all-trades” and a “full-stack developer,” or should you specialize in one or two areas of software development and “go deep?”
Well, it turns out this is sort of a false dichotomy.
The real answer is both.
Let’s find out why.
The Power Of Specialization
Before we get into the debate, I want to start off by showing you just how important and beneficial specialization is.
Let’s suppose that you were on trial for a murder. Yes, a murder. You didn’t do it—I know you didn’t—but you still need to prove your innocence. What do you do? Do you hire a lawyer who is good at tax law, divorce law, real estate law and criminal law? Or, do you hire a lawyer who specializes in criminal law, specifically defending people who are convicted of murder?
I don’t know about you, but if the rest of my life is on the line, I’m going to choose the specialist every time.
Many people say they want or value a generalist, and they think they do, but when it comes down to it, they pick a specialist every time.
I’ll give you another example. I wanted to get some crown molding done throughout my house. Anyway, I was looking for carpenters or contractors to do the crown molding when I came across this one company who specialized in crown molding. In fact, the name of their company was Kings of Crown. All they did was install crown molding. That is all they did. Who do you think I chose?
Did I want to take a chance on a carpenter or contractor who did some crown molding, or did I want to call the crown molding “experts” and get the sure thing?
That’s not to say there isn’t any value in having a broad base of knowledge or being a generalist to some degree (there are times when I’m looking for a general handyman), but it is extremely valuable to be a specialist of some kind—or at least to market yourself that way.
Think about it this way. Do you think that fictional murder trial lawyer knows about other areas of law other than murder trials? Of course, he does. He might actually be pretty good in multiple areas of law and have knowledge in several fields. But he advertises himself as a murder lawyer because he understands the power of specialization.
The same for those crown molding guys. Don’t you think they could probably handle other carpentry jobs? Of course, they could, but they choose to specialize because it’s much more profitable to do so.
In Order To Specialize, You Have To Have A Broad Base
One thing that many software developers don’t understand is that just about all specialists are also generalists, but no generalists are specialists.
What do I mean by this?
I mean that, usually, in order to acquire the skills of a specialist, a great deal of general knowledge is required and accumulated along the way.
It’s very difficult to be a good specialist without also building a broad base of general knowledge about your field.
My brother-in-law is studying to become an oral surgeon. In order for him to do that, he had to first go through dental school and become a dentist. Now, he’s not going to be doing general dentistry very often, but to him, filling a cavity or doing some general dentistry work is cake. He’s probably better than most generalist dentists, simply because he had to learn all that and more in order to become an oral surgeon.
That doesn’t mean that every specialist is a good generalist, or that they keep their skills up to date, but in general (haha) you’ll find most specialists generally do. (How do you like that sentence?)
This is all to say that specializing does not preclude you from being a generalist also, it just gives you more options and makes you more valuable.
It’s All About the T-shaped Knowledge
What you really want to strive for is what is known as T-shaped knowledge.
It means that you have a broad base of knowledge in your field, and then you have at least one area of deep, specialized knowledge or skill.
As a software developer, you should strive to be well-versed in best practices, algorithms, data structures, different architectures, front-end, back-end, databases, etc.
But, you should also pick at least one area where you are going to go deep.
You need to pick some specialization that will set you apart from the masses and greatly increase your value. When you build up your personal brand and market yourself, you are going to use this specialization to do it. If you want to make waves, you need a small enough pond. In the HUGE pond of software development, being a generalist will make it more difficult to even make ripples, at least at first.
So, yes, work on being a well-rounded software developer. Develop a broad base of knowledge and grow that base, little by little, year after year. But also pick some specialization that you will dive into and become a master of. Eventually, you can even have “comb-shaped knowledge,” where you have multiple deep specialties, like Elon Musk.
But start with one.
But Everyone Says They Are Looking for Generalists
I know, I know, every job description says that they are looking for good software developers who can wear many hats or work with the “full stack” or can be a jack-of-all-trades. They want you to possess every skill under the sun. It’s all a lie, I tell you. A big fat lie.
I guarantee you that if you have the exact skills that are required for a job and if you are an expert in the framework or technology that company is using, they are going to be much more likely to hire you than a generalist.
What companies are really saying when they say they want someone who is a generalist, is that they want someone who is adaptable and can learn quickly.
The fear is that they’ll hire someone who can only do one thing, so they try to safeguard against that by making the job description state that experience with their framework or technology stack is not necessary, even though that’s not completely true.
Don’t get me wrong, it’s not an intentional lie. I do believe hiring managers honestly think they want generalists, but like I said, what they really want is someone who is versatile and flexible. You can still be that and be a specialist. And like I said before, your best bet is to sort of be both.
Get that T-shaped knowledge so that you do have a broad base, but go deep in one area so that you can be the expert in the exact technology or skill set that matches the job you apply for.
You Can’t Even Be a Generalist Today
It’s not really possible. The field of software development and technology is so large and changing so rapidly, that you can’t know it all. Yes, you can have a broad base of knowledge. Yes, you can understand fundamental principles. But, no, you just can’t understand enough about everything that exists out there to really call yourself a generalist anymore.
Even if you are a “full stack” developer, you are going to have to pick a stack or two. You can’t know them all and be effective by any real measure. It’s not just computer science and programming where this phenomenon is occurring either. Every major profession is moving towards more and more value on specialization.
Consider how large medicine is today. Generalist doctors have trouble diagnosing underlying illnesses and problems because there are just too many possibilities.
Accountants, lawyers, financial analysts, and just about every kind of engineer have to specialize to be effective because knowledge domains are growing to such large extents.
But What if I Specialize in The Wrong Thing?
Then specialize in something else. It’s not that big of a deal. One of my good friends, John Papa, specialized in a Microsoft technology called Silverlight. And then Silverlight was axed by Microsoft and it’s now as dead as a doorknob. But did John throw his hands up in the air, give up, and decide to live in his car? No. Because he was already a specialist, he had built up a reputation and a following.
He just shifted and pivoted to another specialty that was closely related.
Now John is a specialist at developer SPA (Single Page Applications), and he’s doing even better than he was before.
Far too many software developers I talk to are so afraid of picking the wrong thing to specialize in that they don’t specialize in anything. They remain stagnant in their careers for years, paralyzed by fear, always considering the “what ifs.” Don’t do that; just pick something and go with it.
It’s a much better choice than doing nothing, and you can always change course and switch directions later on if you need to. Plus, you’ll find that once you learn how to go deep into one specialization, the next one is much easier. Many skills that don’t seem transferable are, and developing the ability to “go deep” is valuable in itself.
So, What Should You Do?
Regardless of where you are in your career, pick some kind of specialization to pursue.
Don’t worry if it’s not the “right” or the final one.
Start with one, build your personal brand around it, and decide to go deep.
Err on the side of picking something too small and specific rather than too broad. Don’t be a C# developer: be a C# developer specializing in a specific C# framework, or technology or even technology stack. Try to go as small and detailed as you can. You can always branch out and expand later.
My friend Adrian Rosebrock is a very successful software developer and entrepreneur who specializes in a specific Python library for computer vision. You wouldn’t believe how successful he has been with this particular niche, even though it’s extremely small and focused.
At the same time, work on building up your general knowledge of software development—your broad base. Learn how to write good code. Learn about the underlying principles and technologies that may manifest themselves in many ways, but really are never changing at the core.
You either want to learn things that are deeply focused and directly in your specialty or broad enough to be widely applicable and somewhat timeless. Don’t try and learn a bunch of different programming languages and frameworks that you will likely never use.
Following this approach, you’ll set yourself apart and set yourself up for success.
This post is a chapter from my book, The Complete Software Developer's Career Guide.