← experimental
Contents
  1. Definition
  2. The Three Types of Cognitive Load
  3. Cognitive Load Drives Software Boundaries
  4. Domain Complexity Heuristics
  5. Assessing Cognitive Load
  6. Reducing Cognitive Load: Levers
  7. Relationship to Architecture Decisions
  8. Cognitive Load at the Code Level (Ousterhout)
  9. Related Concepts

Definition

Cognitive load, as characterised by psychologist John Sweller (1988), is "the total amount of mental effort being used in the working memory." Applied to teams: every team has a finite cognitive capacity — the maximum complexity of system it can build, own, and operate while remaining effective. When this capacity is exceeded the team stops behaving as a cohesive unit and degrades into individuals firefighting independently.

Team Topologies makes cognitive load a first-class architectural constraint: software subsystem boundaries should be sized to fit within a team's cognitive capacity, not the other way around (→ Team Topologies ch. 3).

The Three Types of Cognitive Load

Sweller distinguishes three types, each requiring a different response:

Type Description Design goal
Intrinsic Domain fundamentals — knowledge essential to the task (language, frameworks, business domain logic) Minimise via training, good technology choices, pair programming
Extraneous Environmental overhead — how to deploy, how to configure, hard-to-remember commands that add no business value Eliminate entirely, via automation and good platform UX
Germane Value-add thinking — the specific business or architectural reasoning that builds mastery Maximise by freeing space from intrinsic and extraneous load

The goal for engineering teams: minimise intrinsic, eliminate extraneous, leave maximum space for germane.

Cognitive Load Drives Software Boundaries

"Instead of choosing between a monolithic architecture or a microservices architecture, design the software to fit the maximum team cognitive load." (→ Team Topologies ch. 3)

The practical implication: you cannot reason about service decomposition without first knowing how much cognitive load each team can carry. A team spread too thin across multiple systems or domains will:

  • Lose mastery of any single domain
  • Suffer constant context switching
  • Become a delivery bottleneck
  • Experience motivation loss (autonomy, mastery, and purpose — all impeded)

A shared mental model within the team is a strong predictor of team performance: fewer mistakes, more coherent code, faster delivery. Keeping software boundaries team-sized builds this shared model naturally.

Domain Complexity Heuristics

Teams should assess the domains they own and classify them by complexity:

  • Simple: clear path of action; mostly mechanical/procedural responses
  • Complicated: changes require analysis and iteration; expertise matters
  • Complex: solutions require experimentation and discovery; high uncertainty

Practical limits (→ Team Topologies ch. 3):

Domain mix Viable?
2–3 simple domains Yes — context switching is bearable for procedural domains
1 complicated domain Yes
2 complicated domains (single team) No — team fragments into implicit sub-teams; split instead
1 complex domain Yes — but no other domains (disruption cost is too high)
Complex + simple domain No — the simple domain consumes disproportionate attention

If a domain is too large for a single team, split the domain into subdomains — assign each subdomain to one team. Do not split a single domain across multiple teams.

Assessing Cognitive Load

A simple, non-judgmental diagnostic: ask the team "Do you feel effective and able to respond in a timely fashion to the work you are asked to do?"

Cognitive load should not be measured by lines of code or number of classes — these don't capture domain complexity. What matters is the relative complexity of domains for which the team is responsible.

A team experiencing high extraneous load signals a platform or tooling problem. A team experiencing high intrinsic load may need the domain split or specialist enabling support (see Team Topologies Model).

Reducing Cognitive Load: Levers

To increase the cognitive capacity available for a team (without reducing domain responsibility):

  • Platform: a well-designed internal developer platform eliminates extraneous load for consuming teams
  • Management style: goals and outcomes, not "how" (McChrystal's "Eyes On, Hands Off")
  • Team API quality: good documentation, consistency, and developer experience from other teams reduces the extraneous load of consuming their services
  • Minimise interruptions: dedicated support channels, limits on meetings
  • Physical/virtual environment: designed for focused work, collaborative intra-team work, and occasional inter-team work — not open-plan noise that generates constant context switching

Relationship to Architecture Decisions

Cognitive load is the mechanism behind several architectural principles that might otherwise seem arbitrary:

  • Microservices require team alignment: a microservice decomposition that ignores team cognitive load produces services too small for meaningful ownership, increasing the number of teams and inter-team dependencies
  • Monolith splits: the right moment to split a monolith is when the cognitive load on the owning team exceeds capacity — not when some arbitrary code-size threshold is reached
  • Platform teams: their value is precisely in eliminating extraneous cognitive load from stream-aligned teams, freeing that capacity for germane (business-value) thinking
  • Domain per team: every software system component must be owned by exactly one team; shared ownership means no team has the cognitive space to maintain it properly

Cognitive Load at the Code Level (Ousterhout)

Ousterhout (→ A Philosophy Of Software Design ch. 2) uses cognitive load as a symptom of complexity at the code and module level — distinct from Sweller's theory and Team Topologies' team-level application, but grounded in the same psychological reality.

At the code level, cognitive load measures how much a developer must know to complete a task. It arises from: APIs with many methods, global variables, inconsistencies, and dependencies between modules. Modules with simple interfaces (deep modules) reduce cognitive load directly — the interface is all the developer needs to hold in their head.

Good documentation reduces cognitive load further: instead of reading the entire body of a method, a developer reads a short interface comment. Without adequate comments, developers must reconstruct the designer's intent from code — expensive and error-prone.

Alignment: Ousterhout's code-level cognitive load reduction is the micro-scale version of the same principle that drives Team Topologies' architecture sizing: keep cognitive load low enough that developers can work effectively. At the team level, this means appropriately-sized service ownership. At the code level, it means deep modules with simple interfaces and good documentation.

  • Team Topologies Model — the four team types and three interaction modes; platform teams reduce extraneous cognitive load; enabling teams help with intrinsic
  • Conways Law — cognitive load constraints shape team boundaries, which in turn shape architecture
  • Bounded Contexts — bounded contexts and team cognitive load are co-extensive; a bounded context should be no larger than one team can hold in its working memory
  • Microservices Architecture — cognitive load is the key test for whether to split a service or keep it together