Back to notes

Thinking in Systems

architecturesystems

A system is more than the sum of its parts. It's the interactions between those parts that produce behaviour.

Feedback Loops#

  • Reinforcing loops amplify change (compounding interest, viral growth, framework adoption)
  • Balancing loops resist change and maintain equilibrium (type systems, lint rules, code reviews)

In frontend architecture, most of our work is creating balancing loops: constraints that keep the system stable as it grows.

Leverage Points#

Donella Meadows identified places to intervene in a system, ordered by effectiveness:

  1. The mindset out of which the system arises
  2. The goals of the system
  3. The rules of the system (incentives, punishments, constraints)
  4. Information flows
  5. Feedback loops

The least effective? Parameters (constants, tax rates, bundle size budgets). The most effective? Changing the paradigm.

In Practice#

When I see a team struggling with a growing codebase, the temptation is to tweak parameters: "stricter lint rules", "bundle size budgets", "code review checklists". But the real leverage is often in the goals and mindset: what does the team optimise for? Speed? Correctness? Learning?

Design the feedback loops, not just the parameters.