Bob Martin’s rousing keynote speech at the Agile08 conference in Toronto entitled “Quintessence” proposed a small but significant addition to the Agile Manifesto, a seminal document in the programming world. Uncle Bob, as he is affectionately called, proposed adding the assertion that we value “Craftsmanship over crap” to the manifesto. The idea is excellent, and the wording bold, but it isn’t quite a complete sentiment, and Uncle Bob addressed this issue in his blog.
Shortly after delivering his speech, Uncle Bob stated in his blog,
The problem with my proposal is that it is not a balanced value statement. In the other four statements we value the second item. We just value the first item more. But in my proposed addition, we simply don’t value crap at all.
He goes on to propose rewording it as “Craftsmanship over Execution,” but admits that it still doesn’t capture his meaning precisely. He then asks the blogosphere for help. My response follows.
First, I’d like to wholeheartedly endorse both Uncle Bob’s emphasis on craftsmanship and his assertion that there’s a subtle missing piece in the Agile Manifesto. As he says, “Craftsmanship over crap” is effective histrionics but may not be sufficiently clear for a constitutional amendment, so to speak.
Creating quality code is a primary force behind all agile programming, so equating “craftsmanship” with “quality code” seems redundant. What’s more, it still doesn’t really scratch the itch here. I believe that what Uncle Bob means by “crap” has more to do with the end result of what we create than it does with the code itself.
As we have all learned the hard way, if we simply give our customers what they ask for, it will suck, even if the code is clean. As I see it, the strongest, most revolutionary, and most compelling aspect of agile is its emphasis on creating a quality product, rather than just quality code. A quality product is one that pleases customers and users, while a quality program is one that merely implements functionality.
The craftsman understands that his primary, overarching goal is to create a very happy, very satisfied user. He also knows that pleasing users is extremely satisfying for the craftsman as well. It is his responsibility as a craftsman to assure that the customer gets what will make him happy and not just what he asks for. After all, being the user of complex software doesn’t imply possession of any skills or aptitude for designing that software any more than it implies skills for coding it.
To the widespread frustration and disappointment of software users, they are more often than not given feature-packed software that, while it may be composed of clean code, is ill-behaved, hard to use and understand, and it doesn’t satisfy them. Such code may be created by skilled programmers, but not by responsible craftsmen. Such code is crap.
So I would propose that the fifth statement added to the Agile Manifesto should read like this: “Responsible craftsmanship over features and functions.” While there is value in the latter, we value the former more.
Part of the well-tempered agile programmer’s craft is knowing that his end goal is generating a fierce customer loyalty to his product by imbuing it with good and appropriate behavior, without compromising the more esoteric needs of his own technical specialty. A product becomes desirable because it behaves well, while its functionality is merely a hygienic necessity. That is, its presence conveys little added value, while its absence is damaging.
Craftsmen, almost by definition, don’t stop at the minimum requirements, but strive ever to excel, to super-please, and to create highly desirable, human-scale objects. Yes, they take pride in the perfection of their hand-cut, blind dovetail joints that the user will never even see, but they know that their beautiful joinery is only a means to a bigger end.