skip to content

Architects often say "there are no right answers in architecture, only trade-offs". What does that mean in practice, and can you name two quality attributes that pull against each other?

level: juniorimportance: must knowfreq 72%

answer

  1. No best architecture, only ranked priorities
  2. Shared budget: money, time, complexity, physics
  3. Cache = speed vs staleness
  4. Redundancy = availability vs cost
  5. Say the downside out loud; record in an ADR

basics

~10 s

It means improving one desirable property usually costs another. Example: caching copies of data makes reads fast but copies can be stale; adding redundant servers raises availability but raises cost and operational complexity.

solid answer

~50 s

Architecture spends a fixed budget of money, time, complexity and physics across competing quality attributes (performance, availability, security, modifiability, cost, simplicity). Because those attributes share the same resources, improving one usually degrades another: caching buys latency at the cost of freshness; encryption and auditing buy security at the cost of latency and developer friction; fine-grained services buy independent deployability at the cost of network hops, partial failure and operational overhead; heavy abstraction buys modifiability at the cost of readability. So "best architecture" is meaningless without a ranked list of what this system must be good at, agreed with whoever pays for it. A good answer never says "microservices are better" — it says "we chose X, which optimises A and B, and we knowingly accept worse C, because the business ranked A above C", and records that in an ADR (Architecture Decision Record) so future readers see the reasoning, not just the outcome.

go deeper

for a junior

Name the phrase, give one concrete pair (cache = fast reads vs stale data) and say the choice depends on what the business values most.

for a middle

Give three or four concrete pairs with the mechanism behind each, and show you turn 'fast' into a measurable scenario before choosing.

for a senior

Frame it as ranked, testable quality-attribute scenarios; state the accepted loss explicitly; record it in an ADR; distinguish real trade-offs from pure wins.

for a principal

Add reversibility and time: which decisions are one-way doors, when the assumptions behind a ranking expire, and how you make the organisation re-examine rankings without churn.

## What the phrase means A **quality attribute** (also called a non-functional requirement, or an "-ility") is a property of *how well* a system does its job rather than *what* it does: performance, scalability, availability, security, modifiability/evolvability, testability, observability, simplicity, cost, time-to-market. "Everything is a trade-off" claims that **no design maximises all of these at once**. Push one up and at least one other goes down. Therefore an architecture cannot be judged as right or wrong in the abstract — only as *well or badly matched to a ranked set of priorities*. ## Why the tension is structural, not laziness Three root causes: 1. **Shared finite resources.** Money, calendar time, team headcount, cognitive budget. Every hour spent hardening security is not spent on features; every extra environment costs cash. 2. **Physics and information theory.** Data cannot be in two places at once without either copying it (→ staleness) or coordinating (→ latency). Light takes roughly 5 ms to cross a continent one way, so cross-region synchronous writes have a hard latency floor. 3. **Coupling has two faces.** Coupling components tightly makes them fast, consistent and easy to reason about locally, but hard to change independently. Decoupling them makes independent change and deployment cheap but adds indirection, network calls and partial-failure handling. ## Classic opposing pairs (know at least three) | Push this up | ...and this goes down | Mechanism | |---|---|---| | Performance (caching, denormalisation, read replicas) | Consistency/freshness | You are reading a copy that may lag the source | | Availability (redundancy, multi-AZ/region) | Cost, and consistency under partition | More machines, more coordination, more skew | | Security (encryption, MFA, least privilege, audit) | Latency, usability, developer velocity | Extra hops, extra approvals, extra friction | | Modifiability (layers, abstraction, plug-in points) | Simplicity, raw performance, readability | Indirection you must trace through | | Independent deployability (services) | Operational complexity, end-to-end consistency, debuggability | Distributed tracing, retries, sagas, more infra | | Time-to-market | Almost everything else (technical debt) | Deliberate shortcuts, deferred hardening | ## What "handling" a trade-off looks like 1. **Make the attributes explicit and ranked.** Get stakeholders to order them ("p99 checkout latency under 300 ms beats storage cost") rather than saying "all of them, high". 2. **Turn each into a testable scenario.** "Fast" is not testable; "a 95th-percentile read returns in under 100 ms with 2 000 concurrent users" is. 3. **Name the loss out loud.** State what gets worse. A decision presented with no downside is a decision that has not been analysed. 4. **Record it.** An ADR captures context, options, decision, and consequences (both good and bad) so the trade-off is not silently re-litigated later. 5. **Prefer reversible choices** where the ranking is still uncertain, so the cost of being wrong stays low. ## Common edge cases - **Not every choice is a trade-off.** Some things are strict wins (deleting dead code, fixing a genuine bug, adding an index that no write path notices). Do not perform fake even-handedness — say "this one really is free". - **Trade-offs are contextual.** The same choice (say, a single relational database) is excellent for a 10-person startup and unacceptable for a 40-team platform. The design did not change; the priorities did. - **Trade-offs shift over time.** Hardware, managed services and team size all move the frontier. Revisit decisions when the assumptions behind them expire.

  • Is any architectural decision *not* a trade-off?
    Yes — removing dead code, fixing a real defect, or adding a read index on a write-light table are near-pure wins. Pretending every choice is balanced is as unhelpful as pretending none are; call out true free wins.
  • Who decides the ranking of quality attributes?
    Business and product stakeholders own the ranking; the architect owns translating it into measurable scenarios and explaining the cost of each ranking. If the stakeholders say "everything is critical", force a choice by pricing the options.
  • How do you record a trade-off so it survives staff turnover?
    An ADR: context, options considered, decision, and explicit consequences including what got worse. Store it in the repo next to the code so it is versioned with the system it explains.

Choosing a vehicle. A sports car, a minivan and a pickup are not ranked on one scale — each maximises speed, capacity or hauling and pays for it elsewhere. Asking "which is the best vehicle?" is meaningless until you say who is driving, carrying what, how far, and on what budget.

saying these in an interview costs you the question

  • Saying one style (microservices, event-driven, serverless) is simply 'better' with no context
  • Claiming a design has no downsides
  • Treating quality attributes as unranked — 'we need it fast, secure, cheap and flexible'
  • Confusing trade-off talk with indecision: naming trade-offs still requires choosing
  • Assuming a past trade-off is permanent when its assumptions have changed

context