Sunday, February 20, 2011

Selecting a new programming language to learn.

I have been itching to learn a new language, but being a Java freak, I always end up convincing myself to spend the time and effort discovering, investigating or playing with something in the Java open source stable, Spring, Hadoop, Joda Time, Hibernate, Maven, Hazelcast, EhCache etc etc. Developing in Java these days is almost purely about knowing and wiring together frameworks, which is both a good and a bad thing. (as well as a topic for another day).

Now to get myself to not redirect the "new language" energy into Y.A.F (yet another framework) I decided to give the languages out there a proper look and see which would be the best fit and most beneficial to my work, marketability and just general 'IT Zen'.

So what do I require from a language:
IDE... my number 1 thing is an IDE, if there isn't a decent IDE for a language it is frankly not worth the time and effort. I don't see myself as a "scientist" where I feel the need to cause myself pain and inconvenience to be "pure". I want a comfortable productive working environment, and VI or Notepad with a command line utility ain't it.

Established... Every couple years someone somewhere tries to define some new language, and most of those die in obscurity for example brainf*** or anything listed on Esolang.

Popular / In Demand... As with most things, popularity is good, it means:
open source community, support and most importantly jobs. If you ever want to see the current popularity of a language Tiobe is the site to visit.

So who are the contenders out there?
Based on Feb 2011 Tiobe index:
Java is still the no.1 most popular, it has awesome IDEs and it's been around for just more than 15 years (January 23, 1996), but thankfully I know Java reasonably well :)... so moving right along... To narrow down the list quickly, I won't look at any languages that are losing popularity, for obvious reasons, so from the top 20 on the Tiobe list that excludes: C, C++, PHP, VB, JS, Perl, Ruby, Delphi, Go.
(C, C++, PHP, VB, JS, Perl, Ruby, Delphi, Go.)

Which leaves behind:
Python, C#, Objective-C, Lisp, NXT-G, Ada, Pascal, Lua, RPG

Now there is a line between established and old, I am going to make a call that could offend some people and say Pascal and RPG are just old. (Pascal, RPG)

Ada, don't know much about it, after reading the ADA overview, it seems okay, going to exclude it based on popularity. (Ada)

Lua, from a quick read it is a scripting language. (Lua)

NXT-G has something to do with lego or some robotics, not very mainstream. (NXT-G)

Lisp again like Ada, at first glace seems fine, just not popular enough. (Lisp)

Then there are the "New, built on other platforms" functional languages: Scala, F#, Clojure. Although very temping being on the bleeding edge, it's not all that profitable or marketable yet. I'll give them some time to standardize, settle down and see if they are widely adopted. They do appeal greatly to my inner geek, so will always be keeping an eye on them.

So this leaves me with:
Python, C#, Objective-C, (and Java).

Straight away based on the above list we can Tick: IDE, Established and Popular / In demand. We all know they have decent IDEs: Eclipse, XCode, Visual Studio, (IntelliJ and Netbeans). They have also been around and are well known.

Now looking at number of jobs:
Found a site (Simply hired) with a graph displays the percentage of jobs with your search terms anywhere in the job listing. Since June 2009, the following has occurred:

Python jobs increased 72%
C# jobs increased 77%
Objective-c jobs increased 268%
Java jobs increased 76%



With the recent boom of iPads and iPhones the Objective-C percentage is not all that surprising. I do have a problem with Apple, Objective-C and XCode and that problem is you need a Mac to run it. Once you start down that road you end up having to change everything to Apple, and I am not ready to do that. So for now I am going to drop Objective-C out of the running. Although if I ever do buy into the whole Apple thing, this will got back to the list.

Leaving me with Python and C#, looking at their salaries compared with Java:
(Data from Payscale).
US Data
Java
PayScale - Java Skill Salary, Average Salaries by Years Experience


Python
PayScale - Python Skill Salary, Average Salaries by Years Experience


C#
PayScale - C# Skill Salary, Average Salaries by Years Experience



South Africa Data

Java
PayScale - Java Skill Salary, Average Salaries by Years Experience


Python
PayScale - Python Skill Salary, Average Salaries by Years Experience


C#
PayScale - C# Skill Salary, Average Salaries by Years Experience


Based on the US data, I would have gone with Python, it's not as popular as C# but the pay is slightly better, I would also get to keep using Eclipse (PyDev) and Spring, but as soon as I looked at the South African data, I realized something, Python is really not big here. I manually went searching for Python positions advertised.. and found a grand total of 2 and the salaries were not good.

(Python)

Leaving C# as the last language standing.

It's got Visual Studio (even a free version Visual Studio Express), It has proven itself over the last couple years, it's out innovating Java at the moment, there's a ton of jobs, a whole range of certifications and the salaries have closed the gap on Java.
Seems quite a logical choice to me.

To top it off, I have also used C# many years back, so it won't not entirely new. Most of the successful Java open source projects (Spring, Hibernate etc etc) have been ported so all that knowledge is reusable, which also counted a little in my decision. Now I just need to stop working 12-14 hours a day, and I can focus on getting back to my Microsoft roots with little C# as a Java developer. Hopefully a couple months after that I can go through this process again, looking at Python, Objective-C, the mobile platforms (iOS, Android, windows) or maybe rather a concept change to functional with the likes of Clojure or Scala.

25 comments:

  1. Hi, Yes I didn't 'cause:
    1. It's not in the top 20 of the Tiobe index, which I used as my basis.
    2. I know it well enough to get it to do what I want.
    3. I don't enjoy it enough to want to do it more.

    ReplyDelete
  2. I really liked you article right up to the end, I just don't like Microsoft very much, however I think that I will use your article to help me choose my next language. So I will go with python :) cheers

    ReplyDelete
  3. Thanks, to be honest, I think Python is a very good choice, I was leaning to Python myself, the South African job market data i looked at forced me to C#.

    ReplyDelete
  4. I perfectly understand your view and how you made your choices. But i have some comments :

    - Salary are somewhat equivalent. This shouldn't be a real factor.
    - Learning C# when you know JAVA... Well it is about learning the framework/platform as the languages are nearly the same. Maybe it will give you a job (think about certifications here). But you as a developper will not learn much.

    I think that learning Python, Scala or Clojure (in fact clojure is a lisp) would make you see other ways of doing things, and will make you a better developper overall.

    But really C# is just a matter of frameworks compared to JAVA.

    As you see, I have not the same interrest as you : you research employability, i research knowledge and experience.

    ReplyDelete
  5. "Learning C# when you know JAVA... Well it is about learning the framework/platform as the languages are nearly the same. Maybe it will give you a job (think about certifications here). But you as a developper will not learn much." - Foudres

    I don't completely disagree with this on a syntax level, but often as you dig into the behavior below the surface you find that what seem to be very small differences are actually rather large. So on the surface, no not much difference, but under the hood there could be nasty side effects if you aren't careful. With that said, though, both Python and C# have interested me lately. I found this article to be very similar to my own thinking and all around a good Monday morning read, thank you.

    ReplyDelete
  6. Hi Foudres,
    I do actually agree with you, I probably won't learn much as a developer, but on the other hand it will not take me very long to be quite proficient and certified in the .Net environment. After which and I am pretty sure the next language will be either Python, Objective-C or Clojure. (as I mention they "appeal greatly to my inner geek", Clojure being the front runner).

    I am not only interested in employability, although it is a big factor, I always do try balance with my need for learning & experience with it as well.

    ReplyDelete
  7. I almost stopped reading after "IDE... my number 1 thing is an IDE, if there isn't a decent IDE for a language it is frankly not worth the time and effort." However, I forced myself to keep reading.

    I have to ask, why are you even a programmer? Money? And basing your whole language to learn decision on Tiobe and salary?

    If a programmer doesn't have a basic sense of curiosity he is frankly not worth the time and effort to interview, let alone hire.

    ReplyDelete
  8. Jeez, why the hostility?. All because I look at the financial side of my "profession" as a part of my criteria? Do you for work free?

    Frankly I believe that my curiosity is just fine with my learning, reading, reviewing, constant investigation, actually getting involved in open source projects and sharing this information via this blog all while working some nasty hours.

    ReplyDelete
  9. First I'd like to commend your writing style. I like the way you drew a line over languages you did not consider anymore ;)

    I am also a Java Developer who recently took an interest in Python.

    I don't understand one thing, if you didn't like objective-c because of Apple, I don't understand why you like C#.

    For me, Apple and Microsoft are like the same banana:

    1. expensive tools e.g IDEs which you like
    2. expensive operating system

    I am not so sure, though, about how Microsoft manages their ecosystem. Are they like Apple in that "you end up having to change everything to [them]"?

    ReplyDelete
  10. Thanks Jeune,
    Well the main thing is I am already in the Microsoft 'ecosystem', I have never been a big fan of Linux in general. btw... Visual Studio Express is free.

    I did mention that if I do buy into the Apple world I would definitely look a Objective-C. It's only a matter of time, I already have an iPod, my next phone in about a month will be a iPhone... then it's all down hill from there :)

    ReplyDelete
  11. You should consider Scala and/or JRuby.

    ReplyDelete
  12. What ever you do please really learn the language and use it properly. How many times do I see someone port C# code to Java and leave method names starting with an uppercase character. Code in the language, use the language syntax, standards and power. Don't make it easy to spot you as a Java person attempting to code in C#, look like a C# programmer.

    Coming from Java you will find C# rather familiar and comfortable. There are new things to learn such as "using" when you are opening files so they auto close and a number of other fun things. There are many things I wish Java had that C# has and many things I am surprised the C# team did not learn from Java.

    I find VS studio to be a bit lacking compared to Eclipse and IntelliJ. I enjoy the dialog editor when you are only using one language but it does not work as well when you internationalize. Some of the code refactoring and other quick keystrokes are missing. It is very functional but just a little behind Eclipse for the things I use often. The free Express version is very nice and should get you very deep into any of the .NET languages.

    Pick a project and enjoy yourself.

    ReplyDelete
  13. You should have started your article with your motivation of wanting to learn a new language.

    If you want to land another job I guess C# is a fine choice, but you have to realize that there will be a lot of competition out there (people who already know the language AND the framework).

    If you want to learn for the fun of it, or to better yourself as a programmer, the choice is very poor. C# will not teach you that much over what you already know. You're just duplicating your skill set. A more different (functional or stack-based) language would have been much better, *even* if they're not as popular as C#.

    P.S. You disqualified Lua for being a scripting language but kept Python? What's wrong with scripting languages anyway?

    ReplyDelete
  14. "You should have started your article with your motivation of wanting to learn a new language."

    I thought I did to be honest. :)
    "I have been itching to learn a new language"

    Yeah, I am not that interested in finding a new job, I am quite happily employed and my current experience is in Java anyways.

    I do disagree with "You're just duplicating your skill set", the world of JEE and Microsoft are very different... yeah C# and Java share some syntax, and there are some ported frameworks, but the environments and essentially the architectures are quite different, WCF, ASP.net, ADO.Net and most importantly for me Azure, (Microsoft's cloud platform), something I haven't really looked at in the Java environment and it will be useful across both.

    I do agree, I'll learn a lot from the change to a functional language. There is a very good chance that within the next year, I would have had my fill on Microsoft and I'll be back hear picking something else, and either Clojure or Scala are probably going to be very good contenders

    ReplyDelete
  15. Hello,
    I think such languages as C#, C++ and Objective-C are bad choices for Java developer. You should try language with totally different paradigm: E.g. 1) Ruby/Python or 2) Common Lisp/Clojure. It will give you a chance to think a little bit from another perspective. And of course you should USE the selected language to get some mastery. In other case it will be the waste of your time.

    ReplyDelete
  16. You show median salaries by experience, but the deviation around that median is going to be large. I can't help wondering if developers who worked strictly 9-5 and targeted only languages that tiobe said were more popular aren't also the ones more likely to be earning below the median.

    As with Jonathan Livingston Seagull, perhaps the tastiest food comes from learning to fly better, instead of figuring how to scrabble amongst scraps on the beach more effectively.

    Follow your heart, go with Clojure. For good measure, try Scala and Haskell too - they'll make you a better programmer.

    ReplyDelete
  17. "There is a very good chance that within the next year, I would have had my fill on Microsoft and I'll be back hear picking something else"

    You could learn F#. It's mostly functional AND it's .NET. :D

    ReplyDelete
  18. Groovy is another programming language to learn as a java developer for productivity although may not be for money. Of course it runs on JVM but then you will get the good taste of a dynamic language.

    ReplyDelete
  19. Brian, did you exclude all the JVM-based languages for any particular reason? By learning one of these, you get to learn something that you can actually use in your Java 'day job', and as a nice bonus you learn a whole new development paradigm as most of them are dynamic.

    My vote is with Indra on this one. Groovy is an easy and truly useful language to any Java developer. In fact, most Java is also valid Groovy. The language is so powerful though that you won't be sticking to Java much. Best of all, you can learn to use Groovy by learning Grails, so you get to learn YAF in the process. And deep in the bowels of Grails lurk Hibernate and Spring, so you get a nice mix of stuff you know and stuff you don't. And then it also offers dynamic typing, closures, meta classes... there's plenty to get stuck into.

    ReplyDelete
  20. Well the reason would be I used the Tiobe top 20 as a starting point, and Groovy is down at 49 and Scala + Clojure are at 50+ :)

    To quote you: "there's plenty to get stuck into." That is the awesome thing about what we do, that is also the reason I picked a process to choose the next thing I want to look at. It may be flawed, but I can't think of any other processes that wouldn't be. There is unfortunately more out there than we will ever be able to.

    Right after my .Net session, I'll be giving, Dynamic / Functional languages a look, and taking the one that is most established with best IDE.

    And finally..
    I do also get the "nice mix of stuff you know and stuff you don't." in .Net as well.

    ReplyDelete
  21. Before selecting any language read Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages by Bruce A. Tate. Read its review at http://architecture-soa-bpm-eai.blogspot.com/2011/07/book-review-seven-languages-in-seven.html

    ReplyDelete
  22. Lua, despite being a scripting language, is blindingly fast, and interfaces easily with any other language via bindings. Don't dismiss it so easily - look at Zed Shaw's work on Tir, which uses Lua as the dev language and glue between other systems.

    http://tir.mongrel2.org/

    ReplyDelete
  23. The programming languages is collection of different software or application. Language like C,C++,JAVA,.NEt all are having some feature which increased there importance.Logic is very centennial for any language. .

    ReplyDelete
  24. Thanks for the great info! I'm trying to watch what I ingest as my body attempts to properly digest it, then I learn that I'm being bamboozled the whole damn time!

    ReplyDelete

Popular Posts

Followers