Building Software is a Craft not a Science

Melbourne, Australia, 2016-05-04

#software_engineering

 
Photo by Malcolm Lightbody

In my second year working as in software I became committed to the idea that as an industry we should be working to develop standard-gauge components that would fit together in precisely known and reliable ways. It should be like when a civil engineer builds a bridge - they know exactly the stresses and tolerances of the iron girders, steel cables and pre-cast concrete members that they have access to.

Some years later I completely reversed this view. It is critical that we have standards to build upon for things like language specifications, communication protocols, and packaging formats. However these standards don’t give you everything you need to build good software.

There is a strong aspect of aesthetics: as software engineers we’re always trying write clean and elegant code. How do you measure that? It’s a highly subjective quality that one engineer can describe to another but is very hard to quantify. That subjective-ness sometimes gives rise to heated debates about things as trivial as whether to use spaces or tabs for indents - the heat in those discussions comes from the aesthetic sensibilities of one engineer or another being offended. We codify it as best we can with code style standards and design patterns, yet applying this codified knowledge still requires judgment based on experience to get it right.

There also also an aspect of understanding your materials (choice of languages, frameworks, patterns) and if they “feel” like a good fit for a solution. These choices can be discussed and explained rationally, but they originate from the muscle memory of working with them in the past - like the muscle memory a mason builds up using different tools to carve designs into different types of stone.

Although it’s a technical endeavor, in truth software engineering is more akin to a craft like masonry or pottery than a science or traditional engineering discipline. I prefer the term “software engineer” to “software developer” because it conveys a professionalism and deliberate intent that you should have when building software, but perhaps “software craftsman” would be a better term!