1.5 Divide and conquer?
As computing technology has improved, we have tried to construct software systems that can deal with larger and more complex problems. In order to provide such solutions, the software systems themselves have become larger and more complex. Unfortunately there is a limit to how much we can take in and understand at any one time. The Romans had a strategy called divide et impera – divide and rule. However this covered the idea that it was easier to rule over groups in conflict with each other.
How can we cope with tricky problems or situations where there is just too much information? The main technique for dealing with such messy situations is decomposition. We can decompose a problem into smaller and smaller parts or chunks until each one can be comprehended or dealt with by an individual. In terms of our earlier definition of a system, we are looking for patterns and/or components within a system and creating internal boundaries around them to identify smaller subsystems, sometimes referred to as modules. We will expose some form of hierarchy in our attempt to simplify a complex system.
The concept of decomposition can also be applied to the way you develop a software system. As you will see in Section 2, you can identify a number of different activities or tasks that an individual or group of individuals might perform in a software development project.
An individual can successfully build small software systems because it is possible for that person to understand all that is needed about the problem and its solution. There is a long history of individuals attempting to develop more complex systems – so-called heroic programming – where success has been less certain. Sometimes the circumstances resulting from poor planning lead to a situation where it is the only way out to achieve a piece of workable software. However there are systems that are so large and complex, such as those that monitor and control air traffic, that they cannot be built by a single individual. The development of such a software system requires a team of people whose work must be well coordinated and managed. There must be a well-defined process if they are to produce an appropriate solution – a software system that is useful, usable, reliable, flexible, available and affordable. In practice, the process of software development is partitioned to enable individuals to specialise in different development activities such as analysis, design and implementation.