

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

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.
======
yen223
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.

~~~
gfodor
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!

~~~
velis_vel
> 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?

~~~
gfodor
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.

~~~
peterfoldi
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.

~~~
velis_vel
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.

~~~
peterfoldi
> 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 :)

------
leashless
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!

------
zenshade
After programming for 30 years (and upwards of 20 languages) I've come to
believe that you really only "need" to learn 4 languages to complete your Jedi
programming skills and become a master. You need one each from the following
categories:

"Machine" language - this is anything turing complete that's close to the
hardware, ie that forces you to think about and understand the underlying
circuitry. Candidates: Assembler, C.

Static/Imperative "Object" language - put this one off for as long as you can,
for it is easy but not simple, and will ensnare your mind with the belief that
you are special because you are among the elite priesthood of programmers who
can grasp levels of complexity mere mortals dare not even dream of. Down this
path lies years of frustration, all in service of the darkside. Chances are
that this category will be forced upon you first, by naive, shortsighted fools
who little realize the evil they are spreading. Learn only what you need to
disable the tractor beam and escape with the Deathstar layout, so that when
the time is right a well planned rebel assault may remove this abomination
from the universe.

Candidates: there are no candidates here, as that implies choice. One of these
languages will be heaved upon you whether you like it or not - C++, Java or
Visual Basic (if the darkside is particularly strong in you).

Dynamic "scripting" language - this is for that category of problems where
most of the needed abstractions are well understood and well tested. Using
them should involve as few words as possible.

Candidates: Ruby, Python, Perl, Lua, bash (or any bourne shell derivative).

And finally, what should be every programmer's last language,

A "language" language - these are usually known as Lisps, but I think both
Alan Kay's original bootstrapping Smalltalk and Forth are acceptable here. The
key feature is having a small core of concepts that can be infinitely composed
into higher abstraction commands that are treated no differently from the
compiler's perspective. Once you have this power, all of the interesting
behaviours of languages like Haskell, Erlang, Prolog, etc, are available to
you.

Candidates: Scheme/Racket, Common Lisp, Clojure, Smalltalk, Lisp.

------
Myk267
Haskell.

Having learned perl, ruby and python (these are all incredibly similar), and
then Clojure, I've found that I really like the functional paradigm. It helped
drag my attention back to thinking about data structures and functions to act
on that data a lot more than a ton of bad OOP examples ever have. I'm actually
excited to program now instead of feeling like, "Okay, this mess of classes
I'm making is going to pay off some day..."

One negative/positive is that I now kind of recoil in distaste when I find
OOP-y code that's seemingly done for the sake of jamming code into a class
instead of using generic functions and data types. It's funny that there's a
large swath of not so useful monad tutorials, because there's an absolute
_mountain_ of examples of classes/objects that don't make any sense at all. I
didn't mean to make a tiny rant on OOP. Sorry about that.

As someone who has been using a lot of dynamic languages, I'm really
interested to find out how a static type system can help me program better
software.

------
ciderpunx
If you're learning Haskell, be prepared to feel like a beginner for a while.

I had great learning it. I usually pick up languages fairly quickly, but
Haskell eluded me for more months than I'd care to admit. There is a great
community of very smart and friendly people who helped me on IRC, and a couple
of pretty good books --
[http://learnyouahaskell.com/](http://learnyouahaskell.com/) and
[http://www.cs.nott.ac.uk/~gmh/book.html](http://www.cs.nott.ac.uk/~gmh/book.html).

I enjoyed the experience, and I certainly feel like a better programmer for
it. But damn I felt daft for a few months!

~~~
peterfoldi
I am looking forward to that experience :) Besides the technical reasons (nice
syntax, pure fp, strong typing, ...) I chose Haskell to learn functional
programming because it has a very good community and documentation. It's like
the entire Haskell ecosystem's been built to teach FP. Actually that was kind
of the intention when Haskell was born as far as I know.

------
ACow_Adonis
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...

~~~
peterfoldi
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.

~~~
lispm
No, Haskell is very different from Lisp. It makes perfectly sense to learn
Haskell.

~~~
peterfoldi
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".

~~~
lispm
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.

------
mattquiros
Can someone make recommendations for me? Here's what I already know and what
I've built with it:

\- Java. My first real programming language, learned in college, used for a
year and a half in enterprise work and Android, got pretty good at it, but I
learned

\- Objective-C for making iOS apps and I never want to write in Java again.
I'm also learning C just to understand Objective-C more but I have no plans
building anything with C.

Basically, my current interests/goals for learning a new language are:

\- Develop a new way of thinking.

\- Learn some great engineering practices.

\- Build products (software) that solve real-world problems. I'm not likely to
learn a new language if I can't build anything useful with it, that can
potentially sell and make it as a consumer startup.

\- Become full-stack. I can already easily build an iOS app (I have no
interest in building responsive websites) but I find myself still having to
rely on something like Parse. Which isn't so bad though because it saves me so
much time.

I guess that narrows my choices down to: Ruby, Python, Go, or something else,
but I'm not in a position to identify which poison is best-suited to me. I
just want one that I can be really good at and meet most if not all of my
goals. Any thoughts?

~~~
peterfoldi
Very pragmatic approach. C# if you are ok with the Microsoft stack, or F# if
you are a bit more advantageous and serious about the "new way of thinking".
Python is also a great investment to solve real-world problems. And don't
forget JavaScript. It is not just a browser language any more: there is
node.js for the server side and it is the common language of most mobile
frameworks that are multi-platform targeted.

You cannot go wrong with any of these. So have a look at code samples and
spend some time browsing the web-sites about all of them then choose the one
that appeals the most to you.

------
jmnicolas
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.

------
aldanor
Gonna attempt to learn Haskell properly once AGAIN.

------
tsahyt
I'd be interested in learning Rust. I've been learning Haskell last year and
I'm absolutely loving it.

------
iSloth
Python - I'm doing far too much stuff in PHP just because that's what I know,
seems to be fairly simple to learn as well, and quick which should help in the
$dayjob efficiency.

~~~
deadfall
Same boat. I started a django project to learn more about python for the web.

------
michaelwww
I learned Dart and TypeScript this year and both were fairly trivial to learn
and use. The learning process improved my JavaScript skills because I had to
think about JavaScript in new ways and got me ready for ES6 (For example, the
discussions about iterators in Dart and ES6 was interesting.) Next up is
ClojureScript, if I can get over the syntax.

------
hkarthik
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.

------
cju
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 ...)

------
phektus
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#.

------
spb
I will learn Go and then happily ignore it in favor of HTML + JS + CSS + SVG
all the time forever.

------
tdfx
Objective-C. Overdue.

------
nnoitra
Cement my knowledge of Scheme as I work through SICP.

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

------
anwaar
I will learn Ruby on Rails and node.js

------
usladha
I will learn Scala and node.js.

------
cafard
Well, definitely Powershell.

------
havanna993
Ruby, Python and Scala =)

------
ing33k
clojure

------
kyrre
clojure

------
qwerta
Kotlin and Go

------
pcharles
Ruby, iOS

------
arisAlexis
c++ or scala undecided

------
horofx
Elixir

~~~
dded
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.

------
dmux
TCL

------
workhere-io
Go.

