How I Actually Use AI Coding Assistants as a Senior Engineer
A senior engineer's real AI coding workflow: where assistants genuinely help, where they waste time, and the habits that make the difference
There is a wide gap between how AI coding assistants are marketed and how they actually fit into a working engineer’s day. If you believed the launch videos, you would think we all describe an app over coffee and ship it by lunch. My real AI coding assistant workflow looks nothing like that. It looks like a set of small, deliberate habits layered on top of the same engineering discipline I had before these tools existed.
I have been using assistants like Claude and Copilot daily for a few years now, across production backend services, frontend work, and side projects. This post is my honest accounting of how to use AI coding assistants effectively: where they genuinely save me hours, where they burn time instead, and why I think senior engineers currently get far more value out of them than juniors do.
The short version of that last point: these tools amplify your ability to specify and verify. If you can describe precisely what you want and judge precisely whether you got it, an assistant is leverage. If you can do neither, it is a slot machine.
Where AI assistants actually earn their keep
Not all coding tasks benefit equally. After a lot of trial and error, these are the categories where reaching for an assistant is almost always the right call in my workflow.
Boilerplate and scaffolding
This is the unglamorous bulk of the value. New API endpoint with validation, error handling, and logging that matches the existing pattern in the codebase? A clearly prompted assistant produces it in seconds, and because it follows a pattern rather than solving a problem, the output is usually correct on the first pass. Config files, CI pipeline definitions, Dockerfiles, CRUD handlers, DTO mappings: anything where the shape is known and the content is mechanical.
The key realization for me was that boilerplate carries a hidden cost beyond typing: decision fatigue. Offloading the mechanical 70 percent of a task leaves me more attention for the 30 percent that actually needs judgment.
Unfamiliar APIs and migrations
This is where the biggest single wins have come from. When I need to work against a library or platform I do not know well, such as a new cloud SDK, an unfamiliar ORM, or a framework version jump, an assistant collapses the “read docs, search issues, find the blessed pattern” loop dramatically.
A concrete example: migrating a medium sized codebase across a major framework version, the kind of task I would previously have budgeted a full day for, took an afternoon. The assistant did not do it autonomously. It knew the deprecation mappings, generated the repetitive transformations, and let me spend my time reviewing rather than researching. That review step matters: it caught two places where the suggested migration was subtly wrong. But the overall shape of the work changed from “research plus grind” to “verify plus correct.”
Test generation
Assistants are genuinely good at writing tests, with one important caveat: they are good at writing tests for behavior you describe, not at knowing which behavior matters. My workflow is to write the two or three test cases that encode the actual business risk myself, then hand the assistant the function and my tests and ask it to fill out the edge cases: empty inputs, boundary values, error paths, weird encodings. It reliably produces cases I would have skipped out of tedium, and tests skipped out of tedium are exactly where regressions hide.
Rubber duck debugging
Explaining a bug to an assistant forces the same clarity that explaining it to a colleague does, except the assistant is available at 11 p.m. and never gets tired of stack traces. More than once the act of writing the prompt solved the problem before I hit enter. And when it does not, pasting in the error, the relevant code, and what I have already ruled out gets me a ranked list of hypotheses. Half of them are usually wrong, but “half wrong” from a tireless partner who reads the whole stack trace carefully is a real improvement over staring alone.
Code review as a second pair of eyes
Before I open a pull request, I ask an assistant to review the diff for bugs, unhandled edge cases, and inconsistencies with the surrounding code. It does not replace human review: it misses architectural concerns and does not know team context. But it catches a steady trickle of real issues, such as an off by one error in pagination, a missed null check, or a resource that is not closed on the error path. Think of it as a lint pass with common sense. Cheap to run, occasionally saves you real embarrassment.
Where they waste my time
Being honest about the failure modes is what keeps the workflow productive. These are the situations where I have learned to stop prompting.
Novel architecture decisions
Ask an assistant how to structure a new system and you will get a confident, plausible, generic answer, the median of every architecture blog post it has absorbed. What it cannot weigh is your team’s operational maturity, your actual scale, your existing infrastructure, or the political reality of who maintains what. I use assistants to stress test a design I have already sketched (“what breaks under these constraints?”), never to originate one.
Large refactors without context
Handing an assistant a sprawling refactor across a codebase it can only see fragments of produces changes that are locally reasonable and globally wrong. It renames things that are load bearing, “simplifies” code whose ugliness exists for a reason, and drifts from the intent halfway through. Big refactors work only when I decompose them into small, mechanical steps first. At that point, each step is really a boilerplate task in disguise.
Subtle domain logic
Billing proration rules, timezone sensitive scheduling, regulatory edge cases: anywhere the correct behavior is defined by your business rather than by common convention, assistants generate code that looks right and is confidently wrong. The cost is not the wrong first draft. Plausible looking wrong code simply takes longer to distrust than code that is obviously wrong.
Hallucinated APIs
Less common than it was, but still real: methods that do not exist, config options from a different major version, plausible sounding library functions that were never written. The tell is usually that the suggested API is slightly too convenient. Anything I have not personally used before gets checked against the actual documentation before it goes anywhere near a commit.
The habits that make the difference
The gap between engineers who get compounding value from these tools and engineers who get frustrated is mostly habits, not tool choice. This is the core of my AI coding assistant workflow.
Write the spec first
The quality of output tracks the quality of input almost linearly. Before a prompt for anything nontrivial, I write down inputs, outputs, edge cases, error behavior, and constraints: essentially a miniature design doc. This is exactly the skill that separates senior engineers, and it is a big part of why the mid level to senior engineer transition matters more, not less, in the AI era. Specifying precisely was always the hard part of the job. Now it is also the interface to your tools.
Work in small, verifiable steps
One function, one endpoint, one migration file at a time: each step small enough that I can fully review it. Big generations that touch many files feel faster and are slower, because review cost grows faster than generation cost.
Always read the diff
Every line, every time. Not negotiable. The day you start skimming AI generated diffs is the day you start shipping bugs you never wrote and cannot explain. I treat assistant output exactly like a pull request from a fast, well read, occasionally careless contractor.
Keep tests as the safety net
Generated code enters the codebase through the same gate as human code: tests pass or it does not merge. When the assistant wrote the code, I prefer that the tests encode intent I authored, so an implementation that is wrong but plausible fails loudly instead of slipping through silently.
Know when to stop prompting and just code
My rule of thumb is two failed attempts. If two rounds of refined prompting have not produced something close, the task is in a category the assistant handles poorly, and round three will not fix that. Recognizing that moment quickly, instead of chasing sunk cost through a fourth rephrase, has probably saved me more time than any prompting technique.
My actual setup
Nothing exotic, and deliberately tool agnostic since the products change monthly. Editor autocomplete handles completions in the flow of typing: the fast suggestions that finish a line or a small block while I am typing. It is low ceremony but adds modest, constant value. An agentic CLI tool takes on bigger, clearly specified tasks such as changes across multiple files, migrations, test suites, and scripted chores. This is where the habit of writing the spec first pays off, because I hand it a written plan rather than a vibe. A chat interface covers design discussions, debugging sessions, and “explain this unfamiliar code to me,” the conversations where the value is thinking, not diffs.
The division of labor is the point: quick completions in the editor, delegated execution in the terminal, thinking out loud in chat. When I wrote about how I built 15 browser based dev tools, this exact split is what made the project feasible on nights and weekends. The assistants handled the repetitive scaffolding across fifteen similar tools while I kept ownership of the decisions that made them worth building.
FAQ
Will AI coding assistants replace software engineers?
Not on any timeline I can see from inside the work. What they replace is a portion of the typing, and typing was never the constraint. The constraints are deciding what to build, specifying it precisely, and verifying it works in context. Assistants make those skills more valuable, because they are now the bottleneck on everything else. The job is shifting toward specification and verification, not disappearing.
Should junior developers use AI assistants?
Yes, but differently than seniors do. The risk for juniors is not the tool itself. It is using the tool to skip the struggle that builds judgment. My advice to early career engineers: use assistants to explain code and unblock you, but write the first attempt yourself, and never merge a line you cannot explain. The verification skill that makes these tools safe is built by doing the work manually first.
How do you prevent AI generated bugs?
The same way you prevent human generated bugs, with extra discipline: small reviewable changes, tests that encode your intent rather than the generated code’s behavior, mandatory reading of every diff, and healthy suspicion of any code that touches domain logic or unfamiliar APIs. The failure mode to guard against is plausibility: AI bugs look more correct than human bugs, so your review bar has to be higher, not lower.
Closing thoughts
My AI coding assistant workflow is unglamorous by design: strong specifications in, small verifiable steps out, tests and diff reading as the gate, and a fast trigger for abandoning the tool when the task is a poor fit. The engineers I see winning with these tools are not the best prompters. They are the best specifiers and verifiers, which is to say they were probably strong engineers already.
If you are figuring out how to use AI coding assistants in your own work, start there. Do not chase the demo video fantasy of delegating whole features. Delegate the mechanical, keep the judgment, and read everything. The leverage is real, but it flows to the people who can tell correct from plausible. That skill is still built the old way.
Get new posts in your inbox
No spam, no fluff: one email when I publish something worth your time. Unsubscribe anytime.
Signup opens soon. Grab the RSS feed meanwhile.
Keep reading
How I Built 15 Privacy Focused Dev Tools That Run in the Browser
Lessons from building Utilio, a suite of browser based developer tools with no sign ups and no server uploads: architecture, trade offs, and results.
Next.js Static Export: The Complete Guide (What Works, What Breaks)
A practical guide to output: 'export' in Next.js: supported features, common breakages, image handling, routing gotchas, and deploying to a static host.
From Mid Level to Senior Engineer: What Actually Changes
The senior title isn't about harder code. What changed for me: ownership, ambiguity, communication, and multiplying the effect of everyone around me.