Pop-art field guide

A History of Bugs

A missing hyphen. A two-digit year. A single over-read byte. The most famous software failures ever shipped were rarely complicated — they were small mistakes given an enormous stage.

Every legendary bug started as one line that looked completely fine.

Screen-printed from the logbook

The usual suspects

Four archetypes every coder has met

Off by one

The fencepost error. You counted the posts and forgot the gaps. One iteration too many, one too few — and the array reaches into nothing.

i <= length

Null pointer

Tony Hoare called it his billion-dollar mistake. A reference that points at nothing — dereferenced anyway, somewhere far from where you wrote it.

Tony Hoare · 1965

Race condition

Two threads, one resource, no lock. Correct ten thousand times in a row — then catastrophic on the run nobody can reproduce.

Nondeterministic

Heisenbug

It vanishes the moment you look. Add a print statement and it's gone; attach a debugger and the program behaves perfectly. Then ship, and it's back.

Gone when observed

The Marilyn

The first bug · 1947 · after Warhol

Every icon gets the silkscreen treatment. This is the real logbook page — "First actual case of bug being found" — with the moth Grace Hopper's team taped in, screen-printed until it's a legend.

Original photograph: U.S. Naval History & Heritage Command (NH 96566-KN) · public domain.

The canon

Selected incidents · in chronological order
  1. 1947

    The Moth

    A moth jams a relay inside the Harvard Mark II. Operators tape it into the logbook: "First actual case of bug being found." The word was already slang — now it had a corpse.

    Hardware · the original bug
  2. 1962

    Mariner 1

    A single missing overbar in a handwritten guidance equation sends the Venus probe off course. Range safety destroys it 293 seconds after launch. Arthur C. Clarke called it "the most expensive hyphen in history."

    Transcription · $18.5M
  3. 1985

    Therac-25

    A race condition in a radiation-therapy machine delivers doses a hundred times too high. The screen reads MALFUNCTION 54. Six patients are harmed; several die. Software safety stops being theoretical.

    Race condition · fatal
  4. 1988

    The Morris Worm

    A grad-student experiment reproduces faster than intended and clogs roughly a tenth of the early internet. The first worm to make headlines — and the first felony conviction under the new computer-fraud law.

    Self-replication · ~6,000 hosts
  5. 1994

    Pentium FDIV

    Five missing entries in a lookup table make Intel's flagship chip divide certain numbers slightly wrong. A math professor notices. Intel recalls the silicon — a hardware bug, costed at roughly $475 million.

    Lookup table · $475M recall
  6. 1996

    Ariane 5 Flight 501

    A 64-bit velocity is crammed into a 16-bit integer; it overflows. Reused code from Ariane 4 never needed the larger range. The rocket self-destructs 37 seconds after liftoff, taking four satellites with it.

    Integer overflow · 37 seconds
  7. 1999

    Mars Climate Orbiter

    One team works in pound-seconds, the other in newton-seconds. Nobody converts. The orbiter dips too low into the Martian atmosphere and is never heard from again. $327 million, lost to units.

    Unit mismatch · $327M
  8. 2000

    Y2K

    Decades of saving two bytes by storing years as "99" meet the year 2000. The feared collapse mostly doesn't happen — because an army of programmers spent years on the most boring, most important fix in history.

    Date overflow · the quiet save
  9. 2012

    Knight Capital

    A deploy reuses an old flag and wakes dead code on one of eight servers. In 45 minutes the trading firm fires millions of unintended orders and loses about $440 million. It does not survive the week.

    Dead code · $440M in 45 min
  10. 2014

    Heartbleed

    A missing bounds check in OpenSSL lets anyone ask the server to read past the buffer and hand back whatever memory is next door — keys, passwords, anything. It had been live for two years before anyone noticed.

    Buffer over-read · CVE-2014-0160
  11. 2016

    left-pad

    A developer unpublishes an eleven-line package in a naming dispute. Half of JavaScript depends on it transitively. Builds break across the planet over a function that pads a string. Modern software, in one screenshot.

    Dependency · 11 lines
  12. 2021

    Log4Shell

    A logging library helpfully evaluates a string — so logging the wrong text runs attacker code. One line, buried in a dependency of a dependency, and every team patches through the same December weekend.

    Injection · CVE-2021-44228
  13. 2024

    CrowdStrike

    A faulty content update ships to millions of Windows machines and blue-screens them in unison. Airports, hospitals, banks and checkout lines freeze together. Production, it turns out, is the gallery wall.

    Bad update · ~8.5M machines
  14. 2025

    Next.js middleware bypass

    Send one forged header — x-middleware-subrequest — and Next.js believes its own auth middleware already ran. Login walls, route guards, redirects: skipped. The framework behind a huge slice of the modern web had shipped a skeleton key to its own front door.

    Auth bypass · CVE-2025-29927
  15. 2026

    The Vercel breach

    Nobody broke the framework — they walked in through an OAuth grant. A compromised third-party AI tool handed a ShinyHunters-linked crew the keys to Vercel's internal systems: source code, API keys, 580 employee records, posted for $2 million. The supply chain became the front door.

    OAuth supply chain · April 2026
  16. 2026

    The Lovable breach

    A quiet February backend change re-opened public-project chats. For 48 days, any free account could read other builders' source code, database credentials, and AI conversations. The biggest vibe-coding leak yet — patched for new projects while the old ones stayed wide open.

    BOLA · 48 days · 2026
  17. Works on my machine

    The eternal bug. It runs perfectly on the laptop where it was born and nowhere else. No repro, no trace, no end. Every generation rediscovers it, and every generation thinks it's the first.

    Environment drift · forever

Greatest hits

The classics · screen-printed and shelved

Some bugs are events. Others are species — the same shape, recurring forever, in every language ever written.

Null
Pointer
Exception
Est. 1965
Off by one
Fencepost
blend
Classic
Race
Condition
no lock
Intermittent
Overflow
Integer
wraps to zero
Ariane blend
Deadlock
Everyone waits
nobody moves
Frozen
Heisenbug
Gone the moment
you observe it
Limited run
Memory leak
Allocated
never freed
Slow drip
Infinite loop
while(true)
no exit
Forever

The bugs outlive the code

Languages die. Frameworks rot. Whole companies disappear. But a good bug story gets told forever — at standups, in postmortems, on a logbook page taped shut in 1947. To err is human; to reproduce, divine.