AI Can Write the Code. Who Gives It the Context?
When you talk to ChatGPT about a subject you understand well, you quickly notice something.
The first answer is rarely the final answer.
You add context.
You correct an assumption.
You explain what has already been tried.
You point out that one proposed solution conflicts with another part of the system.
After a few iterations, the answer becomes useful.
The same thing happens when AI writes code for real products.
The difference is that a slightly incorrect explanation in a chat is usually harmless. Slightly incorrect code can become part of your product, pass a superficial review, and remain there for years.
This is why successful AI adoption in software engineering is not primarily about generating more code.
It is about context engineering: giving AI enough context, constraints, and feedback to generate code that belongs in your system.
The First Answer Is Usually Not Enough
AI coding tools are very good at producing plausible solutions.
That word matters: plausible.
The code may compile.
The tests may pass.
The implementation may even look clean when reviewed in isolation.
But software does not exist in isolation.
A change must fit the broader system architecture:
- the current architecture
- existing domain rules
- security requirements
- operational constraints
- established conventions
- previous technical decisions
- future product direction
An AI assistant does not automatically understand those things.
It knows the code it can see and the engineering context you provide. Everything outside that window must be inferred.
And inference is where divergence begins.
If you trust the first response without validating its assumptions, you are usually not accelerating engineering.
You are accelerating uncertainty.
Lack of Context Creates Duplication
One of the first visible effects is duplication.
AI does not necessarily know that your application already has:
- a validation helper for the same domain rule
- an established authorization pattern
- a shared API client
- a retry mechanism
- an error hierarchy
- an existing abstraction for the same operation
Without sufficient engineering context, it creates another one.
The new implementation may be technically correct. It may also be slightly different from the existing implementation.
Now the system has two ways to solve the same problem.
Repeat this across dozens of AI-generated changes and the codebase slowly breaks a basic rule engineers call DRY (don't repeat yourself). The same problem should be solved once, in one place, not rebuilt slightly differently every time. Not because anyone deliberately chose duplication, but because each generated change was created from a partial view of the system.
This is one of the biggest risks of optimizing purely for development speed.
The individual pull request looks faster.
The product becomes slower to change.
Speed Is Not the Same as Longevity
Many companies currently measure AI adoption by how much faster engineers can produce code.
That is understandable.
Generated code is visible. Long-term maintainability is not.
You can measure how quickly a feature reached production. It is much harder to measure how much architectural inconsistency was introduced along the way.
The cost appears later:
- similar features behave differently
- abstractions begin to overlap
- documentation stops matching implementation
- developers no longer know which pattern is preferred
- changes require more investigation
- AI receives increasingly contradictory context
The system becomes harder for humans to understand.
It also becomes harder for AI to understand.
This creates a feedback loop.
Weak context produces inconsistent AI-generated code. Inconsistent code produces weaker context for the next generation.
From Artisanal Furniture to IKEA
Coding has always contained an element of craft.
Experienced engineers develop preferences around naming, abstractions, interfaces, failure modes, and the shape of a maintainable system.
In that sense, software development has often resembled building artisanal furniture.
Each piece receives attention. Decisions are made by someone who understands the material, the environment, and the intended use.
AI changes the economics.
We are moving from artisanal furniture towards IKEA.
Software components can be produced faster, in greater volume, and by more people. That is not necessarily bad.
Most companies do not need every internal tool to be a handcrafted masterpiece.
Mass production works when the pieces are standardized and the person assembling them has reliable instructions.
Without the instructions, you do not get scalable production.
You get a room full of boards, screws, and several pieces that look almost identical but are not interchangeable.
Who Writes the Instructions?
In software organizations, those instructions are created by experienced engineers with product knowledge.
Senior and staff engineers understand more than the syntax of the codebase.
They know:
- why a particular architectural decision was made
- which shortcuts are temporary
- where regulatory or security constraints exist
- which parts of the product are likely to change
- which abstractions have already failed
- what must remain consistent across teams
That knowledge needs to become accessible to both people and machines.
This includes:
- Architecture Decision Records
- engineering standards
- domain documentation
- code examples
- security policies
- testing requirements
- dependency rules
- service ownership
- operational runbooks
The goal is not documentation for its own sake.
The goal is to turn organizational knowledge into usable engineering context.
A codebase without recorded decisions already creates problems for junior developers.
AI amplifies the same problem.
When there are no written ADRs, your junior AI engineer will happily make a different architectural decision in every pull request.
Old Knowledge Is Dangerous Context
Creating a knowledge base is not enough.
It must remain current.
Outdated documentation can be worse than missing documentation because it gives the model confidence in the wrong constraints.
Imagine that your architecture document still recommends a pattern the team abandoned six months ago.
A human engineer may notice the discrepancy through conversations, recent pull requests, or experience with the system.
AI may treat the document as authoritative.
It then generates code that follows an obsolete direction, while appearing perfectly aligned with the company's written standards.
This means engineering knowledge must be treated like code:
- versioned
- reviewed
- owned
- tested where possible
- removed when no longer valid
AI can help here too.
It can compare documentation with current implementation, detect references to removed services, identify conflicting instructions, and highlight architectural patterns that are no longer followed.
But the final responsibility still belongs to the organization.
Automating knowledge checks does not remove ownership.
It makes ownership easier to exercise.
Guardrails Matter More Than Prompts
Good prompt engineering helps.
Engineering guardrails matter more.
AI-generated code should move through the same engineering system as human-generated code, with stronger automation where appropriate.
That means proper CI/CD controls:
- static analysis
- automated tests
- type checking
- dependency scanning
- security scanning
- architectural boundary checks
- migration validation
- deployment safeguards
Where rules can be expressed automatically, they should not depend on someone remembering them during every conversation with an AI assistant.
A prompt can say:
Do not access the database directly from this layer.
An architectural test can enforce it.
The second one scales better.
The most successful AI-enabled teams will not be those with the longest prompt files. They will be those that convert important engineering decisions into automatically verifiable constraints.
Human-in-the-Loop Review
Not every change requires the same level of human attention.
Generating a small internal tool is different from changing payment processing, authorization, infrastructure, or a financial ledger.
Organizations need to decide where a human must remain directly involved.
Critical areas may include:
- security boundaries
- financial calculations
- data migrations
- compliance logic
- production infrastructure
- irreversible operations
- public APIs
- architectural changes
Human review is not there because AI is useless.
It is there because responsibility cannot be delegated to a probabilistic system. That is the core of human-in-the-loop validation.
The important question is not whether AI participated in the change.
The important question is whether the organization applied the right level of control to the risk involved.
Code Review Is Changing
Code review remains crucial.
But reading every generated line manually is becoming less realistic as the volume of AI-generated code increases.
The answer is not to stop reviewing.
The answer is to change how review works.
Engineers increasingly guide AI to examine changes from multiple perspectives:
- Does this duplicate an existing implementation?
- Does it violate an architectural decision?
- Are authorization checks consistent with similar endpoints?
- What edge cases are missing?
- Can this migration be safely rolled back?
- Which assumptions does this code make?
- Does the documentation still match the implementation?
The reviewer moves from inspecting every character to directing a structured investigation.
AI generates code.
AI can also criticize it, compare it with the rest of the system, and search for inconsistencies.
The human decides which questions matter and whether the answers are sufficient.
That is still engineering judgment.
Where Juniors Fit
Junior engineers are still welcome.
AI does not remove the need for people entering the profession. It changes the environment in which they learn.
Previously, juniors often developed their skills by writing relatively simple implementations and receiving feedback from more experienced engineers.
AI can now produce many of those implementations faster.
But generating the implementation was never the final objective.
The objective was learning how to reason about a system.
Juniors still need to understand:
- how to validate assumptions
- how to investigate existing code
- how to recognize duplication
- how to test behavior
- how to evaluate trade-offs
- how to ask better questions
- when to escalate a decision
Companies should not optimize juniors purely for prompt throughput.
They should optimize for how quickly people build reliable mental models of the product.
That requires access to knowledge, mentorship, and clear engineering standards.
The same context engineering that makes AI better also makes junior engineers better.
AI Naturally Favors What Already Exists
There is another longer-term concern.
AI models are trained on existing knowledge.
They naturally lean towards technologies, libraries, and architectural patterns that appear frequently in their training data and online documentation.
That gives established technologies an additional advantage.
A mature framework has:
- years of documentation
- thousands of public examples
- answered questions
- tutorials
- production case studies
- code available in public repositories
A new framework has very little of this.
Even when the new framework offers a better approach, AI may produce weaker results because it has less knowledge about how to use it correctly.
This may create an unexpected effect.
AI could accelerate development inside established ecosystems while slowing the adoption of genuinely new ones.
Teams may avoid newer technologies not because they are worse, but because their AI tools are less effective with them.
The internet was already influenced by popularity.
AI may reinforce that influence by turning popularity into implementation quality.
New frameworks will need to treat machine-readable documentation, examples, migration guides, and strong tooling as core parts of adoption.
It will no longer be enough for a technology to be good.
AI must also be able to understand it.
There Is Still a Place for Craft
Not all software should become mass-produced furniture.
There will remain areas where code itself carries unusual value:
- specialized algorithms
- performance-critical systems
- novel research
- low-level infrastructure
- proprietary domain knowledge
- safety-critical software
- new technical paradigms
These are places where the available training data may be limited and where correctness depends on knowledge that cannot be reconstructed from common public patterns.
There will also always be engineers who treat code as a form of art.
There is a place for that.
But most commercial software is not valuable because every function is uniquely beautiful.
It is valuable because it solves a real problem reliably and can continue evolving.
AI can help us build more of it.
The condition is that we stop treating generated code as the finished product.
The Real AI Adoption Challenge
The difficult part of practical AI adoption is not selecting a coding assistant.
It is preparing the organization around it.
Do engineers have access to reliable product context?
Are architectural decisions documented?
Is outdated knowledge removed?
Can important rules be checked automatically?
Does CI/CD prevent unsafe shortcuts?
Are humans involved where the consequences justify it?
AI makes producing code cheaper.
It does not make understanding the product less important.
In fact, as implementation becomes easier, context engineering becomes the scarce resource.
The companies that benefit most from AI will not necessarily be those that generate the most code.
They will be those that provide the clearest instructions for how all the pieces should fit together.