Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: Which language to learn for long-term work
28 points by jsudhams on July 13, 2015 | hide | past | web | favorite | 57 comments
All : I am an 17 year experienced in IT infra (everything from sun solaris to linux / 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.

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

I have gone through funtional programming pros and cons and discussion here. What i need is what langauage can/should i learn out of the below ones.

1. Rust 2. Go 3. Haskell 4. Elixr (Erlang) 5. Lisp

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)

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.

As a primer i have started (again) on math on Khan academy and refreshing math skills.

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)

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.

I was going to come and also say JS. It is not my favorite language, but it is certainly not going anywhere anytime soon. There is also so much bad code being written in JS right now that entire careers will likely be built doing clean up.

> There is also so much bad code being written in JS right now that entire careers will likely be built doing clean up.

Perhaps the most demotivational advice I've ever read :-)

"Learn javascript and clean up other people's mess."

Some people (myself at least) actually like refactoring. There is something really satisfying about coming in and fixing up a badly written Node.js codebase, breaking it up into microservices, etc.

Plus if you want to be a $200+ per hour contractor, this type of "mercenary work" can be really profitable.

That very advice has powered many a career in Cobol...

But you're not meant to tell someone that when they're just starting out... :-)

When I decided to focus on a new technology I really wanted to be somewhere where all the "cool" things are happening. I ended up in the world of JavaScript and really have not looked back. If you are undecided have a look here http://githut.info/ as well as look at your local job market. I like to attend hackathons so being able to leverage a massive developer community is key to any technology I will bet my career on. Even now I'm pushing myself beyond JavasScript to use typescript as it brings a maturity to JavaScript I felt was lacking. The important thing is that I feel that there is so much community investment into being able to do things in JavaScript that it enables me to focus on deliverables.

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.

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.


The io.js and node.js split is actually a sign of health in the core of Node.js. Tired of Joyent's stagnate stewardship, the top contributors forked it. They forced Joyent's hand into creating a foundation.

Now io.js and Node.js are "merging", but the merge is just the io.js codebase with some patches from node.js all under the node.js branding and the new node foundation (which has blessings from the linux foundation, IBM, Microsoft, etc). So the community has been "resolved."

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... which has the more correct answer for your question: It doesn't matter.

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.

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.

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

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.

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

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

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>

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.

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

> Go is not the new C.


> Rust should take over,

no </3

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.

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.

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

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.

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.

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.

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.

> very wide spread industry uses

I think you need to be very careful with this and quantify it more. I suspect that if you graphed Go + Elixr on a graph with either LOC deployed, new LOC written, expected future projects or jobs available it wouldn't even be visible on the same scale as C# or C++. Compared to Java you'd have to do some sort of dramatic log scale or something to see it.

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.

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.

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.

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.

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.

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.

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

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

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

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

6) Elixir provides true macros (in the Lisp sense). It seems to be the very first non-homoiconic (https://en.wikipedia.org/wiki/Homoiconicity) language to pull this off: 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 Also see his praising of Lisp: 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/

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.

English. j/k.

Out of those, would pick Go

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.

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

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?

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.

    1. JavaScript
    2. Java
    3. C#
Everything else is niche, recommended by people drinking too much Kool-Aid.

> Everything else is niche,

Niche isn't always a bad thing.

> recommended by people drinking too much Kool-Aid.

Sure, it's just because of Kool-Aid that people choose to use C, Lisp, Haskell, Python, Ruby, etc for projects instead of one of your blessed 3 languages.

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

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

Money wise, I would put Java first. It pays best of these. Not sure who wins between C# and JS on that front.

As long as you like maintaining 10+ year old systems.

What is the motivation for refining your math ability?

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)

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

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.


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.

He does not need to learn all of them if he actually wants to get paid.

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.

Someone who only knows one or two languages is not worth paying.

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact