New York

October 15–17, 2025

Berlin

November 3–4, 2025

London

June 2–3, 2026

Managing AI coding assistants without losing control

How to keep your grip when AI coding assistants are in the loop.
August 18, 2025

Estimated reading time: 10 minutes

A few months ago, I reviewed a pull request that, on the surface, looked flawless. The syntax was clean. The functions were well-structured. The tests passed. It checked every technical box – and yet, something felt off. There was no signature in the code, no clarity of intention, no trace of design thinking.

Curious, I asked the engineer about their approach. Their answers were vague, hesitant. Eventually, they admitted that most of it had been drafted using GitHub Copilot.

That moment crystallized a quiet concern I’d been carrying for months: What happens when AI-generated code becomes the norm? Are we gaining speed but losing critical thinking? Are we trading depth for delivery? And – perhaps most worrying – what happens to the growth of our engineers when AI is doing the hard parts for them?

The rise of AI coding assistants is a cultural inflection point. Engineering leaders aren’t just deciding if we adopt tools like Copilot – they’re shaping teams around them.

The promise and the paradox

I’m not anti-AI. Tools like GitHub Copilot, Amazon CodeWhisperer, and Tabnine are revolutionizing how we write code. I’ve seen them accelerate prototyping, reduce boilerplate, and even unblock developers stuck on a tedious task. They’re not going away – and they shouldn’t.

But with every new tool comes a paradox. The more power we hand over to automation, the more careful we must be with what’s left. Copilot can autocomplete a function, but it can’t weigh architectural tradeoffs. It can suggest a pattern, but it can’t decide why that pattern fits the context of a given system.

The temptation is to treat these tools as a shortcut. But real engineering leadership means resisting that urge and instead asking: How do we integrate AI in a way that enhances creativity, deepens understanding, and protects the long-term strength of the team?

Speed, after all, is meaningless without direction. And direction requires judgment – a very human trait.

Redefining core engineering skills

For years, growth as an engineer followed a familiar path. Writing code from scratch, memorizing syntax, and learning through the pain of debugging and edge cases. It wasn’t fast, but it built depth.

AI coding assistants have changed that. Tasks that once required hours of effort can now be completed in seconds. But that speed sacrifices the foundational struggles that once built skill and resilience.

Today, engineering isn’t just about writing code – it’s about curating and evaluating machine-generated suggestions. The ability to frame a problem, prompt with clarity, and assess tradeoffs has become just as important as knowing syntax.

That doesn’t make traditional skills irrelevant, but it does shift the definition of effectiveness. Engineers are increasingly editors as much as authors – responsible not just for producing code, but for shaping it with judgment and intent.

What stands out now is the ability to mentor others in the thoughtful use of these tools, to apply sound judgment when automation stumbles, and to ask better questions when a solution appears too easy. In this environment, judgment and discernment have become as valuable as speed.

Another key differentiator is architectural thinking. While a coding assistant can quickly generate a function or scaffold a module, it can’t anticipate the performance implications of a design choice two quarters from now. It won’t weigh tradeoffs between flexibility and maintainability, or spot when a pattern creates fragility instead of leverage. That kind of thinking requires a systems-level perspective.

Architectural thinking isn’t just about system design. It’s about being able to abstract complexity, identify long-term risks, and structure software in a way that aligns with evolving business needs. It’s about designing with context, not just implementing with speed. In teams that cultivate this mindset, code assistants become tools – not crutches.

This shift places more importance on enduring meta-skills: reasoning, abstraction, communication, and context-aware decision-making. 

Building a policy that empowers, not restricts

Initially, the assumption was that a capable, self-regulating engineering team could integrate AI tools like Copilot responsibly, without the need for top-down rules. These were experienced developers – why impose constraints?

But the reality revealed something subtler than chaos: fragmentation. Some engineers leaned heavily on Copilot, occasionally merging code they couldn’t fully explain. Others avoided it altogether, unsure about legal implications or simply uncertain where the lines were. Instead of accelerating, the team drifted in different directions, each approaching the tool with their own unspoken rules.

While many teams are still exploring how to integrate AI tools thoughtfully, some organizations are already taking structured steps. In one of our recent consulting engagements, we partnered with a regional bank that was beginning to roll out coding assistants across several of its engineering functions.

Rather than introduce a rigid, top-down policy filled with dos and don’ts, we facilitated the co-creation of an internal AI usage charter. This shared set of principles was designed to guide the responsible and thoughtful integration of these tools into everyday workflows.

This charter was developed in close collaboration with engineers from the bank’s platform engineering, DevOps, and DevSecOps teams. 

Key ideas included:

  • AI-generated code should be treated with the same scrutiny as human-written code.
  • If you didn’t write it, you still own it.
  • Use of Copilot (or any assistant) should be documented in PRs when it meaningfully shapes logic.
  • Prompt and response experimentation is encouraged – but so is skepticism.

This charter gave developers the language and structure to help them take ownership. AI became less of a shortcut or unknown variable, and more of a capability to be practiced with skill and care.

Reviewing code like it matters 

If Copilot can write 90% of a function, does that mean the code review is now just a rubber stamp? Absolutely not.

In fact, I’d argue that AI-assisted code demands more from our reviewers. It’s not enough to check for formatting or passing tests. Reviewers need to dig into the “why”.

Encourage reviewers to ask deep, open-ended questions:

  • What alternatives were considered?
  • Is this implementation idiomatic for our codebase?
  • Does this introduce hidden complexity or long-term debt?

In parallel, we’ve integrated more static analysis tools to catch AI-generated patterns that look correct but subtly break assumptions. Sometimes Copilot is too clever for its own good.

To reinforce code integrity, we’ve layered in static analysis tools like Semgrep for writing custom linting rules, CodeQL for scanning complex control flows and security vulnerabilities, and ESLint with stricter rulesets for TypeScript codebases. These tools help surface issues in AI-generated code that might pass tests but subtly violate architectural decisions, introduce security risks, or compromise maintainability.

For example, in one case, a code assistant suggested a database query wrapped in a try…catch block that quietly swallowed errors. It passed tests, but static analysis flagged it for improper error handling – masking a failure that would’ve silently broken pagination logic. Without the tooling in place, the issue might have gone unnoticed until production.

Static analysis becomes essential when code is being synthesized, not carefully composed from first principles. It’s the safety net that ensures “plausible” code is actually correct in context.

But perhaps the most powerful shift has been cultural: we’ve normalized skepticism. AI suggestions don’t need defenders. They need editors. And the best reviews are now about understanding context, not just catching bugs.

Prompt engineering is real engineering

One of the most overlooked skills emerging in this new era is the ability to prompt well. It’s not a shortcut, it’s a craft – one that demands precision, contextual understanding, and the discipline to iterate.

Much of the quality in AI-generated output hinges on how a task is framed. Vague or generic prompts often lead to equally vague or misleading results. In contrast, a prompt that is clear, structured, and grounded in the specific context of a codebase can produce quality output. 

While working with a regional banking client, our consulting team introduced a series of internal workshops focused on what quickly became known as prompt literacy. The client’s engineering teams – primarily backend and platform developers supporting financial products – were early adopters of coding assistants, but lacked structure around their use. These sessions were aimed at improving how engineers think and collaborate with AI.

Participants were guided to articulate intent more clearly, define technical constraints with precision, and critically assess the accuracy and safety of AI-generated suggestions. What began as a tactical enablement exercise quickly evolved into a deeper shift in engineering habits.

Over time, a pattern emerged: engineers who became skilled in prompting also became more articulate in design reviews, more deliberate in documentation, and more thoughtful in their debugging strategies. Prompting was not just about extracting better code from an assistant but refining the mental models behind the code itself.

Prompt engineering is real engineering. Not because of the tool, but because of the clarity, rigor, and intent it demands from those who use it well.

Protecting the growth of junior engineers

Among the most pressing concerns in this shift toward AI-assisted development is the impact on early-career engineers. Before tools like Copilot became widespread, junior developers were routinely immersed in the messier aspects of engineering, such as naming things thoughtfully, untangling obscure stack traces, and refactoring confusing logic. It wasn’t always efficient, but it was deeply formative. These struggles didn’t just build technical skill; they developed resilience and engineering intuition.

With generative tools now offering functional code in seconds, it’s possible for newcomers to bypass much of that discomfort. But skipping the struggle too often risks skipping the learning that comes with it.

To guard against this, we worked closely with engineering leadership at the regional bank to introduce intentional friction into the onboarding process. These teams were responsible for core infrastructure, CI/CD automation, identity and access management, and secure data pipelines – all areas where premature reliance on AI-generated code could introduce long-term risk.

Junior engineers are encouraged to alternate between building with and without AI assistance during their first few months. They’re asked to compare the two approaches, reflect on what they understood, and identify where they needed additional guidance. The goal isn’t to eliminate AI, but to make its use a conscious choice rather than an automatic dependency.

Mentorship, too, is evolving. Senior engineers are now expected to narrate through why they’re rejecting or modifying an AI-generated suggestion. In collaborative sessions, code assistants often act as a third participant, offering ideas that spark useful critique and deeper discussion.

Rethinking metrics in the age of AI

If AI can churn out hundreds of lines of code in minutes, does that mean someone is more productive? Of course not.

We’ve learned to distrust traditional metrics like PR count or lines of code. They tell you how much someone typed, not how well they thought. And in an AI-assisted world, volume is a lagging indicator.

Instead, we’re experimenting with new signals:

  • Quality of code reviews
  • Incidence of bugs in AI-assisted code
  • Prompt reuse across teams
  • Insights from retrospectives like: “Where did Copilot help you?” and “Where did it mislead you?” 
  • Explore ways to assess prompt clarity and how engineers iterate on Copilot output. 

These aren’t perfect metrics, but they point us toward judgment, understanding, and adaptability.

Leading with transparency and curiosity

To support meaningful adoption, teams need deliberate spaces for reflection. Dedicated “AI retrospectives” give engineers a forum to share how they’re using code assistants. What worked, what didn’t, and where the tools led them astray? Developers demo real prompts, compare outputs, and openly examine failure cases.

Prompt strategies are documented and shared. Just as importantly, moments where developers intentionally chose not to use a code assistant are surfaced and valued. Critical thinking is emphasized over passive automation.

Using a code assistant isn’t a shortcut; it’s a skill. Like any skill, it improves with practice, peer feedback, and honest dialogue.

By treating these tools as fallible collaborators the culture becomes more efficient, thoughtful and human-centered.

Final thoughts

AI coding assistants are changing how software gets written, but the bigger shift is in how teams operate.

This isn’t just a tooling upgrade. It requires engineering leaders to be deliberate about what skills are cultivated, how quality is defined, and how judgment is reinforced in day-to-day work.