The bridge from "what the system must do" to "here is a thing you can build".
π Where this lives: design is the only phase where a decision is cheap to change and expensive to get wrong. Choosing a monolith or microservices, SQL or document store, synchronous or event-driven β each of these takes an afternoon to decide and years to undo. That is why every large engineering organisation runs some form of design review before code is written, and why "architecture decision records" exist as a file format: the team writes down what it chose and, crucially, what it rejected and why, because in three years somebody will ask. Search "architecture decision record ADR template".
What design is
SOFTWARE DESIGN is the process of applying various techniques
and principles for the purpose of defining a device, a process
or a system in sufficient detail to permit its physical
realisation. (IEEE / Taylor's definition, restated)
IT SITS BETWEEN two very different kinds of document:
REQUIREMENTS problem-oriented, in the customer's language,
says WHAT
DESIGN solution-oriented, in the engineer's
language, says HOW
CODE the executable realisation
Design is a CREATIVE activity β there is no algorithm that
converts a requirements document into a design. Two competent
teams given the same SRS produce different designs, and both
may be correct. What design methods provide is not an answer
but a way of ORGANISING the search and of CHECKING the result.
DESIGN IS A WICKED PROBLEM: you cannot fully understand the
problem until you have attempted a solution, and the attempt
changes your understanding of the problem. This is why design
is iterative and why the first design is always wrong in
places.
TWO LEVELS, the standard split:
ARCHITECTURAL DESIGN (high-level / preliminary design)
Identify the SUBSYSTEMS making up the system and the
framework for subsystem control and communication.
Output: an architecture description.
β decides the properties you cannot retrofit: performance
ceiling, availability, scalability, security boundary
DETAILED DESIGN (low-level design)
For each subsystem, design its components, their interfaces,
their data structures and their algorithms.
Output: component specifications, data designs, algorithms.
β decides how pleasant the code is to write and maintain
Between them sits INTERFACE DESIGN, which specifies the
boundaries so that detailed design of each subsystem can
proceed INDEPENDENTLY AND IN PARALLEL. This is the practical
reason architecture comes first.
The activities of the design process
A GENERIC DESIGN PROCESS, activity by activity. In practice
these overlap and iterate; the ordering below is the dependency
order, not a schedule.
1. ARCHITECTURAL DESIGN
Identify subsystems, and the relationships between them.
Output: block diagram / architecture description.
2. ABSTRACT SPECIFICATION
For each subsystem, an abstract specification of the
services it provides and the constraints it operates
under.
3. INTERFACE DESIGN
Design and document each subsystem's interface, so that
the subsystem can be used without knowing how it works.
Once frozen, parallel development becomes possible.
4. COMPONENT DESIGN
Allocate services to components and design their
interfaces.
5. DATA STRUCTURE DESIGN
Design the data structures the implementation will use in
detail.
6. ALGORITHM DESIGN
Design the algorithms used to provide the services.
DESIGN OUTPUTS at each stage feed the next, and every one of
them is a document that will be reviewed:
architecture spec β subsystem specs β interface specs β
component specs β data structure spec β algorithm spec
THE THREE CHARACTERISTICS OF A GOOD DESIGN (Pressman):
1. It must IMPLEMENT ALL EXPLICIT REQUIREMENTS from the
analysis model, and accommodate all IMPLICIT requirements
desired by the stakeholder.
2. It must be a READABLE, UNDERSTANDABLE guide for those who
generate code and for those who test and subsequently
maintain the software.
3. It should provide a COMPLETE PICTURE of the software,
addressing the data, functional and behavioural domains
from an implementation perspective.
QUALITY GUIDELINES a design should satisfy:
Β· exhibit an architecture created using recognisable
architectural styles or patterns, composed of components
with good design characteristics, implementable in an
evolutionary fashion
Β· be MODULAR β logically partitioned into elements or
subsystems
Β· contain distinct representations of data, architecture,
interfaces and components
Β· lead to data structures appropriate for the classes to be
implemented, drawn from recognisable data patterns
Β· lead to components exhibiting independent functional
characteristics
Β· lead to interfaces that reduce the complexity of connections
between components and with the external environment
Β· be derived using a REPEATABLE METHOD driven by information
obtained during requirements analysis
Β· be represented using a NOTATION that effectively
communicates its meaning
Design and the cost of change
WHY DESIGN EFFORT PAYS β with numbers.
The relative cost of fixing a defect, by the phase in which it
is FOUND (the classic Boehm curve, order-of-magnitude figures
that every textbook quotes):
found in requirements 1Γ
found in design 5Γ
found in coding 10Γ
found in unit test 20Γ
found in acceptance test 50Γ
found after release 100Γ (up to 1000Γ for
safety-critical)
A DESIGN DECISION is not a defect, but a BAD design decision
behaves like a defect found after release: it is discovered in
production, and fixing it means changing the architecture.
WORKED: the cost of getting the boundary wrong.
Suppose a system is designed as one module where it should
have been two, and this is discovered during maintenance.
Β· the tangled module is 4,000 LOC
Β· separating it requires understanding all of it, defining
a new interface, and re-testing everything that calls it
Β· at an industry-typical maintenance productivity of
~300 LOC/person-month for comprehension-heavy work,
understanding alone is 4000/300 β 13 person-months
Had the boundary been drawn at design time, the same
separation would have cost the time to draw one more box on a
diagram.
THIS IS THE WHOLE ARGUMENT FOR DESIGN. Not that design
prevents bugs β it does, somewhat β but that design decisions
made early are nearly free and the same decisions made late
are nearly impossible.
WHERE THE EFFORT GOES, typical distribution across a project:
requirements ~15%
design ~20%
implementation ~20%
testing ~30β40%
(and maintenance, over the life of the system, exceeds all
of the above combined β commonly quoted at 60β70% of
total lifetime cost)
READ THAT LAST LINE AGAIN. If most of the money is spent
AFTER delivery, then the property design should optimise for
is not "quick to build" but "cheap to change". Every design
concept in the next topic β abstraction, modularity,
information hiding β exists to serve that one economic fact.
The one sentence to carry out of this topic: design is the phase where changing your mind is still cheap. Everything about the process β the two levels, the reviews, freezing interfaces before detailed design β exists to move decisions earlier, where they cost an afternoon instead of a release.
π Go further: the practical modern framing of "which decisions must be made early" is Martin Fowler's distinction between reversible and irreversible decisions, and Amazon's "one-way door vs two-way door". A two-way door (which logging library) should be decided fast and cheaply, because you can walk back through it. A one-way door (your data model, your service boundaries, your public API) deserves genuine design effort, because you cannot. Most design paralysis comes from treating two-way doors like one-way ones, and most architectural disasters from the reverse. Search "one way door two way door decisions architecture".
π‘ Exam angle: define software design and place it between requirements (problem-oriented) and implementation (solution-oriented). Distinguish architectural/high-level from detailed/low-level design and say what each produces. List the design process activities β architectural design, abstract specification, interface design, component design, data structure design, algorithm design β and Pressman's three characteristics of a good design. The Boehm cost-of-change ratios (1 : 5 : 10 : 20 : 50 : 100) are frequently worth a mark on their own.
Syllabus points
Stages of the design process
Create a free account to tick topics off, take notes as you read, watch the video lessons and get a day-by-day study plan built around your exam date.