Is developing software a science? Is it a skilled trade with master craftsmen and apprentices? Or is it art form?
I am a touch OCD – so in my perfect world – software development would be a science, i.e. Software Engineering. Software Engineering would be as rigorous as Electrical Engineering in that we would have equivalents to Ohm’s law to abide by when developing code. In fact I wrote a whole book on the topic. However, I can’t dismiss the following quote from Dijkstra.
Software engineering should be known as “The Doomed Discipline,” doomed because it cannot even approach its goal since its goal is self-contradictory. Software engineering, of course, presents itself as another worthy cause, but that is eyewash: if you carefully read its literature and analyse what its devotees actually do, you will discover that software engineering has accepted as its charter “How to program if you cannot.”Edsger W. Dijkstra.
Spoiler alert: in my book I do not present formal theories or proofs on how to develop correct software. The book advocates a strategic, systematic, and disciplined approach to software development along with best practices. So Dijkstra may have a point.
What is a craftsman? The Merriam-Webster dictionary provides the following definition
- A person who practices a trade or handicraft as a job.
- A person who is skilled in a craft
In the software world there is an approach to software development known as Software Craftsmanship. The following is the manifesto for software craftmanship.
As aspiring Software Craftsmen we are raising the bar of professional software development by practicing it and helping others learn the craft. Through this work we have come to value:https://manifesto.softwarecraftsmanship.org/
Not only working software,
but also well-crafted software
Not only responding to change,
but also steadily adding value
Not only individuals and interactions,
but also a community of professionals
Not only customer collaboration,
but also productive partnerships
That is, in pursuit of the items on the left we have found the items on the right to be indispensable.
In some respects, a craftsman is the opposite of an engineer, in that craftsmanship emphasizes the skills of the craftsman over a rigorous scientific approach. I am very passionate about developing software, problem solving, and pursing better, higher quality software. In that respect I feel more like a craftsman than an engineer. Where I have difficulties with the craftsman concept is that it relies on the strength of the individual. You get the wrong or inexperienced craftsman – then your software is in trouble. Also, individuals are all different, which means reproducibility becomes an issue. For example, when a developer tests a software module by manually exercising the code, the completeness and code coverage of the tests will be different based on who execute the tests.
What is an artist? Once again back to the Merriam-Webster dictionary:
- A person who creates art (such as painting, sculpture, music, or writing) using conscious skill and creative imagination.
- A skilled performer.
- A person who is very good at something.
For me the artistic aspect of software development is conscious skill and creative imagination when it comes to finding solutions to problems. By definition a new software project is solving new problems (or else why do it). New problems translate to unknowns. It takes creativity and skill to resolve these unknowns. However, coming up with a solution is only part of the greater puzzle. You probably don’t want an abstract expressionist like Jackson Pollock. What you really want is a realist like Leonardo da Vinci.
The ideal software developer is an engineer, a craftsman, and an artist.