Ask HN: What programming language will you learn in 2014?

24 points by peterfoldi ↗ HN
After a long research I decided to learn Haskell. It is very unlikely that I will ever be paid to use it, but I am pretty sure that after more than 10 years experience in programming, Haskell will greatly benefit my programming skills and thinking.

52 comments

[ 2.7 ms ] story [ 89.6 ms ] thread
what about golang programming language
I spent the last year doing lisp as much as I could, and I've become a right convert. I've got some C and python down already.

This year, I am currently torn between:

-Haskell (to go full blown functional crazy) -Smalltalk (to go full blown object crazy) -Javascript (to finally write some stuff for the web/browsers) - Java (to sell out and lose the will to live?)

Any advice is more than welcome. I'm probably looking for the "programming language that changes the way you think" aspect, since I've already got a paying job...

Off topic since this is not a programming language, but AngularJS will change the way you think.
I recommend going out and buying the third edition of [Programming in Lua](http://www.amazon.com/exec/obidos/ASIN/859037985X/lua-pilind...), then using that to learn Lua before getting into JavaScript.

PiL will present examples that will change the way you think in several different ways, which you will then be able to leverage in any other programming language (most of the time, depending on how restrictive the language is).

You have Lisp knowledge, so maybe Haskell is not the best candidate for "a new way you think". Given your background I would say you probably would enjoy Scala more than Java (targeting the same JVM). I am not sure if one can learn enough from Smalltalk to justify the effort it takes to learn an in-practice useless language. If you don't speak JavaScript yet, that's a good candidate, especially if you use your FP experience in it and not just go the OO way most people do.
No, Haskell is very different from Lisp. It makes perfectly sense to learn Haskell.
You have more experience here thanks for correcting me :) What I meant was that they are not two very different worlds. I myself picked Haskell over Lisp hoping to gain the benefits that I would get from Lisp but with some advantages. Would you also recommend the other way around? Learning Lisp after Haskell? I don't mean the syntactical differences or the real-world usage. Solely the "way of thinking".
Actually Haskell and Lisp a very two different worlds. Some basic abstractions are shared, but Functional Programming tends to be much much more advanced in Haskell. Haskell is the standard language for some branch of functional programming and has a good/great eco-system for that. It's main use seems to me to advance the state of art in Functional Programming and applications of it.

Lisp OTOH is a multi-paradigm languages with much more emphasis on OO and interactive development. Lisp is much more diverse and favors a very different programming style - slightly more pragmatic. Lisp had its main application domain in AI, but nowadays it's a bit more diverse - often it is used by individuals or small teams. One of the larger applications is the flight search engine of Google. Others are in music composition, planning and scheduling (satellites, people, logistics, ...), etc.

There was a recent comment by tptacek in another thread which I agree with: you really only need to know a couple of programming languages before you start hitting diminishing returns in terms of what you can implement. We should focus instead on learning new concepts or new problem domains.

I'm trying to revisit statistical modelling and pick up some machine learning basics over the next year.

and what about domains only tangentially related to computer science, like robotics, semiconductors, or digital music?

or what about domains barely related to computer science, but where coding is an invaluable skill, like medicine/genetics, manufacturing, or aerospace?

consider how many programming languages your average person knows (zero). now consider how many you know. is it objectively worth your time optimizing around that particular dimension within your skills, or are you perhaps suffering from a latent bias you have from the fact that you are a relative expert in programming?

would you rather have a carpenter who knows how to use a dozen hammers, or a wide variety of tools? is haskell a new tool, or is it just another hammer for you? with coursera you have no excuse to avoid stepping outside your comfort zone!

> would you rather have a carpenter who knows how to use a dozen hammers, or a wide variety of tools?

There's a danger in what you're suggesting, in overgeneralizing and never learning too much about one topic. Would you rather have a carpenter who's an okay carpenter, an okay musician, an okay actor, and an okay racecar driver, or a carpenter who's really good at carpenting?

well, my point is a person needs to determine on their own if learning something like haskell really makes them a better carpenter, or if they are just going leveling up their "number of programming languages" XP because that's the main XP they are familiar with.

If I had to pick a point of leverage with which to increase programming skill in minimal time, "learn a new programming language" would be far down the list if two or three for various contexts were already well mastered. "Learn Haskell", almost universally, would be near the bottom.

I agree with you that it is everybody's own decision :) Although from a slightly philosophical point of view: how can one determine what levels are beyond their own knowledge, let alone what amount of effort it would take for them to get there and if it would worth it to do so. An experienced developer can tell a beginner what they could/should learn next to step up, but how do you determine the same for yourself?

On the other hand I strongly dislike the "in minimal time" condition. After let's say 10 years or more in programming (that's me in this case) and you say that the next step one could achieve is something that comes faster than learning a new programming paradigm? My gut feeling is that it will take me about 6 months with a strong programming background. I am not talking about learning Haskell (What could it be: a week or so?) but about understanding FP, knowing (and feeling) the fp design patterns. Depending on the investment in 6 months one probably can achieve that the application of those patterns come as second nature. That's my goal. Two questions:

1) What would give greater and longer-term benefits than that? Learning Reactive Extensions? Yet another ORM framework? Node.js? Those are only tools. One can learn them in some days when a project requires it.

2) What is the rush for? Do you remember the time you learnt OO programming? I would say to learn it properly, in the beginning of your career as most of us do it, required much more effort than to learn Haskell and FP when you are already an experienced programmer. Wasn't it worth to spend all that time to learn OO principles, design-patterns, tools, languages? And if you were stuck in the OO world throughout your career, then I am pretty sure that learning FP principles, patterns and language(s) have about the same effect on your future than OO had on your present expertise.

when I said "minimal time" I meant "minimal time per unit of skill increase." sorry this wasn't clear. the whole point is if your goal is to improve your skills as a programmer you should be optimizing your time to learn things that provide the largest skill increase per unit time.

as far as your first point goes, I agree that some type of random walk part is important to breaking out of local maxima. you can look to social cues for what might be a good thing to start learning about that is outside of your comfort zone. generally speaking since software is eating the world a good litmus test for me is if the domain seems to be amenable to automation and is also not as far along the curve as more "easy" domains to dive into like the latest newfangled way to build a web based CRUD app.

I think that saying you can 'learn Haskell in a week' is really short sighted. You can learn to parse a Haskell program and write a guess-the-number program in a week, but learning how to write good Haskell is going to take months, if not years, especially if you want to do fancy things. Hell, I'd guess it'd take me a month or two just to learn the ins and outs of the lens library and I'm already a good Haskell programmer.

> 1) What would give greater and longer-term benefits than that? Learning Reactive Extensions? Yet another ORM framework? Node.js? Those are only tools. One can learn them in some days when a project requires it.

I think that unless something is completely and utterly trivial, you can't really learn it in 'some days'. You can get enough of an understanding of it to solve a small-medium problem with it, but you can't actually learn it. If you want to learn something really weird, try playing with higher-order polymorphism, type theory, dependent types, or something that's not 'yet another OO language/framework'.

> 2) What is the rush for? Do you remember the time you learnt OO programming? I would say to learn it properly, in the beginning of your career as most of us do it, required much more effort than to learn Haskell and FP when you are already an experienced programmer.

Not for me. Really learning Haskell as an experienced programmer took as long as it took to learn Python as a novice, and I've heard similar reports from other people. I certainly agree that if you know, say, Java, learning C# probably isn't going to maximize your 'skill increase per time'. But saying that going from Java to Haskell, or even farther to something super-weird like Agda or Forth or Prolog, is just as easy as going from Java to C# is just wrong.

Personally, the reason I'm sticking with Haskell as my current thing-to-learn as opposed to jumping to other things is that I've hit that point in the curve where the language is really opening up to me; I had a small problem recently that I wanted to solve, and I was able to use some really cool techniques that don't really have simple equivalences in other languages (the pipes library, if you're curious) to solve it in a nice way.

(comment deleted)
> I think that saying you can 'learn Haskell in a week' is really short sighted. You can learn to parse a Haskell program and write a guess-the-number program in a week, but learning how to write good Haskell is going to take months, if not years.

That was exactly my point, sorry if it wasn't clear.

> Really learning Haskell as an experienced programmer took as long as it took to learn Python as a novice, and I've heard similar reports from other people. I certainly agree that if you know, say, Java, learning C# probably isn't going to maximize your 'skill increase per time'. But saying that going from Java to Haskell, or even farther to something super-weird like Agda or Forth or Prolog, is just as easy as going from Java to C# is just wrong.

I am not saying that the "Java after C#" learning curve is the same as "Haskell after C#". It isn't. But I believe that the general experience of abstract thinking that one learns in many years must give an advantage over a novice learner. I am not talking about a script-kiddie who spent five years hacking code, or somebody who has the same one year experience 20 times instead of real 20 year experience. I believe that if you spent your development life actively then you must get a new concept easier than a beginner. And not only that. Concepts of a paradigm or language leak into others. Linq in .Net leverages "monads". Eric Meijer, one of the creators of Linq, loves Haskell and they borrowed ideas from Haskell. Now, if one is a "too pragmatic" programmer, they can use Linq for years successfully and never get closer to understand monads. However is one takes the time and looks behind the curtains, they got closer to understand at least this one concept of Haskell. And I am pretty sure that over let's say 10 years you are exposed to many ideas in some way if you keep your eyes open.

As I said, my gut feeling (can't tell how good the estimation is) is that in about six months I "get Haskell and fp". But it's not black or white: obviously spending 6 more years in the fp world would make a difference. There must be a decision made (and here I agree with gfodor) when the further gain doesn't justify the investment. I won't stop at 6th month if I don't feel the power yet :)

I will learn Ruby on Rails and node.js
I will learn Go and then happily ignore it in favor of HTML + JS + CSS + SVG all the time forever.
I will learn Scala and node.js.
There are so many languages I would like to learn :

- Ada : everybody raves about it but nobody uses it ;-) - Python : for everyday hacks, it's portable, simple and it's not Java ;-) - Assembly : it's the root of everything - C : my mind is overflowing with Arduino projects - C++ : I'd love to create ISX extensions and make private bots for some MMO - Prolog : just because

I will probably settle for Ada if John Barnes publish its book at the beginning of 2014.

Gonna attempt to learn Haskell properly once AGAIN.
I'm heads down on golang right now and will continue to be so. I never quite acquired C - wrote plenty of code in it, but it was always a struggle. Go's just above the threshold where my mind will take it wholescale (ala Python) and it gives me the ability to write simple code and generate cross-platform binaries from it.

One app: web, windows, mac, linux. I know that can be done with other tools too, but this is the one I've chosen. I like SQL too: old guys like weird tools!

I'd be interested in learning Rust. I've been learning Haskell last year and I'm absolutely loving it.
Cement my knowledge of Scheme as I work through SICP.
Mozilla's Rust because:

* It's memory safe

* concurrent (using light weight tasks like Erlang)

* practical (in terms of syntax, semantics)

It's also being used to develop the next generation of browser engine: Servo

http://rust-lang.org/

Elixir
I'm picking on you, but could just as easily picked on most the other replies.

Your answer to this topic is only interesting if you explain why. Even a very brief explanation will do. As it happens, I've never heard of Elixir. Try to make me curious enough to google it.

In my case, I'll likely not try to learn any new language this year. But I am going to brush-up on the mathematics that has gotten rusty over the years. Partly because I used to like math, but now rarely get to use anything beyond basic algebra. And partly to position myself better to help my kid with homework.

I friend recommended Elixir to me, but I would rather learn Erlang properly. Erlang has a small community already, why to learn a language targeting Erlang VM that has even smaller community and much less documentation?
I've started to play with Nimrod and I will definitively continue in 2014. Macros are not always easy to use but they are clean and powerful (I'm mostly a C programmer ...)
Well, definitely Powershell.
I was surprised to have used nodejs in my work throughout the year, so now I'll skip the advanced (functional) javascript and go retro with c/c++/c#.
Planning on learning enough Erlang to understand BEAM and the OTP ecosystem, and potentially picking up Elixir if it makes sense to do so.

I think there's a lot of interesting ideas around high availability and fault tolerance to explore in the Erlang world, and I'd like to tap into that.

haskell + scala + racket "yeah baby..."