Boeiende Verhalen uit de Informatica

De prompt die ik gebruikte was, globaal gezien: "Tony Hoare heeft een opmerking over 'null' als zijn miljardendollar-fout. Wat zijn enkele andere intrigerende verhalen over programmeren en softwareontwerp, zowel positief als negatief?" (Hoewel het begin van de lijst gedomineerd wordt door verhalen over computerstoringen, en het lijkt af te dwalen naar concepten in plaats van verhalen.)

Raymond Chen is een gerespecteerde Microsoft-engineer en zijn blog The Old New Thing (en het gelijknamige boek) bevat een enorme hoeveelheid geweldige verhalen. Ook de blog Joel on Software van Joel Spolsky is een klassieke bron voor verhalen en richtlijnen.

Een overzicht van intrigerende verhalen en concepten

  • Tony Hoare’s “miljardendollar-fout” — het uitvinden van de null-referentie.
  • Ariane 5 Vlucht 501 — een hergebruikte integer-conversie overflow vernietigde de raket.
  • Mars Climate Orbiter — een mismatch tussen metrieke en imperiale eenheden leidde tot het verlies van een ruimtevaartuig.
  • Therac-25 — race-condities en een slecht veiligheidsontwerp veroorzaakten dodelijke overdoses straling.
  • Knight Capital — een mislukte implementatie veroorzaakte een verlies van ongeveer 440 miljoen dollar in 45 minuten.
  • Patriot-raket falen — een cumulatieve floating-point timingfout droeg bij aan 28 doden. (Het bijbehorende artikel linkt ook naar het Wikipedia-artikel over dodelijke autonome wapens).
  • Pentium FDIV-bug — een kleine fout in een opzoektabel zorgde voor onjuiste divisieresultaten, wat leidde tot de eerste volledige terugroepactie van een computerchip, met kosten van 475 miljoen dollar.
  • Heartbleed — het ontbreken van grenscontrole (bounds checking) stelde willekeurig servergeheugen bloot.
  • Morris-worm — een experiment met zelf-replicerende software legde per ongeluk grote delen van het vroege internet plat.
  • De AT&T-storing van 1990 — één defect herstelpad veroorzaakte cascade-uitval van telefooncentrales. (Het volledige artikel over softwarebugs is interessant).
  • Cloudflare’s regex-storing van 2019 — catastrofale backtracking verbruikte CPU's in het gehele netwerk.
  • GitLab’s database-incident van 2017 — een beheerder verwijderde per ongeluk productiedata tijdens het herstelproces.
  • Unix pipes — het idee van combineerbaarheid (composability) van Doug McIlroy werd een van de meest duurzame ontwerppatronen in de informatica, ook wel bekend als de "Unix-filosofie".
  • Unix “everything is a file” — een vereenvoudigende abstractie waardoor niet-gerelateerde tools met elkaar konden samenwerken.
  • C’s gets() — een API die inherent zo onveilig was dat deze uiteindelijk uit de taalstandaard is verwijderd.
  • Java’s checked exceptions — een bewuste veiligheidsfunctie die uitgroeide tot een van de langstlopende ontwerpcontroverses van de taal.
  • De creatie van JavaScript in 10 dagen — de gehaaste implementatie door Brendan Eich (een complete eikel en crypto-promotor) liet eigenaardigheden achter die het web decennialang hebben gevormd.
  • De “quirks mode” van browsers — het bewust behouden van oude bugs werd noodzakelijk voor de compatibiliteit van het web.
  • Goto Considered Harmful — de korte brief van Dijkstra hielp de revolutie van gestructureerd programmeren te ontketenen.
  • De rewrite van Netscape — het weggooien van de oude browsercode werd een canonieke waarschuwing tegen volledige herschrijvingen (full rewrites).
  • De testcultuur van SQLite — een ongebruikelijk uitputtend testsysteem werd centraal in de reputatie van betrouwbaarheid van de software.
  • Erlang’s “let it crash” — systemen ontwerpen rondom falen, in plaats van te proberen elk mogelijk falen te voorkomen.
  • Smalltalk’s “message passing” — objectgeoriënteerd programmeren ontstond uit een veel rijker idee dan enkel klassen en overerving.
  • De Lisp garbage collector — automatisch geheugenbeheer was ooit radicaal, maar werd decennia later mainstream.
  • Het Algol 60-rapport — een ongebruikelijk precieze taalbeschrijving beïnvloedde generaties van programmeertaalontwerpen.
  • Het C++ “zero-overhead-principe” — abstracties mogen niets kosten bovenop wat handgeschreven code op een lager niveau zou kosten.
  • Rust’s borrow checker — het verplaatsen van regels voor geheugenveiligheid naar het typesysteem daagde aannames over systeemprogrammering uit.
  • De Space Shuttle software — beroemd conservatieve engineering behaalde uitzonderlijk lage defectpercentages. "The Legacy of Space Shuttle Flight Software" is een document van 83 pagina's.
  • De rechtszaken over onbedoelde acceleratie bij Toyota — legde bloot hoe verstrengelde embedded code een veiligheidsprobleem kan worden.
  • Het Y2K-probleem (millenniumbug) — shortcuts met tweecijferige jaartallen creëerden decennia later een enorme en dure onderhoudsoperatie. (Mensen die nu 30 zijn, herinneren zich Y2K niet; ik ben echt oud).
  • Het 2038-probleem — de 32-bit tijdrepresentatie van Unix herhaalt de les met een ander getal.
  • Schrikseconde-bugs (leap-second bugs) — schijnbaar onschadelijke aannames over tijd hebben herhaaldelijk grote systemen doen crashen.
  • Debian’s OpenSSL-bug — het verwijderen van “niet-geïnitialiseerde” code die fout leek, verzwakte de generatie van willekeurige getallen drastisch.
  • Apple’s goto fail bug — een gedupliceerde regel omzeilde de TLS-certificaatverificatie.
  • Left-pad — het verwijderen van een npm-pakket van 11 regels brak tijdelijk grote delen van het JavaScript-ecosysteem.
  • Log4Shell — een handige logging-functie veranderde in een catastrofale kwetsbaarheid voor remote-code-execution.
  • De DAO-hack — softwaregedrag oversteeg de menselijke intentie en dwong Ethereum tot een controversiële fork.
  • Excel’s schrikkeljaarbug van 1900 — bewust behouden voor compatibiliteit met Lotus 1-2-3.
  • Excel gen-naam corruptie — automatische datumconversie veranderde jarenlang onopgemerkt wetenschappelijke datasets.
  • Wet van Hyrum — met genoeg gebruikers wordt elk observeerbaar gedrag een afhankelijkheid voor iemand. Er is overigens een XKCD-strip over dit concept.
  • Wet van Postel — “wees liberaal in wat je accepteert” hielp bij de interoperabiliteit, maar werd later om veiligheidsredenen controversieel. (Ik ben het overigens absoluut oneens met dit sentiment).
  • De tiende regel van Greenspun — complexe programma's vinden vaak per ongeluk de helft van Common Lisp opnieuw uit.
  • Wet van Conway — softwarearchitecturen neigen ernaar de communicatiestructuren van hun organisaties te spiegelen.
  • Wet van Gall — complexe werkende systemen evolueren meestal uit eenvoudige werkende systemen, niet uit grootschalige ontwerpen.
  • Worse is Better — het argument van Richard Gabriel dat eenvoud van implementatie kan winnen van theoretische perfectie. Het Wikipedia-artikel linkt ook naar The UNIX-HATERS Handbook.
  • Het Second-System-effect — succesvolle engineers ontwerpen hun volgende project vaak te complex.
  • The Mythical Man-Month — het toevoegen van mensen aan een softwareproject dat reeds vertraging heeft, kan de vertraging vergroten.
  • NASA’s “Power of Ten”-regels — extreme codebeperkingen voorgesteld voor veiligheidskritische software.
  • De broncode van Doom — compacte, pragmatische engineering werd een klassieke studie in game-systeemarchitectuur. (Dit doet me denken aan de "DOOMed to Fail: A Horror Story" aflevering van de CoRecursive-podcast met gast Rebecca Heineman (RIP)).
  • Quake’s fast inverse square root — een legendarische optimalisatie op bit-niveau met een mysterieuze magische constante.
  • De creatie van Git — Linus Torvalds bouwde de eerste versie snel nadat hij de toegang tot BitKeeper verloor.
  • Git’s content-addressed ontwerp — het behandelen van objecten via hashes maakte gedistribueerde versiebeheer ongebruikelijk robuust.
  • Plan 9 — veel elegante Unix-ideeën werden opnieuw en zuiver bedacht, maar de commerciële adoptie bleef minimaal.
  • TCP congestie-instorting — het internet was bijna ingestort voordat de congestie-controle-algoritmen van Van Jacobson werden geïntroduceerd.
  • DNS — het vervangen van een centraal beheerd hosts-bestand door een gedistribueerd hiërarchisch systeem maakte naamgeving op internet-schaal mogelijk.
  • Amazon’s Dynamo (en het bijbehorende paper) — het accepteren van uiteindelijke consistentie (eventual consistency) hielp bij het populariseren van modern gedistribueerd database-ontwerp.
  • Google’s MapReduce (en het bijbehorende paper) — een eenvoudig programmeermodel maakte enorme gedistribueerde berekeningen beheersbaar.
  • Leslie Lamport’s Paxos-paper — een fundamenteel consensus-algoritme dat beroemd was om hoe moeilijk het voor lezers was om te begrijpen.
  • Raft (originele paper) — expliciet ontworpen om consensus begrijpelijk te maken zonder dit wezenlijk te verzwakken.
  • Het probleem van de Byzantijnse generaals — een gedachte-experiment dat fundamenteel werd voor fouttolerante gedistribueerde systemen.
  • CAP-theorema — formaliseerde een onvermijdelijke afweging die veel database-ontwerpen voorheen informeel hadden behandeld.