In my time as a developer, and now managing a team of developers, I have come to realize that there are two kinds of programmers: the Journeyman and the Craftsman. These terms aren’t mine - I’ve seen them used other places - but they describe the developers I’ve worked with pretty well.
…knows one programming language.
…knows one operating system.
…can’t be bothered to learn something on their own.
…doesn’t know anything about the operating system or hardware their applications run on: “Someone else takes care of that”.
…never masters his tools. “I know my way around my IDE, that’s good enough”
…doesn’t refactor: “It’s ugly, but it works. Leave it alone!”
…only learns about the part of the system they are working on. No need to learn the rest of the system: “That’s not my job”.
…doesn’t want to take on an unfamiliar technology: “I haven’t had any training on x”.
…knows a handful of programming languages, and is always on the lookout for the next one he should learn. He knows that learning any new language will stretch his mind and make him a better programmer in the language he uses day to day.
…devotes time to learning about new technologies, and helps to make others aware of them.
…understands the platform and operating system his applications run on, because he knows that’s the only way to diagnose many problems.
…masters his tools. He can perform magic in his chosen editor, and is always looking for ways to make himself more efficient.
…rarely passes up an opportunity to broaden his knowledge of the system he is working on.
…is always willing to take on something he’s unfamiliar with. He can pick up most things pretty easily, and enjoys the challenge of learning something new.
One craftsman is worth three or four journeymen. Easily.
It’s the journeymen whose jobs often end up moving overseas (and rightfully so, they add little, if any, value).
The longer I manage development projects, the more I value the craftsmen I have around me.