Software Craftsmanship


I first learned about software craftsmanship from Corey Haines, when he talked about it at OpenAgile Romania 2009. I’ve noticed many times that entering a movement depends a lot on who explains it to you, and Corey was the perfect person to do that. For those of you who don’t know him from his travels, speeches, classes and tours, he’s an easy going, soft speaking guy who’s very strict about professionalism.

I found the idea of software craftsmanship to be what I was looking for when I was trying to explain to developers what they don’t do well. I’ve understood at the same time what I don’t do well, which is at least as important. So you can fairly say that craftsmanship showed me a way of bettering myself, and that’s what we tried to do for other people as well, through the AgileWorks community. You could also say that the way I see craftsmanship has been deeply influenced by Corey’s views.

I discovered that one of the things I used to do in the wrong way was a certain bitterness and arrogance when explaining to developers that they’re not doing the right thing. I understood afterwards that I have to learn a lot of things and that any developer is doing something right. This lesson was part of a larger one, the lesson that adding value is much more important than bickering. There are always things that annoy, things that create negative emotions; I’ve learned that I need to ignore them and to focus on the things I can do to add value.

It’s thus fair to say that my encounter with Software Craftsmanship changed my life for the best and therefore I’m deeply involved in this movement and strongly connected with its values.

I’ve told you my story so that you can see that at least I’ve got real value from this movement, to a level that’s unexpected from something focused on learning how to develop better software.

What’s that craftsmanship thing about?

First, there’s a manifesto that extends the agile manifesto:
As aspiring Software Craftsmen we are raising the bar of professional software development by practicing it and helping others learn the craft. Through this work we have come to value: Not only working software, but also well-crafted software Not only responding to change, but also steadily adding value Not only individuals and interactions, but also a community of professionals Not only customer collaboration, but also productive partnerships That is, in pursuit of the items on the left we have found the items on the right to be indispensable.
The manifesto itself talks about a few things:
  • Raising the bar of professional software development
  • Deliberate practice
  • Passing on the craft
  • Well crafted software is indispensable for working software
  • Community of professionals
  • Partnership with customers
The wikipedia entry on software craftsmanship takes the things a little bit different:
Software craftsmanship is an approach to software development that emphasizes the coding skills of the software developers themselves. It is a response by software developers to the perceived ills of the mainstream software industry, including the prioritization of financial concerns over developer accountability. … The Software Craftsmanship Manifesto extends and challenges further the assumptions of the Agile Manifesto, drawing a metaphor between modern software development and the apprenticeship model of medieval Europe.
Personally, I find the wikipedia entry to be a little bit off-track, since it implies that the movement doesn’t care, or cares less, about financial concerns. This is wrong; the movement actually tries to create an environment where software development is more predictable and gives better results. The movement’s focus is about developers “raising the bar of professional software development”. Pragmatism is maybe not stressed enough in the manifesto, but it’s a living value in the community. If we go back to the ideas expressed in the manifesto, I think we can easily collapse them to two. The movement is about:
  • Developers becoming better professionals through learning, alone or in the community
  • Developers working in partnership with customers

What should someone learn to become a better professional?

One of the difficult things to grasp about software craftsmanship is that it’s not a prescriptive community. There are a few practices that it promotes, but the thing you should focus on is continuous learning rather than “I need to learn X because Y says so”. Craftsmanship is a path, not a destination. The practices and knowledge promoted currently by the community are:
  • Test Driven Development
  • Pair Programming
  • Clean Code
  • Being proficient with your editor
  • Use the keyboard effectively (know the shortcuts and use them, know how to type correctly)
  • The history of software development, and about personalities like Ward Cunningham, Gerry Weinberg, Robert C. Martin, Kent Beck and many unknown people who’ve influenced the way we do software.
I would argue that the power of this community is that it builds upon the experience of many developers who’ve tried various things. Therefore, I find this to be an excellent list of things to learn. It may (and will) probably change in the future. Hopefully, it will transform into a body of knowledge that can be passed on to new developers.

How to learn

There are many ways of learning: reading, going to a class, talking to other people, and all of those are good. However, some are more effective than others. That’s why there’s one thing that the manifesto stresses in terms of learning, and that’s practice. The ways to practice which are promoted in the community are:
  • Code Retreat – one day of practice in pairs; full description here
  • Coding Kata – practice by yourself; read about them here or here
  • Pair Programming with other people (that you may know or not) – like Corey Haines or myself
  • Coding Dojo – practice in a group for a few hours; read more here
All of these modes of practicing have something in common: they’re actually manifestations of deliberate practice, the technique that’s currently proven to be the most effective at improving skill. A good description of deliberate practice is:
Deliberate practice is a specific and unique kind of activity, neither work nor play. It’s characterized by several elements that together form a powerful whole. The greatest performers have consistently combined these elements, sometimes just by luck. You can read details about deliberate practice in this excellent article.
Therefore, while you can learn in many other ways, these are ways that have been shown to be very effective for many people. Again, this list may and will change in time, as the community discovers other ways.

How to be partner with your customers?

I feel that this aspect is insufficiently discussed in the community nowadays. A partnership requires rights and obligations, mutual trust, courage, working together with your customer, understanding what he needs and why, giving him better ideas and letting him know what’s possible and what’s not. There’s always been a large gap between business and development, and there’s still no clear way to bridge it.

One way I think might work is to create a practice environment where the developer team is also on the business side. I’ve participated as mentor at GeekMeet24, which was a 24 hours software development event where teams had to build a working product. With proper guidance, such an event can be an excellent way to learn about the business part of software development.

So that’s it with my take on software craftsmanship. Still, there are a few frequent questions that we get, so let’s talk about them.


How do I become a craftsman?

The short answer is: you call yourself a craftsman.

This question usually comes from people who see craftsmanship as a kind of certification program. Craftsmanship is the road to professionalism, it’s not the destination. If you want to call yourself craftsman, go on, but I don’t think it’s more valuable than calling yourself in any other way that sounds good at a certain time.

I’m sick of buzzwords!

I’m sick of buzzwords too. Still, buzzwords are those words that are meaningless and thus provide no value.

If you read carefully this article, you’ll see that I focused on the value that the community and the ways of practicing create. Therefore, I don’t think it’s right to call them buzzwords. However, I’m sure they will become buzzwords as soon as they are adopted by marketing. Like “our team of craftsmen did X and Y”, “certified software craftsman” etc. The values however are important, and I for one will stick to them. It’s your choice if you do it too.

Why should I write tests?

This question has a longer answer than I can write here. But I’ll try a very simple answer. When I was in primary school and learned addition, I had to solve the exercises in the following way:

Q: 2 + 2 = ?

A: 2 + 2 = 4

Check: 4- 2 = 2. Correct.

This way of thinking takes into consideration the fact that people make mistakes. Now, why do software developers think that they cannot possibly make mistakes anymore?

It’s more important to deliver than to waste time writing excellent code

That’s why you should learn how to write excellent code without wasting time. This is professionalism. You can acquire the necessary skills through deliberate practice.

So you know now what to learn, how to learn and you get the possibility to learn (look for Code Retreats around you or organize one yourself). What’s stopping you?

Should I learn at my job?

You should apply at your job the skills that you’ve acquired through practice. Musicians don’t practice on stage, they perform. Your job is to perform.

I don’t have time to practice

In most cases, people can find time if they have enough will. Take my case: I don’t watch news anymore. I don’t read RSS feeds. The time that I spend watching TV has decreased to a few hours per week. I still play video games from time to time, but a lot less than I used to. I still go to movies whenever something good is on. The time that I obtained in this way allows me to read, write, learn, travel and talk to other people, and I very rarely miss the times when I was playing games and watching TV for tens of hours per week. In fact, I feel much better about myself now. I would thus encourage you to try to change the way you organize your time, little by little. The transition may be hard, but it’s worth it. Should you make this effort? That depends entirely on you, but remember that skill is only acquired through practice.


Add comment Reflections on design, craft and software

A new home for merging ideas about design

It is my strong belief that software design can learn a lot from other design disciplines. I wrote blog posts, a book and did talks on this topic, and it was time to group them all together. These ideas have now a new home: My plan is to add more blog posts there, and to involve other people doing work in this area.