LLMs for Coding: A Practical Case for Saying No13 min read2,504 words

LLMs for Coding: A Practical Case for Saying No

LLMs for coding can speed up tasks, but bring costs in code quality, cognition, privacy and ownership. Use this framework to decide when to opt out.

LLMs for codingAI coding assistantsAI-generated code qualityAI coding privacysoftware maintainability
LLMs for Coding: A Practical Case for Saying No

When LLMs Don't Belong in Your Coding Workflow

AI coding tools can spit out a working-looking patch in minutes. That's genuinely useful. It can also dump more code on you than you'd ever write, push sensitive context to a third party, or encourage you to accept changes you can't fully explain. Using an LLM isn't just about whether it can generate code - it's about whether it makes your overall software delivery process better.

Some teams find that the trade-offs work. Other teams don't. And people who choose not to use LLMs aren't necessarily anti-machine learning or stuck in the past. They may just be drawing a line around code ownership, day-to-day focus, privacy, environmental impact, or the kind of work they actually want to do.

This piece lays out the main reasons to opt out, where AI help can still fit in, and a practical way to decide what belongs in your workflow. The goal isn't to declare LLMs "good" or "bad." It's to make the real costs visible before they quietly become default infrastructure in your engineering process.

Why might a developer choose not to use LLMs for coding?

Plenty of developers understand machine learning, recognize what's going on behind transformer models, and still choose not to use a hosted coding assistant at work. Technical curiosity and workplace adoption are separate questions. A tool can be impressive and still be the wrong fit - for the task, the team, or the way someone thinks.

A lot of the strongest opt-out reasons are practical, not ideological. An assistant can break your concentration, make it harder to build a real mental model of the system, or add code that takes longer to verify than it took to generate. Another person might simply not want to send proprietary source code or customer data to a third-party service without a clear, approved plan for how that data will be handled.

There's also the question of what the work is actually for. Programming isn't just typing syntax. It's deciding where boundaries are, how data should be structured, how failures should behave, and what it will cost to change later. Writing and reading code are part of how many developers work through those decisions. If a tool removes that thinking without replacing it with understanding, the "productivity gain" can be misleading.

That doesn't mean every use of an LLM weakens skill. The research on cognitive effects is still evolving, and people's experiences vary. Some developers report feeling mentally scattered after extended use. Others say a well-scoped assistant reduces routine friction. Studies like Accumulation of Cognitive Debt when Using an AI Assistant for Essay Writing Task and Microsoft's survey on self-reported cognitive effort raise real questions, but they shouldn't be treated as proof that every coding assistant causes lasting harm.

So an opt-out is best thought of as a boundary - personal or organizational - not a universal verdict. You don't have to prove a tool is harmful to decide it doesn't earn its place. The real test is whether it helps you deliver software that's understandable and reliable, within the constraints you actually live with.

Does AI-generated code create quality and maintenance problems?

AI-generated code can look more complete than it is. You might get detailed comments, a bunch of tests, and a polished explanation - while still picking the wrong abstraction or missing the simplest fix. That "looks done" feeling isn't the same thing as correctness. A plausible patch still deserves the same level of scrutiny as a teammate's change - often more, because you can't easily tell what assumptions shaped it.

One common failure mode is solving the request you asked for instead of understanding the system you're changing. A small schema tweak or migration might handle the real need. With a narrow prompt, an LLM can instead introduce a new service, add framework hooks, create layers of indirection, and write tests for behavior that was never actually in dispute. Every extra moving part becomes future work: reviewers have to understand it, maintainers have to update it, and users will eventually hit the edge cases it quietly introduced.

This isn't unique to AI. Human developers overengineer, misunderstand requirements, and write bad tests all the time. The difference is that AI output can arrive quickly and in large volume, which shifts effort from building to evaluating. If reviewers can't confidently judge the change, the tool hasn't removed the hard part - it just moved it somewhere easier to overlook.

Treat review as part of the cost

A useful comparison isn't "How long did the assistant take?" It's "How long did it take to reach a correct, understood, maintainable change?" That includes prompt prep, pulling context together, reviewing the generated code, applying corrections, updating tests, and documenting what changed. If the assistant produces a big patch that takes an experienced developer an hour to untangle, the initial speed isn't the metric that matters.

There's also a second-order maintenance risk. If an AI workflow generates more code than the team can actually digest, knowledge ends up sitting in prompts, tool behavior, or vendor-specific workflows instead of in the team's shared understanding of the application. That makes debugging and future changes harder - especially once the generated code is no longer easy to reproduce or explain.

A practical acceptance rule is simple: don't merge code that no responsible human can explain. The explanation doesn't need to cover every keystroke. It should cover the key design choices, the important failure cases, and how the tests demonstrate the intended behavior. If the author can't do that, the patch isn't ready - no matter who or what drafted it.

What are the costs beyond the code itself?

An AI coding workflow has costs that never show up in the pull request.

Start with attention. Switching between the problem, your prompt, the response, and the codebase costs time and cognitive bandwidth. For a straightforward task, that overhead might be small. For a tough architectural problem, repeatedly asking a model for "the next step" can fragment the reasoning that would otherwise help a developer understand the system as a whole.

Then there's data governance. A coding assistant might receive source code, error logs, architecture details, or snippets that include personal data. Before using it for professional work, you'll want clarity on what the provider retains, how submitted data is handled, what the applicable plan and settings are, and whether the employer has approved the service. Even if a provider claims data is processed in a certain region, that doesn't automatically answer the real privacy and legal questions.

For organizations subject to GDPR, the questions tend to include what data is involved, the provider's role, contract terms, transfer arrangements, and the safeguards that apply. US-based providers can raise additional questions around the CLOUD Act and the provider's legal obligations. Neither point means "using every US service is automatically unlawful." It does mean teams shouldn't treat a vendor's assurances or a default product setting as a substitute for review by the people responsible for privacy and security.

There are also dependencies. If a core part of development relies on one provider's models, pricing, uptime, acceptable-use policies, and product direction, those become operational variables. That might be a reasonable trade-off - but it's still a dependency. Teams should ask what happens if access changes, prices rise, or the tool behaves differently after an update.

Environmental impact is another factor - real, but hard to quantify per feature. Large-scale AI services run on energy and infrastructure, and the impact varies by model, workload, and the energy mix of data centers. One developer usually can't calculate the full footprint of each prompt. But a company using these tools at scale can still ask for credible information and weigh resource use against measurable benefit, instead of assuming "because it's software, it has no physical cost."

Finally, consider the professional value of the work. Some developers genuinely enjoy coding as a way to explore a problem and build understanding. If you delegate more of that process to an assistant, you may shrink the part of the job you actually find meaningful. That isn't a productivity metric - but it matters when you're designing a sustainable role and workflow.

When can AI coding tools still be useful?

Choosing not to use LLMs broadly doesn't mean pretending they never help. A constrained assistant can be useful when you're stuck, need a second way to describe a problem, or just want a starting point for a routine task. It might help you make sense of an unfamiliar error message, outline likely debugging steps, or draft a small snippet whose behavior is easy to verify.

The best use cases tend to share three traits: the context can be shared safely, the output is bounded, and a human can verify it quickly. Suggesting likely causes of a compiler error is usually easier to evaluate than asking for a full redesign. Drafting a repetitive test fixture is often easier to check than implementing a new authorization system. The point isn't that one category is always safe. It's that narrower tasks make assumptions and mistakes harder to hide.

Use the tool as a question, not an authority

When an assistant helps, keep the decision with you. Ask for options, trade-offs, or a debugging plan instead of treating its first suggestion like a mandate. Then compare it to what your codebase already does and to the simplest solution that actually fits.

For example, if you're blocked on a framework issue, you can ask for a few possible causes and what evidence would distinguish them. That can move you forward without handing over the design. By contrast, asking an agent to "build the feature" is under-specified - it encourages the system to fill in gaps with assumptions that may not match your product or your architecture.

It also makes sense to define "off-limits" tasks. A team might prohibit sending secrets, personal data, or unreleased proprietary code to an unapproved service. It might require human-led design for security-sensitive changes, or require generated patches to include an explicit explanation of what changed and how it was verified. These rules are more useful than a vague instruction to "use AI responsibly," because they connect the tool to concrete risks.

The trade-off is that narrow, supervised use won't generate the biggest headline productivity stories. That's often the point. A team should prefer a modest, demonstrated win over a broad workflow change where the review burden and failure modes aren't well understood yet.

How should a team decide whether to adopt them?

Treat adoption like a workflow decision, not like a referendum on whether AI is "inevitable." Just because a tool is available, popular, or subsidized doesn't mean it belongs in your engineering process. Start with a specific problem: slow test scaffolding, repetitive documentation, difficulty navigating a large codebase, or delays diagnosing common build failures. If there's no defined problem, there's no real way to tell whether the tool helped.

A practical evaluation can be broken into five steps:

  1. Choose a bounded use case. Don't test "AI coding" as a whole. Pick a task with a known baseline and clear completion criteria.
  2. Set data boundaries first. Decide what may be submitted, which service is approved, and who has reviewed the retention and privacy terms.
  3. Measure the full cycle. Track time spent prompting, reviewing, correcting, testing, and maintaining - not just time to first output.
  4. Check quality and ownership. Have reviewers assess correctness, unnecessary complexity, test usefulness, and whether the maintainer can explain the change.
  5. Keep a non-AI path viable. Make sure the team can keep working if the provider is unavailable, access changes, or a developer opts out.

A pilot shouldn't only include the most enthusiastic early adopters. Include the people who will review and maintain the code, because their workload is part of the result. Compare similar tasks where possible, and look for regressions too - more review comments, bigger diffs, security concerns, or reduced understanding of the changed code.

Make the decision reversible

Don't lock a tool into critical processes before you know what it costs to remove. Document how it's used, keep the codebase understandable without proprietary prompts, and avoid building delivery on an agent that only one person knows how to operate. Revisit the decision when prices, capabilities, data terms, or team needs change.

A useful rule of thumb is: adopt only when a defined benefit outweighs the combined cost of verification, governance, dependency, and maintenance. If those costs aren't clear, run a small trial or don't adopt yet. If an individual developer tries the workflow and decides the benefits don't justify the disruption, opting out is a legitimate professional choice.

Conclusion

LLMs can help with parts of software development, but the output isn't "free." Developers and teams still need to account for review effort, code ownership, privacy, dependency risk, environmental impact, and how the tool changes the way people think through problems.

The choice isn't "AI or no AI forever." It's whether a specific use case improves the work enough to justify the trade-offs. Test narrowly, protect sensitive context, and keep human understanding at the center of the codebase. If the benefits don't outweigh the costs for your role or team, opting out is a reasoned engineering decision - not a failure to keep up.

Frequently Asked Questions

Yes. A developer can decline tools that do not fit their workflow, privacy requirements or professional judgment. Employers may set policies for their teams, but adoption should still account for training, review responsibilities and data handling. Using an LLM is not a prerequisite for being a capable engineer.
No. Quality depends on the task, context, model and review process. Generated code can be useful, but fluent explanations and extensive tests do not prove correctness. Evaluate the resulting change against requirements, existing architecture, failure cases and maintenance cost rather than assuming either that AI is unreliable or that it is inherently efficient.
Not automatically. GDPR compliance depends on the data, processing arrangement, contractual terms and applicable transfer safeguards, among other factors. A provider’s US location or a stated EU processing region does not settle the analysis. Organizations should have privacy and legal specialists review the specific service and use case.
Start with a narrow, low-risk task whose output is easy to verify, such as exploring possible causes of a non-sensitive error or drafting routine test data. Keep confidential information out unless the service is approved. Measure the complete review-and-correction cycle, not just how quickly the model responds.

Related articles