Help me pick a new programming language to learn
July 24, 2011 9:21 AM   Subscribe

I'm a developer at a C++ shop right now, and would like to expand my skills in order to be more versatile and marketable. What's the next programming language I should learn? (I know some assembly, and very basic HTML)
posted by Stephanie Duy to Technology (30 answers total) 22 users marked this as a favorite
 
tSQL. It will VASTLY expand your marketability, and personally, I found the mental exercise of learning to think in a set-based language sharpened my skills in other areas as well.
posted by pla at 9:23 AM on July 24, 2011


Oh, I also forgot to mention: I've been working with Windows for the past two years, but am currently working on porting stuff over to Linux (Ubuntu).

@pla: Looking at tSQL (Transact SQL?), it looks like Microsoft's proprietary extension to SQL, right? Would it be better to work with MySQL? What applications would I be looking to use this in?
posted by Stephanie Duy at 9:31 AM on July 24, 2011


Companies are still having a surprisingly hard time hiring iOS (Objective-C) and Rails (Ruby) developers right now.
posted by ignignokt at 9:33 AM on July 24, 2011


Python.
posted by elektrotechnicus at 9:34 AM on July 24, 2011


What types of projects do you want to work on?
posted by sanko at 9:38 AM on July 24, 2011


Languages are pretty easy to grasp once you've got one down. At least those of similar heritage.

The bigger issue is knowing the APIs that go along with the type of software you're writing. So, you can pick up Java easily, but are you going to be writing J2EE, Spring, desktop SWT apps, Android apps? (OK, Android doesn't run Java(TM), but....)

I'd think more in terms of what kind of software interests you, and then look in that space for relevant technologies. Do you think mobile is cool? Learn Java+Android or ObjC+iOS. Prefer server-side, cool Web3.0 kinda stuff? Rails is probably where it's at. Like bare-metal stuff? Learn beef up ASM on CPU of choice.

So, what interests you?
posted by amoeba syndrome at 9:42 AM on July 24, 2011 [1 favorite]


@sanko: I would prefer to work in a Unix/Linux environment. Aside from that, I would assume that with whatever language I try to learn, I would have to work on some open-source projects before I can get paying work. Did that answer your question?
posted by Stephanie Duy at 9:43 AM on July 24, 2011


@amoeba syndrome: Great answer! I guess that's what I'm trying to suss out with this question: what languages are of a similar heritage as C++? (I know of Java, but that's about it) I went to school for EE + CE, so I didn't get exposed to as many different languages as I would like. Rails and Java/Objective C are sounding very interesting to me, because of the mobile/web aspect.
posted by Stephanie Duy at 9:47 AM on July 24, 2011


With C++ background, you'll easily pick up Java, ObjC, Ruby, PHP as languages. ObjC is a bit of an odd-ball, IMO, but not fundamentally different. The APIs on all those are large, but the fundamental ones are pretty close.

If it's mobile/web development you're after, Ruby/Rails is a good mix. Java or PHP may be safer bets for employment, but again, depends on what you want to do, where you are, what your risk tolerance is (startup vs J2EE nobody-got-fired-for-buying-IBM types).

I tend to think being a generalist is better, so I know a bit of a lot of languages/APIs/models. But YMMV.
posted by amoeba syndrome at 9:56 AM on July 24, 2011


Looking at tSQL (Transact SQL?), it looks like Microsoft's proprietary extension to SQL, right? Would it be better to work with MySQL? What applications would I be looking to use this in?

Since you mentioned you'd prefer to work in a unixy environment, MySQL might make a better choice for you (the core language itself doesn't differ all that much). That said, as an "employable" skill, you'll at least want some familiarity with MS's flavor (and probably the even-more-evil-than MS option, Oracle, as well).

As for where you'll use it - Personally, I do a lot of integrations between accounting and inventory/POS systems, and couldn't get by without it. Also, modern web coding has come a loooong way from the days of simple HTML and CGI, and any serious project will consist of almost no static content, pulling almost everything from a DB on the backend. Even in the seemingly boring task of report writing (in the Crystal or SSRS sense, not the five-paragraph-expository-essay sense), a whole new world of power opens to you when you can efficiently pull in your numbers. Once you know it, you'll seriously wonder how you ever got by without it. :)

Now, the real problem I had learning it, which you may have meant by your question - Where do you use it as an individual just trying to find a way to incorporate it into your skillset - That gets a bit trickier and depends what you like to code for fun. For example, I enjoy hiking, and found an excuse to use SQL extensively in playing with the Google Maps API.
posted by pla at 10:00 AM on July 24, 2011


seconding sql for usefulness; any db platform will do (i want to try postgres sometime..)

javascript is not just for web pages anymore, node.js rocks, compiles under linux with 1 dependency, and is really just C syntax; you'll pick it up in an afternoon. And then you can use it to wrap your super optimized C code and serve it to the network ( http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=nodejs+modules+in+C )

For a more radically different programming paradigm try a functional language. (erlang maybe? seems like it's a favorite among deep pockets)
posted by 3mendo at 10:03 AM on July 24, 2011


I'm going to go against the grain and say you want to stay away from a job that's going to stress T-SQL. I was surprised to see the number of job openings that request T-SQL knowledge, only to be shocked to find the amount of complex systems people who didn't know any better built around SQL scripts. Really, things that would have been okay with a proper ORM were built in these horrific, un-testable scripts. Microsoft created a monster with T-SQL.

I would definitely familiarize yourself with how web development works, since you're coming from what sounds like a pure back-end development job. Ruby is definitely popular, and should come very easy with someone of your background.

I would also look into server-side javascript frameworks like node.js, along with non-SQL databases. Look at MongoDb, CouchDb, etc. Unless a client absolutely demands we use SQL, we'll use a document database. The cuts in development time are pretty dramatic when you don't have to spend time dicking around with the database.
posted by geoff. at 10:06 AM on July 24, 2011


Seconding MySQL. While tSQL might be better for immediate employment, learning mySQL first might make it easier to learn all of the other flavors in the future (ie, more versatility).

PHP should be very easy to learn, given your background (possibly even easier than Rails). It'll complement any SQL knowledge you acquire.
posted by graphnerd at 10:19 AM on July 24, 2011


I don't think it's very marketable at the moment, but I have a suspicion that Go is going to take the place of a lot of C/C++ code in use today.

I also wouldn't argue that tSQL or MySql are necessarily more versatile than the other.

And, yes. JavaScript is indeed worth learning.
posted by schmod at 10:21 AM on July 24, 2011 [1 favorite]


geoff : I was surprised to see the number of job openings that request T-SQL knowledge, only to be shocked to find the amount of complex systems people who didn't know any better built around SQL scripts.

Not disagreeing (I complain about this on an almost daily basis, in fact), but you've overlooked the obvious consequence of that - It means companies desperately need people to clean up the mess. :D

And really, I wouldn't call it "hard" work (I come from a firmware background, to put that word in context)... Not at all glamorous, but merely time-consuming if you know your stuff.


I'll also second you on JavaScript. Even in-browser, it has evolved far, far beyond a cute way to decorate web pages (A few weeks ago, I came across a Linux distro that actually runs natively in the browser's JS! Blew my mind, just a bit).
posted by pla at 10:23 AM on July 24, 2011


Completely agree with geoff.

If you want marketability and future options, don't bother with things like tSQL.

My recommendation for the next thing to learn: JavaScript. (Even Microsoft is going to feature it heavily in their next OS update.)
posted by StrawberryPie at 10:34 AM on July 24, 2011


Knowing C++, you could probably pick up the essentials of any object-oriented language in a couple of weeks. So why not learn Obj-C AND Java AND Ruby? Then you can pick frameworks to learn depending on what your interests are.

Also, it might be worth learning Scheme or Lisp, just because it's so alien and will expand your mind. The semantics of these languages also are big parts of Ruby and Python, so it would have some practical application.
posted by vogon_poet at 10:52 AM on July 24, 2011


Just some caveats. Objective C would be easy for you. But you need to learn Cocoa to take advantage of it. That would be a much bigger job.
(2) You said you had limited HTML. A number of people above are suggesting Javascript for web work. I would suggest that you need good HTML and CSS skills first. Then Javascript and perhaps jQuery.
(3) Amoeba is making a point about directions: you can go for mobile development or web development. I agree with that although you can leverage web knowledge and Javascript with something like Phonegap to create a mobile app. O'Reilly has books on how to do this for the iOS platform and the Android platforms. (e.g. Building iPhone Apps with HTML, CSS, and JavaScript).
(4) Writing as a very experienced and old assembler programmer, I think you would be wasting your time here.
posted by PickeringPete at 11:04 AM on July 24, 2011


hrmm,

PostgreSQL because it rocks and aims to be standards compliant. You can then go and learn the intricacies and oddities of whichever other SQL variant your employer uses.

R because you'll eventually want to mangle numbers in a meaningful manner and being able to give PHBs a quick pretty picture is a good skill.

Javascript is good, always useful in the browser and is the hip thing on the server. A good prototype based object system is a good counter point to C++.

And it's close to Lua which is on its way to becoming the default application scripting engine because it's small and fast and simple (vs Scheme-ish solutions).

PHP... enough to fix a few broken things and cringe at the awfulness that passes for PHP programming (esp. with SQL, practically the birthplace of injection attacks). It began life as a dumbed down Perl for Home Pages and then aquired layers and layers of cruft in a haphazard way. Avoid it if you can.

Bash if you're going to develop on *nix platforms learn Bash for day to day workflow facilitation, I mean c'mon it's the shell, you need to know it well enough to poke around various system scripts and such.

And Perl for when Bash isn't enough. It's the swiss army knife of *nix systems. Others would say Python or Ruby, but neither is so darn handy. Quite a few Perl folks went to Ruby for Rails stuff and liked it as Perl with a nicer OO and some warts removed. (T-10 before some clueless idi0t rags on Perl).

Erlang is quite cool, but I don't know if it would get you a job unless you knew it well, great fault-tolerance, great distributability, (CouchDB is written in it), its mnesia database was distributed NoSQL before NoSQL was cool. It also has some rather neat web frameworks...

Assembly, not so much. It's too dependent on the architecture (and the parts that aren't are so much the same basic operations that most assemblers can switch syntax dialects with a command line flag).

So I'd say SQL (will probably be hidden by your ORM system anyway), Javascript, Perl, R, Bash (you'll pick it up out of necessity) are the default necessities
posted by zengargoyle at 11:12 AM on July 24, 2011


I should also add that a ninja-like proficiency in Regular Expressions is virtually always a good skill for a programmer to have. Especially if you're reaching into databases and data-driven applications (which is what virtually everybody here is suggesting).
posted by schmod at 11:17 AM on July 24, 2011


If you want to be more marketable, find out what technologies are hot in your area. Look on online job sites, or even set up an information interview with a recruiter in your area (if you position it right, they shouldn't just sell you on what they're currently trying to fill).

If you want to be a better programmer, take everything that's been mentioned here (and then some) and spend some time learning it. Check out the mind-altering coolness of Erlang, the relative simplicity of Lua, memory mgmt in ObjC, enough PHP to know how to write good PHP, the neat use of symbols in Ruby/Rails. You won't get stuff to add to your resume, probably, but that will improve all the code that you write in any language.
posted by amoeba syndrome at 12:00 PM on July 24, 2011


Broadening what @schmod says, personally, I'd focus on and get really good at fundamentals. Do become a regex ninja, but become a sorting and searching ninja, learn all the tree representations and when and why to use them, know memory management and garbage collection (even if your language claims to do it all for you), master numerical methods, learn how compilers work (even if you're using an interpreter), understand deeply complexity and optimization, know enough about computer architecture to understand the efficiency tradeoffs any language is making to map to the underlying hardware.

And knowing SQL is very, very useful. Personally, I'd start with one of the more traditional SQL systems, like Postgress or DB2 (both free to learn), especially if you're interested in databases for more than web applications.
posted by kjs3 at 1:08 PM on July 24, 2011


Find a problem you want to solve and learn Objective-C and either Perl or Ruby. You can use the former to write iOS apps, and the latter skill in informatics and web app development.
posted by Blazecock Pileon at 1:30 PM on July 24, 2011


Check out the programming language popularity index.
posted by Terheyden at 2:02 PM on July 24, 2011 [1 favorite]


PHP is very much like C, so it'd be easier for you, and it's a great little language. It's the easiest server-side language for the web, with Javascript as its complement on the client side.
posted by minx at 2:28 PM on July 24, 2011


I'm a polyglot as far a programming languages go, so I'll tell you this: they're all the same. Seriously.

So this is me stepping in to say that aside from the usual Turing completeness equivalency that people throw out, there are not a whole lot of widely used languages that stand out. So, if you know C, then you're going to find it easy to pick up C++, Java, C#, Ruby, Javascript, VB and Python, because aside from niggly little syntactic variances, they're all the same. Yes, there are going to be people who say, "Dude - C# has closures" or "WTF - C doesn't have an object system!" and I say so what. I've done them all and some languages make you do more work to get what you want done, but they're nothing significantly different.

I can also go on with functional and functionalish languages - they're another flavor, but to me they don't differ that much from each other there. Sure, I wish F# had macros or that Scheme had decent static typing, but it's still pretty much the same language.

I've found that the people I've hired have been selected not so much for their knowledge of a particular language but their sense of "I get how it all hangs together" and drive to learn.

So you want to learn? Any suggestion is good. Any.

If you have never used a functional language, look at Haskell, F# (under Mono in your case), Erlang, Scala etc. These are considered good medicine as writing in them will also help your C++.

Ruby is nifty. It's interesting (and appalling) to be able to add methods to any other class. If you learn that well, do some contrast with extension methods in C#, which is some pretty sweet syntactic sugar in contrast.

If you haven't used a GC-based language before, give one a ride, they're freeing, but if you're not careful, the style will creep back into your C++ and you'll be writing memory leaks into your code before you know it. You'll also find that when you're working with Java that you'll be missing RAII a great deal and you'll look at the finalizer and think, "ah-ha! there's my RAII" and then you'll be sorely embarrassed when your finalizer gets called when then java VM gets torn down at the end of app life cycle (if even then).

I'd be more inclined to say that instead of writing in a language, you should consider writing an implementation of a language.
posted by plinth at 5:20 PM on July 24, 2011


I always find it curious when C++ programmers want to learn another language to become more marketable. If you are truly a fluent C++ programmer, you know basically the hardest language out there. I would never consider "only" knowing C++ fluently to be a negative in a candidate, even if we were looking to hire people to write in a different language.

To that end, might I suggest that perhaps you learn other "platforms", as it were, instead of another language? SQL-type stuff as suggested above is one angle, definitely. NoSQL type stuff is another angle you could pursue (MongoDb, Cassandra, Couch, HBase, etc). The hadoop platform and all its complex glory. Node.js. Mobile application development, as mentioned above, although that's less interesting to me as someone hiring developers into an enterprise-type company.

It's not about knowing a language, but I am much more impressed by people that are keeping up on at least one of the major trends in technology from the platform level, and right now there are a ton of interesting ones you could play with. If you aren't familiar with any of these, you should really pick a tech news aggregator and start reading up.
posted by ch1x0r at 6:04 PM on July 24, 2011 [1 favorite]


I suggest that you learn a functional programming language. I have only been programming for a few years, but learning Scheme was like a revelation after my experience with C++ and similar languages.

It probably doesn't matter much which functional language you learn. They are all pretty niche compared to C++. But languages like Python or Ruby fall somewhere in between Scheme and C++, so learning them will not be as mind-expanding.

If you do choose to learn Scheme, you can use the classic text Structure and Interpretation of Computer Programs and the lecture videos from UC Berkeley.
posted by scose at 7:36 PM on July 24, 2011


@ch1x0r: I understand what you mean (and have heard the "C++ is the hardest language to learn" maxim from many other people) , but I feel as though my lack of experience with other languages (Java, for one) hurt me in my initial job search out of university. I've mostly worked with embedded systems C in university, so this post is my first step in expanding my horizons in coding :)

Thank you for all the wonderful advice, folks! I knew I could count on metafilter!
posted by Stephanie Duy at 9:23 PM on July 24, 2011


A slightly different take on this would be to ask about how good a c++ developer you are. I'd argue that, in a lot of cases, you'd be better off with good knowledge of one tool set, rather than middling knowledge of a broader number. This is probably more true if you're toward the start of your career.

That's not to say exposure to other technologies isn't a good thing, but the less like c++ the technology is, the less likely it is to be marketable (programming language use is very skewed toward fairly mainstream imperative languages that aren't terribly distinct).

Maybe a better investment of your time would be to try to expand the skills you use at work. Could you focus on things like unit testing, or some aspect of c++ you haven't mastered (metaprogramming? boost/standard libraries?) Does your work offer developer training in something that you'd find interesting?
posted by nml at 11:11 PM on July 24, 2011


« Older Am I eating me?   |   I wanna be friends with my brother Newer »
This thread is closed to new comments.