In my first few days as a freshman, I met a classmate who claimed that he could code in any programming language I could name. Astonished, I challenged “what about that unreadable esoteric language where the handful of commands merely simulate a Turing machine!?” He dryly replied “yes it’s called brainfuck; I know brainfuck”.
I was brainfucked. It was no trick, he could legitimately code in any language after a trivially brief refresher. How could an 18 year old kid know every language?

A brainfuck interpreter, written in brainfuck by Daniel B Cristofani (not my classmate)
While I’m still impressed by his feat, I’m not so astonished. After learning a few more languages myself, I came to realize that they were all less diverse than I had anticipated. After some more study, I started appreciating some of the underlying models of computation and programming language theory that make most languages look like different versions of the same basic ideas.These days my standard advice for students is “aim to learn every language”.
Given that we’re approaching the new year and folk will have new year’s resolutions to learn Go or Rust or something, I want to encourage the alternative resolution: aim to learn every language! Hopefully this article will help you on your way!
Disclaimers:) This isn’t actually about becoming competent with 500+ languages. It’s about understanding the common paradigms and implementation patterns so as to be confidently language agnostic This is a long journey. You can make a lot of progress in a year, but depending on your current level it may take another ten Some concepts may not seem relevant for a while, roll with it Depending on your job and/or goals, this may not actually help you with your job and/or goals! Why doit?If you see yourself as reading and writing software for the bulk of your career, you owe it to yourself to be generally familiar with languages:
Even without picking your languages yourself, you will likely end up using a large number of them Given the choice, being able to select the right tool for the job will make you more effective As the popularity of languages ebb and flow, you will have a wider choice of jobs, companies and projects if you’re not limited by language choice Many high impact projects require fundamental understanding of compilers and languages, from general purpose language implementations and libraries to DSLs, databases, browsers, IDEs, static analysis tools and moreTo me, the last point is the most important. Ras Bodik would emphasize this when convincing his students at Berkeley of the importance of his compilers course:
Don’t be a boilerplate programmer. Instead, build tools for users and other programmers. Take historical note of textile and steel industries: do you want to build machines and tools, or do you want to operate those machines?
Step zero: stop calling yourself a Rails (etc)devThis step is easy, but important. While you should be proud of yourself for mastering a language or technology, self-identifying as a specialist in any language creates a mental barrier to embracing another. Call yourself a software engineer and strive to live up to that title whatever the context.
Alex Gaynor loves python enough to have served on the board of its foundation and contributed large portions of Django and PyPy, but that didn’t stop him from tolerating Classic ASP for a couple of years to help the USDS. He calls himself a software engineer, and so should you.
Step one: gometaThere is an old joke about an applied physicist who finds himself at a string theory conference. Turning to a theoretical physicist he asks “gee how do you all manage to think about things in 11 dimensions?” The theoretical physicist replies “that’s easy, we just image N dimensions and substitute 11 for N.”
Strong programmers use the same trick. You may see Go as a new and challenging language; strong programmers see it as a compiled statically typed language with garbage collection and CSP style concurrency. Swift is new and carefully designed, but a strong programmer can pick it up easily: it is just a general purpose compiled language with objected-oriented features like protocols, implemented with LLVM.
The meta level of languages is the undergraduate compilers class. Unfortunately, the name is misleading for two reasons: firstly, the class isn’t strictly about the mechanics of compilers; its main purpose for most students is to deeply understand languages . Secondly, some people see “dynamic” and “compiled” as opposites, so assume that a compilers class will not teach them about the implementations of their favorite dynamic languages… this is not true, there is a tremendous amount of overlap, and most compilers courses include a section on bytecodes and virtual machines. But the name “compilers” has generally stuck.
For those who never had the opportunity to take a compilers course, there are some great books and online courseware available. In particular I would suggest Alex Aiken’s course which was previously available on Coursera and now on Stanford’s own MOOC platform Lagunita. Berkeley’s CS164 is also a good option… unfortunately Berkeley has stopped publishing video from newer sessions, but Ras Bodik’s 2012 session is still available.
The canonical text in compilers is Compilers: Principles, Techniques & Tools , commonly called “the Dragon Book”. Like all canonical texts, it has both rabid fans and thoughtful detractors; my overall view is that it is the best single book, but expect to cover it in multiple passes through your career. Myles particularly likes Language Implementation Patterns by Terence Parr. It is written more directly for the practicing software engineer who intends to work on small language projects like DSLs, so you may find it more approachable than the Dragon Book as a first stop.

The “Dragon book”, still the best single book on compilers if you had to pickone
For those located in San Francisco who prefer more hands on instruction, you may be interested in Bradfield’s languages, compilers and interpreters course .
Step two: select archetypal languages With a good theoretical foundation it will be easier to pick up new languages, but not easy enough to go off and learn 500+ of them. The trick now will be to identify and learn languages that are archetypal of the powerful ideas and common paradigms across all other