Our Architecture Process (The Real-World Version)

Welcome to the way we do software architecture: grounded in reality, driven by business needs, and shaped by our domain. This isn’t ivory-tower modeling—it’s a working process that grows alongside the system and the team.


1. Understand the Drivers (Before Writing Diagrams)

What we’re doing here: We figure out what really matters before diving into tech. That means:

  • What do users want?
  • What makes the business tick?
  • What can’t we break (regulations, data models, expectations)?

How we do it:

  • Run event-storming and domain storytelling sessions with stakeholders.
  • Use Wardley Maps to understand where change is coming from.
  • Capture not just the requirements but also change axes and trade-offs.

Artifacts:

  • Raw sticky notes (or Miro boards)
  • Context map sketches
  • Notes on risks and constraints

2. Sketch the System (Just Enough)

What we’re doing here: Define the backbone of the system—don’t over-engineer.

How we do it:

  • Use bounded contexts to find natural seams.
  • Model the system using the C4 model (plus connectors—let’s call it C5).
  • Write Architectural Decision Records (ADRs) for the big choices.

Artifacts:

  • Context/container/component diagrams (PlantUML or diagrams.net)
  • C5 models for inter-service comms
  • Initial repo + deployment layout

3. Test the Ideas (Before They Break)

What we’re doing here: Make sure this thing will work before it gets expensive to fix.

How we do it:

  • Define fitness functions for the qualities we care about (performance, modifiability, etc.).
  • Walk through a few “worst-case” scenarios.

Artifacts:

  • Fitness function definitions (e.g. latency budget, retry logic, API contracts)
  • List of architectural risks and how we’re addressing them

4. Communicate It (So Everyone Gets It)

What we’re doing here: Make sure devs, ops, and leadership are aligned.

How we do it:

  • Share C4/C5 visuals
  • Publish documentation that matches our domain (use the same language)
  • Put it all in a wiki—update it often

Artifacts:

  • ADRs
  • Architecture as code (PlantUML, markdown, etc.)
  • System overview slides (for onboarding)

5. Build It (Without Losing the Plot)

What we’re doing here: Start coding, but stay aligned with the architecture.

How we do it:

  • Define workflows (BPMN or similar) for Temporal or service orchestration
  • Use Tactical DDD to keep code clean
  • Integrate fitness checks into CI/CD

Artifacts:

  • Working service skeletons
  • CI pipelines with architecture checks
  • Code that reflects our bounded contexts

6. Change it (Without Wrecking It)

What we’re doing here: Embrace change, but don’t let entropy creep in.

How we do it:

  • Re-run event-storming when things shift
  • Keep fitness functions up to date
  • Monitor drift and run architectural reviews periodically

Artifacts:

  • Updated domain models and diagrams
  • New or revised ADRs
  • Notes from architecture syncs

Tools & Practices We Actually Use

  • Event Storming: Start here. Always.
  • Domain Storytelling: Use when people prefer talking in use cases.
  • C4 + C5 Diagrams: For everything from context to deployment views.
  • Fitness Functions: Validate what matters (latency, availability, coupling, etc.)
  • PlantUML & diagrams.net: Architecture as code (or near enough).
  • ADR templates: Track the decisions, trade-offs, and when we change our minds.
  • Wardley Maps: To align architecture with business shifts.

References That Shaped This

  • Fundamentals of Software Architecture — Mark Richards, Neal Ford
  • Building Evolutionary Architectures — Ford, Parsons, Kua, Sadalage
  • Software Architecture for Developers — Simon Brown
  • EventStorming — Alberto Brandolini
  • DDD by Example — Michael Plöd
  • Architecture Modernization — Nick Tune
  • Software Architecture Visual Notes — Cesare Pautasso

This document evolves like our architecture. If it’s out of date, that’s a bug; file an issue or drop it in Slack. We build things that change, and our process reflects that.