The World and the Machine is a paper by Professor Michael Jackson published in 1995 in Proceedings of the 17th international conference on Software engineering, and it changed my perspective on computer software. Alas, for copyright reasons I am not allowed to provide a copy here.
Jackson views software development as an engineering discipline concerned with creating programs to solve real world problems. The software developed describes a machine, and turns a generic computer into that machine – a useful physical device capable of problem solving. The true value of the software developed is measured by its usability and its ability to satisfy the requirements for which it was designed. He takes a holistic approach by saying that software developers are not merely concerned with the software artefact itself, but the establishment and definition of the real world requirements and problems the software addresses.
Jackson takes the approach that software is a machine designed to perform a useful function in the real world, and that the specification is the bridge between the world and the software. The machine has no purpose without the world because that is where the problem exists which the software/machine was built to solve. The problem is in the world not the machine, and the software cannot be developed in isolation to the world in which it will exist. For example, ATM software would be of little use if it was designed to require a mouse and keyboard, irrespective of its account management features.
A real world problem is defined in the specification, and software is then developed to meet that specification. If the specification has accurately captured the requirements, and the software meets the specification, then the software loaded into the computer will create a machine which solves the problem in the world. Interestingly, Jackson’s paper implies a strict progression from:
Problem -> Specification -> Program -> Solution
This does not take into account the fact that requirements could well change. To stay with Jackson’s view: the world, and therefore the specification, might change while the machine is being built, which obviously affects the machine’s ability to successfully solve the original problem.
Jackson views software development as an engineering discipline, and most engineering disciplines model their creations in one form or another. Modelling provides an abstraction of the real world, often free of implementation detail, which allows us to manage complexity and design a solution to a real-world problem. UML provides a standardised notation and semantics from which to create a model of a machine (at various levels of abstraction). By designing and developing the software using an incremental and iterative methodology, we can quickly assess and improve the machine to more precisely solve the problem in the world, and therefore achieve success.