dayliyreport

Search

AI

Programmers Coding with AI: Why AI Writes Faster but People Feel More Exhausted

·5 min read
Advertisement

Over the past two years, almost every front-line developer has experienced this moment: AI generates two hundred lines of code in seconds—complete structure, standardized naming, full comments—looking neater than what you would have written yourself. But when you actually integrate it into the project, get tests passing, and deploy, the exhaustion feels stronger than writing it by hand. The problem isn't that AI isn't fast enough; it's that "fast" itself shifts the burden onto people.

1. Unclear Division of Labor: AI Has No "Responsibility," People Do

AI can generate code, but it bears no consequences. Production incidents, performance regressions, security vulnerabilities—ultimately, a person has to own them. This responsibility asymmetry creates an awkward situation: the more proactive AI is, the more passively people have to cover for it.

Relatedsearches

In practice, a workable criterion is: treat AI output as a "candidate patch," not a "final implementation." Specific approaches:

Article image

  • Have AI write tests or interface contracts first, then write the implementation. Tests are the most effective constraint people have on AI.
  • For every function AI generates, require it to also state "under what conditions this function will fail." If it can't answer, you don't yet understand the code.
  • Establish a clear team rule: for AI-generated code, the submitter must be able to explain its behavior line by line. If they can't, it doesn't get merged.

2. Plausible but Hidden Errors: The Most Dangerous Code Is the Code That "Looks Right"

What AI excels at is not writing wrong code, but writing code that "looks right." It might use a non-existent API, ignore an edge case, write asynchronous logic as synchronous, or quietly introduce a race condition in a concurrent scenario. These errors won't surface at compile time, and may not even surface in unit tests.

The criterion is simple: for any AI-generated code, ask three questions first—

  1. Have I verified the external behavior this code depends on?
  2. Does it handle exception paths and boundary inputs?
  3. If the input scale expands tenfold, would it still be written this way?

If you can't answer any of the three, don't merge directly. A more pragmatic approach: have AI write counterexample tests itself. You can say: "Please give three inputs that would make this function fail." It often exposes branches it didn't consider.

3. Context and Project Conventions: AI Doesn't Know Your "Unwritten Rules"

Every project has a pile of unwritten conventions: log format, error code standards, dependency injection style, the database access layer can't be called directly, a certain utility class can't be used in new code. AI doesn't know these; it only generates based on "common practices" in its training data.

Solving this can't rely on repeatedly pasting conventions into every conversation. More effective approaches:

  • Put an AI_CONTEXT.md in the repository root, clearly documenting project structure, naming conventions, forbidden patterns, and common utility functions.
  • Use this file as a fixed prefix for every AI conversation.
  • For AI-generated code, use static analysis tools (lint, architecture tests, dependency rules) as the first filter. Anything that can be automated shouldn't rely on human reminders.

4. The Cognitive Load of Reviewing AI Code: Reading Is More Tiring Than Writing

Writing code is active construction; reading code is passive comprehension. AI generates code far faster than humans can understand it, so review becomes the bottleneck. Worse, AI code often "has no history"—it doesn't explain why it was written this way, nor does it tell you which alternatives it ruled out.

Practical methods to reduce review burden:

  • Limit single-generation volume. Generate at most one function or one class at a time; don't let it generate an entire module in one go.
  • Require AI to provide a "change summary": what it changed, why, and which callers are affected.
  • Review using diffs, not files. Only look at the parts AI changed; don't re-read the entire file.
  • For high-risk modules (payments, permissions, concurrency), forbid AI from directly generating implementations; only allow it to generate tests and documentation.

5. Debugging and Comprehension Cost Transfer: The Time You Save Comes Back Doubled

AI saves you the time of "writing from scratch," but shifts the cost to "understanding, debugging, verifying." When AI-generated code breaks, you're facing logic you're unfamiliar with, and there's no "thought path from when you wrote it" to trace back.

A pragmatic criterion: if a piece of code breaks, can you locate the cause within five minutes? If not, the "comprehension cost" of this code has already exceeded the writing cost it saved.

Countermeasures:

  • For complex AI-generated logic, require it to first write "human-readable pseudocode" or a flowchart, then write the implementation.
  • Add logs and assertions at key branches to turn AI's "black box" into something observable.
  • If you've been debugging a piece of AI code for more than half an hour, deleting and rewriting is often faster than continuing to fix.

6. Long-Term Maintenance and Knowledge Loss: The Code Remains, the Understanding Doesn't

AI-generated code can quickly pile up a feature, but no one on the team truly "owns" it. Six months later, when this code needs modification, no one remembers why it was written this way, and no one knows what implicit assumptions it depends on. This is a more insidious "comprehension debt" than technical debt.

Ways to avoid knowledge loss:

  • AI-generated code must have a human owner. The submitter is the owner of that code.
  • For each AI-generated module, require a "design decision record" (ADR) explaining why this approach was chosen and which alternatives were ruled out.
  • Regularly conduct "AI code reviews": pick modules with a high proportion of AI-generated code and check whether anyone can still explain its behavior.

7. Team Norms and Trust: Don't Ban AI—Define Boundaries

Teams often have two extremes: one group fully embraces AI and submits large amounts of unreviewed generated code; the other completely rejects AI, believing it's untrustworthy. Both harm collaboration.

A more pragmatic approach is to establish tiered norms:

  • Low-risk areas (utility functions, tests, documentation, boilerplate): AI can lead, with human spot-checks.
  • Medium-risk areas (business logic, API layer): AI generates, humans review line by line and add tests.
  • High-risk areas (security, payments, concurrency, data migration): AI can only assist, not generate the final implementation.

At the same time, teams should establish a trust rule: for AI-generated code, reviewers have the right to demand an explanation for any line. This isn't distrust of people; it's putting responsibility back where it belongs.

Conclusion: The Faster AI Gets, the More People Must Slow Down to Judge

AI's coding speed won't decrease, and people's exhaustion won't disappear on its own. The real solution isn't "use more AI," but redefining human-machine division of labor: AI generates candidate solutions; people judge, verify, and take responsibility.

For front-line developers, the three most practical principles are:

  1. What can be automatically verified shouldn't rely on human eyes—tests, lint, type checking, architecture rules.
  2. What can't be explained shouldn't be merged—for every line of AI code, the submitter must be able to articulate why it exists.
  3. In high-risk areas, people write tests first, then AI writes the implementation—reverse the order, and exhaustion follows.

AI is an amplifier, not a replacement. It amplifies your judgment, and it also amplifies your negligence. Keeping judgment in your own hands is the prerequisite for collaborating with AI without exhaustion.

Related Articles