48 Chapter 3. Design Principles
3.1.1 Causes of difficulties
Software development is complicated and difficult. Design is one of the most
difficult tasks in software development. Before we start to search for methods that
allow us to make good designs of software systems, we need to understand why
software development is difficult.
As discussed in Chapter 1, all designers face difficulties. The question is
whether or not there are specific reasons that make software design even more
difficult in additional to the general reasons. In the paper No Silver Bullet: Essence
and Accidents of Software Engineering [
1], Fred Brooks pointed out some of the
principal causes of the difficulties of software development. These causes are
classified into two types: the essence and the accidents. Essences are the
difficulties inherent in the nature of software. They are irreducible, will not
disappear and cannot be solved through technical solutions. Accidents are
difficulties that today attend its production but are not inherent. Brooks’ four
essences of difficulties of software development are the following.
(a) Complexity
Complexity is an essential property of software. Software entities are complex in
terms of the sizes of their state spaces and the way these states are interrelated one
to another. This makes conceiving, describing, and testing software hard. Digital
computers are more complex than most things that people build. They have large
numbers of states. Software systems have orders of magnitude more states than
computers do. Software entities are also complex in terms of the numbers of their
elements and the way they interact with each other. Elements in a software entity
are not repetitions of the same because if two parts are similar, we make them a
subroutine or procedure. Therefore, elements in a software entity are all essentially
different from each other. A scale up of a software entity, therefore, is not merely
increasing the repeated occurrences of same elements or enlarging the elements in
sizes. It is necessarily the increase of the number of different elements. These
elements in a software entity interact with each other nonlinearly in most cases, e.g.
the state space of the whole system is often a nonlinear function of the state spaces
of the elements.
The complexity of software and its nonlinear increase with size is the main
cause of many difficulties in software development. The complexity of the problem

Get Software Design Methodology now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.