Programming's 'Three Virtues' Under Scrutiny: How AI is Reshaping Developer Ideals
The foundational ‘three virtues’ of great programmers—laziness, impatience, and hubris—originally championed in ‘The Pragmatic Programmer’ and ‘Programming Pearls,’ are undergoing a critical re-evaluation in the era of large language models (LLMs). These virtues historically fostered excellent software design: laziness drove the creation of labor-saving abstractions, impatience spurred the anticipation of needs and proactive problem-solving, and hubris instilled the confidence to build and maintain robust systems. This approach, often termed ‘hammock-driven development’ by figures like Brian Cantrell, emphasizes upfront intellectual work to design simpler, more powerful abstractions that benefit future development efforts, exemplifying how significant effort leads to a ‘lazy’ outcome of long-term maintainability and reduced toil. Project examples like the T3 Stack illustrate this, aiming for maximal type safety and developer convenience with minimal boilerplate.
However, the advent of LLMs presents a profound challenge to this paradigm, leading to what some are calling the ‘peril of laziness lost.’ Critics observe that LLMs, which incur no ‘cost’ for generating work, can enable a ‘false industriousness,’ where sheer volume of code is prioritized over quality or elegance. This is exemplified by developers boasting about tens of thousands of lines of code generated per day, a metric widely dismissed as a fallacy in good software engineering. The core issue lies in LLMs’ inherent lack of the human virtue of laziness; they do not optimize for future time or feel the need for crisp, minimal abstractions, potentially leading to systems bloated with ‘garbage’ and unmanageable technical debt. This shift threatens the ‘survival of the fittest’ in software, as LLMs could perpetuate poorly architected codebases that would otherwise fail without human intervention. While LLMs are acknowledged as powerful tools, experts stress they must be guided by human intent, serving our ‘virtuous laziness’ to tackle technical debt and enhance rigor, rather than becoming a proxy for thoughtless code generation. Even seasoned figures like ‘Uncle Bob’ Martin suggest LLMs can liberate developers from syntax, allowing focus on higher-level design, but caution that this demands renewed vigilance against unnecessary complexity. Ultimately, like a ‘lawnmower,’ an LLM operates without ‘caring’ for quality; it is up to human programmers to apply their judgment and the timeless virtues to ensure the creation of truly better software.