Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

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?

share|improve this question
1  
I'd recommend reading The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt and David Thomas. They use this concept throughout the book. –  User Apr 18 '12 at 1:12
1  
    
what are your own findings on this matter? –  gnat Apr 18 '12 at 4:52
1  
The term "software craftmanship" was crafted (pun intended) against the ubiquitious term "software engineering" to emphatize that the creation of software as an individual, creative effort in contrast to the anoymous, planable, predictable approach that software engineering promises. –  user281377 Apr 18 '12 at 11:57
1  
@ammoQ I'd be interested to read the source for your comment to hold up against how the definition is perceived today. I'd also offer a counterpoint that there is a vast chasm between what software engineering promises, and what it has traditionally been able to deliver. As food for thought, I also find it interesting that the terms Engineering and Crafting are generally seen as such polar opposites, given they effectively mean the same thing if they are able to deliver professionally designed software to a high quality, or does one term imply perhaps a quality that the other doesn't. –  S.Robins Apr 18 '12 at 13:28

2 Answers 2

Amongst other uses of the word, the term Craft can be defined as:

  • an activity, as in handicraft (esp. as a hobby)
  • an art, trade, or an occupation requiring a special skill.

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:

  • Either meet the customer's requirements, or be fit for it's intended purpose
  • Have a clean and clear implementation
  • Be lean - as in not suffering from gold plating
  • Be scalable & extensible
  • Be clearly documented (and yes, I include "readable" code in this)
  • Be supported by tests
  • Have relatively few defects
  • Delivered in a timely fashion

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:

  • Interns, graduates and juniors are effectively the Apprentices. Yes, they have studied and have their degree's, yet they still have a lot to learn about creating software. No company would seriously hire them to manage a software project, or to work entirely on their own without some sort of a mentor to guide them, and the "apprentices" are expected to make mistakes and to learn.
  • Mid-level developers are effectively the Journeymen, who usually go out into the world to hire themselves to work under another highly skilled individual in order to receive guidance, yet are usually left to work with little supervision, and expected to hone their skills, and expand their experiences.
  • Seniors and Principals are effectively the Master-craftsmen, who are expected to have a broad knowledge-base, yet may also choose to become specialists in a particular area of their "craft".

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.

share|improve this answer

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:

  • A construction methodology (agile, waterfall, mixed)
  • Problem solving skillset (scientific method, mental "toolbox" of ways to fix issues)
  • Knowledge of the field (when and where to use DB/language/optimization/concurrency)
  • Practiced at specific tools (Vim, valgrind, c, python, sql, git/hg, current "hot" tech)
  • A professional mien

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.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.