skip to content

When documenting solution options for a technical decision, you list both 'constraints' and 'assumptions' separately. What's the practical difference between the two, and why does conflating them cause problems later?

level: middleimportance: should knowfreq 55%

answer

  1. constraints = imposed, non-negotiable
  2. assumptions = chosen, risk-bearing
  3. constraints filter options; assumptions bound validity
  4. invalidated assumption -> redo analysis
  5. state both explicitly in writing

basics

~20 s

A constraint is a hard rule you can't change (like a budget cap or a law), while an assumption is a guess you're making that could turn out wrong (like expecting traffic to stay under a certain level). Mixing them up means nobody knows what's truly fixed versus what might need to be revisited.

solid answer

~50 s

Constraints are non-negotiable boundaries imposed from outside the decision -- regulatory requirements, fixed budget, existing infrastructure, a mandated deadline, a vendor contract already signed. They shape which options are even viable and shouldn't be argued with in the proposal itself. Assumptions are beliefs the architect is choosing to treat as true for the purpose of the analysis -- expected traffic volume, the team's familiarity with a technology, that a dependent team will deliver an API by a certain date -- and they carry risk because they can be wrong. The practical difference matters because constraints define the boundary of the solution space (eliminate options that violate them) while assumptions define the boundary of the analysis's validity (if an assumption breaks, the whole trade-off comparison may need to be redone). Conflating them means a wrong assumption gets treated as immovable, or a real constraint gets 'assumed' and later silently violated because nobody flagged it as fixed.

go deeper

for a junior

Can define the difference between the two terms and identify one example of each on a small feature-level decision when prompted.

for a middle

Proactively separates constraints from assumptions in a proposal, sources constraints (contract, law, existing system), and flags at least the highest-risk assumptions.

for a senior

Designs the decision so that invalidated assumptions have a clear revisit trigger, and pushes back when a stakeholder presents an assumption as an immovable constraint without evidence.

for a principal

Sets the expectation across teams that constraints must be traceable to a source (compliance, contract, exec mandate) and assumptions must be revisited on a cadence for long-lived architecture decisions, preventing stale assumptions from calcifying into unexamined constraints.

## What a constraint is In a solution proposal, a **constraint** is a boundary condition imposed on the decision from outside -- something the architect does not get to choose or negotiate away within the scope of this decision. Typical sources include: - regulatory or legal requirements (e.g., data must stay within the EU under GDPR) - an already-signed vendor contract - a fixed budget ceiling set by finance - an existing piece of infrastructure the organization has already committed to - a hard deadline mandated by an external party like a regulator or a major customer contract Constraints define the boundary of the solution space: any option that violates a real constraint should be eliminated outright, not merely scored lower, because by definition it isn't actually viable regardless of how well it performs on other dimensions. ## What an assumption is An **assumption**, in contrast, is a belief the architect is choosing to treat as true for the purpose of the analysis, without it being externally imposed or guaranteed. Common examples include: - an estimate of expected traffic volume - a belief that the team can pick up an unfamiliar technology quickly enough - an expectation that a dependent team will deliver an API integration on a certain timeline - a guess about how a third-party service will behave under load Assumptions carry risk precisely because they might be wrong, and if a load-bearing assumption turns out false, the trade-off analysis built on top of it may no longer hold -- an option that looked clearly superior under the assumed conditions might not be superior at all under the real ones. ## Why they demand different handling The practical reason to separate these two carefully, rather than lump them together as 'things we're taking into account,' is that they demand different handling. - **Constraints** should be sourced and cited -- traced back to the contract clause, the regulation, or the budget document that established them -- and then simply respected; arguing with a real constraint inside a solution proposal is a waste of effort, since the constraint isn't the proposal's to change. - **Assumptions**, by contrast, should be flagged by risk level. A high-risk assumption -- one that's genuinely uncertain and would flip the recommendation if it turned out false -- deserves an owner, a concrete way to validate it (a load test, a spike, a direct confirmation from the dependent team), and ideally a stated trigger for revisiting the decision if it's later invalidated. Low-risk, low-impact assumptions can be listed briefly without that machinery. ## What conflating them costs The failure mode from conflating the two runs in both directions. - **A real constraint treated as a mere assumption** can get silently 'assumed away' by someone optimizing for a different outcome -- a team eager to ship the cheaper option might casually write 'we're assuming multi-region failover isn't required' when in fact a signed enterprise contract legally mandates 99.95% uptime with cross-region disaster recovery; treating that legal obligation as a soft, debatable assumption rather than a hard constraint leads to choosing an architecture that later has to be expensively reworked once the contractual obligation surfaces, often during an audit or a customer escalation, at a much worse time to discover it than during initial design. - **An assumption treated as an immovable constraint**, running the other way, shuts down legitimate exploration -- if 'we assumed peak load stays under 500 requests per second' was never actually confirmed with the business and gets treated as a hard requirement nobody questions, the team may over-engineer for a number nobody actually committed to, spending real effort and calendar time solving a problem that doesn't exist. ## Assumptions that calcify There's also a subtler, longer-timescale failure: assumptions that go unrevisited tend to calcify into de facto constraints simply through repetition. An assumption stated once in an early design document gets copied into subsequent proposals as background context, and after being repeated enough times without anyone re-checking its source, the organization starts treating it as a given, even though it was never validated by anyone and nothing ever actually promised it. This is why periodically revisiting long-lived assumptions -- especially just before a major re-architecture decision that depends on them -- matters: it's the mechanism that catches an assumption before it silently becomes an unexamined, unfounded constraint that shapes years of subsequent architecture without anyone remembering to question it. ## A worked scenario A concrete scenario: a team designs a checkout system. - The stated **constraint** 'must comply with PCI-DSS', sourced from the company's payment processor agreement -- non-negotiable. - The stated **assumption** 'peak Black Friday traffic will be roughly 3x normal daily peak' -- an estimate from the data team, flagged high-risk, with a load test scheduled before launch to validate it, and an explicit note that the horizontal-scaling option becomes necessary if the real multiplier exceeds 4x. Keeping these visibly distinct means that when the load test later shows 5x rather than 3x, the team already has a documented trigger telling them exactly which part of the design needs to be revisited, rather than having to re-derive the whole trade-off analysis from scratch under time pressure.

  • Give an example of a constraint being mistaken for an assumption, and what goes wrong.
    A team assumes 'we probably don't need multi-region failover' when in fact a signed enterprise contract legally requires 99.95% uptime with documented DR across regions -- that's a real constraint, not a debatable assumption. Because it was treated as a soft assumption, the cheaper single-region option was chosen and later had to be expensively re-architected once the contract obligation surfaced in an audit. Explicitly listing legal/contractual constraints up front, sourced from the actual contract or compliance team, prevents this.
  • How should an assumption's risk level affect how you write it down?
    High-risk assumptions -- ones that are uncertain and would change the recommendation if wrong -- deserve a named owner, a way to validate them (a spike, a stakeholder confirmation, a load test), and ideally a trigger for revisiting the decision if they prove false. Low-risk assumptions can just be listed briefly. Treating every assumption with the same weight either buries the important ones in noise or wastes effort validating trivial ones.
  • Should assumptions ever become de facto constraints over time?
    Yes, and that's a common trap: an assumption stated once in an early document gets repeated in later designs without anyone re-checking it, until the organization treats it as fixed even though it was never actually validated or promised by anyone. Periodically revisiting long-lived assumptions, especially before major re-architecture decisions, is the way to catch this before it causes a costly surprise.

Constraints are the walls of the room you're furnishing -- you don't get to move them. Assumptions are your guess about how many people will actually live there -- reasonable to plan around, but wrong guesses mean you bought the wrong size couch.

saying these in an interview costs you the question

  • Uses 'constraint' and 'assumption' interchangeably in a proposal
  • Lists no source or owner for stated constraints
  • Never revisits assumptions after the initial write-up
  • Treats a stakeholder's casual guess as a binding constraint
  • No indication of what would happen if an assumption turns out false

context