You know what, just to set a good example I’ll answer the question first. How does that sound?
To me there are several layers to this concept of software craftsmanship, bit like with ogres. There’s a personal aspect to it that for me consists of different character traits. If I think about the craftsmen of old I think about people that are enormously patient because it takes a lot of practice to become a craftsman. You need to be strong and have a lot of willpower to be continuously trying to reach a new level of quality. As craftsman you always strive for excellence. You are proud of the work you deliver right now. While at the same time learning new skills and experiment with new ideas because you can always get better.
Next to the personal aspect there’s also a social one. From my point of view a craftsman is somebody who is well respected by the community he is a part of and works hard to earn this respect and trust from the people he works for and with. I also believe that a craftsman loves to share his passion and experience with others. While in the old days this was mostly done in guilds that were pretty well shielded from the outside and most of the time you had a master – apprentice situation. In software craftsmanship I personally believe there could be a lot of merit in using this concept as well. Just imagine starting a new job and having someone as your personal mentor. Someone who is your dedicated guide in this new area. Wouldn’t that make things a lot easier?
Apart from the master-pupil concept I believe software craftsmanship is also about the community. People helping each other out in whatever way possible. Discussing issues or ideas through social media, getting together for a beer and challenge one another to try out even more crazy things.
A good craftsman can work magic with any tools he can find. He will just be even better when using the best tools for the job. And I want to emphasize the “best tools for the job” part in that statement. There is no one tool to rule them all that is the best one for all challenges. The MacGyver myth that you only need a swiss army knife doesn’t really work in software development. I’ve spent some time trying to figure out what the basic building blocks of the tool set of a software craftsman are. And I came up with a couple of things. Any form of continuous integration and automated testing feels like the basic starting point. Apart from that you probably want to look at development techniques like TDD, BDD and DDD. I’m not saying that you can’t be a craftsman if you don’t master any of these techniques. They will just help you in your endeavor. Ever since I started facilitating coderetreats I felt the urge to start broad basing my knowledge of programming languages. I don’t have to be master in all of them. I just want to get the basics of some of them. I think it’s important to have a broad base in techniques and languages. Although your expertise will be pretty narrow in most cases, the broad base will help you to reach even higher levels of expertise in your own field.
One of the most important aspects of being a craftsman to me is also knowing when to say no. You are always in control of your own work in a direct or indirect way. In the old days when a craftsman didn’t have the right tools, he would go look for them. He was in charge of his workshop and he decided which work he would take on and how he would go and work on it. He was in total control of the work process and the environment he worked in. How many developers can say that? Just think about it for a minute. Are you really in control of how you do things? Are you able to choose your own tools? Are your basic requirements for doing a good job met? If you feel like you don’t have control over your workshop and your tools, how are you suppose to deliver the best result you possibly can? Maybe it’s time for you to say no and reclaim your honor and pride.