Why Software Must Keep Changing, and AI Keeps Pulling It Back to the Mean

Tom Haus

Hatched by Tom Haus

May 27, 2026

10 min read

87%

0

The Strange Problem at the Heart of Modern Software

What if the biggest danger to a software product is not that it breaks, but that it becomes too predictable?

That sounds wrong at first. We usually think of failure as outages, bugs, or security holes. But long lived software faces a deeper threat: the world keeps moving, while the system, left alone, quietly hardens into yesterday’s assumptions. A product that once felt alive can become less satisfactory simply because it no longer fits the environment around it. At the same time, the very act of changing it makes it more complex, harder to understand, and more fragile to future change.

That is the central paradox of software evolution. Software must keep changing to stay useful, but every meaningful change makes it harder to change again. The result is not a stable machine, but a living tension between adaptation and entropy.

Now add a second force: AI systems that are excellent at pattern completion, but weak at genuine rupture. They are powerful at averaging the past into a plausible next move. That makes them superb assistants for maintenance, yet dangerous if we mistake fluency for originality. In other words, software evolves under one law of nature, while AI tends to pull ideas toward the statistical center of what already exists.

The combination is unsettling. Modern teams are increasingly using AI to help build, maintain, document, and even ideate software. But if software already drifts toward complexity and decline, and AI tends to smooth thought toward the mean, then we are not merely automating engineering. We are automating conformity unless we deliberately resist it.


Software Is Not a Thing, It Is a Negotiation

A long lived software system is not a static artifact. It is a negotiation among users, developers, operations, business needs, and changing environments. Every release is a temporary compromise. Every feature is a bet that the future will resemble the demand that produced it. Every refactor is an attempt to reclaim legibility from accumulation.

This is why the idea of continuous change matters so much. If a product serves a real world use case, the world will keep altering the shape of that use case. Regulation changes. User expectations rise. Competitors copy features. Infrastructure shifts. Attackers adapt. The system cannot freeze and remain relevant, because relevance itself is moving.

But the moment a system grows, it starts to violate its own simplicity. Complexity accumulates the way dust accumulates in a room with too many doors. A new feature adds branching logic. A shortcut becomes a dependency. A temporary workaround becomes a permanent interface. Soon the codebase is no longer just solving the original problem. It is also carrying the history of every rushed decision made along the way.

This creates a practical truth that many teams feel but rarely articulate: software does not merely age, it inherits memory. That memory is useful, because it preserves capability. But it is also expensive, because every remembered exception becomes one more thing a person or machine must hold in mind.

A familiar example is the checkout flow in an e commerce system. The original flow might be simple: add item, enter address, pay, confirm. Years later it may include gift cards, tax rules by jurisdiction, fraud checks, loyalty points, split shipments, subscriptions, invoice billing, and fallback paths for every failed gateway. Nothing is irrational in isolation. Yet the whole becomes a maze. The system is still working, but it now requires mastery just to understand where the maze begins.

A software system does not fail only when it breaks. It fails when too many people can no longer explain why it works.

That is why familiar systems often feel easier to extend than to replace, even when replacement seems cleaner on paper. People trust the accumulated knowledge embedded in the system. They fear the blank page more than the messy old code because the old code carries operational memory, however tangled.


AI’s Great Strength Is Also Its Great Constraint

Language models are astonishing at producing the probable next sentence. That is not a weakness in itself. It is what makes them useful. They can summarize, draft, rephrase, and transform vast amounts of prior expression into immediate assistance. But this same capability reveals a boundary: they are fundamentally shaped by the past.

When a model generates an answer, it does not leap outside history. It converges toward a statistically plausible continuation of what has already been said. That is why AI can sound insightful while still remaining conservative. It is often exceptional at recombining known material, yet less reliable at creating ideas that violate the patterns of the training distribution.

This matters because software evolution often requires exactly the opposite mode. Mature systems do not only need optimization. They need occasional discontinuity. They need someone to ask whether the architecture itself is wrong, whether the product category is stale, whether the interface should disappear, or whether a feature should be deleted rather than refined.

AI can help here, but only if we understand the difference between searching the space of known solutions and inventing a new space of problems. A model may quickly generate ten variants of a login system, a caching strategy, or a deployment pipeline. That is valuable. But if the challenge is to rethink the product so that login is no longer the bottleneck, or to invent a distribution model that changes what deployment even means, the model’s pull toward the average becomes a constraint.

This is where the tension becomes subtle. AI is not just a tool for coding. It is a tool for culture. If teams lean on it too early, they risk converting exploratory thinking into pattern matching. If they lean on it too late, they risk using human creativity where machine regularity would suffice.

The right question is not whether AI can create novel ideas. It sometimes can, in the sense that surprising recombinations emerge. The more important question is whether teams can recognize when they need departure from precedent rather than better compression of precedent.

A useful analogy is navigation. A map app is brilliant at telling you the fastest route on roads that already exist. It is not the thing you use when deciding whether a road should exist at all, whether the city needs a train line, or whether your destination is wrong. Likewise, AI is superb for traversing the current terrain of software. It is much weaker at redrawing the terrain.


The Real Design Problem: Preventing Mean Drift

The intersection of these ideas points to a deeper problem than maintenance or creativity alone. It is the problem of mean drift.

Mean drift happens when a system, a team, or a product gradually gets pulled toward what is familiar, legible, and incrementally optimizable. Software drifts this way because change is constrained by legacy complexity, limited attention, and the need to preserve operational stability. AI drifts this way because it is optimized to produce plausible outputs grounded in the past. The result is a double pull toward sameness.

This is not inherently bad. Most production software should indeed be conservative most of the time. Financial systems, healthcare platforms, logistics engines, and identity systems need reliability more than dramatic novelty. But when mean drift goes unchallenged, it creates a dangerous illusion: everything looks productive because activity is high, while the underlying system becomes harder to evolve and less aligned with reality.

The antidote is not constant reinvention. Constant reinvention is just another form of instability. The antidote is deliberate asymmetry: preserve what must remain stable, while reserving specific moments, roles, and processes for genuine departure.

Think of it as a three layer discipline:

  1. Operational layer: Keep the system predictable. Protect uptime, security, and data integrity.
  2. Evolution layer: Keep the system adapting. Ship changes, remove debt, and revise interfaces.
  3. Exploration layer: Keep the system imaginable. Question assumptions, prototype alternatives, and test whether the current category still makes sense.

Most teams confuse the second and third layers. They call every new ticket innovation, but most tickets are just operational adaptation. Real innovation is rare because it often requires permission to contradict the existing shape of the product. AI can accelerate all three layers, but it is particularly powerful in the first two. Human judgment is indispensable in the third.

This helps explain why so many organizations feel busy but not truly inventive. Their process is excellent at generating incremental motion, but poor at institutionalizing surprise. They optimize the current machine without asking whether the machine itself is now the bottleneck.

Efficiency without renewal produces elegant decline.


A Practical Framework: Where Humans Must Outrun the Average

If AI tends to average the past, then the most valuable human contribution is not merely taste. It is the ability to create and defend exceptions. That does not mean rejecting AI. It means placing human creativity exactly where the model is most likely to flatten the world.

Here is a simple framework for doing that.

1. Use AI for compression, not consensus

Ask AI to summarize logs, draft tests, generate boilerplate, compare migration paths, and expose hidden assumptions. These are compression tasks. They reduce effort and reveal structure.

Do not ask AI to decide the future direction of the product by default. If every strategic conversation begins with machine generated options, the team’s imagination will quietly narrow to the shape of the prompt.

2. Reserve human time for irreversible choices

Some decisions are easy to reverse. Others change the architecture of the business. Humans should spend disproportionate attention on the irreversible ones: product boundaries, pricing logic, platform abstraction, data ownership, deprecation strategy, and platform shifts.

A good litmus test is this: if a decision locks in costs for the next three years, it deserves more than pattern based optimism.

3. Create an explicit novelty budget

Every mature software team should budget not just engineering hours, but cognitive novelty. That means setting aside time for deleting code, redesigning interfaces, challenging assumptions, and exploring non obvious alternatives.

Without a novelty budget, all energy goes to preserving the current system. The product stays alive, but its future gets thinner.

4. Measure familiarity loss, not just velocity

It is easy to measure tickets closed or deploys per week. It is harder, but more important, to ask whether the system is becoming less understandable. Are more people able to explain core flows? Are onboarding times shrinking or growing? Are incident root causes becoming easier or harder to trace?

If a team cannot articulate what they no longer understand, complexity is already winning.

5. Build feedback loops that include dissent

Feedback systems do not improve merely because feedback exists. They improve when the right voices can interrupt momentum. That means operators can challenge product assumptions, support can challenge engineering optimism, and users can challenge both.

AI can process feedback. Humans must decide whether the feedback should alter the shape of the system or simply patch its current form.


Key Takeaways

  • Software must evolve continuously, but evolution naturally increases complexity unless someone deliberately pays down that cost.
  • AI is powerful at reusing the past, which makes it excellent for maintenance and dangerous as a substitute for original strategic thought.
  • The real risk is mean drift: systems, teams, and products slowly converge on what is familiar and plausible rather than what is truly needed.
  • Create separate modes for operations, adaptation, and exploration, so novelty is not swallowed by routine maintenance.
  • Protect human judgment where choices are irreversible, especially when deciding whether to refine the current system or rethink the system itself.

The Deeper Lesson: Progress Requires Refusing the Comfortable Average

The most unsettling insight here is that both software and intelligence can become victims of their own success. Software succeeds by accumulating solutions, then suffers from the weight of those solutions. AI succeeds by learning from the past, then risks making the past feel sufficient.

That is why the future of software is not simply more automation. It is the disciplined management of disagreement between what has worked and what must now change. Human beings are not valuable because they are always more efficient than machines. They are valuable because they can say, with justification, that the obvious next step is the wrong one.

In that sense, the real challenge is not to make software smarter in the abstract. It is to keep it from becoming too obedient to its own history. The best systems will be those that respect the average where the average is useful, but know how to escape it when the future demands something no model of the past could comfortably predict.

Sources

← Back to Library

Hatch New Ideas with Glasp AI 🐣

Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)

Start Hatching 🐣