The aim of this course is to present a range of effective methods
for the design and implementation of software, especially where that
software must meet professional quality standards. This will include
a brief introduction to current commercial methods, but the main
motivation is to understand the reasons why such methods have developed,
how they differ from the concerns of academic computer science, and
what are the technical foundations of good software engineering.
Lectures
Technical foundations of engineering.
Analyzing requirements. Constructing and refining design models.
Techniques for anticipating change. Engineering practice, as
distinct from design, science and mathematics.
Code-level design.
Designing modules and interfaces for reuse, change and test.
Variable roles. Coding style and naming.
Fault avoidance, or preventing bugs.
Loop invariants. Defensive programming. Interface contracts.
Type safety. The pursuit of efficiency.
Design processes and notations.
Structured design. Data modelling.
Formal models, Z and correctness proofs.
The Unified Modelling Language.
Object-oriented design.
Use case analysis.
Class modelling.
Object interaction.
Object state and activity.
Design quality through the lifecycle.
Contrast student and professional environments.
Suitable techniques for Java summer exercise,
group projects, and Part II projects.
Objectives
At the end of the course, students should be able to undertake system
design in a methodical manner, starting from a statement of system
requirements, developing a modular design model, refining it into an
implementation that clearly identifies and minimises risk, coding in a
manner that can be integrated with the work of a team, and using
appropriate methods to identify and prevent faults.
Recommended books
McConnell, S. (1993). Code complete: a practical handbook of
software construction. Microsoft Press.
Fowler, M. (2000). UML distilled. Addison-Wesley (2nd ed.).
Further reading
Broy, M. & Denert, E. (ed.) (2002). Software pioneers:
contributions to software engineering. Springer-Verlag.
Collins, H. & Pinch, T. (1998). The Golem at large:
what you should know about technology.
Cambridge University Press.
Petroski, H. (1985). To engineer is human:
the role of failure in successful design. Macmillan.
Vincenti, W.G. (1990). What engineers know and how they know it:
analytical studies from aeronautical history.
Johns Hopkins University Press.
Simon, H.A. (1996). The sciences of the artificial. MIT Press.
Schon, D.A. (1990). Educating the reflective practitioner. Jossey-Bass.
Pressman, R.S. (2001). Software engineering.
McGraw-Hill (European ed.).