On Second Thought Episode 10. The pager goes off, memory on the auth service is climbing, the on-call engineer SSHs in, observes nothing in particular, runs kubectl delete pod, the pod comes back, memory is fresh, the alert clears and nobody asks what was wrong. The runbook for half the world's incidents has three steps and only the last one matters: have you tried turning it off and on again. The reflex has two parents, and we kept only one. The first is the consumer-electronics tradition (a device with no language to be asked has only its power switch); it was honest about its limits and reasonable for the hardware of its time. The second was built deliberately to replace it. In 1986 at Ericsson's Computer Science Laboratory in Stockholm, Joe Armstrong, Robert Virding and Mike Williams began work on Erlang, a language for telephone exchanges that could not go down; the showcase AXD301 ATM switch runs on roughly two million lines of Erlang and is the system most often cited for nine-nines reliability (the figure is contested, the architecture is not). Armstrong's principle, on the surface, looked exactly like the consumer tradition: terminate the bad process; he called it let it crash, and the phrase has done more damage to the idea than any critic could. Read as a slogan it sounds like the Sky+ box; read as architecture it is the opposite. Three properties make it architecture: processes are isolated (an Erlang process has its own heap and message queue, shares nothing mutable with any other, and a crash takes itself with it and nothing else); every worker has a supervisor (a specific process defined in OTP, the standard Erlang library, to which crashes are delivered as messages); the supervisor decides according to a written strategy with names (one-for-one restarts only the crashed worker, one-for-all restarts all siblings, rest-for-one restarts the crashed worker and any later in the dependency order) and an escalation limit (when the maximum restart frequency is exceeded the supervisor itself crashes and the failure escalates one level up the tree). A failure is data, handled by a rule written years before the outage. Let it crash, in its proper form, is not have you tried turning it off and on again; it is we have already decided what to do when this fails and we wrote it down. What we kept of let-it-crash is the let-it-crash. What we left in Stockholm is the supervisor. So the restart is the diagnosis: pod returns, alert clears, day shipped; a memory leak, file-descriptor exhaustion, lock contention, a downstream throttled queue each leave the same heartbeat-recovery signature on a dashboard and need a different fix, and the restart erases the question that distinguishes them. The structural cost: Kubernetes liveness and readiness probes are, honestly read, a contract that the orchestrator rotates the symptoms while the cause goes unexamined; there is no concept in the standard flow of capturing the dying process's state, preserving the crash for inspection, asking why before the next pod is scheduled. Self-healing is accurate in the sense that a person who takes paracetamol every four hours has a self-healing headache. The institutional cost: a team that restarts to fix gets good at restarting and never gets good at diagnosing; the post-incident review adds a command to the runbook, the collective intuition shifts from what is this system actually doing to what sequence of recovery steps clears the current alert. There is software in operation that does not work this way. WhatsApp serves over a billion users with around fifty engineers, on Erlang, on the Stockholm supervisor architecture; the engineers spend the day writing the rules under which the boxes manage themselves. In the unixoid tradition the FreeBSD base provides the operator's half of the same picture: init and rc.d use explicit start, explicit dependency, explicit recovery; when a service misbehaves the operator has dtrace to follow what the kernel and user-space code are actually doing, ktrace to record system calls, procstat and fstat to read what a process is holding, post-mortem core dumps that survive the crash, and a kernel willing to say what process held what lock at what time. The reboot is available, on FreeBSD as everywhere else; it is rarely the first reach, because the system is willing to speak and the operator has been trained to listen. The honest question is not whether to keep the restart; the runbooks have it for a reason. The question is the one we did not write down: in a system that fails, was the restart the answer, or the moment the question got dropped? A restart, on second thought, is not a tool. It is a measurement. It tells you, with some precision, how much of the cause you decided you could afford to leave unknown.
In the Net Episode 05. The fifth distinct lock-in genus in the series: lock-in by definition, not by format, with licence-compliance audit as the sales channel. Java arrived in 1995 with a kept promise, write once run anywhere, and was for most of its history simply there and free; Sun open-sourced it as OpenJDK in 2006-2007, Oracle acquired Sun in 2010. The licensing sequence: Java 11 (2019) moved Oracle's branded JDK to a paid subscription for commercial production use; Java 17 (2021) softened this with the free No-Fee Terms and Conditions licence; on 23 January 2023 Oracle introduced the Java SE Universal Subscription and retired the per-user (Named User Plus) and per-processor metrics for new subscriptions. The new metric is per employee, and employee counts the entire organisation (full-time, part-time, temporary staff plus contractors, consultants and agents), not the people who use Java. One server running Oracle's Java makes the whole headcount billable; list pricing starts around 15 US dollars per employee per month, stepping down by volume. A firm of 12,000 staff at the entry band pays a little over 2 million euros a year whether twelve or twelve hundred use Java. Oracle holds the brand, the official commercial builds and the TCK compatibility suite. Enforcement is by audit: a Dimensional Research survey commissioned by Azul, a commercial OpenJDK vendor and Oracle competitor, reported 73 per cent of Oracle Java users audited in the previous three years and 81 per cent moving or planning to move to open-source Java; Gartner estimated the per-employee model at two to five times the previous cost. The exit is genuinely open: OpenJDK is the reference implementation Oracle's JDK is built from, and from Java 11 the switch is a reinstall, not a rewrite. The catch is the past: an audit reads download history, and a single legacy Oracle JDK becomes a retroactive claim scoped to the workforce, not the machine. Escape route: free OpenJDK distributions (Eclipse Temurin from Adoptium, Amazon Corretto, Azul Zulu, Microsoft Build of OpenJDK, BellSoft Liberica, Red Hat, IBM Semeru), all TCK-tested, all under GPLv2 with the Classpath Exception; inventory every host for legacy Oracle JDK first; and for the same per-core, whole-cluster audit pattern in Oracle Database, PostgreSQL and MariaDB are a complete answer for many workloads. Write once, run anywhere. Licence once, pay for everyone.
The Fediverse is not a product. It's time to get real about marketing
If projects are going to convince people to try alternatives to Big Tech, they need to do a much better job of explaining why they're better for people who don't care about technical details like protocols and decentralization.
John Battelle's Search Blog Google Encloses The Web
Last month Google announced the most significant change to its search product since its launch in 1998. Its iconic search box, which I’ve long compared to a command line for the Internet, has…
About a week ago I got a ping. Someone wanted to know if I knew someone who wanted $10 million of Anthropic common stock as a forward contract at $1 trillion. My first reaction was that we are so d…
A senior engineer’s job is mostly the parts that don’t show up in the diff. Specs. Tests. Reviews. Scope discipline. Refusing to ship what can’t be verified. AI coding agents skip those parts by default. Agent Skills is my attempt to make them not optional.
Tech In Plain Sight: The Mechanics Of String Trimmers
My old friend Jeff was always vocally upset that he didn’t come up with the idea of a string trimmer, commonly known as a Weed Eater or Weed Whacker. On the one hand, the idea is totally simp…
With so many online messaging services to choose from it’s almost as though the daddy of them all, email, has faded into the background as something you only use for more formal contacts. But…
A History of Apple Cables, Interfaces & Connection Types
When it comes to connectors, cables, and interfaces, Apple has always been different. See which are the most common Apple connectors and how to use them.
Get on the Bus: Data Busses Used in Macs, 1984 to 2000 - Low End Mac
A lot has changed since the first Macintosh. Apple no longer uses a phone connector for its keyboard or DE-9 serial ports for its mouse, printer, and modem. As others have recently pointed out, the only connector still in use from 1984 through today is the analog headphone jack. Macs have always had some form […]
Mobile won the platform war on distribution, not capability
Mobile didn't beat the web on capability. It beat the web on the channel. A platform-war retrospective on distribution, store lock-in, and update friction.
John Battelle's Search Blog Is AI Inherently Anti-Social?
All aboard ha ha ha ha ha ha ha AI, AI, AI, AI, AI, AI, AI! – Crazy Train, Ozzy Osborne (with slight modifications) *** If you can remember the early web, when the tech was novel and b…