Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

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 eduction 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 Haskel, LISP or an ML derived language)

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

share|improve this question

closed as not constructive by Yannis Rizos Mar 8 '12 at 15:26

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.If this question can be reworded to fit the rules in the help center, please edit the question.

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. –  Simon P Stevens Sep 9 '10 at 9:55
    
@Simon: Why not make this an answer here? –  Richard Sep 9 '10 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 '10 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. –  Simon P Stevens Sep 9 '10 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 '12 at 15:36

8 Answers 8

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.

share|improve this answer
7  
May I please have your autograph? :-) –  Christian Davén Sep 14 '10 at 4:55
1  
+1 Brilliant answer, even if it was probably meant in a humorous way. –  Joe D Sep 17 '10 at 18:25
1  
@Joe D Not meant in a totally humorous way. If you can do this, you have mastered all the niches. –  alternative Sep 17 '10 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 '12 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? –  alternative Mar 8 '12 at 22:12

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.

share|improve this answer

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!

share|improve this answer

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

share|improve this answer
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 '10 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 '11 at 18:53
    
Prolog - because you still need to blow your mind -- Best comment ever +1 –  Zachary K Feb 14 '11 at 4:53
  • 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)
share|improve this answer
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 '10 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 '10 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. –  bigown Sep 26 '10 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 '10 at 16:42
    
@Jonas: Erlang is a good language but it's not C/C++ done right, it's totally different thing. –  bigown Sep 27 '10 at 15:59

Besides the ones you listed,

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

share|improve this answer

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.

share|improve this answer
1  
"without it, you might as well be using Vi". I am surprised no one picked that up :) –  Gauthier Dec 20 '10 at 7:58
    
I do use vi! (Well gvim) –  Zachary K Feb 14 '11 at 4:54

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.

share|improve this answer

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