Vibe Coding: The Good and the Ugly
If you have been around the dev block recently, you most likely heard of this new trend “vibe coding” my friend roped me into trying it with Cursor, and let me just tell you I have mixed feelings about it. Here’s why.
The Good
When it comes to building a new project it feels liberating to vibe yourself to success! Not the same with legacy code however but not imposible.
Real-time feedback and rapid iteration
Cursor(like WindSurf) updates on the fly, making it a lot more faster and you don’t have to switch between writing and running as not only it updates scripts but it can as well create new ones!
As you can see from above screenshot for Cursor it at first asked for permission to mkdir and then automatically created schema.sql script.
Fresh start
Vibe coding on fresh project creates less baggage compared to legacy code. In addition it gives you sense of momentum, exploration and blazingly fast builds!
In addition it can do deploys to your Cloud provider if ssh keys are present and manage it in terminal(so not just code).
Great for ideation and brainstorming
Stuck on what tools to use? Postgres or Mongo? RabbitMQ? Kubernetes? Or what API system to use and even language Cursor and other AI IDEs can help with that by leveraging it’s deep understanding of all the tools in the disposal.
Just have to be explicit and scaffold based on my goals, and then gives me full stack with languages, reasoning and tools.
I asked a question of what I am included to build and to follow up with README.md tech stack and architecture tree including language of choice and other tools that would be optimal. ☝️
The Ugly
Even though these AI IDEs have access to your whole repo, they can still duplicate logic and other issues mentioned bellow. Thus extensive monitoring and NOT commiting before checking is a must. 🕵🏻
Code duplication
While code assistant IDEs have access to whole repo, it still sometimes create same functions in different directories. Like I had with my Rust project bellow. 👇
If you pay attention you can see that verify_pin function was created in plugin, service and utils module lvl by Cursor, so when some code doesn't work it can often recreate similar logic elsewhere and forget that there is already something implemented.
Tooling mismatch
This hits hardest in JavaScript and Python. With massive ecosystems, AI assistants often install libraries that don’t play well together — or that are outdated.
With React it can install certain dependencies like Supabase client and server side dependencies, same as with TS that are not compatible.
As we all know we can not always use the latest packages and documentation/methods are not available for some packages or are stale with AI not knowing it but just pasting.
Too fast, lack of reasoning
Sometimes it feels too easy to “vibe yourself to success”, but often context of repo is misunderstood and explanation of WHY particular approach was taken falls short. Thus it’s easy to fall into deep woods when you see 10 scripts generate and instead of reasoning and understand it you just close a blind eye and hope for AI Gods to fix possible issues.
To conclude I must say Cursor undeniably is a game-changer. But just because something becomes 3x easier doesn’t mean it can not wrap up “technical debt” in the future, especially if your not fully familiar with the tech like me when it comes to Rust.
The $20/month price is a bit steep, especially when WindSurf offers a free tier and GitHub Copilot is cheaper. Still, for now, I’m sticking with Cursor.
That said, I’ll be more cautious. Just because the assistant offers changes doesn’t mean you should accept them blindly. Review them. Test them. Because duplicated functions, unnecessary utils, and mismatched packages can snowball fast.