AI Engineer Code 2025

The Infinite Software Crisis

Read the talk

The Infinite Software Crisis: Keeping Human Understanding Ahead of AI-Generated Code

Selected presentation frame from The Infinite Software Crisis – Jake Nations, Netflix at 700 seconds
The Infinite Software Crisis: Keeping Human Understanding Ahead of AI-Generated Code

Jake Nations explains why faster code generation can compound accidental complexity, and how research, implementation planning, and hard-earned system knowledge help engineers remain accountable for what they ship.

From a talk by Jake Nations

At a glance

Ideas worth remembering

  • AI can dramatically accelerate implementation, but the core engineering challenge remains understanding the problem, designing the solution, and explaining the resulting system. 0:21

  • Easy means readily accessible; simple means structurally disentangled. Frictionless generation can increase complexity even when each individual change appears successful. 4:14

  • Agents may preserve both essential behavior and historical technical debt unless engineers explicitly distinguish genuine requirements from accidental complexity. 6:55

  • Use three human-validated phases—research, implementation planning, and implementation—to compress relevant system knowledge into artifacts that can be reviewed before code is generated. 10:44

  • When architectural boundaries and invariants are unclear, perform an initial migration manually and use the resulting concrete example to guide subsequent AI-assisted work. 14:29

  • Treat passing tests and generated plans as insufficient proof of production readiness; continue validating edge cases, maintainability, hidden dependencies, and the team's understanding. 15:24

The bottleneck has moved from writing code to understanding it

Selected presentation frame from The Infinite Software Crisis – Jake Nations, Netflix at 115 seconds
The bottleneck has moved from writing code to understanding it

Jake Nations begins with an uncomfortable admission: he has generated, tested, deployed, and shipped code he could not fully explain. His experience helping drive AI-tool adoption at Netflix makes the benefits equally clear: work that once took days can take hours, and long-postponed refactors become feasible. But production systems fail in unexpected ways, and passing tests do not guarantee that engineers will understand the code when they need to debug it. 0:21

He places this tension within a recurring history of software crises. As computing capability and demand expanded, successive generations adopted new languages, personal computers, object-oriented programming, Agile, cloud infrastructure, mobile development, and DevOps. Each wave increased what developers could produce, but none eliminated the difficulty of managing growing systems. AI continues that pattern while dramatically increasing the scale and speed of code generation. 1:19

Fred Brooks' No Silver Bullet provides the central distinction: the hardest part of software development is not syntax, typing, or boilerplate, but understanding the problem and designing an appropriate solution. Tools can accelerate the mechanical work without removing that underlying challenge. When generation becomes nearly immediate, the limiting factor becomes whether human comprehension can keep pace with the volume of software being created. 3:13

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:21 · section reference included

Easy code is not necessarily simple code

Selected presentation frame from The Infinite Software Crisis – Jake Nations, Netflix at 365 seconds
Easy code is not necessarily simple code

Nations uses Rich Hickey's distinction between simple and easy to explain why capable engineers still create systems they struggle to understand. Simple describes structure: components remain disentangled and each part has a clear responsibility. Easy describes accessibility: a package, copied solution, framework, or generated implementation is immediately available with little effort. Making something easy does not make its underlying structure coherent. 4:14

Before AI, teams could often absorb the tradeoff between immediate convenience and future complexity because code accumulated slowly enough to revisit and refactor. Nations argues that AI disrupts this balance by making implementation so frictionless that architectural deliberation becomes easier to skip. The immediate reward is speed; the deferred cost is a system whose behavior and dependencies become progressively harder to reason about. 5:12

His illustrative authentication scenario shows the mechanism. A straightforward auth.js implementation expands to OAuth.js, broken sessions, conflicting approaches, patched tests, and abandoned code as conversational instructions accumulate. Each request can resolve its immediate symptom while overriding earlier architectural decisions. By the twentieth interaction, the developer may be managing a tangled history of constraints rather than deliberately shaping a comprehensible system. 5:12

The deeper problem is that a coding agent can treat every existing implementation as a pattern worth preserving, including old workarounds and architectural mistakes. An authentication check and an awkward legacy gRPC pattern can both appear as equally legitimate precedent. Without human judgment about which structures should survive, generation reproduces existing complexity while adding new layers around it. 6:55

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

4:14 · section reference included

Separate essential requirements from accidental complexity

Selected presentation frame from The Infinite Software Crisis – Jake Nations, Netflix at 546 seconds
Separate essential requirements from accidental complexity

Nations distinguishes essential complexity, the difficulty inherent in the problem the software exists to solve, from accidental complexity, the accumulated machinery introduced while implementing it. Payments and order fulfillment exemplify essential requirements. Workarounds, defensive code, aging frameworks, and once-useful abstractions can become accidental complexity when they persist beyond their original purpose. In established systems, the two become intertwined, and separating them requires context, history, and experience. 6:55

A Netflix authorization migration illustrates why this distinction matters. An abstraction layer had been introduced between older authorization code and a newer centralized auth system because rebuilding the entire application was impractical. Although replacing the intermediary layer seemed like a natural AI-assisted refactor, the older authorization model was deeply embedded in business logic, data models, and permission checks spread across hundreds of files. 7:53

The agent could make progress in a few files before encountering dependencies it could not cleanly untangle, or it could reproduce assumptions from the old system using the new one. The problem was not merely insufficient code visibility: the boundary between authorization behavior and business behavior was itself obscured. Nations argues that engineers must identify those architectural seams and distinguish actual requirements from historical implementation choices before asking AI to execute the migration. 8:52

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

6:55 · section reference included

Compress system understanding into research, planning, and implementation

Selected presentation frame from The Infinite Software Crisis – Jake Nations, Netflix at 735 seconds
Compress system understanding into research, planning, and implementation

The scale of Nations' codebase forced a more selective approach. He describes approximately a million lines of Java and a main service comprising roughly five million tokens, beyond the context windows available to him. Supplying large portions of the code directly did not reveal a clean architectural picture; instead, the generated output became lost in the same complexity. He therefore selected relevant design documents, architecture diagrams, interfaces, component interactions, and behavioral requirements, reducing the problem into an approximately 2,000-word specification and a precise execution sequence. 9:50

The first phase is research. Relevant documentation, architectural material, Slack threads, and codebase analysis help the agent map components, dependencies, and the likely impact of a proposed change. This phase is iterative: the engineer probes areas such as caching and failure handling, supplies missing context, and corrects mistaken analysis. Its deliverable is a research document describing what exists, how the pieces connect, and what the change will affect; critically, a human validates that document against the actual system before proceeding. 10:44

The second phase is implementation planning. Using the validated research, the engineer develops a concrete plan covering code structure, function signatures, type definitions, data flow, service boundaries, and complex business logic. This is where architectural decisions are made explicitly and unnecessary coupling can be identified early. Nations emphasizes that a sufficiently detailed plan can be reviewed quickly and followed predictably, allowing comprehension to keep pace with subsequent code generation. 11:43

The final phase is implementation against the approved plan. Instead of allowing a lengthy conversation to repeatedly reshape the design, the workflow produces three focused, sequentially validated artifacts: research, plan, and implementation. A background agent can handle much of the mechanical coding while the engineer works elsewhere, and review becomes a matter of checking whether the implementation conforms to the agreed design. The intended division of labor is clear: AI accelerates execution, while humans retain synthesis, judgment, and architectural responsibility. 12:40

How it fits togetherResearch-to-implementation workflow

Map components, dependencies, and change impact.

Validate system understanding before defining architecture and generating implementation.

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

9:50 · section reference included

Earn the understanding before trying to automate it

Selected presentation frame from The Infinite Software Crisis – Jake Nations, Netflix at 931 seconds
Earn the understanding before trying to automate it

The authorization migration also exposes an important limitation of the three-phase method: it could not begin effectively until the team performed an initial migration manually. Engineers read the existing code, traced dependencies, changed the implementation, and observed what broke. That difficult exercise uncovered hidden constraints, necessary invariants, and services affected by authorization changes—knowledge that Nations says code analysis alone had not surfaced. 14:29

The team then used the manually created pull request as a concrete example for subsequent research. Even with that reference, individual entities differed, including whether some data was encrypted, so engineers had to supply additional context and interrogate the analysis case by case. Nations is explicit that the resulting plans might work, not that they are guaranteed to work: the team remained in the process of validating, adjusting, and discovering edge cases. 14:29

This limitation reinforces the larger argument. There is no promised rescue through better prompts, larger models, or more polished specifications alone. Code that passes tests is not automatically code that will survive production or remain understandable to future maintainers. Safe automation depends on acquiring enough knowledge of the system to recognize meaningful boundaries, preserve necessary invariants, and judge whether generated changes actually solve the right problem. 15:24

Nations also warns that repeatedly skipping the thinking required to understand generated systems can weaken engineers' ability to recognize dangerous architectural patterns. That judgment develops through experience maintaining difficult systems and confronting failures. His proposed workflow preserves reviewable artifacts that compress understanding without outsourcing it. The defining question is not whether AI will write more software, but whether the people responsible for that software will still understand the systems they operate. 16:28

How it fits togetherEarn understanding before automation

Read code, trace dependencies, and make changes.

A manual migration establishes the concrete knowledge needed for later assisted migrations.

Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

14:29 · section reference included

Read the complete timestamped transcript
  1. 0:12

    [upbeat electronic music] Hey everyone, good afternoon. Um, I'm gonna start my talk with a bit of a confession. Uh, I shipped code I didn't quite understand.

  2. 0:29

    Generated it, tested it, deployed it, couldn't explain how it worked. And here's the thing, though, I'm willing to bet every one of you have too. [audience laughing]

  3. 0:40

    So now that we can all admit that we all ship code that we don't understand anymore, I wanna take a bit of a journey, see how this kind of has come to be.

  4. 0:46

    First, look back in history. We see that history tends to repeat itself. Second, we've fallen into a bit of a trap. We've confused easy with simple. Lastly, there is a fix, but it requires us not to outsource our thinking.

  5. 1:01

    So I spent the last few years at Netflix helping drive adoption of AI tools, and I have to say the acceleration is absolutely real. Backlog items that used to take days now take hours, and large refactors that have been on the books for years are finally being done.

  6. 1:15

    Here's the thing, though. Large production systems always fail in unexpected ways, like look what happened with Cloudflare recently. When they do, you better understand the code you're debugging, and the problem is now we're generating code at such speed and such volume, our understanding is having a hard time keeping up.

  7. 1:32

    Hell, I know I've done it myself. I've generated a bunch of code, looked at it and thought, "I, I have no idea how this-- what this does." But, you know, the tests pass, it works, so I shipped it.

  8. 1:42

    The thing here is this isn't really new. Every generation of software engineers has eventually hit a wall where software complexity has exceeded their ability to manage it. We're not the phase-- first to face a software crisis, we're the first to face it at this infinite scale of generation.

  9. 1:56

    So let's take a step back to see where this all started.

  10. 1:59

    In the late '60s, early '70s, a bunch of smart computer scientists at the time came together and said, "Hey, we're in a software crisis. We have this huge demand for software, and yet we're not really able to keep up and, like, projects are taking too long, and it's just really slow.

  11. 2:15

    We're not doing a good job." So Dijkstra kinda came up with a really great quote, and he said, "When we had a few weak computers," and I mean to paraphrase the longer quote, "When we had a few weak com- computers, programming was a mild problem, and now with gigantic computers, programming has become a gigantic problem."

  12. 2:30

    He was explaining as hardware power grew by a factor of a thousand, society's wants of software grew in proportion. And so it left us, the programmers, to figure out between the ways and the means, how do we support this much more software?

  13. 2:44

    So this kinda keeps happening in a cycle. In the '70s, we get the C programming language, so we could write bigger systems. The '80s, we have personal computers. Now everyone can write software.

  14. 2:53

    In the '90s, we get object-oriented programming. Inheritance hierarchies from hell were... You know, thanks Java for that. In the 2000s, we get Agile, and we have sprints and scrum masters telling us what to do.

  15. 3:05

    There's no more waterfall. In the 2010s, we had cloud, mobile, DevOps, you know everything. Software truly ate the world.

  16. 3:13

    And today, now we have AI. You know, Copilot, Cursor, Claude, Codex, Gemini, you name it. We can generate code as fast as we can describe it. The pattern continues, but the scale has really changed.

  17. 3:22

    It's, it's infinite now. So, uh, Fred Brooks, who you might know him from writing The Mythical Man-Month, he also wrote a paper in 1986 called No Silver Bullet, and in this, he argued that there'd be no single innovation that would give us an order of magnitude improvement in software productivity.

  18. 3:39

    Why? Because he said the hard part wasn't in ever the mechanics of coding, the syntax, the typing, the boilerplate. It was about understanding the actual problem and designing the solution, and no tool can eliminate that fundamental difficulty.

  19. 3:52

    Every tool and technique we've created up until this point makes the mechanics easier. The core challenge, though, understanding what to build, how it should work, remains just as hard.

  20. 4:03

    So if the problem isn't in the mechanics, why do we keep optimizing for it? How do experienced engineers end up with code they don't understand now? The answer, I think, comes down to two words we tend to confuse, simple and easy.

  21. 4:14

    We tend to use them interchangeably, but they really mean completely different things. Uh, I was outed at the speaker dinner as being a Clojure guy, so this is kind of clear here, but Rich Hickey, the creator of the Clojure programming language, explained this in his talk from 2011 called Simple Made Easy.

  22. 4:29

    He defined simple meaning one fold, one braid, and no entanglement. Each piece does one thing and doesn't intertwine with others. He defines easy as meaning adjacent, what's within reach.

  23. 4:39

    What can you access without effort? Copy, paste, ship. Simple is about structure. Easy is about proximity.

  24. 4:48

    The thing is, we can't make something simple by wishing it so. Simplicity requires thought, design, and untangling. But we can always make something easier. You just put it closer.

  25. 4:57

    Install a package. Generate it with AI. You know, copy a solution off of Stack Overflow. It's hu-- It's human nature to take the easy path. We're wired for it.

  26. 5:07

    You know, as I said, copy something from Stack Overflow. It's right there. Framework that handles everything for you with magic? Install and go. But easy doesn't mean simple. Easy means you can add to your system quickly.

  27. 5:18

    Simple means you can understand the work that you've done. Every time we choose easy, we're choosing speed now, complexity later, and honestly,

  28. 5:25

    that trade-off really used to work. The complexity accumulated in our codebases slowly enough that we can refactor, rethink, and rebuild when needed. I think AI has destroyed that balance 'cause it's the ultimate easy button.

  29. 5:37

    It makes the easy path so frictionless that we don't even consider the simple one anymore. Why think about architecture when code appears instantly?

  30. 5:46

    So let me show you how this happens, how a simple task evolves into a mess of complexity through a conversational interface that we've all come to love. You know, this is a contrived example, but, you know, say we have our app, we wanna add, uh, some authentication to it.

  31. 5:58

    We say add auth, so we get a nice clean auth.js file. Iterate on it a few times, it gives a message five. You're like, "Okay, cool. We're gonna add OAuth now too," because...

  32. 6:05

    And now we've got an auth.js and OAuth.js. We keep iterating. You know, we find ourselves that sessions are broken.

  33. 6:11

    And we got a bunch of conflicts. And by the time you get to turn 20, you're not really having a discussion anymore. You're managing context that's become so complex that even you don't remember all the constraints that you've added to it.

  34. 6:20

    Dead code from abandoned approaches, uh, tests that got fixed by just making them work. You know, fragments of three different solutions because you kept saying, "Wait, actually." Each new instruction is overwriting architectural patterns.

  35. 6:31

    We said make the auth work here. It did. And we said fix this error. It did. There's no resistance to bad architectural decisions. The code just morphs to satisfy your latest request.

  36. 6:40

    Each interaction is choosing easy over simple, and easy always means more complexity. We know better, but when the easy path is just this easy, we take it, and complexity is going to compound until it's too late.

  37. 6:55

    AI really takes easy to its logical extreme. Decide what you want, get code instantly. But here's the danger in that. The generated code treats every pattern in your codebase the same.

  38. 7:07

    You know, when an agent analyzes your codebase, every line becomes a pattern to preserve. The authentication check on line 47, that's a pattern. That weird gRPC code that's acting like GraphQL that I may have had in 2019, that's also a pattern.

  39. 7:19

    Technical debt doesn't register as debt. It's just more code. The real problem here is complexity. I know I've been saying that word a bunch in this talk without really defining it, but the best way to think about it is it's the opposite of simplicity.

  40. 7:31

    It just means intertwined. And when things are complex, everything touches everything else. You can't change one thing without affecting 10 others.

  41. 7:41

    So back to Fred Brooks' No Silver Bullet paper. In it, he identified that there's two main types of complexity in every system. There's the essential complexity, which is really the fundamental difficulty of the actual problem you're trying to solve.

  42. 7:53

    Users need to pay for things. Orders must be fulfilled. This is the complexity of why your software system exists in the first place. And then second, there's this idea of accidental complexity.

  43. 8:03

    Everything else we've added along the way, workarounds, defensive code, frameworks, abstractions that made sense a while ago. It's all the stuff that we put together to make the code itself work.

  44. 8:13

    In a real codebase, these two types of complexity are everywhere, and they get so tangled together that separating them requires context, history, and experience.

  45. 8:21

    The generated output makes no such distinction, and so every pattern is-- keeps just getting preserved.

  46. 8:29

    So here's a real example from, uh, some work we're doing at Netflix. I have a system that has a abstraction layer sitting between our old authorization code we wrote, say, five or so years ago and a new centralized auth system.

  47. 8:41

    We didn't have time to rebuild our whole app, so we just kinda put a shim in between. So now we have AI. This is a great opportunity to refactor our code to use the new system directly.

  48. 8:49

    Seems like a simple request, right? Uh, no. It's like the old code was just so tightly coupled to its authorization patterns. Like, we had permission checks woven through business logic, role assumptions baked into data models, and auth calls scattered across hundreds of files.

  49. 9:04

    The agent would start refactoring, get a few files in and hit a dependency it couldn't untangle, and just spiral out of control or give up, or worse, it would try and preserve some existing logic that-- from the old system and recreating it using the new system, which I think is not great too.

  50. 9:21

    The thing is, it couldn't see the seams. It couldn't identify where the business logic ended and the auth logic began. Everything was so tangled together that even with perfect information, the AI couldn't find a clean path through.

  51. 9:33

    When your accidental complexity gets this tangled, AI's not the best help to actually make it any better. I found it only adds more layers on top.

  52. 9:42

    We can tell the difference, or at least we can when we slow down enough to think. We know which patterns are essential and which are just how someone solved it a few years ago.

  53. 9:50

    We carry the context that the AI can't infer, but only if we time to make-- take time to make these distinctions before we start.

  54. 9:59

    So how do you actually do it? How do you separate the accidental and essential complexity when you're staring at a huge codebase? The codebase I work on at Netflix has around a million lines of Java, and the main service in it is about five million tokens last time I checked.

  55. 10:13

    No context window I have access to, uh, can hold it. So when I wanted to work with it, I first thought, "Hey, maybe I can just copy large swaths of this codebase into the, into the context and see if the patterns would emerge, see if it would just be able to figure out what's happening."

  56. 10:26

    And just like the authorization refactor from previously, it's-- the output just got lost in its own complexity. So with this, I was forced to do something different. I had to, to select what to include, design docs, architecture diagrams, key interfaces, you name it, and take time writing out the requirements of how components should interact and what patterns

  57. 10:42

    to follow. See, I was writing a spec. Uh, five million tokens became two thousand words of specification. And then to take it even further, take that spec and create an exact step-- set of steps of code to execute.

  58. 10:55

    No vague instructions, just a precise sequence of operations. I found this produced much cleaner and more focused code that I could understand, as I defined it first and planned its own execution.

  59. 11:08

    This became the approach which I called context compression a while ago, but you call it context engineering or spec-driven development, whatever you want. The name doesn't matter. What only matters here is that thinking and planning become a majority of the work.

  60. 11:20

    So let, let me walk you through the-- how this works in practice.

  61. 11:24

    So you have step one, phase one, research. You know, I go and feed everything into it up front. Architecture diagrams, documentation, Slack threads. I mean, been over this a bunch.

  62. 11:32

    But really just bring as much context as you can that's gonna be relevant to the changes you're making. And then use the agent to analyze the codebase and map out the components and dependencies.

  63. 11:42

    This shouldn't be a one-shot process. I like to probe. Say, like, "What about the caching? How does this handle failures?" And when its analysis is wrong, I'll correct it, and if it's missing context, I provide it.

  64. 11:51

    Each iteration refines its analysis. The output here is a single research document. Here's what exists, here's what connects to what, and here's what your change will affect. Hours of exploration are compressed into minutes of reading.

  65. 12:05

    I know Dex mentioned it this morning, but the human checkpoint here is critical. This is where you validate the analysis against reality, the highest leverage moment in the entire process.

  66. 12:15

    Catch errors here, prevent disasters later. On to phase two. Now that you have some valid research in hand, we create a detailed implemen- implementation plan, real code structure, function signatures, type definitions, data flow.

  67. 12:28

    You want this to be so any developer can follow it. I, I kind of liken it to paint by numbers. You should be able to hand it to your most junior engineer and say, "Go do this."

  68. 12:35

    And if they copy it line by line, it should just work.

  69. 12:40

    This step is where we make a lot of the important architectural decisions. You know, make sure complex logic is correct, make sure business requirements are, you know, following good practice, make sure there's good service boundaries, clean separation, and preventing any unnecessary coupling.

  70. 12:54

    We spot the problems before they happen because we've lived through them. AI doesn't have that option. It treats every pattern as a requirement.

  71. 13:02

    The real magic in this step is the review speed. We can validate this plan in minutes and know exactly what's going to be built. And in order to keep up with the speed of, speed at which we wanna generate code, we need to be able to comprehend what we're doing just as fast.

  72. 13:18

    Lastly, we have implementation, and now that we have a clear plan and, like, backed by clear research, this phase should be pretty simple, and that's the point. You know, when AI has a clear specification to follow, the context remains clean and focused.

  73. 13:32

    We've prevented the complexity spiral of long conversations, and instead of 50 messages of evolutionary code, we have 30 focused outputs, each validated before proceeding. No abandoned approaches, no conflicting patterns, no wait, actually moments that leave dead code everywhere.

  74. 13:48

    To me, what I see as a real payoff of this is that you can use a background agent to do a lot of this work 'cause you've done all the thinking and hard work ahead of time.

  75. 13:56

    It can just start the implementation. You can go work on something else and come back to review, and you can review this quickly because you're just verifying that it's conforming to your plan, not trying to understand if anything got invented.

  76. 14:10

    The thing here is we're not using AI to think for us. We're using it to accelerate the mechanical parts while maintaining our ability to understand it. Research is faster, planning is more thorough, and the implementation is cleaner.

  77. 14:21

    The thinking, the synthesis, and the judgment, though, that remains with us.

  78. 14:29

    So remember that, uh, authorization refactor I said that AI couldn't handle? The thing is now we're actually, you know, working on it now and starting to make some good progress on it.

  79. 14:39

    The thing is, it's not because we found better prompts. We found we couldn't even jump into doing any sort of research, planning, and implementation. We actually had to go make this change ourself by hand.

  80. 14:49

    No AI, just reading the code, understanding dependencies, and making changes to see what broke. That manual migration was, uh, I'll be honest, was a pain, but it was crucial.

  81. 14:59

    It revealed all the hidden constraints, which invariants had to hold true, and which services would break if the auth changed, things no amount of code ana- analysis would've surfaced for us.

  82. 15:09

    And then we fed that pull request of the actual manual migration into our research process and had it use that as the seed for any sort of research going forward.

  83. 15:19

    The AI could then see what a clean migration looks like. The thing is, each of these entities are slightly different, so we have to go and interrogate it and say, "Hey, what do we about...

  84. 15:28

    do about this?" Some things are encrypted, some things are not. We had to provide that extra context each time, uh, through a bunch of iteration.

  85. 15:37

    Then, and only then, we could generate a plan that might work in one shot, and the keyword... and might's the key word here is we're still validating, still adjusting, and still discovering edge cases.

  86. 15:51

    The three-phase approach is not magic. It only works because we did this one migration by hand. We had to earn the understanding before we can encode into our process.

  87. 16:01

    I still think there's no silver bullet. I don't think there's better prompts, better models, or even writing better specs, just the work of understanding your system deeply enough that you can make changes to it safely.

  88. 16:14

    So why go through with all this? Like, why not just iterate with AI until it works? Like, eventually, won't models get strong enough and it just works? The thing to me is it works isn't enough.

  89. 16:24

    There's a difference between code that passes test and code that survives in production, between systems that function today and systems that, that can be changed by someone else in the future.

  90. 16:35

    The real problem here is a knowledge gap. When AI can generate thousands of lines of code in seconds, understanding it could take you hours, maybe days if it's complex.

  91. 16:46

    Who knows? Maybe never if it's really that tangled. And here's something that I don't think many people are even talking about at this point. Every time we skip thinking to keep up with generation speed, we're not just adding code that we don't understand.

  92. 16:58

    We're losing our ability to recognize problems. That instinct that says, "Hey, this is getting complex," it atrophies when you don't understand your own system.

  93. 17:09

    Pattern recognition comes from experience. When I spot a dangerous architecture, it's because I'm the one up at 3:00 in the morning dealing with it. When I push for simpler solutions, it's because I've had to maintain the alternative from someone else.

  94. 17:21

    AI generates what you ask it for. It doesn't encode lessons from past failures.

  95. 17:27

    The three-phase approach bridges this gap. It compresses understanding into artifacts we can review at the speed of generation. Without it, we're just accumulating complexity faster than we can comprehend it.

  96. 17:40

    AI changes everything about how we write code, but honestly, I don't think it changes anything about why software itself fails. Every generation has faced their own software crisis. Dijkstra's generation faced it by creating the discipline of software engineering, and now we face ours with infinite code generation.

  97. 17:58

    I don't think the solution is another tool or methodology. It's remembering what we've always known, that software is a human endeavor. The hard part was never typing the code.

  98. 18:06

    It was knowing what to type in the first place. The developers who thrive won't just be the ones who generate the most code. They'll be the ones who understand what they're building, who can still see the seams, who can recognize that they're solving the wrong problem.

  99. 18:19

    That's still us. That will only be us.

  100. 18:23

    I wanna leave on a question, and I don't think the question is whether or not we will use AI. That's a foregone conclusion. The ship has already sailed. To me, the question's gonna be whether we will still understand our own systems when AI is writing most of our code.

  101. 18:37

    Thank you. [upbeat music]