Vibe Coding - The Future of Programming - Addy Osmani
Vibe Coding - The Future of Programming - Addy Osmani
Programming
Leveraging Your Experience in the Age of AI-Assisted
Coding
With Early Release ebooks, you get books in their earliest form—
the author’s raw and unedited content as they write—so you can
take advantage of these technologies long before the official
release of these titles.
Addy Osmani
Vibe Coding: The Future of Programming
by Addy Osmani
Copyright © 2025 Addy Osmani. All rights reserved.
Printed in the United States of America.
Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North,
Sebastopol, CA 95472.
O’Reilly books may be purchased for educational, business, or sales
promotional use. Online editions are also available for most titles
(http://oreilly.com). For more information, contact our
corporate/institutional sales department: 800-998-9938 or
corporate@oreilly.com.
In this section, I’ll walk you through each pattern in turn, discussing
workflows and tips for success.
AI as First Drafter
It’s important to make sure everyone on the team is on the same
page before you ask your AI model to begin drafting any code.
Communication is key so that developers don’t ask their AI
assistants to do redundant tasks or generate conflicting
implementations.
In daily stand-ups (a staple of agile workflows), it’s worth discussing
not just what you’re working on, but also if you plan to use AI for
certain tasks. For example, two developers might be working on
different features that both involve a utility function for date
formatting – if both ask the AI to create a formatDate helper, you
might end up with two similar functions. Coordinating upfront (“I’ll
generate a date utility we can both use”) can prevent duplication.
Teams that successfully integrate AI tools often start by agreeing on
coding standards and prompting practices. For example, the team
might decide on a consistent style (linting rules, project conventions)
and even feed those guidelines into their AI tools (some assistants
allow providing style preferences or example code to steer outputs).
As Codacy’s blog notes, by familiarizing the AI with the team’s
coding standards, you get generated code that is more uniform and
easier for everyone to work with. On a practical level, this could
mean having a section in your project README for “AI Usage Tips,”
where you note things like “We use functional components only” or
“Prefer using Fetch API over Axios,” which developers can keep in
mind when prompting AI.
Another practice is to use your tools’ collaboration features if
available. Some AI-assisted IDEs allow users to share their AI
sessions, or at least the prompts they use. If Developer A got a
great result with a prompt for a complex component, sharing that
prompt with Developer B (perhaps via the issue tracker or a team
chat) can save time and ensure consistency.
As for using version control, the fundamentals remain – with a twist.
Using Git (or another version control system) is non-negotiable in
modern development, and that doesn’t change with vibe coding. In
fact, version control becomes even more crucial when AI is
generating code rapidly. Commits act as the safety net to catch AI
missteps; if an AI-generated change breaks something, you can
revert to a previous commit.
One strategy is to commit more frequently when using AI assistance.
Each time the AI produces a significant chunk of code (like
generating a feature or doing some major refactoring) that you
accept, consider making a commit with a clear message. Frequent
commits ensure that if you need to bisect issues or undo a portion of
AI-introduced code, the history is granular enough.
Also, try to isolate different AI-introduced changes. If you let the AI
make many changes across different areas and commit them all
together, it’s harder to disentangle if something goes wrong. For
example, if you use an agent to optimize performance and it also
tweaks some UI texts, commit those separately. (Your two commit
messages might be “Optimize list rendering performance [AI-
assisted]” and “Update UI copy for workout completion message [AI-
assisted]”). Descriptive commit messages are important; some
teams even tag commits that had heavy AI involvement, just for
traceability. It’s not about blame, but about understanding the origin
of code – a commit tagged with “[AI]” might signal to a reviewer
that the code could use an extra-thorough review for edge cases.
Essentially, the team should treat AI usage as a normal part of the
development conversation: share experiences, successful
techniques, and warnings about what not to do (like “Copilot
suggests using an outdated library for X, be careful with that”).
Review and refinement are crucial to this pattern. Developers should
manually review and refactor the code for modularity, add
comprehensive error handling, write thorough tests, and document
key decisions as they refine the code. The next chapter goes into
detail about these processes.
AI as Pair Programmer
Traditional pair programming involves two humans collaborating at
one workstation. With the advent of AI, a hybrid approach has
emerged: one human developer working alongside an AI assistant.
This setup can be particularly effective, offering a blend of human
intuition and machine efficiency.
In a human-AI pairing, the developer interacts with the AI to
generate code suggestions, while also reviewing and refining the
output. This dynamic allows the human to leverage the AI’s speed in
handling repetitive tasks, such as writing boilerplate code or
generating test cases, while maintaining oversight to ensure code
quality and relevance.
For instance, when integrating a new library, a developer might
prompt the AI to draft the initial integration code. The developer
then reviews the AI’s suggestions, cross-referencing with official
documentation to verify accuracy. This process not only accelerates
development but also facilitates knowledge acquisition, as the
developer engages deeply with both the AI’s output and the library’s
intricacies.
Let’s compare this to traditional human-human pair programming:
Human-AI pairing offers rapid code generation and can
handle mundane tasks efficiently. It’s particularly beneficial
for solo developers or when team resources are limited.
Human-human pairing excels in complex problem-solving
scenarios, where nuanced understanding and collaborative
brainstorming are essential. It fosters shared ownership and
collective code comprehension.
Both approaches have their merits, and your choice between them
can be guided by the project’s complexity, resource availability, and
the specific goals of the development process.
AI as Validator
Beyond code generation, AI can serve as a valuable validator,
assisting in code review and quality assurance. AI tools can analyze
code for potential bugs, security vulnerabilities, and adherence to
best practices. For example, platforms like DeepCode and Snyk’s AI-
powered code checker can identify issues such as missing input
sanitization or insecure configurations, providing actionable insights
directly within the development environment. Platforms such as
Qodo and TestGPT can automatically generate test cases, ensuring
broader coverage and reducing manual effort. And many AI tools
can assist in monitoring application performance, detecting
anomalies that might indicate underlying issues.
By integrating AI validators into the development workflow, teams
can enhance code quality, reduce the likelihood of defects, and
ensure compliance with security standards. This proactive approach
to validation complements human oversight, leading to more robust
and reliable software. These tools enhance the efficiency and
effectiveness of the QA process by handling repetitive and time-
consuming tasks, allowing human testers to focus on more complex
and nuanced aspects of quality assurance.
Incorporating AI into the development process, whether as a pair
programmer or validator, offers opportunities to enhance productivity
and code quality. By thoughtfully integrating these tools, developers
can harness the strengths of both human and artificial intelligence.
To maximize the benefits of both AI and human capabilities in QA, I
recommend a few best practices:
You’ve seen how AI coding assistants like Cursor, Cline, Copilot and
WindSurf have transformed how software is built, shouldering much
of the grunt work and boilerplate–about 70%.1 But what about that
last “30%” of the job that separates a toy solution from a
production-ready system? This gap includes the hard parts:
understanding complex requirements, architecting maintainable
systems, handling edge cases, and ensuring code correctness. In
other words, while AI can generate code, it often struggles with
engineering.
Tim O’Reilly, reflecting on decades of technology shifts, reminds us
that each leap in automation has changed how we program but not
why we need skilled programmers. We’re not facing the end of
programming, but rather “the end of programming as we know it
today,” meaning developers’ roles are evolving, not evaporating.
The challenge for today’s engineers is to embrace AI for what it does
best (the first 70%) while doubling down on the durable skills and
insights needed for the remaining 30%. This article dives into expert
insights to identify which human skills remain crucial. We’ll explore
what senior and mid-level developers should continue to leverage
and what junior developers must invest in to thrive alongside AI.
This chapter’s goal, then, is to offer you pragmatic guidance for
maximizing the value of that irreplaceable 30%, with actionable
takeaways for engineers at every level.
Use AI!
Remember that AI should be an integral part of your workflow–it’s
not something to resist. Practical ways to incorporate AI into your
daily work include:
If you are a software engineer who’s three years into your career:
quit now. there is not a single job in CS anymore. it’s over. this
field won’t exist in 1.5 years.
To which @garrytan replied in a quote tweet:
Learn X design and product design and you will become stronger
than you could ever imagine.
Successful software creation has always required more than just
coding ability. What’s changing is not the death of engineering, but
rather the lowering of pure implementation barriers. This shift
actually makes engineering judgment and design thinking more
crucial, not less.
Consider what makes applications like Figma, Notion, or VS Code
successful. It’s not just technical excellence – it’s the deep
understanding of user needs, workflows, and pain points. This
understanding comes from:
The best engineers have always been more than just coders.
They’ve been problem solvers who understand both technical
constraints and human needs. As AI tools reduce the friction of
implementation, this holistic understanding becomes even more
valuable.
However, this doesn’t mean every engineer needs to become a UX
designer. Instead, it means developing stronger product thinking
abilities and building better collaboration skills with designers and
product managers. It means thinking more about users,
understanding their psychology and behavior patterns and learning
to make technical decisions that support user experience goals.
You’re at the point of achieving technical elegance: now balance it
out with close attention to practical user needs.
Tan went on to tweet:
UX, design, actual dedication to the craft will take center stage in
this next moment
Actually make something people want. Software and coding won’t
be the gating factor. It is the ability to be a polymath and
smart/effective in many domains together that creates great
software.
The future belongs to engineers who can bridge the gap between
human needs and technical solutions – whether that’s through
developing better design sensibilities themselves or through more
effective collaboration with dedicated designers.