
An experienced engineer argues that AI's ability to generate endless working code solutions risks hiding systemic complexity rather than solving it. Historically, developer frustration—the annoyance of repeating tedious work—has driven the creation of better abstractions and shared concepts; AI removes that signal by making painful tasks effortless, leaving knowledge scattered and systems without the durable models that make them maintainable. The author illustrates this through a personal case of building deployment infrastructure, showing that the pressure to abstract should still guide which solutions become shared versus disposable.
Summaries like this, in your inbox every morning.
Sign up free →What happened
A software engineer argues that while AI can generate code endlessly to solve immediate problems, it removes the friction that historically signals when a system needs a better abstraction or shared concept—like how compiler adoption didn't eliminate creativity but shifted it upward, from machine code to algorithms and systems.
Why it matters
When AI makes tedious tasks painless (long commands, repeated integrations, configuration files), teams stop feeling the "annoyance" that used to force them to build durable, reusable models. The complexity hides rather than disappears, scattering knowledge across prompts and generated artifacts instead of making it explicit. This matters for maintenance: an AI may successfully solve a ticket-sized task, but miss that the same pattern recurs across the system and deserves a named, shared abstraction only humans discover through accumulated frustration.
What to watch
The author illustrates the principle through a real case: building a service deployment tool (Reploy, unreleased) after discovering that staging, configuration, and installation logic did not belong inside a single service but in a portable, declarative infrastructure model. The practical test: if only implementation repeats, regeneration is fine; but if requirements, invariants, or ownership must be restated each time, the duplication carries meaning that needs an explicit shared model, not more generated code.
The article opens with a thought experiment: compilers exist because humans tired of writing machine code, but we do not say the compiler "wrote" the program. Linus Torvalds made this comparison, arguing that AI is a tool that changes how programmers create, not necessarily who created what. The key insight: compilers eliminated low-level creativity but unleashed higher-level creativity—in algorithms, data structures, languages, and systems. The article explores whether AI will follow the same trajectory.
However, a crucial difference exists. Compilers require a higher-level formal language first; the knowledge is already locked into a durable representation before compilation. AI, by contrast, can generate implementations directly from informal requests, leaving knowledge scattered across prompts, generated files, tests, and human memory. This matters because the feedback mechanism that historically drove better abstractions—annoyance—relies on friction. The best engineers, the author observes, are "lazy in a particular way": they will spend a week eliminating a task that costs five minutes a day. That refusal to tolerate repeated friction is how better tools are born. More importantly, annoyance is a "wrong-abstraction detector." It signals that durable information is being restated, that decisions from different layers have collapsed into one operation, or that the same idea appears in many slightly different forms.
When AI removes that annoyance—generating long commands, configuration files, or integration variations—the complexity does not disappear; it merely moves out of sight. The author illustrates this with a concrete case. While developing a service, he faced a deployment workflow involving a bespoke Dockerfile and a long command combining details from multiple layers. His first solution embedded staging and installation logic directly into the service. It worked, but creating the documentation revealed the awkwardness: the service used itself to construct another form of itself. An AI given the ticket-sized task of "make this installable" would likely have produced the same result and declared success. But the author's annoyance—his refusal to accept the incoherent structure—led him to extract this logic into Reploy, an unreleased tool that treats portable application lifecycle (stage, change, test, install) as the primary object, not staging as a service property.
The article then addresses a counterargument: perhaps AI is correctly making some abstractions unnecessary. Repeated implementations are no longer automatically expensive, and a shared abstraction introduces its own costs—coupling, compatibility constraints, leaky boundaries. Cheap, generated code may sometimes be better than a framework. However, many abstractions do more than save effort; they make shared concepts explicit—what an object means, who owns a behavior, which invariants must hold. Generated code reduces duplication cost but not the need for shared meaning. This creates a paradox: cheap code weakens pressure to abstract while abundant code increases the need for trusted abstractions. Code can be regenerated from a prompt, but the expectations surrounding it cannot. The author proposes a practical test: if only implementation repeats, regeneration is fine; but if requirements, invariants, ownership, or compatibility expectations must be reconstructed each time, the duplication carries meaning needing a shared model. Ultimately, the article argues that AI will not eliminate human creativity but amplify its leverage—once someone sees beyond the working answer, imagines a possibility that does not yet exist, and decides that it matters.
The article rests on a historical observation: creativity in engineering has always moved upward when lower-level work becomes cheaper. Compilers did not destroy programming; they freed humans to think about algorithms, languages, and systems instead of opcodes. The author applies the same lens to AI, arguing it will likely follow a similar path—but with a critical risk.
The risk hinges on a feedback mechanism that has historically driven abstraction: annoyance. When a task is tedious enough, engineers invest time to eliminate it—building tools, frameworks, or shared concepts. Hydra, a configuration framework the author created, emerged from this pattern: long command lines combining unrelated concerns (identity, storage, networking, security) forced the author to reconstruct an implicit model each time. The solution was to make that model explicit and composable.
AI disrupts this loop. If a long command is annoying to type, an AI can generate it. If a configuration file is tedious, an AI can write it. The friction signal—the very thing that used to motivate abstraction—is gone. The author illustrates this through a service deployment scenario: an AI given the task "make this installable" might reasonably embed installation logic into the service itself, run tests, and declare success. But the author's lived experience with the problem revealed that staging, configuration, and installation belonged in a portable, declarative infrastructure model (Reploy), not in the service. Only accumulated contact with the problem—the annoyance—exposed the missing concept.
AI-summarized, only the topics you pick — one digest a day via Email, Slack, or Discord.
Free · takes 30 seconds · unsubscribe anytime
No comments yet. Be the first to share your thoughts!
Log in to join the discussion





Get curated AI news from 200+ sources delivered daily to your inbox. Free to use.
Get Started FreeFree · takes 30 seconds · unsubscribe anytime