Complexity Has Three Sources
Software complexity does not arrive all at once. It accumulates through three distinct mechanisms: entropy over time, competitive pressure to leak abstractions, and the unbounded creativity of the humans building it.
"A well-designed system will degrade into a badly designed system over time." Mahesh Balakrishnan
The First Law of Software Complexity is thermodynamic: a well-designed system is an unstable, ephemeral state; a badly designed system is a stable, persistent state. If system X is well-designed (easy to change), someone will change it quickly and easily into X'. X' may or may not remain well-designed. Eventually, one of those changes will introduce a coupling or a leaky abstraction that makes the next change harder. The second derivative of code is always negative the rate at which code can change goes down over time. Most engineers will work on badly designed systems simply because most systems become badly designed systems.
The Second Law is competitive: complexity becomes a moat. When systems compete for market share, designers give applications everything they want, creating APIs that are nearly impossible to implement any other way. ZooKeeper's stronger-than-linearizable consistency with TCP-based ephemeral nodes, Kafka's idempotent produce semantics these are powerful but tightly coupled to specific implementation strategies. Success breeds complexity because the most popular systems are often the most entangled ones.
The Third Law is human: there is no fundamental upper limit on software complexity. The shape of a system reflects the abilities, philosophies, and organizational incentives of every developer who ever touched it. Why does this database use its own gossip layer instead of relying on Kubernetes? Maybe because a developer's PhD was on gossip protocols. Maybe because the promo docs were already written. Maybe because splitting it was politically easier than rewriting it. Each layer of historical decision-making deposits another stratum of complexity that future maintainers must excavate.
Takeaway: Complexity is the default state of software preserving simplicity requires active, continuous investment against all three sources of entropy.
See also: Cognitive Load Is the Real Bottleneck in System Design | Choose Boring Technology | Ergodicity Changes Everything