Should you become a full-stack programmer?
Deep technology specialisation becomes both less valuable and more risky
Becoming a full-stack engineer is one of the strategies to cope with the trend that Programming becomes obsolete quickly.
If you google "full-stack vs. specialised", you can find lots of articles comparing these career paths for programmers. Not long ago, the answer was not clear to me. Now I'm convinced that full-stack is the way to go (with the exception of specialising on embedded or system-level programming, which can still be a good strategy for at least the next 10 years). I don't believe in the concept of T-shaped developer anymore either.
Deep knowledge of a particular technology, programming language, or an area of programming (such as frontend or backend) becomes less and less valuable because the platforms improve and become easier to program against over time. For example, some years ago, knowing how to tune garbage collectors and write code that allocates few objects was a large part of what differentiated seasoned Java developers. Today, this knowledge is not that important as it used to be because new garbage collectors in OpenJDK don't have any "knobs" to tune, and, generally, perform better. Similarly, frontend developers mastered writing HTML and CSS that would work in all browsers, including the notorious IE 6. Now, this skill is obsolete partially because the frontend devs use higher-level UI platforms such as Bootstrap or React, and also because the only important web engine remaining is Blink/WebKit.
Even the skill of writing correct concurrent programs (not specific to any programming language) is not as useful as it was a few years ago because backend logic is becoming more "atomic". We delegate the concurrency either to the database or the framework.
Deep specialisation also becomes riskier as a career investment. Projects come and go ever more quickly. We are not sure even about the language we will code in one year from now, let alone 5 or 10 years. On the other hand, new companies solving a particular engineering problem (such as content management or predictive analytics) emerge often. They can make the expertise you was stacking up in the problem area irrelevant (unless you actually work for this company: see Join the world-class team building the best technology in the respective area).
Finally, as a full-stack engineer, you are better prepared to quickly prototype a new product, either within your current company or outside of it, i. e. to start your own startup. Both should be favourable paths in the following decades: see “The Fourth Economy” for more on this idea.
The modern full-stack is Frontend, Backend, Data, Machine Learning, and DevOps.
Counterarguments
Naval suggests that everyone who wants to make some difference should build so-called “specific knowledge”, i. e. specialise as deeply as they can:
Become the best in the world at what you do. Keep redefining what you do until this is true.
The strategy of doubling down on the business analysis which I suggested in the previous post effectively implies learning more about the business of your company, and also to stay at one company for longer as long as possible rather than being a maverick who does “just programming” and hops between companies every year or so.
In theory, you should be able to work at one company and develop as a full-stack engineer or switch specialisations once in a while by moving between the teams. However, in practice, I suspect this might be hard to implement at many companies because inevitably you will live in the “bubble” of the platform infrastructure and the standard technologies and the programming languages of choice in the company.
On the other hand, becoming too accustomed to the technology stack and the ways of working at a particular company should not be a problem if you think your company is the market leader at its business and will live long and prosper. This, however, may be surprisingly hard to predict in the modern fast-changing world.
References
The Pragmatic Programmer by Thomas & Hunt:
A pragmatic programmer is a Jack of all trades. You try hard to be familiar with a broad range of technologies.
Consider learning new and promising technology. The future payoff may be huge.
Eric Schmidt and Jonathan Rosenberg. How Google Works:
Favoring specialization over intelligence is exactly wrong, especially in high tech. The world is changing so fast across every industry and endeavor that it's a given the role for which you're hiring is going to change. Yesterday's widget will be obsolete tomorrow, and hiring a specialist in such a dynamic environment can backfire. A specialist brings an inherent bias to solving problems that spawns from the very expertise that is his putative advantage, and may be threatened by a new type of solution that requires new expertise. A smart generalist doesn't have bias, so is free to survey the wide range of solutions and gravitate to the best one.