What is a reasonable number of languages to program in?
For production code my answer is almost always:
Less is more
There is a tricky balance between innovation and stability in software engineering. This post has a few metrics and some hand-wavy advice on language use.
Too Many Languages
Projects using a lot of languages are the worst. Their lack of discipline makes them hard to understand and maintain. You have a deadline but you keep getting dragged into rabbit holes. Their main benefit is resume building. Often projects with many languages also have:
- Several different NoSQL and SQL databases
- Every web or Microsoft framework that was cool at some point
- Every service on AWS
Return on Investment
A good metric for whether you should add a new language to your project is to look at the ROI, return on investment. Learning a new language is usually pretty easy, but learning the build system and the ecosystem is a lot harder. We have good connectivity from languages to SQL database, but getting more languages working closely together is tedious. You need a strong value proposition to add a new language.
Language Specialization
The best reason to use several languages is that you are forced to use a given language category.
- Statically compiled back-end language
- Scripting language
- Front-end language
- ML / Numeric language
- Non garbage collected system language
Often the libraries for a given domain are written in one or a few languages. For instance computer vision libraries are written in C++ or Python. Then you are forced to use them.
Redundancy
In scripting languages my preference is Python, but I will happily use Groovy, Perl and Ruby. Using similar scripting languages on the same project feels messy.
Using several languages inside an ecosystem say Java and Scala or C# and F# causes less friction.
Language Tool-belt
I have to be fluent in a few languages for work and I have limited capacity, but once a year I will try out a new language for a while and see if it has staying power. Most of them don't but it keeps my skill set up to date. When my boss asks me to spend a couple of days updating an old throwaway React project I get a running start.
Metrics from A.I. and ML
These two concepts from artificial intelligence are relevant to the adoption of programming languages and evolution of long lived software systems.
- Learning rate
- Multi armed bandit algorithm
Multi armed bandit algorithm is for choosing what stories you should show on the front page of a news site. The gist is that you should show popular stories, but you give a percentage of the space to new stories for a chance to become the popular stories.
I am in the flow when I use 10% of my time learning and 90% working.
To Add or Not to Add
Learning a new language is fun. It teaches you new ways to think.
If you want to add a new language to an established project you should be familiar with both language and ecosystem, and expect a substantial productivity or performance gain before it is worth the overhead.
Otherwise if you want to get serious with a new language do open source work or use it on smaller projects.