What is software craftsmanship?

Learning to Write Software

Many programmers are, basically, self-taught. I dunno about you, but I taught myself to program as a young kid. I loved it. The endless challenge to bend the machine to my will. The elation when after hours of trying you get over some seemingly insurmountable hurdle. That was it: I was hooked.

Eventually, I went off to university – hoping to learn to do it properly. University taught me many things: first order logic, queuing theory, compiler design, distributed systems. All very interesting theoretically. Only the last of those has ever been any use to me in my professional career.

The trouble is, writing commercial software really has very little to do with computer science. Sure, algorithmic complexity is great to know about, but I don’t need to understand the difference between linear time and polynomial time complexity to see my code running dog slow when I give it large inputs.

Calling what we do “computer science” is like calling cooking “knife science”

You need to know how to handle a knife to cook, but its so much more than that. Cooking is part science, part art, part judgement. I think programming is the same. Great software is a product of enough computer science, creative design decisions and pragmatic judgement calls. Some of the science is taught in school; but what of the art and judgement? How do new programmers learn their craft?

Craftsmanship

In most jobs with innate knowledge, learned skills, hard-won rules of thumb – the only way to learn, the proven-over-centuries way to learn is by learning from those more experienced than you. This is craftsmanship. The young apprentice finds a master craftsman to learn from; after many years the young apprentice himself has learnt these skills and is now ready to pass them on to the next generation.

Does this happen in software?

Mike Cohn made a comment recently that “nobody wants to be a programmer past 30”. This scares the hell out of me. If programmers are all moving on to become agile coaches, consultants, managers or big-A-architects – who’s educating the next generation? Is all our hard won knowledge to disappear? And be re-learnt every time?

Maybe I was lucky, I can point to great teachers in my past. If I’m any good at my job today, its because I’ve worked with some great people. They helped me improve my knowledge, pushed me to new levels of understanding – to really know what it takes to craft great software. I have a feeling this isn’t common. I’ve been in many other jobs where I’ve not met great teachers. I suspect there are many developers that never encounter a great teacher in their entire career.

So I like the idea of software craftsmanship. I like the idea that developers should always be improving their craft. I like the idea that experienced developers pass on their tricks of the trade, their experience, the reasoning behind their decisions. But how do we encourage this idea? How do we unite programmers behind the idea of continuously improving our craft? What we need is some kind of manifesto.

The Manifesto

The software craftsmanship manifesto is great; but I’m not sure it really inspires me. It smacks too much of motherhood & apple pie. Sure, it encourages me to “raise the bar”. But, besides some notion of continuous improvement, it really doesn’t say anything!

Compare this with the agile manifesto, which does a great job of setting out its vision. It’s clear what agile is, but critically some of the things agile isn’t. Sure, customer collaboration is great – who wouldn’t want that? But the most common obstacle to it is contract negotiation. So right there it points it out, if I want to be more agile, I should try reducing my company’s dependency on contract negotiation. The manifesto helps me understand how I can become more agile – that’s inspiring.

But what do I have to do to become a better craftsman? Is it really enough to encourage developers to steadily add value, to write well crafted software?

Ok, we’ll just write better software then. Great suggestion! So am I a craftsman now?

Isn’t the real problem looking at why developers don’t do this. What’s stopping us from crafting great software?

What craftsmanship isn’t

Software craftsmanship requires pride in your work. But its not enough to just be proud of your work. I could be writing crap code and still be proud of it, if I don’t know any better.

Software craftsmanship isn’t about getting a tick in a box. Craftsmanship is a mindset; its the way we should be working. Its not something you can be – its something we should all aspire to.

Craftsmanship definitely isn’t about certification. I’m sick of all the certification. How many Sun Certified Java Programmers are there? I’ve met very few who were any good at their job. Conversely I’ve met many great programmers who didn’t bother with Sun’s certification schemes. Certification is no indication of competence. In general, I find the exact opposite: people who need certification are trying to prove they’re not crap at their job. Fail.

Or there’s the Certified Scrum Master. Everyone and their aunt is a Certified Scrum Master these days. The scrum certification schemes have become ridiculous. Does anyone believe it’s anything other than a bandwagon, a fad, to further the agile brand and make everyone a shit load of money in the process? When everyone is a CSM, how does that help companies hire? How does that help developers demonstrate their experience and knowledge?

Because that’s really the key issue here, isn’t it? How do programmers improve their craft? How do they demonstrate to companies with myopic hiring processes that they’re good at their craft? How do hiring managers wading through endless Sun Certified Java Programmer CVs spot the great craftsman?

The people

In my mind, software craftsmanship is all about the people not the software. I think any good programmer can become a great programmer, with the right help. But who’s providing this help? How do good programmers find it? I think software craftsmanship is about identifying master craftsmen; its about helping apprentice programmers find their own great teachers.

The only way to get better at programming is to do it. The best way to learn is to have your mistakes pointed out to you. This means you need a mentor; someone that works with you day in, day out. Software craftsmanship is about continuous feedback.

If I had to put my belief about craftsmanship into a pithy statement, I’d say software craftsmanship is about:

  • Competence over certification
  • Pragmatism over specific processes
  • Mentoring over training

What do you think? What does software craftsmanship mean to you?

Post your views in the comments; or if you’re based in London come along to the first London Software Craftsmanship Community meeting, date & venue to be announced real soon now.

Advertisements

8 thoughts on “What is software craftsmanship?

    1. Thanks! Nice article – seems we have pretty similar views (good to see I’m not way off the mark!)

      Absolutely agree about pragmatism – its a critical (I think) but often overlooked aspect of craftsmanship.

      The importance of deliberate practice is an interesting one – those activities are definitely valuable in improving your craft. I’d kinda come at this from an on-the-job improvement angle; but you’ve got me thinking now how important deliberate practice is *as part of your job*. I wonder how many companies actively encourage developers to attend dojos and the like?

      1. I can only say about the Romanian companies, which I know well.

        Usually the developers choose to come to code retreats and coding dojos, not the companies. I know of people who organized such events inside companies, but they weren’t received as they should.

        I think that we are in a phase when developers have to realize that they can improve. When and if a critical mass of developers decides that they need to improve, things will change. But not sooner.

        I may be wrong and companies may realize that they need developers who have a certain level of professionalism. I have big hopes with regard to startups, especially lean startups taking on Customer Development, who place learning at the core of their day by day activity.

        Anyway, working with those people who want to improve, on a Saturday (for free) is amazing. (you can read more on this topic here: http://www.alexbolboaca.ro/wordpress/articles/how-to-organize-a-code-retreat).

  1. Jonas

    Well put Dave!
    Can definitely confess to having learned things this way: courses and seminars might have inspired me and they still do, but hard lessons and knowledge I can put into action come from mentoring and tons of real experiences.

    I also play guitar, I can in some ways compare this, since becoming a great guitar player is beyond “I know all the scales”. It’s loads of experience in different bands, different environments, and meeting other great guitarists, that makes anyone good. There is no “get good in 3 weeks” cheat course.

    Any advanced skills are best taught this way, for sure.

    Hm, you can in a sense tell who’s gonna be good by seeing if they know how to grow. Tons of certs: meh… Come to a company because they think they’ll get to work with lots of clever guys: ah!

    1. You mean there’s more to it than Learn to Play Guitar in 24 Hours? http://www.amazon.co.uk/Learn-Play-Guitar-Hours-Book/dp/1846095131/ref=sr_1_1?ie=UTF8&s=books&qid=1284462286&sr=8-1
      Damnit! hehe

      Interesting comparison, though. Something artistic like playing the guitar has a similar mixture of technical skill and experience-guided judgement. I think your point about variety is really interesting. Becoming a great software craftsman means working with different types of code base in different types of company.

      Absolutely spot on about how you tell if someone’s any good. Enthusiasm and a desire to learn are a much better indication of competency than certifications.

  2. Nice post 🙂

    Regarding the third point in that “manifesto”: mentoring over training, I would specify which kind of training you are talking about. A passive one?

    I mean, the best developers I’ve worked with were those ready to happily spend some bucks every few months in a good software development related book. That is “active” training. Furthermore, some of them also have coding dojos or retreats in their agendas to spend a whole saturday, for instance.

    Those guys rock and it is obviously not a coincidence 😉

    Regards,
    David

    1. Thanks!

      Great question. Thanks for taking the time to reply. I very nearly wrote “learning” instead of mentoring, but that doesn’t quite grasp what I’m after either. Perhaps if I’d said “Continuous learning over training courses” that might have been closer to what I mean.

      You’re absolutely right, the best developers are those that are self-motivated to improve themselves – whether through reading books, attending dojos etc (or even paying for their own courses!)

      However, really what I’m getting at, is that learning through doing, through spending time writing code and having feedback in a good teaching environment is what’s critical – whether that’s a dojo or a work environment that encourages constant feedback. That for me is learning and mentoring.

      As opposed to people who are always asking to be sent on this course or that course, always at their employer’s expense. Too many training courses now have become CV trinkets. People collect them to make their CV look better, not because they actually *learn* anything.

  3. I’m working in IT Operations but the same principles apply. But the issues are sometimes more acute. Whatever you put off today, can come back within a week. And it will be the customer on your back who won’t go away when you restart the server…

    I’d be interested in some metrics to calculate ‘Technical solvency’ in my department.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s