The idea of software craftsmanship is very appealing. It elevates the art of programming and sends a message that programming is a lifelong dedication to improving one’s skill and aspiring towards perfection. All that is good and noble about programming is embodied in the term “software craftsmanship”. But the history behind the term “craftsmanship” troubles me.
The idea of craftsmanship is a concept from the medieval periods about a career transition from apprentice to journeyman to master craftsman. Apprentices learn skills under a craftsman and become journeymen after the apprenticeship. Journeymen have to be accepted by the master craftsmen into their guild before they can become one themselves. I don’t think anyone takes this literally when they use the term “software craftsmanship” (though, some do), but it does differentiate between an experienced, master craftsman and the rest.
And I think this is divorced from reality. What we have seen and are seeing is that there are many software products created by young, self-taught programmers. The beauty of software innovation is that a fresh software developer can leap-frog over experienced ones by simply using newer technologies and frameworks, which are becoming more powerful every day. This is analogous to how developing countries use new technologies like cell phones to rival developed countries by shorting the process undergone by the developed nations.
This is not to belittle the knowledge of experienced programmers, but to point out that much of such knowledge has already been distilled into development tools. For example, a junior developer using Ruby on Rails, ASP.NET MVC or Spring is automatically working at a higher level of programming than she would have 10 years ago. There is still an advantage brought by experience, but it is decreasing every day.
In fact, by its nature, software craftsmanship can sometimes run counter to innovation because it values experience over experimentation. In craftsmanship, experimentation, by definition, would be under controlled circumstances under the observation of a master craftsman and is therefore limited in what it can achieve. It also emphasizes control and organization which are qualities inimical to disorganized experimentation.
I have to be careful what I am trying to say. I am not saying that there is no value in experience or learning. Quite the opposite. I am saying that the value of existing experience and knowledge is eroded by innovation so much that the experienced programmer has to work all the more harder to keep up with youngsters. Not only does the experienced developer have to learn the latest in software, but they have to unlearn many items they know.
Now, everyone is at liberty to define what they mean by “software craftsmanship”. If it simply means working to improve the quality of your code, I find no objection. I mean, who would object to better code quality (the software equivalent of motherhood and apple pie)? But if it means that you somehow become a “master craftsman” and can differentiate yourself from “apprentices” based on years of experience, it is not only an elitist view, but also an illusion. Wake up before the apprentices start running circles around you.