Back to blog
Quality
Claude Code

AI Agents Are the Most Expensive Junior Devs You'll Ever Hire

Thang Doan
Thang Doan

Give a junior a ticket that says "users can be admins, admins see an extra settings page" and you get a UserRoleManager with role hierarchy, permission inheritance, an audit log, and four unused extension points. The actual requirement was one if-statement.

Now give the same ticket to an AI agent. You get the same UserRoleManager, in thirty seconds instead of three days. The reflex is identical. The cost structure is worse.

Junior developers grow out of it. Agents do not. They will produce the same over-engineered shape on every PR until somebody adds a review step that catches it.

Why agents default to over-engineering

Models are trained on code that exists. Most code that exists in public repositories is not minimal. It is the surviving output of teams that abstracted early, added extension points, and built for requirements that may or may not arrive. The agent has seen more of that code than the alternative.

So when the agent sees "users can be admins", it reaches for the abstraction it has seen a thousand times. It does not ask: is there a current requirement for five roles? Is there a ticket requesting an audit log? Has anyone mentioned permission inheritance in a planning doc?

The agent is not guessing randomly. It is pattern-matching to the median of public code. The median of public code is over-engineered for your actual ticket.

The actual invoice

A junior's UserRoleManager costs two to three days of build, plus code review, plus maintenance for as long as it lives in the codebase.

An agent's UserRoleManager costs you one prompt, plus the same code review, plus the same maintenance. The build cost dropped to near zero. The review cost stayed the same. The maintenance cost stayed the same.

So the leverage flipped. Before AI, you accepted some over-engineering because the alternative was rewriting a junior's three-day investment. With AI, the build cost is gone. The only thing keeping the abstraction in your codebase is that nobody on your team treats agent output like junior output.

What changes in review

The fix is a review checklist that asks the same questions you would ask a junior, but with less patience.

Does this abstraction satisfy a requirement that exists in a current ticket? If the answer is "in case we need it later", reject it. Does this generic interface have at least two callers today? If not, collapse it. Does this file have unrelated concerns that change at different rates? If yes, that is the only valid reason to split.

Apply this to every agent PR. The first week, you will reject a lot. By the second week, the rejection pattern leaks back into your prompts. The agent starts producing the simpler version because the simpler version is the one that gets through review.

When to let agents over-build

There is one exception. In early exploration, when you do not yet know what the requirements are, letting an agent produce a thick first cut can be useful. You learn faster from concrete code than from a blank file.

The discipline is to delete it. The exploration artifact is not the implementation. If it survives into the real codebase, you have shipped a junior's three-day daydream at agent speed.

The actual decision

You are not deciding whether to use AI agents. You already did. You are deciding whether to review their output the way you review junior output, or to keep shipping abstractions nobody asked for.

Recommended for you

Enjoyed this article?

Subscribe for new articles. No spam. Unsubscribe anytime.

By subscribing you agree to receive the newsletter. See the Privacy page.