Sam Newman on Microservices as a Last Resort, Resilient Distributed Systems, and Staying Connected to Systems Built with AI

Open on YouTube ↗
Overview

Sam Newman wrote one of the most widely read books on microservices, yet in this Pragmatic Engineer conversation he calls them "an architecture of last resort." The episode explains why, and then moves to his new book, Building Resilient Distributed Systems. In it he reduces the difficulty of distributed systems to three rules, makes the case that observability and business context come before any technical mitigation, and borrows four concepts from resilience engineering that go well beyond keeping servers up. The last part of the conversation covers AI. Newman is cautious there: he finds it useful at the tactical level, worries about the economics underneath it, and argues that modular architecture is how teams can experiment with AI without losing their understanding of what they are building.

38 min read

From Fortran 77 to regular expressions

Newman grew up in the UK with an Acorn Electron and later a ZX Spectrum +3, and studied software engineering at De Montfort University. His course was a "sandwich" degree: two years of study, a paid year working in industry, then a final year. He says the industry year made things "click." He spent it at GEC Alsthom (later Alstom), which wrote software for the European Space Agency and for gas and steam turbines.

In his first week there he was given a Fortran 77 codebase. Machine time had been expensive and the team had worried about accidental infinite loops, so every one of the roughly 8,000 files capped its for loops at about 99,999 iterations and aborted past that. The models had since grown and the computers had become more powerful, so the limits had to go up. His boss estimated two weeks of fiddly manual edits, made harder by Fortran's punch-card-era line length limits. Then the boss slid the O'Reilly sed & awk book across the desk. Newman spent two days learning regular expressions and wrote an automated refactoring that respected the line lengths. He calls it "the closest I've ever come to feeling like a god."

There is a coda. Years later, near the end of his time at Thoughtworks, he told the story to some graduates, and one asked why he hadn't replaced the limit with a constant so it could be changed once in future. Newman says he was "learning once again." He tells the story to illustrate how the industry keeps humbling you. He also links it to something developers are struggling with now: as people move further from the code, they are trying to work out where that "fizzy dopamine hit" of programming comes from. Newman says it matters less to him because he has worked mostly in architecture and infrastructure for a long time. He notes that his son, also a programmer, has entered the field at "an interesting time."

9:34

Thoughtworks and the idea that "this stuff's all up for grabs"

Newman joined Thoughtworks when it had just under 400 people and left when it had about 4,000. It was primarily an Extreme Programming shop, influenced by Kent Beck's XP, with a London flavor from the Extreme Tuesday Club and the "London school" of test-driven development. For that school he points to Growing Object-Oriented Software, Guided by Tests by his friends Steve Freeman and Nat Pryce, which he calls "one of the worst titled books in existence." He chose Thoughtworks over a bank partly because the bank could tell him exactly what he'd be doing and the Thoughtworks recruiter couldn't. That uncertainty appealed to him.

Continuous integration and TDD were being talked about at the time, but the tooling mostly didn't exist. Newman started building build-pipeline tooling around 2004. Dave Farley was his first tech lead, and he interviewed Jez Humble as his own backfill on a project at AOL. He also built two replacements for CruiseControl and co-created DbDeploy, which he describes as the first database refactoring tool, because nothing like it existed yet. What he took from that period was the belief that "these things aren't set in stone." In 2007 he spent about a year and a half at Google as a Thoughtworks employee, alongside people from Industrial Logic and Pivotal, teaching Googlers to write automated tests and testable code. He remembers conversations with people at Yahoo and in large parts of Google who did not believe functional automated testing of websites was possible.

The host observed that consultancies are rarely seen as sources of innovation and that Thoughtworks seems to be an exception. Newman qualified this. He says the innovation happened under a different set of constraints. Few Thoughtworks alumni became strong startup founders, though many are good at scale-ups. As a consultancy doing mostly co-sourced delivery, its working conditions depended on the client. Most engagements began by convincing clients that testing and pairing were worthwhile, before TDD even came up.

That leads to an idea he credits to Martin Fowler: "programming is not typing." A client who objects that pairing halves output believes programming is typing, and the real conversation is about what programming actually is. The host noted that many CEOs now reason the same way about LLMs: code was historically half the work, and LLMs produce code. Newman answered with Peter Naur's view of a program as a theory that lives in the minds of developers working together, with code as a side effect of that collaboration. Product development extends the same idea. Through a theory-of-constraints lens, he adds, speeding up one stage exposes friction elsewhere, and coding was often not the bottleneck anyway. The real problem was how coding was done, for example with delayed feedback cycles. He cites Margaret-Anne Storey drawing on Naur and Kent Beck's point that software design is an exercise in human relationships. AI doesn't change that, he says. Programming is "the collective art of creating software and it's not just developers that do that."

After Thoughtworks, Newman did three startups. None worked out ("don't ask me for advice"). He left partly to avoid becoming "institutionalized": he had tried to change things that the company didn't want changed. He has been independent ever since, and jokes that the problem with working for yourself is the boss.

21:05

Where "microservices" came from

Newman says James Lewis coined the term, not Martin Fowler. Around 2011–2012, Lewis was talking to companies building service-oriented architectures where services could be replaced quickly. In the background was what Newman calls a "guerrilla SOA" movement: a reaction against WSDL and SOAP ("never has the word simple been less well used") and against centralized middleware, toward REST and "smart endpoints and dumb pipes," pushed by people such as Jim Webber and Ian Robinson. At a Thoughtworks architecture symposium in the Lake District, Lewis pitched the idea as "micro apps." Someone among the roughly ten people present, most of them hung over, said they were more like services. Lewis and Fowler then wrote the first article on Fowler's site.

Newman came to the idea from a different direction. He had spent nearly ten years on continuous delivery and was running Thoughtworks' continuous delivery practice for Europe, focused on "the final mile" to production. He kept running into an architectural obstacle: you can't change things frequently if what you want to change is tightly integrated with everything else. He gave a talk called "Designing for Rapid Release" in 2012. When Lewis put a name and patterns to the idea, Newman recognized it, and he had always wanted to write an O'Reilly "animal book." For him, microservices were an extension of continuous delivery, a style only practical because of CD and DevOps. The underlying ideas are older. He mentions Erlang and calls the whole effort "an exercise in smuggling through concepts from the 1970s": information hiding, coupling, cohesion.

When he wrote the first book, few companies spoke publicly about this style. He drew on Ben Christensen at Netflix and on REA (realestate.com.au) in Australia. Netflix originally called its approach "fine-grained SOA," and Newman understands the same was true at Uber and elsewhere. Then came rebadging: everyone started calling their SOA "microservices." Newman treats this as predictable semantic diffusion and has kept presenting microservices as "an opinionated style of SOA."

Two opinions, and why microservices are a last resort

He jokes that his definition wins because he wrote the books. It rests on two opinions. The first and most important is independent deployability: the unit of deployment and change is a single service boundary, not several services released together. The second, which he says has more exceptions, is that service boundaries should by default follow the business domain. Many SOA systems instead used technical decomposition into layers.

The host described Uber from 2016. Services were independently deployable with increasingly strongly typed interfaces, but boundaries were rarely domain-driven. Inexperienced developers spun up services, other teams came to depend on them, and years later audits of the hot path found obscure services that needed to be top-tier. The host relayed what former Uber CTO Thuan Pham said on an earlier episode: Uber never set out to have so many services. The monolith was slowing delivery, and the only enforceable way to stop it growing was a mandate that everything new had to be its own service. The proliferation was a side effect. Years later Uber has looked at merging services by domain, but the public story at the time was just "Uber has thousands of microservices."

Newman says this is what microservice adoption really looks like, and it is why he calls them an architecture of last resort. They push you toward aggressive distribution of state and everything else, so you need a good reason. The best reason, in his view, is that you want an organization where teams can act independently, and microservices are a "fantastically good fit" for that. But they are only a means to an end. The common mistake is to adopt microservices and expect "other magic stuff" to happen. Most enterprise clients he has worked with want exactly that autonomy: many developers, a lot of middle management, little work getting done.

He also draws a distinction between tech companies (he still calls them "dotcoms") and enterprises. Domains at tech companies are, in his view, very simple by comparison, and business processes evolve together with their digital implementation. Enterprises such as banks built their first digital products by encoding paper-based processes that are decades old. Eric Evans' Domain-Driven Design (2004) reflected that era's work of modeling existing non-digital processes. The host asked whether the same split will appear with AI, between AI-native startups and established companies retrofitting AI onto how they already work. Newman says it is already happening, and that enterprises rarely succeed at the first-generation attempts because "the corporate DNA will just crush that stuff from within."

Is the spec becoming the source of truth?

Newman frames the AI question as one of abstraction levels. We moved from machine code to assembly to general-purpose languages, and each time the mental model of the program was evolved at the most effective level. Specs might be the next step, perhaps with product people taking a bigger part in that conversation. His answer to whether we are ready is "no, not everywhere."

The host noted that at many tech companies, the code is where the truth about the system lives. Newman's first response, channeling Charity Majors, was that "production is truth." On what the system should do, he points to Birgitta Böckeler's article on Martin Fowler's site about spec-driven development, which separates spec-first from spec-anchored approaches. Some teams use tools like Kiro or Spec Kit to write a spec, let the LLM implement it, and throw the spec away. Others keep the spec and update it as the feature changes. Some now never look at the code. Newman doesn't know whether the end of that spectrum is the right destination. Much more needs answering, he says, before we have the kind of confidence in a spec that we have about what a line of Java does.

Collaboration and tacit knowledge are central here. The host noted that code review used to spread knowledge and reduce bus-factor risk, and that some companies are dropping it because of the volume of AI-generated code. Newman added that promiscuous pairing, with daily rotation, gave everyone shared context. He cites Chris Ford of Thoughtworks Spain, who says the biggest problem in AI-driven delivery is tacit knowledge: the feeling during review that something "doesn't really feel right" without quite knowing why. To work at the spec level and be hands-off, people would need to unpack that knowledge and get it into the spec.

He sees a related problem in how many people work today. Individuals go off in different directions with their AI assistants. He has seen people describe this as pairing, and objects that the assistant is "not a human." The shared mental model breaks down. AI was supposed to free developers from drudgery, but he says most are doing more work, switching context more, and losing the big picture. If teams collaborate on specs, the spec could become a source of truth, probably shared with people's heads, and teams might shrink. He cites a well-regarded firm that announced it was ending human code review so it could spend more time on design documents. He is comfortable with that because they are moving the thinking elsewhere, not skipping it. Teams that stop looking at the code without putting that effort somewhere else "deserve everything that's going to happen to you."

At a half-day O'Reilly online conference on software delivery that he hosted, four of roughly six speakers covered variants of spec-driven development. Newman reports that all of them said the same thing: you can't do it unless you can define what good looks like. One small team was feeding its OpenTelemetry data directly into its agent. He thinks this pushes developers to think beyond the narrow functional acceptance criteria common in user stories. "The expertise is still needed, it's just needed at a different place."

Why write Building Resilient Distributed Systems

Years ago, at O'Reilly's Velocity conference, someone pointed Newman to a resilience engineering paper by David Woods. He found it "utterly baffling" because it wasn't written for software people, and he says he isn't even a computer scientist. From around 2015–2016 he reread it every six months or so and read summaries by others until the ideas made sense. Meanwhile, many people were building microservice architectures even though, as he puts it, most of his book tells you not to. More people were being exposed to "the horror, pain, and suffering of a distributed system," and he wanted to give them a "rubber ring."

The book starts with tractable foundations. After the introduction, chapter two covers observability and OpenTelemetry, and chapter three covers timeouts. It then builds toward sociotechnical systems and the difference between safety management and resilience engineering. Newman includes real examples from large companies and from his own mistakes. A recurring theme is that things will go wrong. Resilience engineering is about making as many things go right as possible, not all of them, and he says it requires being honest about mistakes and sharing them.

That led to public incident reports. Newman separates marketing and PR from genuine post-incident review. A company might say little publicly and still run an excellent internal process, while some published reports "feel more marketing." He notes that regulation such as DORA in Europe now requires some disclosure, and argues there is a duty of care to inform users. He calls Cloudflare's write-ups some of the most "self-flagellating" around. The host added that Cloudflare publishes them quickly despite being publicly traded, which undercuts the claim that listed companies can't. Newman says much of how an organization is perceived comes down to how it handles mistakes.

The three rules of distributed systems

Newman says he could never remember the eight fallacies of distributed computing, so he reduced the root causes to three rules.

The first rule is that information cannot travel instantaneously from A to B. Developers control some of this, such as payload size and serialization technology, but not cabling, equipment, or distance. On the public internet, "BGP has a bad day" and packets take the wrong route. Something can look instantaneous without being so. (When quantum physicists raise entanglement, he replies that it only works for reads and isn't a networking protocol.)

The second rule is that sometimes the thing you want to talk to isn't there. You can reduce the odds, for example by running multiple instances behind a load balancer, but the load balancer can fail too. His examples: a SAN where one of two pairs of SSDs in its caching layer caught fire, producing strange latency graphs depending on which path requests took, and rabbits that moved into ducting between office buildings and ate a network cable. "I can't control for rabbits."

The third rule, which he credits a former colleague with pointing out he'd missed, is that resource pools are not infinite: CPU, memory, I/O, queues. In his experience most outages come down to a resource being saturated somewhere, often in a chain. Something goes down, a retry storm follows, connections are starved, and so on. His advice is to hold onto these three rules before worrying about Byzantine consensus, CAP, or PACELC, because most problems become easier once you do.

56:28

Observability as the precondition for everything else

Newman defines observability as a property of a system: how easily you can understand its behavior from external signals. A single program on a machine you can access gives rich signals almost for free. You can attach a debugger, take a core dump or a JVM thread dump, and CPU stuck at 100% is meaningful. In a distributed system those signals are harder to collect, can't be correlated without extra work, and individually say little about the system as a whole. That work is much easier to do from the start than to retrofit. He welcomes OpenTelemetry as a vendor-agnostic standard (adding that Honeycomb is the best and that Charity Majors pays him only in stickers). His practical point is that you can't even set a sensible timeout without knowing the normal distribution of response times and the success and failure rates.

The host asked about the gap between technical metrics and whether a user's button press actually works, for example whether an Uber ride request completes within about five seconds or hangs on a spinner. Newman's answer is to treat the raw telemetry as a stream of structured events and build higher-level views from them. Traces stitch spans together: a span is an activity, which can contain child spans such as a database call or a call to another service, linked by a shared trace ID and timing. Most organizations once had to build their own tracing, and projects like Zipkin were attempts to recreate what Google had. Above that sit service level indicators, which judge each event good or bad (an error or a slow response is bad), and service level objectives, which are commitments such as a target percentage of successful ride requests within a given time.

He connects this to how much resilience a system needs. Nobody says they don't want their system to be resilient, but resilience is a matter of degree, like security, and you need the equivalent of a threat model. Monzo, for instance, runs a constantly available stand-in bank with a stripped-down feature set (freezing cards, withdrawing cash, checking balances). It is a complete rewrite with no shared code, runs on a different cloud vendor, and by his account costs about a tenth of the full stack's cloud bill. That is right for Monzo, he says, and "there's no point you starting there." The host stressed that these decisions require understanding the costs: double cloud bills, extra latency from replicated writes, build time. Newman added that engineers have to communicate in terms stakeholders understand. Many expert product owners won't know what "percentile latency" means.

Targets also change over time. Newman says a resilient system "changes and evolves," and a system that doesn't is brittle. After the AWS us-east-1 outage late last year, some companies that had previously decided against going multi-region reconsidered, which he thinks is fine. He doesn't assume the engineers at Zoom, which was severely degraded, were "idiots." He thinks they probably weighed the cost of multi-region and judged it not worth it, and multi-cloud is a different conversation again. What matters is that the decision was made consciously and matches what users expect. That is why he contrasts SLAs with SLOs: the SLA is what you get sued for, and customers won't be happy if you only ever meet it.

1:07:54

Idempotency: keys versus fingerprints

Newman defines an idempotent operation as one that can be applied multiple times with the effect happening only once. A lift button is idempotent. A toggle light switch isn't. In computing, reads and typically deletes are idempotent. His main example is a payment. A service sends "pay Sam £100" and gets no response. Either the payment happened and the response was lost, or it never happened, because the request didn't arrive or the server crashed partway through. The host gave the familiar airline checkout warning not to refresh or resubmit. Because of rules one and two, the natural response is to retry, and without idempotency a retry can mean paying twice.

The preferred fix is an idempotency key: a unique ID, usually a UUID, generated client-side without an extra round trip and with a very low chance of collision. The server checks whether it has already processed that key and returns "processed" however many times it is asked. Newman notes that AWS, Stripe, and PayPal use this scheme. The drawback is that both client and server must support it as a required field, which makes retrofitting painful. His advice: anything that needs to be idempotent should use keys from the start.

The retrofit option is a fingerprint: the server hashes the request fields and treats a matching hash as a duplicate. This produces false positives where legitimate requests are rejected. (In the conversation he calls these false negatives, describing legitimate repeat requests being rejected.) He describes a Danish payment system where buying something for exactly 40 kroner twice in the same shop within about five minutes gets the second transaction rejected, while 39 or 41 would go through. The approach depends on identical legitimate requests being rare. It fails when they are normal, such as provisioning 20 identical EC2 instances in a loop. Keeping fingerprints only for a window (five minutes, ten, an hour) reduces the problem but can let duplicates through. The two approaches also work well together. Many public APIs fingerprint requests so that a retry reusing an idempotency key with changed parameters can be rejected as invalid. He calls the ideas simple, with nuances in implementation such as server-side storage.

1:16:00

Thundering herds and why mitigations depend on the cause

Newman uses "thundering herd" broadly, for any mismatch between requests and capacity, which is rule three again. His categories:

  • Malicious: DDoS attacks, which come at short notice with limited options. His answer is to use Fastly or Cloudflare, and the book explains the details.
  • Self-inflicted: for example, cache collapse. A restarted cache produces a wave of misses that overwhelms an origin that relied on the cache to reduce load. Mitigations include snapshotting the cache to disk, and some companies he knows turn services off until the cache refills.
  • Retry storms: his example is Square's 2017 outage. Multipass, its multi-factor authentication system, read data from Redis used as a database. After a restart, clients retried failed Redis calls with no delay up to a hard-coded 500 times, hammering Redis repeatedly. Square fixed it with a saner retry policy and externalized configuration.
  • Success: legitimate external load, as with early Twitter and HealthCare.gov. Newman says HealthCare.gov went live in 36 states at once, and in hindsight starting with one state might have helped. Constrained sign-ups, invite codes, and usage limits are the tools here, and Twitter did use some of them.

The point is that similar-looking failures need different fixes. Elastic scaling suits the "wave of success," where you might gain a thousand customers and keep a hundred, so you scale up and then back down. Against DDoS it turns the attack into a "distributed denial of cash" attack: you are still down, and now you are paying for nodes as well. "You can't just scale yourself out of trouble." Knowing how close you are to the red line requires production data, which brings him back to observability.

1:21:49

Fail open or fail closed is a business decision

Newman's chapter on formal ideas covers CAP and PACELC (and mentions harvest and yield). He argues that in practice these come down to business context. An e-commerce site that isn't sure an item is in stock will usually sell it anyway, because it can back-order or refund, and refusing loses a sale. Ticket sales for a Taylor Swift concert are different. If the link to the ticketing system is down, the vendor won't sell, because a ticket can't be back-ordered and the customer may already have booked flights to Portugal. The technical problem is the same, but the decision differs because the consequences differ.

The host offered an Uber example. When it was unclear whether a payment had gone through, Uber failed open early on to favor growth, then moved to failing closed as it pursued profitability. Newman added that this isn't one decision for the whole system. It is made feature by feature, and could even depend on whether a ride costs €10 or €1,000. His practical guidance: when you can't reach part of your system (rule two), try a technical answer like a careful retry. If that fails, before reaching for CAP theory, "go have a conversation with a product owner."

1:25:58

Four concepts from resilience engineering

The book's framework comes from David Woods, whose paper had first baffled Newman.

Robustness is absorbing known perturbations, for example Kubernetes replacing a failed pod without anyone noticing. Newman says most engineers focus only on this. Its nasty side is that robustness measures add complexity and so create new failure modes. Bring in Kubernetes to handle container failure, and now Kubernetes can fail. He says this is not solvable, only something to be aware of, and it is one reason companies decline multi-region or multi-cloud setups.

Rebound is how quickly you recover, covered by time to detection and time to recovery and by his disaster recovery chapter. It requires humility: admitting the robust design might be wrong. The host mentioned Netflix's Chaos Monkey and the need to repeat drills as systems change. Newman recommended Uptime Labs, a partly London-based company offering browser-based incident training.

Graceful extensibility is dealing with surprise, which is "now not about computers, it's about humans." You couldn't have predicted the rabbits. Command-and-control organizations with narrow job descriptions are structured around the known, so in his view they handle surprise badly. Drills help, especially when outsiders run them, as with Google SRE's "Wheel of Misfortune," where a physical wheel picks a scenario such as a state-sponsored DNS poisoning attack. The host recalled Meta's BGP/DNS outage, where engineers reportedly had to get physically into a building whose door security depended on the downed domain. Because Meta shared the details, other companies could check whether they had the same dependency.

Sustained adaptability is the continuous capacity to learn and adapt the system over the long term, including when nothing is going wrong. Newman recommends reading other companies' incident reports and points to The VOID's collection of hundreds of them, though he notes it hasn't been updated for a while. Both of the last two concepts depend on people and culture. Psychological safety is "absolutely required," because if people can't raise issues or challenge safely, surprises go unreported and lessons stay hidden. The book's final three chapters cover these human and social factors.

1:32:47

AI and resilience: useful at the micro level, worrying at the macro level

Asked whether AI sits outside these principles, Newman said it doesn't. At the micro level he sees useful applications, such as correlation analysis and post-incident support, and mentions incident.io's work. At the macro level, he says "none of it stacks up financially." He cites what he calls a conservative economists' analysis: OpenAI, Anthropic, and the hyperscalers would need about $2.6 trillion in revenue by 2030 to justify their capital spending, while the entire software market is about $1.4 trillion. He says he isn't smart enough to know how that resolves.

What he can do is hedge. That means flexibility on models, including open-weight models from different vendors. It means multi-vendor access: he says OpenAI and Anthropic's own services have poor availability, so people he knows reach the same models through Google, Amazon, or Microsoft as primary or fallback. And it means breaking single agents into workflows so that pieces can later be replaced with deterministic code that runs more efficiently. On nondeterminism, he had argued that the shift from deterministic to nondeterministic software was a new challenge. Charity Majors corrected him: distributed systems, with their people, rabbits, and fires, were never deterministic. He now sees AI as amplifying that rather than starting something new.

1:36:32

What we misunderstand about LLMs

Newman thinks the tech world is "quite naive about AI and fundamentally misunderstands what an LLM is." Why did the LLM delete your database? Because it has no concept of causality. A person thinking about pushing a glass off a table reasons about carpet versus hard floor. LLMs don't. World models, which he says arguably predate LLMs, could in principle reason that X leads to Y and Y is forbidden. That is why he thinks guardrails around LLMs are not the right long-term solution. Because LLMs seem so smart, people overestimate them. An open question for him is where to let the LLM act and where to write deterministic code. There is "a lot to be said" for having an agent call a script you know works.

The host observed that models increasingly default to writing code for tasks like comparisons. Newman said this works because it is tractable: generated code can be validated by running it. Other areas are much worse. He used AI very little for his book and not at all for the writing. He used NotebookLM for research, then clicked every link it gave him to check the claims. He was comfortable with that because it got through far more papers, including NIST papers, than he could have read himself.

1:40:07

Cognitive debt and cognitive surrender

Newman separates two ideas. Cognitive debt, as he describes it, is the erosion of critical thinking and reasoning that can come with heavy AI use. He mentions studies on chatbot use and an article by Margaret-Anne Storey that frames it as an analogue to technical debt. When everyone goes off in different directions with AI, the shared mental model of the system breaks down, and that becomes a debt.

Cognitive surrender is "basically LGTM" applied to whatever the AI says. Newman worked on Google tooling where "LGTM" was literally pattern-matched as approval, and says the phrase has come to mean "I didn't really look at it." Now AI writes documents nobody reads and AI reads documents no person wrote. He uses an oncology example to show how workflow design matters. An AI that flags "you might have missed this" on scans makes the specialist better. An AI that says "here are the scans I've reviewed, sign off on them" turns the expert into an approver, often after other specialists have been let go, with one person as the funnel. The original promise was to free people from drudgery for critical thinking. Instead, he says, studies show more context switching, less time to think, and longer hours. He doesn't blame the technology itself, but how we are using it.

The host quoted an earlier post of his: "I worry AI could just become an exercise in doubling down on current complexity rather than stripping things back to simplify, at least in the platform space." Newman explained that platform teams exist because Kubernetes isn't developer-friendly, and he had hoped for a "complexity collapse," with newer technologies simplifying programming models. Instead everyone rushed to "AI all the things," adding new complexity on top of the old, and someone still has to maintain all of it.

Modules as the place where humans stay in the loop

Newman's response is modularity, whether the modules are deployed separately or not. Humans think carefully about the modules and the connections between them, and the AI can "go hog wild" inside boundaries that are easy to change. He sees Shopify as an example: it kept a monolith and stayed successful by structuring it as a modular, domain-driven architecture whose structure you can zoom out and understand.

Modularity also means teams don't have to make an all-or-nothing choice about "software factories" (sometimes called dark factories). One module could be run factory-style, with no one reading the code but with a specified interface and verification of what good looks like. Good candidates would be modules with strong test coverage, off the latency-critical path, or with good observability and well-defined SLOs, perhaps with extra SLOs added. More critical areas can stay collaborative with close human involvement until trust exists. Treating the whole system as one black box forces a single decision, which he thinks is unhealthy. He knows companies already all-in on factories and stresses that not everyone should be. His aim is to lower the barrier to trying these ideas safely. He notes that real-world dark factories are rare and mostly make components, not finished products.

His suggested starting point is specs: tools like Kiro, Tessl, or Spec Kit, with Böckeler's article as an on-ramp, because a factory needs a definition of good as input. Then think about verifying the output. He follows Kevlin Henney, who dislikes "non-functional requirements" (if something is non-functional, it doesn't work) and instead splits requirements into developer requirements (such as maintainability), operational requirements (latency, uptime), and business requirements (does the feature work). If you can't say what good looks like on all three, "this isn't for you," though you can still use specs. Newman admits this could be "model-driven development all over again," which he gets "very angry about," but hopes it might work this time.

Learning architecture

For engineers who want to build architectural judgment, Newman recommends Fundamentals of Software Architecture by Neal Ford and Mark Richards (noting they are friends and that he doesn't agree with everything in it) and Vlad Khononov's book on balancing coupling, which he calls fantastic. He mentions that Khononov has also built Claude skills based on its ideas, and that his DDD book is good. For Newman the core idea is still information hiding, which he says was the real subject he "smuggled" into the second edition of Building Microservices. He suggests reading David Parnas's original papers from 1971–72.

You can start modularizing within an existing codebase. The host argued there is little excuse not to experiment with AI-assisted refactoring. Newman agreed, with conditions: have a decent test suite first, and if you don't, start there. Statically typed languages already have strong IDE refactoring, and modern dynamic languages like Python and Ruby are much easier to refactor with LLMs than they used to be. The goal is for the code, and perhaps later the specs, to represent the mental model and not leave the architecture only in someone's head. He cites a pattern from George Fairbanks, an "architecturally evident coding style," and says programming languages generally have weak concepts of modules, so developers must do extra work to make architecture explicit. That is also why he likes spending time in production. When module boundaries are process boundaries, you can read the architecture off the network. You shouldn't have to, but "production is truth."

Closing

Newman points readers to the book in print and on the O'Reilly platform, to his videos on Dave Farley's Modern Software Engineering channel, and to samnewman.io for his talks, training, and consulting. Within the conversation itself, the questions he leaves open are whether specs can become a trustworthy source of truth, whether software factories will work or repeat model-driven development, and how the AI market's economics will resolve. His practical advice for all three is the same: define what good looks like, verify it in production, keep humans responsible for the boundaries, and hedge against what you can't control.