What is software about?
There are several anecdotes, like the weight of software, that provide insights about what software is and what characterises its engineering. Basically, these stories illustrate the intangible caracter of software: How it is difficult to measure software and why its qualities prevail over its physical properties.
On the other hand, there is some materiality in software: it is executed by a particular kind of machine, a Turing Machine. Software describes the commands that the machine executes to do some work and, hopefully, to solve problems. These commands are written using a language, a formal language with a precise semantics that the computer can unambiguously understand and execute.
The job of the software engineering is to write sentences on the computers’ language. However, this language is not appropriate to describe the problem that needs to be solved. Usually, customers describe their needs using a more ambiguous language, natural language, and software engineers need to understand their requirements and to write a solution. Therefore, the software engineer has to understand a problem, define how it can be solved by a computer, and write the commands that tell it how to solve the problem. This set of steps, from what is the problem to how it is solved by a computer, is known as the Software Process.
What caracterizes the overall software development process is a transformation between a formulation of the problem to a formulation of a solution, which is written in language that the computer understands. The language the computer understands is a logic language whereas the business problems are mainly described in natural language. Therefore, the development process is a transformation between languages, where the target language has more precise semantics than the source. It is a process of formalisation.
The difficulties, and wonders, of software engineering are on this gap between languages, and on the trouble associated with language transformation, see the Babel Tower. Every language transformation introduces noise, the final formulation, the software, may not contain the same information than the source formulation, the business goal, and when, the computer finally executes the software, it does not fulfil the customers expectations.
Process Models have been proposed to define systematic and disciplined steps to guarantee that the software system solves the business problem. These steps intend to control the language transformations, either by introducing several intermediate languages, such that there is a smaller gap between each language, or by reducing the number of intermediate languages, because more transformations may increase noise. As we can see, quite opposite approaches to deal with the same problem; software engineering is full of these “contradictory” perspectives.
At the end of the spectrum, we would not need any transformation, the computer would be able to understand and solve the problem, see the Turing Test. Would we need a software development process in this case?