19

In chapter one of "The Pragmatic Programmer" the first learning goal is:

Learn at least one new language every year. Different languages solve the same problems in different ways. By learning several different approaches, you can help broaden your thinking and avoid getter struck in a rut. [...]

To achieve this over a career, the list of languages is likely to get quite long (particularly if you do not want to "progress" into management). Clearly the education of a programmer (or whatever form) is going to get you started with a core of commercially useful languages (the usual list from job posting: C, C++, Ruby, Python, JavaScript, C#, Java, VB, ...). Additionally a formal or informal learning programme is likely to have covered functional approaches (via something like Haskell, LISP or an ML derived language)

But once a reasonable subset of that list is learned- what's next, and why?

12
  • 3
    In this answer I list some of the language paradigms that could be studied to broaden your abilities. I would start by trying to learn all these paradigms (rather than focusing on languages), so tick off all the ones your current language uses, then pick a language that has as many different ones from what you are used to. There isn't much point in starting in C# then Java, try to diversify more initially. Once you have covered all the basic types, then you can pick other common languages. Sep 9, 2010 at 9:55
  • @Simon: Why not make this an answer here?
    – Richard
    Sep 9, 2010 at 11:25
  • 1
    You will learn a lot going from Java to C#, but not so much going the other way round
    – Casebash
    Sep 9, 2010 at 11:37
  • @Richard. I didn't really think it justified a full answer, I was just referring you to something relevant I'd written elsewhere. Sep 9, 2010 at 12:53
  • 1
    Most folks learning a language a year will be a "jack of all trades but master of none" until you focus on a few for several years. I believe, based on much experience that the notion of the 'full-stack' programmer is false except for 1% - 5% of developers. Most hard-core backend folks I know don't have great front end skills and vice-versa.
    – junky
    Mar 8, 2012 at 15:36

8 Answers 8

20

Make it interesting and spend each year writing an interpreter or compiler for your own programming language that fills up a niche you've never used a programming language for. Each year, write your next compiler/interpreter using the language you wrote the previous year.

5
  • 7
    May I please have your autograph? :-) Sep 14, 2010 at 4:55
  • 1
    +1 Brilliant answer, even if it was probably meant in a humorous way.
    – Joe D
    Sep 17, 2010 at 18:25
  • 1
    @Joe D Not meant in a totally humorous way. If you can do this, you have mastered all the niches. Sep 17, 2010 at 18:59
  • -1 for not meaning it in a totally humorous way. (like we don't have enough semi abandoned languages/implementations laying around)
    – ZJR
    Mar 8, 2012 at 15:29
  • 2
    @ZJR So 99% Humorous, 1% Non humorous is bad? Cmon. Also, why are you downvoting an answer based on a comment? Mar 8, 2012 at 22:12
13

You should maximize the "marginal relevance", ie always venture into new areas that you are not yet strong at. Vary both the programming languages and the concepts. If you don't know any object-oriented language, try Java and some high-abstraction framework such as Hibernate. Then write some systems administration stuff in a script language such as Python or Perl. Then pick up some low-level skills in C or C++, writing high-performance multithreaded server code. If you don't know functional programming, try Haskell with some graph theory problems such as solving Peg Solitaire, etc. It's very feasible to do it so that everything you learn has immediate market value, until you hit erudite or special-purpose stuff such as object-capability security, Prolog or VHDL.

Good exercise by the way! This will teach you to think laterally and envision problems in language-agnostic terms, instead of relying on too few platform-specific techniques. For instance, once you master the similarities and differences in virtual method dispatch between C++ and Python, you'll pretty much "get it" instantly for any other language.

9

A language that doesn't affect the way you think about programming, is not worth knowing. - Alan Perlis

As some of the other answers have touched on, if you are learning one new language per year, the why? is to expand your capabilities as a programmer. The how? is by learning languages with distinct paradigms from those of languages you already know, and taking stock of the paradigms you already know determines what language to learn next.

What are these paradigms? The advanced book Concepts, Techniques, and Models of Computer Programming provides an excellent overview with a graphical map.

Thus, if you only know C-like imperative languages, then learning Scheme/Lisp is extremely useful. If you already know imperative and functional languages, then learning Prolog will be useful, etc.

A recent book that tries to teach multiple languages and paradigms is Seven Languages in Seven Weeks. Of course, you won't be fluent in each language after a week of study, but it does seem to provide an approachable, practitioner-oriented multi-paradigm perspective.

When you do grok another paradigm, it's truly a Zen moment; going from imperative to functional programming made me see the world of computing in an entirely new light. Happy learning!

1
  • And a language affects your thinking not so much by what it allows you to express, but more by what it forces you to express.
    – Florian F
    Feb 5, 2016 at 17:03
9

C - as the essential, "underlies everything", systems programming language

Lisp (Scheme)- the strange but incredibly powerful ur-language that great hackers think defines cool

Smalltalk - because this is what OO was meant to be

Erlang (or other Actor language) to understand Actors

Haskell - to understand Monads

Javascript - because its everywhere and essential for scripting the browser

One of Python / Ruby / Perl (but it really doesn't matter which) - so you know what a popular, modern, high-level scripting language with good library support feels like

SQL - so you can talk to relational databases

Prolog - because you still need to blow your mind

4
  • 2
    The reason I learned Haskell is because I wanted to learn a functional language (as opposed to all the procedural ones I knew before), and Haskell seemed to me like the poster child for functional languages. The reason I like Haskell now is because it's a high-level language, has good library support, and it's fast (about 50% as fast as C, but it depends on what you're doing). Also, I like being able to write a bunch of code and it all work the first or second time (after getting it to compile).
    – Joey Adams
    Sep 26, 2010 at 5:18
  • It definitely matters whether you learn Perl, Python, or Ruby. As an example, Python has list comprehensions, which don't exist in Ruby, and Ruby has modules, which don't exist in Python. You can duplicate the results of both things in either language, but learning either one will influence your thinking in very different ways.
    – philosodad
    Feb 5, 2011 at 18:53
  • 1
    Prolog - because you still need to blow your mind -- Best comment ever +1
    – Zachary K
    Feb 14, 2011 at 4:53
  • 1
    I think the main benefit of learning haskell isn't necessarily getting a grip on the monad abstraction, but rather to learn the benefits of a REAL strong and powerful type system. If one's idea of a "static type system" is something like Java, then haskell will take your breath away.
    – sara
    Jun 23, 2016 at 7:54
4
  • Go (new system level programming language with good support for concurrency and concepts not so traditional)
  • Lua (scripting language simple, expressive, extremely flexible and balanced paradigms imperative, functional and meta programming, allowing OOP)
  • D (C/C++ done right)
  • Groovy (Expressiveness and meta programming in Java world)
  • Eiffel (Design By Contract and a different approach to OOP)
  • Prolog (THE logic programming language)
6
  • 1
    Why should someone learn these? (The why is the interesting bit here, there are few truly unique programming languages: every paradigm has been implemented more than once.)
    – Richard
    Sep 26, 2010 at 10:46
  • Interesting to see that you think D is C done right. Personally when I use C, I mostly use it for some low level stuff where I don't want any OOP abstractions at all.
    – Jonas
    Sep 26, 2010 at 14:50
  • @Jonas: We still need a simple language done right, while this language doesn't come D can be used nicely just in imperative way. To you, D2 is more functional, when completed maybe will be the best implementation of paradigm to a language primarily imperative.
    – Maniero
    Sep 26, 2010 at 16:09
  • done right is subjective. To me Erlang is a very small and simple language done right. The missing part is a great GUI-framework, and if you do complex systems maybe you would like a static typed language more.
    – Jonas
    Sep 26, 2010 at 16:42
  • @Jonas: Erlang is a good language but it's not C/C++ done right, it's totally different thing.
    – Maniero
    Sep 27, 2010 at 15:59
2

1) Prolog: It's completely different to all the imperative languages you've been using so far, and it will change the way you think about problems

2) Lisp: without it, you might as well be using Vi

3) Erlang: Again, it's completely different, also, it seems quite fashionable.

4) Something from the Turing Tarpit (e.g. Brainfuck), and probably write a compiler or interpreter for it: I can't think of a reason to do this, but it feels like a good idea.

2
  • 1
    "without it, you might as well be using Vi". I am surprised no one picked that up :)
    – Gauthier
    Dec 20, 2010 at 7:58
  • I do use vi! (Well gvim)
    – Zachary K
    Feb 14, 2011 at 4:54
1

Besides the ones you listed,

Haskell, F#, Clojure, OCaml, Lua, Go, D, Erlang, Objective C.

1

While I agree it is good to learn new languages (and even imperative through a long career), I think one a year is too much past the first five-ten years. What I would rather see is someone with this level of experience learning new things about the languages they already know. At some point you need depth as well as breadth of knowledge. So you can write an If construct in 12 languages, big whoop. I'd rather see someone who really digs in and become expert in at least one thing. And then the next few years become an expert at something else. Over a 30+year career, I want someone to have depth of knowledge not just the basics in a lot of things.

Not the answer you're looking for? Browse other questions tagged or ask your own question.