Defining Software Craftsmanship
One of the things I've noticed since adopting craftsmanship as a software development metaphor is, the definitions are largely lacking. Looking through books and materials on the subject, I find a lot of descriptions but few definitions. So let's take it apart for a moment.
The Oxford dictionary defines it as:
1. An activity involving skill in making things by hand
(verb) to make or manufacture (an object, objects, product, etc.) with skill and careful attention to detail.
Both of these definitions highlight skill as the key component, and that will keep coming around and around. However, the first point I want to raise is that it is about making things by hand. In many engineering endeavors, products are designed and then handed off for manufacturing. The quality of the product becomes a question of both the design, and the manufacturing tolerances in executing that design.
In software, we make them ourselves. Our thoughts and ideas are made visible in code. We craft our code as our design and our product. The responsibility for its quality is ours.
However, my 2 year old daughter threading fruit loops on yarn or my son making origami can be considered to be engaging in crafts. They are making their own products and their efforts require some rudimentary skills. What we do is more than craft, we need more.
If we look at this suffix for meaning, this is what we find.
Oxford Dictionary says:
denoting skill in a subject or activity.
Merriam Webster's is more fun with:
We have significant reinforcement here of the idea that high levels of skill are being demonstrated. When you look at other uses of the suffix such as marksmanship, the highly skilled piece clearly comes through.
Unfortunately, there is something missing here in the historical and cultural context that the individual parts of the word are not expressing. The "man" in the suffix seems exclusionary, and I believe it is. However, I do not believe it is by gender, as one might assume. I believe it is exclusionary by maturity. Said another way, the use of man is this term does not emphasize man as opposed to woman, but rather man as opposed to child.
When we look at the term sportsmanship, we see more clearly the connotation of mature character and performance. That maturity applied to craft evokes a sense of high standards of work, of excellent and quality construction in product as well as the responsibility for doing so.
For software, those standards are of elevated importance, because our work today is our raw materials of tomorrow. That is true to a higher degree than other fields. The effects of our construction, good and bad, compounds on itself immediately and continuously.
I think about craftsmanship as a metaphor for software a lot and continue to try to refine and express the essence of this idea. Currently, I define software craftsmanship as:
the skill to responsibly deliver
What does it take to responsibly deliver? What qualifies as well-constructed software? What skills are required? How do we get them? That is going to take a lot of blog posts. Let's get started. :)
Joe Gee is a master craftsman at the Rocky Mountain Programmers Guild where he mentors programmers and teams to grow their mastery, performance, and delivery. Learn how he can help you or your team at www.rmprogrammers.com.
Early in your programming career? Grow fast alongside your job through apprenticeships. Cohorts in test automation or application development are forming up in January. Join at www.rmprogrammers.com/upcoming.