My opinion has long been that software development is a creative endeavor, and I was very excited this weekend when I stumbled across an article by Don Knuth published in the December, 1974 issue of CACM titled Computer Programming is an Art. It caught my attention not only because it resonated so strongly with what I’ve found to be true in practice, but also because of its age and the low frequency with which my usual Google searches turn up articles of this vintage.
We software developers owe a lot to Don Knuth. His work on the analysis of the computational complexity of algorithms laid the groundwork of one of my favorite courses in college (Introduction to Algorithms with Steve Seidel). And Don’s description of where science and art meet in computer programming is very good as well.
Art vs. Science
Knuth begins the article with a history and evolution of the meaning of the terms “art” and “science” and proposes the following guideline for classification:
Science is knowledge which we understand so well that we can teach it to a computer; and if we don’t fully understand something, it is an art to deal with it. Since the notion of an algorithm or a computer program provides us with an extremely useful test for the depth of our knowledge about any given subject, the process of going from an art to a science means that we learn how to automate something.
By this definition, I agree with Knuth and similarly place most of what we do in the art category. Though we have a scientific understanding that forms the basis of our work, what we do as we write software cannot yet be fully taught to a computer. And if most of what we do is art, then Knuth declares his goal as an educator is to “…help people learn how to write beautiful programs.”
But what is beauty in terms of software? Is it subjective, or are there objective measurements of beauty? Knuth describes aspects of both, and I see the following dichotomy within his description of beauty: style and utility.
Style is the artist’s individual taste applied to their craft. Each artist selects their own tools, applies them in their own way, and ends up with a work that is a product of their selections. There are no absolutes when it comes to style and taste, but there are many opinions.
On the other hand, because software is built to do something specific, its utility is a big part of its beauty. How a program uses computing resources, or how it meets users’ needs, for example, are aspects of utility. These are generally more concretely measurable than the previously mentioned style.
Learning the Art & Science of Programming
One of the things that struck me after reading his article is that our education is focused mostly on learning the science that forms the foundation our work, not artful practice. That focus seems appropriate to me. Lately, I’ve been describing the value of a computer science education as, at the very least, a process by which the layers of the machine’s magic are stripped away and replaced with expectations of logical behavior.
Therefore, if we expect graduates to have a reasonable grasp of the science of computers, then the next step of a computer programming education should be working alongside more experienced practitioners as an apprentice. This is precisely why we place a high value on our internship program at AO.
Knuth concludes with the following:
We have seen that computer programming is an art, because it applies accumulated knowledge to the world, because it requires skill and ingenuity, and especially because it produces objects of beauty. A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better.
Do you consider yourself an artist?