Skip to main content

Beyond the Vibes: AI-Assisted Development

05-25-26 Jon Oliver

AI coding tools are making it possible to build software faster than ever before. But speed alone is not enough. Leveraging AI alongside good development practices helps us move faster without sacrificing quality.

If you’re involved in software development, you’ve likely been unable to escape the phrase “vibe coding” recently. You’ve probably seen whole apps or websites purporting to have been built solely on vibes: no handwritten code, no code reviews, just someone prompting their favorite generative AI tool, invoking some magic incantations, and *poof*, their idea springs to life. 

Along with this come claims like “developers are cooked,” or “software engineering is dead.” Is it true? I don’t think so. But it’s true that software development is changing quickly. Generative AI has empowered people with little technical background to build things that simply weren’t possible before. At the same time, it has absolutely supercharged the abilities of experienced developers. We can build things in days that would have previously taken weeks or months.

AI coding tools create real opportunities to do more, better, and faster. But they also introduce new risks. Those risks grow without the experience that comes from building, breaking, and maintaining real systems over time. 

What is vibe coding?

Vibe coding is a style of building where the developer focuses on the outcome and leaves most of the implementation to a coding agent. You guide the direction with prompts, describe what you want, and let the tool handle the details. In practice, you’re taking on the role of a product owner while the agent acts as your developer.

This approach is great in some cases. It’s well-suited for prototyping, exploring new ideas, and building small, useful tools for you and your team. It’s also a helpful entry point for people who are learning to program. When used this way, it lowers friction and encourages experimentation.

But the same approach can cause problems in other cases. Vibe coding struggles when the work needs to hold up over time. The focus tends to be on building something quickly, rather than building a system that’s easy to understand and maintain. Over time, that can lead to fragile code and technical debt that becomes increasingly harder to manage. When things like reliability, security, and maintainability matter, it’s time to move beyond the vibes. 

AI-Assisted Development

Let’s talk about a more durable approach: AI-Assisted development. This is the practice of leveraging the power of AI tools within established development processes. The goal is to increase output without lowering the standard of quality.

In this model, you’re still using AI for research, scaffolding, and implementation. The difference is that you’re working with the tools, guiding the architecture and implementation, instead of delegating those decisions to the tooling. You’re putting the processes and practices in place that prevent technical debt from compounding. You’re evaluating the results through experience and judgment. You, the human, remain responsible for the quality of the code, even if it’s produced by an AI agent.

When used this way, AI changes how you spend your time. Less time goes into repetitive coding tasks and more time goes into decisions that shape the system. Architecture, trade offs, and long term maintainability become the focus. 

Now that we understand the concept, let’s talk about a few guidelines that will help you leverage AI in a way that allows you to increase productivity without sacrificing quality. Before we dive in, we should note that many of the suggestions below are already tried and tested software development practices. What changes is how we leverage AI tooling to strengthen and improve these practices.

Start With a Plan

One of the easiest ways to go off the rails with vibe coding is to jump straight from idea to implementation. Without a solid plan in place, you’re leaving your fate to the probability machine. The better the plan, the better your chances for success. 

Creating a plan is typically an interactive, iterative process with the coding agent to hammer out the details before implementation. The basic steps include:

  1. Provide context to the agent

  2. Let the agent interview you

  3. Generate the plan

  4. Review it

  5. Correct inaccuracies and assumptions

  6. Iterate until the plan is ready for implementation

This process has several benefits over a more ad-hoc “prompt and pray” approach. Planning is where you apply judgment early, before mistakes compound. It’s much easier to review a plan in plain language than to reverse-engineer intent from hundreds of lines of generated code. You can catch bad assumptions early and keep the agent aligned before it creates a mess. You’re also creating an artifact that can be referenced across multiple sessions.

Most modern coding agents have the ability to generate a plan before writing code. At its most basic, you’re creating a markdown file that captures the necessary context to successfully execute on a piece of work. A good plan will likely have the following characteristics:

  1. A clear objective

  2. An explicit scope

  3. Concise step-by-step instructions

  4. Clear architectural patterns

  5. Consideration for edge cases

  6. Verification steps

Documentation should be human-first

With AI, there’s no longer an excuse for poor documentation. Coding agents make it easier than ever to write things like READMEs, setup guides, and API documentation. But that convenience can be misleading if we’re not considerate of what actually matters. Coding agents are very good at documenting what the code does. They’re not as good at capturing why it does it. This can lead to creating overly verbose documentation that fails to capture intent or purpose.

This is why it’s important to focus on the human audience for your documentation. If a person can read your docs and understand them clearly, an AI agent will be able to do the same. Focus on clarity and organization.

Good documentation should be easy to find and reference, clearly explain how a system is structured and used, and capture the reason behind decisions. Describing what something does is helpful, but explaining why it exists and how it is intended to be used is what makes documentation valuable over time.

AI can play a strong supporting role here. It can help generate drafts, fill in gaps, and speed up the writing process. At the same time, it is still your responsibility to ensure that the documentation reflects reality, captures the right intent, and stays up to date as the system evolves.

Documentation is one of the primary ways both humans and tools understand the system, and it deserves the same level of care as the code itself. It should be treated as a deliverable and part of your validation process, not as an afterthought.

Turn probability into predictability

If you need to do something more than once, it’s a good sign that you should stop prompting and start writing a script. Prompting is useful for figuring things out, but it is not a reliable way to run repeatable work over time.

Scripts provide that reliability. They produce consistent results for the same inputs, can be run safely as many times as needed, and can be reviewed and understood like any other piece of code. This makes them far easier to trust, especially as systems grow more complex. Scripts can be baked into agent skills, equipping agents with the tools they need to consistently perform tasks or collect information to operate on.

AI is very effective at helping you generate these scripts. It can take a rough idea and turn it into something structured and usable quickly. But the decision on when a task should become a repeatable process still requires your judgment.

Testing matters more than ever

AI tools are getting better at writing code, but they are also getting better at making subtle mistakes. Instead of obvious syntax errors, the issues you encounter tend to be more nuanced. You might see incorrect assumptions baked into the logic, small bugs that are hard to spot at a glance, unrelated changes that quietly break existing functionality, or new implementations that ignore existing patterns and reinvent solutions unnecessarily.

These are all problems that human developers create as well, but AI accelerates how quickly they can accumulate. Without strong guardrails, those small issues can compound into something much harder to maintain. Automated testing helps keep these things under control.

Unit tests are especially effective in this environment because they encourage modular design, provide fast feedback, and give AI a loop to self-correct. A strong workflow starts by defining expected behavior in plain language. From there, you generate failing tests that express that behavior, and then implement the code to satisfy those tests. This creates a feedback loop where the agent can iterate toward correctness rather than guessing.

With this approach, it’s extremely important to pay attention to the quality and correctness of your tests. Tests should be clear and easy to read, cover meaningful scenarios, and exercise important edge cases. It is also important to watch for cases where the AI tries to “cheat” by modifying or weakening tests just to make them pass. Those kinds of shortcuts undermine the entire purpose of testing.

For integration and end-to-end testing, choose tools that provide clear command line output and make failures easy to understand. It is not necessary to run every test all the time. Unit tests can be run frequently during development, while broader end-to-end tests can be reserved for key checkpoints, such as when a feature is complete.

With AI in the loop, there is very little friction to writing tests. Take advantage of this to harden your systems and prevent playing whack-a-mole with bugs as your codebase grows.

Don’t skimp on the code review

This is one of the clearest distinctions between vibe coding and engineering. Computers are not accountable for the code they produce. That responsibility stays with you. When you use AI to generate code, you are still the one who owns the outcome.

That means taking the time to review the code yourself. You need to understand what it does, how it works, and whether it meets the standards of your codebase. Skipping that step might feel like a shortcut, but it often just shifts the burden to someone else later.

It’s important not to turn your efficiency into someone else’s inefficiency. When unreviewed code is passed along, the cost of understanding and fixing it doesn’t disappear. It just moves downstream, often at a higher cost. Unchecked AI output leads to technical debt. Over time, that debt makes systems harder to maintain and slows down development. What feels fast in the moment can create friction later.

Code review is not a bottleneck. It’s what protects long-term velocity. Taking the time to review and understand the work keeps the system stable and makes future work easier.

It’s a Partnership

Ultimately, AI-Assisted Development is a partnership between human experts and machines. By leveraging our own expertise, alongside the abilities of AI, we can make a greater impact than ever before. AI can help you move faster, but speed without direction is just drift. Humans bring the direction, the judgement, and the expertise. We need to delegate our work, not our thinking. That’s how we make this partnership successful.

Want to talk about how we can work together?

Katie can help

A portrait of Vice President of Business Development, Katie Jennings.

Katie Jennings

Vice President of Business Development