In our last post we outlined the need for a “Software Interlude” before we moved on to a description of the third domain (Open Network Integration).
In this Part 2 of the Open Networking Software Interlude, we look at the key question: “What is Software?”. This might seem simplistic but understanding the answer to this question is important if we are to understand the broader value chain of software development and the application of software to real-world problems.
What is Software?
The answer to that question should be common knowledge, given that these days people are introduced to software in primary or high school. We all probably know the basics, that software is:
We all probably know that software is created by people (with titles like programmers, coders or software developers) by creating language statements in a text editor and using other software applications to translate that text into the “data or computer instructions” as above.
We all probably know that there are different categories of software: Applications software, Networking Software, Operating Systems, Virtualisation Software, Graphics and Visualisation software and so forth. Each category of software not only solves different problems but requires a different type of knowledge, algorithms and supporting software to create them.
And we all probably know that there are various incompatible technical platforms that software is built to run on: Windows PC’s and Apple Mac’s and Unix machines and so forth.
So, back to our question: “what is software?”. Is software the instructions that runs in a computer’s CPU? Or is software the source code files that developers edit? Or is it the algorithms and flow-charts that solve the problems that software encodes and implements?
While these explanations may sound satisfactory, they are fairly superficial and don’t come close to the core nature of software or inform us about what it takes to build software that works correctly.
Attributes of Software
Let’s look at some important aspects of software and that differentiate software from other media of types of materials that are used to build the things that we use.
- Software is intangible to normal human senses: You can’t get an idea of its properties by looking at it. Even if you identify the source code files as “tangible”, you still won’t get much just by looking at them, as compared to say a brick or a pipe, whose tangible form implies function.
- Software is transient: it only shows its full function and behaviour when it is executing, which can be for very short periods of time. In its normal operating state you can’t freeze it and poke around to see what’s happening.
- Software is infinitely malleable: it has no natural structure. There are few if any built-in constraints that guide how a program is constructed.
- Software is highly interdependent: internally and with other software components. The internal structure of software can create many interdependencies which are not easily detected.
- Software is opaque at the external interface: a program can appear to run correctly but this gives no indication of the internal structure or quality of how the software is designed and implemented – it could produce the required results but be implemented so poorly as to be unmodifiable and unmaintainable or may perform erratically when an edge-case input is found.
All of the above characterise software. These are attributes of software but they aren’t software itself. Software is unlike physical components that are, at the very least, constrained by the physical properties of their components and of the material from which they are made.
Software is a Model
Notwithstanding all the characteristics and attributes of software they are not the essence. Fred Brooks gives us a strong hint:
”Software is pure mind stuff, that is its allure and the source of all its frustrations.Fred Brooks
Software is in fact a model. It is an executable model of some real-world process which it either implements, interacts with, or influences. It’s properties and attributes enable software to model anything.
This is the essence of software and what makes it so useful. We may get close when we describe algorithms, data and processes but these are just components. Just as a person is holistically more than a collection of organs with specific names and capabilities, so is software more than its components and attributes.
Software creates value by the quality and effectiveness of this model and its fidelity with the real-world processes that it implements, interacts with, or influences. There are many ways to influence the quality of the model positively and negatively.
We will cover the implications of this in greater detail in the future posts.