On Craftsmanship: In Code and Wood

table One of my favorite hobbies over the years has been woodworking. (Admittedly, not one I have done much more than dabble in to my disappointment) I have always enjoyed taking bits and pieces of raw material and working them into something both useful and beautiful. Starting from a plan. Often, in my case being an amateur, the plans are very structured and concrete like from a set of drawings purchased at a woodworking store. When I have had the privilege of working with more experienced and even expert woodworkers, these plans are more often rough drawings that create a framework to work from and evolve as the piece is being crafted. This is a beautiful blend of precision craftsmanship and artistry.

Creating in this way has always appealed to me. And I think that may be why I have been drawn to software engineering and architecture. Most people in this field for any length of time will understand why I make this comparison. But, it has only recently come to mind how deeply this comparison goes.
 
The Evolution of a Craftsman
 
In woodworking you always start with a plan. (At least for anything more than a small trinket.) When you first start in woodworking, you are best served getting highly detailed plans with detailed measurements and step-by-step instructions to guide you through the entire process. These plans help you not only create a better end product, but help you understand the how’s and why’s and build your skills by following time-tested procedures. As you learn these procedures and gain confidence in your abilities, you can begin using less detailed plans or skipping-over pieces of the plans you are familiar with. Slowly building to a point where you can soft of freestyle. Build on the knowledge and skills you have acquired from others and interpret in new and interesting ways.

This is exactly how I see the process of building software. Beginners should take advantage of architectural plans, best practices and well-established design patterns to build-up a plan of how they are going to build their software. As they are building the software they can lean-on more experienced developers, books or, maybe most commonly today, the web, to learn techniques for implementing these plans. As they gain confidence in their skills, they will begin to branch-out and find new ways to solve problems. Eventually finding solutions to new problems that have never been thought of before.

As you continue in your craft you begin finding ways to produce better products faster. An example in woodworking might be when you build a custom jig for some process that you need to do repeatedly in a very consistent precise manner. As a software craftsman you would likely create a common library or script to do the same.
 
Becoming an Expert
 
While I don’t believe I am or ever will be an done improving my craftsmanship at woodworking or coding, I do believe that I have reached what most would consider advanced or maybe even expert level as a coder. (Certainly not a woodworker!) I big part of becoming an expert at any craft is getting to the point where the questions change. You get past the questions about the basic mechanics of how to solve a specific problem and begin asking bigger questions. You begin thinking more systemically asking different, more holistic, questions. How do the various possible solutions to this problem impact the system as a whole? How can my approach to this one piece lead to a better overall solution?

From observing experts in other fields such as woodworking, I believe this is true for all crafts. A woodworker may look at a table they are building and ask questions like “What would it mean if I used biscuit joints vs dowels?” This is no different in my mind than when a software architect or engineer may ask “How would the system be effected if I choose a distributed key/value store here instead of a centralized relational data store?”
 
You Will Never Be Done
 
One of the great things about being a craftsman in any field is that you will never be done. There are always new techniques being developed, new tools to learn and new problems to solve. And you can never stop trying to get better. Even the same old repetitive tasks should be re-evaluated constantly for ways to do them better or faster. I will never be satisfied that I have found the one true best way to solve a problem. This is a beautiful, never-ending process. It keeps me going and builds my hunger to take my craft further.