Machine Learning pathway increased my salary by 40%
Solution Architecture: From Strategy to Design
A solution architecture is the smallest set of decisions that lets a delivery team build the right thing, and a review that keeps it right. Everything beyond that set is either enterprise context or delivery detail.
How solution architects work from a business outcome rather than from a template: framing the problem, evaluating options honestly, specifying only the non-functional requirements that change the design, choosing boundaries and interfaces, working with vendors and legacy, and handing over in a form delivery can use.
On this page18 sections
What this covers
- Who this is for
- Solution architects, technical leads moving into architecture, and enterprise architects who need to understand what happens between a capability decision and a delivered system.
- What it assumes
- Experience of delivering software or systems, some familiarity with integration and data modelling, and exposure to a procurement or vendor selection process.
- What you will be able to do
- Frame a solution problem in business terms, present options with explicit trade-offs, specify non-functional requirements that actually constrain design, define boundaries and interfaces, and produce documentation that a delivery team will use.
- Reading time
- About 19 minutes.
Feasibility, estimation and the questions before commitment
Solution architecture is often asked for a cost before it has enough information, and answering badly is how credibility is spent. The useful posture is to price the unknowns rather than the whole: here is the range, here is what would narrow it, and here is the smallest spend that resolves the largest uncertainty.
Four questions separate a plausible estimate from a wish. Which integration is least understood, and what would a spike cost to resolve it? Which non-functional requirement is most likely to force a re-architecture? Which third party controls a dependency and what is their lead time? And what is the migration path for existing data, which is where most underestimated work hides.
The architectural contribution is a risk-adjusted estimate with the assumptions visible, plus a first increment that buys information. Organisations that fund discovery before commitment make better decisions than those that fund a plan and discover the truth during delivery, and the difference is usually a few weeks of a small team.
- Price the unknowns separately from the known work.
- Name the spike that would narrow the range.
- Identify the requirement most likely to force redesign.
- List third-party lead times as constraints.
- Estimate data migration explicitly.
- Fund a first increment that buys information.
Integration styles, and choosing one deliberately
Almost every solution is mostly integration, and integration choices outlive the components that made them. Four styles cover the ground: synchronous request-response for immediate answers, asynchronous messaging for events and decoupling, batch transfer for volume where latency is irrelevant, and shared data for read-only analytics where neither is appropriate.
The decision rule is driven by whether the caller needs an answer to continue. If it does, a synchronous contract with explicit failure behaviour is right, and it should be designed for the dependency being slow as well as absent. If it does not, asynchronous messaging with a durable queue removes the coupling and improves resilience at the cost of end-to-end visibility.
The style to avoid as a default is direct database access between systems. It creates a hidden contract that no one owns, breaks on any schema change, and cannot be governed. Where it already exists, the migration path is to put an interface in front of the data and move consumers over one at a time, which is unglamorous and reliably effective.
| Style | Use when | Main risk |
|---|---|---|
| Synchronous API | Caller needs the answer | Cascading latency |
| Asynchronous message | Decoupling and events | Lost end-to-end visibility |
| Batch transfer | Volume, latency irrelevant | Window pressure |
| Shared read data | Analytics only | Hidden contract |
The non-functional requirements that get skipped
Performance gets the attention; five other requirements decide whether a solution survives its first year. Availability, expressed as an allowed downtime budget rather than a percentage nobody believes. Recovery, expressed as how long and how much data lost. Data residency and retention, expressed as what may exist where and for how long. Accessibility, expressed as a standard to meet. And operability, expressed as what support staff must be able to see and do.
Each needs a number and a test, or it is a preference. An availability target without an error budget cannot be traded against cost or complexity. A recovery objective without a rehearsed restore is an aspiration. A residency requirement without an inventory of where data flows is a claim that an auditor will test.
The architectural habit that catches them is to write the requirement, then write how it will be evidenced, before choosing a design. Solutions fail acceptance most often on requirements that were stated as adjectives, and the cheapest fix is a number, a test and an owner at the point the requirement is written.
- State availability as a downtime budget.
- State recovery as time and data loss, and rehearse it.
- Inventory where data flows for residency.
- Name the accessibility standard to meet.
- Specify what support staff must see and do.
- Write the evidence for each requirement with the requirement.
What a solution architect is accountable for
The enterprise architect owns the structure that spans initiatives; the solution architect owns the structure inside one. That boundary is frequently blurred, and the blur costs time: solution architects escalate decisions that are theirs, and enterprise architects design things that delivery should decide.
The clearer statement of accountability is that a solution architect is responsible for the decision set that a delivery team cannot safely make alone: system boundaries, interfaces with systems they do not own, data ownership, non-functional targets, and any choice that is expensive to reverse. Everything else — internal structure, libraries, naming — belongs to the team.
The second accountability is fitness: whether the solution will still be appropriate in three years under the strategy that funded it. That requires holding two time horizons at once, which is what distinguishes the role from a lead developer, and it is why solution architects need enterprise context rather than only technical depth.
- Own the irreversible decision set within one solution.
- Leave internal structure to the delivery team.
- Escalate only cross-solution and irreversible questions.
- Hold both delivery and three-year horizons.
- Keep enterprise context, not just technical depth.
- Be accountable for fitness, not for build progress.
- Solution architecture
- The decisions that define a solution’s boundaries, interfaces, data ownership, quality attributes and major technology choices.
- Non-functional requirement
- A quality attribute the solution must satisfy — performance, availability, security, operability — which constrains design far more than functional scope.
- Option
- A coherent alternative solution shape, costed and assessed, rather than a variation on a foregone conclusion.
Framing the problem before drawing anything
Most solution architecture begins with a proposed system and a document that justifies it. The more useful starting point is the outcome and the constraint: what must be true for this to succeed, what cannot change, and what has already been decided by someone else.
Four questions frame almost any solution. What outcome is being purchased, and how will it be measured? Which decisions are already fixed by enterprise standards, contracts or regulation? What currently does this job, and what happens to it? And what is the acceptable failure mode — refuse the transaction, queue it, or accept and reconcile later?
That last question is the one most often skipped and most often the source of redesign. A solution that assumes availability and discovers that the business will accept delay has built unnecessary complexity; one that assumes delay and discovers that a regulator requires immediate confirmation has built a liability.
- Start from outcome and constraint, not from the proposed system.
- Establish what is already fixed before designing.
- Identify the incumbent and its intended fate.
- Agree the acceptable failure mode explicitly.
- Confirm the measurement before scoping the build.
- Write the framing down; it prevents later redefinition.
Presenting options honestly
An options paper with one real option and two straw men is a decision avoided rather than supported. Honest evaluation requires two or three coherent shapes, each with a stated cost, risk and consequence, and a recommendation with reasons.
The shapes usually available are: buy and configure a product, extend an existing platform, or build. Each has a characteristic risk profile — product fit and vendor dependency; platform constraints and upgrade debt; build cost and long-term ownership — and the analysis is about which risk the organisation is better placed to carry, not about which is best in the abstract.
The presentation discipline is to make the option shapes genuinely different and to state what would have to be true for each to be the right choice. That last column is what converts a preference into a decision, and it is also what allows the decision to be revisited legitimately when the assumptions change.
If all the options lead to the same design, they are not options. They are a justification.
| Shape | Characteristic risk | Right when |
|---|---|---|
| Buy and configure | Product fit, vendor dependency | Capability is commodity and stable |
| Extend existing platform | Platform limits, upgrade debt | The platform model genuinely fits |
| Build | Cost, long-term ownership | Capability is differentiating and volatile |
| Compose from services | Integration complexity, latency | Needs vary by segment and change often |
Non-functional requirements that change the design
Functional requirements describe what a system does; non-functional requirements determine what shape it can take. A latency target of forty milliseconds rules out a design; a target of four seconds does not. Most NFR lists are long, unmeasured, and consequently ignored.
The discipline is to specify only the quality attributes that would change a decision, with a number and a condition. Availability with a stated measurement window and a defined degradation behaviour. Throughput at peak with the growth assumption. Recovery time and recovery point objectives, since those determine data architecture. Security classification and the access model. Operability: what must be observable, and by whom.
Each should be traced to a test that will prove it. An NFR without a test is an aspiration, and it will be discovered as unmet in production. Where a target cannot be tested before go-live, the design should contain a fallback that makes failure survivable, which is a design decision the NFR should state explicitly.
- Specify only NFRs that change a design decision.
- Always attach a number and a measurement condition.
- Include degradation behaviour, not just target availability.
- Define RTO and RPO; they determine data design.
- Trace each NFR to a test that proves it.
- Where testing is impossible, design a survivable fallback.
Boundaries, interfaces and data ownership
The structural core of a solution architecture is small: what the solution owns, what it calls, what calls it, and where the data of record lives. Get these four right and most other decisions follow; get them wrong and no amount of internal elegance compensates.
Data ownership is the decision with the longest consequence. If the solution creates a second copy of a customer record, it has created a reconciliation obligation that will outlive the project. Where a copy is unavoidable — for performance, availability or vendor constraints — the architecture should state the direction of truth, the reconciliation mechanism and its frequency.
Interfaces deserve explicit contracts even inside one organisation: what is exchanged, in which direction, with what guarantees. A file drop with an agreed schema and reconciliation is a legitimate interface; an unagreed file that “has always been produced that way” is a latent incident. The architecture should name each interface and its owner.
- Define what the solution owns, calls, and is called by.
- State the system of record for every entity used.
- Where a copy is unavoidable, specify reconciliation and direction of truth.
- Give every interface a contract and an owner.
- Prefer explicit contracts over inherited file drops.
- Keep the structural core to one page.
Integration choices inside a solution
Integration decisions inside a solution are usually simpler than enterprise integration and more consequential than teams expect. The first choice is synchronous or asynchronous, determined by whether the caller needs an answer to proceed, and the second is whether the solution should call a peer or consume a published event.
Three questions resolve most cases. Must the user wait? If yes, synchronous, with a timeout and a defined failure path. Is more than one consumer interested? If yes, publish an event rather than calling each. Does the producer need to remain available when the consumer is not? If yes, asynchronous by necessity rather than preference.
Whatever the choice, the solution must state its behaviour under failure: what happens when the peer is unavailable, how retries are bounded, whether operations are idempotent, and where the resulting state is visible to support staff. Solutions that omit this are the ones whose first incident is diagnosed by guesswork.
- Choose by whether the caller can proceed without an answer.
- Publish an event where more than one consumer is interested.
- Prefer asynchronous where producer availability must not depend on consumer.
- State the failure path for every synchronous call.
- Bound retries and make operations idempotent.
- Make queue state visible to support staff.
Working with vendors and packaged products
Most solution architecture involves a product rather than a blank page, and the architect’s leverage sits in the requirements pack and the evaluation rather than in the design. A requirement that no product satisfies and one that every product satisfies are both wasted; the useful requirements are the ones that discriminate.
The questions that matter in evaluation are rarely on the feature checklist. What is the upgrade path, and how many versions are supported? Which extension mechanisms are supported, and which will be broken by upgrades? Where does the product store data, and can it be exported completely? What does the vendor’s own roadmap assume about our integration approach? And what happens commercially if we need to leave?
The post-selection discipline is to keep customisation inside supported extension points and to hold the integration layer yourself. A product that is heavily customised is a build with a licence fee; it cannot be upgraded, and the vendor’s roadmap becomes irrelevant because you can never take it.
- Write requirements that discriminate, not exhaustive lists.
- Ask about upgrade path and supported extension points.
- Confirm data export and exit before signing.
- Keep customisation inside supported extension points.
- Own the integration layer yourself.
- Record the exit position annually.
Designing around systems you cannot change
Almost every solution must coexist with a system nobody can modify. The architectural response is translation rather than negotiation: build an anti-corruption layer that presents the legacy system as the interface the solution needs, and keep all knowledge of the legacy’s peculiarities inside it.
This layer has three benefits beyond tidiness. It gives the solution a stable interface that can survive a future replacement of the legacy. It concentrates the awkward logic where it can be tested. And it creates the seam through which the legacy can eventually be retired, one capability at a time.
The cost is real: another component to operate and own. That is why the layer should be justified by expected change rather than by principle. Where the legacy will be replaced within the planning horizon, the layer is an investment in that replacement; where it will not, the layer is the only way to keep the integration comprehensible.
- Translate rather than negotiate with systems you cannot change.
- Keep legacy knowledge inside one boundary.
- Use the layer as the future retirement seam.
- Justify the layer by expected change, not by principle.
- Test the translation logic against real legacy responses.
- Document the legacy behaviours the layer compensates for.
Documentation a delivery team will actually use
Solution architecture documentation fails in two directions: too much, so nobody reads it, or too little, so decisions are re-made in code review. The workable set is small and specific, and it is mostly about decisions and constraints rather than about design description.
Five artefacts cover most engagements: a context and boundary diagram with the interfaces named; a decision log with the irreversible choices and their rationale; the non-functional requirements with their tests; the data ownership statement; and the delivery constraints — standards, environments, approvals, and what the team must not do. Together these fit in a few pages.
The second half of the job is availability. A document without a person is an archive. The architect should be reachable for questions with a stated response commitment, attend the few ceremonies where decisions surface, and review the design once at the point where it becomes expensive to change. Presence, not documentation volume, is what makes architecture influential inside a delivery team.
- Produce five artefacts, not fifty pages.
- Focus on decisions, constraints and interfaces.
- Include the data ownership statement and the NFR tests.
- State what the team must not do, and why.
- Commit to a response time for questions.
- Review once, where change becomes expensive.
Reviews that improve designs
A design review that inspects a document and issues findings produces compliance and resentment. A review that examines a decision under uncertainty produces better decisions, and it needs three conditions: the right people, a specific question, and a timing that still allows change.
The right people are those who will operate or inherit the solution. Operations engineers find failure modes that architects miss; support staff find usability and diagnosability problems; the data owner finds ownership ambiguities. Inviting them to one session early is worth more than three later reviews.
The specific question is what turns a review into a contribution. “Will this survive a doubling of volume without redesign?” and “If this interface fails at peak, what does the customer see?” are answerable. “Any comments?” is not, and it produces the two kinds of feedback nobody can act on: style preferences and general unease.
- Invite the people who will operate and inherit it.
- Ask one specific question per review.
- Review while change is still affordable.
- Prefer failure-scenario questions to document inspection.
- Record findings as decisions, with an owner.
- Do not review what automated checks can verify.
Capacity, performance and the numbers to demand
Performance requirements are the most frequently hand-waved and the most expensive to discover late. The discipline is to demand four numbers before designing: peak throughput, acceptable response time at the user-visible boundary, data volume and growth over the planning horizon, and the concurrency at peak.
With those, capacity design becomes tractable: identify the component that will saturate first, size it with headroom, and decide what happens when the headroom is consumed. That last decision is architectural — shed load, queue, or degrade a feature — and it is rarely stated, which is why systems fail by falling over rather than by slowing down gracefully.
The second requirement is a test that proves it. A load test at expected peak with the production data distribution, run before go-live, converts an assertion into evidence. Solutions without one are relying on the vendor’s benchmark, which was measured on different data in a different configuration.
- Demand peak throughput, response time, volume growth and concurrency.
- Identify the first component to saturate.
- Size with headroom and state what happens at the limit.
- Design graceful degradation rather than failure.
- Prove it with a load test on realistic data.
- Re-test after any significant change to the data model.
A performance requirement without a load test is an opinion about the future.
Designing for the people who will run it
A solution that works and cannot be operated has not been architected. Operability is a design property: whether a failure is visible, whether it is diagnosable, whether it can be safely restarted, and whether a support analyst can answer the question a customer is asking.
The design questions are concrete. What must be logged for a support analyst to reconstruct a customer’s journey, and is the correlation identifier present on every entry? What does the operations team see when the queue backs up, and can they act without calling an engineer? Can a failed process be replayed without duplicating effects? And what happens to in-flight transactions during a deployment?
Involving support staff in design review is the cheapest way to find these. They know which questions arrive at 9am on a Monday, and those questions define the observability the solution needs. Architectures that omit this produce systems where every incident begins with an engineer being paged to read a log.
- Design correlation identifiers into every log entry.
- Give operations a view they can act on without engineering.
- Make replays safe and idempotent.
- Define in-flight behaviour during deployment.
- Invite support staff into design review.
- Treat diagnosability as a requirement with a test.
The claims platform that was almost two systems
An insurer needs a new claims intake capability: customers submit claims through a mobile app and a web portal, photographs included, with an initial triage decision within minutes and an adjuster assignment the same day. Two vendors can supply most of it; the existing policy administration system must remain the system of record for claims.
The first design proposes building intake in the new vendor product and integrating directly to policy administration for every claim, with the vendor holding a copy of policy data for validation. The review asks one question: what happens at month-end when the policy system runs its batch and is unavailable for two hours? The design would refuse claims, which is unacceptable for a channel that markets twenty-four-hour service.
The revised architecture accepts the claim, queues validation, and issues a provisional triage decision based on a cached policy summary that is refreshed hourly, with the definitive validation completing asynchronously and a stated reconciliation path for the small number of cases where the cache was stale. The vendor holds no policy data; validation runs through an interface the insurer owns. Cost is marginally higher and the failure mode is now designed rather than discovered. The design review question, not the framework, produced the difference.
One well-aimed failure question at the right moment changes a design more than a hundred-page architecture document.
Questions this page answers
What is the difference between enterprise and solution architecture?
How many options should an options paper contain?
How detailed should non-functional requirements be?
What are RTO and RPO and why do they matter?
Should a solution ever hold a copy of master data?
How do we choose between calling a service and consuming an event?
What should we ask a vendor that is not on their checklist?
Is an anti-corruption layer always worth it?
How much documentation does a solution need?
What makes a design review useful?
Who decides when architecture and delivery disagree?
How does a solution architect avoid becoming a blocker?
How do we choose between a synchronous API and a batch file?
What should a solution architecture document contain at minimum?
How do we handle a solution that must span two vendors?
When is it acceptable to accept technical debt deliberately?
How much documentation does a solution need?
Who signs off a solution architecture?
What is the most common design mistake?
Sources and standards
Decide less, decide better
The enterprise architecture courses include solution design exercises, options papers and design review simulations with model answers.
