Even when I don’t use AI to write code directly, I’m increasingly having detailed technical discussions with it about work I’m about to start. It might be exploring how to extend our OAuth implementation to use rotating refresh tokens, or discussing ways to improve the UI with better animations, color schemes, and spacing. These conversations are extremely valuable, but the counterintuitive part is now they often take MORE time than thinking through it on my own and then starting to code, not less.
What could have been a quick implementation decision or something I’d punt to “improve the UI someday” becomes a deep architectural discussion. I’ll explore different approaches, consider edge cases I might have missed, and document my thinking along the way. The result is better understanding and cleaner implementation, but it’s definitely not 10x faster. Sometimes it’s 0.5x slower, and I’m okay with that because the quality improves.
Experience has taught me harsh lessons about trying to have AI rewrite entire modules in one pass. The AI inevitably goes off the deep end on some aspect - I once watched it create an elaborate event registration and unregistration system that was ten times more complex than needed, with memory leak prevention code for scenarios that couldn’t exist in my application. I’ve lost entire days trying to integrate these “complete solutions” before giving up and starting over. The code looked impressive, seemed to handle every case, but was ultimately unusable because it failed to get the features it was supposed to be focused on.
What actually works is starting small. I’ll ask AI to write a simple version of a class with minimal features, then iterate one small addition at a time. AI seems to work best when building up complexity gradually rather than trying to jump to the final solution. I review each iteration, drop it into my codebase manually, and test it with existing code. I’m nowhere close to letting AI control my IDE directly - I keep AI conversations separate and move code in and out myself. This gives me control and understanding of every change.
When I see the integrated class working well at its current level, I’ll add the next small feature. If the conversation isn’t too long (and despite advertised context windows, shorter is always better), I might continue in the same thread. Otherwise, I start fresh. Each iteration is a simple paste replacement - if something breaks, ctrl-z brings me back to a known working state. Sometimes code goes to production after just two iterations. At some point later, I might come back for another small improvement, always in a new conversation. Long AI coding conversations inevitably degrade into confusion and contradictions.
This approach means AI might accelerate specific 10-minute tasks by 10x, but my overall weekly productivity might only improve by 20-30% or even 20% slower. The real value is having a tireless discussion partner who helps me think through problems more thoroughly. But anyone claiming they’re shipping 10x more code with AI is either building toys, accumulating massive technical debt, or measuring the wrong things.