Know any wizards? You know, the type characterized by both black hat cracking prodigies and security expert uber-hackers? When modesty is in short supply, you can bet you'll hear about bad programmers. They are worse than users because they have a greater destructive capacity. They are numerous because programming is so accessible. They thrive because they can be difficult to spot for IT hiring managers.
Programming computers is an art that shares the nuance of visual art with the emminent practicality of large-scale architecture. Every program is a work-in-progress, and has positive value only in its interaction with other software. Solving one isolated problem can seem trivial, but be mind-bogglingly complex in its context of ever-evolving digital infrastructure. Code that increases productivity today can often become a liability before it has justified its own cost.
The only thing that makes software worthwhile to the capitalists of the world are the good programmers, the ones that see the implications to the big picture. The ones who grok the zen of data structures and code. The ones who produce a minimally complex solution with maximum expandability and reusability. The ones who can ask the right questions and explain the tradeoffs to even the most ignorant manager. The ones who can anticipate problems. The ones who can write meaningful comments.
It has often been said that a good programmer is a lazy programmer. While I agree, I think it just scratches the surface... aren't we all lazy? I propose two traits that are essential to becoming a good programmer, one innate and one learned.
- An obsession with the details of how things work. Let's face it, computers are complex and fussy as hell. If you go in with the attitude that you just want to know enough to solve your immediate task, you'll never gather enough knowledge to be a useful programmer. The most minute detail can screw up your entire program, so if you're not interested in all those details then sooner or later you'll get so frustrated that you'll give up, move to the Caribbean, sell coconut milk on the beach, and leave one hell of a nasty mess to clean up for the next coder.
- A strong ability to internalize abstraction. The idea of using logic to map a problem to its barest essence. This is a skill that is developed through mental exercise, with the purest form being mathematics and computational theory. I never liked math until I took calculus, where I had an epiphany of computation and began to see how symbols can represent the functioning of the real world (no, I had not taken physics). The second epiphany was when I learned about how CPUs actually work, and the concept of turing reducibility. Hiding all unnecessary details is what allows computer science to extend into realms of unforeseen complexity without becoming impossible to understand.
These two traits are the seed. You are still likely to be a bad programmer until a large amount of experience has fertilized your ability to anticipate problems. Exposure to a lot of good code is essential, but re-writing bad code gives you a true appreciation of the art. Get a sense of all the right and wrong ways of doing things that never crossed your mind, then internalize the pros and cons of various approaches. Leave yourself open to criticism and be fully devoted to logic and reason. Study all levels of the system (hardware, kernel, operating system, application, script) until you have some idea how the whole thing works.
If you are genuinely curious about computers, then I say go get yourself a good computer science degree. If you can fully and deeply understand all the concepts presented in a MIT-based computer science curriculum, then I think you have what it takes to be a good programmer. That's not to say a computer science degree makes a good programmer or that it is even necessary. But it is a sure way to get exposed to all the core concepts in a reasonable fashion. In the end all you need is a lot of experience and an open ear to criticism.
For stuff good programmers should know see:
The Value of a College Degree - Computer Science