Answer: none of them
sicpers.info
sicpers.info
Learning a bit of JS means I can now make interactive reports that run anywhere.
Learning some HTML and CSS means I can throw together an OK website.
Learning some ruby and rails means I can now make certain types of websites really bloody quickly.
Learning some erlang meant I solved an annoying problem very quickly because it was just a set of message queues.
Learning some haskell wasn't all that useful directly, but was interesting. Not everything has to be some huge productive benefit for me.
Learning some GPU coding stuff back in the day let me build what I think might have been the fastest 'deep learning' thing at the time (certainly I was able to train in minutes what was taking Hinton days) and let me perform experiments remarkably faster.
Learning R recently has opened up a lot more avenues for analysis for me.
Learning some shell scripting has had obvious benefits on a daily basis.
---
I wouldn't argue for not learning other things too, but learning new languages can help because it can give you access to a huge toolkit not currently available to you. If you do sciency stuff or data analysis and you don't know any python, you're missing out on a wide range of very advanced tools that can make your life easier. Similarly with statistics and R, and I'm sure a whole host of other similar things are true for other languages.
I think as a beginner it's great to learn a language in each domain (e.g. HTML, JS, SQL, Erlang). That way you always have a language to solve a task at hand, but don't confuse them. You also avoid spending too much time thinking about which language to choose for a specific task, when it mostly doesn't matter anyway.
In general it pays to know one or two languages deep down to the bare metal as it gives you a basis to reason about other languages.
I would also suggest learning a language without garbage collection: It builds character, or at least the discipline to figure out a consistent practice that ensures every resource has one allocation and one and only one de-allocation. This discipline (of thinking about data flow through your program) will pay dividends as you organize your code even in gc'ed languages.
While you're at it, learning how GC works (at least at a high-level) is useful as depending on the particular GC used in the language at hand you can either be working with it or against it.
Learn your way around basic data structures: Most languages have a significant standard library, and much of the library is usually concerned with data structures. Knowing basic classes of data structures is the important thing here. Lots of stdlibs have hashes, heaps, linked-lists, or arrays even if they call them different things but the important skill is being able to look at the language docs and find the one that meets your requirement (fast look up time, stable ordering, fast sorting, etc) or be able to build a hybrid combination that combines the requirements you do have.
Make sure you know how to use your tools including at least one debugger, a version control system, etc.
I've found it pays to create toy projects in my spare time to gain familiarity with various new software and hardware. I have been surprised how often something I've just been playing with comes up. Someone will randomly ask, "can you set up a website with a CMS and customization," or "I need a hardware timer to sync these two instruments during an experiment." And I have at least a basis to begin to come at those projects even though they weren't things I had been initially employed to do.
Another advantage is for communication. There might be frontend programmers (HTML, CSS, Javascript, templates) and backend programmers (Java, C++, SQL). No matter in which camp you are, you have to talk to the other one. It helps, if you know something about their job. Playing with their tools a little is a good way to learn that.
I'm not sure that's why people try different languages. Certainly what I've gained from messing around with different languages over time (e.g. most recently rust) is exposure to different ideas and ways of doing things. Do I "think about every problem as if it should be a collection of tables in the third normal form"? No, but when I do need to decide how to store data I have a much better idea of how I would do it, or what I needed to look at.
Gaining experience of a range of ideas is a good thing irrespective of whether it changes the way you think. For example, if you know only one language (or one type of language), it can be quite hard to differentiate in your head whether something is a limitation of the language or a limitation of the problem. ("If all you have is a hammer, everything looks like a nail")
That being said, I do take his point that it is worth spending some time learning about things that aren't programming languages: testing, security, business, etc. After all, software development isn't anywhere near just programming. But really it shouldn't be a question of "do I learn this or that?". Read into things that you're interested in, or that would be useful at work, or just something completely different that will broaden your horizons a bit.
I don't think it matters particularly if that is a new language or not.
Of course, some people love programming languages, and as an intellectual pursuit, studying them is as good as any other. But learning about, say, mechanical sympathy, data structures, concurrency, concepts in distributed programming, compilation or pretty much any CS topic which isn't tied to a specific language would have a greater impact for less cost. It's certainly good to know one language at each "level" -- systems, applications and scripting. Other than that, it's a good idea to spend as little time as possible on new languages.
I think OP missed entirely the point of learning a new language. When I learn a new language, I try to use the language the way it was built to be used, instead of trying to adapt it to what I already know. That's why you'll often see me asking questions like: "What is the Rubyist way to solve this?". I do adapt the language, but only after I've tried their way first.
I started programming by learning C, which taught me how the computer 'thinks'. Oh, and the absolute basics of programming.
I learned C++, where I was firstly introduced to objects and reliable ways do handle resource allocations without leaks (hopefully :).
I learned Ruby, where I was firstly introduced to functional programming and a wonderful implementation of the language using objects. I also learned what expressive your code can be.
I learned JavaScript, which didn't teach me much, but I've used it extensively to practice what I had learned before. JavaScript does everything.
I learned Haskell, which taught me more functional programming, and how problems go away when you use the correct types (or containers).
I learned Scheme, which showed me how simple a language's syntax can be, while still effective. It confirmed what I knew all along: all those different syntaxes mostly don't matter.
Sure I could have learned all those things without learning a new language. But I had no idea they even existed. Now, what will I learn next? Any suggestions?
If you want to learn a language for the express purpose of expanding your mind, try a postfix language like Forth or Joy. Those are different enough from what you've done so far that it'll be pretty strange to think in that manner at first. I haven't pursued either Forth or Joy beyond messing around with a couple toy examples, but they're very interesting to think about.
I'm finding Lua/Terra quite interesting. Lua [1] is an extremely lightweight fast dynamic-typed interpreted (or JIT-compiled) language (don't forget to get the penlight library, though, because it's batteries-not-included otherwise). Terra [2] is a C-level bare-metal static-typed compiled language specifically designed both to use Lua as a preprocessor and to interleave with Lua code as necessary. I'm pretty sure it ends up as metaprogrammable as Lisp but without the difficulty I had parsing Lisp syntax (might not be an issue for you, given that you've got Scheme listed).
[1][http://www.lua.org/] [2][http://terralang.org/]
Again, though - unless you need it tiny, you probably want Penlight or something like it to provide all the utilities that weren't quite basic enough to be core. In that case, you've got a good chunk of, effectively, the Python core libraries to work with.
Unless that actually is "ingrained habits," I suppose, but in that case I had the habits before I ever hit college or knew that other syntaxes existed.
I also think that if you work in a non-opinionated language, it can be very informative studying some of the concepts used in opinionated languages. Perhaps you could say the language is a medium used for learning higher-order concepts that would be hard to understand in isolation. Quite often those concepts are very useful and can change your thought processes. An example of this is the rise of functional programming techniques in JavaScript.
I agree with the point of not limiting ourselves to just purely technical programming knowledge. It's surely about finding the right blend.
Edit: I wonder what is the author's position on free software..
ps: then learn non trivial compilation. (Lookup for books from Aho or Whilhelm)