In Defense Of The Software Craftsmanship Concept

craftsmanship I saw a great share (by @jurgenappelo) a little while ago in my Twitter stream (I am so glad that I got a new twitter account, I can actually keep track of my stream now). It was a post by Krishna Kumar on his blog Though Clusters regarding his views on the problem with the software craftsmanship concept. Now, I am a big believer in the idea that software development is a craft and that you can hone your skills and become increasingly good at it year after year (i.e. become a master craftsman in time). While I could see where Kumar was coming from with his post and while it certainly might appeal to the vanity of the younger developers out there (myself included I guess), I am forced to disagree on several important points.

Firstly, it is certainly possible for a young developer to create great tools, products etc. and do something more experienced developers did not. But this has nothing to do with craftsmanship, it is all about having a great idea and having enough drive (and yes even talent) to make your idea a reality. This is entrepreneurial spirit, it’s capitalism, and while your new idea may appeal to the masses, it does not stop the code behind your idea from being a total mess. Craftsmanship does not even come into the picture.

What about all the new technologies and tools that are available to the young developer? Thing is, all these technologies are also available to the older developers. This industry does not reward resting on your laurels. If an experienced developer, stops learning and improving, he is pretty much guaranteed to become outdated in short order. But, no developer who aspires to be a craftsman would ever allow himself to stagnate and therefore they are just as well equipped with all the latest tools and trends as the youngsters The difference is, they have years more experience learning to be a craftsman in their profession and so their ability to apply these new technologies and skills is that much greater.

The interesting thing about our industry is that truly new and innovative ideas don’t really come along all that often. Most of the time the ‘flavor of the months’ technology is not a breakthrough, but is instead just an updated execution of an older concept using all the latest widgets and buzzwords. If you’ve been around long enough (I don’t mean just existing I mean proactively in the thick of things learning your craft) you start to see the parallels and patterns and so your ability to use and abuse these ‘new’ technologies is almost infinitely greater than someone who is seeing the concept for the first time.

What about simply writing clean, nice code and doing it quickly and well. While I would love to say that anyone can do it no matter how ‘old’ they are, I would be lying if I did. Any developer who has ever looked at code they themselves wrote 1, 2 or 3 years ago will tell you that this is one skill that you can hone and improve until the day you, errr – become a manager (don’t bite my head off, i am only kidding :)). The point is, having a skill that you can continue to improve for as long as you’re able is the very definition of craftsmanship.

What about soft skills, I mean, being a developer is not all about technology and writing the next Facebook or Twitter. Some of us need to work in teams, communicate with customers  and managers, be able to give and take feedback, be able to mentor and be mentored etc. Sure some people have these skills naturally but they are the exception, the rest of us learn this over time and hopefully get better at it (although many never do). And here once again an aspiring craftsman will have an advantage over the freshly minted youngster. This is not only true in our profession, but in any field, soft skills take years to develop.

And so I come to my final point. One of the great things about our industry is the possibility that as a relative junior you have it in you to create something truly remarkable and will appeal to many people. It is also one of the great problems that our industry faces because things that appeal to the masses inevitably become products and teams of more experienced craftsmen (and women :)) come in to work on these products. At which point they start fighting a loosing battle against the software that in many cases is spaghetti code. Badly designed, badly put together without any regard for the patterns and practices that some have been trying for years to instill into the zeitgeist of our industry. It is both the beauty and the curse of software that something which is constructed and designed so badly, can bring so much value.

My great-grandma always used to say that you don’t carry knowledge around in a backpack, meaning that more knowledge is never a burden. It might get outdated, but it will never be useless, the lessons you learn are always applicable you just need to see how to apply them. Becoming a master craftsman developer is all about learning how to apply everything you know to your current problem, the more you know the more angles you see, which lets you come up with more elegant, cleaner, faster, better solutions. It is possible for people without the same experience to come up with the same solution, sometimes it will be by accident, other times they will simply be exceptionally talented people. These however will be rare cases and will certainly not be the rule. This is why I try to learn something new every day, try to increase the depth and breadth of my skills, not just in software but in general, it all helps. I would encourage all young developers to foster the same attitude, not because you want to join some mythical elite but simply because you want to be as good as you possibly can be at what you do. And I guarantee that no developer who aspires to be a craftsman would ever lord their skills over those more junior (or less skilled). You don’t differentiate yourself based on years in the industry, you differentiate yourself on your attitude, your passion, your knowledge, your insight and your expertise – experience just tempers all these and makes them more potent. But if you never had these (or tried to develop them) in the first place, no amount of experience will help you find them. That’s what the concept of software craftsmanship is all about.

And just as a quick addendum to the above, I am a 27 year old software developer, so don’t think that what you read above is a dinosaurs view of the world (even in software 27 is not that old :)).

  • Thanks for discussing my post. Basically, my only grouch was against the definition of the term “craftsmanship” as defined in historical terms. But, I totally agree with you if you decide to define it as you did in your post:
    > no developer who aspires to be a craftsman would ever allow himself to stagnate
    > no developer who aspires to be a craftsman would ever lord their skills over those more junior

    In real life, while (1) above is practiced by most self-respecting programmers, (2) not so much. There are many reasons, but one would be that most craftsman believe that they know better than juniors. You can see this attitude in discussion groups, forums, etc. I would like to see a greater trend towards teaching, mentoring and humility.

    • We definitely agree on that score, there should indeed be more mentoring in software. In my opinion you can’t really aspire to call yourself a master craftsman until you learn how to pass your knowledge on to others. I doing so you not only become better at your craft you also perpetuate your knowledge and make the whole industry better as a result.

  • Great thoughts. When I read the original blog post, I had some of the same thoughts as you. You’ve definitely put them down in a much more coherent and understandable way that I could have. Thanks!

    I’ve had the opportunity to work with some people whom I consider masters, and all the points you put forward ring true when I think about the time with them.

    Thanks again for a great post.

    • Thanks for reading and I am glad you liked it.

      To be honest I was pretty happy with it myself after I wrote it :)

  • Mitch

    What you might be describing is a code of ethics. Professional Engineers, including licensed Professional Software Engineers, at least here in British Columbia, Canada, require that you pass a Professional Practice Exam and take courses on law and ethics.

    You can also get a degree in Software Engineering in BC: I know is becoming more prevalent in the United States as well. e.g.

    When you become a licensed Professional Software Engineer, you join the ranks of other professionals where you are liable, at least here in Canada for the software designs you seal and can even have your license revoked. Personally, my belief is that software engineering is professional practice.

    • A code of ethics is certainly part of it, but it is just a part of a bigger whole. Being licensed or unlicensed takes nothing away from what I said about craftsmanship.

      Craftsmanship goes beyond some legal responsibility to do a decent job. It is about having some professional pride in what you do, it is about trying to be the best that you can be in your profession (forgive the sappiness). It is about holding yourself to your own internal set of standards.

      You can be a certified java programmer, but that doesn’t make you a good java programmer, or knowledgeable about the language, or give you the ability to write good clean code, or give you any knowledge about other tools/frameworks you might need to use in your job. All it says is that you passed a test of some sort, but it does not make you a decent software developer. It is the same with being licensed software engineer.

      Of course being licensed or certified certainly does not preclude you from being excellent at what you do either (i.e. a great craftsman of your profession).

  • Thanks Alan for the insightful post. You have articulated your thoughts really well.

    While reading your post, I get a feeling at places that you are implying, “Younger developers are less experienced and will probably write spaghetti code”. In your post itself, you’ve rightly highlighted that: “You don’t differentiate yourself based on years in the industry, you differentiate yourself on your attitude, your passion, your knowledge, your insight and your expertise”.

    One had to be careful with 10 year experienced people coz they might have 1 year of experience repeated 10 times. Its the quality of experience over the quantity of experience. Quality of experience comes from practice, a lot of intense practice (not just talent). Practice on real world projects, practice on pet projects, practice doing wild things and breaking all rules, pushing the boundaries and so on. (For Ex. if you look at Ward’s FIT code, he has broken most of the OO rules. Good, bad or ugly, I’m sure he learnt a lot of lessons.)

    I see 2 main problems with the way people define/explain the whole craftsmanship model:

    1). You need more than one master to really become a master craftsman. (Some people have the impression that you can be a journeyman under one master and you’ll become a master craftsman. IMHO you can’t.)

    2). Don’t be blinded by your master, look beyond and try things on your own. One has to invest time to break all the rules the master has put forth to truly understand the gravity of the subject.

    While I think the craftsmanship models does imply the above points, most people I feel discount this part.

    • Naresh, thanks for your comment, I appreciate it. It was not my intention to imply that younger developers will write spaghetti code due to their inexperience. What I was trying to say is that the capacity to write crappy code is there in all of us, young or old, experienced or not. It is the aspiration to craftsmanship that will hopefully prevent us from doing so.

      You’re of course correct there are plenty of people with years of experience who have the same experience many times over. I completely agree with everything you say about experimentation and pushing boundaries. Trying out different things is the best way to find out what works and what doesn’t.

      I also agree with both the points you make in the end. It can be invaluable to draw on the experience of multiple people (teachers). And noone has ever become a master by mimicking an existing one, at some point you have to develop a style of your own.

  • ronald

    “You don’t differentiate yourself based on years in the industry, you differentiate yourself on your attitude, your passion, your knowledge, your insight and your expertise – experience just tempers all these and makes them more potent” – I will definitely use this quote , good article…..

  • Pingback: 乱象,印迹 » 【翻译】我为何爱读代码?你为何也应当爱?()

  • Justine

    Sir Alan is that true that to develop your skill in software like VB will it take year to master or it depend? I’m a beginner but eager to learn..

    • Most skills take a little while to learn but many years to master, there is a great article by Peter Norvig about becoming an expert programmer, here it is:

      Have a read, I keep meaning to write something along the same lines myself.

  • Pingback: blog links | aLwaysUs()