What makes a good programmer?

I started a new consulting project at work last week.  I and a coworker are implementing an internal logistics system for Tokyo Electron America.  The project is an addition to a system that Catapult created for them several years ago.  Unfortunately it’s ASP rather than .NET.

Today I was creating use cases for the design document when I ran across the following note written on one of the prototype screen shots:

ES need to see a list of denied NCDR with parts shipped  (auto-approved but denied later)

There is an incredible amount of information and assumed knowledge in that quote, and I’ll need to discuss it with the users before I can fully understand what it means.

This is a perfect example of the kind of thing I tell high school and college students when I speak to them about programming.  “Bankers,” I tell them, “don’t speak programmer.  Worse, they will talk to you in banker’s lingo and expect you to understand what they’re saying.  Worse yet, they’ll tell you what they think they want or need, but they often don’t understand the implications of what they’re asking or take into consideration all the possible situations.  As a programmer, it’s your job to gather the domain knowledge so that you can understand the problem that users are trying to solve, and to ask questions that help you and the user solidify the requirements for a system that will meet those needs.  Being good at writing code isn’t good enough.”  I elaborate on that quite a bit, of course, but that’s the gist of it.

The need to communicate effectively with clients and understand their business needs is why I encourage would-be programmers to study something other than computer science in college.  Very little of what’s taught in a computer science course is actually applicable to most programming jobs.  Trade schools are better teachers of programming for business.  The most important skills–critical thinking, writing, and diplomatically giving somebody else your idea–are taught in other fields of study.  Of the best programmers I’ve worked with, none, to my knowledge, majored in computer science.  I won’t say that I can teach a monkey to write good code, but I can much more easily teach programming to an English major than I can teach effective communications to a cowboy code slinger.