Unstyled Components: A Must for Modern Web Applications
Jonathan Felipe de Oliveira | Dec 23, 2025
The term “vibe coding” has been floating around a lot lately. Fast, AI-assisted, or just relaxed coding sessions… Everyone has their own take. But behind the hype, some misconceptions persist. Some people assume that AI can “drive” development, or that fast coding means skipping best practices.
It’s time to break those biases. AI is a powerful assistant, not a pilot: it accelerates repetitive tasks, helps with boilerplate, and provides suggestions, but it doesn’t replace human judgment, problem-solving, or solid software engineering principles. Likewise, coding quickly doesn’t automatically equal productivity; discipline, structured thinking, and maintainable code remain essential.
With that in mind, let’s clarify a few common myths about vibe coding.
Many believe that delivering code quickly is the same as being productive. This is simply not true. Fast output can hide technical debt and fragile shortcuts if it isn’t balanced with maintainability, testing, and thoughtful architecture.
At Cheesecake Labs, every feature goes through careful validation before it goes live. We review code for duplication, consolidate repeated patterns, break down large files, update documentation for complex functionalities, add tests to prevent regressions, and check for potential anti-patterns.
AI can speed up these tasks dramatically, turning days of work into hours, but a human eye is still essential to understand what was built, why, and how it interacts with the system. Productivity comes from this balance of speed, quality, and context.
Some assume that fast or AI-assisted coding removes the need for deep engineering knowledge. This is false. As we outlined above, delivering maintainable and reliable code requires knowing how to structure features, validate implementations, refactor safely, and integrate changes across the system.
Even with Artificial Intelligence accelerating repetitive tasks, understanding when and how to apply each step, from reviewing duplication to breaking down responsibilities, updating documentation, adding tests, and spotting anti-patterns, is essential. Without this expertise, fast coding becomes fragile coding. AI is a powerful assistant, but it cannot replace the judgment and foresight that come from strong software engineering fundamentals.
Once you recognize that engineering fundamentals are the backbone of fast and reliable coding, the next step is understanding how they scale: through architecture.
Read more: How to Integrate AI Into an App
Some believe that because AI can generate large amounts of code quickly, architectural decisions matter less. The reality is the opposite: architecture is what makes AI useful instead of dangerous.
Clear boundaries, modular design, separation of concerns, naming conventions, and consistent patterns give AI a predictable structure to operate in. When these foundations are missing, AI simply accelerates chaos, multiplying inconsistencies, increasing coupling, and expanding technical debt.
Strong architecture doesn’t just improve human productivity; it also improves AI output quality. Modern tools learn from the structure you enforce. By defining architectural rules explicitly, such as which modules can import each other, how features are organized, which layers own specific responsibilities, and which patterns should be avoided, you give the AI guardrails that keep the codebase coherent.
There is a risky assumption that because AI is trained on millions of repositories, the code it generates is automatically secure and follows best practices. This is a dangerous oversight. AI models don’t “audit” code for safety, they predict patterns, often replicating outdated vulnerabilities or insecure defaults just to make the code work.
Here on Cheesecake Labs, we stick to a “Security by Design” mindset. While AI helps us draft logic faster, it doesn’t get a free pass. Our engineers rigorously review dependency management, data handling, and potential injection points. We treat AI suggestions as a draft, not a final deliverable, ensuring that speed never comes at the cost of user safety.
It’s easy to feel like development is flying when you can generate entire functions with a single keystroke. However, a high volume of code often creates an illusion of progress. Recent industry data points to a rise in “Code Churn”, code that is written and quickly discarded or rewritten, suggesting that AI often encourages adding bloat rather than refining the solution.
We believe that less is often more. Real productivity isn’t about how much code you generate, but how concisely you can solve a problem. Cheesecake Labs focus on keeping the codebase lean and maintainable, prioritizing smart architecture over raw output to avoid unnecessary complexity that slows us down later.
With tools like Cursor or Copilot, some argue that the gap between junior and senior developers is vanishing, or that mentorship is less critical. This misses the point entirely. While AI can bridge the gap in syntax and basic implementation, it cannot provide the context, architectural wisdom, or long-term foresight that comes with experience.
In fact, AI makes mentorship more important, not less. At Cheesecake Labs, our leaders use these tools to help the team grow, teaching less experienced developers how to audit AI suggestions, spot subtle bugs, and understand the “why” behind the code. The goal is to build critical thinkers who command the tools, rather than just operators who follow them.
Read more: Quick Guide: Setting Up and Using Cursor with Claude 3.7
There’s a growing misconception that vibe coding is something intended for product managers, designers, or other non-engineering roles using AI to “generate code without coding.” This is inaccurate. Vibe coding, when practiced correctly, is a high-leverage engineering technique that depends on strong technical judgment.
Senior and staff engineers use AI to accelerate exploration, refactoring, and iteration, but they do so with a deep understanding of architecture, trade-offs, and system behavior. Without this expertise, AI-assisted coding becomes guesswork. Vibe coding is not a shortcut for non-developers, it’s a skill that amplifies the capabilities of experienced engineers.
Read more: AI Use Cases & Applications: How Businesses Are Leveraging AI
Understanding these myths is only half the battle; the other half is implementing a workflow that actively prevents them. To ensure that “vibe coding” translates into robust engineering rather than chaotic speed, we need the right tools and the right discipline. This brings us to the practical application of these principles using Cursor.
AI tools are now part of daily development, and Cursor has quickly become a favorite. It speeds up routine work, drafts code, and handles refactoring without complaining about deadlines. Still, it is a tool, not a replacement for engineering judgment, so knowing how to use it well is what makes the real difference.
By treating Cursor not as a magic wand, but as a structured teammate, we can enforce the architecture, security, and quality standards discussed above.
Cursor is a tool we use to improve efficiency and accuracy, not to substitute engineering judgment. We begin by defining clear objectives, constraints, and conventions, then request drafts for scaffolding, documentation, or tests within those boundaries.
Engineers examine the results for correctness, security, and alignment with business rules and architecture. This discipline reduces rework, keeps decisions intentional, and helps us deliver consistent, maintainable code.
It performs best when you give it clear inputs: objectives, context, constraints, and any architectural rules. The more specific you are, the less cleanup you have to do later.
Cursor shines at generating boilerplate, drafting functions from specs, creating documentation, and even helping with PR reviews and test generation. It performs best when you give it clear inputs: objectives, context, constraints, and any architectural rules. The more specific you are, the less cleanup you have to do later.
Setting up rules and templates is an easy way to standardize output across a team. Rules guide naming conventions, patterns, and test requirements, while templates provide ready-made structures for new modules or services. Once these are in place, Cursor becomes a consistent, disciplined teammate, minus the coffee breaks.
Cursor can accelerate tasks, but you should still drive the process. Break your work into small steps, let the Cursor support each one, and review everything. A simple cycle works well: draft with Cursor, review manually, generate tests, review again, then finalize. This keeps speed high and mistakes low.
Cursor generates code, but it does not understand your business rules or long-term architecture. It can miss edge cases or take shortcuts you would never approve. A proper review ensures correctness, security, and maintainability. Developers stay accountable.
Cursor helps you move faster and stay consistent, but the real engineering comes from you. It removes repetitive work so you can focus on architecture, performance, and problem-solving, the work AI cannot replace.
Used thoughtfully, Cursor becomes a strong ally: it boosts productivity, supports good practices, and reduces friction in daily development. Clear rules, solid templates, and disciplined reviews turn it into an effective partner that strengthens, rather than replaces, your engineering craft.

I love helping people using creative solutions, from design to code. Also I love art, music, outdoors and travel. Pet and Plant father 🥸
I am a software developer, graduated in Computer Science from the Federal University of Ceará in 2017. I enjoy working on improving performance in data processing queries, and my strongest experience lies in backend development. I am a curious professional who is always eager to learn new things. I have experience with cloud resources, but I am always looking to expand my knowledge in this area. I constantly strive to stay up-to-date with the latest trends and advancements in the technology market and to improve my skills in programming, teamwork, and problem-solving. I am always ready to take on new challenges and contribute to successful projects.
Passionate about building high-performance, scalable, and maintainable front-end applications, I have nearly 7 years of experience specializing in the React ecosystem. Expertise with React, Next.js, TypeScript, React Native, Clean Architecture, Micro Frontends, Monorepos, TDD (Jest, Cypress, RTL), NodeJS, NestJS, ExpressJS, MongoDB, Postgres, relational and non-relational databases.
Marcelo Bittencourt is a Software Engineer in Cheesecake Labs. Throughout his career, he has integrated AI into products, streamlined development workflows, and modernized legacy platforms, while also contributing to frontend initiatives using Angular, React, and Next.js.