
Ask HN: Which language to learn for long-term work - jsudhams
All : I am an 17 year experienced in IT infra (everything from sun solaris to linux &#x2F; windows and some cisco) and very enthusiatic to learn. Learned programming for troubleshooting and can CRUD apps in C#,vb.net, vb6 and if forced C++. Used C++ in past for call windows kernel functions only. Supported COM and DCOM apps, and know ms sql very well. But like coding in vb.net mostly if i have come out with app quickly. Have done few websites and apps used by companies.<p>I want to be a good programmer for alternate income as in India it is not possible continue as IT Infra guy with out biting management bullet after some level of salary. I get around 34K USD after tax here in india and manage a team now but also consult and design apps. Very innovative and have can solove anything attitude and does not drop&#x2F;give up before trying. Have learned trading in real markets as well as openstack, aws and TOGAF way of EA. Been around a lot in this forum and earlier in slash dot.<p>I have gone through funtional programming pros and cons and discussion here. What i need is what langauage can&#x2F;should i learn out of the below ones.<p>1. Rust
2. Go
3. Haskell
4. Elixr (Erlang)
5. Lisp<p>What I want to get out is side income to start with as remote work ( i dont have regular education for H1B but L1 i can get so dont want try moving)<p>But want to pick up a domain like Trading or Telephony or large systems management learn using real worl scenarios and problems and create applications as i learn. I have plan bootstrap few ideas in banking and in chat areas. But main thing is want to have some steady income via side project some thing like US$ 2 K per month is sustainable for long run.<p>As a primer i have started (again) on math on Khan academy and refreshing math skills.<p>So my question is which language should i learn?
(Note: i can love what i do so no answer of love what u do, had developed this mentality to come so i am fine with start something love it)
======
WoodenChair
I'm surprised nobody here has said JavaScript. It's not on your list, and
personally I strongly dislike it, but it's the most ubiquitous language
nowadays in the world. You will definitely be able to find side project work
in it. And if you add in Node, you're golden for most any web project.

~~~
orthoganol
I expected this answer at the top... JS will always be in demand for front end
web positions (the MVC front end frameworks included), but as for the backend
I have doubts about it's longevity, a major flag being the IO & Joyent split,
as well as general back end developer anathema to using JavaScript I've sensed
over the years (your's being an example). Maybe they'll resolve the community,
and maybe greater numbers of back end devs will learn to enjoy JavaScript.
It's hot right now of course, but thinking long term my experience tells me
it's a risky choice if your goal is more pure back end dev.

~~~
mmorris
I don't have an opinion on the long-term viability of JS on the backend
(though I enjoy Node.js for "realtime" web serving), but it wasn't clear from
your post if you were aware that IO.js and Node.js are getting back together.

[http://thenextweb.com/dd/2015/06/16/node-js-and-io-js-are-
se...](http://thenextweb.com/dd/2015/06/16/node-js-and-io-js-are-settling-
their-differences-merging-back-together/)

------
ufmace
Stick with Java and C# if you want to work in business, as that's what like
90% of businesses are using. Learn cool new languages for fun if you want, but
don't expect to find work using them.

But really, you should read [http://www.kalzumeus.com/2011/10/28/dont-call-
yourself-a-pro...](http://www.kalzumeus.com/2011/10/28/dont-call-yourself-a-
programmer/) which has the more correct answer for your question: It doesn't
matter.

------
cies
From your list: Go.

Not on your list: Java, C++, C#, maybe even COBOL.

If you want cool work then: Rust, Haskell, Elixir and Lisp (Clojure). As these
will see a lot more green field projects, use at start-ups, use by teams that
are less constrained by Enterprise criteria.

~~~
estefan
Just did a few job searches for contracts in London.

0 jobs available for most of the "cool" languages, but some for clojure, 4 for
go, and hundreds for java, C++, C#.

So, it depends if he wants to get paid or just learn for the sake of learning.

~~~
codygman
There are also remote jobs in the "cool" languages.

------
tetheno
I would learn Java and the JVM if I wanted a language/platform for the long
term.

Of the five you got there, I would go for Go. Or Clojure as a Lisp. Scala is
also a good option.

~~~
patrickmclaren
+1 for Scala, it might be a good stepping stone, given your current
"enterprisey" focus. Much easier to differentiate yourself than good old
fashioned Java, yet not as esoteric (viewed from enterprise) as some of the
languages in your list.

------
egeozcan
I think that English is very important not only for doing remote work but also
for understanding the intricacies of programming languages with docs that are
inscrutable to the beginners of the English language. When I was 16 and had
been trying to learn C++ I had a late realization that understanding the
(sometimes weird) semantics of English would have helped a great deal learning
the (almost always weird) semantics of C++.

Also, I'd refrain from trying to learn as many languages as possible.
Understand how systems work and how to build them. You have to understand how
to read code, before you become a great coder (Maybe you already are, I'm
speaking in general).

------
Ciantic
While there are new comers like Swift, Go and Rust etc. Still the biggest
language and lots of chores in future, will be Java. If you want to just work
<tm>

------
jacques_chester
Out of the ones you listed, and grit my teeth to say it as I must: Go.

Go is the new C, for good and ill.

We're going to be stuck with it for decades. Might as well become conversant.

~~~
MichaelGG
Go is not the new C. It's not up to the same tasks, full stop (memory
management being the number one killer.) C is still the new C, and your best
low level bet. (Rust _should_ take over, but people don't do what they
should.)

~~~
ooooak
> Go is not the new C.

1+

> Rust should take over,

no </3

------
estefan
You're doing it backwards. Find out what gigs are paying, what skills they
require then go and learn them. No point learning Go if there are only Java
jobs available.

On the other hand, if you're creating personal projects to monetise, use
whatever you like/has the best libraries, etc.

------
niix
I recommend JavaScript. Finding contractor work should be fairly easy if you
are able to build web applications. In addition, learn Node so you can write
backends for those web apps in JavaScript as well.

When I was in school I focused primarily becoming proficient at Python, as I
thought that was the language that would land me a decent career. Since I am
mostly interested in web programming, I found myself building backends in
Python - but always ended up still using a ton of JavaScript. When I switched
my focus to being primarily a JavaScript developer, I ended up finding a ton
of work and that is still the case to this day (5-6 years later).

------
lmm
From your list, Haskell. Rust and Go are trendy right now but there's no
guarantee they will last (much as I admire Rust's design), whereas Haskell is
old enough to have passed through the hype cycle and out the other side. (So
has Lisp, but it's simply not popular enough, IMO).

Honestly you already have a language that's much more commercially viable: C#.
You'll find it easier to make money by expanding your C# skills than with any
of the languages you suggest. If you want to go functional then F# is a good
companion language since it's interoperable with C#, so you can use small
pieces of it where appropriate.

------
cowls
If you're main goal is "to have some steady income via side project" then it
doesnt matter which language you pick.

What matters is the product you create and whether people will use it and/or
pay for it.

------
valarauca1
Go and Elixr have very wide spread industry uses.

Rust while promising (I use it heavily myself) still hasn't seen much industry
adoption. I'm confident it will... eventually.

~~~
davismwfl
Second this. Given your couple of bootstrap areas too, either language (or
both) will be beneficial.

I will say though that in most low level systems that demand absolute
performance or that have been around for quite a while it is still mostly
C/C++ based. So if you are wanting to break into those areas, then C is going
to be the language to know really well. I have worked on a number of telephony
systems and am familiar with a few financial trading platform architectures,
and C is really core and popular in both domains. Other languages are used in
both domains, but just wanted to toss that out there to you.

------
krisgenre
Since you are in India, the most sought after skill is Android/iOS
development. ObjC/Swift, Java and Javascript is definitely good for long term.

------
popee
I'd first ask myself where do I want to be: enterprise, freelance,
community/FLOSS, ...? After that, it's not hard to make list of langs that are
mostly used in these areas and personally i'd choose langs that are in more
than one area.

Ok, this has one big flaw, it doesn't tell much about langs that are still in
development (rust, go, ...), so keep that in mind.

------
simi_
My main language for the past 2 years has been Go, and I'm very happy with it
(with the occasional Python and JS break). I would definitely recommend it for
you, too. I've been on both sides of the hiring process and Go seems to have
gained a lot of momentum, especially at companies you'd like to work for.

------
alistproducer2
For a general purpose Dev job: Java, C#, and JavaScript. Given what your OP
mentions your interests are, you don't seem like you would find such a job
stimulating.

I worked at a telephony company and that was the most interesting job I had
thus far.

------
jtwebman
I would learn all of them a little and just pick the one you enjoy the most. I
did the same thing and included Scala and Clojure. In the end I pick Elixir
and Erlang but I think you can pick the one you enjoy most.

------
lectrick
Elixir all the way. It's going to be a big deal.

I've been doing Ruby for over 10 years. Never seen anything like Elixir.

Rust, Haskell, Clojure will have their niches too. But Elixir will probably
take over back-end web development.

~~~
codygman
> But Elixir will probably take over back-end web development.

That's a very large claim, can you give some more reasons as to why you think
so?

~~~
lectrick
Granted this is speculation, but I've done my homework:

1) Extreme concurrency due to Erlang underneath, which means not only being
able to handle lots of connections at once, but very good DDoS resistance. See
WhatsApp's blog post about it: [http://blog.whatsapp.com/196/1-million-is-
so-2011](http://blog.whatsapp.com/196/1-million-is-so-2011) An Elixir (or
Erlang) process can fire up a million new nodes in a second on commodity
hardware. No joke. The out-of-the-box concurrency in Elixir replaces many
tools in Ruby that are normally separate gems:
[http://www.smashcompany.com/technology/ruby-concurrency-
need...](http://www.smashcompany.com/technology/ruby-concurrency-needs-
microservices-but-not-elixir)

2) Near-100% uptime possible. (Google "Whatsapp uptime"). Erlang was designed
to run cell networks. It made them very reliable. The entire philosophy of the
language is to "embrace failure, log it and try again ASAP." This ends up
being a very good strategy when dealing with the uncertainty of the real
world, and things like security concerns.

3) Live code upgrades without downtime. See this demo:
[https://youtu.be/96UzSHyp0F8](https://youtu.be/96UzSHyp0F8)

4) MUCH nicer syntax than Erlang. Especially for ex-Rubyists. It's a
functional language (with all the advantages that provides) with a Ruby-
flavored syntax. Best of all worlds.

5) Phoenix, the Rails-equivalent web API, has come out of the gate with a 2 to
10x performance improvement over Rails using a fraction of the CPU load:
[http://www.littlelines.com/blog/2014/07/08/elixir-vs-ruby-
sh...](http://www.littlelines.com/blog/2014/07/08/elixir-vs-ruby-showdown-
phoenix-vs-rails/)

6) Elixir provides _true macros_ (in the Lisp sense). It seems to be the very
first non-homoiconic
([https://en.wikipedia.org/wiki/Homoiconicity](https://en.wikipedia.org/wiki/Homoiconicity))
language to pull this off: [http://elixir-lang.org/getting-
started/meta/macros.html](http://elixir-lang.org/getting-
started/meta/macros.html) Macros allow for some _very_ powerful code, but the
homoiconicity of Lisplikes (which is normally the only place "true" macros are
available) has been a turn-off for many. I probably don't need to sell you on
macros if you're on Hacker News, Paul Graham has historically praised them as
a key differentiator:
[http://www.paulgraham.com/avg.html](http://www.paulgraham.com/avg.html) Also
see his praising of Lisp:
[http://www.paulgraham.com/diff.html](http://www.paulgraham.com/diff.html)

7) No reliance on the JVM (and its spinup time).

8) The tooling is fantastic so far- Mix is like a combination of "bundler",
"gem" and "rake". The test suites run in parallel by default, which means
faster code turnaround.

9) You can take advantage of the entire existing Erlang code library. Trivial
to include it in your project and call into it. That's quite the
bootstrapping, and eliminates a lot of upfront work to make things useful.

10) Harder to make bugs in general- Making state explicit means less coupling,
dependencies and bugs. Immutable data means less bugs (and trivial
concurrency). Pattern-matching means less control-flow logic, and again, less
bugs. Using typespecs in conjuction with Dialyzer means less bugs:
[http://learningelixir.joekain.com/elixir-type-
safety/](http://learningelixir.joekain.com/elixir-type-safety/)

Less bugs means far more productive programmers. More resilience means more
uptime and more resistance to DDoS and happier customers. Live code upgrades
mean more uptime. Faster test suites means far more productive programmers.
Nice syntax means it "feels nice" for Rubyists (and likely Pythonistas).
Faster language, period, means less hardware is necessary.

All of this and more, combined with the sense of intelligence and
professionalism I'm detecting in the community (Jose Valim, Chris McCord,
etc.) gives me a pretty good feeling about it.

------
dharma1
English. j/k.

Out of those, would pick Go

~~~
notauser
I'm not sure that "English" deserves to be written off as a joke.

I was born in England and have had to work at developing a "mid-Atlantic"
English accent to make it easier for Americans to understand me on the phone.

One of my colleagues who grew up in Chennai says that learning how to speak
with an American accent has won him a lot of contracts over competing
outsourcing firms.

If you are selling something then making it as easy as possible to buy from
you is a good idea.

~~~
MichaelGG
This is really important. From personal experience, there's a lot of bias.
Some racism, but a lot of people having bad experiences with "Indians", due to
shitty outsourcing. It must suck to get written off because of this
superficial bias. I'm guessing more money goes to contractors that happen to
be in India vs Indian contractors. (I've lived in a country with a bad rep for
a long time, and I make sure I'm not introduced as Michael from <place> \- a
lot of people are attracted to mentioning it if you're not local, it seems.)

------
barrystaes
Learn several languages (you did). Dont focus on one but rather look at what
the problem in front of you calls for. If there was one "best" programming
language, why do we have so many?

------
MichaelGG
Telephony (in VoIP) is mostly C/C++, then with a smattering of scripty stuff
to tie it together in the UI. PHP, Perl, Ruby. Bigger places use Java and
maybe a few on .NET. WebRTC seems hot, and the frontend would need JS in a
browser, but in the backend... Despite Erlang supposedly being "made for
telecom", I've not really seen it be used much. (Yes I'm aware some big
switches use or have used it, just haven't seen it in VoIP much.)

If I were in the position of trying to get remote work in telephony, I'd start
learning the popular open source packages in use (Asterisk, FreeSWITCH,
OpenSIPS), read up on protocol SIP (SIP Illustrated is a good course, includes
an annotated RFC) and get your name out there in the community (answer
questions, post write ups, etc.)

There's a range of work from cobbling CRUD apps together around a telephony
core, to fixing core code, setting up networks, etc. Telecom has a lot of
legacy and complexity, and that means there's opportunity for people figuring
it out. I've seen this happen: guy joins mailing list asking super newb
questions. Fast forward a bit and now he's billed out as an expert. All self-
taught and promoted.

You'd also need solid networking skills (which come in handy even in web dev;
I'm annoyed/surprised that many "web developers" are unable to diagnose basic
network issues with Wireshark). The material in a CCNA course should be a
decent starting point, though don't obsess about learning IOS management.

On languages, if you're steady with C (you have a good idea how the machine
works), and you've got a couple popular languages learned, I don't believe
language will hold you back. Domain experience will compensate, and you can
always learn new languages easily enough. Though I'd _highly_ suggest picking
up a functional language (I'm preferential to F#) for the much more powerful
thinking it'll bring you. Ultimately, I'm unconvinced that picking up a hot
language will lead to work in that language (hey, I just learned Go, hire
me!). But demonstrating ability will show you off very well. For instance,
Rust is hot, a _great_ language, and there's still opportunity for write-ups
on "I did $neatish_thing, _in Rust_ ", to get a fair amount of interest.

Otherwise if you really just are trying to bid on random contract work, others
said it: adding the JVM/Java keyword is probably the best way to increase
reach.

Edit: With 17 years IT, when you add programming to the mix, you now have the
very hot "devops" buzzword which seems to be very popular.

------
Aleman360

        1. JavaScript
        2. Java
        3. C#
    

Everything else is niche, recommended by people drinking too much Kool-Aid.

~~~
WoodenChair
> Everything else is niche, recommended by people drinking too much Kool-Aid.

Objective-C and Swift are niche? Apple has sold 100,000,000s of devices.

PHP is niche? Python is niche?

Be careful about writing in absolutes.

~~~
Aleman360
"niche" as in probably applies to a relatively small percentage of job
postings overall.

Objective-C and Swift are obviously big in terms of absolute number of jobs
available but I'd suspect still an order of magnitude smaller relative to the
other three combined.

------
wittedhaddock
What is the motivation for refining your math ability?

~~~
jsudhams
I had to drop out of school for job (as part son of soil type) and i dropped
after class 10 so learned only up to algebra, basic probability and basic
geometry as the differentials and calculus was on the 11th and 12th class. And
lot of time i am not able understand even small equations in articles related
to crypto and others hence starting to learn it now.(35 but i understand the
math now much better so started again from basics)

~~~
hga
As long as you're (re-)learning math (which is a very good thing), you should
consider dipping your toes into Lisp by doing some of SICP
([https://en.wikipedia.org/wiki/Structure_and_Interpretation_o...](https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs)
note the complete text is on-line), which was designed for MIT undergraduates,
who the authors could safely assume were fairly mathematically mature. It
doesn't require any math I consider difficult, but it does use it freely. So
if you do it, it'll reinforce the math you're learning, show you to some very
useful, basic computer science, and incidentally teach you basic Lisp and
functional programming.

~~~
MichaelGG
Or along with Sedgwick's old algorithms book. Reading it at a fast pace will
give anyone a good survey of algorithms. I read the Pascal version, and it was
clear enough to pick up a fair idea of many things.

------
cjbprime
JavaScript.

------
megaman22
Java, C#, JavaScript, and maybe Python are probably the best chance of steady
work, since they are so ubiquitous. C or C++ for some domains, like embedded
systems, drivers, and other heavy-duty systems work.

Learning the more esoteric stuff can be fun and can teach some interesting
approaches to programming, but they are niche. Maybe more highly-paid jobs,
but the availability is orders of magnitude lower than the more widely-used
languages.

Not knowing anything else about you than that you are from India, and just
going on the experiences I have had working with some Indian subcontractors,
doing some Rosetta Stone English would probably be a worthwhile investment.
It's mostly the tempo that seems to confuddle Americans.

------
enkiv2
Learn all of the above. If you hear about a language and it seems like it's
significantly different from the ones you know, learn it. Learn all the
languages.

~~~
estefan
He does _not_ need to learn all of them if he actually wants to get paid.

~~~
anthony_d
You're right, but looking at the long term it helps to be as well rounded as
possible. Short term you only need to know what's on the want ad.

