I’ve set upon the idea of picking up a new skill this year. Over the past couple of years I’ve let my Ruby on Rails skills atrophy as I haven’t been working on any Rails applications professionally, and the Rails world changes too quickly to keep up with if you aren’t immersed in it every day. Instead I’ve been using a lot of Java, PHP, HTML, CSS, and SQL, with a dash of client-side JavaScript when needed. In 2011, it’s time to pick up something new or take a new look at something old. Here are the options I considered.
Ruby on Rails is something I already know, or at least knew, and I’m sure I could pick it back up quickly. However, I still don’t have a good Ruby on Rails project on the horizon, and so it would be just as much a pain to keep as it has been. I wouldn’t mind having a new Rails project to work on, but until one comes along, I’m going to leave it alone. I would consider working on my Ruby skills, but it’s hard to use Ruby for general purpose scripts at work because our servers all run Red Hat Enterprise Linux, which uses some old version of Ruby and is apparently impossible to upgrade. Ruby on Rails, I love you, but it’s a pass for 2011.
I am intrigued by big data projects. I’d love to dig into Hadoop or other tools that can be used to manipulate large data sets, but at the same time, I already work with some fairly big data sets at work and find that I can mine the data out of them that I need with SQL. In other words, while this area intrigues me, I don’t have any interesting problems to solve right now. Without that, it becomes tough to get motivated to really dig in and learn this stuff.
Another option is to learn a new (to me) programming language, like Clojure or Scala. Doing so would be great in terms of mental stimulation, but probably less great in terms of practical application. We’re not going to start using either of them at work this year, so I’d probably spend months learning one of them and then forget nearly everything I’d learned before I ever got to turn back to them for practical reasons.
Android or iOS are other options. Mobile development is huge right now, and I have a lot of ideas for apps I’d like to build. I could probably pick up Android development fairly easily since I already know Java. The only reason not to do it is that I am not a great user interface designer, and the best mobile apps are triumphs of interface design. I certainly have time to become a solid mobile developer, but without someone else’s design to implement, I think I’d just be unsatisfied with the results of my work. I may still try to pick up some mobile development skills, but they’re not going to be my primary focus this year.
The choice I settled on is JavaScript and Node.js. I already know JavaScript, but I wouldn’t consider myself a strong JavaScript programmer. I can generally solve the problems I’m asked to solve in JavaScript, but I find myself using a lot of libraries that there’s no way I could write on my own, and it’s easy to get lost in complex scripts. Not only is Node.js interesting in its own right, but learning about it gives a good chance to learn pure JavaScript as opposed to JavaScript simply as a way to manipulate Web pages. I’ve said before that HTML, CSS, JavaScript, and SQL are the most transferrable skills for Web developers. JavaScript is the weakest of those skills for me, and I need to get better at it. That’s the plan for 2011.
January 8, 2011 at 4:22 pm
I think you are right on about the transferable skills in web design. Everything moves so fast it seems like you only ever get to use a particular tech for a couple of projects before it has become obselete!
I’ve been learning Haskell in my spare time recently and I am frustrated with it for the reasons you laid out: I am never going to use it at work! I do think it is a useful exercise though, just to think about programming in a different way.
I was thinking last week about what to put my effort into this year, and I did consider trying to write an app using Google App Engine, Azure, or Amazon cloud services. It would be good to have experience of structuring an application for those architectures. However, I think cloud systems are one area which is going to evolve quicker than probably any other! Have you considered this?
I’m just starting a new job doing cross platform mobile development so I think that should be enough of a learning curve for me for the start of the year. At the end of the day, the only real way to learn something is to try and achieve something for real.
January 8, 2011 at 4:38 pm
Excellent choice. You should also consider learning some CoffeeScript alongside ‘plain’ Javascript — makes you realize that conceptually if not syntactically, Javascript is actually a pretty elegant and powerful language.
For me, I want to spend a couple of weeks in 2011 on machine learning and NLP, and if for some absurd reason I have too much time on my hands, I might take a stab at either Erlang or Scala as well. Though with regards to the latter two, as you mention, it’s difficult keeping yourself motivated without a real project in mind.
January 8, 2011 at 5:58 pm
Learning javascript is a great idea and coupled with node.js, it’s twice as gratifying. The thought of controlling your application with one language on both the client and the server, and possibly without creating two versions of the scripts that construct the markup, is very exciting.
Looking forward to reading about your experience.
January 8, 2011 at 6:09 pm
Rafe: Along with Node.js within your “home domain” of software, have you considered deep diving into a different domain, e.g. evolutionary biology? A pattern I’ve heard from some people whom I respect very much is that innovation emerges from knowledge in different domains. So over the past couple of years I try to spend as much or more time deep diving into non-software domains as I spend keeping up with new ideas in software.
January 8, 2011 at 6:10 pm
One clarification to the comment above.
innovation emerges from knowledge in different domains -> innovation emerges from knowledge in different domains and the ability to cross correlate ideas and find inspiration from ideas in the other domains.
January 8, 2011 at 6:59 pm
Good choice. I was recently asked what languages (besides my mainstay, Python) I was interested in learning more about, and two things came to mind immediately: Clojure and Javascript.
January 8, 2011 at 11:13 pm
Funny, I came to pretty much the exact same conclusion, having considered (and rejected) the other options you mentioned (we, too, are on RHEL and w/ a heavy bias towards PHP). What I like about Node.js is that you don’t just learn the specific technology, but other fundamental technologies along w/ it (I/O, TCP/IP, HTTP, RESTful design, etc.). What has been the most pleasant surprise is how quick and easy it is to get started (my first exercise was a couple of Node instances that jointly counted to 100 across the network — each simply incrementing the POSTed data by one and POSTing the result to the other).
While Hadoop looks interesting, I ran into the fact that use cases requiring that sort of processing are not really that common (for me, certainly, and for others I suspect as well). I do think there’s plenty of Data Science to be done w/ more manageable size data sets and for that I have set out to learn more about the R language and data visualization techniques. Conveniently, the Node.js work could potentially fit in nicely what that work.
January 9, 2011 at 7:42 am
http://www.intertwingly.net/blog/2011/01/07/First-Impressions-node-js
January 9, 2011 at 12:35 pm
We’re in the same RHEL boat and we run Ruby Enterprise Edition in a non-root area and it works. Of course, it means we have to manually update ruby, but it’s a small price to pay.
http://www.rubyenterpriseedition.com/