I think the first time I came across the concept of a software craftsman was when I read the Pragmatic Programmer. Up till then I was all about the technology, and facing all the pains of tightly coupled non-cohesive code. That book was a life changer for me and the start of a journey.
In reading the Pragmatic Programmer I heard of the concept of a journey man. At the same time I had started listening to podcasts, in particular DotNet Rocks. I happened to hear an interview done with Corey Haines where he spoke about his experiences travelling the world learning how to code better. Luck had it that soon after that Corey visited South Africa and we managed to meet. In meeting him, he introduced me to the concept of Code Retreats. I learnt more about crafting software at my first Code Retreat than I had learned in the last 10 years of being framework chasing developer.
So what is a Software Craftsman? I believe it is someone who doesn’t just care whether the problem they were given is solved, but also how it is solved and how that will impact things in the future. A craftsman has a level of pragmatism in the decisions they make and in how they do their work. A craftsman understands how to use his/her tools properly. A craftsman realizes they can learn from anyone.
Outward vs Inward Focus
The Software Programmer said, “They may not like it, but it will be something I can be proud of.” The Designer said, “We can’t show them low-fidelity design mock-ups… what if they feel its good enough as-is?” The DevOps Engineer said, “I realize the server will only be used for a week, but I always build everything with Chef.” The Program Manager said, “TweetFace’s app has this feature, and ours should too.” The ScrumMaster said, “We missed our shipping target, but at least we completed more points than expected.” The Team Lead said, “The customer doesn’t really know what they want, but we’ll give them what they need.”
It’s good to be invested in our work. Sometimes we call that “employee engagement.”
But there’s a difference between “pride of ownership” and “pride in craftsmanship.”
Pride in ownership is inward facing, putting my needs as the “owner” first. If I need it to be beautiful (whatever that means), or impressive, or scalable, or fault-tolerant, or fast-as-lightening, then those become the unspoken requirements.
Pride in craftsmanship is outward facing, putting the needs of the other people first. Other people like the users, or other people who will work on it, or even the phone support folks. It is selfless and focuses on being suitable for others to use.
Which kind of pride do you see on your team?