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.

242 comments
  1. Mike said:

    Ok ok, I’ll comment here!

    I agree with most of the words you use and all of the sentiment.
    Especially on side with focusing on delivery of useful stuff rather than the how good it looks or how many conferences we went to to say how well it was built.

    Its like arguing the benefits of a gold plated toilet plunger – fab to look at, doesn’t shift poo worth a damn!

    I suspect the authors of the SCM tried to keep in the writing style of the the agile manifesto (don’t know why the would, but perhaps they did).

    This issue of whether we are a profession has been around for a long time – flummoxing esteemed bodies by the BCS (who decided we were, but aside from occasional discounts, not much else is kicking about). I tend to favour that we aren’t. And thats cool too.I don’t care either way.

    What I care about is people learning better ways and then using that learning to build software that does something useful for the people who need it and value for the people who pay for it.

    What this SCM doesn’t cover are things like ‘craftsmen’ sitting on a lucrative job for longer than it needs (alas, anything can be perpetually ‘improved’ especially if its paying £xxxx/day!). Why don’t we have a manifesto on that also?

    A Software Craftsmanship Council – on that one, I agree to disagree. As an ideal, no argument, but its more than likely going to degrade into the very elitist, yet vaccuous that many Phds become. Sure you are the expert in something, but do you have the ability to turn it into something genuinely useful. The reason for this? Purely the effect of commercialisation. Once a financial reward/edge comes from this conferment, its game over.

    I found much more here to agree with than not, on second reading it didn’t seem that lengthy (or at least it flowed faster). Well done for getting it done.

  2. Zvolkov said:

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

    Second, do I sense Love in this rant? I don’t think so.

    • Hi Zvolkov. I’m using craft in its popular sense as the activity of creating something with its own intrinsic artistic merit (see the definitions at The Free Online Dictionary which suggests looking at synonyms for “art”, or the examples (stonemason, jeweller) offered by Dictionary.com). Totally not different things, apparently.

      • With all due respect you’re cherry picking your definition of craft for the purpose of your argument.

      • I mean, there are many definitions of a craft which do no mention art. The one’s that do are not doing so in the manner which you are here.

      • Jules said:

        I’m not convinced the Free Online Dictionary is any good. The Oxford English Dictionary, which *is* good, specifically notes that the use of “craft” and “art” as synonyms is an outdated one, on its way to being archaic.

        Whatever the multiple definitions in any dictionary, though, I’m pretty sure the writers of the manifesto in question intended “craft” to be interpreted as “a branch of skilled work”, and “craftsmanship” as “skilled workmanship”.

      • Jace Bennett said:

        Art and craft are NOT totally different things, but they do have a key difference, and it cuts to the heart of your thesis.

        Art exists for art’s sake. Crafts are practiced for the sake of profit.

        The artist is in love with his medium, himself, and believes the aesthetic to transcend the cost of producing it. The form matters.

        The craftsman is also in love with his medium, but believes that form and function must be balanced to maximize the profit from delivered value.

        I’m thinking of a fine German automobile. The spartan, utilitarian value of such a thing is as a conveyance, no better than a Plymouth, if judged only by it’s primary defining value proposition (that thing which makes it a car).

        But I find a great deal more value if I look just slightly further. For one, the steering and acceleration are more responsive. This is both fun (perceived value) and contributes to the overall safety of the driving experience (essential value). As do myriad of other decisions that were made by designers with a good sense of my values making hard decisions to arrive at a balance of form AND function.

        We’re not talking about software gratia software. We’re talking about considering aspects of our work that the customer may not consider, that he pays us to consider, that will ultimately increase actual value delivered, maintenance cost, maintenance frequency, etc. In a word, craftsmanship.

      • Marc said:

        It’s odd that the OED offers no requirement of artistic merit anywhere in its definition. Perhaps you need to use a better dictionary.

        “Craft” is a far more flexible term than you give it credit for and could easily be applied to programming…at least according to the OED. Regardless, a semantic argument isn’t much of an argument. Although, I do agree that merely signing an on online manifesto offers no real value other than to cheapen the concept.

  3. Julien said:

    It is OK programming is not a craft.
    It is preferrable to create a profession as it is for medical doctors, lawyers etc…
    Since it could address the issues you mention about most of the people just doing this work because well paid (which is also a motivator for doctors and lawyers etc… but it is just more competitive to be recognized as a practitioner).
    The challenge I see is : Is creating and managing this activity as a profession antagonist to the spirit of innovation itself?
    As long as evaluations for “approved practitionner” are made in a fair and transparent way, it should be OK.
    But then we would have the problem of purpose again: Why would you need to differentiate yourself if you are really better? Can not the industry naturally learn to find you?
    The reasons doctors, lawyers and engineers were organized in professions was to PROTECT the citizens from the incompetent and therefore harmful ones.
    With IT, it is less about individual exercising a profession but more about companies selling goods. So it IS NATURALLY more tricky.

    I like your ideas. Was just reflecting also in this post as well.

    Julien.

  4. caloggins said:

    I think my short response is: carpenters are craftsmen.

    Most people really don’t care how a dresser is assembled (dovetailed drawers). They don’t care about the details of how a house is built. But they do care that it is done well. This mostly shows some time after the ‘newness’ has worn off. Shoddy craftsmanship results in stuff breaking shortly after one starts using something.

    Most carpenters will tell you that the devil is in the details. This is especially true with our trade. However, as with any trade, we have deadlines. A house has to be finished in time for the family to move in. A program has to be done in time to be used. Both must meet certain standards.

    I think the stuff we build is more useful (dresser) than ornamental (earrings). How we build it is important. When the next guy comes along to put on an addition his job, along with the cost of his labor, will be much easier for the owner if we went through the trouble to use a level and a square.

    The trouble with identifying master craftsmen is one has to know what good work looks like. The current measure for that (in my experience) is certifications and college degrees. It’s rare anyone actually looks beyond the papers and abbreviations. I just don’t believe that a large portion of the employers out there will ever want anything more than a day laborer or apprentice.

    A manifesto would be cool. But, in the end it won’t help this journeyman-en-route-to-master to get a job. I’ll still be stuck with the day laborers. I’ll still be working to master my craft. I don’t need a council to do that.

    • Carpentry is an interesting one. I deliberately didn’t use it because it spans both camps – sometimes it’s a trade, sometimes it’s a craft. Many wooden structures are both functional and designed to be aesthetically appealing (think of a well-crafted bookcase or beautifully-finished dresser). Sometimes it’s purely decorative (like oak-panelled walls).

      With a lot of carpentry, the consumer can look at the finished artifact and appreciate its aesthetics: it is a “piece” in itself. Not so with software, which is more like the structural or joinery aspects of carpentry.

      If I can solve a problem without resorting to writing bespoke software I’ll usually opt for that solution. If I can solve a problem without woodwork, I may take the woodwork solution anyway because the actual resulting wooden construction pleases me: it has intrinsic artistic merit.

  5. This is a great thought provoking piece, thank you for writing it.

    I wondered what made you look at the software craftsmanship community as the prima donna programmers though? What are the software craftsmanship community doing that appears to be naval gazing?

    If you look at some of the talk outlines from this years SCNA: http://scna.softwarecraftsmanship.org/schedule I feel there is plenty there that resonates with what you have written here.

    • Hi Steve.

      I agree with you about the kinds of folks speaking at events like SCNA. As I said, the people leading the Software Craftsmanship movement already embody what I’m talking about: they see software as a means to an end and want to become excellent at their trade. I’m just warning against the software-is-beautiful-in-itself navel-gazing that I see going on (and that I’ve been guilty of myself), which detracts from the purpose of programming.

      If your mental model is programming-as-trade then you take a much more pragmatic (and arguably effective) approach to it than programming-as-capturing-the-essence-of-beauty.

      • Dan,

        If your mental model is “programming-as-a-trade”, implying you care only about the end-result that is delivered for your efforts, then (to use the plumber analogy once again) you’re much more likely to simply put some sticky tape over the hole in the leaky pipe than you are to replace the piece of pipe. It’s quick, easy and cheap for the customer – perfect trinity of factors, eh? Of course, we don’t care that the customer’s pipe will spring another leak within minutes of you leaving the building, that just guarantees more work, right? ;)

        Of course, I’m being sarcastic, and I do agree that navel-gazing and caring only about the beauty of the software itself does not solve the underlying problems of the customer, HOWEVER, one simply *cannot* produce software that not only meets the customer’s needs and wants, but also does so elegantly and with the minimum of fuss. That kind of software that it a joy for the end-user to user (as opposed to most “enterprise”-type software that the customer positively has to wrestle with in order to achieve even the simplest tasks) has to be “crafted”. That is, the programmer of that software HAS to care about the code itself and the way that code is put together.

        For me, this is the true meaning of “software craftsmanship”, and it *is* right there in the manifesto – you just have ensure you read the qualifying text at the bottom:

        “Not only working software, but also well-crafted software”
        truly makes sense when it’s qualified by:
        “That is, in pursuit of the items on the left we have found the items on the right to be indispensable.”

        It IS working software that meets the customer’s needs that is the real goal, but in order to do that effectively (i.e replace the piece of leaky pipe) one *must* care about the craft (otherwise, we’d simply put sticking plasters over everything).

  6. Matt said:

    I think Dan North is full of himself (why else would he name his website after himself instead of a higher purpose).

    The analogy of a software craftsman is not like a jewler who’s work is on the outside, it’s that of a watchmaker. The internal workings don’t have to be pretty, and 99.99% of the users of a fine watch (back in the day of fine watches) wouldn’t have the foggiest of what kept his ticking on time, but yet the craftsman still cared not only about the timekeeping but the aethestics of it. Why? partly for it’s own sake but because he knew that a finely polished, and well designed mechanism would keep good time for many years, and be easily maintained by even lesser skilled workers.

    • Hi Matt.

      I’m not suggesting programmers can’t be craftsmen, and in fact I applaud the idea of software craftsmanship. I’m just arguing that programming itself isn’t a craft, for exactly the reasons you describe. It’s just a skilled trade. No-one other than programmers delights in beautiful code. Non-artists appreciate art. Non-jewellers appreciate jewellery. Non-programmers don’t see what all the fuss is about with software.

      Unfortunately bad craftsmanship in software isn’t as obvious to non-software people as bad craftsmanship in watchmaking is to non-watchmakers. It’s easy to tell if your watch isn’t working, much harder to spot if you’re taking delivery of a crappy application. Especially since the bar is already so low.

      • Branko Dimitrijevic said:

        “Unfortunately bad craftsmanship in software isn’t as obvious to non-software people as bad craftsmanship in watchmaking is to non-watchmakers.”

        Well, crashes and sluggishness are VERY obvious to end users.

        If the code is not beautiful on the inside, it is impossible to “polish” the product on the outside and (sometimes more importantly) it is impossible to evolve it and keep it relevant in the market for long time.

        Sometimes, without code being beautiful, you are unable even to ship the product. Reason: non-trivial products are stretched over time or over number of people or both. So it becomes crucial to be able to understand someone else’s code, or even your own but written months or years before.

        Beautiful code IS relevant and therefore programing IS a “craft” or “art” or whatever word you wish to use…

      • “No-one other than programmers delights in beautiful code. Non-artists appreciate art. Non-jewellers appreciate jewellery. Non-programmers don’t see what all the fuss is about with software.”

        Totally disagree. I think many end users that get to use great software _love_ it and appreciate it. They aren’t exposed to or even understand the technical details behind it, same as those who appreciate art and jewelry may be clueless as the process that produces them. I fear you’re allowing the fact that end users aren’t consuming the code in human readable format to cloud the point.

      • amir said:

        Non-jewellers care very to the composition of the metal, non-artists couldn’t give a rat’s rear-end about the composition of paint… truly great artists/jewellers care very much and so do programmers.

        “beautiful” code isn’t for the users, that’s what UI and requirement tests are for.

        One could just get stuff and build a house as much as anyone can pick up C and start coding. The difference here is the entry cost, building supplies just cost more [and only recently, since 30 years ago computers were harder to get by].

        Non-watchmakers would know that their watches are broken, they wouldn’t know why or how to fix them. Same difference between software users and software writers.

        Programming is writing, albeit not in English, and writing is an art. That is, unless you’re willing to disregard the last few thousand years of storytelling :D

      • Comparing software to a chest-drawer, a car or a house is dangerous for the very fact that no car is delivered iteratively. You don’t upgrade your oak-chest to a chestnut-chest and you certainly don’t move your house from one environment (country) yo another, once delivered.

        Beautifull code has several benefits:

        * It caresses the programmers’ ego. You are right: that is a stupid reason. The only invalid one.
        * It makes portability possible: between programmers, between teams. Users might not care about the underlying beauty of the code. They do care about the fact that thy now never can hire anyone else but the team that built the first piece. that is, if they are still around, that team.
        * It allows for architectural portability: extending, scaling etc: all possible only when the underlying architecture is good. Users won’t care about the fact that some “architecture” is “done properly”, but they do care about virii, crashes, sluggyness, being able to run Photoshop on VistaFooBar and so on.
        * It allows continuous development. So often a piece of software needs to be “rewritten from ground up” (I am looking at you too, Microsoft Windows) simply because the first piece was never architectured and written to really grow. End users don’t care about encapsulation, layers, stacks and such. They care about having a new and improved version every so often. A version, which, at the very least allows them to use the software in their ever changing environment and workflow.

      • ben said:

        skilled trade and craft are the same thing. Period. Whether or not an extreme emphasis on the particular aesthetics of making and the thing made is a good thing, I won’t debate. But you really just seem to be pinning your argument on a fairly uninteresting bit of wordplay. Plumbers are craftsmen, draughtsmen are craftsmen, chefs and programmers and engineers and sawyers and bowyers and blacksmiths and locksmiths and so on are craftsmen. Some better than others, no doubt, and motivated by different things, but they work in a trade where their knowledge and skill separate them from the unskilled, and their styles and interests and relative skill separate them from one another.

        Also, that post really was too long. I’m all for verbosity, but editing is the better part of valor when it comes to writing.

  7. Raoul Duke said:

    Ja, ja, programming should be engineering. But we, in general, suck way too much at it to ever call ourselves engineers. Thus we have to start off saying we’re one level of scientific rigor down from that, namely craftspeople. :-)

    • Russ Beinder said:

      Software, like so many things needs engineers and trades people. They are not the same. An engineer puts science to practical use. A trades person is simply a skilled worker.

      A number of places hand out professional engineering designations like CEng or P.Eng (including British Columbia, where I type from now), but I do not remember the last time I saw a requirement for one (other than personal vanity). Unlike lawyers, there is no common legal requirement for someone practicing software engineering to be certified to practice.

      When it comes to whether or not there is software craftsmanship; of course there is. We know it when we see it, on the inside or out. Not long ago I did the electrical wiring in a room in my house. I followed the electrical code and had it inspected, but I am not a professional electrician. I was interested to note that in addition to all the very specific rules in the code, it also called for the work to be “craftsmen-like”. Now, I am a bit anal and I certainly did not want my house to burn down or to fail the inspection, so I did a careful job. I know how to use the basic tools of the trade (wire strippers and cutters, etc.), but I did need some practice on some things; so I practiced. When the inspector came she said I passed and she was impressed with my craftsmen-like work.

      I assume that if I my work was a mess or I did not exhibit the necessary skills of the trade she would have asked for a do-over (or suggest I hire a pro). Why would she care that I was craftsmen-like? Because, if I was not, she could not know what hidden and unpredictable things would cause problems later. The same goes for software. It is not about beautiful source that no one will ever see, it is about avoiding the hidden and unpredictable things that will cause problems. I dare say the chance for such things in software are many orders of magnitude greater than in wiring my room. The only reason people seem to care so little about it in software is that there is a perception that no one gets hurt if you screw the software up, unlike the fire that burns my house down when I screw up the wiring.

  8. But we already *do* have a way of assessing craftsmanship, separating the doers-for-the-money from the lovers-of-the-craft, the power programmers from those just doing time.

    It’s called “Open Source Software Development.”

    The key is that “Open Source Software Development” is far more about the openness of the *development* than merely of the source. You can tell how committed an OSS developer is by their commit records. You can tell how dedicated they are by their commit reviews. You can tell how flexible and collaborative they are by their reactions to their commit reviews. You can tell how reliable they are by their length of contribution.

    And you can tell the “doing it right” folks from those “just doing time,” because the latter don’t even bother contributing to OSS. The easiest assessment in the world: they’ve already self-selected out of your entire evaluation process.

    • Raoul Duke said:

      er yeah. right. sure thing.

      …and those people who, you know, have actual lives.

      • I sense some misinformation about how OSS actually works.

        “Actual lives” is pretty inflamatory! All the OSS developers I know have “actual lives,” ornamented with all sorts of time-consuming activities, like playing in rock bands, learning ham radio, being sound designers on Broadway plays, dating, raising kids, attending church, and pretty much every other “actual life” activity I know of.

        Perhaps you really meant “actual jobs”? Again, a misunderstanding. You should look over, for example, into the Subversion community, where there’s currently a sort of spite war going on over which company employes *more* Subversion core committers!

    • I’m not sure if loving what you do is the only criteria for being a craftsman. Let’s not forget, Lil Wayne LOVES to play guitar :)

      • Rodrigo Juarez said:

        XDD

    • Hi Jack. With respect, the love of something alone doesn’t make you a craftsman. Like any skill it takes years of dedicated, intentional practice, coupled with some intrinsic talent or aptitude.

      You would have to agree there is a lot of shockingly poor quality OSS out there written by well-intentioned but inexperienced people (and some amazingly good stuff too). In fact, it’s through OSS that a lot of journeyman programmers learn their chops. But that means there is a whole lot of open source software still out there that was written by people getting the hang of programming.

      • Absolutely agree with everything you say here — including the implicit point, that we can actually assess this bad OSS, and impute bad practice to its authors, much more easily and effectively and widely than ever we can any proprietary or in-house work.

        I’d also point out that I think you’re including single-developer OSS work. That’s my bad: I really meant “communitarian OSS,” and my statement didn’t make that clear. For purposes of evaluation, single-developer projects are only a small bit of help, because so much of the dynamic (good or ill) is still not public, but confined to that single head. On a community-driven project, the dynamics happen in public: mail lists, wikis, and so on, and so are visible and useful to present purposes. And as well, the end products are available to you, as are the evaluations of users, which helps you understand the value of individual contributors.

        You may never have used Drupal or Subversion or FireFox or JBoss, but it’s not at all hard to get a general read on how well they’re respected among their users, and how much, well, and widely any given developer has contributed.

    • Jim Cooper said:

      Your assumption is that all good programmers do open source work. This is plainly false.

      Looking at examples of people’s code is a valid way of assessing some of their skills, but expecting everyone to contribute to OSS projects, and expecting people assessing them to be able to go and find all their contributions is a tad optimistic.

  9. It is if you do it in wicker ;)

  10. steve jakubowski said:

    This is the first time I’ve seen multiple (ok, 2) paragraphs in a tl;dr.

    What little of this post I made it through didn’t support that “summary.”

    [tl;dr] If you can in fact code better than you write, well…

  11. I drafted a response on my website (http://www.rickbradley.com/prostitution/), reproducing it here as a comment:

    I suggest picking up a copy of Christopher Alexander’s The Nature of Order and reading it. The yardstick being used, hazily, here to evaluate whether software is a craft, art, profession or something altogether other should benefit from his insights there.

    More importantly, since the Agile Manifesto was drafted there has been a front of bravado put forward by proponents of some New Way™ as they declare themselves bold, daring to step away from the commoditized masses, and driven to do That Which Requires Real Strength and Resolve, (issuing a “call-to-arms,” being “feisty, opinionated, brash”, etc., yadda yadda, …).

    Can we, as humans, as people with experience, love, pride, awareness of wholeness and life, inspired by the value of creating something beautiful, of refining our work and ourselves, of striving to be better and to make the world around us better …

    … can we truly think of no higher purpose than to prostrate ourselves to some nameless “customer”? Is the only value in what we do, in who we are, distilled from whether we “deliver business value”, “demonstrate value to potential employers”, give “capabilities” to people who “want them yesterday”?

    This is a call to prostitution masquerading as manifesto.

    Striving for mastery of art, perfection of craft, betterment of self and the world around us is worth pursuing in and of itself.

    There are those of us who build software who recognize this and pursue the craft of software because of this. Software is both art and craft, regardless of whether some manifesto jives with one’s tawdry beliefs about business.

    Many of us are fortunate enough that the necessities of life, the house, the food, the clothes, the tools can be paid for in the currency of business by honing a craft that we love.

    Don’t let that obscure the fact that “the customer” is the least cause of growth in craft, the last reason we are compelled to the art, and the first hindrance to be left on the wayside when we gain the opportunity.

    • Hi Rick. I appreciate what you’re saying, but the bottom line is that if people could get all the benefits they need out of software without the actual development effort, they would happily take that option. I’m including myself, as a programmer. I’d much rather use WordPress’s infrastructure and software than “craft” my own website because I want to get to the outcome of having stuff on my site.

      I used to run my own Linux servers that I would tinker on and write scripts, and spent many years maintaining and customising mail servers. These days I use Google hosted domains and I get my weekends back. Without that inconvenient customer – which could just as well be yourself – there wouldn’t be any need for programming.

      I agree that the goal of bettering the world around us – and hopefully ourselves in the process – is an intrinsically worthy ideal. I just don’t think the highly-skilled trade of writing bespoke software is the medium to do it. In most cases the best software is the code you didn’t have to write because it’s already been done.

      • Branko Dimitrijevic said:

        “I just don’t think the highly-skilled trade of writing bespoke software is the medium to do it. In most cases the best software is the code you didn’t have to write because it’s already been done.”

        Yes, and for that piece of code to be reusable, it had to be well tested, well optimized, well documented and maintainable – in other words “beautiful”, written by an “artist” or “craftsman”…

  12. I have to admit I had to re-read the post as I got the wrong impression on the first reading. I thought you meant ‘trade’, not ‘craft’. Meaning that any muppet with google and a few tutorials could throw together the software we use day-to-day. I think the VB reference threw me.

    And so I mostly agree with you. Stamping our distinctive mark on things and the probably eternal quest for the ‘perfect’ code/style/app is not a worthy goal for it’s own sake. But some of the ‘craft’ is tied up in maintainability (best practices, readability, etc) and optimisation which are both usually important to at least try and do.

    I would make the distinction that paid, public-facing programming is not a craft in itself. But any crafting skills you gain in personal projects and from the experience of others has the chance to make you better at your job. Assuming it doesn’t slow you down enough to be unproductive.

    As an analogy, selling things in a shop is not a craft. But there are skills that people pick up over time that do make them a better seller, both individually and as part of the team and that they would clearly stand out from someone just grinding it out for the pay. As long as they don’t slap a ‘expertly sold by Joey’ sticker on the items or spend days stacking boxes into the optimal storage shape they really can bring positive elements of a craft to the job even though it doesn’t require it and probably won’t acknowledge it.

    As an aside, I believe that the ornateness of cathedrals was supposed to make them a place that God would see fit to visit, not for the people at all. On a recent visit to Barcelona I visited the cathedral there and the architect had detail even on the roof where nobody would know about it because supposedly God would see and appreciate it.

    • Hi Dan. I love your aside about the ornateness of cathedrals – it makes perfect sense. And I agree that programmers can be craftsmen. I’m just trying to steer us away from getting too wrapped up in the software itself and losing sight of the reason we were writing it!

      • Is there any evidence that folk who call themselves “software craftsmen” have a greater tendency to dissatisfy customers?

  13. I understand and agree with your concern about delivery and good results for customer.

    However, i understand that people involved on Craftsmanship movement desire the same thing. If the aim is deliver good business results, it’s expected that it could work well for a long time, it’s easy to be improved and other aspects.

    Your concern about “the glamour is overtaking the intent” is not fault of the manifesto. It’s fault of bad or naive developers.

    I hope more developers want to follow the manifesto. And also work to deliver good results.
    IMHO, it’s what we need: Craftsmanship and results.

  14. I would agree with this on the whole, I’d love to remove superficiality from my profession. Oh would I ever. However, I believe part of your argument is based on the flawed assumption that code beauty when compared to efficient work and delivering a better UI are mutually exclusive. Code must be read (and further maintained), and when that code is well *crafted*, it tends to be more easily manipulated, read, and maintained.

    For an example, take writing (which is in part what programming is) as a similar example. It’s true that any jumble of words can get a point across, but a well crafted slogan (for instance) allows for a stronger message… and is another example of something you’d probably never notice. However, you noticing isn’t the point, you interpreting the message is the point. But the craft that goes into it may make it more memorable, more quotable, easier to print on smaller media, or any number of other intangible or nearly intangable qualities.

  15. I hate to just blogspam you so I will show my entire post here. However I did want to blog about it as this is a conversation that I get into a few times a year.

    http://mynerditorium.blogspot.com/2011/01/programming-is-craft.html

    “craft -noun 1. an art, trade, or occupation requiring special skill, esp. manual skill: the craft of a mason.” (dictionary.com)

    “In English, to describe something as a craft is to describe it as lying somewhere between an art (which relies on talent) and a science (which relies on knowledge). In this sense, the English word craft is roughly equivalent to the ancient Greek term techne.” (wikipedia.com)

    In my opinion, on a whole, software development is a combination of craft and primitive engineering (which is slowly emerging as a true engineering discipline). The term craft usually means how something was made, not what was made or the perceived value of the end result by the layman. One of the commenters on the original post mentioned carpentry as a craft that may not always be defined by the value placed on the end product by the layman. In this vein, I will also mention that witchcraft is considered a craft.

    One of the hallmarks of craft is that that it is filled with heuristics and folklore. Much of the work of today’s software developer is squarely within this realm. More often than not, there is no clear-cut way to solve a problem. We craft a solution based off of our experiences and the folklore we encounter. It is worth noting that I consider blogs, google searches, MSDN, visits at a coworker’s desk, irc, and stackoverflow.com to be sources of folklore.

    I must say that I do agree with much of the post, but I think the terminology that is presented is incorrect. I think it would have been wiser to say that software development is most often not an art, and ego has no place in it.

    I also have to concede that in hindsight, I believe that the software craftsmanship manifesto was a bad idea. I recently learned there was a period of time when it was being debated if there should be clause in it to forbid using anything (tools, languages, etc…) that was not OSS. In my opinion the manifesto only serves to force a definition on something that needs no additional definition.

  16. Mitch said:

    Here in British Columbia, Canada (and other provinces), software engineering is a profession. To call yourself a software engineer and offer services to the public, you require a license. And it is not easy to get a license: http://www.apeg.bc.ca/reg/pengappdocsrequired.html Adn, If you scroll down a bit, you will see additional requirements for the software engineering discipline.

    The way to differentiate yourself is to become a licensed professional in my opinion. All the best!

    • That. Is. Awesome! So you have to complete modules in Organic Chemistry, Thermodynamics or Fluid Mechanics to get a license to practise as a software engineer?

      That’s it, I’m getting all my software from British Columbia now. You guys are serious.

      • caloggins said:

        Because having knowledge of organic chemistry would help you write better software how?

  17. Cody said:

    Wow awesome article, I love when people evaluate anything this much then are nice enough to share their thoughts on it. Kudos

    I do feel motivated enough, however, to throw in my two cents. First off, how can you differentiate between good and bad programmers, then in the next sentence talk about “negative space” in art like it is a real thing. The only thing worse than the requirements for a programmer is the analysis of expensive wallpaper.

    Second, you are correct about the requirements of say a lawyer or doctor to enter the field. I feel however after they are in they are just as much in the rat race as all of us. Programmers get paid to build good software and corporate lawyers get paid to minimize losses and potential losses. Though I have no personal experience I bet there are a lot of bad doctors and lawyers that get churned out of those schools because, like it or not, education is a business first. It is the job of the company to sort out the good and the bad.

    If a company wants to pay 400 programmers for a web app, and 399 of those like to sit with their thumb in a dark place then what is wrong with that.

  18. Justice~! said:

    Ha, I’m in BC too. Let’s not pretend that everyone working in the field in BC is a “software engineer”. ;) Quite a minority actually…

  19. Well there are SOME of us who have parents who worked in the industry…

    My mother started as computer operator and then programmed using punch cards before going to VMS.

    More than than my grandfather was one of the first people in the industry way way back.

    I did love the article, but I have to say that there are both professional programmers (still uncommon but more are evolving and groups like SANS are helping here with coding practices for security etc) as well as craftsmen (and those who are clueless).

  20. Ray said:

    I hope I am not covering points made by other commentators, but there is a very important side for the ‘beauty’ in software – maintainability and efficiency of operator use.

    True, a ‘software building’ doesnt *need* detailed comments on the logic, and even suggested test scenarios in the code, to just work, but how it cuts down the ongoing maintenance load.

    Everyone knows that maintenance is always 80% of the cost of a software project over its lifetime – so why make badly set out, poorly presented and explained code dramatically increase this cost ? I have been praised for concise, plain english comments, and neat and logical layout so many times by the poor sods who have to alter my code, but consider how many hours of billable time I saved the client over the years, by taking a little extra trouble.

    Likwise, what does it cost a company in human frustration, confusion and error when the user interface is incomprehensible, confusing and inefficient ?

    I have come across so many expensive problems and mistakes caused by employees “working around” an unpleasant and difficult to use software system. I personally have made money by exploiting the confusion of poor operators using bad software.

    All programmers should be made to use their software for a couple of weeks after it goes into production.

    Now, with the dearth of programmers who cant express themselves in English, we are bulding man years of code that will incur double or triple the maintenance work that a ‘crafted’ system would need.

    Ugly software is expensive software in so many ways.

    • José said:

      Very well said!
      If only clients could see those savings you mention…

  21. David Adsit said:

    Dan, thanks for adding your thoughts to the discussion. You ask about a manifesto for software craftsmen. I think that Pete McBreen wrote a pretty detailed manifesto in his book “Software Craftsmanship: The New Imperative.” Seeing the SCM inspired me to read that recently and I am glad I did. I love the idea of craftsmanship. My father is a small building contractor, so I grew up on construction sites seeing the care he put into ensuring that a building was constructed properly so that it would provide lasting value for his customers. I believe that providing lasting value for our customers should be our highest priority. We, as developers tend to forget the ‘lasting’ part of that equation. We focus far too often on delivering v1 to the detriment of v2 (otherwise, why so many attempts at a grand rewrite?). To paraphrase Alistair Cockburn, we are trying to survive in a swamp; we have to provide for the immediate need of delivering business value while preparing for the future. To me, this is craftsmanship: we think not only of today, but also the future. This doesn’t mean a return the to Big Design Up Front. This means, putting care and thought into each statement, function, class, and test that we write so that as we meet today’s functional requirements, we leave the code clean and clear enough that it can be extended later.
    When it comes to differentiating myself from a commodity developer, I think my primary impetus there is to get paid more because I am worth more. It sounds egotistical and selfish and it probably is, but I think it is also the honest reason behind the need differentiate. When we read that some developers are an order of magnitude more effective than their peers, I wonder why the salary range doesn’t reflect that. I have also wondered many times why some developers even get paid at all considering how little value they add and how much damage they do. I haven’t got the faintest idea what the solution to that is. I certainly don’t believe that it lies in certifications and degrees. A council of master developers that evaluates potential master developers appeals to me, but I don’t know how that would work in practice. Even if such a council existed, would we see businesses be willing to pay a craftsman $200k / year, when they can get commodity developers for $65k / year?
    Do date, the only solution I have come up with that I find acceptable is to reduce the gap in skills. Since I am unable/unwilling to unlearn or stop studying, I make it a priority to push/prod/inspire every member of my team to improve and grow as professionals. I suppose there is a selfish component to that as well, but if I am going to be in the same pay band as someone, I want them to have a similar level of skill. I also want people on my team to challenge me to improve.
    I guess craftsmanship has to be a personal attitude, not something you get from adding your name to a website.

    • Amen to that!

  22. Ben said:

    I appreciate your point of view as well as your clarity and thoughtfulness in presenting it. Perhaps software engineering is not a craft — perhaps none of engineering is. Your article inspires me to question the importance of that characterization at all. Perhaps only to the risk of one’s own ego. The comparison to a plumber could be responsible for the pejorative interpretations. Although I see the relationship when stacked against some of the code with which I’ve interacted (total septic waste!), it’s hard to think of some true architectural works of genius in plumbing. I got the sense that this is the crux of your article though. The true value of a software system is in the powerful architecture it provides to easily create and tweak features that delivery reliable function.

    That was a lot of adjectives in just a few sentences!

  23. Lemonhead said:

    What a long-winded, blowhard article.

  24. Peter Venkman said:

    Let’s write a totally unneeded and probably wrong analysis about… cars, making cars.

    Toyota (randomly chosen) makes cars. What Toyota does to make cars is mostly “engineering”. That is their process. The final product, the car, fulfills certain objectives, which could be summarized in: “an acceptable quality for the right price”. Engineering aids in achieving those objectives. The process is pretty irrelevant other than to make them achieve the objectives.

    Bugatti makes cars too. What Bugatti does to make cars is mostly “craftsmanship”. That is their process. The final product, the car, fulfills certain objectives, which could be summarized in: “making a very distinctive vehicle”. They certainly not care about price and they probably have even some difficulty in calling it a car. The process does have some relevance, but it’s still seen as a means to achieve the objectives.

    Filandri Moreno makes cars too. Well, he made one car. What Mr. Moreno does to make his car is a “hobby”. That is his process. The car he made fulfills certain objectives, sure, but I could bet good money that to him the process was at least as much of an objective (if not more) as the final product.

    “Unknown Tuner” makes cars too, mostly. He would at least. What he does is also a “hobby”, but he prefers just modifying his car, adding some details while leaving the “hard/basic stuff” to the industry. His objectives are varied. He may like the process itself or he may like the final product, or both, or use the product as a means to something else (showing it around or whatever).

    Oh, also, some guys modify cars professionaly. They have tuning shops, so it’s not a “hobby” for them. It’s more of a “job”. And they probably like it a lot, but I don’t think they would call it anything else than that, a job, and I don’t think they focus much on the process.

    —-

    In my -not so long- programming career, I (think I) have applied some engineering and some craftsmanship. I haven’t achieved nothing resembling art (at least yet). And yes, I’ve had a programming hobby.

    Only when treated as a hobby I reckon I’ve put much focus in the process as an objective in itself. That’s my main problem with the “software craftsmanship” movement (maybe not with the ideas themselves): they’re focusing too much in the process itself.

    —-

    The problem is, imvho, we’re still trying to force Programming into an existing category. We (as a group) still feel a need to make it fit into an existing approach. Maybe, just maybe, it would be better to really analize what works and how it works when making software and define it as it’s own peculiar activity, instead of all this “let’s now apply the idea of engineering to software and see if it works” (yesterday) or “let’s now apply the ideas of craftsmanship to software and see if it works” (today) or who knows what tomorrow.

    —-
    disclaimer: I’m just nobody, I don’t have a big blog or great achievements in software development, so I might be very very wrong in what I just said. It’s ok, I’m aware of it :)

    • George said:

      Hey Peter, hope you read this. Keep doing what you’re doing. I hope to hire a whole buch of people like you someday. You get it.

  25. John said:

    I love this bit:

    “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.”

    Brilliant. Totally brilliant

  26. John said:

    As you rightfully mentioned, engineering and medicine are “proper” professions but we have to remember they have had many years to be refined and properly structured. Programming is still quite young so it will take a couple more decades to “get there”.
    Software craftsmanship is very important both to the programmer and non initiated because beautifully written (and indented!) code, with nice syntax highlighting and comments as well as a lovely system architecture depicted with either uml diagrams or screenshots enables one to “visualise” the final product and be in awe of its beauty and simplicity.
    An analogy would be building plans and architectural drawings which don’t look as good as the final edifice to the non technical person unless they can “visualise” it. Which is why an artist impression of the final product is created to facilitate “visualisation”.
    The same applies to chemistry formulae and molecular representation with “models”.

    Frankly code does not really need to be shown to the untrained eye or mind because it’s inconsequential to them just as engineering structural calculations of a bridge do not need to be shown to the city mayor.

    However craftsmanship in relation to software is important among programmers because it also helps in assessing the overall soundness of the system design.

    Programming is a burgeoning profession/craft that will eventually be at par with other already respected/established ones.

    • That’s a lovely post! Thanks for sharing it. The Pillars of the Earth was dramatised on UK TV a while ago, and I think they captured the character of Tom Builder exactly as you describe.

      • Liz said:

        The book was better, if you want to borrow it…

  27. Chris said:

    A long, meandering, misinformed post from someone who doesn’t even seem to understand the problem, let alone be able to analyse it.

    The are so many problems in the post, I’ll just take one at random and point out it’s flaws. To take the last paragraph In the “let’s be craftsmen” section. Who cares what title you put on it. Who cares what the training is. You dont care if you have a plumber who went to Harvard vs one who was apprenticed. As long as they get the job done to a high standard in a reasonable amount of time, then it doesn’t matter.

    Your critique if the plumbers personality and methods is also looking at the wrong thing. Who cares if they’re a primmadonna, and want to use XXX development style and care about code elegance. As the customer that isn’t really your concern. Your concern is a good final product, on time, at a reasonable price. The same way that you don’t care if the plumber does his work crouching or sitting, you don’t care ifyour programmer use agile or scrum.

    You only get a voice in these matters if you are managing the team or have a say in how it us run. And in that case, you would be a programmer. Which you are clearly not.

  28. jobsket said:

    Hi!

    I think you wrote a nice ellaborated article but as some people already pointed out I also think you’re making some incorrect points. I absolutely agree with Zvolkov which says artist != craftsman. Art it is just a subset of craftsmanship (therefore may be a synonym in some cases). Would you say that shoemakers, watchmaker or traditional pastissiers are not craftsmen? Yes, they are, but they are not artists. They are craftsmen that don’t put any of their own ‘personality’ in the final result. So personally I think it’s clear there is quite a difference.

    At your blog post you’re focusing just at the final result, as you were arguing with Matt. Damn, I really appreciate a well crafted shoe that doesn’t let the water come in in the rainy winter. In fact I probably appreciate it more than a nice piece of art :) But think that using your arguments a graphics designer would definitely be a craftsmen but a programmer wouldn’t. Going back to my first paragraph, that’s because a graphics designer is much closer to an artist.

    Said this if we look at the Internet we can find thousands of popular services/software/apps that are making a diffrence and that people love. Do they care about their internals? You’re right, absolutely not. Have been these services developed by software craftsmen? I guess most haven’t, but probably some of them have and there is great people behind those services which love their professions and consider themselves craftsmen.

    Please note that I share many thoughts from your article, and I get your main point about the dangers of programmers egos, but I think it could be formulated in a different way.

  29. Bob said:

    I like the article, But it kind of saddens me because I like the beauty of efficient algorithms!

    One thing I’ve noticed is programming has different levels in respect to college required. Ill use web development for example, with a undergrad degree you can do application development, web development, etc. With a Masters Degree you can do all that and kind of dig deeper into lower level languages easier like assembly languages. Probably have better skills to recompile MySQL. With a PHD you can really push into the niche jobs like quantitative development where you program advanced statistical models for brokerage firms. I really dont understand why people think college degrees are not very important in programming. I just left a job because my skills where g oing to waste and my boss just over all hated me because I understood algorithms, data structures and efficiency better than he did (because of college). I think in respect to web development the last generation didnt need a college degree because the field was so young. However today I think it is necessary for new hires if you dont have atleast 5 years of real programming experience.

    You mentioned we should have some way to know the difference between masters and every day copy and paste programmers. I have found these questions help me in web development to see who really know what they are talking about:

    1) What is the difference between pass by value and pass by reference
    2) What does it mean to normalize a database?
    3) What is polymorphism?
    4) What is the difference between a function and a method?
    5) What is the difference between managed and unmanaged code?
    6) Explain the benefits of using a store procedure/routine?
    7) What is AJAX and what are the benefits to using it?
    8) What does it mean for something to be thread safe?

    I hope these questions help others because as sad as it may seem I have talked to web developers with 3-7 years of experience and they miss over half of these questions.

    Also wanted to point out if you have people who really enjoy what they do and look at it as something they want to perfect you will get better results than someone who just puts something together to please the business side.

    For example at my last job a guy focused on just pleasing his boss (a non-technical guy) so he would just do enough to get the ok with him. Well after half a year of working on a CMS system its being scrapped and the project out sourced. Than later after working on a FTP site for 3 months that was scrapped too. Why was all this stuff scrapped? Because things where too buggy, algorithms would crash web browsers, servers would lockup during queries, store procedures were not being used so updating queries took rebuilds to fix, user interfaces were not fast in getting people to what they needed. All of the problems these two sites had were due to not having training in things like asymptotic complexity, data structures, memory and processing consumption and many other things I learned in Computer Science courses in college.

    • José said:

      Thanks Heaven! I’m not a copy and paste programmer. I can answer all of your 8 questions!

      :)

    • Jim Cooper said:

      Hmmm. When I’ve interviewed programmers, the closest I’ve come to asking any of your questions is number 3.

      They are very technology specific, and not really programming skills questions.

      And do you really still use stored procedures? :-)

    • João Jesus said:

      Hi! Just wanted to leave my 2 cents because your comment kinda touched me on a sensitive spot :)
      I don’t have a degree, although I work as a programmer for 4 years now.
      I can honestly say I can answer your 8 questions. Wich I think are very good and pertinent.
      I don’t think it’s a matter of degree (or maybe even knowledge) but a matter of attitude. I love my work and mostly the challenge. And I stride to know more and perfect myself. That’s my notion of the meaning of the word carreer. Sure, maybe with a degree I could know more and be better. I can’t disagree with that.
      Still, I mostly see people who have degrees but can’t do the kind of work I do. And that only saddens me because, although it may be generally true, there’s a general notion they are better just for that.
      Hence, right now, I very solidarity with the matters here by being discussed. :)

      Cheers!!

      • Bob said:

        Very true Joao, passion and drive will always overcome education or certifications. I wish I had guys like you on my team at work. Im sure your a great lead based on you response and I think those questions can be answered without a degree or certifications

  30. Stephen Mc Namara said:

    In my experience the best, most skilled programmers work to deliver & deploy (not just develop) software that will ‘delight customers’. But with an expectation (or at least the hope) that it will be useful then they understand that it will be extended, maintained and improved _by others_.

    The care, skill and craftsmanship that goes into the software (that the external customer doesn’t much care about) is paramount to the next poor sod that has to come along and build upon what we did.

    So perhaps ‘fellow developer as customer’ can provide the less egoic motivation for skilfully crafting the work we do.

    As for plumbing that’s easy. Lefty loose-y, righty tight-y. Shazam!, you are now a qualified plumber in the state of BC.

    • Brendan said:

      *province* of BC. We don’t have states in Canada.

  31. Alex K said:

    Hmm….. I have been a freelancer for 12 years now. I do not do Open Source (most OS projects seem boring to me ). If I want to learn a new language or develop my knowledge in something the client doesn’t need I go to somewhere like Project Euler and pick a problem. And yes, I enjoy coding, but I do not code in y spare time. I want to balance my life so I try to ensure I spend as much as I can of my spare time dealing with people not machines. I looked at the photos of the guys on Red Coder and they looked autistic. THis is not for me.

    I have seen some crappy open source code in my time, from PHP through C to Java.

    I would hope that the fact I have survived as an independent through two recessions would speak to my craftsmanship.

    Well crafted code to me does what it is supposed to do (even if the client leaves what it is supposed to do largely up to the developer), handles exceptions and deviant user input properly, is efficient well commented and easy to maintain. Oh, did I mention tests? No tests is bad code. The quality of the tests usually tells you something about the develoer who write them

    I have found that the code I write normally dies after a few months, a year at most. I try to write well crafted code for my own satisfaction as much as making sure it does not comeback to bite me. I recall one client saying they wanted speed not quality and I think this attitude is the root of much badly crafted code

  32. ChrisMelikian said:

    There are (as ever) two sides to the story.

    One, we are building applications for businesses in order for them to make money. As time progresses, our work is commoditised, and we chase the higher ground. Our work is utilitarian, only there to add value to businesses.

    On the other hand, to make sense of what we do and because we have to use every fibre of our brains to do so, we perceive our work as an art form or profession to make sense of it. For anyone to say a piece of code is beautiful, you have to be a programmer or delusional. What programmer wouldn’t really want to make something real, that lasts more than 6 months and can actually be seen, held and admired? As we don’t have all that, we try and use our intellect to make it smaller, faster, easier to maintain and beautiful by simplifying. That gives us the kudos we need to stay sane.

    I suppose what I’m trying to get at is that we’re not much more than builders, high value builders true, but builders nonetheless. An art/craft form we are not.

    That all said, I’d love to be able to be able to prove to a customer that I’m worth more than another programmer. It’s a hard job recruiting a programmer. It’s about factoring in knowledge, skill, resourcefulness, attitude, commitment and innovation.

    No appointment or qualification will cover that. Could stick to narrower categories but then we’d get stuck in the same problems as someone earlier mentioned about PhD’s. Our industry changes every 6 months so radically a well qualified person 5 years ago is almost worthless today unless they’ve kept up with the trends.

    I don’t think there is any solution. It’s each to himself putting forward the best case to stand out amongst the crowd.

  33. “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.” Very true. Most people in software discipline are only there because it’s better paid than any other comparable job. These are the people who have spoiled the spirit of the profession.

  34. Great article! It was highly overdue to take such a close look at SC.

    Although I perfectly well understand the motivation behind the SCM – at least I guess ;-) I also feel it misses the mark. There simply is too little in it for the customer.

    So what´s the fundamental problem? Doesn´t software do what it´s supposed? No. Is it too slow? Doesn´t it scale? Not secure enough? No. All this might not be easy to accomplish, many technical skills are needed – but all in all software delivers on functional as well as non functional requirements.

    Rather the problem lies with non stated requirements, I´d say. Non stated requirements are those the customer simply thinks they are fulfilled anyway. I´m thinking specifically of:

    -evolvability: software will be easy to adapt to new requirements in the future
    -correctness: functionality is working flawlessly: no errors, no crashes, no data loss
    -production efficiency: software developers are not wasting time; their “software production machinery” is well oiled and working on top speed
    -improvement: software developers have up to date knowledge; they improve their thinking and practicing constantly; they learn from failure; they reflect on the outcome of their actions

    This is what customers assume – but it´s not really close to reality. So if we need a manifesto for software development, then these values should be at its heart, I´d say. They are customer focused, they are about delivering value, the benefits are tangible.

    As a customer I simply assume software is “well crafted” – but what does it mean? The SCM does not tell. Of course software developers ought to “steadily add value” – but what kind of value?

    As a customer I don´t care if software developers are working alone in a hut or in a team. Just add value every single day. So as a customer I don´t care for a “community of professionals”. If developers need one, well, then create one. But don´t bother me with that as a customer.

    Yeah, a “productive partnership” is great, so what I, as a customer, ask of you software developers is: deliver value according to my requirements every single day. And that includes the non stated requirements.

    A new manifesto thus should not state the obvious, but should focus our industry on what´s missing. If we constantly deliver not only on the stated requirements but also on evolvability, correctness, production efficiency and improvement: then customers will be happy which will make us happy.

    And if in order to deliver production efficiency a community of professionals is needed… then by all means create one. But clearly distinguish between goal and tool. The statements in a manifesto always should be about a goal relevant to the customer, not tools and means.

    Ups, I guess I got carried away a little ;-)

    • Ray said:

      Yes, there is so much ‘assumed’ in the customer/programmer experience. management who ‘assume’, are not managing.

      Building on the “Just add value every single day” comment, perhaps the nub of the matter is how we define value ?

      In simplistic terms, perhaps an employees ability to say – calculate a mortgage refund is worth $500 a week in time saved by employees, so management authorise 2 months savings $4000 to the project. Programmers do $4000 of work, and it goes into production. Happy business manager.

      But due to insufficent testing, peer code review and ongoing auditing, over the next 2 years you give away $50,000 due to an unforeseen errors. It costs $15,000 to investigate, remedy and correct. It creates bad customer relations, bad press publicity and bad relations between management and developers.

      All in all, very negative Net value to the company.

      Mangement who are disinterested and disconnected from software developers standards, methodology, thoroughness and processes might as well be disinterested in their manufacturing staff’s training, safety and quality of production. Its going to cost them just as much.

  35. Jonathan Shields said:

    I totally agree with much of what you say. The end goal is to give the user what they want in the time they want it. It is best practice to do this in a way that involves writing as little code as possible for the that code to be easy to maintain.
    In the real world of actually doing work meetings deadlines and still having time to go home and see the wife and kids sometimes has to take precedence over crafting a pristine solution using the latest programming philosophies. In any job, sometimes you have to settle for “gets the job done” instead of outstanding.

    People who get the job done tend to stay in a job. Your customers don’t care whether something is written in Python, VB6 or COBOL as long as it works. However, it is usually the right thing to do to use a current programming language!

  36. I think Dan neatly illustrates why it’s a personal journey. This fine post is about what “software craftsmanship” means to Dan North and why Dan North believes programming is not a “craft”. All I can do is acknowledge that belief and respect that that’s the way he feels about it. There’s nothing more to be said.

  37. Mat said:

    I agree with your article. The symptoms are plain to see: projects frequently overruning and going over budget, continual shifting of technologies and working practices (e.g. waterfal -> agile, structured -> OOP), contuinual testing of candidates during interview, inconsistent testing, bad quality control in software. In of these problems indicate to me a profession (if that what we should call it) that is still struggling to establish itself as such.

    IMHO, the problem starts in the Universities because they are teaching the subject of IT, not the professional of I.T, as doctors and lawyers would.

    The problem is further compounded by companies offering highly paid jobs without insisting on a minimum professional standard such as a relevant degree and membership of professional bodies.

    Until these two things change, the IT industry is never really going to shape up to other, more established professions.

    • Hi Mat. That is a really insightful observation: [universities] …are teaching the subject of IT, not the profession of IT, as doctors and lawyers would.

      I wonder what teaching the profession of IT in universities would look like?

      • Mat said:

        Well, for example, I assume doctors are taught the correct way to use a stethoscope a basic tool of their trade. Would you ever expect to meet a doctor that could not use one and get through their training?

        Consider, when was the last time you ever saw an IT course that had programming and design that formerly taught a student how to type? IMO the keyboard is a basic tool of my trade as a developer.

        Many developers argue that copy typing and programming are not the same, but they’re missing the point. Developing software isn’t just about bashing in a program and making it work. If done properly there is a lot of documentation that should be generated like use cases, requirements, specs and test plans.

        IMHO, to be a software developer, good typing skills are essential yet are not manadatory. You don’t have to be whizz audio typist, but RSA 1 & Pitmans 1 is an easy course for anyone to do at night school (or as a module in a larger IT) and shows a mimimum proficiency of 30wpm. I’ve never needed to go further than that.

        But, having made that point, maybe you can now appreciate a little more why there are such problems as developers that struggle to comment their code or hide behind automation.

        That’s just one example of how universities and colleges are failing to prepare their students to be IT professionals.

      • Marty Nelson said:

        You would do stuff like spend a couple of months on successive changes to a code base and not be allowed to refactor, then do the same thing with refactoring.

      • Stefan said:

        I don’t know about doctors and lawyers , but what Marty Nelson said above reminded me of a very interesting aspect:

        Currently, at universities, computer scientists learn how to create a program from scratch. But they do not learn how to work on existing code, or maintain it. That is like teaching a mechanic how to build a car, but not how to repair it.

      • Jim Cooper said:

        It always strikes me as odd what people say about their university courses, but maybe I was just lucky.

        When I did my course (some 20-odd years ago), I was perhaps fortunate to have academics who had also spent quite a lot of time in industry. They went to quite some pains to explain why they were teaching what might have appeared to be quite theoretical concepts, and how they would be useful to us later. By and large, they turned out to be right.

        The only lecturer who had only been an academic was our numerical methods lecturer. It may just be coincidence that that is also the stuff I’ve found least useful since I’ve left uni :-)

        We also did get to work on large (at the time we thought they were, anyway!) code bases, like Minix, and I had a programming job in the summer holidays as well, so I very early on got to understand the consequences of shoddy workmanship.

        Did I have such an unusual education?

      • Keith Ray said:

        In “Every Patient Tells a Story” by Dr. Susan Sanders, M.D., she writes about some of the successes and failures in teaching how to do an exam and make a diagnosis. (Subtitle: “Medical Mysteries and the Art of Diagnosis”)

        Eventually someone does a study that shows that a particular exam technique, or test, is useless or very useful, but many activities done by medical profession are not backed-up by science.

        Ironically, she’s technical advisor to “House M.D.”: House usually orders lots of tests and usually avoids personally examining the patient, and she advocates a more hands on approach.

  38. Stefan said:

    Software craftmanship comes at different levels.

    At first we become masons, who learn how to work with stone, how to build a solid and lasting wall, how to use all the tools and resources.

    Then we become architects as our experience with all the kind of elements we build grow into an insight how best to combine these elements into building a whole house.

    Then we become city planners as we start to consider the lifetime of what we are building, and strife to make it grow with extensions, break down and rebuild outdated parts, and restructure our products in anticipation of the ever-changing needs of the people.

    The level of skill can vary from utterly dumb to visonary mastery. I do not think any other profession covers such a huge range of skill. Not even close. I doubt that it makes sense to invent a system of apprenticeship and mastery without first breaking down software development into the ‘masonry’, architect’ and ‘planner’ craftmanships. Of course, a good ‘mason’ may become an ‘architect’, but that requires quite a lot of additional skills, and many ‘masons’ simply don’t have them, and no ambition to learn. Similarly, ‘architects’ might choose to move on to become ‘city planners’, but again, there are more and different skills to master that they may not have.

    If you start out in a craft as an apprentice, your goal is to eventually become a master in that craft. In software development however, people do not usually start out to become an ‘architect’, or beyond. The question is whether they should.

  39. Danny Martin said:

    Hi Dan, and thanks for a great and thought provoking article.

    I myself am self taught (over twenty years ago now) and anything I did learn at school, with a piece of paper to prove it, is so outdated that it is actually a hinderance rather than a help… There are scarce jobs out there today for SIMON programmers on the ‘BBC B’, and 68K Assembly programmers are not as sought after as once they were.

    I do a lot of work these days in the cloud, and ‘up there’ there is a lot more scope for the craft, although admittedly most of this is on the front end. There is one thing that drives web devs to write more elegant and structured code, and it’s called ‘View Source…’. I’ve worked on a few projects where I’ve known exactly how much of a craftsman my predecessor was, and they weren’t going to be building cathedrals anytime soon.

    None of this answers the original question of course – so here’s an analogy for you. Rather than Plumbers and Stonemasons, what if you compare developers to chemists? My intricate knowledge of Chemistry could be written on one side of a bit of litmus paper, but with this limited understanding I can see some real world parallels: Neither create the final, forward facing end product, rather we both produce the ‘foundations’ or core components of those products. Both mix components (usually produced by others) in different ways to produce something new (or just slightly better) that, at the end of the day, the final consumer couldn’t care less about, and will never see in isolation. Nobody cares what a stroke of genius it was to add just a pinch of ‘Okey Cokey 2000′ as it contains just the right amount of ‘Brand X’, just as no-one cares how long it took to carefully optimise that particular search algorithm.

    Perhaps then, rather than looking at programming as a trade or a craft, we should be thinking of it as a science. Not an exact science, but one that is roughly covered by a set of general rules or laws. Rather than tradesmen or craftsmen we should be looking at dabblers and scientists, with the occasional genius cropping up once in a while…

    Just my two penneth, and thanks again for a really interesting piece.

  40. Mike said:

    Well Dan, I think you hit a nerve or two here – there are some harsh words flying about. Some personal too. I hope its folk you know and its tongue-in-cheek.

    The core of the SC movement is about loving what you do, caring about it. Self improvement is a given when you love and care about what you do. Anything else is fluff.

    No one writes Manifestos for Snowboarders – you don’t need to. Those who love it, do it and learn new ways to do it better. Those who don’t, sit in the bar and get pissed.

    Whether it is a craft an art is irrelevant. If you are paid to do it, you are a professional and that is it! It makes no assumptions are good you are. Generally a profession is regulated by the market, if you float the buyer’s boat, you get more work or get paid more. If not, you don’t.

    One of Dan’s key points here is customer’s delight – generally through the thing you built. You could hack the heck out of it and still delight the customer. Another point is focusing on delivery rather than simply the elegance of production. Some elegant Y2K code was written and delivered past 01/01/00!

    If the SC movement is to survive and thrive, it needs to get beyond mere ego boosting and pride-in-your-work thing to something that we can all see value in. Developers and people who hire us.

    I really liked the learning about OSS. It is the equivalent of Standup Comedy, you do it because you love software and useful software at that. Enough to show your competency to the world. Those who stick at it are what I call prime time programmers – with great collaboration skills, well developed sense of self organisation and the desire to be useful.

    Thanks Dan for getting this discussion going, I might not have bothered otherwise.

    • Hi Mike. Thanks for stopping by. The way you describe software craftsmanship is everything I hope it will become: doing something you care about to delight the people you do it for, and choosing to become as good at it as you can.

  41. Ben said:

    I believe programming is an art and there is definitely the difference between the “doin’ for the money” programmers and the true artists. Unfortunately, we also live in a society where our clients really couldn’t care less for art. They want an elegant solution tomorrow for $10 per hour. Their definition of an elegant solution, however, is “does it work?”.

    I think the true test of whether you are an artist or a “doin’ it for the money” programmer is to answer the following question. If you were a billionaire, would you still write code? If the answer is “No”, then most likely you are in it for the money. If the answer is “Yes, but now I can afford to code what I want to code and learn new things”, then you are an artist.

    My rant is, in a society where the client/employer only wants faster and cheaper and cost of living is skyrocketing, it makes it harder to be an artist. For a software craftsmen guild to actually work, software consumers need to change their attitude. They need to, out of the gate, respect that good things come to those who wait and you truly get what you pay for. Also, to respect that software development takes time. We all have spent 40 programming hours on a module for someone, only to have that person make a “small change” at the end or decide “they didn’t need it anyway”.

    We, as software developers, are the “Rodney Dangerfield’s” of the professional world. “We don’t get no respect”. Until then, these radical changes will fall on deaf ears. Perhaps this is a process, and programmers NEED to organize, but like it was mentioned, programming has a small barrier to entry, so when the artists go on strike, the employers just hire scabs for pennies on the dollar.

    Anyway, just a few of my thoughts.

  42. Jason Gorman :

    Is there any evidence that folk who call themselves “software craftsmen” have a greater tendency to dissatisfy customers?

    Hi Jason.

    Interesting question! In terms of objective data I certainly haven’t been gathering any. Subjectively, I’m talking about the difference between programmers who are on your side, trying to use software to get a result for you versus programmers who vanish into the beauty and intricacies of the “craft.” I’m concerned that people on both sides of that equation might consider themselves software craftsmen.

    To be clear, I absolutely think programmers should have a craftsmanship mentality, in the same way a master plumber or master builder will have spent many years learning, practising and developing their skills so that when they come to help me, they have both the ingenuity and experience to solve my particularly unique and awkward plumbing problem (I’m still talking about my house here ;).

    I just don’t want a plumber who believes they are in business because plumbing itself is beautiful, rather than accepting that people simply want hot water. I’m not saying programmers shouldn’t be craftsmen, I’m saying programming isn’t a craft.

    • Dan North :
      I just don’t want a plumber who believes they are in business because plumbing itself is beautiful, rather than accepting that people simply want hot water. I’m not saying programmers shouldn’t be craftsmen, I’m saying programming isn’t a craft.

      This is a false dichotomy.

      Customers should not care what motivates the developer. Most, that I have known, don’t. They want their product on time, budget, and, if they’re savvy enough, developed to a standard such that another developer has a decent chance of being able to further extend/modify/maintain the product.

      Please, let us not dictate what people should or should not believe in the performing of their job. The result is the issue. Let’s leave the individual developer’s desire to self-actualize out of it, unless it comes at the cost of the customer’s product, shall we?

      • Perhaps a more reliable notion: customers don’t want to work with plumbers who brag to the customers about how beautiful is their work; nor those who justify schedule and cost overruns in the name of beauty; nor yet those who insist that the delivered product be different from what the customer wants, because it’s more beautiful.

  43. JoJo said:

    Very interesting article. The analogy of the Samurai could not be closer to the truth. I have many years experience in martial arts (specifically Judo which, as you no doubt know was derived from jiu jitsu) and less experience in programming. As an interesting story I stay in a smallish town where there is not much opportunity for someone with a degree in computer science (like myself) but the reasons for me staying here is not the focus point of the story. I moved here a couple of years ago from a reasonable large city (after completing my studies) and left behind the Judo Dojo I have grown up in. I joined a martial arts dojo in this small town and on the first night I was to fight against the highly ranked students. Now because it was a different martial art to Judo I was in for a tough couple of fights. New guy, no one knows me, I haven’t told any of them of my 16+ Judo experience, but it was a good test to see what I was capable of. The fights went as well as could be expected from “clean” fights. I made new friends got a great reputation and they got a great addition to the Dojo in terms of experience.

    Now, I’ve had a couple of “programming” jobs in this small town, but every time I had to correct employers and employees on misconceptions of “programming” and basically rebuild my reputation as a programmer every time (interviews were especially tricky).

    What I’m trying to say is that I agree. Some sort of “entity” needs to exist in which programmers can be recognized and have a reputation\rank, some form of indication of what their 10 years experience really means. I love programming, aesthetics is not my main concern but quality apps is what I want to give to the people who needs it. But I believe, the programming art\trade\craft\science what ever you wish to call it is still in its infancy and firstly requires a ‘whole lot of love’ before any major ‘professionalism’ will be recognized by non-programmer types.

    Just my 2 cents…

  44. mehgerbil said:

    Find a problem.
    Evaluate it.
    Fix it.
    Do a good job.
    Get paid.

    Why it has to be anymore complex than that is beyond me.

    • JoJo said:

      Can’t help but to notice your fifth point…. if you love what you do and have a great passion for it then money should not be a focus point… it should be seen as a nice perk…

  45. Mat said:

    mehgerbil :Find a problem.Evaluate it.Fix it.Do a good job.Get paid.
    Why it has to be anymore complex than that is beyond me.

    Would you be so blase about spending tens or hundreds of thousands of pounds on a house? Or would you expect the people that designed, built and surveyed the house to be properly qualified and experienced. Good quality software is really, really expensive and yet businesses seem to think otherwise. Perhaps the biggest failure of the IT industry is it’s inability to get this message across.

  46. Some fools like you just happy triggered type nonsense and post it to the Web.

    Looks like you don’t know the meaning of the word craft which has been used time immemorial to indicate what people do to put bread on their table.

    So what is a craft? I will define it by “Wikipedia” from historical sense standard:
    A craft is a branch of profession that requires some particular kind of skilled work.

    Craft means profession, means some group of people will depend to make their living on it, craft means skilled, means you must know what you are doing, programing has all these and more.

    Okay it is easier for you to type all these personal perspective about programmers, but you are wrong. You have forgotten that a programmer wrote the code that you used to put this entire claim together, why don’t you use a quill or feather and ink. You are like somebody that is dying and taken a drug prescription from a doctor and used the drugs and later says making medicine is not a craft after his well again.

    What are you some primitive animal? But you put “.Net” to your name. Hardware and software complete engineering cycle. May be you wanted to become a C++ programmer, but your slopy brain was not developed from kid to handle thinking like a programmer, so you become something else and your passion turned into hatred. It happens. Or you just want to collect programmers email address and use it for your selfish gain.

    If you want to wait till eternity to see the day software will become beautiful, you don’t need to wait its already happening, go and buy game, buy Hallo, Assassin Creed, even cheap ones like World of Goo.

    Is there any discipline you want to talk about that software has not change the way the profession work, take architecture for example, they used pencil in the past and take more time to finish project, now with CAD software, they can do better, diagnostic software in medicine, nuclear installation monitoring software, entertainment etc.

    So if you achieve being able to standardise programing into a craft what improvement can you gain from software engineering than what we have achieved so far.

    What you don’t know in reality is that all craftsmen work tends to fall back on something:
    Engineer create hardware which fall back on software
    Programmer create software which fall back on user
    Doctors create drugs which fall back on user
    Lawyer create defence which falls back on user

    So you see moron in any profession, it all ends with user!

    • “Some fools like you just happy triggered type nonsense and post it to the Web.”

      I think this comment may have fallen into it’s own trap ;)

      • You don’t get it.

        The article says “It would be great if programming were a proper profession, but it isn’t…”, and more.

        Doctor won’t be happy if you write article like this in their journal or in the hospital, like wise lawyers if you talk like this in the court. Calling programming a non-profession on the Web is a slap to all programmers anywhere in the world, especially those that helped to create the Internet that the writer is now using to abuse us.

        They call doctors physician still nobody will abuse them in their environment, if programming is the main problem here, please note they are also called software engineer.
        Is engineering not a profession?

        Was there a hidden motif to this article? What does the writer wants to achieve by starting this blog?

  47. Danny Martin said:

    Sorry for posting again, but I’ve been talking to some of the guys about this, and I was reminded of a truism that adds a bit to the debate… What is the main purpose of ‘source code’? It’s not to communicate with the machine the software will run on, if that was its purpose it would just be 1′s and 0′s – it is to convey the functionality of the software to a human reader, whether that is the original developer, his / her successor, the open source community or whoever else may get to see it.

    Given that argument I can see every point in making that code elegant and readable – ‘Crafting’ it if you like… Makes sense to me.

  48. nickels said:

    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!

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

    • nickels said:

      nice !!

    • oldfartdeveloper said:

      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.

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

  50. nickels said:

    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 :)

  51. Bas Hamer said:

    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/

  52. Liz said:

    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.

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

  53. John said:

    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.

  54. mark said:

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

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

  56. jerome said:

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

  57. Phil Shaffer said:

    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.

  58. John said:

    “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

    • JoJo said:

      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.

  59. Mateusz said:

    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…

    • Matt said:

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

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

  60. Paul said:

    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.

  61. Hank said:

    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.

  62. JoJo said:

    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”

  63. Sayeef said:

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

    • He called it a trade.

      • Sayeef said:

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

  64. Br.Bill said:

    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.

  65. Guillaume said:

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

    • Sayeef said:

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

      • Guillaume said:

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

    • Stefan said:

      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.

      • Guillaume said:

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

  66. Micheal McCoy said:

    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.

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

  68. Jones said:

    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?

  69. Ferdy said:

    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.

  70. Alex said:

    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.

  71. Karsten said:

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

    True, good observation!

  72. Daniels said:

    I’m to lazy to read this article ^^

  73. > 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…

    • Ketil said:

      “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

  74. Johan said:

    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…

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

  76. BrianL said:

    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.

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

  78. Stray said:

    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.

    • 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!

  79. Stefan said:

    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.

  80. bob said:

    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!

  81. Yann said:

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

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

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

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

  84. Kris Randle said:

    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.

  85. we need to move from craft to engineering, to bring discipline, to create a real profession.

  86. It is enjoyable to read this thread of comments by people much more articulate and smarter than me. Hopefully I won’t spoil it for the others by adding my vague opinion…

    A hundred or so years ago, people had very similar situation with almost the same deep questions. The topics back then were: the artistic value, crafts (or trade if you wish) and industrialization. That led to ‘Arts and crafts’ movements, which look very goofy today, and later on to a solid, synthetic multidisciplinary approach – Design. I mean, The Real Design; an universal humanistic discipline with methodologies, measurements, analyses, etc. Maybe it’s time we come up with a new paradigm that integrates all the efforts when creating software, too? Of course, that might not solve much in future. It will still be shaky and dynamic, but that’s where the fun is!

    Being a designer myself, I am saddened to see so many ‘things’ that label themselves ‘designed’ without substance, or to realize how much time and effort the ‘designers’ put into ‘navel gazing’ (another, a less decent word comes to mind). The humanistic ideals of design are almost lost in self-satisfaction. A design/product/software that is a fruit of a self-centered effort without a proper scope of real needs is very often a pain to use. So, in the end, I am not using it. I don’t even like to see it. Still, I must let it be. The time and effort wasted on such projects is a very unfortunate fact, and this fact alone might annoy me, but give it time and the society will push it aside or accept it.

    The Name or the Ritual/Method we use when we create is important, but might not matter too much. None of those are ultimately right or correct, and they are here only to be changed. The effects of our creation, on the other hand matter a lot. And everything we do can be checked against the basic ‘trinity’ of concepts. The truth, the goodness, the beauty, A.K.A. the logic, ethics, aesthetics A.K.A. shin, zen, bi.

    These three permeate everything we do. So, there *is* beauty in an exceptionally well engineered bridge or software; there is logic in a painting masterpiece; there is goodness in crafts, etc. Focusing on just either one will result in a less than good result.

    As I said, I am not too smart, but even for me these three (logic, ethics, aesthetics) usually provide a solid reality check.

  87. Daniel Skinner said:

    WE Must Crack Down on false people pretending to be real programmers; HARD!
    Just because someone can remember some things, throw some jargon around and startle some non-IT people around them, doesn’t make them worthy of even being related to IT, let alone being a programmer (software developer/engineer).

    As far as I’m concerned (and I now sound like a broken record to myself ;] ) if you don’t understand and can’t program in C / C++ (don’t have to know absolutely everything about it), then you are NOT a software developer or engineer!
    If all you can work with is JavaScript, VB, Python, ASP.NET, you are certainly not a programmer. You are more like some guy who learnt a few tricks and learnt how to utilise an IDE and make heavy use of Google!

    Agile software development, scripting, software craftmanship manifesto, etc – are ALL rubbish!! Anyone solely associated to these things for example are not real IT professionals. Sure you might impress your grandma and teach a few friends a trick or two, but in reality you are living a lie, claiming to be someone you’re not!

    I’m not saying these people can’t become true IT experts, but seriously, earn it and most importantly, prove it!

    I CAN’T WAIT until the days of Quantum Computers. We’ll see if these jokers still have a place then (without VB, .NET, wizards, Google, Intelisence, etc).

    In short… If you don’t understand how a base2 number system works and you can’t write code in C/C++ at least to some degree (not needed to be an absoulte gun) then you are not a software developer (engineer), whatever you want to call yourself. They are the same anyway. If fact developer is better, because realistically an engineer is a train driver whom can also fix up the consist as a whole. So with any other profession, engineer is damn lose term.
    Lastly, if you are ‘in IT now’ and you don’t know what a base2 number system is, smack yourself and quit while you’re ahead, because you are a truely unprofessional I rather consult my fish for IT advise than you!

    • C/C++ is for whimps! Real programmers use punch cards.

      • José said:

        LOL!

    • Hi Daniel. I appreciate your passion, but I think you’re at risk of a kind of affinity bias. I know many people who came up through different routes – like Smalltalk, various flavours of Lisp or specialized languages like APL and its derivatives – whom I would consider craftsmen and whose programming smarts I couldn’t hope to match.

      I agree you need deep technical skills – in whatever your chosen technologies (by which I mean the languages, libraries, idioms and patterns) – as well as extensive experience, and that you can’t fake that experience by learning a few tricks. However I don’t think it’s useful to mandate what those technologies should or shouldn’t be.

      • Daniel Skinner said:

        Hi Dan,

        Yeah you are right, there is other languages and technologies out there that fit into the category I was suggesting.
        Take my previous post as more of an example rather.

        thanks

  88. Daniel Skinner said:

    Hahaha, punch cards.
    I see your angle, but there would be nothing done if we had to all use punch cards with today’s expectations on developing software.

  89. Ah, but what if they were *Enterprise* punch cards?

  90. The nage-ne-kata bit got me a bit intrigued. Isn’t that something that may also work in assessing one’s ability in making software? It obviously doesn’t tell the whole story, especially what to expect from a person when confronted with new and unusual situations, but it may tell you a lot about his/her mastering of the tools and the manual process from idea to software. There is kata examples at codingdojo. I certainly miss some that touch on modeling business related domains but it’s a start. Isn’t that sth to expect from people? I do not dare to say certification, but maybe you can ask to “perform 1-2 katas of your choice” as part of e.g. a job interview…

  91. martypdx said:

    This whole topic seems to be based in our confusion between knowledge and fluency . Willem Larsen (who has a proposed session at Agile 2011) and Evan Gardner have talk about this in context of their language fluency technique “Where Are Your Keys?” (check out: http://whereareyourkeys.org/2011/01/07/3-fluency-the-top-20-techniques-of-wayk/)

    As Willem poetically puts it:

    Valuing knowledge over fluency has created an epidemic of normalized incompetency in the modern world.

    When we can articulate software [craft/development/engineering/whatever] in terms of fluency characteristics, I believe it more adequately articulates most concerns.

  92. I’m proud of having been aware of the SCM since its early days and having NOT signed it despite having some respect for those who wrote it. I’m a tradesman not a craftsman and I’m proud of writing software that works while delivering it on time and to budget. The manifesto and I agree on absolutely nothing.

    Well-crafted software is nice. Working software is imperative.
    A good looking bridge is no better at crossing rivers than an ugly one. And lets face it, the point of a bridge is getting from A to B reliably, not beautifully.

    Steadily adding value is nice. Responding to change is imperative.
    Inability to respond to change is like being a plumber who left his adjustable wrench at home whilst steadily adding value is like being the plumber who’s been under the damn bath for the last 3 hours and still hasn’t replaced the washer seal.

    A community of professionals is nice but you can’t have one without individuals and interactions.
    The developer community has as much appeal to it’s business customers as a Vegas dentists convention has to the gamblers at the slot machines.

    Productive partnerships are nice but businesses do not function without customers.
    Saying partnerships are more valuable than collaboration is like saying marriage produces better babies than sex.

  93. I’m a long time Dan Fan, but I have to disagree. I’ve built two houses, and worked with plenty of tradesmen to do it. What distinguishes a trade from a craft, to me, is that in a trade there’s a Right Way to do it, whether proscribed by a building code or local tradition (e.g. screws vs nails here in the US).

    To a tradesman, every job is different, because every wall is different, but each job consists of the same basic parts combined over and over and over again. You won’t find many carpenters who spend their time tinkering with better ways to put up drywall, or machines to help them put up drywall faster, or comparison-testing different fastener types. A tradesman gets better with practice, but it’s an improvement of manual skill, not of the trade technique itself. Creating Exchange user accounts is a trade; tech support often resembles a trade. But programming?

    And if you think every bridge doesn’t have its own character, its own style, and even its own gargoyles, you haven’t spent much time around roadgeeks or major construction projects. Come to the East Coast of the U.S. and I’ll take you on a hundred-year span of spans.

  94. sheva said:

    This very long post seems to induce very long responses.

    In my experience, the only thing that matters in most software development is that the project team has at least reasonably intelligent people, with a reasonable amount of training / experience, combined with a good work ethic.

    The last thing you need is zealots. Those who want to do xyz-driven development, who want to do things ‘the right way’, who want to follow the latest methodology trend only serve to bog up progress and fail to deliver a good balance between software quality and project costs.

  95. Bill said:

    “*Everyone* can be super! And when everyone’s super…no one will be.” – Syndrome

  96. thinkingbox said:

    Jace Bennett :
    Art and craft are NOT totally different things, but they do have a key difference, and it cuts to the heart of your thesis.
    Art exists for art’s sake. Crafts are practiced for the sake of profit.
    [...]
    We’re not talking about software gratia software. We’re talking about considering aspects of our work that the customer may not consider, that he pays us to consider, that will ultimately increase actual value delivered, maintenance cost, maintenance frequency, etc. In a word, craftsmanship.

    Bravo Jace, you nailed it!

  97. tobiasmayer said:

    I care about the aesthetics of plumbing, and electrical wiring, and plastering, and brick pointing… I care that the people who do the work care about what they do and how they do it. I care because I can trust those people to do the best job they can do, to build quality into their work and not cut corners. And I care because I appreciate the beauty of good craftsmanship for its own sake.

    Plumbing, when done well, is a craft. Digging a hole, if done with care and pride can be a craft. Some gravediggers dig beautiful holes, others do not. You say software isn’t a craft but some programmers are craftsmen. I claim that if we work as craftsmen, we are doing craft.

    In general (except when people work poorly) software development is a craft because we are creating items of beauty. A website has (should have) visual beauty, and usability ease, and speed. A data crunching system, though invisible should be fast, accurate and unintrusive. My GPS should direct me with accuracy and simplicity. These are all aesthetic as well as functional qualities.

    You make some good observations in this article, and call out some bullshit, but I am not sure what you hope to gain by decrying the craftsmanship mindset. Wouldn’t it be better to support those non-craftsmen to write better software, to go beyond the tradesman mindset?

    • “When I am working on a problem, I never think about beauty but when I have finished, if the solution is not beautiful, I know it is wrong.”

      –R. Buckminster Fuller

  98. Perhaps it’s because there are so many highly educated people around, but a discussion of what our profession IS, doesn’t further the quality and effectiveness of our profession. You said it yourself: “…stop navel-gazing”.

    • tobiasmayer said:

      @twendstream I disagree with this. If we don’t reflect on our own profession with an eye to improvement we just keep working in the same old ways, and making the same mistakes.

  99. Curtis Cooley said:

    Obviously you’ve never lived in a house plumbed by a shitty plumber :)

    You are absolutely correct that until I’ll lived in a house plumbed by a shitty plumber, I didn’t care about his ‘craft’. I do now. Every time I get to mop watter off the floor and patch a broken pipe.

  100. Probably already said this: absolutely right!

  101. So… in your article seems like anybody can do real programming. Just because you do Visual Basic stuff with few drag and drops here and there, that does not mean that cr*p of M$ is the only way to create software. That also does not mean that whom barely knows how to do drag and drop can create applications that will provide enough leverage and features that endure over the time. I seriously doubt that drag-n-drop guys can even hold a job position for long time and even get well paid… thinking on that better, yes, there is some lucky guys that could have that, just like sloppy plumbers, doctors and lawyers and other sloppy professionals in other areas.

  102. Sachin said:

    I agree – to sum up – USEFULNESS matters a lot and not the good looks according to me..

  103. Aivar said:

    From that long article, I can only conclude that you want other people to value same things and understand certain words (craftmanship) same way as you do.

  104. I really appreciate your post because constructive negative critique is often the most valueful one for improving insights.

    Beside this, the problems, which the SCM movement tries to address, are deeply philosophical because it is somehow a question about the nature of software itself. Particularly the absence of a fundamental theory like physics inside the classical engineering disciplines.

    One resulting difficulty is the concrete measurement of “success” especially from the customers (or also less technical skilled employers) point of view. Why? Because normally only the “it works” measurement is applied, which is normal for physical objects. But, as all software developers know, saying “it works” is incredibly difficult for software. There is also no possiblity to have a kind of formula or a common standard (e.g. ISO) which gives in fact a guarantee that “it works” will hold even before the product will be finally built (which is important because this is often the most expensive part in the physical world – software, in contrast, has no heavyweight “build” part at all)

    I think this is one of the main roots of the confusion and the difficulty. If it is not possible to have a kind of standardized “success” respectively “it works” model, it is also not possible to have a standardized “it works” certification process.

    This difficulties explain also the selection of the “craftsmanship” metaphore. Craftmanship combines physical “it works” measurements with difficult to measure “art” elements on an individual level. The “art” element is the somehow common determiner to software regarding its fuzziness. It is like the hope to “drag-out” the physical element for introducing more “physicality” into the software development community. But the ulimate lack of physicality illuminates the strong focus on the remaining vague “art” element of the SCM which is the also base of the critique of this blog entry.

    How to solve this? I really don’t know ;-)

  105. Aidan said:

    Oi! North! Noooooo! :-)

  106. martypdx said:

    Hey Dan, I have come to the conclusion that I agree with what I think you are asserting; however, the critical point isn’t so much craft versus trade as it of utility versus construction.
    Success in software depends on doing the right thing right. The SCM has been focused on the second part of that equation. “Clean Code” ensures that whatever we are going to build, regardless as to whether the utility has been validated, we do it well. In that regard, we can call the code (the implementation meant to fulfill a requirement) “well-crafted”. In addition, part of that craftsmanship ensures that if there is volatility or evolution in the understanding of utility, it can be modify in the most effective manner (usually measured as a matter of time) both in terms of delivering that change and in not breaking things that were not meant to change.
    So I think we can put the gold star on “code craftsmanship” and get behind the work the SCM is doing in this regard.
    The problem is with the first half of the “right thing done right” equation. Imagine for a minute that a plumber installed a toilet and all of the details of the work were executed with the expert hand of a true craftsman, except that the toilet was installed in the wrong place. Now the house building metaphor is problematic for software comparisons for (at least) two reasons:
    1) Most houses are built for living and each job done builds experience in the same problem domain. In software, successive ‘jobs’ are exploring new domains or at the least new areas of existing domains (not the same as patterns, and in fact pushing feature patterns on customers is a problem).
    2) Due to software’s non-material nature, change is much cheaper than rework done for a house.
    Still, the analogy shows why it is hard to confirm the status of craftsman when viewed from the whole software perspective. In terms of requirement (a problematic word, but that’s another discussion), the code craftsman is only offering successive approximation (iteration), and that is not the mark of master craftsman (given Dan’s work in BDD, it’s easy to understand why this irks him so much).
    I admit I haven’t searched every corner, but I don’t see anything from SCM in terms of professional practices in this area. Right there on the SCM home page is a link to “Is Craftsmanship All About Code?,” that acknowledges the need for, and absence of, answers in this area.
    And by no means am I saying that this is SCM’s problem, it is an industry problem. I do have some reservations that the touted code katas may be enforcing patterns of successive approximation that will need to be unlearned.
    I propose that no one bring together the “Software” and “Craftsman” word until there is a non-iterative way to do the right thing right. When that happens, we will have a new set of skills to master to become true software craftspeople, or we will work in a set of related trades than enable coders to have one level of craft, and the overall craftsmanship will reside with home builders and architects.

  107. Here’s the deal from my perspective.

    Back in the 1970′s I studied electrical engineering, computer science, and mathematics (mostly pure maths).

    And since then I have worked essentially as a programmer, but researching and developing my own database tools and functional language to go with it.

    Even back then as an active member of the IEEE I found it hard to understand why I could only be an junior – associate – member of the Australian Computer Society which then (and I believe still) insists on experience over qualification.

    I can’t see the profession (dodgy term in my view, but anyway) really progressing until we develop a proper hierarchy of qualifications and skills.

    It isn’t about craftsmanship, or democratisation, or anything other ‘cool’ terms.

    It’s simply about an industry that needs to mature.

    SO your blog referred to a few industries to do with building mainly without completing the hierarchy.

    Engineering and building start with an elite group of highly skilled individuals studying the laws behind the physics – the scientists; the engineers and architects use the knowledge of the scientist and add design and social/environmental etc sensitivity to design appropriate structures; builders of some sort turn the designs into reality using tradesman skilled in laying bricks, nailing timber, laying pipes, etc.

    This hierarchy is trying to develop in programming and has always existed to some extent, but external efforts to dumb down the requirements fight against the creation of a properly structured industry.

    In my view anything that helps the general public understand that not everyone can be a good programmer is a good idea at the moment.

    These days when someone says – oh you work in IT – I respond by saying no. I’m a computer scientist. I just happen to earn money by programming. What else can you do….

  108. Hi Dan,
    After reading your post I came to the conclusion that the debate might come down to a cultural difference. In dutch we would use ‘ambacht’ which would be like a baker or a carpenter. This translate into ‘craft’ in English. This is in no way intended as the ‘craft’ definition that comes from ‘arts and crafts’ you seem to be using. I do expect software developers to be like craftsman in the Dutch sense: They need to be able to leverage the tools and resources to make a decent product, it being a loaf of bread, a chair or a software product. Mastery in leveraging the tools and resources is given to precious few and for the rest of us it is just hard work.

  109. Finnbarr P. Murphy said:

    I would argue that programming is a skilled trade and not a craft or profession. Taken to the extreme certain programming can be considered as art just as a skilled tradesman can produce an aesthetically appealing and highly functional product.

    True software engineering on the other hand is a profession and is starting to be recognized as such by other professional societies. Within five years, numerous states here in the USA will be licensing professional software engineers. Texas already does it.

  110. Ingemar said:

    Oh, wow! That was a lot of bullshit. You’re doing totally unrelated parallels between art, architecture and coding. If there’s anyone with a big ego it’s you, Dan North.

  111. As long as the programmer is the ol’ “Master Builder”–designer and craftsman in one, NO skyscrapers will be built indeed. A poster above me said it: “It is an industry that needs to mature”.

    Dan, you write:
    “I don’t want “steadily adding value,” I want “amazing their customers every day!”

    That, to me, smells of sales-talk. It sounds like just the “idea-guy” who never managed to piece together anything himself. Sorry. :)

    If the goal is to churn out 20 amazing prototype webapps with one turning out okay and the other 19 scrapped, well thats what we will do.

    If the goal is to build something a bit more serious that must be maintained ten years into the future, you really need steady progress and firm footing.

    Building software is all about its process and very little about actual construction.

    http://lazypenny.wordpress.com

  112. Hi Dan, this is a very good post, because of a few key moments:

    “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.”

    – I totally agree here: the users of the software, and the purchasers / sponsors have a reason for wanting it. That reason is the results it enables them to have. It is not the intrinsic nature of it being “software”.

    “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.”

    – For me, while I certainly enjoy coding and learning about great techniques, patterns, etc, there is nothing that compares to knowing I’ve delivered what is *Actually Needed* to achieve the goal of someone using it. In my experience, this becomes most real when we, as developers / architects / whatevers actually observe real users in unscripted situations. If we can develop the empathy and compassion necessary to channel our own energies to delivering the products and services that do the job and delight them, GREAT!

    It’s never any consolation to me to hear a developer pontificate about how “beautiful” or elegant his or her solution is if it ends up being slow, annoying, or just plain buggy when the user attempts to utilize it in the product!

    “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.”

    – F*ck copper-driven plumbing. The “clanking” of information comes in the form of slow, bulky, glitchy, broken results. I think some developers “get high” on writing code, seriously, and that becomes an addication. These personalities seldom take a step back and look at the larger picture and ask “What does the user / sponsor really need here?”

    What’s worse is when developers, or project leaders, won’t go the “Extra mile” to work with their sponsors to help them understand what’s really needed from the business-perspective.

    On an agile project I recently worked on, our sponsor, after months of development, said she would have dramatically altered the early Road Map to focus on very core business-related features, had she known things would not progress as fast as she expected. I don’t feel like that is her failure, but our failure. Well, maybe it’s a combination. But, when a team is trying to help their customers deliver value, I think it’s critical that the team itself understand where value comes from and, ultimately, where their client’s own customers place value.

    All that being said…I do believe that the vast majority of programmers believe they are doing the best they can and in the interest of the project. It does take strong leadership to coach and guide an entire team toward shared goals that benefit the business and users most importantly.

  113. Hi Dan:) thanks for this post – the title really made me laugh as the slogan on my personal website is “I’m not a craftsman, rather an explorer”, which I came up with while trying to define what is it I like in the Programmer professions and what I don’t :)

  114. Derek said:

    Hi Dan, I loved this article. I’ve been in the industry for a long time and I’ve seen all sorts come and go. I’ve worked with some great people and meet some of prima donnas. The sort that spend all day waxing on about how software should be written and how everyone else is doing it wrong. And I’ve usually found that the software they produce is so wrapped up in showing how great they are that it’s practically unusable to the rest of us. For me, a persons worth as a developer is simply about how happy the users of their software are, and how simply they can produce great experiences. No rewriting the wheel to show off, over-engineering to satisfy some pet design methodology or using “K00l” technologies without any gain – just simple code that works.

  115. David W said:

    Hi Dan,

    I wholeheartly agree that Craftsmanship shouldn’t lead to a bunch of prima-donnas but truth be told I don’t think that it will. Prima-donnas will always be prima-donnas at the end of the day. My own experiences are that of working for one of the UK’s most recognisable dot coms. A small number of people who were not natural software developers got the site up and running from nothing in a really short period of time and were rightly praised for doing so. They no longer do software development and I am part of the team that picked from where they left off. The code-base is horrible and we struggle to maintain it. The scalability is dreadful and piles and piles of cash are thrown at servers that are starting to creep. One of the biggest mistakes made is huge levels of copy-paste programming.

    The business guys see the original group as angels that put the brand out there but can’t understand the problems that we have. There was no respect to craftsmanship and over the long haul the business can’t understand why everything has become so slow to turn around. An example would be that the business gets frustrated because you forgot to update terms and conditions (copy and pasted into code behind?!) on one of 400+ pages?!

    My point is that signing code or writing beautiful code isn’t about showing off how good you are – it is about leaving something clean for the next person. The goal should be consideration for fellow professionals. When you spoke about plumbing it sounded like the best analogy. Not only would a great plumber fix your problem, he should do so in a way that the next plumber that comes along will understand. Whilst I agree that you wouldn’t want a plumber using a hand-crafted ornate piece of piping, you also wouldn’t want him using a piece of a hose that is lying around to fix your problem. Neither would be considered qualified by http://www.guildmc.com/

    I hope that SC doesn’t become the next ‘Badge’ with an industry queuing up to make money out of handing out pretty Software Craftsman pin-badges to stick on your CV and flatter egos. Rather the craft should be based around code that reflects the right attitude to the craft.

  116. Mr. North — While I commend your sense of authority and swagger I’ve a contrary view.

    You might be under-estimating the power of culture when you think you are a craftsman.  The reality is no one cares if it’s craft or it isn’t, its about creating products people love. Those gentlemen / women that you mentioned out-producing the paid thugs…. those coders care about about being unique, being artists, being craftsmen.  No one argues about how many lines of code they write and how fast their algorithms (and the ones that do often don’t give two shits about the customer experience or what they provide to consumers).  I think its rare you get talented coders that don’t want to feel some speed in their hair and have some flair in their step.

    Code as craft is nothing more than a culture hack by business to solve a human problem — genius is art and art is genius it’s been that way since Europe rebounded from the plague and emerged from the dark ages. They did it on the tails of the creatives, not on sound operational management. The fact is is everyone else in your “proper” professions is just drawing a bunch of really pleasing straight lines that no one will ever care about and certainly won’t click on a link to see :).  You want great products then you need to give people something exciting and beautiful to believe in.  If that wasn’t true the British would still run America, No one would use facebook, foursquare would tank because google maps had all the answers, and something like twitter …. not even a remote possibility.

    Most importantly, if viewing code as craft wasn’t proving somewhat effective, there would be no story here to write.

    There’s my counter move, thank you Friday night #angryfriday

  117. John :
    I love this bit:
    “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.”
    Brilliant. Totally brilliant

    I get what you mean. But I do think you want a plumber who cares about his work so you dont have to call him back every day to fix another problem…

    So you actually need a plumber who is in love with his work (craft). Makes beautiful solutions you benefit from. And yes, he should not over-engineer. I’d rather hear a plumber talk about beauty of his work than a plumber who does not care at all.

  118. I believe coming up with innovate solutions to problems really is an art form. It takes a whole lot of creativity and outside the box thinking to come up with quick elegant solutions to a problem. In my experience what I would consider actually good programers write useful code. Code that does something useful as in doesn’t waste the computers, other programers, and the stakeholders time or resources in accomplishing the task.

    Something you failed to mention in your article is the whole concept of “programing for fun”. In my off time from work I program node.js stuff in Coffeescript. Not a whole lot of what I write is actually useful or solves any real world problems, but it sure is fun.

  119. ipipeline_dev said:

    Software need craftmanship, There are many ways to get things done on a smalll scale, but the well crafted software(or well architected software) is the one that is easy to expand and easy to maitain. I whole heartly endorse BDD, behavior is the spirit of software, I also endorse software craftmanship, slapping thing together will create huge problem down the road, and only real programmer is willing to purse the road of software craftmanship.

  120. 1. When you go hiking, mountain climbing, boating, fishing, cross country skiing, canoeing, or take part in any other outdoor activity, do you have a survival kit in case you get lost, injured, or separated from the group?

Follow

Get every new post delivered to your Inbox.

Join 142 other followers