Artie Shevchenko and Titus Winters on Code Health in the AI Era

The authors discuss complexity, human review, testing and why interfaces and state deserve attention in AI-assisted development.

ASArtie ShevchenkoInvitado · Canva
Canal
GOTO Conferences
Publicado
6 nov 2026
Vídeo
29:42
Lectura
4 min
Original
inglés
Abrir en YouTube
Al desplazarte, el vídeo se reduce a la esquina inferior derecha y sigue reproduciéndose. Los subtítulos siguen tu idioma de lectura.
Idioma de lecturaDisponible en 2 idiomas
Este artículo aún no está en español, así que se muestra el original en inglés.
RESUMEN

En 30 segundos

Artie Shevchenko explains the ideas behind Code Health Guardian in conversation with Titus Winters. They distinguish complexity problems, debate how to review generated code, and connect intellectual control, tests and immutability to long-term maintainability.

  1. 1Three complexity problemsChange amplification, cognitive load and unknown unknowns create different maintenance risks.
  2. 2Make causes specificShevchenko breaks broad dependency concerns into six more actionable categories.
  3. 3Review hard-to-change decisionsWinters prioritizes interfaces, storage, schemas, frameworks and dependencies.
  4. 4Two forms of controlReasoning about a system and testing changes provide complementary evidence.
  5. 5Immutability by defaultPrefer stable values to reduce hidden state changes, with practical exceptions.

Conclusiones

  1. Distinguish change amplification, cognitive load and unknown unknowns when prioritizing complexity.
  2. Dependencies offer benefits as well as costs; specific interface and dependency problems are more useful to examine than a blanket rule.
  3. Review effort can prioritize decisions that are difficult to change, including interfaces, data and dependencies.
  4. Understanding, testing and evidence offer complementary forms of control over change.
  5. Immutability by default can reduce complexity while leaving room for pragmatic exceptions.
TEXTO COMPLETO

Lee el texto editado por capítulos

Solo la transcripción
01

The origins of the book

Shevchenko connects teaching, code review and earlier software-design books to his writing.

Titus Winters welcomes Artie Shevchenko to the GOTO Book Club to discuss Code Health Guardian and the role of human programmers in an AI-assisted era. Winters asks what led Shevchenko to write it.

Shevchenko says he has long enjoyed sharing knowledge and preparing students for future challenges. At Google he developed internal code-review classes; more than 1,000 employees attended, and their response gave him confidence to continue teaching.

A presentation by John Ousterhout on A Philosophy of Software Design supplied another important influence. Shevchenko liked the way its complexity model gave theory to familiar engineering practices. Years of teaching university courses and revising the material then supplied further insights worth sharing.

Reading Software Engineering at Google, co-curated by Winters, made Shevchenko notice that some aspects of actual coding culture were only briefly covered. He sent Winters an early draft about design documents; Winters recalls being pleased to see that topic explored.

02

A model of code complexity

The authors discuss three problems and more specific causes of complexity.

Winters asks about Ousterhout's complexity framework. Shevchenko explains three distinct problems: change amplification, where a seemingly small change spreads across many locations; cognitive load, the difficulty of understanding code; and unknown unknowns, where a developer lacks the information needed to see a problem.

Separating the problems helps prioritize them. Shevchenko generally regards unknown unknowns as more severe than cognitive load, and cognitive load as more severe than ordinary change amplification, while allowing that very large amplification can change the ranking.

Ousterhout links complexity to obscurity and dependencies. Shevchenko retained the three symptoms but reconsidered the causes while writing: dependencies can create problems, yet they are also fundamental building blocks of software. Winters agrees that a dependency provides a benefit as well as a maintenance liability.

Shevchenko replaces the broad dependency category with six more specific causes: misleading interfaces, complex interfaces, unfamiliarity, too many dependencies, duplication and unstable dependencies. Winters notes that every dependency has some cost and risk, but their quality varies considerably.

03

Reviewing AI-generated code

They discuss plausible output, human understanding and prioritizing review of hard-to-change decisions.

Turning to AI, Shevchenko argues that plausible generated code does not by itself demonstrate understanding. This is his view about current models. He worries that leaving a codebase entirely to generated output can erode a team's intellectual control, so people still need to validate important changes.

Winters says generated code often looks plausible at a glance but can have weak tests or questionable interfaces without sufficient instructions and supporting infrastructure. He asks whether the same six causes are useful as a review checklist for AI-assisted work. Shevchenko says they apply to human-written code too.

Shevchenko compares two students who produce similar exam answers: one understands the material and another has memorized it. The analogy illustrates his concern that surface-level plausibility is hard to distinguish from understanding, and that a useful answer in one case may not generalize to another.

Asked whether he reviews every line, Shevchenko admits that he now checks test scenarios more carefully than every line of test code, while still reviewing most production code. He is unsure whether that balance is right and says he is still learning how to prioritize review.

Winters says the industry is rebuilding its playbook as AI changes development, and that experienced engineers should be willing to acknowledge uncertainty. His own review priority is what is hardest to change later: dependencies and frameworks, state and storage, API design and database schemas.

Shevchenko puts interfaces near the top of the list. Reviewers should check whether an interface makes a clear promise and actually fulfills it. Poor interfaces can create both cognitive load and unknown unknowns that are expensive to uncover later.

04

Control, testing and immutability

Tests and understanding help manage change, while immutability can reduce obscurity.

Winters distinguishes intellectual control from statistical control. The former means understanding a system well enough to reason through a change; the latter uses tests, evidence and experiments to gain confidence in safety even when every causal detail is not understood. They see these as complementary tools.

Shevchenko says his book refers readers to Software Engineering at Google for a fuller treatment of testing. In his complexity model, tests help verify that interfaces keep their promises and reduce the chance that an unknown breakage goes unnoticed. Types and assertions also contribute.

Discussing reader reception, Shevchenko explains that he placed the most important ideas early because more readers reach the first chapters than the later ones. He highlights software engineering over time, the complexity model and design by contract as early topics.

Winters asks for the pitch for semi-functional programming. Shevchenko describes it as preferring immutability by default, an established practice rather than a claim of invention. Immutable values reduce the need to track who changed a variable and when, lowering obscurity.

He does not advocate making everything immutable regardless of cost. Taken to an extreme, the approach can hurt readability; there is still room for mutable state. His recommendation is a strong default with pragmatic exceptions.

Winters connects this to testing. Stateless code is easier to exercise; code that reads state needs representative state, while code that both reads and writes state requires careful setup and sequencing. Mutable state introduces a time dimension that software engineering has to manage.

The conversation ends with Shevchenko thanking Winters for encouragement and for writing the book's foreword. Both emphasize that the practices for AI-assisted development are still evolving.

Más de este canal

2 diapositivas42:40EN
GOTO Conferences· 5 nov 2026Daniel Terhorst-North: Use Generative AI to Go Broader, Not Just FasterDaniel Terhorst-North · Dan North & AssociatesA software practitioner shares how an AI-assisted teaching toolkit led him to “adjacent engineering,” larger test-first steps and external guardrails.Software engineeringHuman-AI CollaborationFlujos de desarrollo y pruebas+1
2 diapositivas44:42EN
GOTO Conferences· 4 nov 2026Adam Tornhill on AI-Friendly Code and Sustainable Agentic DevelopmentAdam TornhillAgentic coding can accelerate delivery, but complexity can erase the gains. Adam Tornhill presents code-health research and a large-scale refactoring case study.Software engineeringAgentes de programaciónFlujos de desarrollo y pruebas+1
Diapositivas51:06EN
GOTO Conferences· 4 nov 2026Kent Beck on AI Coding, the Forest, and Human NeedsKent BeckAI amplifies the conditions in which software teams work. Kent Beck argues for preserving future options and designing tools around human needs.Software engineeringAgentes de programaciónDeveloper productivity+1
7 diapositivas40:04EN
GOTO Conferences· 2 nov 2026Sophia Drossopoulou: Verifying Trusted Code in an Open WorldSophia Drossopoulou · Imperial College LondonCapabilities, scoped invariants and explicit trust assumptions help reason about effects when trusted code calls unknown objects.Code review & verificationProgramming LanguagesSoftware engineering
4 diapositivas51:06EN
GOTO Conferences· 2 nov 2026Kent Beck: Build AI Programming Tools for Human NeedsKent BeckThe “genie” can amplify healthy or unhealthy development practices. Beck calls for tools that preserve learning, connection and future options.Agentes de programaciónSoftware engineeringDeveloper productivity+1
4 diapositivas20:04EN
GOTO Conferences· 30 oct 2026Somtochi Onyekwere: Separate Protocol Logic from I/O for Deterministic TestsSomtochi Onyekwere · Fly.ioA Sans I/O design lets a local simulator run thousands of protocol states with virtual time and controlled failures.Flujos de desarrollo y pruebasSoftware engineering