2025-09-15
- what is different in how we do design?
Cynefin1 is a useful, rich model for understanding where your project fits as far as complexity.
We need different design practices depending on where on that model our project fits (or we think it fits).
There are a few different ‘styles’ of software design you will encounter.
Projects exhibit aspects of all of these.
You have been tasked with designing an architecture that supports functionality of this kind:
A unified management station for the building automation domain that automatically monitors and/or controls the internal functions of buildings, such as heating, ventilation, air conditioning, lighting, access, and safety.
What next? Get together in teams and figure out your initial set of actions as the lead architecture team.
after R. Sangwan, et al. 2007. “Integrating a Software Architecture-Centric Method into Object-Oriented Analysis and Design.” Journal of Systems and Software.
The Google File System was a design that served Google very well (e.g. availability, robustness, performance) but was eventually replaced with a new design, Colossus[^https://cloud.google.com/blog/products/storage-data-transfer/a-peek-behind-colossus-googles-file-system].
Google’s operations have scaled orders of magnitude beyond anything the system had been designed to handle. (The Register)
| GFS | Colossus |
|---|---|
| commodity hardware -> many h/w failures | replicate master and avoid single PoF |
| data throughput over latency | latency more important than before |
| append over write | support BigTable operations |
| handle increased search metadata | |
Point: good designers iterate and improve. One of the nice things about software is we can replace pieces of it as we go.
We iterate, but we also do tradeoffs. No one system can satisfy every quality attribute scenario. Some common tradeoffs:
Good design practice involves three aspects.
arch-cartoon from Design SA book
The framework will work from our quality attributes and satisfy the QAS as a essential part of designing/redesigning a system.
add2
One method to do design is to treat it as a series of experiments. We will propose a potential design, test it with our QAS, and then propose a new design until it satisfies the tests/QAS.
We want to minimize the cost of changing the software. Modification cost is the cost of modifying a component’s responsibilities and any costs to modify its downstream dependencies.
How can we test whether our system is modifiable?
We can look at impact analysis for our module structures.
How much time will it take to change the direct component A, and how many components downstream of A will we need to fix?
Do other systems depend on A?
Can we test our change effectively, or will we not know if the change was successful? (do we have a sense for what our dependencies even are?)
design concerns
We then select designs that address the concerns.
One way to do this is with design patterns and architecture tactics.
For example, to handle Performance, we need to Manage Resources. Some tactics to do this include using concurrency, using multiple copies of the data, and bounding queue sizes
You can find more tactics in the book. Most of the book covers architecture tactics.
Another way to assign responsibility to satisfy a design concern is with an externally developed component.
For example, I may delegate responsibility for my authentication mechanism to Google’s OAuth implementation.
This means I no longer have to take charge of managing the complexity of password management, hashing, and so on.
We are building a web app that helps us identify tubular meat products. But we want to allow our EU friends to enjoy this app as well. Problem is, we will need to support different languages (otherwise we will lose users). We will not copy and paste code. How can we redesign the app to support i18n?
In your groups, identify an initial design solution that will remedy this situation.
Our architecture driver is “support i18n”.

Neil Ernst ©️ 2024-5