Dave Farley: Determinism, Not Architecture, Is Why Most Software Systems Fail
Dave Farley, a prominent voice in modern software engineering, contends that the prevalent reason for software system failure is not the choice between microservices or monoliths, nor the adoption of Agile methodologies, but rather a fundamental lack of predictability. He posits that an inability to reliably determine the impact of changes renders a system unevolvable, effectively marking it as legacy from its inception. Farley champions determinism as the critical bridge transforming “it works on my machine” into “it works every time everywhere,” making it a prerequisite for trust in continuous delivery and evolutionary architecture. Without determinism, tests provide false positives, pipelines become mere “release theater,” and the underlying architecture quietly degrades. Conversely, deterministic systems facilitate thousands of experiments daily, enable the detection of unintended consequences, and allow for rapid evolution without undue risk.
Farley provides concrete strategies for fostering determinism, beginning with explicit time management through dependency injection rather than direct calls to datetime.now(), which allows for controlled state and reproducible bug hunting. For concurrency, a notorious source of non-determinism, he advocates for patterns like actor models, single-threaded event loops, and immutable state to prevent probabilistic race conditions. A cornerstone concept is the “deterministic core,” which separates pure, side-effect-free logic from an “imperative shell” handling external interactions like databases, networks, and clocks. This isolation vastly simplifies testing, eliminating the need for complex mocks and scaffolding, allowing for rapid execution of fitness functions. Beyond code, determinism extends to system properties such as hermetic builds, pinned dependencies, and idempotent deployments, ensuring that infrastructure also remains predictable. Farley concludes that while most organizations optimize for features, the most effective prioritize “speed of learning,” a capability inherently enabled by deterministic systems that shorten feedback loops and empower aggressive experimentation.