Fog Creek Software
Discussion Board

The Craft of Programming

"Programmers are craftsmen and craftswomen. They are commonly thought of as—and frequently titled—engineers, but few working programmers "engineer" things. Most build software. They craft it into existence." Good article by Alan Coper.

Saturday, May 10, 2003

Could it be related to Paul Graham's latest article:

"Hackers and Painters" -


Sunday, May 11, 2003

Be aware of the different usages of terminology here. Cooper is using craftsman to mean creative high value work, and he is using engineer to mean systematic but routine work, along the lines of something being mass-produced.

He also mentions the way the rise of mass-production in devalued craftwork.

I think he probably had a good point beyond the superficial reading of the article, but he  should have been more careful to get it across.

Sunday, May 11, 2003

I think Cooper's theme is the importance of recognising the talented individual, and it ties in with the common theme here of foolish managers.

He has used references to engineers as a response to the frequent use of engineering terms and analogies in software development, but I think that reference is not related to his man theme.

Sunday, May 11, 2003 great article.

Usually, when people state that 'programming is like' art my reaction is:
what? If programming is an art then it can't be taught ?
Or maybe this is just an excuse of the Master Programmer who does not whish to be bothered with the task of explaining?

Paul Graham explains his point in terms of the process of learning how to paint painting is a skill learned by doing it yourself, by example and by imitation - sort of like programming.

Michael Moser
Sunday, May 11, 2003

[Cooper is using craftsman to mean creative high value work, and he is using engineer to mean systematic but routine work, along the lines of something being mass-produced.]

I don't understand how engineering work could be routine, since it requires skill and knowledge. I thought engineering involved inventing solutions to complex problems -- isn't that similar to programming?

The Real PC
Sunday, May 11, 2003

I think you'll find that the vast majority of engineering is NOT finding unique ways of solving problems, but rather identifying problems to fit an already existing solution. Most engineers that I've known were, honestly, boring people with boring jobs. Very few were innovators. That may just be my exprience, of course, but I've heard enough people talk about it to surmise that it's pretty common.

Brad Wilson (
Sunday, May 11, 2003

Real PC -- Cooper's certainly not saying that the work of an engineer is routine.  The key thing to understand is that engineers don't actually build the things they design: 

"But engineers don't actually build things. They solve complex and demanding technical problems necessary to building things, but they leave the actual creation to others. Engineers don't build bridges; ironworkers do. Engineers don't build software; programmers do."

I think a lot of people are misunderstanding the main point of Cooper's article:  Engineers design things.  Craftsmen build things.    Programming involves more building than it does design [per Cooper].

I think one reason people are misunderstanding Cooper is because a lot of us work in situations where we do both the design of the overall architecture of a program (the "engineering") and the building of the program itself (the "craft"). 

Even so, I agree with Cooper that programming is more craft than engineering.  I like to think of myself as a programmer to a woodworker lovingly crafting a small box.  It helps me keep the KISS principle in mind.

In situations where there is a division of labor in designing software, such as a large project where a few experienced developers establish the overall architecture and then use a team of programmers to implement it, I think Cooper's analogy is right on.  It seems to me that the team of programmers is a lot more like a construction team than to engineers.  Do the programmers/construction team frequently go back to the engineers and explain, "We can't do it this way?"  Sure.    And programmers may do more low-level "nitty gritty" design than construction workers.  (I'm not sure about that, but even if they do you can find another craft where there're lots of low-level implementation questions where the craftsman makes decisions himself.)  In short, Cooper's analogy rings true for me.

Herbert Sitz
Sunday, May 11, 2003

[Good engineers love their work because they love to solve difficult problems. Good craftsmen love their work because they love to make things. Good programmers must do both]

I read the article and most of it makes sense to me.
He didn't say engineering is routine work; he said engineers are designers while programmers may or may not design their software, but they always build it. Engineers don't build what they design.

I especially liked his statement that building software is important!

The Real PC
Sunday, May 11, 2003

> I think a lot of people are misunderstanding the main point of Cooper's article:  Engineers design things.  Craftsmen build things.  Programming involves more building than it does design [per Cooper].

Herbert, the point I took from Cooper's article, and it's intriguing in being the reverse of a lot of commentary we see these days, is that programming as commonly practised is BETTER than engineering as commonly practised. However, as mentioned, I think the comparison with engineering is actually secondary to his main theme.

Moving on from that and addressing the engineering comparison, I think it's important to see that he's talking about the practise of engineering as an occupation, and that this is not necessarily the same thing as engineering as art, particularly the art of designing.

Thus there are a few different types of "engineering" that we could put programming into. This is not his argument, but mine. I would say that, if we're talking engineering as elegant design, then, yes, programming falls into that category.

If we're talking about engineering as industrialisation of the software development process, then this is something that is occurring, but which, Cooper maintains, conflicts with the true spirit of the best programmers.

Sunday, May 11, 2003

Wow! You guys that are doing builds manually should cehck into this new think called a compiler.

Myself, I just do design work writing code. I haven't built anything by hand for a long time -- the last time was when I needed to write some code for a microcontroller and I didn't have an assembler for it and writing an assembler would have taken longer that writing the program directly in machine code using the chip manual's opcode reference as my guide. Amazingly, the program, about 1000 bytes long, worked perfectly the first time.

Anyway, most software work done nowadays is design work. The days of having to build manually are past. Someone should let Cooper know that building the product is now an automated process. After looking into compilers,  he might want to check out IDEs and frameworks. All these things can really save a lot of time.

X. J. Scott
Sunday, May 11, 2003

Anyway, this is what I'm getting at in case I was too subtle there:

There it is stated that:

"[S]oftware runs on computers. It is a sequence of ones and zeros that is stored on some magnetic media."


"A program listing is a document that represents a software design"

I agree with Reeves' position in the article at that link there and disagree with Cooper and McConnell's viewpoint regarding this.

X. J. Scott
Monday, May 12, 2003

If coper is looking back 100 years ago, then the definition of engineer was very different back then.

Engineers like Brunnel really were creative problem solvers, and this reflected the immaturity of their craft.

Back then building a bridge really was a major achievement, and the body count for the average engineering project was depressingly high.

Now bridge building is relavatively safe and routine.

I would say that engineering software is just like engineering in the real world, but in a different era. 

Ged Byrne
Monday, May 12, 2003

>"But engineers don't actually build things. They solve complex and demanding technical problems necessary to building things, but they leave the actual creation to others.

And a software engineer leaves it to the compiler.

Monday, May 12, 2003

Michael Moser: "Usually, when people state that 'programming is like' art my reaction is:
what? If programming is an art then it can't be taught ?"

Art can be taught. Thus the whole point of being an artist's apprentice, and art classes, and mentoring.

I believe the point is that programming is not merely knowledge - it's a skill. That means you have to do a significant amount of the learning by doing, not by reading or observing.

Monday, May 12, 2003


When folks refer to the "building of software", they aren't referring to the friggin' compilation process. Geesh.

They are referring to the process of constructing a program.

The world "build" predates your compiler.

Mark Hoffman
Monday, May 12, 2003

Mark -- I agree.  I'm usually impressed by the average level of intelligence displayed in JoS posts.  This, however, is not one of those times. . . .

Herbert Sitz
Monday, May 12, 2003

[The world "build" predates your compiler. ]

Tell me more about this world you speak of ;-)

Ian Stallings
Monday, May 12, 2003

I've been wondering lately about the obsession with who and what programmers are. Are we artists? Are we engineers (and if so can we wear the cool Casey Jones caps)? Are we painters? Are we architects? Are we more intelligent? What is your IQ? What is your Emotional Index rating?

What in the hell is going on? Sounds like a group of teenagers waxing philisophical. Or some 80s rapper (I'm like this... I'm like that..)

Ian Stallings
Monday, May 12, 2003

Ian, didn't you hear, We are the Gods.

Very male: check
One dimensional character: check
Highly instable: check
Immense ego: check
Perfect body: wadayamean Superheros can't be overweight ... Hey, come on now. Those are real X-Ray specs ...  Look, boobies! OK, so its a red hat *nudge nudge, wink wink*, with a small LCD screen, but it fetches P0rNz over IEEE 802.11b from unprotected WiFi access points as I roam the streets, so it's just like the real X-Ray specs ... but better, huhuh.


Just me (Sir to you)
Monday, May 12, 2003

>What in the hell is going on?

Maybe it's because some of us have way too much time on our hands.

Maybe it's because we, as a group, feel threatened by the way 'our' jobs are being taken away in countries like India.

Maybe it's because as the economy keeps on going down there are less IT related jobs and we globally feel a need to define what our activity is, to find relevance in our daily life.

Some time ago I lectured in the local university, and I started the course (software engineering 1) with asking the students why they ever wanted to go in IT. Beside blank looks, the more articulate thought I got was: it's a good way of making 45K a year.

I define myself as a tool maker. When the tool maker makes dumb tools or can't find a purpose for the ones he's building, or can't find people to make tools for, I can feel  his pain.

Monday, May 12, 2003

"building of software"

Hi Mark & Herb,

Check out the article I posted the link to and you'll see the point I was trying to make there. As I said, I agree with the viewpoint in that well-written seminal article, which is that the compiler builds and the programmer designs. The article is rather well known; this issue of 'design vs construct' is something of a horse long dead. The author's main intended  point is actually that misunderstanding the nature of what creating code really is is a source of many problems in development.

X. J. Scott
Monday, May 12, 2003

Hmmm engineers are boring?

Engineers find solutions (regardless of which physical science is involved), out of novel uses of available materials and processes.  They problem solve and from time to time they come up with generally useful novel solutions to knotty problems.

Sometimes those engineering solutions might appear to be ugly from a romantic view, though classically elegant.

Craftsmen produce objects which might attract on a romantic view but also satisfy from a classical perspective. 

Occasionally, engineers are craftsmen (creating their own tools), and craftsmen engineers (solving problems such as material strength and calculating forces).  In both cases they will be well educated and likely to be interested in cross disciplines and not stuck in a single periscope view.

Practitioners in software can be both craftsmen and engineers but in personal experience this is rarely so.  I've tended for the most part to treat it as a trade and in dealings with clients, a profession.  I couldn not claim it to be a profession however because it is unregulated and there is no concept of addmittance to a body of colleagues with recognised minimum achievements.  I don't find this to be a bad thing,

cf.  Zen and the Art of Motorcycle Maintenance

Simon Lucy
Tuesday, May 13, 2003

Craftsmen sounds like laborers to me from this article.  It is not surprising the Cooper would like to see programmers that way because  he thinks they are incapable of design and has advocated interaction designers who know a bit of both, not well enough of either.  Basically that way he can get more business for his own company.  Take it with a pinch of salt.

Wednesday, May 14, 2003

*  Recent Topics

*  Fog Creek Home