← LibraryBlog · AI

The Coming Software Apocalypse

James Somers
✓ Source-grounded

As software becomes the invisible infrastructure of our world, we must move away from manual 'handicraft' coding toward model-based designs to manage systems that have exceeded human cognitive capacity.

Read the original

In one sentence

Software failures are not glitches in the code; they are "failures of understanding, and of imagination" caused by attempting to build systems that exceed our ability to intellectually manage.

Why read this (and who it's for)

This book addresses the terrifying reality of modern infrastructure: 911 systems, transportation, and finance have migrated from mechanical, human-controlled systems to complex, internet-reliant code. It is for software engineers, system architects, and safety-critical designers who want to understand why "gluing" together snippets of code is no longer sufficient for high-stakes reliability. After reading this, you will be able to distinguish between tactical coding errors and systemic requirement failures, and advocate for model-based design over manual "handicraft."

The big idea

We have entered an era where software is "eating the world," but our methods for creating that software remain rooted in "handicraft." Unlike mechanical parts (like a faulty rivet), software doesn't "break" in a physical sense; it performs exactly what it was instructed to do. Therefore, when a system fails, it isn't because the code broke—it’s because our understanding of the requirements and the resulting complexity was flawed.

The core problem is the Complexity Gap. Because software is unmoored from physical reality, a program can be thousands of times more complex than another while occupying the same physical space. This complexity is "invisible to the eye," making it impossible for humans to manage via manual inspection. Current programming requires us to think like computers—stepping through text instructions one by one—which creates a disconnect between the creator and the actual problem being solved.

To solve this, we must shift from writing code as the primary medium of thought to using models that provide "liveness." We need tools that allow us to grasp high-level structures ("the forest") without getting lost in the micro-mechanics of syntax ("the trees").

Key ideas

Software doesn't break; it performs

Software executes instructions perfectly. A failure occurs only when the instructions themselves are wrong or when the programmer fails to imagine a specific, rare combination of events. Why it matters If you treat software bugs as "accidents," you miss the systemic requirement errors that cause catastrophes. You must shift your focus from "fixing bugs" to "verifying logic." In the book The author contrasts the Electromechanical Reliability Model (where you plan for parts breaking) with software, where the problem is executing the "wrong thing" perfectly.

The Complexity Gap

Software complexity exceeds human intellectual management capacity because it is invisible and unmoored from physical reality. Why it matters You cannot "sanity check" a system with 100 million lines of code in your head. Human intuition is fundamentally poor at estimating probabilities of rare combinations in systems operating at millions of requests per second. In the book The author cites cars now having ">10 million lines of code," making them impossible to test exhaustively via manual coding.

Code as a Cognitive Constraint

Writing code forces the human brain into "micro-mechanics." It draws attention away from high-level structure because you are forced to think in terms of a programming language. Why it matters If your primary tool for understanding a system is the same tool used to create it (code), your ability to see the "forest" is constrained by the "trees." In the book Chris Granger’s study found that ~98% of the 55-million-line Visual Studio IDE was "completely irrelevant" to the fundamental problems programmers faced.

Handicraft vs. Industrial Scale

Manual coding is "handicraft." Systems with 30 million lines (Airbus) or 100 million lines (Tesla) are too large for manual management. Why it matters We must move toward industrialized methods where the computer generates code from a verified model, rather than humans manually typing instructions. In the book The author notes that in one two-year project, only 2–3 months were spent writing code; the rest was documentation—a sign of the burden of manual management.

Liveness in Programming

"Liveness" is the immediate feedback between a model/code and its running behavior. It allows for intuition without explicit explanation. Why it matters Without liveness, programmers are "playing computer inside their head," which leads to errors in imagination. In the book Bret Victor’s Mario demo shows how mapping time to space (via sliders) provides immediate feedback on a character's future path.

Frameworks & tools

Model-Based Design (MBD)

A methodology to ensure software is "correct by construction" by closing the gap between requirements and implementation.

  1. Create a model: Draw a flowchart or formal model describing the rules the program must follow (the "model").
  2. Automate generation: Use a computer to automatically generate code based on those rules.
  3. Verify: Changes can be verified mathematically because the code is a direct byproduct of the model.

TLA+ (Temporal Logic of Actions)

A tool for exhaustive algorithm testing, reframed for engineers as "Debugging Designs."

  1. Write Specifications: Write a concise outline of program logic plus constraints (e.g., "never withdraw the same money twice").
  2. Exhaustive Check: Use a computer to check if the logic satisfies those constraints across all possible states.
  3. Identify Subtle Bugs: Use this to find bugs in core algorithms before any code is written.

Memorable examples & stories

The Washington State 911 Outage (2014) A counter on an Intrado server hit a threshold (millions) set by programmers. Because that counter was used as a unique identifier, new calls were rejected; no alarms were triggered. It affected 11 million Americans and required changing a single number. Lesson: Software failures are often caused by simple counters hitting thresholds we didn't imagine.

The Therac-25 A radiation-therapy machine that killed six patients due to a software error. Lesson: Software errors in safety-critical systems can have lethal physical consequences.

Toyota Unintended Acceleration Expert Michael Barr identified "spaghetti code"—a tangled, accreted mess impossible to test exhaustively. Data showed >10 million ways for key tasks to fail; a single bit flip could cause loss of control. Lesson: Complexity creates "invisible" failure modes that manual testing cannot find.

The Jeep Cherokee Hack (2015) Researchers demonstrated a 2014 Jeep Cherokee could be remotely controlled via its cellular-connected entertainment system, which was linked to steering, acceleration, and brakes. Lesson: Connectivity expands the surface area for software "apocalypses" to reach physical actuators.

Key quotes

"Software is 'eating the world.'" Why it matters: Establishes the scale of the problem—software is no longer a niche tool; it is our infrastructure.

"The complexity... is invisible to the eye." Why it matters: Explains why we can't simply "look" at a system to see what's wrong.

"Software failures are failures of understanding, and of imagination." Why it matters: Shifts the responsibility from "buggy code" to "incomplete mental models."

"Basically people are playing computer inside their head." (paraphrased) Why it matters: Highlights the cognitive drain of manual coding.

"Creators need an immediate connection to what they’re creating." Why it matters: The core argument for 'liveness' and model-based design.

How to apply it

This week

  1. Audit a "Glue Job": Identify one piece of code you "glued" together from Stack Overflow/Google. Ask: "Do I actually understand the systemic requirements here, or am I just solving a tactical concern?"
  2. Identify a Requirement Gap: Take a high-level requirement (e.g., "The system must never allow X"). Try to describe it in prose. If you can't describe it clearly in prose, you cannot write code for it reliably.

Ongoing

  1. Prioritize Models over Code: For any safety-critical or complex logic, start with a flowchart or TLA+ specification before writing a single line of production code.
  2. Seek "Liveness": When learning new systems, prioritize environments (like Apple Playgrounds) that provide immediate visual feedback on behavior changes.

Common pitfalls

Connects to

If you remember only three things

Internalize it

Fidelity note

I have high confidence in this summary as it is based strictly on the provided notes. The summary captures the core tension between manual coding (handicraft) and the need for industrialized models (MBD/TLA+). One nuance to verify: the specific technical nuances of TLA+ vs other formal methods are not deeply explored in the notes, but the strategy for adopting them is clear.

Keep going — related reads