“Progamming language choice and calibre of programmer”
September 1st, 2007 at 9:16 amI read an interesting discussion with this topic on Joel’s discussion group today. Basically, the OP asked if the following is true:
The great programmers tend to regard certain languages better than others - a person proficient in Lisp, Python or Ruby is considered to be a better programmer compared to one proficient in Java, C# or VB.
While this is unpleasant to admit for some people, I believe that in its core this statement is true1. Sure, what else would I think, given that I’m such a person myself (believing that Lisp and Ruby are more powerful than Java and C#), and most people think they’re way better than average. However, I’m writing this post to defend this position.
What really makes programmers good is not which language they are proficient in, but rather whether they took the effort needed to master other, more powerful languages. Suppose Bob programs in Java for 5 years. Java is all he knows, and he’s pretty good at it. Now, his friend Alice also has 5 years of Java experience. However, in the past couple of years Alice has picked up Ruby and now writes some of her code (mainly scripts and prototypes) in it. Recently, Alice also began dabbling in Lisp after hearing that all those cool functional features of Ruby come from there. Who is the better programmer ?
Most chances are that Alice is. Because while she was happily programming in Java with Bob, she actually had the curiosity to ask herself if there’s anything better, more powerful out there. She wrote a mountain of repetitive code and felt bad with it, so she looked around and found out there are actually languages out there where these things are easier. All this while Bob was happy pushing hills of Java code.
Naturally, there is more - the mere fact that Alice knows several programming languages makes her better in some sense, given that these languages are different enough2. It’s that old and corny toolbox analogy - to be able to use the right tool for the job, you must have a lot of tools. I’ve seen good C programmers with years of experience struggling terribly when the time came to write a simple text-munging script. They usually ended up writing a 500-line long C program to do that, instead of using Perl.
However, it is not the main point. The main point is the one stated before - good, truly good programmers aren’t content with the tools they’re given. They are only while they’re still apprentices, but pretty soon they start to feel the limitations of their tools and seek better tools. This is the barrier between really good programmers and code monkeys. The really good programmers usually love what they do, they love learning about new programming techniques, love comparing languages and libraries. It doesn’t necessarily mean they still don’t write Java for their day-job, but their understanding of other languages and systems greatly enhances their skills. They resent the “it pays the bills” approach of the code monkeys who are content with whatever tool they’re given.
So yes, this is about craft, about art, about love. Only people who truly love what they do are truly good at it. And I don’t know of any truly passionate programmer who didn’t give a try to one of the more powerful programming languages, even if just to learn something new.
P.S. You should really read Paul Graham’s Beating the Averages. He is much better than me in explaining pretty much the same point.
1 I would just add the restriction: a person with several years of programming experience proficient in Lisp…, to exclude all those newbies that just recently began programming and picked Python or Ruby because they are popular and easy to use. Such people are not yet in a position to decide which programming language is better, and can’t be judged by this criterion.
2 If I know C, Pascal and Fortran I certainly have less tools in my disposal than someone who knows C, C++ and Perl.
Related posts:

September 1st, 2007 at 9:57 am
Well said.
September 1st, 2007 at 10:05 am
Everybody thinks they’re a great programmer, just like everybody thinks they’re a great driver.
However, it’s not hard to tell the difference. If a guy tells you he’s a great driver, but he’s crashed his car three times in the last five years, he’s almost certainly not that good a driver. Despite the fact that for every crash he’s got a great excuse for why it was someone else’s fault.
You’re a good programmer if:
1. You deliver software
2. The customers are pleased with the software
3. It was delivered on time or reasonably quickly
4. Other people can change the code easily
If you have to start looking for other metrics to justify why you’re a good programmer, you’re probably not a good programmer.
September 1st, 2007 at 10:33 am
Theophile’s definition sounds like an economical definition of a good programmer. What if you are just writing code to do stuff for yourself, and not for customers? What if you are programming for other purposes, like research?
September 1st, 2007 at 10:37 am
“What if you are just writing code to do stuff for yourself, and not for customers? What if you are programming for other purposes, like research?”
Are you saying that getting results don’t matter if you’re your own customer?
September 1st, 2007 at 11:56 am
After you learn Haskell, Clean or even Epigram or Coq, you will look back at Lisp and Ruby programmers like you do right now with Java et. al. programmers.
September 1st, 2007 at 12:03 pm
> After you learn Haskell, Clean or even Epigram or Coq, you will look back at Lisp and Ruby programmers like you do right now with Java et. al. programmers.
As people who talk and talk and talk about how someone else solved a fancy problem in their favorite CS-oriented language of the day, but produce unmaintainable code that never solves more than 80% of the actual problem and cannot be deployed?
September 1st, 2007 at 4:34 pm
@Theophile: “If a guy tells you he’s a great driver, but he’s crashed his car three times in the last five years, he’s almost certainly not that good a driver.”
OTOH, it could also mean he’s pushing the envelope of what his car is capable of and taking chances, perhaps exposing limitations of his car. The difference between a good driver and a bad driver, then, is what is taken away from the crashes and how his future driving changes.
The coding analogy: if I’m a Java programmer and I’m playing with runtime bytecode manipulation and classloaders I’m more than likely to have some spectacular failures in both design and execution. I might also come up with new ways to program in Java, or even language extensions like Warth et al’s “Expanders” or JAM etc.
September 1st, 2007 at 10:20 pm
Observer, the myth that CS’y functional languages can’t be used for “real” projects has long been debunked. Try googling for Jane Street.
September 2nd, 2007 at 4:00 am
On the other hand, when you have no choice in what language you use at your job, being able to do excellent work anyway is a mark of a good programmer. It’s difficult to get a job with a language you only picked up at home; generally people want experience in their particular choice (which is commonly java, .net languages or php).
I do Java but I look at other languages all the time. If I had a choice right now I’d love to work in Erlang or Scala or even Smalltalk but just getting Java jobs is a lot of work.
September 2nd, 2007 at 8:15 am
Correction. If you do not know C or C++ then you are not a real programmer. All those languages run on C++ or C frameworks many times and not understanding that is going to hurt your solutions.
September 2nd, 2007 at 9:03 am
The flaw in his arguement is that while Alice is taking the time to learn other languages, Bob is increasing his knowledge in Java. Because you know how to program in another language, doesn’t mean you are an expert in it.
While I was in college, I was more like Alice. Diving into a ton of languages, and when it finally came time to look for a job I had difficulty.
By focusing a small set of languages, then I could become more of an experience, expert programmer.
September 2nd, 2007 at 10:11 am
Regarding your original statement (Lisp, Python or Ruby > Java, C#, VB).
I have been programming for over ten years now. I mainly used procedural and OO languages, starting from basic, pascal, C, C++, and in the last 2 years, C#. I find C#’s structure and IDE (Visual Studio + Resharper) superior to all other languages I mentioned. While it’s expression power might be limited in some obscure areas (memory layouts, lack of pointers, …), I am very much pleased with it for the purpose of general software engineering. Complemented by an easy way to link programs with C++ code, it can do anything. I think C# demands less from the programmer - which is not a bad thing, even for experienced programmers.
I dabbled with LISP, Prolog and other for a very short time - just enough to complete relevant courses, and I must confess I do not understand how or where they are stronger than procedural languages. For me, the Object Oriented paradigm just works, even if I didn’t invest sufficient time to fully understand and compare the alternatives.
In any case, I think there are several other factors more important to being a good programmer than language proficiency. The first few that come to mind are:
1. Adherence to Coding and Documentation standards.
2. Don’t revinent the wheel - use existing solutions. Many fall for this.
3. Know your current programming language, and fully exploit its features and beware its pits.
4. Hate duplication - hate code duplication, documentation duplication, script duplication. Have a good eye for spotting this duplication and the courage to refactor it.
5. Don’t overdo. You can come out with a brilliant solution - to a problem that doesn’t exist, or will not exist by the time your solution is ready. Solve the current problems first, and don’t over-design.
September 2nd, 2007 at 5:16 pm
Ron, thanks for the input.
Re understanding what’s special about Lisp, I recommend reading this for a quick hands-on dip:
http://www.gigamonkeys.com/book/practical-a-simple-database.html
Shouldn’t take more than an hour - and it gives a good taste of what Lisp can do and other languages can’t.
You can grab a free, simple-to-install-and-use implementation of Lisp here:
http://clisp.cons.org/
September 2nd, 2007 at 6:02 pm
I think the first response had it right… those who take the time to investigate other ways of doing the same thing are probably just better.
Did you know that Paul Graham’s code got rewritten in Java after Yahoo took over - and for very good reasons too. You should find out why you think he’s a very good programmer before you tell everyone that he is.
Ah, LISP… the perennial wallflower of languages. It is the same mentality that makes “Flight of the Bumblebee” the song that proves that you can play guitar. Good to know, but other languages are where you do the real work.
Why? If LISP is so powerful, then why not use LISP? Because LISP is so powerful that it is a very poor language for groups of people. The code doesn’t have to be complex, but the fact that it can be complex is still a problem.
Take two completely different LISP projects and study the code for both of them. The code is completely different. Take two projects in a lesser language, and the code is far more similar.
It may be longer and less powerful, but that is the same as the way I’m using standard English in this message. I could use a far more expressive, eloquent and expurgative form of English, but it would affect your comprehension.
As the purpose of this message is to communicate with you, my English remains simplified. As the purpose of development projects is to work in groups, the language remains simplified.
So LISP remains the Bumblebee. Be content with that, for its influence shapes the lesser languages that are more useful for daily use. You wouldn’t use an artist’s brush to paint a house.
September 3rd, 2007 at 5:34 am
“As the purpose of this message is to communicate with you, my English remains simplified. As the purpose of development projects is to work in groups, the language remains simplified.”
i am flabbergasted at this - you are saying that just because stupid/dumb people are going to be working in the team, that the language(toolset) needs to be the lowest common denominator? If you are in a team where the majority cannot understand functional programming (at least in theory) then the team wont be at all good. Sure, such a team can write a business app CRUDing a table or two, but for a fairly complex system (think google maps, any decent game, or anything with complex datastructures), that team will fail miserably - not because of the language choice, but because of the people. Programming is an inherently complex task, and making it simpler (but less powerful) will just cause more noobs to start programming without knowing how to do it properly, and lower the quality of code out there.
September 3rd, 2007 at 10:06 am
Chii, that is an extremely childish way of looking at things.
Fact: Complicated projects (including, but not limited to, mapping applications, search engines, 3D engines, source control systems, OS kernels, compilers and more) have, are and will be written by teams where the majority does not comprehend functional programming.
If you refuse to acknowledge that out of some misguided perception of what the average programmer (as opposed to the ‘ultimate’ programmer) is, you’re doing yourself a disservice. I’d rather work in a team where everyone is fluent in both C# and Haskell, but since such people are extremely rare I’ll settle for competent developers that can tackle complexity in a “pure imperative” domain. Those are hard enough to find as is.
September 3rd, 2007 at 5:02 pm
I took Eli’s advice and read a short section that contains a demonstration of LISP’s abilities - the Practical database. Then I wrote the same thing in C#. The result turned out larger than an average comment, so I posted it on my blog instead.
September 4th, 2007 at 2:34 am
Yeah, Paul Graham declared all of this years ago. Try to be a little more original.
Back in the real world we have constraints that we have to deal with. Please go tell John Carmack or Tim Sweeny that they’re dumbasses for using C/C++ instead of CL, Ruby, Python…whatever language the blogosphere has declared cool.
September 4th, 2007 at 10:46 am
But many HRs don’t know this in china!!
September 5th, 2007 at 11:42 pm
Just got this today.
September 7th, 2007 at 5:16 am
I know.I’M Chinese!