Steve McConnell (via Jeff Attwood's blog):
The intense inwardness of programming makes personal character especially important.
[...]
Your employer can't force you to be a good programmer; a lot of times your employer isn't even in a position to judge whether you're good. If you want to be great, you're responsible for making yourself great. It's a matter of your personal character.
Let's face it, programming is difficult - that is, unless you are a coding god of the likes of James Gosling or Linus Torvalds. The rest of us surely have delivered some really bad code once in a while. The step we have to take is to acknowledge our limitations and strive to get better. This takes some guts, especially as many programmers have strong egos. Edsger Dijkstra described that phenomenon more than thirty years ago in his classic paper "The Humble Programmer".
What also stroke me often during my professional career is the huge discrepancy in work productiveness and quality between the best and the worst programmers. I mean their job descriptions might look quite similar, but their qualification differs like a brain surgeon's does from a caregiver's. No offense intended here, I admire what caregivers are doing, but still you wouldn't let them operate your brain, right? But each day and at many places, I can assure you, software layman are doing software surgery, and of course they screw up. And they are doing so because they think they are surgeons, when they are not - which at the same time prevents them from improving.
It partly has to do with our industry's education system. Some developers have been hacking away since their early teenage days, some others have attended a six-week-now-I-become-a-web-designer-course. And many employers don't care a lot. The novice might cost them half, and the fact that he is just going to produce one tenth of the value is unconceivable for most managers. In other areas, the apprentice would never be allowed to touch stuff that only a master craftsman can handle. In the software business there are no such restrictions.
At the same time formal education is no guarantee either. I have seen graduates from my university produce great stuff, and others who were horrible coders. Some of the best developers I know don't even have a degree. On the other hand there are graduates who think they have seen it all, which is exactly their problem.
It's hard to separate the wheat from the chaff up-front. Jeff Atwood has a point when he says:
When interviewing candidates for programming positions, I always look for someone who is brave enough to say "I don't know" when they need to. Candidates who can't or won't do this get red flagged; those types of programmers are dangerous. "Can-do" attitudes have a superficial allure, but they're actually poison in our field.
I might add that letting interviewees do some life coding should be a must - unfortunately this is hardly ever practiced.