Formal Methods in the Age of AI: Hillel Wayne on Engineering, TLA+, and What Machines Still Can't Specify

Open on YouTube ↗
Overview

A popular theory holds that AI will finally push formal verification into the mainstream: if machines write most of the code, humans will need mathematical proof that it is correct. In this episode of the Pragmatic Engineer podcast, the host puts that idea to Hillel Wayne, a formal methods consultant who has taught TLA+ across the industry and wrote the book Logic for Programmers. The conversation covers Wayne's research on whether software engineers are "real" engineers, what formal methods are and why they aren't used everywhere, live demos of TLA+, Alloy, and property-based testing, and how AI is changing specification work. Wayne's position is that AI is making formal methods more popular, but it remains poor at the hardest part of the work. That part is deciding what a system is supposed to do.

36 min read

From Physics to Formal Methods

Wayne did not originally see themself as a technical person. Their father was a programmer and taught them some Visual Basic, but the dream was physics and math. After about three years of studying physics in college, Wayne realized they liked the idea of physics more than doing it, and could not picture doing it for 50 years. The part they did enjoy was programming in the labs. So after college Wayne moved to San Francisco and became a Ruby on Rails developer in education technology. They later moved to Chicago, and during another edtech job fell into the niche they still work in: formal verification and formal methods.

The Crossover Project: Are Software Engineers Engineers?

The host first came across Wayne's writing through the Crossover Project, which asked whether software engineers are actually engineers. Wayne explains the motivation. Software developers love to argue about this, and they split into two camps. One says we don't deserve the title because traditional engineers are far above us. The other says software is so special and creative that engineering has nothing on it. Books like Software Craftsmanship take the second view and paint engineering as a boring, slow field.

Wayne started firmly in the first camp. Their own work involves careful analysis of software systems, and they considered that the only real engineering in software. Then they saw a talk by Glenn Vanderburg, who had read engineering books and concluded that engineering looked a lot like software development. Wayne found this unconvincing and wanted something more rigorous, so they decided to interview people who had worked in both a traditional engineering field and software. Those people agreed with Vanderburg. "So, I was wrong. We're engineers," Wayne says.

The project grew larger than expected. Wayne wanted as comprehensive a view as possible, because engineering is not just bridges. It includes circuit design, chemical processes, and industrial engineering, which covers factory layouts and how labor is organized. Software might not be like building a bridge, Wayne reasoned, but it might be much closer to designing a circuit or a chemical flow. In the end they spoke to roughly 15 to 20 people across six or seven fields.

Everybody Hates Waterfall: Iteration Versus the Cost of Mistakes

Asked for the main similarity, Wayne summarizes: "Everybody hates waterfall." In Wayne's account, the core tension of engineering is between how expensive a mistake is and how quickly you can iterate. The faster you can iterate, the less planning you need up front. The more expensive a mistake is, the more planning you need. When constructing a building, you can't build it several times and see what happens, so you plan heavily. Even then engineers look for ways to iterate on the plan, using scale models, simulation software, and CAD models. Electrical engineers can design, test, send a design to the fab, and get something back, so they iterate much more than civil engineers.

The host adds that "smoke test" reportedly comes from electrical engineering: you hook up a test circuit, and if it smokes, it's bad. Wayne hadn't looked into that but found it believable.

One of Wayne's first interviewees was a mining engineer who designed deep underground mines so they stayed stable and didn't leak toxic chemicals. The first thing he said was that mining had its Agile revolution in 1960. Wayne believes it was called the Viennese tunneling method. It was a way to iterate quickly through tunneling in rock: make changes as fast as possible, see how the rest of the system reacts, and correct.

Where Software Is Ahead: Speed, Consistency, Openness, Version Control

Wayne distinguishes differences in practice from differences in the "material" each field works with. Everyone tries to iterate fast, often by turning to software, but software is the best at it. Chemical engineers told Wayne that setting up an experiment, running it overnight, and getting results the next day counted as fast. In software you press a key and get a result.

A less obvious advantage, according to Wayne, is consistency. In talks Wayne sometimes holds up a CPU or a stick of RAM and reads from a spec sheet. A resistor might be rated within 20% of 100 ohms, as long as it stays between 20 and 50°C. If you make a thousand of them, they will vary by 20%, and the only way to know is to test them. Run them too long or heat them too much and they change again. Barring CPU bugs, a program that runs on one computer runs identically on another, and a sorting algorithm sorts the same list the same way. The host asks whether this means software engineers account for variability less. Wayne agrees, noting that software's variation is largely self-made: different systems and APIs. Physical engineers have that too, plus corrosion when an iron screw touches a tungsten one, and screws that are all slightly different sizes.

On closeness to customers, Wayne found no clear pattern. Some interviewees felt closer to customers in software, and some felt further away.

Openness was a clear difference. Wayne was in Hungary to speak at Craft Conference, and points out that most fields have two kinds of conferences: academic conferences and vendor trade shows. Software has a third kind, the practitioner conference, where people meet simply to get better at their work. Software is also unusual in its commitment to open source and freely available knowledge. For almost any language, you can learn it online without buying a book or talking to a vendor.

The host wonders why large companies like Uber or Airbnb openly describe how they built their systems. Wayne marks what follows as speculation. Part of it is probably cultural, but Wayne suspects a bigger factor is that software's material is the same as its product. We use software to write software, while other engineers use lathes and tools to make physical things. Wayne wonders whether 3D printing communities, which seem to share freely, work similarly because the unit of value there is also a shareable file. The host suggests hacker culture may play a role wherever getting started is affordable, such as ham radio or the early era of personal computers. Both treat this as speculation worth a separate project.

Version control stood out even more. Wayne says that all of roughly 20 interviewees named version control as the thing they wished they'd had in their old field. Other fields do have change management, but Wayne compares the gap to that between a modern car and a Model T.

What Software Could Learn from Traditional Engineering

Answers on what software could learn were more scattered. Wayne pulled out two themes. First, software is much better at iterating but worse at planning. We still need to plan before iterating, and we can get away with doing less of it, but combining the two could make software better still. Wayne notes this is also a plug for their own work.

The second theme surprised Wayne more. Software is open about its materials but worse at compiling detailed knowledge about the specifics of the job. One interviewee's two favorite books were The Design of Everyday Things, which he recommends every engineer read, and The Snap-Fit Handbook. Snap fits are the clicking catches on things like a remote's battery cover. The handbook runs about 500 pages on their engineering, shapes, and materials. Wayne's software analogy would be a 500-page book on how to version an API. That book doesn't exist, and both agree it should.

Five years after the project, Wayne says it moved them from "we are definitely not engineers" to "we probably are." Wayne adds a caveat: the project predates LLMs, which have probably changed software and the other fields in ways Wayne doesn't know. Still, as of now, Wayne thinks what software developers do is very similar to what the interviewees described doing in their own fields.

What Formal Methods Are: Making Implicit Knowledge Explicit

To explain formal methods, Wayne asks the host how he would test a max function that returns the largest number in a list. The host describes about five to eight tests: a two-element list, a long list, similar numbers, perhaps integer overflow. Wayne then asks how he knows what the right answer is. The host says he just knows, from basic math he doesn't even need to explain.

That implicit mechanism is Wayne's starting point. Step one of formal methods is to make that knowledge explicit, writing down what the function is supposed to do in a clear, unambiguous way anyone can check. For max, the result is an element of the list such that every other element is no larger. That statement is the specification. Step two is showing that the function satisfies it, which is verification. Tests do this for individual values. Types do it in another way, for example by guaranteeing that a list goes in and a single element comes out. Formal methods ask whether mathematics can show the function works for every possible list, and that is done through proof.

The host recalls university proofs as chains of rigid, allowed transformations. Wayne says formal methods are like that, but uses a calculator analogy. You can add large numbers by hand, but you usually don't. You can do proofs by hand in a theorem prover, but in industry tools automate much of the process. You state what is true at the start and what should be true at the end. The tool either proves it or asks for help, and you supply intermediate facts until the computer can finish the proof.

Why Formal Verification Isn't Used Everywhere

Before discussing tools, Wayne raises the obvious question: why isn't this done for everything? Wayne changes the example to finding the file in a directory with the most lines. Are those ASCII lines or UTF-8 newlines? What if a file can't be read due to permissions, or is a shortcut, a directory, or a binary? The host protests that Wayne is simulating the real world, and that is the point. For most interesting domain problems, Wayne says, you have to pull in so much context that even writing down what the function should do becomes a nightmare. An imperative program that is correct 99% of the time is probably good enough in almost all cases. Getting to 100% would require pinning down details like which file system is in use. The host compares it to premature optimization, and Wayne adds that ten tests may already give you most of what you need.

Wayne then describes where formal methods are used. The usual answer is "nukes and NASA," but Wayne says from firsthand experience that nuclear power plants don't care about this. They are fine with thorough testing. The second category is small, critical cores where one piece must be verified and the rest can be handled informally, such as parts of databases or cryptographic primitives. Wayne believes Firefox's HTTPS stack is verified through something called Project Everest, while cautioning that some details may be wrong. Operating system kernels fit here too. Wayne believes Microsoft formally verified parts of the Vista kernel for driver loading. seL4 is a small microkernel verified end to end in Isabelle and mostly used in automotive and military applications. Wayne notes the caveat: verification means it matches its specification. It might still do the wrong thing, but it will do what was specified correctly under the specified circumstances.

The third category is Wayne's own. Instead of verifying the whole real-world system, you verify a simplified version of it. The real system may still have bugs, but you remove design flaws from the abstraction before building them. The host summarizes this as stress-testing the plan. Most of Wayne's work has been on databases and distributed systems for tech companies. Other jobs included verifying device firmware, and what Wayne calls one of the coolest projects: verifying transponders in a train system so they wouldn't cause problems for trains passing over them. That project turned up a very old bug.

TLA+ in Action: The Trading Platform Demo

Wayne describes TLA+ as the most popular technology today for this kind of planning. It was created by Leslie Lamport, who also created LaTeX, to model distributed systems. TLA+ represents a system as a state machine, meaning every state it can be in and every transition. A model checker then brute-forces every initial state and every state reachable from it, checking properties along the way. Wayne mentions that TLA+ can also check liveness and refinement but doesn't go into them.

The demo models a simple trading platform. Each item has an owner, and there is a set of outstanding offers. Only one-way transfers are modeled, not swaps. To propose an offer you must own the item, and the offer goes into the set. Accepting a valid offer removes it and transfers ownership. Rejecting simply removes it. The next-state relation picks two different people and an item, then either proposes, accepts, or rejects. A "valid change" property says that if ownership changes, the new owner accepted an offer from the old owner. An invariant requires every change to be valid.

The host notes the learning curve. Wayne agrees this is why the tool is niche. Lamport was a mathematician in 1994 and wrote the language the way a mathematician writes. Since then, newer languages such as Quint and P, partly built on lessons from TLA+, look more like programming languages. Wayne says many practitioners started with TLA+ because the first high-profile industry demonstration, Amazon's 2014 paper on formal methods at AWS, used it.

Wayne runs the checker with three people, Alice, Bob, and Carol, trading a stick. It reports a violated property after 53 states. Wayne also shows a Graphviz rendering of part of the state space, noting that real state spaces often reach around 100 million states, so the visualization is mostly for demos. The bug is this: Alice offers the stick to Bob, who is away. Tired of waiting, she offers it to Carol, who accepts immediately. Bob then returns, sees the stale offer, and accepts. The stick moves to Bob, but from Carol, not from Alice. Carol never offered it to Bob, so the invariant fails.

Wayne explains how the checker finds this. From "Alice owns the stick," both "offer Bob" and "offer Carol" are possible, creating two states. From "offer Bob," three things can happen: Bob accepts, Bob rejects, or, because of concurrency, Alice offers to Carol. The checker explores every branch. That is why it's useful for distributed systems: when several processes can each take several steps, the possible interleavings are very hard for people to enumerate, but a computer can work through them in a night or two.

TLA+ at Amazon

Wayne describes the 2014 paper, "Use of Formal Methods at Amazon Web Services." A few interested engineers learned TLA+ and PlusCal, which compiles to TLA+, and applied them to aspects of DynamoDB and S3. They found complicated bugs that could lose data, Wayne thinks in the replication system. The host cites the paper's figure that the shortest error trace contained 35 high-level steps. Wayne, who didn't work on that project, speculates that the state space was probably about 100 million states, with many longer chains of 70 or 80 steps that were perfectly safe and just this one 35-step chain that was invalid.

How Distributed Systems Break

Beyond general race conditions and locking, the pattern Wayne sees repeatedly is time-of-check to time-of-use (TOCTOU). You check that something is valid, then act on it later. Later might mean a microsecond or a day. The bug happens whenever the condition can go from valid to invalid in between. Wayne's example, noting that real banks use ledgers, is a transfer that checks for $10, but before deducting, someone else withdraws it, so the account ends at negative $10.

The host recalls building Uber's payment system, where exactly-once message delivery was hard. Charging a card needs exactly-once, but resending for safety risks double charges. At-least-once delivery is much easier, and you have to build exactly-once on top of it. Wayne wonders whether this is why businesses authorize extra and refund later. The host adds a risk reason: authorizing a larger amount up front, as hotels do, avoids failing a second authorization later when a card is near its limit. Wayne had assumed hotels did it to discourage guests from breaking things.

Why Concurrency Is Hard, and Why Practice Matters

Wayne argues that the most interesting effect of formal methods on systems thinking comes from practice rather than theory. Wayne doubts people are inherently bad at reasoning about concurrency. Crossing a street means modeling a concurrent system full of cars. Wayne cites a paper, "Commonsense Computing," in which high school and college students spotted concurrency bugs much faster when a problem was reframed from threads to clerks at a ticket office assigning concert seats.

Wayne's explanation is lack of practice. A race condition in production usually surfaces months later, and you learn weeks after that whether your fix worked. With TLA+, you write a model, press a button, and immediately see a race condition. Fix it and you get a timeout bug, fix that and you get a TOCTOU bug. That fast loop, Wayne believes, is what makes people better at finding these bugs. With new clients, Wayne usually doesn't know how the system works, since the clients are the domain experts, but once the model exists Wayne can spot bugs in it faster than they can, simply from practice.

The host compares this to refactoring and migrations: most engineers are bad at migrations because they do few of them, while those who have done several can almost do them with their eyes closed. His own exposure to race conditions was a double charge at one point and never again, so he doesn't consider himself good at them. Wayne calls this "right on the money." Wayne adds that there are subtler things these tools teach, but the most visceral is a "hatred of a race condition" that becomes physically visible in the algorithm. As for how it has changed Wayne's own thinking, Wayne mostly writes Python day to day and finds it hard to pin down exact effects. At minimum, formal methods make Wayne more willing to reach for math-heavy solutions over simple, reliable ones.

Should Programmers Learn Math?

Wayne sorts math into three kinds. Some is so universal we forget it's math, like counting and comparing. Some is useful only in specialties; some SREs need calculus, but most programmers don't. And some is broadly useful in programming: graphs and directed graphs, matrices, and formal logic. Even so, Wayne thinks most developers benefit more from exposure to what different fields of math offer than from going deep into all of them. You need to know what exists to know what's useful, and most math won't be useful to you.

The host shares that 3D matrix transformations from university later helped him understand why GPUs matter for AI, and that a math background keeps him from being scared off by formal papers. Wayne offers a hypothesis: traditional engineering relies on continuous math, such as calculus and differential equations, which is what American high schools teach at advanced levels. Software relies on discrete math, including combinatorics, graph theory, formal logic, and set theory, which is rarely taught in high school or early university. Wayne wonders whether people fail to see math in software because it isn't the math they were exposed to. The host mentions big-O notation as shared vocabulary, and Wayne says their own understanding of big-O improved once they learned it formally describes a set of functions, not just a scaling rate.

What TLA+ Is Good For and What It Isn't

Wayne says TLA+ and most formal methods shine in highly technical domains removed from business rules. How to replicate nodes between datasets is technical. Keeping sprints from running over time is about human behavior. Wayne once had a client model something like that, and it was useful but very hard. That's why Wayne's clients tend to be database vendors, cloud providers, and hardware companies, whose work matters to business but sits several steps from its front lines.

TLA+ specifically suits discrete distributed systems, where the challenge is concurrency and the range of possible behaviors. It doesn't do floating point or decimals and doesn't handle probabilistic reasoning. It fits cases where any possibility of an error is a big deal, not cases where an error is acceptable if it happens less than one in 100 times. Tools that do probabilistic reasoning exist, but according to Wayne they lack features like functions, arrays, or numbers. If you don't need much planning, or you can iterate toward a solution and bugs aren't costly, you may not need it. Wayne stresses this repeatedly. Many people are skeptical of formal methods because they were burned by CASE tools, UML, and other "miracle solutions" imposed regardless of fit, so Wayne makes a point of not recommending a tool that isn't right for someone.

Alloy: Finding Bugs in Data Models

Wayne's second demo uses Alloy, created by an MIT professor and from a different lineage than TLA+. The model is an access control system. Resources have users who can read them and at most one parent, with no cycles. You can access a resource if it lists you as a reader or its parent does. The property is that if you can read a resource, you can read its children. The host can't spot the bug.

Wayne notes this example predates Alloy's temporal reasoning, which was added about four years ago, and shows how Alloy finds bugs in static configurations such as data structures and domain models. Wayne mentions interest from the domain-driven design community. Running it in Alloy's IDE (Wayne says most people use VS Code instead) produces a visualized counterexample. A user can read a parent, so they can read its child. But the child has a grandchild the user cannot read, because the user is listed only on the parent, and "readable by" isn't transitive.

On fixing it, Wayne notes that formal methods don't tell you how to fix a bug; you choose. Making the parent lookup transitive removes the counterexample. That fix might not be implementable, though. A database administrator might say a transitive query would crash the SQL database, and then you'd need another fix and could rerun the model.

Wayne then explains why Alloy is fast. The host works through Boolean satisfiability: P is satisfiable, P and not Q is satisfiable, and P and Q and not P is not. SAT is NP-complete, which in theory means no efficient algorithm solves every instance, but in practice solvers are very fast. Alloy translates models into huge Boolean formulas for a SAT solver. Most Alloy models check in milliseconds or a second at most, while a large TLA+ model may need to run overnight through 100 million states. The tradeoff is that Alloy is worse for modeling distributed systems, which is why most of Wayne's work uses TLA+.

The Wider Tool Landscape

Wayne surveys more tools without demos. P, which Wayne thinks was created by someone at Microsoft Research who later joined Amazon, was designed to be more accessible than TLA+. It models interacting state machines that send messages, similar to the actor model in Erlang. Quint came from people building a different model checker for TLA+ who realized they could build a friendlier language. According to Wayne, it has drawn interest in banking and, Wayne believes, cryptocurrency and smart contracts. Prism is a probabilistic model checker. Where TLA+ says a bug can or cannot happen, Prism can say it happens 10% of the time. Wayne calls it much more academic and harder to translate into, and mentions a two-part series using Prism to show that dreidel, a Hanukkah spinning-top game, is not fun.

Wayne also lists Event-B, which Wayne believes was famously used in part of the Paris Metro; NuSMV, which Wayne thinks NASA has used; and a tool for robotic control systems that Wayne considers mostly academic. All of these specify abstract models. For verifying actual code, there's Dafny, which compiles to .NET and lets you write provable code; JML for Java; Frama-C for C; Ada SPARK; and theorem provers like Coq, Lean, and Isabelle.

Property-Based Testing: The Practical Middle Ground

Wayne returns to max with a Python demo written for Logic for Programmers. There are three versions: a correct one, one that returns the max of only the first three elements, and one that returns the max of absolute values. The property test says that for any non-empty list of integers, the result must be in the list and no element may exceed it. This closely mirrors the formal specification. The difference, Wayne explains, is that formal methods try to prove the property for every list, while property testing generates many random lists, for example a thousand, and checks them.

Running pytest, the first-three version fails on the list [0, 0, 0, 1]: it returned 0, but the real maximum is 1. Wayne explains that the tool tries many edge cases first, including huge lists and tiny lists. Once it finds a failure, it shrinks the input to a minimal interesting example. The original failing list was much larger, and Wayne doesn't think anyone could look at it and see the problem. Shrinking makes the bug understandable. Property testing is less thorough than formal verification but much easier to apply. Wayne says that for most people it may be not only a place to start but a place to stop, since formal methods are niche and property testing is useful to more people.

Can AI Make Formal Verification Mainstream?

The host notes that AI is generating far more code, making review harder, and many people are suggesting formal verification or property testing as a response, though few seem to act on it. Wayne sees real movement. More clients are generating specs with AI and bringing Wayne in to fix or review them. Property-based testing is spreading too; Wayne notes that Kiro, Amazon's spec-driven development platform, advertises property-test generation as a key feature. There are also many papers on generating specs with AI. Wayne finds this exciting, since much of the difficulty of writing specs is wrestling with technical syntax and semantics.

But from Wayne's own experiments, as of March, AI is very bad at coming up with properties. Wayne notes a new Claude model had just been released and things change monthly, so this could be out of date. Give a model a spec and properties and it can fix the spec to make them pass. Ask it to invent properties, and it may propose something like "either P or not P," which is always true, and then celebrate verifying it. Liveness properties, which describe how a system evolves over time, are especially hard. Wayne tells clients that AI does a good job generating the design, but expressing what the design is supposed to do is still their job.

The host brings up a March 2025 blog post, "The Coming Revolution in Distributed Systems," by an engineer on GitHub Copilot, describing AI producing TLA+ specs from Azure storage production code and uncovering a subtle race condition that code review had missed. Wayne says the same engineer later built a tool called Lamport agent and seemed more successful at generating properties than Wayne had been. Wayne adds two caveats. The engineer is an expert specifier who can already do this without an LLM, which matches a general pattern: to get good results from AI, you need to already know how to get them without it; AI just gets you there faster. And one of the systems already had a sophisticated spec written in P, which the model may have drawn on. Wayne doesn't know whether that matters. Wayne also mentions a write-up by a researcher about a multi-year formal methods project at a large Chinese cloud provider. Between doing the work and publishing, LLMs had compressed the time it took people there to write formal specs. Overall, Wayne thinks the people succeeding now are specifiers using AI to amplify their own ability. The fully AI-written specs posted on Hacker News tend not to be very good.

Will AI make formal methods mainstream? Wayne thinks it's making them more popular, perhaps from 0.1% to 0.3%, "which is huge," but isn't sure about mainstream.

The host asks about Wayne's June 2025 newsletter line calling AI a "specification force multiplier." Wayne says that post already listed what AI was good at: fixing syntax errors, explaining error traces (turning a 35-step trace into two paragraphs of English), and boilerplate changes. It was okay at writing properties from a very precise description, bad at fixing specs, and very bad at producing properties on its own, with output that was trivial or too tied to implementation details. Wayne jokes about being consistent, and says the weakness noted in 2025 was still there as of March. So how much do you need to know to use LLMs for this? Wayne says the basics matter, at least so you can tell when the AI is doing something wrong.

Logic for Programmers and Where to Start

Asked why Logic for Programmers argues that formal logic is so useful day to day, Wayne gives two answers. Logic is about manipulating Booleans and statements, much like school teaches manipulating numbers. There's little difference between 1 + 1 = 2 and "true and true is true," and Booleans are central to software while logic is rarely taught in school. Empirically, Wayne keeps finding situations where logic enables something that people without it struggle with.

For an engineer already doing unit and integration testing who wants to harden distributed systems, Wayne deliberately goes "90°" and recommends Nancy Leveson's Engineering a Safer World. Leveson is an aeronautics engineer who investigated incidents including the Therac-25 radiation cases and the Columbia disaster, and studied why accidents happen in complex systems. Wayne found it incredibly insightful for understanding how systems break.

Anxieties About the Profession

The host revisits a post from a year earlier listing six things that could all be true, and they react to each.

First, vibe coders will never be as good at software engineering as experienced engineers. Wayne says probably true, since you can't succeed without the basics. The host agrees, noting his own attempts at a game outside his expertise turned into a "vibe-coded mess."

Second, LLMs can significantly help professionals write high-quality software quickly. Wayne thinks this is true even without having AI write code, just from asking where a bug is or which library to use. The host adds that engineers with deep knowledge who control the tools, rather than being controlled by them, get a lot done.

Third, LLMs will cause many developers to lose jobs. Wayne is unsure. US software hiring seems to be recovering, and it's hard to separate AI's effect from the end of zero interest rates and the post-COVID downturn. Wayne leans toward the latter but notes models are still improving. The host says Pragmatic Engineer data shows more openings in the US, slight declines in Germany and France, and a shift in who gets hired: AI engineering is spreading into more fields, while front-end and mobile hiring is falling. He points out that demand has always shifted, recalling when "10 years of Java experience" was the most sought-after profile.

Fourth, LLMs will open software work to many more people. Wayne agrees: if a product needs one developer instead of five, you're more likely to hire that one.

Fifth, those jobs will be lower paid and lower status than in 2008–2022. This is what scares Wayne most. Wayne left physics, walked into tech, and ended up proving systems correct full time. Wayne asks what other engineering field lets someone walk straight in, or pays to fly someone overseas for a 45-minute talk. Wayne fears software becoming like any other white-collar job, with two weeks of vacation and two sick days. The host notes that this is already the reality for many engineers and that software has "massive privilege." Wayne agrees, saying it would be nice if everyone had the same, but not by software losing what makes it special.

Sixth, high-paid jobs will remain but be rarer, more competitive, and less developer-friendly. The host fears this is already happening and compares it to investment banking traders, who are fewer, still well paid, and hard to become. Wayne says most jobs ossify as standards set and more people enter, and software escaped that longer than most.

The host reads Wayne's closing prediction from a year earlier: software development will survive the next ten years but become like any other white-collar profession, without $200,000 salaries, unlimited vacation, or strong bargaining power, because "automation comes for all of us, even us automators." Wayne now adds a complication. A doctor friend recently vibe-coded a shift-trading platform for their hospital without knowing how to code. It saved time and made the nurses and doctors happier. Wayne finds it strange to weigh their own cushy job against that doctor's needs and says they don't know who matters more; everyone will find out over the next ten years.

The host relays a conversation with a veteran of the field who compared this moment to the late 1960s and early 1970s, when teachers and others outside software began buying computers and hacking. The host feels something similar as people outside tech tell him about things they're building. Wayne points to Clay Shirky's essay "Situated Software," which argues that much software should be built for just a few people, a family, a community, or a single school. Until now that required someone in the group to be deeply into computers. Now anyone can have situated software, which Wayne expects to change the world in ways that are "strange," "terrifying," and "exciting."

Three Books

Limiting themself to software books, Wayne recommends three. First, Leveson's Engineering a Safer World, which Wayne believes is free online. Second, Data and Reality by Bill Kent, a database designer who worked on IBM databases. It asks what data is, what makes something an entity, and whether "a book" means a physical copy, an edition, or a series. Kent concludes that data isn't reality but our view of reality for a useful purpose. Wayne notes the 2011 republication altered the text, so the second edition is the good one, though it's hard to find. Third, David Agans's Debugging: The 9 Indispensable Rules, a book of war stories and principles that Wayne gives to every junior engineer. Almost nobody treats debugging as a discipline beyond basic heuristics, and having something is better than nothing. Wayne notes a used copy costs about $10.

In his closing remarks, the host says he now better understands why formal verification is unlikely to go mainstream even with AI. The tools feel rigid for the real world. They work for parts of a system that can be modeled mathematically, but writing TLA+ specs for everyday programs seems pointless to him. The takeaway he highlights most is Wayne's point that engineers struggle with concurrency bugs mainly because they so rarely get practice finding them.