Saw an interesting article off of Digg today talking about how most programmers can't write code to save their lives. You can find it at:
(it's currently been dugg, so you might have to check out diggmirror.com) While the article was interesting, there was an interesting comment left on the forums about what makes a good programmer.
It appeared as the following:
"It really all boils down to the fact that, as I see it, there are two types of us programmers.
Type 1: Career Programmer
This is the guy who, when asked what his job is, he says "programming". When you ask what he does in his spare time, he might reply with "I bungee jump, party, get drunk, party, etc etc". Programming is strictly a job, and when he comes home he might not even have a computer. Or he has a computer that is basically used for accessing MySpace. This is the guy FizzBuzz trips up, and he sees no value in it.
Type 2: The "Programming is an Art / Science" Programmer
When you ask this guy what his job is, he'll say "programming". Ask him what he does in his spare time, he might reply with "Well I just finished skimming through the Rails Recipes book. I use .NET at 'work', but I like to learn new languages and technologies when I have some extra time. Oh, I also spend my extra time keeping my blog on .NET Tips & Tricks up to date! By the way, have you read Getting Real by 37signals? It has some great ideas.".
You see, Type 2 is not just a programmer from 9 to 5, he really enjoys what he does and makes it his passion. He's also not simply a person who just likes to bang out code and go home. He takes the initiative to learn new languages. He reads books about the SDLC and methodologies.
This is the guy you want if you want quality. He excels in smaller environments. He's not simply a body filling a position. To find Type 2, ask the candidate what books he's read related to his profession in the last year or so. Ask what tech sites he visits, and why."
I actually disagreed with this description of the "two types". This is one of the most common misconceptions I hear all the time amongst collegues about programmers and what makes a "good" programmer. In my experience type 2 tends to be the stereotypical antisocial computer "geek" who is standoffish, and writes code that is wildly effecient but horribly difficult to maintain and that tends to be viewed as "good enough". They often have difficulty working with others, and just tend to "do things themselves". They have little balance in their lives.
I think there's also a type #3: the programmer who enjoys being challenged with new problems, and while he/she doesn't read an O'Reilley book or learn a new programming language every week, he/she isn't afraid to broaden his/her horizons. He/she often has varied interests away from computing (perhaps has a wife/husband and family). Because of the balance in his/her life, he/she is often able to interact well with others. Takes pride in his/her work, and often while not a prolific code writer, produces code of the highest quality and is always looking to improve code even further. Puts an emphasis on dividing a problem into smaller divisible tasks and has no reservations about handing them out to others.
I think it's type #3 that is the ideal programmer, yet it's type #3 that will tend to be hurt by the common types of obscure questions that are asked in programming job interviews (What's the dynamic_cast operator in C++? What's call by value-result semantics? What's your favourite data structure?)
Programming skill has little to do with acquired knowledge, but rather the ability to problem solve and think critically. Yes you need familiarity with the language in question, but if you cannot break a problem into manageable chunks then you'll never come up with a great solution to it irregardless of how familiar you are with the language.