How I Use AI in Web Development - And What I've Learned About Its Limits
AI Didn't Teach Me to Code
Let me be clear about something upfront: AI tools didn't teach me web development. I learned by building, debugging, and reading documentation - the same way most developers learn.
What AI has done is change certain parts of my workflow in ways that are genuinely useful. And some parts that are decidedly not.
What I Actually Use AI For
Boilerplate and scaffolding
When I know exactly what I need - a TypeScript interface, a Next.js API route structure, a Tailwind component skeleton - AI can generate that faster than I can type it. I review it, adjust it, and move on.
The key: I know what I'm looking for. That judgment comes from having written enough code manually to recognize when the output is right or wrong.
Research and documentation
"What's the correct way to handle ISR cache invalidation in Next.js 14?" - AI gives me a starting point faster than scanning through docs. But I always verify against the official documentation. AI gets things wrong, especially on recent API changes.
Content drafts
Blog posts, README files, code comments - AI can produce a first draft. My job is to edit it until it sounds like me and is actually accurate. The draft is a starting point, not a finished product.
Pattern exploration
When I'm trying to decide between two approaches, I'll sometimes ask AI to explain the tradeoffs. It's useful for surfacing considerations I might not have thought of - though I make the final architectural call.
Where AI Consistently Fails Me
Complex debugging
When a bug requires understanding the interaction between multiple systems - React state, Next.js server/client boundaries, CSS specificity, TypeScript generics - AI often produces confident-sounding wrong answers.
The deeper the system knowledge required, the less reliable AI becomes. This is the part of development where experience matters most, and AI can't fake it.
Architecture decisions
Should this be a Server Component or a Client Component? Should this data be fetched at the route level or the component level? Where should this state live?
These decisions have cascading effects. AI can suggest an answer, but it doesn't understand your specific codebase, your performance constraints, or your future requirements. That judgment is human.
Code quality and consistency
AI-generated code often works but doesn't match the style, patterns, or conventions of the surrounding codebase. Left unreviewed, it creates inconsistency that compounds over time. Every piece of AI output needs a human pass.
The Real Lesson
AI is a multiplier - it amplifies whatever skills you already have. If you have strong fundamentals, AI helps you move faster on the parts of development that are formulaic. If you don't, AI gives you code you can't evaluate, and that's a problem.
The developers who benefit most from AI tools are the ones who already know enough to judge the output critically. The tool is most useful to people who, in theory, need it least.
My Actual Workflow
- Design the architecture manually - What components do I need? What data flows where? What's the rendering strategy?
- Use AI for specific generation tasks - Interface definitions, component scaffolding, content drafts
- Review everything - Does this match the codebase pattern? Is there a bug? Is this actually the right approach?
- Debug manually - When something breaks, I trace it myself. AI suggestions during debugging are a last resort, not a first step.
- Test on real devices - No amount of AI can catch issues you only see on a real phone.
What This Means for How I Position Myself
I use AI. I'm not going to pretend otherwise. But I use it as a tool - the same way I use a terminal, a linter, or a browser devtools. It's part of the workflow, not the workflow itself.
The thinking, the decisions, the quality control, the debugging, the architecture - those are still on me. That's the job.