AI is writing more code.
That part is obvious now.
Developers can ask an agent to:
- create a feature
- write tests
- fix a bug
- refactor a module
- update documentation
- generate SQL
- review a pull request
- even run commands and modify files
And in many cases, it works surprisingly well.
But something else is happening at the same time.
Developers are writing less of the code, while becoming responsible for more of it.
That is the part I think we are underestimating.
Because when production breaks at 2 AM, nobody is going to ask:
“Which model generated this function?”
They are going to ask:
“Who owns this system?”
And the answer is still us.
The Old Workflow Was Easier to Reason About
A traditional development workflow looked something like this:
Understand requirement
↓
Design solution
↓
Write code
↓
Test it
↓
Review it
↓
Deploy it
↓
Maintain it
The developer touched almost every stage.
That had problems.
It was slower.
It required more manual work.
But there was one big advantage:
The person responsible for the code usually understood how it was created.
Now the workflow is changing.
The New Workflow Looks More Like This
Understand requirement
↓
Ask AI to plan
↓
AI writes implementation
↓
AI writes tests
↓
AI fixes errors
↓
AI reviews code
↓
Developer approves
↓
Production
Look carefully at where the human appears.
Sometimes the developer is only deeply involved at the beginning and the end.
That creates a strange new situation.
The developer may be responsible for:
- architecture they did not design
- code they did not write
- tests they did not write
- dependencies they did not choose
- edge cases they never considered
- behavior they only partially understand
Yet the developer still owns the result.
Responsibility Did Not Disappear
This is the mistake I think teams need to avoid.
AI-generated code can make something feel less like your responsibility.
It is easy to think:
“The agent generated it.”
But production systems do not care who typed the code.
If you merge it, approve it, or deploy it, it becomes part of the system you own.
That means you are still responsible for questions like:
- Is this secure?
- Does it actually meet the requirement?
- What happens if the API fails?
- Can this corrupt data?
- Does it create a race condition?
- Is the dependency trustworthy?
- Can another developer maintain it?
- What happens under load?
- What happens six months from now?
AI can help answer these questions.
But it cannot remove your responsibility for them.
“The Tests Pass” Is Not Enough
This becomes especially dangerous when AI writes both the code and the tests.
Imagine this:
Requirement
↓
AI misunderstands requirement
↓
AI writes implementation
↓
AI writes tests for its interpretation
↓
All tests pass
Technically:
Green CI.
Practically:
Wrong feature.
This is one of the most important things developers need to remember in AI-assisted development.
Tests can prove that code behaves according to a certain expectation.
They cannot automatically prove that the expectation itself was correct.
If the same model creates both the implementation and the test, they can share the same misunderstanding.
That is why human review still matters at the requirement level.
Developers Are Becoming Supervisors of Software Creation
The developer role is slowly changing from:
Write
Test
Debug
to something closer to:
Define
Constrain
Delegate
Inspect
Verify
Approve
Own
That is not necessarily bad.
In fact, it can be incredibly productive.
But it requires a different skill set.
The best developer may no longer be the person who can type code fastest.
It may be the person who can:
- define the problem clearly
- design good boundaries
- recognize bad architecture
- inspect a large diff quickly
- detect missing edge cases
- understand system behavior
- verify assumptions
- know when AI is confidently wrong
Those are engineering skills, not typing skills.
The Dangerous Part Is Losing System Understanding
This is where I think the real risk begins.
Suppose an AI agent adds a feature across 15 files.
It modifies:
- database schema
- service logic
- API handlers
- validation
- background jobs
- caching
- tests
- frontend state
Everything passes.
You review the diff quickly.
You merge.
Then two months later, something breaks.
Now you need to answer:
Why was this implemented this way?
But maybe nobody knows.
The AI session is gone.
The reasoning was never documented.
The developer who approved it only reviewed the output.
This is how teams can slowly build systems that work but are no longer deeply understood.
Code Generation Can Create Understanding Debt
We already talk about technical debt.
But AI introduces something slightly different.
I think of it as:
Understanding Debt
Technical debt is often:
“We know this code is messy, but we shipped it anyway.”
Understanding debt is:
“We own this code, but nobody fully understands why it works this way.”
That can be even more dangerous.
Because messy code is visible.
Missing understanding is harder to detect.
Everything may look fine until something unusual happens.
Small AI Tasks Are Safer Than Huge AI Tasks
One simple way to reduce this problem is to stop giving agents enormous tasks.
Compare these two prompts.
Bad:
Build the full subscription system.
Better:
Analyze the current billing architecture.
Explain which files need to change.
Do not modify code yet.
Then:
Implement only the subscription data model.
Do not change unrelated files.
Then:
Add the billing service using the existing service pattern.
Then:
Add tests for the new behavior.
Smaller tasks create smaller diffs.
Smaller diffs are easier to understand.
And code that is easier to understand is easier to own.
Ask for the Plan Before the Code
One of the most useful changes you can make is simple:
Ask the AI to explain what it plans to do before it changes anything.
For example:
Before writing code:
1. Explain the current architecture.
2. List the files you plan to change.
3. Explain why each change is needed.
4. Identify possible risks.
5. Wait for approval before implementation.
This gives you a chance to catch bad direction early.
Fixing a bad plan is cheap.
Fixing 800 lines generated from a bad plan is not.
Review Decisions, Not Just Syntax
Traditional code review often focuses on lines.
+ const result = await processPayment()
But with AI-generated code, the more important review may be:
Why is payment processing happening here?
That is a different level of review.
Instead of only asking:
Is this line correct?
Ask:
Should this responsibility live in this module?
Instead of:
Does this function compile?
Ask:
Does this architecture make sense?
Instead of:
Does the test pass?
Ask:
Is this testing the right behavior?
AI is making syntax cheaper.
That means developers need to spend more attention on decisions.
Never Merge Code You Cannot Explain
This rule becomes much more important in the AI era.
You do not need to memorize every line.
But you should be able to explain:
- what changed
- why it changed
- what data moves through the system
- what can fail
- which assumptions exist
- which external services are involved
- how the feature can be rolled back
If someone asks:
“Why does this work this way?”
and your answer is:
“The AI generated it.”
That is not enough.
Once it is merged, it is your system.
Let AI Generate Less Context Switching, Not More Complexity
AI is extremely good at saving developers from repetitive work.
That is where it can create huge value.
Let it help with:
- boilerplate
- repetitive tests
- simple migrations
- documentation
- refactoring suggestions
- test data
- type generation
- small bug fixes
But be careful when the AI starts generating:
- new architectural layers
- new dependencies
- large cross-cutting changes
- security-sensitive logic
- complicated concurrency
- data migrations
- payment logic
The higher the blast radius, the more human understanding should increase.
Not decrease.
Documentation Matters More Now
If AI made an important design choice, capture the reason.
Not this:
// Process the payment
processPayment();
But something like:
// We process payment before creating the final order because
// failed payments must not create confirmed inventory reservations.
That tells the next developer why the code exists.
Architecture Decision Records can also help for larger choices.
The AI session will disappear.
The reasoning should not disappear with it.
The Developer Still Needs to Know How to Debug
There is another interesting effect here.
The more code AI writes, the more valuable debugging becomes.
Because when generated code fails, someone still needs to understand:
- logs
- state
- timing
- network behavior
- databases
- dependencies
- concurrency
- deployment
- infrastructure
AI may help investigate.
But a developer who does not understand the system will struggle to know whether the AI's explanation is correct.
That is why I think debugging may become an even more important skill in the AI era.
Writing code is becoming easier.
Understanding why a system is broken is not.
A Better AI Development Workflow
Instead of:
Prompt
↓
Generate
↓
Tests pass
↓
Merge
Try this:
Define requirement
↓
AI analyzes existing system
↓
AI proposes plan
↓
Developer reviews plan
↓
AI makes small change
↓
Developer understands diff
↓
Tests run
↓
Failure cases reviewed
↓
Architecture reviewed
↓
Merge
The AI is still doing a lot of work.
But the developer remains connected to the reasoning.
That is the important part.
Five Questions I Ask Before Approving AI-Generated Code
Before merging, ask:
1. Can I explain what changed?
If not, keep reviewing.
2. Does this actually solve the requirement?
Not just the test.
The real requirement.
3. What assumptions did the AI make?
Look for hidden assumptions around data, APIs, users, permissions, and infrastructure.
4. What happens when something fails?
Network timeout?
Database error?
Duplicate request?
Partial write?
Unexpected input?
5. Will another developer understand this later?
Because somebody will eventually maintain it.
Maybe you.
AI Does Not Reduce Ownership
This is probably the most important idea.
AI can reduce:
typing
boilerplate
implementation time
repetitive work
But it does not automatically reduce:
responsibility
risk
ownership
maintenance
production consequences
In fact, AI may increase the amount of software a developer is responsible for.
One engineer may soon oversee the amount of code that previously required several people to produce.
That makes engineering judgment more important, not less.
The Real Developer Skill Is Changing
For years, software development was strongly associated with writing code.
Now code itself is becoming easier to produce.
So the valuable skills move upward.
Understanding the problem.
Choosing the architecture.
Defining constraints.
Recognizing risk.
Reviewing decisions.
Debugging failures.
Protecting maintainability.
Taking ownership.
Those things are much harder to automate completely.
Final Thought
AI may write more and more of our code.
That is probably going to continue.
But there is a dangerous assumption hiding behind that productivity:
If AI writes the code, AI owns the consequences.
It doesn't.
You do.
The future developer may write less code personally.
But they may be responsible for more code, more systems, and more decisions than ever before.
So maybe the most important question in AI-assisted development is no longer:
“Can the AI build this?”
It is:
“If I approve this, do I understand it well enough to own it?”
Because generating code is becoming cheap.
Owning software is not.
Top comments (1)
You're right. LLMs don't replace the real engineers; they just makes our work easier. LLMs may be responsible for writing boilerplate and generating code, but developers are the ones responsible for making sure the AI generated code won't break in production. Nice article.