I Am A Better Programmer Than You

Now that I have your blood boiling, the real point of the post is wondering how do you compare the skills and abilities of programmers? Whether they work with you, for you, or are prospective folks, trying to figure out who is better is a real pickle.

It's interesting that when you work with a group of programmers for a few months you can begin to recognize who is considered "better", "average" or "crappy", but when you try to codify your feelings it's not really so simple. It gets really hard when you haven't worked with someone and have only minimal information to go on.

Resume / Experience

In comparing programmers, the amount and type of experience would seem a good indicator, yet it can be tricky to use since often you have only a resume or short interview to go on.

I've known people who were hired at a company, and stayed there forever as a programmer, yet never accomplished much of anything. Often they do just enough to stay hired but are clearly not terribly productive, or require tons of help. For these folks they have years of experience but it's not really meaningful.

You can also have experience for years on systems that are obsolete or simply different than a new language or framework or environment. Some people can naturally move on to new things and call upon common skills while avoiding those that no longer matter. Other people might never learn anything new, no matter how much they might desire it (or often how little!).

Plus you have the difficulty of evaluating a "great" programmer in an unfamiliar language. Most people would agree that Linus Torvalds (the father of Linux and possibly the whole open source movement) is a great programmer. But take him out of the Linux "C" world and make him try to get a job programming Java, and likely he would suck, at least initially, and maybe even be fired for being terrible (I don't know him but I doubt he'd ever have to try!). It's the difficulty of evaluating skills in one area (Kernel coding in C) versus something radically different (OO programming in Java). Is genius cross-platform? Or is it limited in scope?

Another problem is when they were a genius. Is Bill Gates still a genius programmer, even though he's worth zillions and has no need to write a line of code again in his life? Could he still hack it in something new? Can you imagine HR getting his resume and rejecting him as "too old"?

Interviews

I always think about interviews that TheDailyWTF is full of stories of people who passed an interview.

Sometimes you get people who simply hate everyone, maybe they've had to do 20 interviews in a row. Sometimes candidates get so many interviewees that their eyes glaze over or the fail simple tests. Sometimes people hate writing code on a white board. There are many reasons why interviews fail to always identify the superior choice. Some people may be great programmers but have poor people skills.

I've seen a lot of people who passed interviews but clearly sucked at being programmers simply because they were interviewed by non-programmers. I passed an interview (after 30 candidates were rejected) given by a manager and the "lead programmer". After working there for a short while I realized the manager had no clue and the "lead programmer" couldn't write 2 lines of code that worked. He had, however, fooled the manager into hiring him and continued to con everyone (but me) into his being a superior coder despite no actual progress. I left soon after.

Of course sometimes you can find a great programmer and identify them in an interview; but I it's still not perfect either. Everyone you work with passed an interview, but how good are they?

Certifications and Education

To me certifications represent a single point in time where a programmer passed a test. I remember one Java programmer I knew who easily passed the Java Developer Certification but no one in the company wanted him to write anything without maximum supervision, as he couldn't fathom how to organize even the simplest application.

You can also get a certification for one version of one language, and later on it barely means anything. For example an early certification for J2EE 1.1 would be almost useless with the latest J2EE and EJB 3.0, which is radically different. Trying to glean ability from a certification for something other than what you are looking at someone for is often hopeless (does a Java certification help you writing Lisp?)

In real engineering disciplines you have examinations that really do make a difference in that you know they know the required information. A PE (Professional Engineer) may not be an expert in everything, but you know they have solid grounding in engineering. Programming can be so wildly varying that it's tough to find any common ground. Try getting a C programmer, a Lisp programmer and a Java programmer (heck throw in a Ruby and PHP too) to agree on common core knowledge. We can't even agree on Text editors!

Delivery

You might think that delivering successful software is a good indicator of a superior programmer, yet it may have more to do with the environment than just the raw coding ability.

For example, we may both be excellent programmers and be given similarly complex projects, but I get "John" as the project manager and you get "Jeff". Six months later my project is a success and the customers love it, whereas your project is a disaster, the customers are angry, and the PM is telling upper management that you are to blame (even though he screwed up everything). You and I are not working alone, where our natural abilities might succeed, but in an environment where other people can (and often do) mess things up.

I've been in both scenarios, where you can be feted and then scorned despite doing quality work. So success may be a general indicator but either way it's not perfect.

Even if you do suck and deliver crappy projects for a while, you might learn from your mistakes and gradually become successful at delivery. How can you predict future success when past performance might not be indicative of ability, just experience.

Public Information

This can be a good source of information to evaluate someone but also has issues. You could read their blog (as you are!), check out their open source contributions, read social network profiles or other public information. Yet until they work for you or with you, you really can't tell how effective they might be on your projects, in your environment, or dealing with the crap you have to wallow in. So hiring Linus might seem a coup until he gets into your company and after a couple days runs screaming into the night.

I once got a job based on my blog (earlier than this one) and the interview consisted of the two lead programmers trying to scare me with all the horrible technology and ugly crap the company had to offer, just to see if I would stay or run away. I wound up staying for 18 months (and it contributed mightily to my WTF series of posts!

So public info can be a good way to identify good programmers but getting them to work for/with you is still hard. Often when you have a job opening you wind up with a lot of not-so-great (or plain awful) programmers and never even get the chance to evaluate a "better" programmer.

So now that I have dashed your hopes forever, there still remains the truth that there are better, average and terrible programmers everywhere, and that having some better ones (who are really better, however difficult it might be to identify them) is going to help produce better software. But it isn't easy to find, identify, support and keep them around.

As to the title, of course I am a better programmer than you.

Or I suck completely.

How can you tell? Good luck figuring that one out.