(picture)

December 02, 2003

Craftsmanship

Joel Spolsky on software development:

It comes down to an attribute of software that most people think of as craftsmanship. When software is built by a true craftsman, all the screws line up. When you do something rare, the application behaves intelligently. More effort went into getting rare cases exactly right than getting the main code working. Even if it took an extra 500% effort to handle 1% of the cases.

Craftsmanship is, of course, incredibly expensive. The only way you can afford it is when you are developing software for a mass audience. Sorry, but internal HR applications developed at insurance companies are never going to reach this level of craftsmanship because there simply aren't enough users to spread the extra cost out. For a shrinkwrapped software company, though, this level of craftsmanship is precisely what delights users and provides longstanding competitive advantage.

He's dead right, but I don't completely agree. Commercial ("shrinkwrap", if that's an appropriate term) software development happens under a set of constraints which make pure attention to detail very difficult; that's also true of "bespoke" software, it just works differently. There's intense pressure to ship to deadlines; the feature set is decided with a different set of priorities than developers or users would choose; that 500% effort usually won't be cost effective. The software industry is driven by novelty (and the elephant under the table, Moore's law).

Craftsmanship is perhaps a state of mind, unenforceable. But I do know how to encourage it: practice.

In the crafts, the creation of this bowl could only be possible with years of practice, experimentation, concentration, and an understanding of the product's behaviour in context (how it looks, how it feels, how it works). While the basic materials and techniques might develop in leaps and bounds, refinement takes a while.

Software is the same. Not "measure twice, cut once" but a constant cycle of build, tear down, rebuild, refine. Do it again and again. Show users your prototypes and failures, if you can. Learn from experience.