I’ve been chewing on Dan North’s “Programming is not a craft” post and subsequent reactions for the past couple weeks. I have come to the conclusion that I agree with what I think Dan is asserting; however, the critical point isn’t so much craft versus trade as it of utility versus construction. Let me taking a stab and laying it out in a different manner.

Success in software depends on doing the right thing right. The SCM has been focused on the second part of that equation. “Clean Code” ensures that whatever we are going to build, regardless as to whether the utility has been validated, we do it well. In that regard, we can call the code (the implementation meant to fulfill a requirement) “well-crafted”. In addition, part of that craftsmanship ensures that if there is volatility or evolution in the understanding of utility, it can be modify in the most effective manner (usually measured as a matter of time) both in terms of delivering that change and in not breaking things that were not meant to change.

So I think we can put the gold star on “code craftsmanship” and get behind the work the SCM is doing in this regard.

The problem is with the first half of the “right thing done right” equation. Imagine for a minute that a plumber installed a toilet and all of the details of the work were executed with the expert hand of a true craftsman, except that the toilet was installed in the wrong place. Now the house building metaphor is problematic for software comparisons for (at least) two reasons:

1)      Most houses are built for living and each job done builds experience in the same problem domain. In software, successive ‘jobs’ are exploring new domains or at the least new areas of existing domains (not the same as patterns, and in fact pushing feature patterns on customers is a problem).

2)      Due to software’s non-material nature, change is much cheaper than rework done for a house.

Still, the analogy shows why it is hard to confirm the status of craftsman when viewed from the whole software perspective.  In terms of requirement (a problematic word, but that’s another discussion), the code craftsman is only offering successive approximation (iteration), and that is not the mark of master craftsman (given Dan’s work in BDD, it’s easy to understand why this irks him so much).

I admit I haven’t searched every corner, but I don’t see anything from SCM in terms of professional practices in this area. In fact, right there on the SCM home page is a link to “Is Craftsmanship All About Code?,” that acknowledges the need for, and absence of, answers in this area.

And by no means am I saying that this is SCM’s problem, it is an industry problem. I do have some reservations that the touted code katas may be enforcing patterns of successive approximation that will need to be unlearned.

I propose that no one bring together the “Software” and “Craftsman” word until there is a non-iterative way to do the right thing right. When that happens, we will have a new set of skills to master to become true software craftspeople, or we will work in a set of related trades than enable coders to have one level of craft, and the overall craftsmanship will reside with home builders and architects.