There seems to be a lot of buzz around software craftsmanship lately.
Is it a well-defined concept? What does imply? To what extent is programming effectively a craft activity?
There seems to be a lot of buzz around software craftsmanship lately.
Is it a well-defined concept? What does imply? To what extent is programming effectively a craft activity?
Amongst other uses of the word, the term Craft can be defined as:
The concept of software craftsmanship has been tossed around for many years now. I remember discussing this with colleagues as far back as the late 90's, however it's probably been taken a little more seriously since the first copy of the Pragmatic Programmer was first released - as noted in the comments listed under the OPs Question.
As far as a specific definition is concerned, I don't personally know of any single clear statement that says "this [insert stuff here] is what being a software craftsperson means". The only document that I can think of off the top of my head that comes close, is the statement and 12 principles which define the Agile Manifesto.
The implication however is relatively clear, in that in order to provide software of the highest possible quality, it needs to:
Getting all of the above "right" requires a highly skilled professional - or a team - with the experience and dedication to achieve the best possible result.
The major difference between tradespeople today, and professional software developers really comes down to how they are educated, the body of knowledge they are expected to absorb, and how soon they are turned loose into the workforce. Another is how quickly current knowledge becomes old and requires new knowledge to keep up with industry trends and changes. Software developers are required to continue their education for the entirety of their careers in order to remain relevantly skilled, whereas trades knowledge such as carpentry or bricklaying changes rarely, if at all during the career of the tradesperson.
As a craft, you can draw a number of parallels between software development and some of the crafts of old:
As to the actual degree to which software development is a craft, that really comes down to the professionalism of the individual programmer, and the standard to which that programmer is willing to work in order to provide the highest possible quality in their work. The failure of the craftsperson analogy is that there are many people in Mid-Senior-Management roles who have arrived at their position without actually learning how to achieve a high standard of quality in their work, and in some ways the industry as a whole has suffered as a result. This is probably why those of us who see software development as more of an art than a science seek to work with others who think about software development in a similar way.
As a little side note/anecdote, I recently interviewed a graduate and put the question to him: "Do you see software development as more of an Art, or a Science?". Without even a blink, nor taking the time to draw a breath, his immediate response was "Art". His reasoning was based around quality issues, and on that question alone I would have hired him on the spot if I hadn't been hard-pressed by management to find someone more senior. Needless to say I kept that guy's C.V., and will be keeping an eye on him over the next year or two.
To demonstrate how much variation there is in the definition, I'll add my view to S.Robins excellent answer.
Software craftsmanship is harkening back to the idea of the craftsman, such as a carpenter. He is a man versed in his field, capable of turning the client's request into a physical object. He can do this because he he has a specific set of skills:
Thus, when the craftsman is faced with a problem for a client, he has not only all the prerequisites to build to object in question, he has the skills necessary to solve any problems along the way, learn new skills if necessary, and all the while conduct himself in a professional manner.
As a professional, he knows that this is business. He is out to do the best for everyone involved (including himself), producing the best solution possible within the constraints given. He understands that emotion has no place here (it's business, not personal), and that when errors and mistakes occur they can be dealt with and solved by his existing skills.