Why Good Programmers Use Bad AI
AI code generation is error-prone. Why, then, are programmers still using it?
Everyone from YC partners to Fiverr’s CEO has been proclaiming that “90% of code is AI-generated” or that they’re becoming “AI-first” companies.
The subtext they’re forcing on us is clear: programmers who don’t embrace AI will be left behind.
But after two years of daily AI coding — from the earliest Cursor version to the latest agentic tools — I’ve uncovered the truth: AI coding tools are simultaneously terrible and necessary.
Harsh Economies of Code
The industry’s embrace of AI makes perfect sense when you follow the money.
I learned this lesson from my former engineering manager. We were celebrating after a product launch, and I was complaining about some tech debt.
“You know what?” he said. “I’ve never once heard the CEO care about our code quality. The only thing that matters is if we can deliver before deadlines or not. Nobody’s getting promoted for clean code if the feature ships late.”
It was disappointing, but also… enlightening?

As a programmer, since I live inside my codebase, I want to make it perfect exactly the way I want.
But from the perspective of a business, my code is merely a tool to generate revenue.
And this is cold reality pushing AI adoption: businesses don’t care if the code is AI-generated or handcrafted as long as it works and ships quickly.
What AI Is Actually Good For
After two years of using AI coding tools extensively, I’ve found some areas where it truly shines. Here’s what I find most useful with AI:
- Understanding documentation: I often have to use libraries that are poorly documented. Last sprint I had to use a Python library with the worst imaginable docs: poorly structured and broken search. I pasted that link into Cursor, let it index the docs, and I was able to find precisely what I needed and ask questions around it within seconds. It would’ve taken hours of trial and error otherwise.
- Boilerplate code: I don’t know about you, but writing repetitive framework code feels like the worst kind of drudgery to me. I know why GraphQL resolvers are needed, or how each component needs loading, error, and success states; but I really don’t like writing such code myself. Now I let an agentic AI do the grunt work for me, so I can focus on the fun parts.
- Error debugging: In the past, the main way to debug was to search the error string, find information across multiple stackoverflow results, and condense it to a useable answer yourself. Now, the AI can do the search much quicker and write customized solutions by understanding our code. Why not enjoy that?
What AI fails at
Even though the AI fanboys might come for me, there are some universally agreed upon issues with AI:
Any non-mainstream tech stack. AI performs decently with React, but try something else, and the quality plummets.
Last month I used AI to help with a WebGL project, and it generated code that looked plausible, but simply didn’t work, because it hallucinated so many API calls.
Complex business logic. Last week, I asked AI to refactor a function. The AI happily returned a ‘solution’ with unnecessary duplication.
The code worked, but the AI completely lacked the ability to identify the actual problem and implement an elegant solution. This problem remains because the AI doesn’t have a full context of your entire codebase.
The debugging overhead is real. Sometimes fixing AI’s “solution” takes longer than writing it yourself.
Security is another weak spot. I’ve had AI confidently suggest storing API keys in local storage — essentially leaving my application open for exploits.
The Correct Way to Use AI
This reality taught me to combine AI’s speed with my personal quality standards:
- I let AI draft the first version.
- I carve out dedicated review time to catch its blunders.
- I write tests around every AI-generated module.
How to Thrive (Not Just Survive)
If you’re still on the fence, here’s the exact playbook I’ve honed:
- Build your verification instincts. When AI outputs code, I learned to spot the red flags: incorrect library usage, not using existing functions or patterns, incorrect domain knowledge.
- Operate at the edge of your abilities. Use AI for the mundane stuff (config, boilerplate, standard patterns, typical integrations), then apply your creativity to the novel problems AI can’t handle yet.
- Context is all you need. Always make sure to give the AI a proper context of your entire codebase. If you give the correct context, AI can do magical things. If not, you will get low quality results and will often be frustrated.
- Ask deliberately. Instead of “implement this feature,” I break problems into smaller chunks: “Create the data model for this entity,” then “Write the validation logic for these fields,” and so on.
- Deep dive when things break. The best learning happens at failure points. When AI-generated code breaks, that’s your cue to really understand the underlying system. Add logs, use the debugger, manually go through each part of the code flow.
- Keep a “WTF AI” journal. Document every spectacular fail—hallucinated API calls, misnamed types, security oversights. Those failures become your internal library of “don’t let it do that again.” It’s therapeutic and surprisingly educational.
Next Steps
The uncomfortable truth is that AI coding tools aren’t optional anymore. The developers who adjust to this new reality fastest will have the most leverage, because they’ll solve higher-level problems while AI handles the mundane.
I don’t particularly like this reality. There’s something unsettling about watching an AI generate in seconds what would have taken me an hour. But pretending this shift isn’t happening won’t change its trajectory.
Perhaps in five years, we’ll look back on this transition period with nostalgia. Another tool that felt threatening until it became indispensable. Or maybe we won’t.
Either way, I’ll be using AI tomorrow morning, cursing its limitations, and shipping more code than I did yesterday.
Thanks to John, Cyrene, and Mikhail for helping me think deeper about these ideas and for sharing feedback on my drafts
P.S. Frustrated by AI forgetting existing code and making mistakes? I built something for codebases large enough that AI loses track. Loved by devs from Google, Uber, and more. Check out Giga AI.