The Problem with the Software Craftsmanship Concept

by Krishna on July 23, 2009

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.

{ 14 comments }

Scott Muc July 23, 2009 at 10:48 pm

I like your thoughts, but I think I have one thing to add.

The biggest problem in the software industry is the ability to provide reasonable estimations. As a person who has been in the industry for four years I can’t estimate. I’ve failed pretty much every estimate that’s been requested of me. I don’t think of myself as a bad developer… in fact I am probably in that category of developers that can write something significant and become huge.

The difference? Startups created by young developers don’t have anyone to answer to. If they deliver late, they take the hit, but no one loses value because nothing has been delivered yet.

When a business asks me to create something within 3 months, it reflects poorly on the software industry when I deliver it in 9 months.

I prefer the path of the craftsman and that’s where I’m trying to improve my skills. Those who don’t follow that path but are successful on their own are perfectly acceptable, but I they have a different role.

That’s my $0.02
Scott

Paul Pagel July 24, 2009 at 5:09 pm

Krishna,

Good thoughts. I don’t know about your premise of more experienced developers are working at a disadvantage is correct though. The skilled developers have been around long enough to know in software, the most essential skill is the ability to learn. If you have been around software awhile, then you are very good at learning new frameworks, technologies, and processes.

I agree that some developers get caught in their thinking and don’t move forward, but I wouldn’t consider them craftsmen.

Kevin Taylor July 25, 2009 at 8:05 am

Hi Krishna,

Thanks for the interesting post and emphasizing how important innovation and learning are in software development.

Also, check out this chapter on breakable toys, which is related to your idea of experimentation: http://softwarecraftsmanship.oreilly.com/wiki/breakable_toys

In practice, I don’t see experimentation in software being the rigid, controlled process that you describe. What I see are people building breakable toys and rapid prototypes. Or, even setting aside a few hours/days to do a technology spike to answer a tough question.

Best,
–Kevin

Krishna July 26, 2009 at 7:36 pm

Kevin, thanks for the link.

Actually, my point was that software experimentation should *not* be rigid or controlled, because it misses the benefits of experimentation. The concept of a master craftsman and apprentice means that experimentation would be controlled, which is wrong.

Alan Skorkin July 26, 2009 at 8:24 am

Thanks for a great and thought provoking post.
I was going to write a massive comment, but rather than doing that I decided to blog my thoughts on the matter: http://www.skorks.com/2009/07/in-defense-of-the-software-craftsmanship-concept/
My apologies for disagreeing with most of your points, upon self-examination I found that I felt pretty strongly about the subject :).

Dave Cameron July 26, 2009 at 9:06 am

Hello Krishna,

I think you’ve highlighted areas where the craftsmanship metaphor breaks down badly when applied to software. Innovation and collaboration is so important for our field. By evoking Guilds though, craftsmanship suggests a controlled stagnation for the benefit of the establishment. I think there is more to craftsmanship as an idea, however.

Anyone who clings to old technologies and frameworks is unlikely to outperform new tools in the long term because they are ignoring so much new accumulated knowledge. I picture a greying man rubbing punch cards between his fingers and sniffing the aroma while basking in the glow of green CRTs — it’s ridiculous. A similar scene of an aging vintner testing the soil of his vine fields doesn’t seem as silly.

It is possible in software to have experience beyond a particular framework or technology. This is where the distinction between experience levels become important, in my opinion. No web framework I’ve encountered prevents a developer from introducing a static field to one of their classes, but this is nearly always a bad idea in a web application. The team at twitter got their system up and running quickly, but hit a problem that had been solved years earlier with message-oriented-middleware. ORM frameworks like Hibernate make SQL nearly obsolete, but understanding of the N+1 selects problems remains important.

Knowledge of implementation details becomes obsolete as it is abstracted away. Understanding of software systems in action and how they behave does not. Even though the system is abstracted away for the developer at build-time, all the bulk of it is still there at run-time.

Krishna July 26, 2009 at 7:56 pm

Thanks for your comment, Dave. I agree with your elaboration on experience. It is not the case that experience is entirely useless, but as software innovation continues, some aspects of the experience become obsolete. Others continue to remain relevant. The question for the software practitioner is what kind of experience are they building up?

Omar July 26, 2009 at 9:11 am

Totally concur with Alan. Innovation and craftsmanship are two independent concepts. Good post tough.

–Omar

Stephan Schmidt July 27, 2009 at 4:43 am

“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.”

After programming for nearly 30 years in more than 20 languages/technologies, I think the “language/technology experience” isn’t worth very much – also not for youngsters. Technology/languages can be learned in one week to get going, a month to get to the top quartile if your good.

What is important in experience are all the errors and wrong decisions you’ve made over the years, not language knowledge.

Cheers
Stephan
http://twitter.com/codemonkeyism

Mark July 27, 2009 at 8:30 am

This summer I’m celebrating 30 years since I wrote my first program, and I disagree.

The bulk of your argument rests on the assertion that the use of higher-level tools bestows a higher level of ability on those using them, and that’s simply not the case. Tools (in the general sense, not just software tools) are things we use to reduce the work required to do something. To put it another way, they bring efficiency. But higher-level tools carry very pointy parts and will let you saw your own leg off if you’re not careful.

Software is no different than a lot of other pursuits in that putting powerful tools in the hands of the inexperienced doesn’t usually produce excellent results. What comes from experience is the ability to understand what a tool does (because odds are good you’ve already used something like it before or done it yourself) and how to wield it to do the work you want and do it well without sawing off a limb in the process.

Craftsmanship is what you get from someone who’s got enough experience to understand how to do the best possible job with the tools he has available regardless of their “level.”

Anybody can write functioning software, and if it works forever, that’s great. But the moment I have to stick my head under the hood and make repairs or changes, the level of craftsmanship determines how difficult my work is going to be. And I can tell you from experience that I’d much rather work on a piece of well-crafted code than something that would be featured at Coding Horror.

In some ways, I feel sorry for the younger generation, because they’re expected to reach into the cabinet, pull out the pointiest tools and start producing. I at least had the luxury of growing up with the industry and had time to soak in all of the innovations that led up to those tools.

–Mark

Luciano August 5, 2009 at 2:55 pm

Really good point of view. I agree with you. I think this is just another manifesto, and could there be a bunch like this, just adding infinite ‘not only… but also..’. If you can really understand and practice the Agile Manifesto, you’ll don’t need a second one.

Luciano

Luciano August 5, 2009 at 2:57 pm

Guys, I’m sorry for my bad English. I wish you can understand.

Krishna August 5, 2009 at 4:57 pm

The Agile Manifesto is great, but like everything else, should be guidelines rather than an article of faith. We must always learn to blend that with our knowledge and experience.

Luciano August 5, 2009 at 5:29 pm

Sure! I just tried to say that I don’t see anything on Craftsmanship that is missed on the whole Agile Manifesto. It seems that those guys “forgot their vegetables”, jumping direct to a new manifesto…

Comments on this entry are closed.

{ 1 trackback }

Previous post:

Next post: