Programming is not a craft

TL;DR

Software Craftsmanship risks putting the software at the centre rather than the benefit the software is supposed to deliver, mostly because we are romantics with big egos. Programming is about automating work like crunching data, processing and presenting information, or controlling and automating machines.

Non-programmers don’t care about the aesthetics of software in the same way non-plumbers don’t care about the aesthetics of plumbing – they just want their information in the right place or their hot water to work. (Although it’s fair to say they appreciate decent boiler controls.)

Motivation for software craftsmanship

It would be great if programming were a proper profession, but it isn’t. A profession has a structured model for advancing through levels of skill and ability, be it studying for a law degree and articles (working for a legal practise) or the years of undergraduate and medical training a doctor undertakes before specialising. The latter has clearly-delineated ranks, from junior doctor, via a brutal regime of 80-hour weeks, to consutant.

Conversely there is no minimum entry requirement for programming. Some people naturally have a flair for it (two of the best programmers I know never went to college), some teach themselves out of books, others just tinker until they get something working. A programmer’s skill and ability is only as good as their personal reputation: there isn’t an accepted, transferable ranking like there is in a “proper” profession.

To illustrate how low the bar can be, the mission statement of Visual Basic (whether explicit or not) was to democratize programming. Anyone who could drag and drop controls around and understand a modicum of technical stuff could throw together a solution to a problem with relatively little effort. Wizards and other utilities enable power users to create sophisticated spreadsheets in Excel with no practical programming knowledge. Language guru Erik Meijer has spent the last few years talking about democratizing the cloud, i.e. making it as easy to string together online services and utility computing as VB made it to string together other applications. In other words, there are people actively working to lower the already low barrier to entry for programmers. (These are Microsoft-specific examples, but then Microsoft has done more than most to dumb down programming, or make it accessible to the masses, depending on your point of view.)

The IT industry is relatively young – only a couple of generations old in fact. (As an experiment, go and find out how many of your coworkers have a parent who worked in IT. See?) It is also something of a gold mine. Compared to a lot of industries it is relatively well paid indoor work with no heavy lifting, and remember the thing about no minimum entry requirement? This means entire economies have grown up looking at IT as a numbers game: if you throw enough bodies at a problem you should be able to make it go away, and if you can get bodies for cheap enough (yet still relatively well paid compared to the alternatives) then you can throw a lot of bodies at a problem.

I spoke to someone once who told me he was currently engaged in a public sector project to provide online tax credits for builders. As a builder you would have an account online where you would log in and buy tax credits that were offset against your end-of-year tax bill. In other words, it was a site that had user accounts and a (third party) card payment facility, and not much else. This project had 400 programmers working for three years. That’s more than a person-millennium of effort. For a web app! That I’m paying some consortium for out of my tax money. But that’s a rant for another day.

So from a purely demographics perspective we can see that the vast majority of people in the IT industry are there because a) it’s a well paid alternative to other white collar office work or even manual labour, and b) there is no incentive to make it anything other than a commodity numbers game.

Then there are the others. The minority of people who genuinely love programming and choose to excel at it. They understand software development is a skill, in fact a whole portfolio of skills: understanding and modelling a problem domain, understanding programming languages, libraries, paradigms and idioms, choosing which to apply in a given situation, learning and understanding algorithms, mastering the “path to production” (build, deployment, release), monitoring and availability, process automation, Lean theories of supply, production and product development, utility and cloud computing, concurrency and parallelism, I could go on. Those guys want a way to differentiate themselves. The oft-quoted figures of tenfold increase in productivity of expert versus novice programmers are wrong by orders of magnitude in my experience. A really great programmer (and I’ve been lucky enough to work with a handful over the years) can out-perform a doing-it-for-the-money programmer by orders of literally hundreds, delivering in hours or days what would take an average developer weeks or months.

How are those guys supposed to differentiate themselves? And how can they help others in the industry who have a real love and appreciation for the software they write? We need some sort of apprenticeship model, and a way to identify masters, both to apprentices and other masters. That sounds like the sort of model that craftsmen use. And it also appeals to the average alpha geek’s romantic streak, possibly incorporating a system of secret signs and handshakes.

The thing is, at one level software can be described by the utility it provides. It doesn’t matter how ugly it is under the hood as long as it delivers the goods. A programmer can show beautiful software to another programmer, but that’s where the appreciation stops for software per se.

Seeing the negative space

My wife is an artist, and one of the things she studies is negative space. This is the space between the obvious shapes or objects in a picture, as opposed to the objects themselves. An understanding of negative space is critical to being able to faithfully render a composition. As the model sits sideways on, notice the curved triangle bounded by the upper and lower arm and the side of the body. See how the space between the front of the face and the window frame in the background is nearly rectangular and quite narrow, and see how the outline of the nose creates a dent in the left-hand side of the rectangle. Look at the chin, actually the space below the chin, to observe the angle between the bottom of the jawline and the front of the neck. And through the window, notice the colour of the sky in the space between the winter tree branches. It’s different from the grey-white cloud above the trees. All of these shapes and colours – the space between the obvious stuff, the negative space – these are the shapes that determine how faithfully you represent the image on a canvas. But mostly you don’t notice them – especially in a good painting.

So what does this have to do with software? Well it seems to me the most succesful programmers I’ve encountered don’t craft software; they write software in order to move information around, in order to get something done. Information is the real deal – the software just defines the space that it moves around in. For those programmers, success is about getting information from point A where it’s currently languishing to point B where it’s going to actually be useful, as quickly and effectively as they can. Success in a UI is about rendering or capturing exactly the information that will be useful – no less and certainly no more – in a succinct, obvious way. The software is incidental, a detail, hidden away in the wings, and it is ultimately entirely disposable.

Why programming is not a craft

With a craft, the product has intrinsic beauty in its own right. A cathedral is really a big hut for people to meet in and worship. Make it from stone by all means, so it lasts longer than a wooden hut, but why all the fancy decorative stuff? Of course it is there to engender a sense of majesty and wonder, and cause us to engage the part of ourselves that appreciates beauty and magnificence, so we enter the cathedral reverently and humbled, ready to worship. What makes it a craft is the work above and beyond its basic utility to give it intrinsic, aesthetic beauty.

If I use the same stone to build a traffic bridge over a railway line, I care about its utility and structural effectiveness. If it’s a good, simple bridge I won’t even notice it’s there! We don’t notice most of the engineering that goes into the roads we travel on or the railways we use until something goes wrong! (There’s a really cool word for this phenomenon – when you only become fully aware of something when it fails – but I can’t recall it right now.)

There is a difference between the mindset of a master stonemason sculpting the expression on the face of a gargoyle and someone using the commodity blocks that make up a multi-storey car park. In the latter case the last thing I want is someone’s “personality” causing some of the blocks to be different sizes and no longer interchangeable, never mind the added expense of having someone manually hew the stone rather than using machine tools. In the former the stonemason’s attitude is indulgent. He is putting his signature (and his ego, and his reputation) into this magnificent representation of Hell’s best. If you just wanted an oil-pouring spout you could get one from a DIY store.

Software practitioners – especially, ironically, the good ones – often lose sight of this. They fall in love with the software itself and start thinking of themselves as craftsmen of software.

The easiest qualification in the world

So here’s my concern with the idea of Software Craftsmanship. It’s at risk of letting programmers’ egos run riot. And when that happens… well, the last time they went really nuts we got Web Services, before that J2EE. They convinced the British government that they wanted an uber-database to store Everything Ever About Everyone. You see where I’m going?

When I looked at the Software Craftsmanship Manifesto, something inside me died. (Something else inside me burst out laughing and told the other thing to stop taking itself so seriously, so we’re all better now.) Apart from being, well, bland, it is just so self-evidently an oxymoron. If its message is that we need to think of ourselves as software craftsmen and that this is somehow special, then what a spectacularly easy bandwagon it is to jump on.

Do I need to demonstrate any kind of skill? No. Any specific credentials? No. Any kind of experience working in the field? Nope (and as the Pragmatic Programmers are happy to remind you, ten years experience is very different from one year repeated ten times). In fact, all I have to do to associate myself with Software Craftsmanship movement is to fill in my name on the website. Woohoo! I’m now associated with the Manifesto of Software Craftsmanship! Is no-one else seeing the irony here?

The (original) travelling salesmen problem

Back in the day – while the West was busy being Medieval – Japanese warlords used to hire bands of mercenaries called Samurai to, well basically beat up other bands of Samurai. Your life expectancy as a Samurai warrior was usually pretty low, and dropped dramatically if you came off your horse. In such times the martial art of jiu jitsu was born. The premise with jiu jitsu is that you have come off your horse in battle: you are unarmed, outnumbered and your opponents have both a height and weapons advantage over you. You’re pretty much stuffed unless you can pull some cool moves out of the bag.

As Samurai moved around, hiring themselves out to different warlords, they would want to join the local martial arts school to continue their training. Now you can imagine, if you learn jiu jitsu in one dojo up to a certain standard (we’ll call it a black belt) and then turn up at another school, it’s pretty tricky to get any kind of calibration without involving some life-threatening fighting with the new kid. And without calibrating, you can’t know whether someone is any good.

Ever resourceful, the jiu jitsu schools developed a sort of dance, called the nage-ne-kata, comprising five groups of three techniques. For each technique you both execute the technique and have it done to you, to demonstrate not only your fighting skills but your falling and rolling abilities. All senior students would learn the nage-ne-kata, and if they went to a new school, the sensei would ask them to demonstrate it for them. It is still taught today in some ju jitsu schools.

You can tell a lot about someone’s jiu jitsu from their nage-ne-kata: how they stand, how they hold their stance, how they move, how graceful they are, how well they understand balance, how well they respect their uki (the partner), how well they roll and fall (and how quickly they get up!), whether they favour one side over the other, their spatial awareness. Just from one little dance.

Let’s be craftsmen then

So, back to the plot, I’m reassured by the kinds of people I see involved in the Sofware Craftsmanship movement, the likes of Kevlin Henney, Bob Martin, Corey Haines, Glenn Vanderburg. These are pragmatic, sensible, down-to-earth and above all genuinely humble people. My concern is that the glamour is overtaking the intent, as evidenced by the sheer number of people wishing to align themselves with the Software Craftsmanship movement.

I would love to see someone rewrite the Software Craftsmanship Manifesto in terms of getting results and delighting customers. I don’t want “steadily adding value,” I want “amazing their customers every day!” Software craftsmen should be egoless, humble, with a focus on the outcome rather than the code or the process. I’d like a call to arms to stop navel-gazing and treat programming as the skilled trade that it is.

No-one wants your steenking software – they want the capabilities it gives them, and they want those yesterday. (I’ll specifically exclude the User Experience folks. Theirs is genuinely a world of aesthetics and human understanding. They, to use a bricklaying term, do the face work – the fancy stuff people actually see.)

Maybe there should be a Software Craftsmanship Council, that confers membership in a collegiate yet transparent way, in just the kind of elitist model that desperately upsets the folks who have systematically dumbed down the education system in the UK (but that’s another rant for another day). You only get to join if those already there believe you will be a credit to the notion of Software Craftsmanship, just like Ph.D. viva boards do today.

A truly skilled programming team can deliver amazing business results in insanely short amounts of time. Let’s go after some of that! I want your experience. I want your knowledge. I want you to show me “the simplicity the other side of complexity,” to quote Oliver Wendell Holmes. It takes a real expert – a real craftsman – to see the elegant simplicity buried away inside the mess we call enterprise software, for instance, and tease it out.

Calling programming a trade takes nothing away from the desire for professionalism, experience and expertise. In the same way I want an expert electrician wiring up my house rather than a cowboy, I want an expert programmer enabling my business. What I don’t want, however, is a prima donna plumber who insists on talking about the elegance, beauty or art of plumbing, or who insists that I appreciate the aesthetic beauty of his joinery, or will “only work with other rock star plumbers, who only practise copper-driven plumbing.” The best software should be understated and unobtrusive (as, maybe, should be the best programmers). I don’t want to hear the clanking of information as it rattles from one poorly-implemented system to another, through ill-conceived interfaces.

So what now?

While I was formulating this article I made a few comments on Twitter about it and I received some interesting responses. One person suggested a programmer is a craftsman not unlike a silversmith. I would argue that the value of silver or gold jewellery is intrinsic to the jewellery. I don’t use the item for anything other than for others to admire its beauty (and by association my significant-yet-understated wealth and taste).

If we’re going to use gold or silverwork as an analogy it would be in something like a speaker cable, where the properties of gold contacts improve the quality of the sound. In this case, however, I want the gold connector to be identical to a cheaper one. If the cable manufacturer wants to demonstrate their aesthetic abilities, I’ll be a lot happier if they do it by making the cable look fancy than by messing around with the shape of the connector!

If you’ve read this far, then thank you. Now here’s what I want you to do. I do think there should be a Software Craftsmanship Manifesto, but not the thing that’s currently out there. I think it should be a call-to-arms, feisty, opinionated, brash and everything that a good manifesto should be (I’m channelling Kevlin Henney here). I also think there should be a way for passionate, skilled programmers to differentiate themselves from the mainstream commodity bodies, and also to recognise one another, and demonstrate their value to potential employers. What could that be, and how could we make it work?

As a buyer of software solutions, wouldn’t you want to know your systems were being built by master craftsmen rather than day jobbers? You’re paying for this and you deserve some kind of reassurance. Let’s figure out how to provide it.

247 comments

  1. Sounds to me like you’re just not that crazy about programming, which is ok and pretty normal, I think.
    However, some people do find programming beatiful. For instance, I was working through some connect-back stack overflow shellcode recently and quite honestly it blew my mind; I spent a decent amount of time last year working with the quake III code as was similaryly blown away.
    The ability of some artisans to reduce the myriad of complexities into a simple, elegant ‘kiss of death’ in code is quite beautiful. A sort of mathematical beauty.
    So, anyway, you lost me at that paragraph when you claimed coding couldn’t be a craft since it wasn’t beautiful.
    Nice thought provoking article, though!

  2. Software creation is still mostly organised in a way that alienates those that create the use-value from their product.

    Extreme Programming, being inspired, by radical libertarians, promoted a post-Fordist vision of an organisation that encouraged Socialisation, including: common ownership of code, collective development, horizontal and open (non)structures, worker autonomy, self-realisation, non-specific roles etc; that smashed Fordisms of: the division of labour, de-skilling, assembly-line production, alienation of the product, strict hierarchy and top-down decision making. It is ironic that the most advanced organisations in Capitalist society are Socialistic. As in pre-Capitalist societies the worker(developer) engages with the full product, and takes care and pride in his work. His craft. Test-driven development is a practice used by good craftsman.

    Class structures preserve themselves through schooling and certification. We cannot equate this with education. Paulo Freire, for example, informs us that we can teach basic adult literacy in a matter of days if we imbue words with a political meaning. You are correct in saying that software development is highly democratic, that favours the autodidact. The best developer on my team is a fine-art drop-out. Autodidacts are the ones that usually have a native interest in programming, and not those that see it as the new Law. Universities churn out graduates of “Business and IT” – that can’t program the basics. We can easily differentiate a good programmer from a bad programmer by speaking to them and looking at their code. Good code is code that is well designed and tested. Code that is not, will eventually not satisfy the customer you crave to satisfy. We must be aware, that we could easily form an Oedipal relationship with our customer, when it is just a matter of exchange-value. “Scrum Masters” are a perfect example on why we shouldn’t “professionalise” our work

    A craftsman does not solely create a thing of beauty – that is an artist (in its traditional sense). A craftsman builds something functional, that is beautiful. True humanity cannot be expressed in a programming language, and the Id is held back by the grammar of the language and Xp practices. In Freudian terms, Xp development practices are the Superego.

    In my view Software Craftsmanship is a continuation of the liberation philosophy of Extreme Programming, that attempts to de-alienate the developer from his product, himself and the working process. It believes that a human can realise himself in his working activity and that this personal satisfaction is something that others can also appreciate.

    1. nice !!

    2. oldfartdeveloper · ·

      Wow. You almost lost me. I almost thought you were saying one thing when you were saying the other. So you start by contrasting “Software creation is still mostly organized in a way that alienates…” from the next sentence “Extreme Programming…” but I didn’t read it that way at first; I thought you were linking them together.

      So after rereading 3 times, I think I get what you’re saying, and I agree (mostly) with it but I think you are missing an important component: the “socialization”. “Socialization” in your context sounds like a psychology/sociology term, almost contemptible. It causes your essay to skirt what I think is most important: “community”.

      It is this community of programmers that I’ve come to realize I’ve underestimated terribly in my long software career. Here’s the revelation: I’ve come to realize that my software contribution to my customer is directly proportional to my willingness and discipline to participate with my peers. Every day. Via pair programming, looking at their code, participating in user meetings, joining chat groups, etc. Why? Because my production is faster, higher quality, more enjoyable. Because I’m participating instead of being a loner. Because it doesn’t matter if I’m better/worse than the programmer next to me; if we work together (yeah, pair programming) then our work will be better than either of us do it alone. Because I discover what needs to be programmed faster. And on and on…

      In this process of self-discovery, I realize that I can’t be too humble. Ironically, humbleness becomes a discipline, because when I’m not, I start missing important stuff; my skills start miss-firing.

      But the real discovery is the realization of wanting the collective community of programmers to succeed. In life. In understanding. In skills. In every way. Myself included.

      All of this is maddeningly contradictory and exhilarating. I thank the Extreme Programming pioneers for yanking this space of ideas, of sharing, of participating, into existence that I missed in the 30 years before their manifesto came into being.

      Dammit, I’m rhapsodizing. I’ll stop before I make someone puke.

      Oh, and I do vehemently disagree with you on one thing: great computer languages are art, maybe even great art. I am energized by the pleasure I’ve experienced in working with languages like Smalltalk and Ruby that I have not been in the many other languages I’ve programmed in. Well, I take that back; the lowly C language had a similar effect on me when I ran across it several decades ago.

    3. Wow, this is an excellent post. Thank you!

  3. Sorry just another angle:
    Do you think a chair can be a piece of art?
    If I make the analogous relation between software and function that you propose, then making a chair a piece of art would be considered a pomposity.
    But some chairs are a piece of art.

    Forget about the bozo egos out there (rock stock programmers are idiots), your relationship to coding is about you, not those egos. Let yourself go, let yourself appreciate the beauty of the code :)

  4. Bas Hamer · ·

    Short version:
    The issue isn’t the craft, t’s the craftsmen. If people consider themselves craftsmen then tehy will consider crafting their main goal.

    Ask a silversmith for some symbol or trinket. And they will proceed to create one out of silver. They won’t tell you to buy one at Target, suggest that steel/gold/plastic might be better. If anything they will change the requirments so that it can be made out of silver.

    Craftsmen craft first, ask questions later.

    If you ask a service provider something, like a hotel valet, and you ask him/her for the same thing he/she will look at more options to find what is the best fit. because their focus of service provider is driven by customer interaction and satisfaction. Not crafting. So he might outsource it to a silversmith, or a goldsmith, or he might just buy one at Target.

    you want service providers writing your solution

    Now a service provider can be skilled at crafts, and they can use them to deliver a solution. But you want a service provider first, craftsmen second.

    Long version:
    http://bashamer.wordpress.com/2010/08/18/on-craftsmen/

  5. My problem with the software craftsmanship manifesto was that even a naive Waterfall developer who produces 2000 line classes with everything in the GUI might believe they meet the standards laid out in it for software craftsmanship. No dev would claim to be doing anything other than what’s in the manifesto, even if they have no clue about their trade. Part of that’s because of the “Not only… but also…” wording, which lets you sign up for everything under the sun.

    The Agile manifesto was genuinely a revelation because it explicitly valued practices which were unusual at the time over their traditional counterparts. I hear the call for something more feisty, brash and opinionated. I’d love to see something which calls out the real problems we see in the software development industry. I find by the time we get to the actual programming stage, the biggest problems have already happened. Hell, we’re lucky if we even got the right *project*.

    Anyway, here’s a story you might like. A master mason was carving gargoyles for a new cathedral, and spent hours putting the scales onto the gargoyle’s back, and making sure the folds in its wings draped beautifully. A monk asked him, “Why are you doing that? Nobody will see it!” The mason answered, “God will see it.”

    Stakeholder awareness. So important.

    1. Liz, I love that story.
      Dan, amazing post. Thank you!
      Olaf

  6. eddie kenny · ·

    Great article Dan, judging by the number of responses it has really stimulated some debate…… my tuppence worth can be found here : http://eddiekenny.blogspot.com/2011/01/software-developer-craftsman-or.html

  7. I personally think that doctors, lawyers, architects (in construction) are very bad to take example from. Look at the stale state of medicine, jurisprudence and construction. Compare it with the progress in software.
    Do you really think it would be possible if we all be forced to follow regulations how to do “good” programming similar to building codes?
    Sometimes the best way to progress is just allow to fail.

  8. […] had with him has proven to be an affable guy. I was a bit taken aback when I read his recent post: Programming is not a Craft. Dan’s sentiments are not unique. I have heard similar opinions from other prominent developers I […]

  9. Excellent article and very sensible arguments. Loved the unspoken analogy of jiu jitsu and an apprenticeship of sorts.

  10. Dan,

    Interesting comments. Thanks for reinforcing that it is important for everyone to minimize naval-gazing and continue focusing on delivering for customers. A craft (as opposed to art) should deliver functionality first, aesthetics second, right?

    But, isn’t part of the functionality of software its maintainability, ie being well-written? It is not just the functionality that the user sees that adds value, it is also the “functionality” of being able to easily understand, enhance, and grow the software by the next set of programmers who touch the code base. That functionality is often mis-valued by the client but is none the less important and valuable to that client and his future programmers.

    Regarding your comments here:
    Calling programming a trade takes nothing away from the desire for professionalism, experience and expertise. In the same way I want an expert electrician wiring up my house rather than a cowboy, I want an expert programmer enabling my business.

    We all know that programming and building software systems shows very little resemblance to trades such as plumbing or electrical work. The level of complexity in software systems compared to wiring a house or running pipes makes arguments along those lines something of a straw man.

    Cheers,
    –Kevin

  11. The post is much too long. ignoring movements, and ignoring nomenclature, There are clearly very wide ranges of quality with which software can be constructed, and the flexibility of the medium, allows enough creativity to express meaning (‘we want the software to help you well’) though function limits the expression it is still skilled expression. The product can be a thing of ‘beauty’ in as far as it provides the same ‘delighter’ experience as many traditional ‘crafts’.

  12. Phil Shaffer · ·

    You pointed out the irony of no barrier to entry in order to associate yourself with the Craftsmanship manifesto.

    Then you declare you want to create a better manifesto.

    I reply that first you must dance the Stroustrup dance (or the recognized dance for your decipline) so that your worthiness can be assessed. (said with a large smile).

    Numerous attempts have been made over the years to create these professional barriers to entry, but they all fail for the same reasons. Each is too narrow, too inclusive, too artificial. Always the effort turns into an attempt at protectionism, and control. In short, greed.

    Good luck tilting at the windmills.

  13. “It would be great if programming were a proper profession, but it isn’t. A profession has a structured model for advancing through levels of skill and ability, be it studying for a law degree and articles (working for a legal practise) or the years of undergraduate and medical training a doctor undertakes before specialising. The latter has clearly-delineated ranks, from junior doctor, via a brutal regime of 80-hour weeks, to consultant.”

    Programming per-se is not a profession, just as stitching up wounds isn’t either. Programming is a technique used by software developers and engineers to implement their designed solutions, just as doctors using sticthes to seal up wounds. The profession of software engineering has ranks, just in case anyone hasn’t noticed. It starts up from junior developers up to software architects and extends to chief technical officers. One cannot be a software engineer if he or she hasn’t the required amount of knowledge, training and expertise.

    “Conversely there is no minimum entry requirement for programming.”

    Even though currently there is no minimum entry requirement to programming, companies, governments and organisations are feeling that not everybody is capable of effecting the science of programming. Programming is a field which is based on mathematics (just in case anybody forgot, computers perform the act of ‘computation’ which is a mathematical process). Just as a pilot requires knowledge of avionics to fly an aircraft, so must a programmer have the knowledge of mathematics. This can be achieved through formal education, and increasingly many companies hire computer science graduates, who have such knowledge. Just as an architect requires knowledge of mathematics and physics in order to design sound buildings, a software developer requires deep knowledge of mathematics, logic and problem-solving skills.

    Another important point I wish to stress is that one must differentiate the software engineers and developers from the coders. Coders are coders, they just write code to implement a technological artifact or system defined by somebody else. Anyone can buy a programming book, read it and start writing a few programs. However, there are far less people who are able come up with a technological solution to a problem, design an system to implement that solution and implement effectively (using sound computer science principles) that system. Software engineers and developers are highly trained and experienced individuals who engineer solutions and not just write code. Hence, the belong to the profession of software engineering which is a sub-profession within the IT profession

    1. I couldn’t agree more!

      And on that train of thought, I propose the following (although it is only a rough idea which needs more thought)… actually I’ll post this below.

  14. I think that craftsmanship manifesto isn’t about showing off, or pleasing ones ego. It is about making deal with your self to be better in what you do. Even if you’re not good programmer try to be good, and if you fail it is ok but if you are failing and doing nothing about it then you are dumb. That is the way I understand it, I signed up, but I know I’m not a craftsman, I’m not great programmer but I’m trying and learning.

    It’s about getting better not about thinking that You’re so 1337…

    1. All these thousands of words, and finally someone nails it.

      I think maybe some people are over-thinking it all.

  15. […] Programming is not a craft « DanNorth.net […]

  16. […] North wrote an excellent blog addressing the issues that the software craftsmanship movement has and will generate if we are not […]

  17. The blog has valid and interesting points, but it shouldn’t be about ‘wowing the customer’, it should be nothing about ‘wow’. You don’t go to your doctor, lawyer, or accountant for ‘wow’. It’s about competence, and in the current industry, competence has no real measure which is why any joe can write software and nobody can tell the difference. I want my rockets, buildings, and bridges to just work. The beauty is hidden in the simplicity and design.

    I don’t care if the beauty is hidden from view. This is distinct from making it look pretty to the user, this is another area and expertise – they don’t have to be done by the same people, just like my accountant doesn’t have to be the best brain surgeon – it’s about being brilliant at what you do, and no more.

  18. […] read Dan North post Programming is not a craft and I have to say that I have mixed feelings about […]

  19. Why can’t it have both intrinsic value and be totally irrelevant at the same time? I mean, even we say “intrinsic” there really is no such thing. The value of something is never truly objective but always measured by the observer. There is also no opposition between creating beautiful code and creating functional code, like someone said above: A chair can be both utterly functional and a work of art. Noone disputes that we should deliver value for our customers first and foremost but it must surely be so as well that creating beautiful code is a good thing.

  20. Here is my Manifesto… needs a propper name though…

    I propose the following (and this is bound to get criticism, but hey any and all is welcome)

    Some entity\society needs to exist which is exclusive (yes EXCLUSIVE) to some IT Professionals.
    I’ve been thinking a lot about the following as the main attribute of a member of such a entity\society:

    A formal qualification (Some form of Degree from a respectable university) and John from above has hit the nail on the head…

    but degrees go further than just the degree… Having just a normal degree can be seen as an entry level. A Ph.D is obviously the highest you can go… but having a Ph.D in Computer Science mean you are over qualified for most companies… and they don’t get the pay they deserve….

    Now I can see MVPs and certified professionals criticizing this, but hey… I’ve got some certificates from Microsoft but to be honest and they mean nothing to me. a waist of my money. Those types of training only teach you how to use a specific product. it don’t mean Jack if you need to work on other platforms. Certificates give you TRAINING in a specific area, whereas Degrees provide in EDUCATION in a broader field…

    Now with this in mind, and as John said in an earlier post: “Programming is a field which is based on mathematics”. So another attribute needed by a member of “my” entity\society is some form of mathematical knowledge. be it Discrete Mathematics or Linear Algebra or Calculus. My question here (to those of you saying that knowledge of math is not needed to write programs think of this… OpenGL\DirectX… you need maths to fully grasp the concepts in computer graphics.. end of story)

    and then also, in John’s second point where he has hit the nail on the head again… if you are a coder you are NOT a developer… you are a robot (in my view). as a third attribute required by “my” entity\society you need to be knowledgeable on the concepts of Analysis and Design… knowing a bit more that the waterfall model is a good start…

    just my thought… I dont have a blog of anything so I have no place to put this idea other than here… and there it is…. use it, don’t use, crucify me, praise me… I just wanted this “out there”

  21. So what is it? Not a profession, not a craft.

    1. He called it a trade.

      1. TL;DR I guess
        so trade wanting to be a craft may be?

  22. Your comparison to the plumber is apt, but if he is not a craftsman, you get sh*tty plumbing.

    The plumber may be back at your house again for some other work, so he doesn’t want to do an ugly-but-functional job. He needs to make sure that the pipes can be worked on again, traced through the house, and that his work properly meets coding standards, er, standard codes.

    I think the ‘call to prostitution’ description is pretty accurate. Sell yourself and care not for the product.

    If we don’t write software as if we are crafting, we end up with Windows Me. No thanks.

  23. Guillaume · ·

    Dan,

    It surprises me how wholeheartedly you fall into trap #1 when talking about software development, which is to draw a parallel with masonry work (or any other building activity for that matter) and try to draw conclusions from that. Your point about bridges vs cathedrals is obviously flawed as there is no such thing as a freely, endlessly, almost instantly refactorable and redistributable bridge, or cathedral, out there.
    Programming is an entirely new discipline with at least as many differences from traditional engineering professions as it has similarities. And in a discipline that gives us such a fantastic latitude in the way we can design code and allows so many solutions all ending up with working software, it’s difficult not to see craft. Craft that has nothing to do with the kind that was used before, perhaps ; not craft that can build cathedrals, gargoyles (or bridges) but craft all the same.

    As for the ju jitsu parallel, I see little relevance in it either, since for me software development is much more about people collaborating for a common purpose than isolated black or yellow belts spitting out code on their own, and software craftsmanship much more about an active community trying to raise the general level among all programmers than elites despising the least skilled ones and confronting each other in a fight for programmer genius of the year. But maybe that’s not how you see things.

    Anyway, what I think you fundamentally got wrong is you’ll never see someone “rewrite the Software Craftsmanship Manifesto in terms of getting results and delighting customers”, because it is precisely not the point of software craftsmanship.
    Don’t get me wrong, customer/user perspective is the first thing we should have in mind, so you can go and try to create the new Scrum or Lean any day. But please also recognize that we need to work a level closer to the code and establish the standards (or non-standards) of software development as a unique activity and not “just the plumbing/roadworks/building of today”.

    1. ..because it is precisely not the point of software craftsmanship
      Why not — If one writes something and nobody likes it/uses it why is one writing it

      1. Guillaume · ·

        “why is one writing it”

        You’re asking the wrong question as far as software craftsmanship is concerned here – SC is not about why or for whom we build software but *how* we build it. How we can deliver better, more robust, more maintainable work and organize ourselves as a community to raise the bar of code quality and be recognized as proper professionals instead of bug-producing crooks.

        As Johan wrote further down, only focusing on the why can be a disastrous signal to programmers – that it’s OK to code crap as long as the customer is happy.

    2. Guillaume, I don’t agree to what you said regarding the comparison. Dan’s point was not to compare masonry and programming, it was to draw an analogy. Comparisons are all about the differences. Analogies are all about the similarities.

      I do agree though that the scope of masonry is much smaller than the scope of software development, that is why I suggested to distinguish between ‘masons’, ‘architects’ and ‘city planners’ in my earlier posting. Developing software can be compared to any of these professions/crafts, depending on what level you look at, from programming, over system design, and project planning / project lifetime management. But few people are really involved in more than one of these roles, therefore we need to define these different roles as different crafts/professions/trades, before we can think of introducing ‘apprenticeship’ and ‘mastery’.

      Software encompasses everything involved in building: we select the stones (language) to use, put them together (code), integrate doors and windows (interfaces internal and external), plan for wiring and plumbing (flow of information and control), we do the roof (watch for leaks or security risks),and the garden as well (support, forums, plugins) do the painting (UI design), fit out the house with furniture (custom controls), and so on. Others may build roads and railways (network) and provide a garage (HD) to put your car (data)

      It makes no sense to introduce just one avenue of apprenticeship to such a broad set of skills. And in that you are right. We need to see the big picture.

      1. Guillaume · ·

        What Dan basically said is, “Sw craftsmanship is to ‘professional’ software engineering what sculpting a cathedral gargoyle is to building a functional bridge”.

        Call it an analogy or whatever you want, my point is just that “X is to Y what…” only yields bullshit when the two areas are galaxies away from each other.

        To take on your mason example : How many masons do you know who managed or even attempted to become architects ? …Now how many software developers do you know who evolved into software architects ?
        Probably a lot more, and this is possible *because programming is a totally different animal*.

  24. […] Programming is not a craft TL;DR Software Craftsmanship risks putting the software at the centre rather than the benefit the software is supposed […] […]

  25. Micheal McCoy · ·

    Awesome idea. I was a Journey Machinist (Craftsman) before I became a developer and the notion of software craftsmanship strikes a deep cord with me. I have worked with very few people I would call craftsman, people that take pride in the work. I don’t believe there is any other trade or skill that is comparable to development though. It is a very unique area. But as far as an attitude is concerned true craftsman are as you stated. Humble, helpful and have a deep passion for what they do. It is interesting to note that the group of “craftsman” that I work with all agree that we should, as group, and I mean the IT society, develop some kind of apprenticeship, some way to identify the great from the good.

  26. One thing I think I’m finding inconsistent in the article is there seem to be two kinds of craftsman in it – the kind that are “indulgent” and fall in love with the software itself while ignoring the ROI, and then “real craftsman” who are lead not into temptation and tease out elegance from a tangle of raw enterpriseishness.

    The argument starts out anti-craftsman of the first type but then mushes over into pro-craftsman of the second type, without really calling that out and re-using the term craftsman.

    “Well it seems to me the most succesful programmers I’ve encountered don’t craft software;” vs. “It takes a real expert – a real craftsman – to see the elegant simplicity buried away inside the mess we call enterprise software, for instance, and tease it out.”

    Have it or eat it, please.

  27. […] To read the full article please visit – https://dannorth.net/2011/01/11/programming-is-not-a-craft/ […]

  28. I liked the article. It was only a year ago that I heard a person call themselves a “software craftsman” and I have been thinking about this expression ever since.

    What I am reading from the article is that it is just too easy to label yourself a craftsman. You just have to sign up for it. It is interesting to see how questioning the label shakes some people to their core, apparently because they labeled themselves “a craftsman”. So it seems to me that the underlying message of the article is that your peers should label you a craftsman and not something you can just call yourself. Would this be a correct assumption?

  29. It is true that *most* programmers are not craftsmen, are in the industry to make a living only, and work on very non-glamurous projects. Therefore I agree that the industry or the job itself is not a craft.

    In fact, I think no industry at all is a craft by your reasoning. I’d like to believe that craftmenship is tied to the individual, not an industry. Even in plumbing there are craftsmen. Sure, I just want my pipes working but a craftsmen will go the extra mile for an elegant, future-proof high quality solution whilst not explicitly requested. The same is true in software development. Out of the 200 ways to solve a problem, many solve the problem with shortcuts, so that it appears to work on the surface and one can move on to the next assignment. A craftsmen architects the solution, finds the best way given all parameters, designs a future proof solution and produces high quality code that is an example to others. Craftsmen may even package their newly thought out solution and share it with the community for reuse.

    You can play the word game of calling that just being professional or a craftsmen, but my opinion is that you cannot call an entire industry a craft or not. It boils down to the individual, in any industry.

  30. Hello,

    it seems like you are differentiating art/beauty from usefulness/efficiency. Truth is that excitement is caused by the usefulness and efficiency of things be it a tool, animal/human body or whatever.

    One can argue beauty does not always imply usefulness (i.e. a picture or a decoration in a tool). IMO There is usefulness in in the beauty itself in that it provokes feelings in you that make you live your life and do your job easier and better.

    What I agree with you is though that beauty cannot really be achieved by solely trying to achieve that but by efficient design. As every other tool, a piece of software can be designed good or bad. A good programmer can always say looking at some program “this is ugly” or “this is cool”. And even though the end customer doesn’t care about it, it really matters when you have to support a program rather than deliver and forget. There is a big chunk of programmers that write something up, then jump to a new challenge and leave some other poor sole to support their crap.
    These are not the best programmers although they are the most well payed ones and appear to be the most efficient ones. YMMV

    So the real art in programming as I see it, is finding the right balance between requirements, efficiency, time and resources, maintainability, etc.

    Thank you.

  31. Zvolkov :
    First, you’re confusing craft with art. Totally different things.

    True, good observation!

  32. I’m to lazy to read this article ^^

  33. > As a buyer of software solutions, wouldn’t you want to know your systems were
    > being built by master craftsmen rather than day jobbers?

    As a software developer, I really, really, really want to answer “*YES*!” to this question, but when I think about it, I come to the conclusion that I actually don’t care about who makes the software that I buy. If the inside is pure poetry or ugly as cancer is kind of irrelevant – as long as the right stuff happens when I hit the right buttons on the keyboard

    Excellent post, but this realization kind of ruined my day…

    1. “I want an expert programmer enabling my business. What I don’t want, however, is a prima donna plumber”
      – I’m sorry, I couldn’t help myself: http://bit.ly/guP6q3

  34. This article made me sad :-(
    We fight for good, readable, maintainable (etc) code but this article might be used as an excuse to “keep hacking” since “the customer is happy”. I will look for another job…

  35. > Software practitioners – especially, ironically, the good ones – often lose sight of
    > this. They fall in love with the software itself and start thinking of themselves as
    > craftsmen of software.

    To some extent, I don’t think this is too bad. Developers might humbly go along coding, amazing their customers. But at the same time some of them produce code that scares the hell out of other developers and operators, while customers usually don’t care at all. This is at least ignorant.

    We need a culture to prevent this. Why don’t call it craftsmanship? Developers become fancy about what they produce and show off to their colleagues? So what?

  36. I admit that I was taken aback by this article. It does seem to support a cobble and hack methodology as opposed to carefully crafted code that is extensible and maintainable for all software. Perhaps the author cobbled and hacked some incendiary ideas together either to incite sensationalism or because hiding the details in a spaghetti structure is a form of job protectionism. If the article were more clearly written in a modular form delineating cohesive arguments for each specific topic there would be less confusion in the comments section where the original article is in a sense being modified, extended and bug-fixed.

    I think that the author, in moments, was alluding to the propensity for software developers to re-invent the wheel in place of utilizing existing pre-built solutions (hence the reference to the use of a tool that assembles web-pages rather than ‘crafting’ a website by hand stated in a retort).

    If the argument is to use pre-built components where applicable in opposition to constantly re-inventing the wheel as a wheel-craftsman might do then I agree insofar as it suits the business needs of the project.

    As for the craftsman versus artisan versus professional verification debate I will have to concede that the one bit of the article that I found elucidating contained the most content borrowed from external sources: A pre-built component that served to shed light on a fundamental problem for the software development career path. The story of the samurai and the need for some kind of standardized competency test towards the goal of pre-qualifying developers so that pricing for skill level can proceed based on some kind of empirical evidence. I think that this problem is currently intractable given the unqualified domain of software developer. There are so many types of software development many requiring domain specific knowledge and techniques and talent can be difficult to quantify on paper but easy to qualify in practice.

    I think that the salient issue that was hidden behind the craftsman debate was whether or not beautiful or ‘crafted’ code has intrinsic value. I would think so. Code that is easy to read and understand by other developers has real business value in almost all programming domains. Code is about communication to the machine to create a product and it is also about communication to other developers so that the product can be cost effectively modified in the future.

    It may not matter to the customer that the software is a jumbled mess on the inside because it works on a hope and a prayer. It will, however, matter to the manager of the project when the lead developer skips town and leaves the rest of the team in the lurch with a big ugly mess to sort out before the features of the next version can be implemented.

  37. This is an excellent post. Obviously a hot topic too judging by the number of comments. Completely agree about the manifesto mentions too, I did sigh when reading it, I think the manifesto is the right idea but perhaps the focus needs to be more about the customer value, rather than the “intrinsic” value of the code.

  38. Nice post, but made me sad :(

  39. I come from a family of craftspeople. (And alcoholics and criminals, but we’ll leave that aside).

    My dad’s cousins are all in the building trade. Their father cunningly brought each of his several sons up to learn a different trade from childhood. A plumber, a bricky, a carpenter (or joiner as we call them in Scotland), an electrician (Sparky), a foundations guy.

    Anyway – we got into house building when I was a little kid, and having grown up on building sites I can tell you that there’s a huge difference between craftsmen and the rest, even when the task in hand is as simple as adding a joist.

    The joist will end up in place in both cases, but the craftsman won’t damage anything else accidentally on the way (oh dear, did I just drill straight through the cables for your dimmer light… uh, sorry ), won’t leave a mess behind for you to clear up (shoot, was that concrete dust? uh… sorry), and when you look at their work it makes you smile not wince.

    I’m not aware of it taking a craftsman carpenter any longer to build something than a hack-it carpenter. The care they take in their work, and the more thoughtful selection of process and tools, pays dividends.

    Having grown up on building sites, I’ve yet to meet a project manager or client who says “no, let’s not hire in the guy with 30 years experience who makes perfect right angles – he’s too slow”.

    People who are too slow fall by the wayside. If it wasn’t possible to craft software and still deliver then those of us who want to take pride in our work would have run out of money a long time ago.

    Of course we shouldn’t re-invent the wheel. But you’re confusing craft with art. Craft is about the process that delivers the right product. If you asked for a plain walking stick no craftsman would offer you one with an ornate carving. Artists say “I made what I wanted, do you want it too?”, craftsmen (I’m a woman by the way but people just sounds daft) say “What do you need? This is how I want to make it.”

    And yes, I do want a plumber who’s a craftsman. You’ve clearly never tried getting silicone sealant off the tiles it didn’t belong on.

    1. I think this is my favourite comment so far. It captures exactly what I’m trying to say.

      So it turns out that the trades are full of craftsmen. I’m sure I can guess what your dad’s (master) plumber, bricky or sparky cousins would say if you asked whether their, um, trade is a trade or a craft. And also whether they consider themselves craftsmen and professionals.

      And yes, I have tried getting silicone sealant off tiles. And broken a few in the process. That’s why I’ll pay extra for the craftsman every time!

  40. Guillaume :
    What Dan basically said is, “Sw craftsmanship is to ‘professional’ software engineering what sculpting a cathedral gargoyle is to building a functional bridge”.
    Call it an analogy or whatever you want, my point is just that “X is to Y what…” only yields bullshit when the two areas are galaxies away from each other.
    To take on your mason example : How many masons do you know who managed or even attempted to become architects ? …Now how many software developers do you know who evolved into software architects ?
    Probably a lot more, and this is possible *because programming is a totally different animal*.

    You are correct, and I have been inconsistent: In my first posting (not my response to you) I already made a point of the neccessity to distinguish between ‘masons’ and ‘architects’. As you rightly point out, masons don’t become architects, not even occasionally.

    I think in the latter part of my previous response I expressed myself much better: Software development covers a wide range of skills, far wider than any craftsmanship you might compare it with. Analogies therefore only work so far as you can say there are different levels of skill.

    But suggesting a system of apprenticeship that will eventually lead to ‘mastery’ doesn’t work: the field is simply to broad to cover. Instead you learn it and improve in certain areas to eventually become an expert for certain aspects of software development (or mathematics) but that doesn’t make you a master of the whole discipline, only an expert for these certain aspects.

  41. Man hours (if not man days) of time went into writing this article and writing all the comments that follow. Shouldn’t you people be programming instead of going on about craftmanship and manifestos? Where is the boss? You are programmers aren’t you? Shut up and write some code!

  42. Dear Dan, thank you.

    As a software professional I needed to read this post to better understand the point of view that non-software people can have; and the fact that I needed to read your post for that somewhat proves the validity of your point.

    HOWEVER…

    I find the views you exposed here dramatically short-sighted:
    Using utility as the only value to assess a trade with, even when that trade’s ultimate goal is utility alone, is very counter-productive in the medium and long term.
    Software as a discipline started long before computers were invented, and like a lot of valuable inventions or discoveries it came out of people that saw an art where most couldn’t (and in the case of software still don’t). Vectors, one of the most useful mathematical concept were invented before anybody could find a use for them.
    So utility is not always where we think it is. As Henry Ford said: “If I had asked my customers what they wanted, they would have said a faster horse.”

  43. Hi Dan,

    Kudos on taking on this very complex subject. I see that many of the comments argue the semantics of craft/trade/art. I have some comments on that too. :) First, we should consider that many of the great artists of the past actually did much of their work on commission – having to carve out a living. It is posterity that has rendered some of that output timeless. Also, I believe the meaning of “art” has changed dramatically in the post-modern world. Being married to a singer, and being a semi-professional singer myself (when not in the programming business), I’ve observed that in many camps nowadays, something is art if the maker says it is (seriously). Obviously, then, anyone can be an artist, and the term loses most of its meaning. Perhaps this is a 21st century version of the science crisis in the 1700s, where Hume demonstrated that cause and effect is an illusion, and Kant made an honourable recovery by claiming that the concepts still make sense in an empirical reality. Having thus led the discussion into the utterly abstract, I will offer an anecdote from my own artistic bumblings.

    When I found myself the student of a man who really “gets” bel canto singing, 6 years ago, one of the first things he said to me was: “You’re a professional now; forget about taking pleasure in your own performance. The best you can hope for is to become a medium for other people’s enjoyment” (which does sound rather like another, very old, profession). The point, in clinical terms for a singer, was that you are not in a position, literally, to judge the quality of your own output. You simply have to learn the mechanics of it and make it second nature. This takes years and years of practice (let’s say 10, for good measure). Yet, everyone can sing, more or less, and many professional singers get along well with what I would call fundamentally flawed technique…

    Much of the learning process has been about realising that most of the advice I’d received before from books and teachers didn’t actually make sense until I reached a higher level of proficiency and understanding. Things that are normally viewed as mere artistic ornaments suddenly became a mechanical necessity! And I had been singing for 13 years before I started this journey.

    To come to some sort of a close, I do agree with you that craft, art and trade are important concepts, but they are fleeting, relative and almost impossible to define! As a singer, I can’t even rank myself on the Dreyfus scale! I guess you’ll find me somewhere between Advanced Beginner and Expert, depending on which aspect you look at. To complicate things even more, the “result” is judged by people who usually don’t know the craft, so they will judge subjectively, based on what they are used to hearing. While you learn how to sing fundamentally correctly, you will make mistakes that people are not used to hearing (but when you reach perfection, most will agree that it’s outstanding); OTOH, we are so used to hearing some types of defects in singers that we simply assume that that’s what it should sound like! But again, if I’m a medium for other people’s enjoyment, shouldn’t I confine myself to the “usual flawed singing” and deliver what they expect? Rather than purporting to demonstrate something that they strictly haven’t asked for? There is no easy answer.

    http://www.youtube.com/watch?v=CAix9nyP2Qs, just to put my money where my mouth is. :)

    Keep it up, Dan! I enjoy your pontifications and your style.

    BR,
    Ulf W

    1. There’s a lot in this to digest, really insightful. Thanks for taking the time to write this up, Ulf, and thanks for your support.

  44. […] Dan North’s post has garnered a lot of attention, one because he is the well known, self-effacing and generally good guy that he his, and two because he shoots poo over the whole manifesto. He believes that the people who buy software don’t really give a hoot about what goes into the software, it is purely the utility of it that they care about, and for the least cost: […]

  45. […] North has created a bit of a stir with his declaration that programming is not a craft. Liz Keogh has agreed with him.  The funny thing is that most of what they have to say is not […]

  46. I want to know if software development ever will be a profession? Well there ever be an organisation that accredits software developers that a) knows how to judge a good developer or good development company, and b) is listened to/respected by governments and companies seeking IT services?

  47. Kris Randle · ·

    This is a ridiculous posting – for reasons that should be evident to anyone reading this who understands that whilst functionality is important – it means nothing if there are no guidelines on producing that functionality. Imagine if Henry Ford had been told by the Pig Iron Ore hauler that there was no need to manage his time efficiently? That he’d always done it that way – and that it was only a lump of rocks, so why consider improving anything? Surely it took no skill?

    Irony mode off, this post is an interesting (if slightly misguided) argument. A lot of the parallels are weak, and there is nothing other than the writer’s opinion to steer the argument. Whilst a lot of blog posts are like this, one that attempts to argue such a strong point should look to more than a horseless samurai for primary references.

  48. […] Discussion It all started with a post by Dan North that was critical of the movement. Members risked being elitist, indulging in navel-gazing, and […]

%d bloggers like this: