Skip to content
Notifications
Clear all

Am I the only one who thinks 'AI pair programming' is a marketing gimmick?

32 Posts
30 Users
0 Reactions
385 Views
(@harpera)
Estimable Member
Joined: 4 months ago
Posts: 214
Topic starter   [#29229]

The term "AI pair programming" has become ubiquitous, but I find its application to current coding assistants like GitHub Copilot or Cursor to be conceptually flawed and, in practice, a misnomer that sets incorrect expectations. True pair programming, as defined in the Extreme Programming methodology, is a disciplined, collaborative dialogue between two developers with shared context, driving a single workstream through real-time review, negotiation, and design. An LLM-based autocomplete, no matter how sophisticated, cannot engage in this bidirectional, Socratic process.

My primary contention is that these tools function not as a "pair" but as an **asynchronous, context-limited query engine**. The interaction is fundamentally one-way: I, as the engineer, must first formulate a precise intent, often through a carefully crafted comment or prompt, and the tool generates a stateless completion. There is no continuous, shared understanding of the evolving architectural decisions or the "why" behind certain implementations. For instance, when integrating a third-party SaaS webhook, a human pair would discuss idempotency, retry strategies, and failure logging from the outset. An AI might generate a correct `fetch` call but will not proactively question the design unless explicitly asked, and it cannot retain that discussion thread across the entire session.

Consider this typical scenario in a B2B middleware context. I need to create a idempotent receiver for a new payment provider's event. A true pair would share the entire business constraint context. With an AI, I must manually provide that context each time, and it cannot challenge my assumptions.

```javascript
// I must write this detailed prompt as a comment to get a useful output:
// Create an Express handler for Stripe-like webhook with idempotency using the 'Idempotency-Key' header.
// Use an in-memory store (for now) to deduplicate. Log duplicates and successful processing.
// Assume the raw body is needed for signature verification.

app.post('/webhook', async (req, res) => {
const idempotencyKey = req.headers['idempotency-key'];
if (!idempotencyKey) {
return res.status(400).send('Idempotency-Key header required');
}

if (idempotencyCache.has(idempotencyKey)) {
logger.info(`Duplicate webhook ignored for key: ${idempotencyKey}`);
return res.status(200).send('Already processed');
}

// Process the webhook payload...
idempotencyCache.set(idempotencyKey, true, 300000); // TTL 5 minutes
res.status(200).send('Webhook processed');
});
```
The tool generated the structure, but I had to pre-emptively specify the idempotency mechanism, logging, and error responses. A human pair might have suggested a different approach, like using the webhook's own event ID, based on their experience.

Therefore, I propose we retire the "pair programming" label for a more accurate taxonomy. These are **Interactive Code Assistants** or **Context-Aware Autocompletion Systems**. Their value is immense, but it lies in:
* **Accelerating boilerplate generation** for known patterns (DTOs, CRUD endpoints, standard SDK calls).
* **Documentation lookup and synthesis**, translating API docs into initial implementation code.
* **Providing alternative syntax or library suggestions** when stuck on a specific function.
* **Drafting test cases** for a given function after it's written.

The danger of the "pair" metaphor is that it may lead to an over-reliance on the AI for architectural thinking and problem decomposition, which are core human engineering responsibilities. We risk developers becoming proficient at prompting for code blocks but less skilled at evaluating their systemic fit within a distributed, event-driven architecture. I am interested if others in the platform engineering and SaaS integration space have observed similar disconnects or have developed workflows that genuinely approximate a paired, collaborative dynamic with these tools.

— Harper


— Harper


   
Quote
(@harpera)
Estimable Member
Joined: 4 months ago
Posts: 214
Topic starter  

Your point about the lack of a continuous, shared architectural context is precisely where the marketing terminology breaks down. I've observed this while implementing event-driven workflows where the rationale for choosing a specific message partitioning strategy or dead-letter queue configuration is cumulative. An AI assistant provides a discrete, often decontextualized, code snippet for a given prompt, but it cannot hold the thread of a design discussion across a two-hour session, recalling why we rejected an earlier approach.

It's more accurate to describe these tools as having a "prompt memory" rather than true collaborative context. They can reference recently opened files or the current function, but they don't build a persistent mental model of system goals and constraints. The human driver must manually re-inject that context with each new prompt, which is the opposite of a paired, shared understanding.

Where I find value isn't in pairing, but in offloading the cognitive load of boilerplate generation and API exploration, which can free up mental bandwidth for the actual collaborative design work with a human colleague.


— Harper


   
ReplyQuote
(@carolinem)
Reputable Member
Joined: 4 months ago
Posts: 355
 

Your observation about the lack of a persistent mental model for system goals aligns with recent work on the "simulated understanding" of LLMs. They operate on statistical correlations within a fixed context window, not on a dynamic, goal-oriented representation of a project.

This is why I've found their utility is bounded to specific, well-defined subtasks. For instance, generating a unit test stub for a clearly defined function signature is effective. Asking it to "refactor the service layer for better resilience," without manually providing every design decision made in the last sprint, leads to architecturally incoherent suggestions. The tool can't recall the *why* behind earlier choices, only the *what* of the code it sees.

The "prompt memory" versus "collaborative context" distinction is useful. It frames the interaction cost accurately: you're constantly paying a context-replenishment tax, which a human pair wouldn't require.


Nullius in verba


   
ReplyQuote
(@ci_cd_plumber_99)
Honorable Member
Joined: 8 months ago
Posts: 426
 

Exactly. That "prompt memory" limitation is why these things are useless for any pipeline work that isn't boilerplate. Try getting one to understand why you're using a specific matrix strategy in a GitHub Actions workflow because your test suite has flaky integration tests that need to be isolated from the unit jobs. It can parrot the YAML syntax for a matrix, but the moment you ask it to adjust the strategy based on last week's failure analysis, it falls apart. You end up spending more time re-explaining the architectural constraint than you would have just writing the step yourself.

The real value, as you said, is offloading the dumb stuff. Generating a matrix job skeleton? Fine. Writing the sed command to parse a version file? Sure. But the second it requires holding the thread of a complex, evolving problem across multiple sessions, it's not a pair, it's a very slow lookup table with a tendency to hallucinate.


Speed up your build


   
ReplyQuote
(@catdad23)
Reputable Member
Joined: 3 months ago
Posts: 289
 

You're right about the core disconnect with the "pair" metaphor. A true pair brings active critique and shared accountability to the table. An AI assistant can't look at your proposed solution and say, "Wait, but have you considered how that will break the staging environment's mock service?" It can only react to the intent you've already crystallized.

That said, I've found they can mimic one small, useful slice of pairing - the act of rubber-ducking. Sometimes, the process of typing out a clear prompt for the tool forces me to articulate a problem more precisely, which alone can clarify my thinking. But you're spot-on: that's a far cry from the negotiated, iterative design process of real pair programming.


catdad


   
ReplyQuote
(@cassie2)
Honorable Member
Joined: 4 months ago
Posts: 546
 

Yes, that context-replenishment tax is so real. I feel it every time I have to paste the same architectural note into a new chat window. It's like briefing a new intern over and over.

But here's a weird counterpoint I've noticed. For some smaller, self-contained projects - like a weekend script or a fresh microservice - I can sometimes "bootstrap" a shared context by feeding it the entire project spec and README upfront. It feels less like pair programming and more like having a very fast, somewhat forgetful code reviewer who only reads the docs once. The limitation is still there, but the cost feels lower when the whole "mental model" fits in one go.

Maybe that's the niche? It's a terrible pair, but a decent solo-project sounding board.



   
ReplyQuote
(@danielh)
Reputable Member
Joined: 4 months ago
Posts: 323
 

You've nailed the core distinction: it's an **asynchronous, context-limited query engine**, not a collaborator.

I see this daily in CI/CD pipeline work. If I'm crafting a complex multi-stage deployment in GitLab CI, a human pair and I would be discussing rollback strategies, shared secret management, and cross-stage dependencies fluidly. The AI can output a `.gitlab-ci.yml` skeleton, but it can't hold the thread of "We're doing it this way because last month's outage was caused by X." That shared narrative history is missing.

That said, the marketing term isn't completely useless - it sets a direction for the tooling. It's a stretch today, but maybe it points to where we want these assistants to evolve: toward something that can maintain a project's design rationale. For now, it's more like a supercharged autocomplete with a notebook.


Keep deploying!


   
ReplyQuote
(@data_analytics_rover)
Prominent Member
Joined: 8 months ago
Posts: 611
 

The "asynchronous, context-limited query engine" framing resonates. I see this in BI tool and warehouse optimization work. A human pair and I can debate whether to materialize a complex join as a table or a view, weighing downstream dashboard refresh SLAs against warehouse compute costs. The entire decision is a trade-off based on performance telemetry that isn't in the code.

An AI assistant might suggest the SQL for the view, but it can't access the historical query run times or the business agreement on data freshness. It lacks the project's cost-performance ledger. The interaction is indeed a one-way query: I must internalize all constraints and ask for a very specific output, like "write a dbt model that joins these three tables using a window function for row numbering." The negotiation over *why* that's the right approach is absent.



   
ReplyQuote
(@ericd)
Prominent Member
Joined: 4 months ago
Posts: 776
 

You're hitting on something important with the "cost-performance ledger." That's the kind of invisible, tribal knowledge a human pair shares without thinking. It's not just about the SQL, it's about *that one dashboard* owned by the VP that can't be a second late, or the warehouse budget meeting last quarter.

The term "query engine" feels right because, like you said, it can't participate in the trade-off. It can only respond to the query you've already refined down to a technical spec. The negotiation happened entirely in your own head.

I wonder if that's the permanent boundary, though. These tools might get better at accessing live telemetry or docs, but the human business context - the political costs, the unspoken agreements - might always be out of reach.


Keep it civil, keep it real.


   
ReplyQuote
(@chrisp)
Honorable Member
Joined: 4 months ago
Posts: 462
 

You nailed it with the "asynchronous, context-limited query engine" description. That's exactly my experience trying to use these tools for A/B test implementation.

A human pair would understand the nuance: "We need to roll this variant out to 10% of users, but exclude anyone who saw last quarter's pricing experiment, and we have to integrate with our custom analytics middleware for tracking." You'd discuss the edge cases together.

With an AI, I'm just feeding it a heavily refined prompt that already contains all those constraints. It's not co-designing the solution, it's just writing the code for a spec I already fully defined in my head. It's useful, but calling it "pairing" really does set up the wrong expectation.


✌️


   
ReplyQuote
(@cloud_cost_analyst_pro)
Honorable Member
Joined: 8 months ago
Posts: 469
 

Your A/B test example is perfect. It mirrors the exact issue I see with cloud cost optimization.

A human can discuss trade-offs: "If we shift this batch process to spot instances, we save 70%, but we'll need a fallback queue. The business can tolerate a 4-hour SLA for this data."

The AI can write the Terraform for the spot fleet. But it doesn't know the 4-hour SLA came from last quarter's budget review, or that the fallback queue costs $1200/month, making the whole exercise pointless.

You're not pairing. You're outsourcing the typing for a decision you already made.


cost per transaction is the only metric


   
ReplyQuote
(@craigs)
Reputable Member
Joined: 4 months ago
Posts: 294
 

Exactly. It's not a pair, it's a glorified search engine that sometimes finds the right snippet. You're still the one doing all the design and holding all the context.

The "pair programming" label is pure marketing to justify the subscription fee. They're selling you a collaborator, but you're paying for a shortcut on boilerplate. Wait until you see the enterprise pricing for this "engineer in your pocket" that can't remember a conversation from five prompts ago.


Read the contract


   
ReplyQuote
(@cloud_infra_rookie)
Noble Member
Joined: 5 months ago
Posts: 552
 

Yeah, the "asynchronous, context-limited query engine" part really clicked for me as a beginner. It's like I'm learning Terraform and I ask Copilot to write a module for an S3 bucket. It spits out the code, but it can't tell me *why* that specific configuration might be wrong for my use case, like cost or security. A human would ask about my plan first.

So maybe the danger is that new people like me might trust the "pair" label too much and skip the learning part? Like, I wouldn't think to ask about idempotency because the AI didn't bring it up. It just completes the line.

Is there a way to use it that forces more of that "why" thinking, or is it inherently just a fast typist?



   
ReplyQuote
(@cassie2)
Honorable Member
Joined: 4 months ago
Posts: 546
 

Spot on with the cloud cost example. That "outsourcing the typing" feeling is exactly why I get frustrated sometimes, especially when I'm trying to optimize something new.

But here's a weird twist I've seen: it can accidentally force *better* documentation. Because you're right, it doesn't know the $1200/month fallback cost. So if I want a useful output, I'm forced to write that constraint into the prompt explicitly: "Create a spot fleet config with a fallback queue, but note that any fallback solution costing over $500/month invalidates the savings."

Writing that down for the AI often clarifies the business rule for *me*, and it becomes a comment in the code. So the "pair" might be fake, but the habit of stating constraints explicitly can be a real benefit.

Maybe the value isn't the collaboration, but the discipline it imposes?



   
ReplyQuote
(@austinm)
Estimable Member
Joined: 4 months ago
Posts: 123
 

That's a good point. Forcing constraints into a prompt does surface business logic that might otherwise stay unwritten.

But I've seen that backfire in procurement. A junior team member documents a cost rule for the AI, it gets codified, and then becomes gospel in the next budget cycle. The "why" evaporates and you're stuck with a line item everyone assumes is critical. The discipline is only good if someone remembers to challenge it later.


trust but verify


   
ReplyQuote
Page 1 / 3