The development of non-trivial computer systems in the real world (as opposed to research, demontration, etc.) involves manipulating complex systems. A clear understanding of the nature of such systems is an essential pre-requisite of successful development.
Complex System: a system in which the effect of a change cannot be predicted.
To be more precise, it is a system in which the effect of some reasonably likely change cannot be predicted with sufficient precision to enable people to prepare for the change.
It may be helpful to distinguish between complex and chaotic systems, although the two are not entirely distinct.
A complex system may cope with some changes, but other changes will cause large and unxepected alterations in its functioning. It is this aspect which causes many software projects to fail and over-run on time and budget, and it has absolutely nothing to do with software development..
It should be clear by now that I am using the terms 'simple' and 'complex' in a technical way. I hope that this usage will make sense as a reasonably intuitive extension to the normal meaning of the words.
'Simple', in this context, should be contrasted with 'easy'. To make an analogy, think back to when you were doing sums at school. When you knew how to add and subtract but not multiply or divide, if you had been given the task of adding together twenty numbers, this would have been simple but not easy. Simple, in that you understood what was to be achieved, but not easy because of the number of steps involved.
A complex task, at this stage, would have been to find the square root of four. One one level, the task is much easier, but you would not have understood the concept, and would have had no way of reaching the answer.
You can understand a system as something which takes an input or set of inputs and produces an output or set of outputs. It is a set of objects which perform a process. It can be made up of people and/or machines. A system has a purpose or a function, and its success is determined by how well it fulfils that purpose.
A simple system responds in a predictable way to change. A simple system can be represented as follows:
We can add feedback to our diagram of a simple system above...
This does not automatically make the system complex, although every complex system has feedback as a central ingredient.
It is probably helpful to take a few minutes considering the nature of feedback. All life depends on the principle of feedback. In particular, it depends on negative feedback.
A regulator is a good example of negative feedback: the faster the engine goes, the more the regulator shuts down the steam; the slower it goes, the more the regulator opens up the steam. The result is a reasonably consistent speed.
Within our cells is an incredibly complicated environment in which many different chemical reactions are constantly taking place at carefully controlled rates. If these reactions stop, or go at the wrong rate, we cease to function properly: we get ill or even die.
For life to survive, it requires many different aspects of this environment to be kept within fairly strict limits: temperature, acid-alkali balance, salinity, etc. These balances must be maintained despite the changes which are constantly occurring, both inside and outside the organism.
Every one of these balances involves a negative feedback mechanism.