Like most people, I think of myself as being a bit above average in my field.  I get paid well, I've gotten promotions, and I've never had a real problem getting good references or getting a job.

But I've been around enough to notice that many of the worst programmers I've worked with thought they were some of the best.  Bad programmers who are surrounded by other bad programmers seem to be the most self-deluded.

I'm certainly not perfect.  I do make mistakes.  I do miss deadlines.  But I think I make about the same number of bonehead moves that "other good programmers" do.  The problem is that I define "other good programmers" to mean "people who are like me."

So, I wonder, is there any way a programmer can make some sort of reasonable self-evaluation?  How do we know whether we are good or bad at our jobs?

Or, if terms like good and bad are too ill-defined, how can programmers honestly identify their own strengths and weaknesses, so that they can take advantage of the former and work to improve the latter?

A good programmer understands that that they have to continue to learn and grow.  They strive to do their best at every effort, admit to failures and learn from them.

They are extraordinarily communicative.  Not only are they able to explain complex technical terms to a layperson, but they go out of their way to act as devil's advocate to their own idea to make sure they're giving the best options to their client.

The best programmers know and accept that there is more than one way to do things, that not every problem is a nail, and that because there is always a better way to do something than how they were planning on they constantly seek to learn new techniques, technologies, and understanding.

A good programmer loves to program, and would do so in their spare time even if they already spend 80+ hours a week programming.

A good programmer knows that she/he is not a great programmer.  Truly great programmers do not exist, there are only those who claim to be great, and those who know they are not great.


