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?
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 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?
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.