2IRR00 · Topic 01
Foundations of Software Design
What design is, why it matters, quality trade-offs
What is software design?
Software design is both the process of making structural decisions about a system and the outcome of that process — Robillard: "the construction of abstractions of data and computation and the organization of these abstractions into a working software application."
Design is a verb (the process you follow while designing) AND a noun (the resulting structure). The exam likes this process-vs-outcome distinction.
In practice, designing software = making decisions and trade-offs between quality attributes: ease of implementation, reusability, maintainability, security/safety, performance, …
There is no single 'right' solution. You search for a feasible solution along these attributes. Two correct programs can have very different designs.
We design software for humans to read and maintain — the compiler does not care until it breaks. Readability and comprehensibility are first-class goals.
Common mistakes
- Thinking design = writing code. Design is the decision-making about structure that precedes and guides coding.
- Assuming there is one correct design. Designs are trade-offs; justify the 'why'.
Exam tips
- Be able to state Robillard's definition idea: abstractions of data + computation, organized into a working application.
- Know that design is process (verb) and outcome (noun).
- Quality attributes / trade-offs: maintainability, reusability, security, ease of implementation, performance.
What is software design? practice
2 questions
Why we need design (real failures)
Good design prevents bugs and misuse proactively, improves maintainability/quality, and makes problems easier to detect and resolve.
Most common causes of project failure: unrealistic/unarticulated goals, badly defined requirements, poor reporting of status, poor communication, sloppy development practices — all leading to the wrong software.
Heartbleed (OpenSSL): a single missing length check on memcpy leaked 64KB of server memory; undetected for ~2 years.
Log4Shell: uncontrolled string substitution allowed arbitrary remote code execution; ~93% of cloud enterprise environments were vulnerable.
Boeing 737 MAX MCAS: software masked an unstable airframe, did not validate its sensor input, could override pilots, with no redundancy — fatal crashes.
Better design = readable/comprehensible code, applied principles (testing, input checks), reusable abstractions.
Common mistakes
- Treating input validation / checks as optional 'extra' work rather than core design.
Exam tips
- You may be asked to connect a failure cause (bad requirements, no input checks) to a design principle.
- Remember the theme: design exists to make software better for the humans who build and use it.
Why we need design (real failures) practice
1 questions