AI Engineering in 2026: How We Build Software with AI

January 7, 2026

AI tooling compresses implementation work and leaves the judgment layer intact. The variable that determines whether it produces net time savings is how project context is established before any generation happens.

The autonomous replacement scenario did not occur. What did occur is that language models became reliable collaborators for a specific class of work, and the teams that established a working method for it are shipping faster than teams that adopted the tools without one.

Context establishment is the determining factor

Language models do not infer institutional context. They produce output from what is supplied, and in its absence they produce plausible code that contradicts established conventions.

A developer who has worked on a system for two years knows its architecture decisions, its conventions, and which patterns were tried and rejected. A model starts each session without any of that. The failure mode is not incorrect code — it is correct code written against the wrong conventions, which is more expensive to detect in review than a syntax error.

The project-level context document is the practical response. A file at the repository root establishing architecture, conventions, and standing decisions gives every subsequent interaction a starting position. What belongs in it:

  • The architecture in a paragraph, including what the system is not
  • Conventions the codebase follows, stated as rules
  • Approaches previously rejected, with the reason
  • Which directories mean what
  • Test and build commands
  • Constraints — data that cannot be logged, dependencies that cannot be added, patterns under active migration

The writing cost is a few hours. It is recovered within the first week, because each session begins with context rather than reconstructing it.

Documentation before generation

The workflow that produces reliable output starts with a written plan rather than a prompt, and the plan is written at the integration level rather than the user-story level.

The sequence:

  1. Write what the feature does in terms of how it fits the existing architecture, which systems it touches, and what the edge cases are. User stories are insufficient here — they describe outcomes, and the model needs constraints.
  2. Have the model interrogate the plan. Ask it to identify gaps and pose clarifying questions one at a time. This step reliably surfaces implicit assumptions and underspecified requirements, and it is cheaper here than in review.
  3. Resolve the questions in the document, not in conversation, so the resolutions persist.
  4. Generate against the completed plan.

Steps 2 and 3 are where the time is recovered. The failure mode of AI-assisted development is generating a large volume of code against an underspecified requirement and reviewing it afterward, which relocates the work rather than reducing it.

What accelerates

Mechanical work compresses substantially. The categories with reliable returns:

  • Boilerplate and scaffolding
  • Tests for behavior that is already specified
  • Initial implementations of well-defined, self-contained problems
  • Translation between formats and languages
  • Reading unfamiliar code and producing an explanation of what it does
  • Refactoring where the target state is specified

Work that would consume a full day frequently completes in a few hours. The recovered time goes to the categories below.

What does not change

Judgment work is not delegable, and attempting to delegate it produces confident output with no basis.

  • Architecture decisions. Whether a system should be structured one way or another depends on organizational context, expected change patterns, and operational capability the model has no access to.
  • Build versus integrate. Requires knowledge of vendor behavior, contract terms, and internal capacity.
  • Failure mode analysis. Understanding how an integration fails in production, and what that costs, comes from having operated it.
  • Second-order consequences. Recognizing that a technically correct solution will create an operational problem in six months.
  • Requirement validation. Determining that a stated requirement is not what the business needs.

The model will produce an answer for each of these. The answer is a plausible synthesis, and it is not grounded in the specifics that determine whether it is right.

Reviewing generated code

Generated code requires a different review posture than human-written code, because the error distribution differs.

  • Convention drift is the most common defect. Code that works and does not match how the rest of the system is built.
  • Plausible-but-wrong API usage. Method signatures and library behavior that are close to correct. This is the defect class that most often reaches production.
  • Missing edge case handling where the specification did not state the case, since the model implements what was specified and nothing more.
  • Over-implementation. Abstraction and configurability that was not requested and now must be maintained.

The reviewer needs to know what correct looks like in this codebase. This is why the technique raises the output of experienced developers more than it raises the output of inexperienced ones — the review step requires the judgment the generation step lacks.

The net position

Implementation timelines compress, which increases the scope achievable within a given engagement. The decisions about what to build and how to structure it remain the work, and they remain the constraint on quality.


Working through a problem like this?

Describe the system and where it's stuck. I'll tell you what the work actually involves.

Get in touch