Why Programmer Laziness Still Matters in the Age of AI

Theo reads Bryan Cantrill’s essay on abstraction, code volume and the human responsibility to make software simpler.

ThTheoSpeakerBCBryan CantrillSpeaker · Joyent
Channel
Theo - t3․gg
Published
Jun 4, 2026
Video
18:56
Read
5 min
Slides
3
Original
English
Open on YouTube
Scroll to read and the video shrinks to the bottom-right corner. Captions follow your reading language.
Reading languageAvailable in 2 languages
You're reading the original English.
SUMMARY

In 30 seconds

Theo revisits the programmer virtues of laziness, impatience and hubris through Bryan Cantrill’s essay about AI-assisted software. He argues that thoughtful abstraction saves future work, while code volume alone is a poor measure of quality, and that people must direct AI toward maintainable systems.

  1. 1Three programmer virtuesLaziness, impatience and hubris can motivate investment in durable solutions.
  2. 2Simplicity takes effortCantrill argues that good abstractions require thought now to save work later.
  3. 3The T3 Stack exampleTheo describes seeking simpler full-stack type safety and credits community contributors.
  4. 4Lines are not qualityA large code count is a poor substitute for assessing what software does and how it is maintained.
  5. 5Use models deliberatelyAI can help reduce debt and improve rigor when people set goals and assess the results.

Takeaways

  1. Productive laziness invests effort now to reduce future work.
  2. Useful abstractions simplify systems, but over-abstraction can add complexity.
  3. Lines of code are not a reliable stand-alone measure of software quality.
  4. AI can help with technical debt and rigor when people set goals and review results.
  5. Humans remain responsible for the maintainability of generated software.
FULL TEXT

Read the edited text by chapter

Transcript only
01

The three virtues

Theo introduces the ironic programmer virtues and the question raised by AI-generated code. He turns to Bryan Cantrill’s essay.

The three virtues of a great programmer are laziness, impatience and hubris. Those sound like terrible qualities, but the joke has a serious point: impatience makes you want to fix a recurring problem, confidence makes you think you can, and laziness pushes you to solve it so you do not have to keep doing the work.

As the way we write code changes, the meaning of laziness changes too. A programmer can now produce a great deal by throwing prompts at a model, but that is not necessarily the kind of effort-saving design these virtues describe. Bryan Cantrill’s essay “The Peril of Laziness Lost” made me want to revisit the distinction.

02

Laziness and abstraction

The classic definitions frame laziness as an investment in saving future effort. Both too little and too much abstraction can cause trouble.

The formulation comes from Larry Wall’s Programming Perl. Its playful definitions connect laziness with building labor-saving tools and documenting them, impatience with making software anticipate needs, and hubris with the pride that drives someone to write and maintain work others can respect. They are lenses for thinking about software, not literal hiring criteria.

Abstraction can replace repeated copying with a loop, a function or another reusable idea. But an ever-growing mountain of abstractions can also be a mistake. The challenge is to remove unnecessary work and complexity without adding more machinery than the problem warrants.

Three virtues of a programmer
SLIDE 1 / 3Three virtues of a programmerThe page displays the classic tongue-in-cheek definitions of laziness, impatience and hubris.

Cantrill argues that meaningful laziness takes work: you turn the problem over, invest effort now and find a simpler abstraction that saves time later. When it works, the benefit extends beyond the original author to people who build on the system. Simplicity is something to design, not an excuse to avoid thinking.

03

Building the T3 Stack

Theo connects the idea to type safety and the community that built create T3 app. He values tools that reduce friction for later developers.

That is why I enjoyed working on the T3 Stack. I wanted the computer to tell me when I made mistakes across the boundary between the frontend and backend. I found some existing approaches too heavy to set up, so the aim was a smaller set of abstractions that made full-stack type safety easier to use.

The origin story also fits the three virtues. I wanted to explain the stack once instead of repeatedly answering the same questions. A community member, Nexile, originally built create T3 app as a quick way to set it up; other contributors joined, including Julius, who later became deeply involved in our projects.

Seeing other developers use that work is satisfying because a good abstraction lets more people build things with less friction. Cantrill hopes people who benefit from abstractions will carry that effort forward by improving their own systems. But as more people create software, the original, ironic meaning of programmer laziness can get lost.

04

The lure of code volume

Cantrill criticizes celebrating lines of code and describes a reported example of unnecessary artifacts. Theo considers the maintenance incentives created by models.

Cantrill contrasts this with a culture of appearing busy and celebrating how much code one produces. Language models can amplify whatever disposition their users bring to them. If the goal becomes the feeling of productivity, a rapidly growing code count may be mistaken for an improvement in the software.

The essay cites Garry Tan’s post claiming 37,000 lines of code a day across five projects and contrasts it with a rough count for DTrace. I agree that treating lines written as the headline achievement is a poor way to judge engineering. These counts use different contexts and do not by themselves establish the quality of either project.

A code-volume claim
SLIDE 2 / 3A code-volume claimCantrill’s essay displays a post reporting a large daily line count, the metric Theo questions.

I remember reducing a friend’s example full-stack application from several thousand lines to under 500 using the T3 Stack. My point is that a better abstraction can reduce the amount of code people must maintain. Fewer lines do not automatically prove correctness or remove the need for appropriate testing.

Cantrill cites another engineer’s inspection of a newsletter site that reportedly loaded unnecessary artifacts, including test harnesses and multiple logo variants. He treats those fixable issues as an illustration of a broader risk: unchecked generation can add layers of material without asking whether they simplify the system. The example is his cited account, not my independent audit.

I worry that models may make it easier for difficult codebases to persist: they can keep adding changes to a system a human team would struggle to maintain. That is a concern about incentives and outcomes, not proof that every AI-maintained project will become unmaintainable. Human review and deliberate cleanup still matter.

05

Human judgment and AI tools

Cantrill and Theo see a role for models in reducing debt and improving rigor. People still need to direct and assess the work.

Cantrill’s argument is that finite human time and attention push us toward clear abstractions. A model has no personal stake in the future cost of maintaining what it generates; the team must set that objective and evaluate the result. Running a model consumes resources, but it does not experience maintenance effort the way a human does.

This is not an argument to reject LLMs. Cantrill describes them as tools that can help address technical debt and improve engineering rigor. I agree: use the model for the difficult work, but direct it toward a simpler, more powerful system that future maintainers can understand.

I am glad to see a middle ground between people who value clean code but dismiss AI and people who celebrate huge volumes of generated code. Robert C. Martin, known as Uncle Bob, argues that spending less attention on syntax can free us to think about more important problems.

A comment on syntax
SLIDE 3 / 3A comment on syntaxTheo discusses Robert C. Martin’s argument that AI can shift attention away from syntax.
06

Avoiding excess complexity

Theo discusses over-abstraction and plays a Cantrill clip. He concludes that humans remain responsible for software quality.

I have criticized some clean-code patterns for over-abstraction, and I still think that is a real danger. The balance is to make the system as simple as it can be without hiding essential complexity. If AI handles more syntax, we still need to care about unnecessary bloat and the design of the whole system.

Theo plays a clip from a Bryan Cantrill talk about Oracle and OpenSolaris. Cantrill uses a deliberately sharp lawnmower analogy to argue against attributing human feelings or concern to the company’s behavior. It is his rhetorical characterization of that history, not a factual account of anyone’s inner motives.

I bring the analogy back to language models: we cannot rely on a tool to care about software quality on our behalf. People must decide what matters, guide the work and inspect the result. Otherwise the output may appear to work while accumulating complexity that erodes the system over time.

The goal is to stay lazy in the productive sense: use automation and thoughtful abstractions to save future effort, while remaining responsible for the quality of what we build. Keep prompting, but keep trying to make the software better too.

More from this channel

5 slides38:47EN
Theo - t3․gg· Oct 28, 2026Theo’s Long-Running Agent Experiments: Verification, Compute and CostTheo Browne · Ping LabsA skateboard game and two compiler projects show how repeated checks and flexible compute can sustain agent work—and how expensive those loops can become.Coding agentsAgent engineeringAI cost & performance+2
5 slides36:07EN
Theo - t3․gg· Oct 27, 2026Theo on Token Costs, Coding Agents, and the Price of AI CapabilityTheo Browne · Ping LabsA viral estimate of Lauren's AI spending prompts a closer look at cache pricing, benchmarks, and the changing work of coding agents.AI cost & performanceCoding agentsInference+1
5 slides30:37EN
Theo - t3․gg· Oct 26, 2026Theo’s Three Skills for Reviewing and Shipping with Coding AgentsTheo Browne · Ping LabsHow sol-loop, full-send and full-stop encode review, verification and different levels of merge authority.Agent skillsCoding agentsCode review & verification+2
2 slides0:43EN
Theo - t3․gg· Oct 23, 2026Theo Distinguishes Security Vulnerabilities from Active AttacksTheo Browne · Ping LabsA short explanation of why disclosed software flaws and reported attacks are different kinds of security news.CybersecuritySoftware engineering
6 slides29:22EN
Theo - t3․gg· Oct 22, 2026Theo on Security Vulnerabilities, Stolen API Keys and AITheo Browne · Ping LabsA look at the gap between vulnerability disclosure and patching, and a speculative account of why stolen inference keys may be valuable.CybersecurityAI securitySoftware engineering+1
4 slides31:13EN
Theo - t3․gg· Oct 20, 2026Theo on Why Smarter Models Help More Than DevelopersTheo Browne · Ping LabsFrom game modifications to compiler experiments, Theo revisits his assumptions about who benefits from more capable AI.Coding agentsDeveloper productivityHuman-AI Collaboration+1