Conway's Law — Deep Dive

Level: Beginner → Intermediate
Pre-reading: 01 · Architectural Foundations


The Law

"Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations." — Melvin Conway, 1967

In plain terms: your system architecture will mirror your org chart. Teams that don't talk to each other will build components that don't integrate well. Teams that must coordinate constantly will create tightly coupled systems.

graph TD
    subgraph Organization Structure
        T1[Frontend Team]
        T2[Backend Team]
        T3[Data Team]
        T1 ---|Coordination required| T2
        T2 ---|Coordination required| T3
    end
    subgraph System Architecture
        S1[Frontend Monolith]
        S2[Backend Monolith]
        S3[Data Pipeline]
        S1 -->|Tight API| S2
        S2 -->|ETL Jobs| S3
    end

Why Conway's Law Matters for Architects

If You Ignore It What Happens
Org structure misaligns with desired architecture Constant friction; architecture drifts toward org
Teams forced to collaborate on shared codebase Merge conflicts, coordination overhead, slow releases
Boundaries drawn arbitrarily Cross-team dependencies; blocking; politics

Architecture follows people

You cannot sustainably impose an architecture that fights your org structure. Either change the architecture to fit the org, or change the org to fit the architecture.


The Inverse Conway Maneuver

Instead of letting org structure accidentally shape your system, intentionally structure your teams to produce the architecture you want.

graph LR
    A[Desired Architecture] --> B[Design Team Boundaries]
    B --> C[Teams Build Aligned Components]
    C --> D[System Reflects Architecture]

Example: Microservices Adoption

Goal Org Design
Independent deployable services One team per service
Service owns its data Team owns service + database
Minimal cross-service dependencies Minimize cross-team dependencies
API contracts between services API contracts negotiated at team boundaries

Example: Breaking Up a Monolith

Before:

  • 3 feature teams share one monolith codebase
  • Merge conflicts, coordinated releases, everyone touches everything

After (Inverse Conway):

  • Extract bounded contexts into separate services
  • Each team owns one or more services end-to-end
  • Teams deploy independently

Team Topologies — A Framework

Team Topologies (Skelton & Pais, 2019) provides patterns for structuring teams to reduce cognitive load and enable fast flow:

Four Fundamental Team Types

Team Type Purpose Example
Stream-aligned Delivers value in a business domain; end-to-end ownership Order team, Payments team
Platform Provides self-service capabilities to stream-aligned teams Internal developer platform, K8s platform
Enabling Helps other teams adopt new technologies or practices DevOps enablement, security champions
Complicated-subsystem Owns a component requiring deep specialist knowledge ML model team, payment gateway integration
graph TD
    subgraph Stream-Aligned Teams
        SA1[Order Team]
        SA2[Inventory Team]
        SA3[Customer Team]
    end
    subgraph Platform Team
        PT[Platform Team]
    end
    subgraph Enabling Team
        ET[DevOps Enablement]
    end
    PT -->|Self-service| SA1
    PT -->|Self-service| SA2
    PT -->|Self-service| SA3
    ET -.->|Coaching| SA1
    ET -.->|Coaching| SA2

Three Interaction Modes

Mode Description When to Use
Collaboration Two teams work closely together Early stages; discovering boundaries
X-as-a-Service One team provides a service; other consumes via API Stable interfaces; platform teams
Facilitating Enabling team helps upskill another team Adopting new practices; temporary

Collaboration should be temporary

Extended collaboration between teams signals unclear boundaries. Use collaboration to discover, then transition to X-as-a-Service.


Cognitive Load and Team Size

Teams have limited cognitive capacity. Overloading a team leads to:

  • Slower delivery
  • Higher error rates
  • Knowledge silos within the team
  • Burnout

Types of Cognitive Load

Type Description How to Reduce
Intrinsic Complexity of the problem domain Training; documentation; domain expertise
Extraneous Incidental complexity from tools, processes Better tooling; eliminate unnecessary process
Germane Learning and problem-solving effort Reduce intrinsic/extraneous to leave room for this

Team-Sized Architecture

"A team should own a piece of the system they can understand and evolve within their cognitive capacity."

Guideline Rationale
Team size: 5–9 people Two-pizza team; communication scales with n²
One team, one bounded context Clear ownership; no coordination needed
Minimize external dependencies Each dependency adds cognitive load
Platform absorbs complexity Stream-aligned teams focus on business logic

Signs Your Org and Architecture Are Misaligned

Symptom Root Cause Fix
Service A and B always deploy together Teams A and B are separate but services are coupled Merge teams or decouple services
Every feature requires 3+ teams Architecture doesn't match value streams Realign teams to bounded contexts
"Shared services" team is a bottleneck Centralized dependency Distribute ownership; enable self-service
Integration team exists Services don't have clear contracts Define contracts; eliminate integration team
Long PR review queues Too many people on one codebase Split the codebase; shrink teams

Practical Application: Designing Service Boundaries

Step 1: Identify Business Capabilities

Business Capability Sub-capabilities
Order Management Create order, track order, cancel order
Inventory Stock levels, reservations, replenishment
Customer Registration, profile, preferences
Payment Charge, refund, fraud detection

Step 2: Map to Bounded Contexts (DDD)

Each business capability often maps to a bounded context — a consistent domain model with clear boundaries.

Step 3: Align Teams to Bounded Contexts

graph TD
    subgraph Order Team
        OS[Order Service]
        ODB[(Order DB)]
    end
    subgraph Inventory Team
        IS[Inventory Service]
        IDB[(Inventory DB)]
    end
    subgraph Payment Team
        PS[Payment Service]
        PDB[(Payment DB)]
    end
    OS -->|Events| IS
    OS -->|API| PS

Step 4: Define Interaction Contracts

  • API specifications (OpenAPI, gRPC)
  • Event schemas (Avro, Protobuf)
  • SLAs (latency, availability)

Common Anti-Patterns

Anti-Pattern Problem Fix
Component teams Frontend, backend, data teams slice horizontally Cross-functional stream-aligned teams
Shared codebase Multiple teams, one repo Ownership per folder → extract to repos
Approval committees Architecture review board for every change Decentralize decisions; document principles
Bottleneck teams Platform/infra team approves everything Self-service platform; GitOps
Matrix management Developers report to project managers and tech leads Clear team boundaries; one backlog

Applying Conway at Scale

Amazon's "Two-Pizza Teams"

  • Teams small enough that two pizzas can feed them
  • Each team owns a service end-to-end (build, run, operate)
  • Teams communicate via APIs, not meetings
  • Architecture emerged from team structure

Spotify's Squads and Tribes

Concept Description
Squad Cross-functional team; owns a feature area
Tribe Collection of squads in related area
Chapter Horizontal skill group (e.g., all backend devs)
Guild Cross-tribe community of practice

Spotify model caveats

Many organizations cargo-cult Spotify's model without understanding it evolved organically for Spotify's specific context. Apply the principles, not the exact structure.


What is the Inverse Conway Maneuver?

Instead of letting your architecture accidentally emerge from your org chart, you intentionally design your team structure to produce the desired architecture. Want microservices? Create small, autonomous teams each owning one service. Want a platform? Create a platform team providing self-service capabilities. The org structure becomes a tool for architectural alignment.

How does Conway's Law apply to microservices?

Microservices architecture requires teams that can independently own, build, deploy, and operate their services. If teams share codebases or have tight coordination requirements, you'll get distributed monoliths (microservices with monolith coupling). The solution: one team per bounded context, clear API contracts, and minimize cross-team dependencies.

What are the four team types in Team Topologies?

(1) Stream-aligned: delivers value for a business domain end-to-end. (2) Platform: provides self-service capabilities to reduce cognitive load on stream-aligned teams. (3) Enabling: helps teams adopt new skills or technologies (temporary). (4) Complicated-subsystem: owns specialist components requiring deep expertise. Most teams should be stream-aligned; other types support them.