systems) the location of the vehicles in
which we travel, wash our clothes, and
even give us cash from our bank accounts (sometimes!).
Computers are being used increasingly in applications where they can
have great influence over our very existence. 2 They control the flow of trains in
the subway, signaling on railway lines,
even traffic lights on the street. The failure of any of these systems could cause
great inconvenience and conceivably
result in accidents in which lives are
lost. As they control the actual flight of
an aircraft, cooling systems in chemical plants, feedback loops in nuclear
power stations, and so on, we can see
that they all account for the possibility
of great disasters if they fail to operate
as expected.
ILLUSTRATION BY JOE MAGEE
More and more, these systems are
software intensive, meaning that software is the major component and that
much of the functionality is achieved
via software rather than hardware implementations. This raises questions
over the reliability (the measure of the
ability of system to continue operating
over time12) and the dependability (the
property that reliance can justifiably
be placed on the service it delivers12) of
software.
a software crisis
This has become a major issue for
the software engineering community.
While hardware dependability has increased continually over the years, and
with mean time to failure (a measure
of dependability) for the most reliable
systems now exceeding 100 years, 13 software has not kept up with this pattern
and indeed has been exhibiting declining levels of dependability. 10
This can be attributed to many factors, including:
˲ A naïve belief that anyone who can
write software can write good software.
˲ A mistaken belief that running a few
representative test cases indicates that
the software is “correct” or adequate.
˲ Failure to understand that realizing
a good design is more important than
producing vast quantities of code and
that the goal of software engineering is
not only to produce code but also to pro-
duce trustworthy solutions to problems
that can eventually be implemented in a
programming language.
˲Failure to realize that making
changes to software—and in particular
unnecessary, uncontrolled, and careless changes—can have an effect on its
appropriateness and validity, its correct
operation, and can make it less efficient,
or in extreme cases obsolete.
Of course, software is intended to
change, and must be able to change.
If we were to write software that we
would never change after deployment
(to meet changing requirements, an
evolving environment, or to correct errors or unimplemented or incorrectly
implemented requirements), then we
would be better off implementing everything in hardware; but this is neither
technically possible nor financially or
spatially feasible.
michael Jackson: specializing
in software engineering
Software-intensive systems are intended
to interact dependably with the human
and physical problem world. Execution