This, in turn, has rekindled the tired debate on whether programming is art or science. Sigh.

I once got to visit a Master Cheesemaker. The term “Master” is not arbitrary. Like other traditional crafts, the (art? science?) of cheesemaking is passed down and cannot be learned by reading a book. The term implies a pedigree of apprenticeship and a level of skill that can be achieved only though years of experience.

Although you can make a passable cheese with information found on the Internet, truly great cheese-making is a process that you have to feel, both with your senses and with intuition. An example, from Wikipedia:

In additional to the craft skills of cheesemaking, cheesemakers also need to be skilled in the grading of cheese to assess quality, defects and suitability for release from the maturing store for sale. The grading of cheese involves the visual inspection of a cheese and the assessment of a sample by sight, smell, taste and texture. The ability to predict when a cheese will be ready for sale or consumption forms part of the cheesemaker’s skill, as the characteristics of cheese change constantly during maturation.

Moreover, these skills take years to master:

Most cheesemakers by virtue of their knowledge and experience are adept at making particular types of cheese. Few if any can quickly turn their hand to making any kind of cheese. Such is the specialisation of cheesemaking.

So it’s an art, right? Not entirely.

During the tour we saw several stages of the cheese-making process from developing curds to cold-chamber aging, and what struck me was the amount of precision involved. There were thermometers everywhere. Workers checked the numbers constantly — variations of 5% were enough to kill a live culture or ruin a texture or destroy a taste. Hours of labor and expensive ingredients had to be discarded if something went wrong with step #23. This precision seemed a lot closer to science than art.

So it’s a science? No. Because amidst the measurements and process, the Master still had to stick her hand in the cauldron and make sure the curds “felt right.”

Does this story sound familiar? Isn’t software development a mixture of intuition and measurable steps? Can’t we agree that code coverage stats and tight, automated build systems are valuable, but simultaneously we should value beautiful code and code smells?

So perhaps when it comes to computer science education we can take a hint from other crafts. This is the kind of thing you learn from experience. It’s not like chemistry which requires experience but also requires a great deal of schooling before you can even start making a difference. We all know that very little of what we learned in school is ever used in practice, yet many of us consider ourselves to be great developers. We must have learned that on the job!

So let’s just admit that this is probably the best way to learn. Sure we can do a mixture — it would help to take a short course on best practices on version control and branching, it would help to practice writing good unit tests, and making Joel’s book required reading might be a good start.

But nothing beats writing code next to an expert who is willing to share the “why’s” of development.