Thinking in Systems
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:
- The mindset out of which the system arises
- The goals of the system
- The rules of the system (incentives, punishments, constraints)
- Information flows
- 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.