System architecture design process

Iterative System Design — Thinking Framework

This framework structures system design as a series of iterations. Instead of designing for scale and complexity upfront, the process begins with the simplest possible system and progressively improves it. The approach is inspired by Google’s Non-Abstract Large Scale Design (NALSD) and extended to explicitly cover operability and system management.

At each iteration, pressure is applied, limitations are identified, and the design is adapted. Mechanisms such as caching, asynchronous processing, or partitioning are introduced only when a concrete bottleneck appears.

This keeps the design incremental, grounded in real constraints, and resistant to unnecessary complexity.


Solution Architecture Design Process

Goal of the exercise

Output

The goal is to produce a clear, justified architecture. Everything else exists to derive or validate that.


Step 0 — Capture requirements

Principle: Requirements Must Be Explicit Before Designing

Output

Discover the requirements by asking focused questions to the product owner or interviewer until the main user journeys, constraints, and system scope are clear.

What follows defines the format of the requirement artifacts.

User Journey cards

Format:

Example:

User Journey — Patient books appointment

Goal Book an available slot with a doctor

Steps

  1. Patient views available slots
  2. Patient selects a slot
  3. System checks availability
  4. System creates appointment
  5. System marks slot as booked
  6. System confirms booking

Critical rules

Notes

Constraints / NFR card

Format:

Example:

C1 context diagram

Defines:


Step 1 — Derive the simplest C2 from the User Journeys

Principle: Start With The Simplest System That Supports The Journeys

Output

Follow the user journeys step by step and derive the minimum set of responsibilities, components, interactions, and data needed to support them.

Keep it minimal:


Step 2 — Refine architecture boundaries

Principle: Boundaries Should Reflect Ownership, Cohesion, And Rules

Output

Review the initial architecture in both directions: merge components where separation is artificial, and extract bounded contexts where a real domain or ownership boundary exists.

Review and adjust boundaries:

Trade-offs format

Each trade-off is captured as:

Example:


Step 3 — Refine architecture under stress and failure

Principle: No Mechanism Without A Real Problem

Output

This step is iterative:

apply pressure → identify issue → adjust → repeat

Apply concrete pressures

Load & growth

Concurrency & correctness

Read vs write imbalance

Latency

Failures

Possible outcomes

Trade-offs

Update the trade-off list as decisions evolve

Example:


Step 4 — Ensure operability

Principle: If a System Cannot Be Observed, It Cannot Be Operated

Output

Review the architecture from an operational perspective and make explicit how the system will be monitored, debugged, deployed safely, and recovered when something goes wrong.

Format: