Back to essays Autonomous agents vs pair-programming agents

Autonomous agents vs pair-programming agents

Two models for AI-assisted development. One replaces you, one amplifies you. The difference matters.

From human-steered coding to engineered autonomy

When AI first entered software development, most of us used it like a very fast junior partner.

We asked a question. It produced some code. We copied the result into the codebase, adjusted it, tested it, and continued.

Then copilots arrived.

The interaction became tighter. AI could suggest code in the editor, complete functions, generate tests, and help with small implementation tasks. But the human was still clearly driving the work.

That model was close to classic pair programming.

One person navigates.

One person drives.

Except now the driver could be an AI.

For a while, that distinction mattered a lot.

Today, it matters for a different reason.

The interesting question is no longer whether AI can write code.

It can.

The interesting question is:

How much of the work should we still keep ourselves inside, and how much should we deliberately delegate?

That is the shift from pair-programming agents to engineered autonomy.

Pair programming keeps the human inside the implementation loop

Classic pair programming has two roles.

The navigator thinks ahead, makes decisions, questions the approach and maintains awareness of the larger problem.

The driver performs the implementation.

Early AI-assisted development fit that model surprisingly well.

The human remained the navigator.

The AI:

  • generated code,
  • performed repetitive implementation,
  • suggested alternatives,
  • filled boilerplate,
  • wrote tests,
  • handled mechanical work.

But the human still decided almost everything.

What should be built.

How it should be structured.

Which trade-offs were acceptable.

Which implementation was correct.

The human remained continuously involved in the coding process.

That was useful.

It still can be useful.

But it is no longer the limit of what coding agents can do.

Autonomous agents change the unit of delegation

With a more autonomous agent, the interaction becomes different.

Instead of saying:

Create this class.
Now add this interface.
Change this method.
Add a test here.

you can increasingly say:

Here is the problem.
Here is the context.
Here are the constraints.
Solve it.

The agent can then:

  • investigate the codebase,
  • understand existing structures,
  • make implementation decisions,
  • modify multiple files,
  • run tools,
  • execute tests,
  • react to failures,
  • revise its approach,
  • and return with a result.

The human is still involved.

But not necessarily during every implementation decision.

That is the key distinction.

The human moves from continuous steering toward intent, constraints, evaluation and ownership.

This is a spectrum, not a binary choice

Pair programming and autonomous agents are useful as labels because they describe two very different working styles.

But real systems sit somewhere between them.

At one end:

The human decides almost everything and the agent performs the implementation.

At the other:

The human defines the problem and operating constraints, and the agent independently produces a result.

Between those endpoints are many possibilities:

  • approval checkpoints,
  • partial autonomy,
  • autonomous investigation with human implementation,
  • autonomous implementation with human architectural approval,
  • post-hoc review,
  • risk-based escalation.

The right amount of autonomy depends on the work.

The important part is to choose it deliberately.

Human-in-the-loop does not mean human-in-every-keystroke

This distinction matters because human-in-the-loop is sometimes interpreted too literally.

If a human has to supervise every file change, approve every tool call and understand every line as it is being produced, we have technically kept the human in the loop.

We have also destroyed much of the value of autonomy.

Human ownership does not require continuous implementation supervision.

A human can own:

  • the business intent,
  • the constraints,
  • the acceptable risks,
  • the architecture,
  • the validation criteria,
  • the final decision.

That is still human-in-the-loop.

The loop simply moved.

This becomes increasingly important as agents become capable of doing hours of implementation independently.

Human attention is a scarce engineering resource

Imagine two approaches to the same task.

In the first, I work beside the agent for one hour and continuously guide it.

In the second, I give the agent enough context and let it work independently for three hours.

Which is more efficient?

Elapsed time alone does not answer the question.

If the second approach produces a good result, I gained an hour of my own attention.

During those three hours I can:

  • investigate another problem,
  • make a product decision,
  • think through architecture,
  • analyze data,
  • talk to a customer,
  • improve another part of the system.

That is a different kind of leverage.

AI productivity is not only about making a task finish faster.

It is also about freeing human cognitive capacity for work where human judgment is still scarce.

Watching an agent perform work it can safely do alone is not necessarily good engineering.

Sometimes it is simply supervision overhead.

Autonomy should be engineered

The answer is not to blindly delegate everything.

The answer is to make delegation reliable.

If I want to give an agent substantial autonomy, I would rather surround it with:

  • business context,
  • architectural boundaries,
  • coding conventions,
  • testing expectations,
  • validation rules,
  • security constraints,
  • known domain rules,
  • access boundaries,
  • an explicit definition of done.

That is much more valuable than manually approving every small implementation step.

The goal is not:

Give the agent freedom and hope.

It is:

Give the agent freedom inside a well-designed operating environment.

Autonomy without boundaries is risky.

Autonomy with good guardrails is engineering.

Some work still benefits from pair programming

There are situations where I would still prefer much tighter human involvement.

Especially when the work is:

  • scientifically unusual,
  • financially critical,
  • difficult to reverse,
  • poorly understood,
  • highly sensitive to small calculation errors,
  • dependent on continuous judgment that cannot easily be encoded beforehand.

In those situations, keeping the human close to the implementation can be rational.

But that should be a consequence of the task.

Not a default assumption about how humans must work with AI.

Most day-to-day product engineering is not novel scientific research.

Much of it involves problems that have already been solved in one form or another:

  • CRUD flows,
  • APIs,
  • validations,
  • user interfaces,
  • integrations,
  • migrations,
  • established architecture patterns,
  • common business workflows.

For that kind of work, a capable agent with sufficient context and guardrails can increasingly operate with very little implementation-level supervision.

Pair programming can also become a defense mechanism

There is another reason I am cautious about treating pair programming as the ideal permanent model.

Sometimes we keep ourselves deeply inside the implementation loop not because the task requires it, but because we are uncomfortable delegating it.

The argument often sounds like:

Humans still need to write or supervise every line so they remain necessary.

I don't think that is a durable strategy.

If a task can be responsibly delegated, eventually somebody will delegate it.

The engineer who learns how to define the problem, create the right environment, evaluate the result and take responsibility for the outcome will have more leverage than the engineer who insists on remaining attached to every implementation step.

Trying to preserve the old mechanics of the job is not the same as preserving the value of the engineer.

The better question is:

Where is human judgment becoming more valuable?

The work moves upward

In my own work, coding itself has become much less important.

The product has become more important.

I spend more time on:

  • ideation,
  • problem framing,
  • evaluating results,
  • analyzing usage,
  • architecture,
  • product decisions,
  • improving workflows,
  • learning adjacent disciplines,
  • enabling other people to use AI effectively.

That does not mean engineering disappeared.

It means engineering moved.

The implementation is still happening.

I simply do not need to be the person typing it.

And the same shift can happen elsewhere in an organization.

A product manager may be able to modify something that once required a developer.

A CEO may directly adapt a report.

A finance or operations person may automate part of their own workflow.

That does not eliminate specialists.

It changes the boundary of what each person can independently accomplish.

More autonomy creates new coordination problems

Once agents work independently, another familiar problem appears.

Coordination.

If several agents operate in parallel, they can:

  • overlap,
  • make incompatible assumptions,
  • duplicate work,
  • interfere with shared state,
  • create conflicting changes.

This is not fundamentally a new class of problem.

Organizations have always had to coordinate actors working toward the same objective.

The actors are changing.

The mechanics change with them.

We may need:

  • ownership boundaries,
  • task isolation,
  • explicit handoffs,
  • review points,
  • shared state,
  • orchestration,
  • conflict resolution.

More agents do not automatically mean more productivity.

Just as more people do not automatically make a team faster.

Autonomy still needs system design.

The preparation/autonomy trade-off

There is also a cost to autonomous work.

Good autonomy often requires better preparation.

If I continuously pair with an agent, I can correct misunderstandings as they happen.

If I want to leave the agent alone, I need to make sure it starts with enough information to make good decisions.

That means clearer:

  • intent,
  • context,
  • constraints,
  • acceptance criteria.

But there is another trap here.

Preparation can itself become bureaucracy.

Huge specifications, oversized PRDs and excessive upfront documentation can slow down feedback just as effectively as slow implementation once did.

So the answer is not:

Write everything before you delegate.

It is:

Provide the smallest amount of durable context that allows the agent to operate safely and independently.

That is another trade-off we still need to learn.

The coding bottleneck is already moving

There is a larger consequence of all this.

For many teams, implementation used to consume a large portion of delivery time.

AI has compressed that part dramatically.

But ideation did not automatically become faster.

Product decisions did not automatically become faster.

User acceptance testing did not automatically become faster.

Organizational approval did not automatically become faster.

So the bottleneck moves.

We can make coding ten times faster and still discover that the product reaches the customer only slightly faster.

This is why I no longer think the most interesting AI engineering question is:

How fast can the agent write the code?

The more important question is becoming:

How do we redesign the rest of delivery around implementation that is no longer the dominant constraint?

That deserves its own discussion.

Pair programming was a transition, not a destination

Pair-programming agents were an important step.

They helped us learn how to collaborate with AI while keeping the interaction familiar.

Human thinks.

Agent types.

That model made sense when AI capability was limited.

It still makes sense for certain kinds of work.

But software development is already moving beyond it.

The emerging model is closer to:

Human defines intent and constraints.
Agent executes with substantial autonomy.
The system provides guardrails.
Human evaluates the outcome and remains responsible.

That is not the removal of humans.

It is a change in where humans contribute.

Closing principle

The goal should not be to keep humans involved in implementation for its own sake.

The goal should be to keep humans involved where human judgment creates value.

Pair-programming agents are useful when the task requires continuous judgment.

Autonomous agents are useful when the problem can be bounded, delegated and verified.

The mistake is treating human presence inside every implementation step as the definition of responsible engineering.

The future is not human or agent.

It is deciding what to delegate, what to constrain, what to verify and what to continue owning ourselves.