Skip to main content
Back to Blog
AIAug 10, 2026·8 min read

AI Can Write Code. Understanding Software Is Still the Hard Part.

Sandaruwan Shanaka avatar
Sandaruwan Shanaka
Fullstack Developer & AI Engineer
AI Can Write Code. Understanding Software Is Still the Hard Part.

Give any modern frontier model—whether it’s Claude Opus, GPT-5.6 Sol, or an open-weight engine like Qwen 3.6 Coder—a clean algorithmic challenge, and it will output working, syntactically pristine code in less than three seconds. The mechanical act of generating functions, classes, and loops has effectively reached zero marginal cost.

Yet, if you take that exact same model, drop it inside a living, multi-thousand-line production repository, and assign it a real-world Jira ticket or GitHub issue, its success rate plunges.

Recent evaluations across multi-file software engineering benchmarks reveal a stubborn, universal bottleneck: coding agents fail between 55% and 70% of production-grade tasks. And when researchers audit the autopsy reports of these failed runs, the primary point of failure is rarely bad syntax, compiler errors, or missing semicolons.

The primary breakdown—accounting for up to 46% of all execution failures—is the agent’s complete inability to identify and satisfy implicit requirements.

We don’t have a code generation problem anymore. We have a software understanding problem. The central bottleneck of artificial intelligence in software engineering is no longer "Can the AI write the function?" It is increasingly: "Did the AI understand what the human actually wanted?"


The Syntax Illusion: Why Function Generation Isn't Software Engineering

To understand why autonomous coding agents hit a wall when dealing with real-world applications, you have to dissect the fundamental difference between writing code and building software.

For three years, the tech industry celebrated benchmark scores on synthetic test suites like HumanEval and MBPP. These benchmarks presented models with explicit, self-contained mathematical or string-manipulation puzzles: "Write a function that reverses a linked list" or "Given an array of integers, return the two indices that sum to target $K$."

Rendering diagram...

In an isolated puzzle, 100% of the requirements are stated explicitly in the prompt. But in professional software engineering, the explicit text in an issue ticket represents less than 20% of what is actually required to ship the feature.

As illustrated in the classic software development lifecycle, implementation is merely step three. It is preceded by requirements specification and system architecture, and followed by verification and integration.

Language models were trained intensely to compress the implementation phase. But when an agent jumps straight into writing code without performing requirements elicitation, it inevitably breaks the system.


The Iceberg of Implicit Requirements

Consider what happens when a product manager or lead developer asks an AI coding agent to implement a seemingly simple feature:

"Add a user avatar upload field to the settings profile page."

To a naive language model operating purely on token completion, the solution looks straightforward: create an HTML file input, add an Express or FastAPI endpoint that accepts multipart/form-data, and write the incoming bytes to a local directory on disk. The agent runs a superficial unit test, sees a 200 OK status code, and declares victory.

To an experienced human software engineer, that single prompt triggers an entire iceberg of unstated, mandatory implicit requirements:

  • Security & Sanitization: Validate magic file bytes (not just the .png extension) to prevent remote executable uploads. Strip EXIF metadata to protect user location privacy. Enforce a strict 5MB upload ceiling before buffering into memory.
  • Infrastructure & Scaling: Never save uploads to ephemeral server storage; stream the payload asynchronously to an S3 bucket or CDN storage.
  • State & Resilience: Handle database rollbacks if the network drops halfway through the file transfer. Invalidate client-side session caches so the new avatar displays instantly without a hard page reload.
  • User Experience Edge Cases: What happens when a user uploads an ultra-wide panoramic photo or an animated GIF? What if the user submits the form four times in rapid succession on a slow 3G mobile connection?

If an implicit requirement is not explicitly written in the prompt or indexed in the immediate context window, it simply does not exist to the model. The agent generates code that works in a vacuum, but crumbles the moment it touches production reality.


The Two Worlds: Syntax Typist vs. Systems Architect

The gap between generating lines of code and understanding system context defines the current frontier of developer tooling:

Engineering DimensionCode Generation (What AI Does Well)Software Engineering (Where AI Struggles)
Input StructureWell-defined function signatures and explicit unit test criteria.Ambiguous natural-language requests with missing constraints.
Context ScopeSingle file, isolated memory, clean inputs and outputs.Multi-file dependencies, global state managers, historical technical debt.
Failure ModesSyntax errors, type mismatches, recursion limits (easily caught).Silent security flaws, race conditions, edge-case UI lockups, cache leaks.
Primary SkillAlgorithmic translation and syntax memorization.Requirement elicitation, trade-off analysis, and system taste.

From the SLIIT Trenches: The Multi-Agent Reality Check

Sitting at my workstation late into the night here in Central Sri Lanka—balancing Information Technology degree modules specializing in Artificial Intelligence at SLIIT with real-world software engineering—this requirements gap is something I witness constantly.

My primary engineering rig is an MSI Cyborg laptop upgraded with 28GB of high-speed DDR5 RAM. I spend a significant amount of time running localized multi-agent workflows using Ollama, LM Studio, and OpenClaw. I manage a multi-agent framework featuring three specialized digital workers:

  • Hana (Research & Content Architecture): Gathers technical documentation, parses research papers, and structures high-level technical specifications.
  • Zero (Codebase Execution & Refactoring): Traverses local project trees, writes TypeScript and Python patches, and executes local terminal commands.
  • Sakura (Workflow Management): Functions as the orchestration graph, managing context state transitions and memory handoffs between Hana and Zero.
Rendering diagram...

When I watch an agent like Zero tackle a refactoring task, its speed is breathtaking. It can rewrite a database query or scaffold a React component tree in ten seconds.

But if I don't give it explicit architectural constraints, it consistently falls into the implicit requirement trap:

  • It writes raw SQL queries inside an API handler, forgetting that the project uses an established ORM pattern.
  • It forgets that our authentication middleware expects a specific bearer token format.
  • It passes an asynchronous promise without an explicit .catch() handler, creating silent server timeouts.

The agent doesn't fail because it lacks intelligence; it fails because it lacks the tacit knowledge and implicit mental model of the codebase.


The Developer Playbook: How to Bridge the Intent Gap

If autonomous AI agents struggle to infer implicit requirements on their own, our engineering workflow must adapt. We must stop treating coding agents like mind-readers and start treating them like brilliant, literal-minded junior engineers who require clear, declarative architectural boundaries.

  1. Force a Specification & Planning Pass (RFC Phase): Specification First. Never ask an agent to implement a feature directly from an issue ticket. Require the agent to write a structured technical specification (PLAN.md or RFC) detailing its assumptions, affected files, edge-case strategies, and API contracts before it writes any implementation code.

  2. Encode Tacit Knowledge in Repository Constitutions: Declarative Rules. Extract your team's unspoken conventions and encode them explicitly in .cursorrules, CLAUDE.md, or modular SKILL.md packages. Define strict rules for error handling, state management, naming conventions, and forbidden libraries.

  3. Enforce Schema-First Data Interfaces: Contract-Driven Design. Before generating application logic, force the agent to define strict TypeScript interfaces, OpenAPI contracts, or database schemas. Establishing explicit data boundaries prevents the agent from making flawed assumptions about payload structures.

  4. Implement Mandatory Edge-Case Test Suites: Test-Driven Constraints. Direct the agent to write comprehensive regression tests—including null checks, network timeouts, invalid inputs, and boundary conditions—before writing the feature code. The tests transform your implicit quality expectations into explicit pass/fail gates.


The Horizon: The Rise of the Intent Architect

The realization that understanding requirements is the true bottleneck of software engineering completely reframes the future of our profession.

For decades, the software engineering industry confused the medium of our work (writing code) with the purpose of our work (solving human problems with systems). Syntax was just the tedious, high-friction language we had to speak so a computer could execute our logic.

Now that machine intelligence can handle the syntax, the real human craft of software engineering is finally stepping into the spotlight:

  • Discovering what actually needs to be built.
  • Anticipating failure modes in complex, distributed systems.
  • Translating messy, ambiguous human needs into precise architectural specifications.
  • Auditing systems for security, resilience, and ethical safety.

The developers who thrive in the agentic era won't be the ones who can type syntax the fastest. The future belongs to the Intent Architects and System Governors—the engineers who know how to ask the right questions, define strict boundaries, and turn ambiguous human desires into robust, verified software that stands the test of time.