What is Software Craftsmanship?
Software craftsmanship is a movement in the development community embracing the individual and focusing on a developer's quality and skill. It draws heavy influence from the apprenticeship model of feudal Europe and Asia; providing a path to mastery where a developer progresses through various mentoring levels to eventually achieve better proficiency in their craft; writing good code.
While craftsmanship places an emphasis on the skill level of the developer and the quality of the code they produce, this increased focus on the individual can sometimes make us forget the true purpose of what we are trying to achieve. In order to deliver working software that yields continuing value to the customer, it is critically important to maintain proper perspective of our end goal while still preserving the highest degree of excellence in the quality of our work.
Focusing on Skill
Meet Jon. Jon is a developer. Jon likes his job, but scoffs at all the "new" libraries, frameworks, and technologies. He is perfectly comfortable with his current skill set. However, the world is not static and this is especially true in the world of software development. In a state of constant flux, honing your skills is as essential as having them at all. Craftsmanship focuses primarily on personal growth via mentorship and typically fosters a culture conducive to passionate people that are in constant pursuit of improvement. The apprenticeship model provides a path to mastery, yet no destination. It is this perpetual state of one's advancement of their skills that forges a way to writing better code.
Notice that my description of software craftsmanship focuses on the mastery of writing "good code" and not "good software." This subtle distinction is particularly profound. It hints that better code does not necessarily translate to better software.
Focusing on Vision
Building a skyscraper is hard. A mastery of mechanical and civil engineering, landscaping, interior design, and many other intersecting disciplines are required. However, regardless of how masterfully architected or how beautifully it was engineered, without exterior doors, it is completely useless. At the end of the day, the only thing that matters is whether it meets the needs of the people using it.
Writing software is also hard. Although creating a skyscraper without doors seems quite unlikely, it is not so unlikely to create software with features that do not meet customers' requirements. Writing software is hard; writing software capable of providing continual value to end-users, is even harder.
Finding the Focal Point
It is true that whether building skyscrapers or developing software, meeting the end-users' needs is above all else and should always be in focus. However, much like focusing solely on the craftsmanship will not likely yield the desired result; maintaining only a vision of the solution will also fail. A skyscraper that is not built properly by skilled workers is just as useless as one without doors.
Software craftsmanship is not simply shifting the focus from the software's value to the quality of code in which it is written. Instead it is a means to an end; a mechanism to achieve good working software. Without a vision, there is no path forward. Without craftsmanship, there is no means to move forward along that path. A software's value and the quality of craftsmanship are not divergent. In fact, to the contrary they are complementary with each as intrinsic to good software as the other.
Becoming a Software Craftsman
Craftsmanship is an arduous journey without a final destination. However, there are a few regular exercises to get you started. First, practice by doing daily code katas. Each kata should take no more than 30 minutes to 45 minutes of your time. Dave Thomas has a great place to start with code katas at codekata.com.
Empty your cup, or, in other words, be willing to begin again. Regardless of the years of experience accumulated, craftsmanship teaches the pursuit of improvement and that mastery is not static; rather a continual work in progress. You cannot refill your cup until you have emptied it of its contents.
Do not be afraid to fail. Failure is nothing more than an opportunity to improve. Embrace failures as learning experiences instead. If you cannot fail, it is likely not worth doing.