AI tools can generate working code in seconds, but working code isn't always good code. There's a dangerous trap that many developers are falling into— vibe coding —and it's quietly destroying codebases everywhere.
I'm not an AI pessimist. I see huge value in leaning hard into using AI tools. When you're building real solutions that need to ship, it's silly at this point not to lean heavily into them. I use Claude extensively, and creating an issue to assign to GitHub Copilot makes scaffolding new features painless. But what happens when we lean too far into AI? That's when we enter vibe coding territory.
What is vibe coding? How is it different from building projects with the tools I mentioned above? It really boils down to this: you don't know what the heck is going on with the code, but it works for now. A typical vibe coding workflow looks like this: I want feature X, I use my AI tool of choice to produce code Y, I test to see if it works, then call it good. At this point, you have code that works on the surface, but you don't really know how it works, why it works, or how it achieves the desired results.
How can we be more effective when using AI to build? Notice I use the word "effective" here. You could argue that pumping out deliverables is the most effective thing a developer can do, but is it really effective if you're building tech debt and knowledge gaps in your systems? Let's take a different route. I want feature X, I use my AI tool of choice to produce code Y, we evaluate the output, take time to understand the code, examine the steps it takes to achieve the results, and ask: can this scale? Is it easy enough to understand? Does this mesh well with my current project? I would bet the answer would be no to most of these questions.
In the age of AI, what separates bad developers from good ones is becoming great architects. With the power to easily throw together proof of concepts for new features, we need to become excellent at knowing the right way to build reliable, scalable, and clean solutions. I had to learn this the hard way.
Last year, I was on a project to replatform a company from a custom-built e-commerce site to a true e-commerce platform. My role was to handle the migration of data from their legacy SQL database to the new platform. We migrated all their products, images, blog posts, customers, and historical orders—quite a big task, and the first project where I leaned super hard into AI.
When working in industry, time is valuable, and especially at small companies, timelines are tight. So I started building. I built some pretty robust Python scripts to handle these migrations. In the beginning, it started out clean. I researched the endpoints I needed for different types of data and fed this information to Claude to give me something to start with. This was great—we got a first iteration out there and imported some data to QA. QA checked out, so let's try importing a bigger batch.
Then we hit our first bumps. It looks like we're getting errors on this type of data—why and how? Research a solution and have Claude add to the code. Great, looks like it's working perfectly again! Until...
You get the point. Software development is never a golden path. Details are overlooked, clients change their minds. What I really wanted to point out is that constantly iterating with these tools without taking the time to really get in there, learn some architectural best practices, and create a strong foundation will cause your projects to spiral. Your codebase, effectiveness, and mental health will suffer.
Since then, I've developed strategies to still use AI effectively and heavily. Whenever I start a project or feature, I take the time to write some code first and make all the design and architectural decisions. Then I have AI iterate off of that foundation. I step back to gain understanding, validate that this follows my best practices, and ensure I have a great understanding of how the system is working.
The bottom line: AI is an incredibly powerful tool, but it's still just a tool. The best developers will be those who can harness AI's speed while maintaining the discipline to understand, architect, and own their code. Don't let the convenience of instant code generation turn you into a vibe coder. Take the time to understand what you're building—your future self (and your team) will thank you.