I've been getting a lot of questions along the lines of "What technology/language should I be learning to be a competitive hire once I graduate?" Are technologies like Ruby on Rails going to be relevant in 2-3 years, or will more front-endy frameworks like Backbone.JS be the de facto? Will everything be asynchronous (Node/Tornado)? Will iOS be as relevant as it is now, or will HTML5 apps run as well as native mobile applications? If hiring developers gets even more difficult than it is now, does this question even matter?
With Hacker News and tech media touting some new technology every day, it's tough to know what to spend time learning. I'd love to hear your forecasts for the next few years. (Feel free to invite anyone else, too!)

What technologies or languages should a new developer be learning?

I've been getting a lot of questions along the lines of "What technology/language should I be learning to be a competitive hire once I graduate?"Are technologies like Ruby on Rails going to be relevant in 2-3 years, or will more front-endy frameworks like Backbone.JS be the de facto?Will everything be asynchronous (Node/Tornado)?Will iOS be as relevant as it is now, or will HTML5 apps run as well as native mobile applications?If hiring developers gets even more difficult than it is now, does this question even matter?

With Hacker News and tech media touting some new technology every day, it's tough to know what to spend time learning.I'd love to hear your forecasts for the next few years.(Feel free to invite anyone else, too!)

I think it's more important to demonstrate that you're capable of learning new things and understanding important concepts than to demonstrate that you have proficiency of any particular library or tool. Programming languages come and go, but the concepts remain largely the same.

If you're trying to pick a language to really focus on, you probably can't go wrong by looking at the most popular languages on github: Javascript, Ruby, Python, Java.One language that I use, and that's missing from that list is Scala. We use it at foursquare as our primary server development language. It's also used at twitter, linkedin and a bunch of other startups. Adoption has been picking up pretty quickly. In general, I think experience in functional style programming will become more and more important.

But on a more serious note, learn the things that help you solve your own problems.Learning code for the sake of learning...is fine...and is sometimes fun to stimulate your brain in ways that help you become of the renaissance type.I imagine this is why many folks scour Hacker News.Not so much to see what new technologies to learn, but to just be aware and gather a heart beat of the community.

"What technology/language should I be learning to be a competitive hire once I graduate?"JavaScript...I guess."Are technologies like Ruby on Rails going to be relevant in 2-3 years?"Yes."or will more front-endy frameworks like Backbone.JS be the de facto?"No.Will everything be asynchronous (Node/Tornado)?No.Also that's a flawed question.Async is just a pattern.You can make anything blocking or non-blocking outside the scope of a language or technology."Will iOS be as relevant as it is now, or will HTML5 apps run as well as native mobile applications?"Probably both."If hiring developers gets even more difficult than it is now, does this question even matter?"Is it that difficult?Nevertheless, the question always matters

"With Hacker News and tech media touting some new technology every day, it's tough to know what to spend time learning"

A lot of people are surprised to hear this, since I ended up being a senior front-end engineer at Twitter just over a year out of college, but I didn't learn JavaScript until after college, and was a newcomer to the community and the to language when I started blogging at adequatelygood.com.Professionally, I've worked with JavaScript, Python, Ruby on Rails, Node.js, and iOS/Cocoa Touch. I didn't spend time working with any of those in school or as a hobby, except for a few tiny projects playing with Python that didn't really last long. I had spent significant amounts of time programming C for the TI-89 in high school (I wrote a clone of Super Metroid, among other games), and had a part-time job doing ASP.NET during college.Just learn lots of new (to you) technologies and then get comfortable enough to express opinions and comparisons about them. If you can spend 30min talking about the differences between any two languages or technologies, you're doing pretty well.

However, to not provide a complete lack of direction, here's some reasonable choices to learn for the sake of learning, which may or may not be relevant, but will be fun and provide good opportunities to learn:

1) C. You may never get paid to write a line of C code in your life, but learning this language and all of its amazing and terrible features is worth the time. You'll discover a lot about yourself and computers. I'd recommend programming a simple 2d game in C, which will be a life-altering challenge.2) Node.js.JavaScript will probably be useful for a long time, and node is simple to get started with, while introducing some powerful topics like non-blocking code.Build some interesting network programs.3) iOS/Cocoa Touch.This will leverage what you learned about C, while giving you the opportunity to learn about interface and interaction programming.But really, you can't pick wrong.Don't expect whatever you do to be directly relevant in 2-3 years.Learn to learn.

It seems like the general consensus is that newcomers should- Pick a language and get proficient in it- Try a slew of new languages to get better at the process of learning (and perhaps get a taste of different paradigms)

I think the second point is particularly fascinating.Ben, you mentioned that learning C is incredibly helpful.Is there something to be said for learning Lisp, Haskell, Go, or other, more esoteric languages?If so, which ones?Also, I *love* "Learn to learn"!

I agree with the others who have mentioned that it is less about coming out knowing the latest shiny technology and more about having a solid foundation and high aptitude to pick things up.I would say that you should come out understanding C or a C based language which requires memory management (like Objective C), a functional based language (perhaps JavaScript) as well as a scripting language (Ruby or Python).In addition you should have a solid understanding of object oriented programming & design as well as understand how the web works with a basic grasp of HTML/CSS.Given this you should have no trouble picking up the specific technologies needed for your role.

Josh - While I agree that JavaScript is a "functional" language, most people don't treat it that way, and you'll run into a lot of trouble trying to learn functional programming through JavaScript. I'd recommend Lisp or Haskell, or perhaps Scala, for a crash course in functional programming. Those languages are far more pure, and will help you really "get it" much faster and clearer.What you learn there will be super useful in any language, in any context.(I hope that also answers your question, Hursh).

100% agree with Josh's assessment.Having a solid foundation that isn't based on a specific language is great.Something else to consider is knowledge of design patterns and data structures and algorithms.Since they are (mostly) language agnostic they are great skills to have and can be applied everywhere once you learn them once.Having gone through the Google interview process (and in turn interviewed tons of people in that style) I have a lot of respect for people who study those things, but I think they are often given too much weight in tech company interviews.

I suspect that the question of what languages & technologies you should know to be a *competitive hire* has a very different answer to the question of what languages & technologies you should know to be a *good programmer*.Unfortunately, most recruitment these days focuses on what you've had experience with and in particular what languages you know.A better recruitment process would try to focus on what foundations are in place in order to judge how well a new hire would be able to pick up particular platforms.Although I'm not sure what that recruitment process should look like.

But, with that aside, my advice to someone preparing to find work as a programmer would be to make sure the foundations are in place.If they weren't put in place in your education then you need to sort that out.I have to second Josh's suggestion that learning a language that doesn't hide memory management and other low level concepts will be one of the most valuable things a programmer can do.I hardly ever have to write in C, yet, by far, it's contributed the most to my foundations.I think also that narrowly focused languages are probably the most useful in understanding different programming paradigms and teaching important concepts.Certainly not C++.Java, C# and others are good for OO because you can't stray very far and will give you good foundations in data structures.Purely functional languages are great for teaching how to think algorithmically (I suspect Scala has a bit too much clutter to be a good first-functional language though).

And, on JavaScript.I think it's going to be an increasingly important language into the future and will be helpful to know and understand (and is great fun too!).But I'm not sure it's a good language to teach you to be a great programmer.It has too much of a mix of different paradigms and ES6 and onwards is just going to make that worse; think object literals + first-class functions + prototypes + Object.create() + ES6 classes + ...--yikes!Although John Resig has some great thoughts on paring JS down for new programmers: ejohn.org