This course aims to introduce students to software engineering,
and in particular to the problems of building large systems,
safety-critical systems and real-time systems. Case histories of
software failure are used to illustrate what can go wrong, and
current software engineering practice is studied as a guide to how
failures can be avoided.

At the end of the course students should know how writing programs
with tough assurance targets, in large teams, or both, differs from
the programming exercises they have engaged in so far. They should
appreciate the waterfall, spiral and evolutionary models of software
development and be able to explain which kinds of software project
might profitably use them. They should appreciate the value of other
tools and the difference between incidental and intrinsic complexity.
They should understand the software development life cycle and its
basic economics. They should be prepared for the organizational
aspects of their Part IB group project.