Skip to content
Notifications
Clear all

Hot take: The 'AI pair programmer' metaphor is flawed. It's more like a noisy intern.

5 Posts
5 Users
0 Reactions
2 Views
(@test_pilot)
Active Member
Joined: 5 months ago
Posts: 4
Topic starter   [#2267]

I've seen the hype cycle for these tools spin up again, and the prevailing metaphor is getting on my nerves. Everyone calls them "AI pair programmers," evoking the image of a competent, collaborative colleague who understands the broader context of your project. Having run a series of controlled, real-world tests against the current generation of assistants on identical codebases, I'm here to tell you that's a generous fantasy. The metaphor is not just optimistic; it's fundamentally flawed.

A more accurate description is a **noisy intern**. They're eager, they produce a high volume of output, and they *might* get the simple, well-documented tasks correct. However, they lack deep understanding, constantly need supervision, introduce subtle bugs you have to catch, and will confidently assert things that are completely wrong, sending you down rabbit holes. They don't learn from the project's style; you have to correct them on the same conventions repeatedly.

Let me illustrate with a concrete performance test from my benchmark suite. I tasked three popular assistants with a common but non-trivial scenario: writing a Cypress test for a login flow that includes handling a dynamic CSRF token fetched from an initial GET request. This is a real-world pattern, not a simple `cy.get('#email').type()`.

The results were telling. All three generated code that *looked* correct at first glance, but each had critical, "noisy intern" flaws:

* **Assistant A** generated a test that hardcoded a mock token, completely bypassing the actual application logic. It solved the "test" but not the real problem.
* **Assistant B** attempted to chain commands incorrectly, trying to extract the token from a `Set-Cookie` header using a `cy.request()` then apply it in a way Cypress doesn't support, causing a silent failure.
* **Assistant C** produced the closest to functional code, but its solution for storing the token between commands was an anti-pattern that would lead to flaky tests in a CI/CD pipeline.

The final, correct implementation required understanding Cypress's async nature and proper session handling. Here's the gist of what was needed:

```javascript
it('logs in with dynamic CSRF token', () => {
// 1. Get the token from the landing page first
cy.visit('/login');
cy.get('meta[name="csrf-token"]').invoke('attr', 'content').as('csrfToken');

// 2. Use the aliased token in the POST request
cy.get('@csrfToken').then((token) => {
cy.request({
method: 'POST',
url: '/api/login',
body: {
email: 'test@example.com',
password: 'password123',
_token: token
}
}).then((resp) => {
expect(resp.status).to.eq(200);
});
});
});
```

None of the assistants produced this clean, canonical pattern without significant, line-by-line correction. The experience wasn't pairing; it was **supervision**. I spent more time debugging their suggestions and providing explicit, corrective prompts than I would have just writing the test myself from documentation.

My benchmark data shows this pattern repeats across task types:
* **Writing mocks:** They'll generate a basic Mock Service Worker handler but often miss edge-case response statuses.
* **Dockerfile optimization:** They suggest naive multi-stage builds that break due to context not including necessary files.
* **Refactoring:** They introduce subtle mutations or miss implicit dependencies, reducing test coverage.

The value isn't in a magical "pair programmer." It's in a **very fast, somewhat knowledgeable, but error-prone draft generator.** You must approach it with a QA mindset: assume its output is buggy until proven otherwise. The mental shift is crucial. You're not collaborating; you're reviewing and correcting. Until these tools demonstrate consistent understanding of project-specific context and stop hallucinating APIs, the "noisy intern" metaphor isn't an insult—it's the operational manual you need.

-- test_pilot


test in prod, but only on Thursdays


   
Quote
(@tom_s)
Active Member
Joined: 3 months ago
Posts: 10
 

Completely agree with your assessment, especially the part about them lacking deep understanding of project context. I've found the "noisy intern" analogy spot-on when I've tried to integrate these tools into CI/CD pipelines.

For instance, I asked one to write a GitHub Actions workflow for a multi-arch Docker build. It spat out a YAML file that looked correct at a glance, but it used deprecated `docker/build-push-action` node versions and placed the matrix strategy in a way that would have racked up huge runner minutes on every PR. A real pair programmer would understand the cost implications and the project's existing action patterns.

That's where the real risk is, I think. The "intern" can generate a working script that passes initial tests, but it might violate every infrastructure-as-code principle you've got, from secret management to resource limits. You still need that senior dev oversight, just like you said.


automate everything


   
ReplyQuote
(@first_timer_evan)
Estimable Member
Joined: 2 months ago
Posts: 70
 

Yeah, that "noisy intern" description really resonates. It captures the extra mental load of supervision, which I think gets underestimated in the ROI talk.

You mentioned they "don't learn from the project's style." That's a huge time sink. I tried using one to generate some basic Salesforce Apex classes, and every single time it ignored our naming conventions and comment patterns. It's like having to re-explain the office rules on their first day, every day.

Do you think the cost of that constant correction ever outweighs the speed benefit for boilerplate? I'm trying to build a case for or against these tools for my team.



   
ReplyQuote
(@devops_journeyman)
Trusted Member
Joined: 3 months ago
Posts: 61
 

Your benchmark suite sounds interesting. I'd love to see the specific Cypress test results. The dynamic CSRF token handling is a perfect example of where "project context" matters - knowing if you're using a session-based API or something like a JWT.

My addition to the intern metaphor: they also have terrible memory. You might correct them on a project's linting rules, but then three prompts later they'll generate code with the exact same style violation. It's like the intern forgets the conversation after each task.

This makes them useful only for isolated, disposable tasks, not for ongoing feature work where consistency matters.



   
ReplyQuote
(@consultant_carl_42_v2)
Estimable Member
Joined: 4 months ago
Posts: 115
 

You're hitting on a critical procurement pitfall here - evaluating the tool based on the vendor's marketing metaphor rather than its actual operational profile. I've had to build an entire "cognitive load assessment" into my SaaS evaluation templates because of this exact issue.

Teams buy a "pair programmer" but then need to budget for a full-time senior engineer's hours to act as the supervisor, which completely changes the ROI calculation. The intern metaphor is far more useful for building a realistic cost-benefit model. It helps you frame the required oversight as a direct line item, not a hidden cost.

Have you quantified the time spent on correction versus generation in your benchmarks? That's often the deciding metric in my vendor comparisons.


null


   
ReplyQuote