Gall’s Laws
Systemantics for Software Engineers

Systems rarely do what you expect.
Good ones evolve.

John Gall’s Systemantics explained why large, clever systems fail — and why simple, resilient ones survive. This page distills his rules and applies them directly to software engineering.

Start simple
Design for failure
Respect reality
“A complex system that works is invariably found to have evolved from a simple system that worked.”
— John Gall, Systemantics

Core Laws of Systemantics

How systems actually behave — not how designers wish they would.

Gall’s central insight: systems are not extensions of your intentions. Once created, they acquire their own momentum, incentives, and failure modes.

Law 01 Complexity

Complex systems don’t work (at first).

A complex system designed from scratch never works. A working complex system evolves from a simple system that worked. Big-bang designs fail; small systems that grow survive.

Law 02 Emergence

Systems have their own goals.

A system is never what you think it is. Once running, it starts serving itself: preserving its own processes, metrics, and bureaucracy — often at odds with your original goal.

Law 03 Kicks Back

The system always kicks back.

Push a system and it pushes back — usually in ways you didn’t predict. Unexpected behavior is not an exception; it is the default.

Law 04 Scale

The bigger the system, the less control.

Large systems resist change and often oppose their own stated functions. Scale amplifies inertia, delays, and disconnect from reality.

Law 05 Coupling

You can’t change just one thing.

In a system, everything is connected. A “local” tweak can trigger global side effects, surprising outages, or bizarre feedback loops.

Law 06 Slack

Efficiency creates fragility.

Systems that operate at maximum efficiency eliminate redundancy and slack — the very things that absorb shocks. Hyper-efficient systems are dangerously brittle.

Law 07 Failure

Systems fail when most needed.

Systems tend to fail at peak stress, not during routine operation. And they fail in new and interesting ways, not just along known failure paths.

Law 08 Info

Information is distorted by the system.

The information you have is rarely the information you need. Reporting, dashboards, and status flows are all filtered by incentives, tools, and politics.

Law 09 Growth

Systems grow and encroach.

Left alone, systems accumulate rules, steps, and roles. They rarely shrink. Once started, they are hard to stop or dismantle cleanly.

Gall’s Laws for Software Engineering

From systems theory → concrete engineering practices.

Treat your codebase, infrastructure, and organization as one interconnected system. The practices below translate Gall’s laws into everyday engineering decisions.

Practice 01 Start small

Ship a simple system that works.

Complex systems must evolve from a tiny working core.

  • Build vertical slices/MVPs instead of big-bang releases.
  • Resist premature architecture; let abstractions emerge from use.
  • Iterate in production with tight feedback loops.
Practice 02 Slack & capacity

Avoid over-optimization.

Efficiency kills resilience if you remove all buffers.

  • Keep headroom in CPU, memory, and database capacity.
  • Add circuit breakers, rate limits, and backpressure.
  • Protect time for refactoring and reliability work.
Practice 03 Coupling

Prefer loose coupling.

Tight dependencies turn small bugs into large incidents.

  • Avoid shared databases across many services.
  • Use clear boundaries and contracts between components.
  • Favor async messaging when possible to decouple timing.
Practice 04 Failure modes

Design for the weird case.

Systems fail under stress — in ways you didn’t imagine.

  • Run chaos experiments and game days.
  • Include fallback modes and degraded behavior paths.
  • Plan for dependency timeouts, flakiness, and slow partial failures.
Practice 05 Observability

Instrument reality, not theory.

Your model of the system is always missing something.

  • Make logs, metrics, and traces part of the design, not an afterthought.
  • Surface user-facing symptoms: latency, errors, saturation.
  • Optimize for debuggability — fast answers during incidents.
Practice 06 Evolution

Refactor, don’t constantly rewrite.

Large rewrites create new complex systems that don’t work yet.

  • Use strangler patterns to replace components gradually.
  • Introduce new systems behind feature flags and dark launches.
  • Keep change small and reversible whenever possible.
Practice 07 Org & process

Watch for bureaucracy creep.

Systems grow and encroach — including your processes.

  • Periodically delete or simplify rules and checklists.
  • Prefer lightweight approvals and small, frequent deploys.
  • Align ownership: teams own services end-to-end.
Practice 08 Mindset

Respect the system more than the plan.

Reality wins against architecture diagrams every time.

  • Use plans as hypotheses, not commandments.
  • Let production data and user behavior guide evolution.
  • Stay humble: assume you’re missing important interactions.
The essence: Build simple, allow slack, expect surprises, observe reality.
“Design for resilience, not elegance.”