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.

Ćukasz Piestrzeniewicz 11/21/2008 00:41
Hm... It's quite easy: show me your code in the language/framework you will be working with by my side. You have none (you can freely show)? Write a patch for open source project that will exersize your skills.
I need no CVs, the source is the ultimate source of information. Make sure that is well tested though. And that you can answer how you could improve it.
I have tested tens of people that way and now I have only people I know I can trust on my team.
ryan 11/21/2008 07:53
i'd say a good programmer is defined by his ability to interpret an intention into code. someone will say, "we need this to do something and result in THIS" and the programmer will be able to create the path from point a to point b, the more efficiently and accurately he is able to do it, the better he is.
the only way to gauge this ability, however, is to test it by giving the person a problem to solve. of course when a problem has more than one solution it brings the competancy of the testER into play as well when assessing the results...
i would venture to guess that by asking a candidate how they would create a solution, and judging their response in respect to their PROCESS of creating the solution, you could learn a lot about whether they're good at problem solving in general
Daniel Tenner 11/21/2008 09:14
I wrote down my thoughts on this topic a while ago, and I find that they have served me well when it comes to recognising programming talent. Have a look:
http://inter-sections.net/2007/11/13/how-to-recognise-a-good-programmer
Stallman Fan 11/21/2008 10:00
"(the father of Linux and possibly the whole open source movement)"
Possibly? No, that would be Richard Stallman. Those that don't know their history are doomed to mangle it.
Linus is the rude guy that continues to steal the well deserved fame of rms. Eric started the OSS PR machine, also stealing rms's laurels. Shame on Linus and Eric! Stallman is a better programmer than both of them, combined. :)
11/21/2008 10:48
"Most people would agree that Linus Torvalds ... is a great programmer"
Haven't heard this one before. A great organizer, yes. A great programmer, not so much.
"Sometimes people hate writing code on a white board."
Then they're not the "superior choice". (I don't think interviews are as bad as you say.) There are lots of things in CS (and interviewing) that I hate, but I don't use that as an excuse to be poor at them. I've had a wide variety of programming jobs, but not yet one which didn't involve writing code on a whiteboard.
"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."
It would probably look a lot like an undergraduate curriculum, which doesn't teach a language but teaches computer science (and to a lesser extent, programming). A linked list is O(n) for random lookups in both C and Lisp.
Finally, I don't see any way this is specific to programming. Is there a robust system for choosing the best director for a film? Could film directors from different genres agree on a core curriculum? Does a certification indicate quality in a director?
me 11/21/2008 11:25
no you're not.
NB 11/21/2008 11:31
Programmers or engineers today are nothing but a copy-paste people with great ability to read and integrate the code. Most of the programmers are great Google users. The best are the one that actually can think and not re-create code. The language itself and the uni where you study doesn't make one a good programmer. They make one a person with interesting CV. You can be a really great student with the best grades but a lousy programmer. In addition, there are 2 kinds of jobs: writing the code from the ground up - takes one person. Maintaining and optimizing the code is another one. The really best are the combined, but great programmer - will prefer to build from the ground up and then give the maintenance to other people. (In real life, they will do both or all). Again, being a kind and a reasonable person and one that can get along with other people in many cases is what will secure your job - it is not always about your professional skills but also on your personal skills... and the best programmers have excellent skills too.
Colin 11/21/2008 13:34
One additional factor is the energy level of the programmer. Many programmers have potential to be great but only reach that potential occasionally. The rest of the time they are too lazy, tired, depressed or distracted to do their best. So even when a programmer knows how to code a solution really well their work may not always reflect that. And by the same token someone may do something really impressive that lands them a job or promotion and then pretty much lose interest and coast.
. Obviously this applies to most jobs, not just programming. It's just that it's such a large factor that it shouldn't be ignored.
Bob 11/22/2008 05:35
Knuth is a great programmer.
Kris Brixon 11/22/2008 06:48
@NB: You are confusing programmers with developers. I am a developer, I don't write compilers, games, IDEs, or use any low level languages. Developers solve problems based on algorithms and tools made by programmers. The big problem in interviews is identifying programmers vs developers and also know which one you need.
Base software (Compliers, IDEs, DBs, OS, ...) needs about 95% programmers and 5% developers. Shrink wrap software needs about 70% programmers and 30% developers. In-house software needs about 20% programmers and 80% developers.
Angelina Fabbro 11/22/2008 09:29
"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?"
A good programmer shouldn't be held back by a language. I disagree with the assumption that a good programmer would be so terrible with a new language. Adapability is requisite for being a good programmer. If you can't transpose your skills as a programmer, you're not a good programmer, you're a mediocre programmer who doesn't understand the fundamentals of what they are doing. Yes, there is an initial learning curve when one learns a new language. So? You have the API open in another window, and you get to it.
Eunoia 11/23/2008 06:23
Give her/him a couple of pages of faulty code to inspect.
Ryan 11/23/2008 10:28
I've been tasked with finding people for a company. I'd have to say it's one of the hardest things to do. In the end I usually evaulate candidates by a.s.k. Attitude, Skill, and Knowledge.
A and K are pretty straightforward to test and evaulate. I find it very hard to assess skill though. White board evaulations I find do not represent real world skills.
In the end I find relying on reference checks, and having the candidate to describe a tough problem that they personally overcame and what they did. I get a better feel for the person this way.
On another note, I've noticed a lot of people who seem to organize their interviews to be confrontational. I really don't understand this position. The interview is a two-way conversation, and the market is in the developer/programmers favour. You must find qualified people, but you must also want the qualified people to pick your company.
I have personally avoided companies because I found the company was full of "slashdot nerds" who were using the interview to pump up their own ego's. I see this as a bad sign, and not a health work environment.
What are other peoples thoughts on this aspect of interviewing? (Both sides of the table)
Mark 11/23/2008 15:23
I find one of the best indicators of potential or skill to be how much a developer is interested in his profession. Does he read blogs, articles, books on theory? Does he try out random new languages to get exposed to new ideas? Is software development a hobby as well as a job? In my experience people who fit this profile are among the better developers.
Jeff 05/16/2009 02:01
i think that bill gate is still good although he has resigned.he is my hero no matter what.I want to grow up and be like him.