← All talks

AI Engineer NYC 2026 Main stage · 16 min

Does Code Quality Even Matter?

Max Kanat-AlexanderCapital One

Cheap code makes some programs disposable. For the systems people will keep changing, Max Kanat-Alexander argues that AI should make engineering rigor cheaper too.

What quality buys

1:11:13 ↗

A program that prints “Hello World” is easy to understand and change. Ask it to print “Hi World,” and there is little room for misunderstanding. Chromium is a different proposition: its components can interact in too many ways to describe the whole system’s behavior in a short explanation.

Max Kanat-Alexander starts the code-quality debate by asking why quality mattered in the first place. His answer has two parts: understanding a system and acting successfully on that understanding. Tests, debuggers, observability, and evaluations help with those jobs.

For an engineer, the crucial questions are what the system actually does and how to change that behavior safely. A component such as Chromium’s URL parser has an identity and a behavior that can be described. That structure allows reasoning to happen at a manageable scale.

Code quality gives the system recognizable parts. When the URL parser has a clear job, an engineer can reason about changing it without understanding all of Chromium at once. A pile of instructions might produce the same output today; its structure determines how hard tomorrow’s change will be. Watch the structure argument at 1:12:46.

The cost compounds when software must change

1:15:00 ↗

Every modification carries two kinds of risk. It can cause a problem now: a bug, unexpected behavior, a budget overrun, or a project that takes much longer than expected. It can also make future changes more dangerous by making the system harder to understand.

The second feeds the first. If each change adds confusion, the next change starts from a worse position. Eventually even small modifications become expensive and uncertain. Engineering rigor pays for itself by slowing that accumulation of confusion.

Arguments about future models understanding arbitrary complexity do not settle what to do today. AI coding tools are already changing another variable: the cost of replacing a program. Some software can now be created for a narrow purpose and thrown away when that purpose ends.

A spectrum of disposability

1:17:35 ↗

Imagine software with minimal consequences of failure, few users and dependencies, almost no maintenance burden, and a replacement cost of hours rather than months. A personal calculator or a tool for one children’s party fits the idea. If it fails, rebuilding or abandoning it may be the right response.

That is disposable software. The long-term risks that justify extensive engineering effort are small because there may be no long term to protect. A system used by thousands of people, relied on by other systems, and capable of causing serious business harm sits at the other end of the spectrum.

Kanat-Alexander uses four factors to reason about the difference:

  • Consequences of failure: what happens when the software breaks?
  • Replacement cost: how difficult is it to discard and recreate?
  • Dependencies: who and what relies on it?
  • Maintenance cost: how much continuing work does it demand?

How much rigor a program needs depends on where it sits along this spectrum.

A spectrum links more disposable software with less rigor, and more durable software with more rigor.

At 1:19:45, disposability changes the amount of engineering effort worth investing. It is a continuum, not a certification that a program can never become important.

The categories are not permanent labels. A tool can become more important than expected, and experienced engineers should be cautious about assuming a system will remain disposable. He expects lasting systems to remain important, even if short-lived software becomes much more numerous.

Teams can also deliberately increase disposability. Put a tool in an isolated environment with only the user’s own data. Prevent production systems from depending on it. Keep a reliable older system available while people experiment with a more convenient frontend. Limit the purpose to one person or one event. These choices reduce the cost of failure instead of merely hoping failure will be harmless. Watch the examples at 1:20:13.

Make rigor the cheap path

1:22:23 ↗

There is another axis besides how much rigor a program needs: how much that rigor costs. Reducing the cost makes it easier to recover when a supposedly disposable tool becomes important.

Standardization helps by removing possibilities that every team would otherwise need to manage. Supporting fewer languages, frameworks, and protocols means fewer combinations of security practices, linters, and operational knowledge. The reason is economic: each extra option makes consistent engineering more expensive.

Tooling should also work inside the normal development workflow. A fast, reliable check with few false positives can run without requiring the programmer to decide to use it or become an expert in its implementation. When it feels nearly free, it can help even with disposable software.

Testing infrastructure is part of the same work. Engineers should not have to solve test speed and determinism from scratch for every project. Kanat-Alexander gives in-memory service fakes as an example of infrastructure coding agents can help produce. Someone still has to decide to provide those fakes and make them available to other teams.

Finally, strong defaults avoid expensive cleanup later. Enabling lint rules early can eliminate repeated arguments and prevent a huge retrofit across an established codebase. His endorsement of strictness comes with a practical condition: the tooling’s false positives must remain low enough that it does not create serious harm of its own.

For software that is truly disposable, Kanat-Alexander is willing to say code quality does not matter. For software that must last, it does. His challenge to engineering teams is to make the useful checks so cheap that even a disposable tool can afford them.

Full transcript

Timestamps follow the original livestream. Select a time to watch that moment. Transcripts are machine-generated with reviewed name and terminology corrections; occasional recognition errors may remain.

1:10:28

All right.

1:10:30

So today I figured I'd pick a nice uncontroversial topic that nobody has any opinions about.

1:10:35

Right?

1:10:36

Nobody has said anything on this about social media.

1:10:40

And of course every take about this on social media is really deeply nuanced.

1:10:46

People have lots of depth and really big thoughts.

1:10:49

You know, maybe there's a little bit more to it than like yes or no.

1:10:54

And, you know, of course, if you ever ask a senior engineer a question, we always have

1:10:58

the same answer to every question, every senior engineer's favorite answer to every question,

1:11:02

which is, it depends.

1:11:06

Now, that's not a very helpful answer, though, frankly, because what does it depend on?

1:11:12

So let's start with this.

1:11:15

Why did code quality ever matter in the first place?

1:11:17

I see a lot of people be like, well, it made me feel good.

1:11:20

That's not really a sufficient justification.

1:11:22

So let's see if we can inject some nuance into this conversation and help everybody at

1:11:27

least be able to have a basis for reasoning about it while we're discussing it.

1:11:30

So let's see if we can make a framework here.

1:11:32

That's what we're going to try to do with this talk.

1:11:35

So we're going to start off with everything you want to ever accomplish with a piece of

1:11:39

software depends on two factors and two factors alone.

1:11:42

And that is understanding and executing on that understanding.

1:11:45

Whether that's aligning a model, scaling a system, driving adoption, anything, all software

1:11:50

success is determined by these two factors.

1:11:53

This is why we have things like debuggers and observability and evals and even tests.

1:11:58

All those things actually are there to improve your understanding or ability to execute on

1:12:01

that understanding.

1:12:02

People think that they're there for other reasons, but fundamentally they're there for that reason.

1:12:06

Everything we have ever done in the field of code quality is exclusively and only for

1:12:13

these two things.

1:12:14

It's not for anything else.

1:12:15

And that doesn't have something to do with correctness or something else.

1:12:17

It has to do only with these two things.

1:12:20

Now, there's two understandings that are the most important to have

1:12:23

if you're going to be a software engineer.

1:12:24

There are other understandings to have about software,

1:12:27

if you're going to be a product, if you're going to be in sales.

1:12:29

But if you're a software engineer, there's the two that are the most important.

1:12:31

And the first is, what is the behavior of the system?

1:12:35

Like, concretely, not what does a doc say the behavior of the system is,

1:12:38

but what is the actual behavior of the system?

1:12:40

And the second one is, how do I correctly and safely modify that behavior?

1:12:47

On a very small system, if you want to understand what the system does,

1:12:52

I just tell you what it does.

1:12:54

It prints hello world.

1:12:55

You say, I wanted to say hi world.

1:12:57

I say, okay, I will make it say hi world now.

1:13:00

There's very little to understand about it other than purely what it does.

1:13:04

That's all of the understanding that you need.

1:13:06

However, any real software system is enormously complex.

1:13:10

This is a real map of the code base of Chromium,

1:13:15

which is the open source project behind Chrome.

1:13:18

And if you think about all of the different ways

1:13:21

that these components can interact,

1:13:23

they have essentially infinite possible behaviors.

1:13:26

Like, I could not describe to you in words

1:13:29

the behavior of Chromium as a whole, as a system.

1:13:34

However, what I can describe to you, and as we all know, everybody's been a software engineer

1:13:39

for a while, I can describe to you components of the system.

1:13:42

I can successfully describe to you how a component of the system behaves.

1:13:47

So this is the URL parser, the actual functions and stuff for the URL parser of Chromium.

1:13:52

It figures out all the different parts of the URL.

1:13:56

And this is the whole reason that code exists.

1:14:01

The whole reason that we have code at all in the first place is for structure.

1:14:08

What do I mean by that?

1:14:12

Both of these two things on the left and on the right will print Hello World if run on

1:14:17

a Linux machine.

1:14:18

However, on the left you can see that it is Hello World.

1:14:23

It has the identity and structure of Hello World.

1:14:26

On the right, you just see a series of instructions with no particular identity, recognizable

1:14:32

or understandable identity.

1:14:33

It's not a component.

1:14:34

It's just a bunch of instructions.

1:14:36

While that's understandable there, if that was millions or billions of lines of that,

1:14:40

it would be much harder to grok.

1:14:42

In the past, we've talked about things like readability or testability or things that

1:14:48

seemed like human concepts about code.

1:14:50

But what actually mattered the most always was that the system had some sort of understandable

1:14:55

structure.

1:14:56

So it's the structure that actually matters.

1:14:59

And when this matters the most is when you want to modify the system, the second understanding

1:15:06

that we talked about.

1:15:08

All modifications to a system carry two categories of risk.

1:15:11

The first is that you will introduce some sort of problem.

1:15:14

And a problem isn't just a bug, it's anything bad that could happen.

1:15:18

Like your project could take much longer than you expect.

1:15:21

It could not behave in the way that you wanted it to for your users.

1:15:24

The project could fail because you have budget overruns.

1:15:27

Any kind of problem could happen from just you trying to go through the process of making this change.

1:15:32

And the second is you could make it harder to make future changes.

1:15:36

In particular, what that means is you could make it more likely to have future problems.

1:15:39

You could increase future risk of the system.

1:15:42

These two things are caused by problems with understanding.

1:15:48

So the first has to do with the difficulty of understanding the system in the first place.

1:15:53

And the second is you make the system harder to understand.

1:15:58

can reduce every post-mortem I have ever read for any incident to these two factors

1:16:03

in one way or another.

1:16:05

The production configuration was too hard to understand.

1:16:08

Somebody made something impossible to understand.

1:16:09

There were emergent properties of the system that were impossible to understand.

1:16:12

Whatever.

1:16:13

Point two feeds into point one in a vicious cycle that compounds in a non-linear fashion.

1:16:23

So the difficulty of understanding does not grow linearly, it compounds over time.

1:16:28

You will eventually reach a point, and all systems eventually tend to reach this point,

1:16:33

where every modification involves some sort of problem.

1:16:40

Some systems get to the point where you can't modify them at, if you think of your giant

1:16:47

100 million, 500 million line mainframe code bases, everything, every change is some sort

1:16:52

of problem.

1:16:53

You'll see it in organizational issues, you'll see it all over the place, you'll see it in

1:16:56

timelines, whatever.

1:16:58

And look, there's a lot of arguments about maybe future models will fix this.

1:17:02

Look, maybe they will, maybe future models will have infinite ability to deal with complexity

1:17:05

somehow.

1:17:07

But we don't have to discuss that today because I think models are doing something else really

1:17:12

interesting right now.

1:17:13

They are creating a new kind of software, a new category of software.

1:17:18

This category has always existed, but it's about to become 100,000 times more common

1:17:26

than any other form of software, and that is disposable software.

1:17:32

So what is that?

1:17:34

Okay, so imagine a world in which the consequences of failure for your system are very minimal

1:17:41

or nonexistent.

1:17:42

Imagine that there's very few people that depend on it, and almost no other systems depend

1:17:47

on that piece of software.

1:17:48

Change management, very minimal, non-existent.

1:17:52

Imagine the cost of replacement went to near zero.

1:17:56

You could replace the whole thing in hours or days.

1:17:58

And it had basically no cost of maintenance.

1:18:01

In that world, code quality does not matter.

1:18:08

Because all of those things we were trying to prevent

1:18:11

about the compounding risks over time don't exist.

1:18:17

Traditionally, we've always built durable software.

1:18:22

lives for years, it's depended on millions or thousands of people, there's huge consequences

1:18:26

of failure, potentially business catastrophic consequences of failure, and it requires enormous

1:18:31

maintenance.

1:18:32

Most of the software engineers in the world spend most of their time maintaining these

1:18:36

giant durable systems.

1:18:38

I expect this to continue to exist.

1:18:41

So this is one of the areas where I think sometimes the conversation goes a little astray.

1:18:46

Durable systems will continue to probably be the most important systems in the world.

1:18:54

And there will be probably more of them.

1:18:56

But the most numerous systems will be disposable software.

1:19:02

They will be replaceable in hours.

1:19:04

They will be depended on by a few.

1:19:06

Or change management just won't matter.

1:19:08

And look, if it doesn't work, we'll give everybody agents.

1:19:11

They'll make a version of it themselves.

1:19:14

Maintenance will be unimportant or nearly free.

1:19:16

Don't like the calculator on your OS?

1:19:18

Make your own.

1:19:19

Want to plan a party for your kids?

1:19:21

Write a party planner software just for that one party.

1:19:26

Throw it away.

1:19:27

Code quality doesn't matter.

1:19:27

Nobody cares.

1:19:29

In the future, we will apply engineering rigor to the degree of disposability of the software.

1:19:36

On the left, nothing, none of our practices of engineering rigor matter at all.

1:19:42

On the right, all the practices of engineering that we have built up over the last many decades

1:19:47

matter greatly.

1:19:49

We can determine where you are on this scale by those four factors that I have been talking

1:19:54

about.

1:19:55

Consequences, cost of replacement, dependencies, and cost of maintenance.

1:19:58

If they're all low, it's

1:20:00

disposable software. If they're all high, it's durable software.

1:20:03

And look, any person who's written software for a long time knows you should err on the side of it being durable. You should err on these all being higher than you expect them to be.

1:20:12

But there's also a new thing you can do in the world. You can make software more disposable. So, like, what does that involve?

1:20:22

Well, come up with better isolated environments.

1:20:26

So, hey, you can only deploy to this environment that has access to only your data.

1:20:30

No customer data, no personally identifiable information, whatever.

1:20:34

You can enforce independence.

1:20:37

You can say, okay, no inbound API calls from other production systems are allowed to this

1:20:42

system in this environment.

1:20:43

And so everything deployed to that environment is disposable.

1:20:47

Redundancy.

1:20:47

You can have an old clunky backup system that is hard to use.

1:20:52

And then, look, if people want to vibe code their own more efficient front ends,

1:20:55

you let them vibe code their own more efficient front ends

1:20:57

because there is an old, durable, clunky backup system that they can use

1:21:01

if their crappy little vibe-coded thing fails.

1:21:04

Which it will fail. That's fine. But it doesn't matter if it fails.

1:21:08

And you can limit scope, just like I talked about.

1:21:10

It's just a calculator for this one person.

1:21:13

It just plans this one party.

1:21:14

There's so much more we could do here and talk about ways of increasing disposability.

1:21:21

In fact, I think this is a whole new discipline of software engineering.

1:21:26

Not to think about how we improve the rigor of durable systems, but how do we take our

1:21:32

systems and how do we encourage disposability or allow more disposability, allow people

1:21:37

to throw these things away.

1:21:38

Interesting thought.

1:21:39

Now, I want to re-emphasize that durable software engineering is not going away because this

1:21:46

is the biggest confusion that I see on social media today.

1:21:50

In fact, I believe the absolute amount of durable software in the world will increase

1:21:54

because AI coding tools make it easier and easier to make more durable software.

1:22:01

another important thing to understand is that disposable and durable are not black

1:22:06

and white.

1:22:07

There's a spectrum, like I showed before, but that spectrum, what changes across the

1:22:11

spectrum is how much effort you're going to put into engineering rigor.

1:22:16

Okay?

1:22:17

And that's both immediate effort and effort over time, just like we've always talked about

1:22:20

for software.

1:22:22

However, what you want to do, and I think what you want to care about the most, is reducing

1:22:27

the cost of effort.

1:22:30

Reducing the cost of rigor.

1:22:33

like if rigor is cheaper if it's the easier and easier you make it to be rigor the less you have

1:22:38

to worry about where you are on the scale so this is another approach you can take

1:22:44

if you change your mind it's much easier to like you're like oh i thought this was going to be

1:22:48

disposable and now it needs to be durable the cheaper you make it to make it durable the easier

1:22:53

it is to change your mind or to be wrong because you're never going to be 100 right all the time

1:22:58

on that estimate. So that involves a different set of practices that are not engineering

1:23:04

rigor themselves, but that are about how to decrease the cost of engineering rigor.

1:23:10

Now, I could talk about this for hours. I have spent a tremendous amount of my career

1:23:14

doing this. I don't have 10 hours. I have about five minutes left on that timer. So

1:23:19

I'll talk about what I can, okay? Let's talk about standardization. Why do we do standardization?

1:23:26

People are like, well, I don't know, because the boss said so.

1:23:28

Well, no.

1:23:30

We do standardization because it removes possibilities.

1:23:34

If you don't have any PHP in your system,

1:23:37

you don't have to figure out what are all the linters for PHP,

1:23:40

what are all the practices, what are all the security holes I have to fix.

1:23:43

You just eliminate possibilities through standardization,

1:23:46

and it just reduces the cost of rigor.

1:23:50

Same thing with frameworks.

1:23:51

Why don't you want to have every front-end framework

1:23:53

or every back-end framework in existence?

1:23:55

because it makes rigor more expensive.

1:23:58

Like, yes, rigor is still possible.

1:23:59

Yes, you could still have the agent code up all your tools,

1:24:01

but you have to do it every single time.

1:24:03

You know, protocols,

1:24:05

why do you want to have standardized RPC protocols?

1:24:07

All the same thing.

1:24:08

Standards are all for this reason.

1:24:10

Okay?

1:24:11

What I call in-workflow tooling.

1:24:13

So in-workflow tooling is tooling that just occurs.

1:24:15

The programmer doesn't have to choose to run it.

1:24:16

They don't have to understand how it runs.

1:24:18

It just happens.

1:24:19

If it's there, it feels and seems free,

1:24:22

and it is reliable.

1:24:24

Reliability is very, very important.

1:24:26

It doesn't have a ton of false positives.

1:24:28

It's fast. It just happens.

1:24:30

And the more that's true, you can apply it to your disposable software too.

1:24:33

If it's free and fast, who cares?

1:24:37

Making testing easier.

1:24:38

So this is not just about, like, hey, how do we do better testing?

1:24:42

Look, how do you make it so that nobody has to think about how to do better testing?

1:24:46

How do you make it so that every test is fast and deterministic

1:24:50

without anybody having to be a deep expert in testing?

1:24:53

There's a ton of work that you have to put into test infrastructure to make that possible.

1:24:58

For example, one of the great dreams that I've always had as a test owner is that everybody

1:25:03

would provide in-memory fake versions of their services and I could just run those in-memory

1:25:07

fake versions of their services.

1:25:09

Guess what?

1:25:09

The coding agent can do that.

1:25:11

So you can just do that now.

1:25:12

But you have to choose to do it and make it available to everybody.

1:25:16

And another thing is, look, maximum strictness.

1:25:19

You just turn the strictness up everywhere.

1:25:21

You set all your lint rules to maximum.

1:25:23

You never compromise on anything.

1:25:25

And it eliminates, it's very similar to standardization.

1:25:28

It eliminates a ton of conversations.

1:25:30

Sometimes the linter is wrong.

1:25:31

As long as the false positive rate is relatively low and doesn't have catastrophic consequences,

1:25:35

it doesn't matter because all of a sudden there's a bunch of future lint errors or future

1:25:39

issues that you don't have to deal with.

1:25:40

Ask anybody who's been like, oh, I suddenly want to turn on my linter in this million

1:25:45

line code base.

1:25:45

And they're like, oh, wow.

1:25:47

Now here's my 100,000 line change that I need to make.

1:25:50

Much easier to do that up front and have it on for everybody.

1:25:53

Now look, like I said, I could literally stand here and talk to you about this straight for

1:25:57

ten hours.

1:25:58

There is much, much more you can do here.

1:26:00

This is just a few areas, but also a whole area of software engineering discipline that

1:26:04

you can apply on the other axis.

1:26:07

So this lets us now answer our question, not just it depends, but yes or no.

1:26:13

So does code quality even matter?

1:26:16

For disposable software, no.

1:26:20

For durable software, yes.

1:26:23

And we get to answer a third and even more interesting question,

1:26:26

which is, does it have to be expensive?

1:26:31

Thank you very much.