New Software Development Life Cycle
For most of computing's history, programming has been an act of translation. A person understands a problem in human terms, designs a solution in abstract terms, and then renders that solution in a syntax precise enough for a machine to exe
For most of computing's history, programming has been an act of translation. A person understands a problem in human terms, designs a solution in abstract terms, and then renders that solution in a syntax precise enough for a machine to execute. Every step in that chain introduces friction, and for decades the friction was simply the cost of doing business. The developer's primary interface with the machine was syntax itself: the curly braces, the semicolons, the type annotations, the exact grammar of a programming language. That interface is now dissolving. The most consequential change in software engineering today is not a new language or a faster cloud — it is the shift from writing code to expressing intent, and trusting intelligent systems to turn that intent into working software. This is not a forecast. It is the working reality of a large and growing share of the profession. By early 2026, roughly eighty-five percent of professional developers were using AI coding agents regularly, about half of them every day, and an estimated forty percent of all new code was being generated by AI. The change arrived gradually and then all at once. It began with autocomplete, a humble prediction of the next few characters. It grew into inline suggestions that could finish whole functions, then into chat interfaces where a developer could describe a feature in plain language and receive a working implementation. Now there are autonomous agents that can clone a repository, plan a change spanning many files, execute it in a sandbox, run the tests, and open a pull request without a human touching the keyboard. Each generation kept what came before and raised the ceiling on what a single engineer could accomplish. To talk about any of this clearly, two terms need unpacking, because both have been stretched until they nearly lost their meaning. The first is the agent. An AI agent is a system that perceives a goal, plans steps toward it, acts through tools, observes the results, and iterates until it either succeeds or hits a stopping point. Where a chatbot answers and waits, an agent runs its own loop. You hand it a mission at the top, and it decides what to do at each step along the way. Underneath, every agent is assembled from the same handful of parts: a model that does the reasoning, tools that connect it to the world, memory that lets it carry state across a session, orchestration code that runs the loop, and the deployment infrastructure that turns a prototype into a service. The loop — perceive, plan, act, observe, repeat — is the beating heart of the whole enterprise. The second term is vibe coding. In February 2025, Andrej Karpathy described a way of working in which you give in to the vibes, accept whatever the AI produces, and when something breaks, paste the error back and ask it to fix the problem. The phrase went viral because it named something many people were already doing but had no language for. It also became a victim of its own success. Within months it was being applied to any AI-assisted workflow at all, which blurred a distinction that genuinely matters. Is a senior engineer implementing a well-specified feature with an assistant "vibe coding"? Is a team executing a carefully planned architecture through agents? By 2026 Karpathy himself conceded the original framing was too narrow and introduced a second term — agentic engineering — to name the disciplined end of what had become a spectrum. A spectrum, not a binary It is more useful to treat vibe coding and agentic engineering as two ends of a single continuum than as opposing camps. The question that places you on that continuum is never simply whether you use AI. It is how much structure, verification, and human judgment surrounds the AI's output. At one end, intent is expressed in casual prompts, the code is barely read, errors are bounced back to the model, and verification amounts to a glance to see whether the thing seems to work. This is entirely appropriate for a prototype, a throwaway script, a hackathon project — disposable code where the cost of being wrong is trivial. At the other end, intent is captured in formal specifications and architecture documents, automated test suites and evaluation gates verify every change, the human reviews the architecture comprehensively while the AI handles implementation detail, and risk is driven down by systematic checks at every stage. This is what production systems demand. Telling a CTO that the team is vibe coding the payment system should, rightly, set off alarms. Telling that same CTO that the team practices agentic engineering, with AI implementing under human-designed constraints while test coverage guarantees correctness, is an entirely different conversation. The single sharpest line between the two ends is how outputs get verified. In vibe coding, verification is optional. In agentic engineering, two mechanisms work in tandem. Tests check the deterministic parts of a system — a given input produces a given output. Evaluations, or evals, check the parts that are not deterministic: did the agent take a sensible path, choose the right tools, and produce a result that clears the quality bar? Tests are judged by code; evals are judged by labelled datasets, scoring rubrics, and model-based judges. Without both, the practice remains vibe coding no matter how sophisticated the prompts look. The skill, in the end, is knowing where on the spectrum a given task belongs and drawing the line deliberately. Most real work lives somewhere in the middle. Context, not prompts, is the real craft As the field matured, a quieter insight displaced the early obsession with prompt cleverness: the quality of AI-generated code depends far less on how you word your request and far more on the quality of the context you provide. This is the discipline of context engineering — supplying an agent with rich, structured information about the codebase, the architecture, the conventions, and the intent behind the work. The right mental shift is to stop asking how to trick the model into writing good code and start asking what a capable new teammate would need to know to contribute well, and how to encode that knowledge in a form the model can actually use. There are six kinds of context worth distinguishing. Instructions define the agent's role, goals, and boundaries. Knowledge supplies the documents, diagrams, and domain-specific data it draws on. Memory holds both the short-term log of what just happened and the long-term sense of what the project is. Examples give it behavioral demonstrations and reference patterns to imitate. Tools are the precise definitions of the APIs and services it can call. Guardrails are the hard constraints and safety checks it must not breach. The art lies in deciding which of these the agent should carry at all times and which it should fetch only when needed. Static context — system instructions, rule files, global memory — is always loaded and defines who the agent is, but it is expensive, because every token is present in every interaction whether it is relevant or not. Dynamic context is pulled on demand: a skill triggered by a matching task, a document retrieved mid-execution, a tool result. It is efficient precisely because you pay for it only when it earns its place. Drawing that boundary well is a genuine engineering trade-off, and the best teams version and review it like any other piece of configuration. The most powerful pattern for managing dynamic context is the agent skill: a portable, self-contained package of procedural know-how that the agent loads only when a task calls for it. Rather than stuffing every specialized capability into one bloated prompt, skills let an agent stay a lightweight generalist that flexes into a specialist on demand. It sees only thin metadata at rest, loads full instructions when a task matches, and reaches for deep reference material only when it must. The payoff is that a single agent can carry dozens of capabilities while paying the cost of just the one it is currently using. This matters because it solves problems that have dogged agent development from the start — the rot that sets into overloaded prompts, the absence of durable procedural memory, the overhead of juggling many agents, and the need to move work cleanly between tools and vendors. The model is the smaller part: the harness When people first start building with agents, there is a strong temptation to treat the model as the whole system. A better model lands and the agent seems smarter; an older one and it seems worse; the model becomes the explanation for everything. That intuition is wrong, and it leads to the wrong investments. The model is one input. Everything around it — the prompts, the tools, the context policies, the hooks, the sandboxes, the sub-agents, the observability — is the harness, the scaffolding that lets a model actually finish something. A clean way to hold this is the equation: agent equals model plus harness. The engine, on its own, cannot manufacture a car. It needs belts and gears and sensors and an assembly line. Concretely, the harness is the instructions and rule files that say who the agent is and what it must never do; the tools it can call, along with the prose that tells it when and how; the sandboxes where its code actually runs and the limits on what it can reach; the orchestration logic that spawns sub-agents and routes work between specialists; the deterministic hooks that fire at fixed moments, blocking a commit that contains a hard-coded password or running a check after every file edit; and the observability layer of logs, traces, and cost metering that reveals whether the agent is performing or quietly drifting. That is a large surface area, and it belongs to the team, not the model provider. Its importance is measurable. On one public benchmark, a team moved a coding agent from outside the top thirty into the top five by changing only the harness, with no change to the model at all. The everyday version of this is worth internalizing: when an agent does something wrong, the reflex is to blame the model, but more often the failure traces to a missing tool, a vague rule, an absent guardrail, or a context window stuffed with noise. Examined honestly, most agent failures are configuration failures. And the difference between vibe coding and agentic engineering, it turns out, is not which agent you use — a single agent can do either — but how deliberately you configure that harness. The life cycle, reshaped Software development has already weathered one major transformation, the long migration from sequential waterfall toward iterative practice: agile sprints, continuous integration, DevOps pipelines, frequent releases. AI now compresses that cycle again, but unevenly. Implementation that once took weeks can be done in hours, while requirements, architecture, and verification remain stubbornly human-paced. The result is not a faster version of the old life cycle but a different shape of work, where the boundaries between phases blur, iteration shrinks from weeks to minutes, and the developer's center of gravity moves from primary implementer toward system designer and quality arbiter. Each phase feels the change differently. Requirements, historically the place where the gap between intent and implementation was widest, become a live conversation rather than a document handed across a wall. AI can draft user stories from a brief, surface edge cases a person would miss, generate API schemas from plain descriptions, and turn a specification into a working prototype in minutes, collapsing the loop between idea and artifact to almost nothing. Architecture, by contrast, remains the most stubbornly human part of the process, and for good reason: architectural decisions are trade-offs between consistency and availability, complexity and flexibility, building and buying — judgments rooted in business context and long-term strategy that a model cannot fully grasp. What AI does superbly is implement an architecture once it has been decided, scaffolding applications and enforcing consistent patterns, which shifts the developer's labor from writing boilerplate to making and documenting the structural decisions that boilerplate expresses. Implementation is where the headline productivity gains live, with surveys reporting improvements in the twenty-five to forty percent range, though the truth is more textured than the numbers suggest. One careful study found that experienced developers using AI assistants actually took longer on certain tasks, because the time saved on writing was spent verifying, debugging, and correcting the output. AI does not so much eliminate implementation work as transform it from writing into reviewing, guiding, and verifying. Testing changes character too. Evaluating AI-generated code means checking not only what was produced but how it was produced — output evaluation asks whether the artifact compiles and passes, while trajectory evaluation inspects the full sequence of steps and intermediate reasoning. Both matter, because a fluent answer that skipped its verification is more dangerous than one with an obvious error. The most effective teams wire these checks into a continuous loop: evaluate against a benchmark, cluster the failures, fix the prompts or tools that caused them, verify against a regression suite, and watch production for new failure modes, with each cycle compounding on the last. Review and deployment are increasingly AI-aware. A model can serve as a first-pass reviewer, flagging bugs, style violations, and security and performance issues before a human looks, which lightens the reviewer's load without removing the human judgment that design and maintainability still require. Deployment pipelines can monitor their own health, roll back bad releases, and predict the risk of a change from its scope. And maintenance — perhaps the most underestimated shift of all — is transformed because legacy code that was once impenetrable can now be read, understood, and modified with an agent's help. Code that was "too risky to touch" because only its original authors understood it can be refactored, migrated between frameworks, and modernized, work that was previously so tedious and risky it simply never got done. The mental model that ties all of this together is the factory. In it, the developer's primary output is not code but the system that produces code: the specifications and context that define what to build, the agents that translate specs into implementation, the tests and gates that verify correctness, the feedback loops that route failures back for correction, and the guardrails that keep agents inside safe, predictable behavior. A factory manager does not assemble each widget by hand; they design the line and own the quality control. The modern developer designs the development system and ensures its output meets the bar. Success comes from handing agents success criteria rather than step-by-step instructions, and then letting them iterate. Two postures, and the stubborn last fifth As implementation passes to the machine, the developer tends to occupy one of two postures, often moving fluidly between them across a single day. In conductor mode, the work is hands-on and synchronous: the developer is in the editor, watching code appear, steering with prompts and corrections, keeping fine-grained control. This suits complex logic, tricky debugging, and unfamiliar code where every change needs to be understood as it lands, and it preserves the sense of mastery that engineers value. Its risk is that it can become a bottleneck — if a person is directing every keystroke, the throughput gain from AI is capped. In orchestrator mode, the developer operates higher up: defining goals, assigning them to agents, and reviewing results rather than watching lines appear. Agents may run in parallel, in the background, across different parts of a codebase, with the developer checking in to review and correct. This fits well-defined work — bug fixes, features against established patterns, migrations, test generation — and it demands a different skill set: specifying tasks precisely, decomposing large jobs into agent-sized units, evaluating output quickly, and designing the constraints and feedback loops that keep agents productive. Both postures run into the same wall, which is worth naming plainly: the eighty percent problem. Agents can rapidly produce roughly eighty percent of a feature, but the remaining fifth — the edge cases, the error handling, the integration points, the subtle correctness requirements — demands deep contextual knowledge that current models often lack. The nature of the errors has shifted, too, from simple syntax mistakes to more insidious conceptual ones: wrong assumptions about business logic, a failure to ask for clarification on an ambiguous requirement, a missed edge case, an architectural choice that quietly accrues maintenance debt. These are harder to catch precisely because the code looks right and may even pass the basic tests. The developers who navigate this best adopt a deliberate stance. They use AI for what it is good at — rapid implementation of well-specified work — and reserve their own attention for what it struggles with: ambiguity, architectural trade-offs, and the verification of correctness. They do not try to go faster by accepting everything the model produces. They go faster by aiming their expertise where it counts. In day-to-day practice, coding agents show up in three places, and most developers use all of them. In the editor, inline completion and chat keep work in flow. In the terminal, an agent launched from the command line and handed a goal in plain language can range across the codebase, run tools and tests, and iterate on what it observes — this is where serious work happens today. In the background, an agent takes a task and runs autonomously in a cloud sandbox, sometimes for hours, often returning a pull request for later review. The editor agent helps when you are mid-thought and want a suggestion without leaving flow; the terminal agent fits multi-file exploration and tasks that require running code and reacting; the background agent fits well-specified jobs you can describe in a paragraph and walk away from. The right starting point depends on the task, not on which option sits highest on some imagined ladder of autonomy. And the same workflow that produces a prototype script increasingly produces a production agent — one with persistent memory, scoped permissions, eval coverage, and observability — without a rewrite, collapsing the path from idea to running system from weeks into hours, most of it conducted in natural language. The economics underneath For an engineering leader, the most revealing question is not how fast the team can write code but what the whole thing costs to own. That total cost splits into the upfront investment to build something and the ongoing cost to run, fix, and maintain it — and in the AI era the ongoing side is dominated by the token economy, the per-interaction price of sending information to a model. Seen this way, the two ends of the spectrum carry opposite cost shapes. Vibe coding looks almost free to start: a monthly subscription and a few casual prompts, with no time spent on system design. But it hides a compounding operational burden. Developers dump large, unstructured files into the context window and ask the model to fix its own unverified mistakes, creating an expensive prompting loop with low first-pass success. The code that results often lacks structural consistency, so a bug six months later costs days of reverse-engineering. And without an evaluation harness, fast code generation means fast vulnerability generation, with security flaws far more e
