Craftsmanship of any kind is a tiered approach to gaining mastery at something. Software craftsmanship, besides producing products that are at the highest standard, goes beyond the product to the people. The craftsman at all levels, his client, and the end users of the software are all important parts of the process.
Becoming a craftsman is journey that starts with an apprenticeship. Apprentices learn from journeyman, who were once apprentices themselves. Journeymen that take on an apprentice are usually a couple of years removed from their apprenticeship, and would be currently working below a craftsman. The craftsman will have been a journeyman, and an apprentice before that. He has been working towards mastery for many years through practicing his craft and learning from the people who were previously in his shoes.
The process of becoming a craftsman is not something that can be undertaken with haste. Learning anything to the point of mastery requires time on the keyboard in addition to a constant thirst for information. A master craftsman will have worked on many projects and have been the leader of many teams.
The idea of craftsmanship is the idea of bringing up new talent into a constant environment of support. That is not saying that the relationship is as that between a teacher and her student. The apprentice is not being taught, but rather guided. Apprentices are self driven and curious and should be the drivers of their own learning. An apprentice’s mentor is there to review the apprentice’s work, correct poor form and lead him to discovering solutions to his blockers.
Besides the relationships between craftsmen and their mentees is the relationship that software developers maintain with their clients. Client relationships are so important in the context of software craftsmanship because of the nature of the workflow of craftsman developed applications. These applications feature the same people following the project through from inception to launch and are intimately familiar with the ins and outs of the project. They will be working closely with the client through changing requirements, continually delivering and soliciting feedback.
A craftsman takes responsibility for his work, in both its successes and failures. It is his reputation that he is placing on the table, taking ownership of what he is producing. This is an important feature of a craftsman-client relationship because the client always knows with whom they should be communicating. They have a direct line to who is working on the project.
During a project, a craftsman will often need input from the end user. Where the end user is the client, this is easier to facilitate, however when the end user is a third party for which the software is being produced, it is still important that this user input is measured. Having this connection will help to produce the most relevant product.
In conclusion, software craftsmanship is just, if not more, about people as it is product. Facilitating learning and bringing up the next generation of talented programmers is a centerpiece of this idea. Creating lasting and productive relationships among craftspeople and with clients and end users is integral for the creation of meaningful software.