What Sort Of Thing is Programming? Really?

Every so often a thinking question comes to mind. Once upon a time I would either spend some time thinking about these questions and perhaps write a blog to help with the thinking. These days I tend to first toss the question out on Twitter and see what comes back. I find this actually to be a useful process. It helps me think and often gives me interesting and/or useful feedback for my thinking. Earlier today I tossed out this gem “Is computer programming a science, an engineering, a craft or an art? What do you think?” I received several replies:

The diversity of opinions is not at all surprising. I’ve heard variations of this discussion regularly among academics, professional software developers and casual programmers for years. A lot of scientists completely reject the idea that is is science. In fact some reject the idea that computer science is rightly called science let alone the computer science tool that is programming. Many engineers, especially those from more traditional engineering disciplines reject the idea that programming is engineering. Why? Because “real” engineering doesn't create things with as many bugs as software has. Well it’s a theory. And listen to people who have earned the right to call themselves “Professional Engineers” and add P.E. after their name on their business cards. Even the ones who work as software developers are not always so sure about this idea of “software engineering.”

Many professional programmers on my acquaintance, especially but not exclusively those who came into the field with little to know academic background in computer science, prefer to limit the discussion to Art and Craft. So before I go any further here are a few definitions cribbed from Wikipedia which is always a good place to go looking for arguments. I mean discussions.

Art is the process or product of deliberately arranging elements in a way that appeals to the senses or emotions. It encompasses a diverse range of human activities, creations, and modes of expression, including music, literature, film, sculpture, and paintings. (https://en.wikipedia.org/wiki/Art)

A craft is a skill, especially involving practical arts. It may refer to a trade or particular art. (https://en.wikipedia.org/wiki/Craft)

Engineering is the discipline, art and profession of acquiring and applying technical, scientific and mathematical knowledge to design and implement materials, structures, machines, devices, systems, and processes that safely realize a desired objective or inventions. (https://en.wikipedia.org/wiki/Engineering)

[…] Science refers to a system of acquiring knowledge based on scientific method, and to the organized body of knowledge gained through such research.[2][3] This article focuses on the more restricted use of the word. Science as discussed in this article is sometimes called experimental science to differentiate it from applied science, which is the application of scientific research to specific human needs—although the two are commonly interconnected. (https://en.wikipedia.org/wiki/Science)

A lot of words show up in multiple definitions. I think of myself as an engineer. I see that as a personality type of sorts and that it is one that describes me. Am I a “software engineer"?” That has been my title in several jobs but really? Engineering? I have to admit that I don’t think we are there yet. Maybe one day. If we make it then computer science will be critical to us getting there. But while programming is a tool of computer science it lacks something for me to call it though. Although we do program by creating a hypothesis (this code will work) and then test that hypothesis which has sort of  the scientific method about it. For lose definitions of the scientific method perhaps.

So that leaves art and craft. While to some of us good code is a thing of beauty and is of course very expressive I’m not sure about this one either. I guess I am not quite willing to accept the notion that talent over comes skill and training. So that leads me to craft.

Craft is where I usually wind up in my thinking. programming is a skill. It is practical. It can incorporate some science, some engineering and even some art. And like the crafts of old it is often best taught by a master to an apprentice. So for me that is the right combination.

The most important part of this question though is not the answer. I doubt there is one true answer. The important part is the discussion. Have you had this discussion with your students? With other computer professionals? With anyone? I think this is the important question for software practitioners to discuss if only to understand themselves.