Human capital is our greatest asset.
Like financial capital, the all-powerful force of compound growth means that a small difference in the rate of skill acquisition over time can lead to massive differences in career outcomes.
Choosing which skills to hone is therefore one of the most important keys to professional growth and success in any arena.
Among various forms of human capital, technical aptitude is quickly becoming the mission-critical skill for 21st century knowledge work.
However, there are any number of technologies that one could dive deep into and attempt to master, with varying usefulness and practical applicability.
So how does one decide where to "invest" among a sea of options?
A mental model I've found surprisingly helpful for this task is the growth-share matrix, a framework concocted 50 years ago by the Boston Consulting Group.
The framework was originally conceived as a tool to help executives prioritize different business units based on their respective relative market shares and growth. The two dimensions separate the market landscape into quadrants, each with certain characteristics:
BCG advised clients to invest in the stars, exploit the cows for their cash flow, evaluate the potential of the question marks, and exit or sell the dogs ASAP.
The growth-share matrix was originally intended to apply to product lines or business units - an asset a corporation could own. In that respect, you might imagine this framework has limited applicability to programming languages, given no single person "owns" any given language.
Not so fast!
I argue that we each do own a little piece of a programming language, not in the form of equity or stock, but in the form of human capital.
Through careful curation of a "portfolio" of useful skills, we earn a return on our learning efforts - rewards for our time and effort.
Learning a programming language is a perfect example of this.
But what makes a programming language useful?
The value of any given programming language is a direct derivative of the number of other individuals who know that language and the number of companies using that language to develop and ship products.
That may sound obvious to some, but it is in fact quite counter-intuitive.
In most of life's skills we seek to master the rare things - the things no one else can do. We think that by differentiating ourselves through a unique set of talents we will shine brighter in an increasingly competitive world. Learning that which is rare will pay meaningful dividends, so the thinking goes.
While yes, knowing an obscure language that few others have familiarity with might carve out a nice niche in the market for you to charge highly for your rare talents, I would argue that, for most, it is actually more valuable to know a language that lots of other people also know, rather than one only a few have ever worked with.
Most people think that programming is how you speak to computers. Really, it's how you speak to other developers.
Due to network effects and the increasing size, scale, and scope of software development projects and teams, knowing the "lingua franca" is much more valuable than being an expert in some endangered language, soon to be discarded to the trash bin on the desktop of history.
Paradoxically, having low personal market share in a high market share language is actually not such a bad thing.
To construct the growth-share matrix for programming languages, we will leverage StackOverflow's annual developer survey. For the 2018 edition, they surveyed over 100,000 developers from around the world, covering a wide range of topics from job satisfaction to salary. Here we'll focus on US-based developers.
The key question for our purposes is:
"Which of the following programming, scripting, and markup languages have you done extensive development work in over the past year?”
Answers to this question should give us a rough proxy of the popularity of any given language, as defined by the proportion of developers who have worked with a particular language.
For growth, we can compare the answers to this question across 2017 and 2018 to come up with an estimate of the growth of each language. We'll define growth as the % growth rate of the proportion of respondents who've worked with the language in the past year. So, a language that went from 10% coverage to 13% would be considered to have grown 30% (rather than 3 percentage points).
Quadrant boundaries will be set at the median growth rate and relative market share.
One final piece - as is convention with the growth-share matrix, we will show market share relative to the language with the most market share. Therefore, the axis will end at 100% (representing the most popular language). We will also show this on a log scale to better showcase the distribution, which tends to be quite crowded below 10% relative market share.
We now have all we need to build our growth-share matrix!
Take a look at the results:
One striking feature that immediately jumps out - very few languages saw a net decline in popularity. Almost every language grew, which by definition implies that the average developer is using an increasingly wide array of languages in their work.
Let’s spin through each quadrant and discuss some of the highlights.
Python - Python has existed for decades but only recently hit its stride as a go-to language for data analytics and machine learning use cases. Python is widely-regarded as one of the best languages for data-driven analysis given its relative ease of use and massive set of open source libraries that simplify and accelerate analytics. Python's syntax is quite simple compared to other languages. Ease of use and speed are especially important in data science, as data scientists often run and re-run numerous iterations of a model before settling on a preferred specification. The growing popularity of interactive and replicable computing environments like Jupyter notebooks dovetails nicely with Python's surging share among developers. I'm personally quite pleased to see Python's high popularity given I've spent the past 2 years self-teaching myself the language!
Ruby - Ruby has historically been known for its extreme ease of use and strength within web development. Many a web developer wrote their first web app in Ruby. The Ruby on Rails framework only extended this user-friendliness further, making Ruby incredibly popular among developers who want a no-frills way to quickly develop and deploy functional web applications. For several reasons however, Ruby's growth is slowing and has been for a few years now. No, Ruby is not “dead”, but it will likely migrate to the cash cow zone soon as the initial fanfare wears off. Ruby continues to be a great language that serves developers well.
Go - A new language seeing rapid adoption among developers, Go simplifies the process of writing code, thereby making developers more efficient. Go was initially birthed at Google, where technical teams were trying to solve engineering problems that only seemed to be multiplying in an era of increasingly large codebases, multicore processors, and network-aware applications. Go is built with concurrency in mind, making it relatively easy to build multi-threaded applications. Outside of Google, major companies making use of Go include Uber, Netflix, Adobe, IBM, Intel, Dropbox, CloudFlare, and more.
Takeaway - These languages are highly popular and would constitute a solid foundation any budding developer or product manager. If you don't already have basic proficiency in at least some of the stars - I implore you: learn these growing tools of the trade.
Java - Java has long been a popular language for cross-platform development, and this flexibility has continued as new platforms have emerged, such as mobile. One of Java's many conventions is the idea of "write once, run anywhere", meaning that code written in Java can be run on any other platform that supports Java with no recompiling. When complete, Java applications are compiled into bytecode which runs on a Java Virtual Machine. Originally built by Sun Microsystems, through acquisitions it's ended up in the hands of Oracle today.
SQL - SQL (Structured Query Language) is an old workhorse that needs no introduction. It has existed for quite some time and is the main means by which analysts query and pull data from relational databases and data warehouses. Despite the popularity of “NoSQL” and other non-relational frameworks, SQL remains king, and in recent years many of these other frameworks have bolted on SQL-like interfaces in order to ease data extraction and transformation. As companies collect data from a greater range of diverse sources and continue to store this information in central databases, SQL will only increase in importance.
The C Family - No big surprise here - the extended family of C languages has held a strong position within the software development community for some time and continues to serve as the backbone for many critical applications we know and love today. Further, C has found its way into other languages as well. For example, the reference implementation of Python, CPython, is written in C and Python, and significant chunks of the core Python codebase are actually written in C due to it being a compiled (rather than interpreted) language and thus having faster performance at runtime. C is a hugely influential language that will not be going away any time soon.
PHP - PHP lands squarely in the cash cow category. PHP is a server-side scripting language primarily suited for web development, as evidenced by its original meaning of “personal home page". Numerous popular websites and web applications are built on PHP, including, perhaps mostly famously, WordPress. However, the language has stagnated in terms of popularity, in part to due to its clunkiness and security vulnerabilities, where PHP has historically suffered from a number of severe exploits (ex: SQL injection). That said, this is another language with incredible market share that will continue to see broad use for quite some time.
Swift - The popularity of Swift derives directly from the underlying popularity of macOS and iOS devices which, though a minority of overall smartphone shipments, represents a massive install base, especially among more affluent western populations. Launched in 2014, Swift initially saw massive growth, becoming one of the fastest growing languages in history. Swift is heavily influenced by Objective-C, another cash cow, which it recently surpassed in popularity. As the brainchild of Apple, Swift will live or die by Apple's own success, so plan accordingly.
Takeaway - These languages really pay the bills. If you are already proficient in any of the above languages, great, leverage that saved time to pick up some skills in the rising stars. If you do not know these languages well today, evaluate how practical / necessary they are for the specific set of projects you want to work on now or in the near future.
Rust - Rust is a relatively new programming language that only appeared on the scene in the last decade. While Rust is technically a general-purpose language, due to its low-level nature, it is best used for embedded systems running close to bare metal. Comparisons are often made between Rust and C++, in part driven by their syntactic similarities. Rust is often known to create enthusiastic fans among its users. Though far from being one of the more popular languages, it is truly loved by the people who use it most. Development on Rust is quite active today, ensuring the language will stay on the bleeding edge for the foreseeable future.
R - R slightly missed the cutoff for star status, but given its incredible ~40% growth rate the language will easily cross the boundary next year. R is exploding in popularity for the same reasons as Python, though most consider Python to be relative winner in terms of speed, ease of use and general applicability. R's historical strength in data science and statistical analysis is now powering a major renaissance for R. Enthusiasts celebrated R's 25th anniversary earlier this year, and with the helpful tailwind of data science, the language shows no signs of slowing down.
Haskell - Function over form, or in the case of Haskell, have both. Haskell is a purely functional programming language, meaning that the language focuses on functions that take immutable values as input and produce the exact same output every single time. It's also lazy, which simply means results are not evaluated until absolutely necessary. These and other features make Haskell a very powerful and efficient language in the right hands but also potentially limit its applicability. Haskell's cult following is growing rapidly from its small base, but it's hard to say how long this will continue.
Takeaway - They're called question marks for a reason. No one really knows how the future will play out for these emerging technologies. They are probably not worth betting the farm on today, but they are also prime candidates for becoming the next "must-know" tools among forward-looking dev teams. Keep an eye on them.
Visual Basic (All Flavors) - VB.NET, VBA, VB6 - whichever your flavor, the Visual Basic ecosystem has clearly fallen from grace. VB.NET is one of only two languages in the growth-share matrix to actually lose share in 2018. Significant chunks of VB's functionality exist in C# now, and Microsoft's stance towards the languages has not been 100% clear, having gone from originally planning to end support for the language in 2008 to recently declaring that Windows 10 will support the VB runtime for the lifetime of the OS. This is great for legacy applications built using Visual Basic, but these will inevitably need to be rewritten in a modern language or be end-of-lifed.
Takeaway - Unlike real dogs, dogs within the growth-share matrix are bound to be controversial. Developers and development teams need to seriously grapple with the current state of affairs these languages face and whether or not it's advisable to spend significant time and resources building applications powered by these less popular languages.
The moral of the story - think critically about where to invest your time.
To be clear - it’s not the end of the world if you pick the “wrong” language. In fact, there really aren’t any wrong choices here, even the "dogs". Use the best tool for the job. However, it certainly helps to avoid the transition costs inherent in trying to reposition oneself or play catch up later on.
If anything, don’t try to reposition yourself per se, but rather, seek to enhance your overall value and breadth of capabilities by acquiring at least intermediate mastery in several different languages. Again, similar to spoken languages, people who can converse in multiple valuable languages often gain disproportionate value from their learning efforts, which tend to compound on one another, especially when learning the basic features which form the building blocks of many dialects.
Remember, this mental model, though imperfect, is arguably flexible enough to accommodate many skills, not just programming.
I hope this framework is useful to you as you decide where to grow your human capital as a technically savvy individual.
You can find the full backup to this analysis in both Jupyter notebook and .py script format at my GitLab or GitHub.
This post has been published on www.productschool.com communities