The Five Forces That Bound Every Design You Will Draw
The most elegant architecture of your career will not be the one you draw on a whiteboard; it will be the one that survives contact with the budget line, the hiring market, and the release calendar. Every real design is boxed in by forces that have nothing to do with technology, and an architect who does not inventory them will spend a quarter designing something the organization cannot build.
Constraints include budget, team skills, deadlines, and mandated technologies — plus the regulatory and contractual ones nobody mentions until legal joins the review. The inventory exercise takes an afternoon and produces the frame every later decision is checked against:
| Force | Concrete form | What it rules out |
|---|---|---|
| Budget | $40k/month cloud cap; no capex this fiscal year | Always-on warm standby, multi-region active-active |
| Team skills | 6 Java engineers, 0 Rust; Kubernetes expertise is thin | Rewrites in a new language, service meshes on day one |
| Deadline | Compliance launch fixed for 1 October, contractually | Anything requiring a data migration in Q3 |
| Mandated technology | Corp standard: PostgreSQL on RDS, Kafka on MSK | Managed alternatives, serverless-first designs |
| Regulation / contract | PII must stay in eu-west-1; PCI scope boundaries | Global replication of customer tables |
Two classifications matter more than the list itself: hard versus soft, and stated versus discovered. A hard constraint is physically or legally fixed (PII residency, a signed vendor contract). A soft constraint is organizational habit — 'we always deploy on Tuesdays' — which you must respect in the plan but should explicitly re-examine, because half the wasted effort in migrations comes from treating preferences as laws. Discovered constraints are the dangerous ones: the architect who learns in week six that the payments team cannot change its schema until after the acquisition closes has already designed around a falsehood. This is why the first interview question in any new design is not 'what do you want?' but 'what is already decided that I cannot touch?', asked separately to engineering, product, legal, and finance — they each know a different quarter of the constraints.
Record the inventory where it will be read. A constraints section at the top of the design doc, one line each, with an owner who can confirm it is still true:
## Constraints (confirmed 2026-03-04)
- [hard/legal] Customer PII resides in eu-west-1 only. Owner: legal
- [hard/budget] Cloud spend cap $40k/mo; autoscale ceiling 60 nodes. Owner: finops
- [hard/mandated] PostgreSQL/RDS, Kafka/MSK per corp standard. Owner: platform
- [soft/skills] No new languages this year. Owner: eng-managers
- [soft/deadline] Checkout revamp targets Black Friday freeze 15 Nov.
The owner and date are what make the list alive: constraints expire, and an architecture silently built on expired ones is how teams discover in month four that the 'mandated' database standard was relaxed for new workloads. When a constraint turns out to be softer than advertised, that discovery belongs in the next design review, alongside how the design changes if it disappears. Which leads to the companion discipline: everything the design assumes but cannot yet verify — the subject of the next section — and the formal companion, Trade-off Analysis, where constraints meet the options they eliminate.
Making Assumptions Explicit So They Can Be Wrong on Schedule
Every design contains claims about the world that nobody has verified: traffic will grow 30% year over year, the new vendor's SDK will be GA by June, the platform team will finish the shared auth service before the checkout rewrite ships, customers will tolerate a 2-second export. Recording assumptions makes them reviewable when new information arrives later — and an assumption written down is a scheduled conversation, while an assumption left in someone's head is a surprise waiting for the worst possible month.
The discipline has three moving parts: make each assumption falsifiable, assign a validation method, and give it an expiry.
| Assumption (vague) | Falsifiable form | Validation | Expiry |
|---|---|---|---|
| Traffic keeps growing | 8k req/s at peak by Q4 (30% YoY) | Weekly traffic trend + marketing calendar | Re-check monthly |
| The SDK will be ready | Vendor commits GA in writing by 1 June | Contract clause + vendor status calls | 15 May |
| Auth service lands first | Shared auth GA before checkout rewrite | Auth team roadmap review | End of sprint 2 |
| Users accept slow export | p95 export < 5 s, or 10% churn in pilot | Pilot with 50 users | 4 weeks after pilot |
Note the pattern: each row names a number or a written commitment, a way to check it without waiting for the failure, and a date at which the design must be revisited if the world has not confirmed it. Vague assumptions fail the first test — 'users will tolerate slow exports' cannot be checked, only believed; 'p95 export < 5 s accepted by 80% of pilot users' can.
Where a cheap check exists, run it instead of writing the row. The 2-hour spike that proves the vendor SDK's batch API actually batches (the docs say it does) converts an assumption into a fact for less cost than one week of engineering risk. This is the same spike habit you use for credibility in The Role of the Architect; here it is aimed at the design's load-bearing claims.
A worked example of what assumption decay looks like when skipped: the 2022-ish inventory platform at a mid-size retailer assumed 'one warehouse' because the business had one warehouse. The design put global item IDs on a single-writer sequence — perfectly correct, cheap, simple. Eighteen months later a second warehouse opened in another region, and the single-writer assumption became a throughput ceiling and a cross-region consistency problem in the same quarter. Nothing about the code was buggy. The design was correct for the world it assumed, and nobody owned re-checking the assumption as the world changed. The fix was not genius; it was a register row with a review cadence that would have caught the expansion in the planning stage, when the ID scheme was still cheap to change.
Two practical rules for running the log: keep it under a dozen active entries (a register with 40 assumptions is a graveyard nobody reads), and review the top entries in the same monthly forum that reviews incidents — the audience with the information to notice when reality moves. An assumption quietly invalidated is the highest-quality risk you can catch, because at that moment the mitigation is still a decision rather than a rescue.
Building a Risk Register That Actually Gets Mitigations Funded
Risk registers die in the same way every time: someone produces a spreadsheet with forty rows, every row scored 'high', no owner is named, and the document is never opened again. The mechanism that keeps a register alive is boring and specific: rank design threats by likelihood and impact so mitigations get funded, assign each one an owner and a trigger, and review the short list on a fixed cadence.
Score each risk on two axes, 1–5 each, and multiply for position:
| Risk | Likelihood | Impact | Score | Mitigation | Owner |
|---|---|---|---|---|---|
| Vendor SDK misses GA date | 3 | 5 | 15 | Contract clause; keep JSON fallback path | architect |
| Migration doubles write latency | 3 | 4 | 12 | Shadow-write benchmark before cutover | payments lead |
| Key engineer leaves during build | 2 | 4 | 8 | Design docs + pair on critical modules | eng manager |
| 10x traffic on launch day | 2 | 5 | 10 | Load test at 12x; pre-provisioned capacity | platform |
| New privacy law changes retention | 1 | 5 | 5 | Retention configurable per field | data team |
Three things separate a register that works from a spreadsheet: the score is a conversation (two people who assess 'likelihood 3' differently are surfacing different information, and the argument is the point), the mitigation names a funded activity with a date ('shadow-write benchmark, sprint 9' — not 'we will monitor it'), and each row states what happens if the risk lands anyway (the contingency), because accepting residual risk knowingly is part of the job.
Mitigations come in four flavors, and picking the right one is half the interview question 'how do you handle risk?':
- Avoid — change the design so the risk cannot occur: drop the third-party payment provider whose outages caused last quarter's incidents, at the cost of two quarters of build.
- Mitigate — reduce likelihood or impact: shadow writes before cutover cut the migration risk's impact from 5 to 3.
- Transfer — buy the risk: contractually, or with an SLA-backed vendor whose credits partially cover the loss.
- Accept — consciously retain low-score risks and revisit when the design changes. Acceptance is a decision, not a default; write the sentence 'we accept up to 4 hours of data loss for event logs' where the next reviewer will see it.
Before the register is finalized, run a pre-mortem: assume it is six months from now and the project failed spectacularly; write the story of why. Pre-mortems work because they license pessimism — in normal planning, saying 'this will fail because the auth dependency will slip' sounds like disloyalty, while in a pre-mortem it is the assignment. Extract each story into a register row with a score, and the register now contains the risks the team actually fears rather than the generic ones everyone already knew.
Review discipline: the full register is read at design milestones; the top five are reviewed monthly with their owners; any risk whose score changes by 6+ points gets an immediate look. With the forces mapped and the risks ranked, you are ready to weigh options against each other under real costs — Trade-off Analysis is where that happens.
Quiz
1. During a new design, you learn that 'all services must run on Kubernetes' comes from a platform team preference, not a compliance rule. How should this be treated?
2. Which assumption entry is written in falsifiable form with a validation method?
3. A register row reads: 'Migration may double write latency — high. We will monitor closely.' What is missing for this row to function?
4. What is the purpose of running a pre-mortem before implementation starts?
Flashcards
Question
What five categories of constraint bound a typical design, with one example each?
Click to reveal answer
Answer
Budget ($40k/month cloud cap rules out always-on warm standby), team skills (6 Java engineers, 0 Rust rules out a rewrite), deadline (contractual launch date rules out a Q3 data migration), mandated technology (corp standard: PostgreSQL on RDS, Kafka on MSK), and regulation/contract (PII residency in eu-west-1 rules out global replication of customer tables).
Question
What distinguishes a hard constraint from a soft constraint, and why does the classification matter?
Click to reveal answer
Answer
Hard constraints are physically or legally fixed (PII residency, signed contracts); soft constraints are organizational habit ('we always deploy on Tuesdays'). The plan must respect both, but only soft ones deserve explicit re-examination — half the wasted work in migrations comes from treating preferences as laws, and soft constraints frequently expire without anyone announcing it.
Question
What makes an assumption entry reviewable, and what happens when one is left unrecorded?
Click to reveal answer
Answer
It is falsifiable (a number or written commitment), has a validation method that checks it before failure (contract clause, spike, pilot), and carries an expiry date that triggers design revisit. Unrecorded assumptions stay in one person's head and surface as surprises — e.g., the single-writer item ID scheme that was correct until a second warehouse opened, with no register row to catch the change in planning.
Question
Name the four mitigation postures for a risk and give the distinguishing trait of each.
Click to reveal answer
Answer
Avoid (change the design so the risk cannot occur, at a build cost), Mitigate (cut likelihood or impact — shadow writes drop migration impact from 5 to 3), Transfer (buy the risk via SLA-backed vendor contracts or insurance), Accept (consciously retain low-score risk and write the accepted statement where reviewers will see it). Acceptance must be a decision, not a default.
Question
How is a risk scored and reviewed so that its mitigations actually get funded?
Click to reveal answer
Answer
Likelihood (1-5) multiplied by impact (1-5) positions it on the register; the score is debated by two assessors because disagreement surfaces information. Each funded row names a dated activity with an owner plus the contingency if it lands anyway. The full register is read at milestones, the top five monthly with owners, and any score moving 6+ points is reviewed immediately.
Revision Notes
Key Takeaways
- 1. Constraints come as budget, skills, deadline, mandated technology, and regulation; classifying them hard vs soft and stated vs discovered is the first interview of any design
- 2. An inventory with owners and confirmation dates stays alive; constraints expire, and designs silently built on expired ones cost quarters of rework
- 3. Assumptions must be falsifiable with a validation method and an expiry — a written assumption is a scheduled conversation, a mental one is a surprise
- 4. Risk scores are conversations, not numbers: mitigation must be a funded, dated activity with an owner plus a named contingency for residual risk
- 5. Pre-mortems license pessimism and populate the register with the risks the team actually fears — captured while the design is still cheap to change
Interview Tips
- • 'How do you identify constraints on a new project?' — walk the five forces, then say you ask each of engineering, product, legal, and finance separately, because each owns a different quarter of the inventory
- • 'Tell me about a risk you caught early' — use the assumption-decay shape: falsifiable claim, validation method, expiry, and what the early catch saved versus discovering it at cutover
- • 'What do you do when an assumption turns out false?' — separate the design review (what changes now) from the process fix (why the expiry/review cadence missed it), and name the register update
- • 'How do you get mitigations funded?' — score by likelihood × impact, attach a dated activity with an owner, and name the contingency; then mention the pre-mortem as the source of the rows
Cheat Sheet
Constraints, Assumptions, Risks
Constraint inventory (one line each, with owner + confirmed date):
| Force | Example | Rules out |
|---|---|---|
| Budget | $40k/mo cap | warm standby, active-active |
| Skills | 6 Java, 0 Rust | language rewrites, day-one meshes |
| Deadline | contractual launch | migrations in the launch quarter |
| Mandated tech | PostgreSQL/RDS, Kafka/MSK | vendor alternatives |
| Regulation | PII in eu-west-1 | cross-region replication |
Classify every constraint: hard vs soft (respect both; re-examine soft) and stated vs discovered (ask engineering, product, legal, finance separately).
Assumption row template: falsifiable claim (number or written commitment) | validation method (spike, contract clause, pilot) | expiry date. Keep under 12 active rows; review monthly alongside incidents.
Risk register: likelihood (1-5) × impact (1-5); funded mitigation with owner + date; named contingency; review top-5 monthly, full list at milestones, any +6 score change immediately.
Mitigation postures: avoid (redesign it away) · mitigate (cut likelihood/impact) · transfer (SLA/insurance) · accept (write the acceptance down).
Pre-mortem: 'It is six months from now and this failed — write why.' Extract each story into a register row while mitigations are still decisions, not rescues.