I read a comment today from Jefferey Ogdis that resonated with me:
Vibe coding is only as legit as your vibe
At the end of this article, I provide six hints to help you max out your vibe when coding with the aid of artificial intelligence.
My history of vibe coding
I have been using Cursor AI since November last year. Initially, I was skeptical, but I forced myself to keep using it. In the last eight months, it has significantly improved, to the point that I wouldn’t want to code without it.
I find AI to be like a highly enthusiastic junior developer with a photographic memory, who has read every tutorial, article, and StackOverflow question-and-answer out there, but who has no imagination and a very poor sense of judgment as to what is valid and what is not.
A person skilled in the art
In patenting, the patent examiners and court judges use the concept of PHOSITA - a person having ordinary skill in the art. They are a hypothetical engineer or scientist who is skilled but not inventive.
AI acts exactly like a PHOSITA.
It therefore makes an excellent coding companion, provided you know what you are doing. The AI handles all the tedious coding work. For example, moving an image a few pixels to the right on a webpage, constructing a loop and test to verify a mathematical hypothesis, handling file input and output, and so on.
If you are a vibe coder looking to deploy a landing page or simple website, implement a JavaScript version of a classic arcade game, or even produce code for a well-known mathematical algorithm, then you do not have to have programming knowledge.
What it is poor at is implementing new stuff. A vague idea of what you want to achieve is not going to cut it.
Here are some examples of areas where I found AI to be a complete failure:
Animated sprites
Skia is an open-source 2D graphics library, and the documentation says that you can use it to implement sprites moving around on a phone screen using something called an Atlas, if you combine it with Reanimated (a library for running fast native code on a device and handling gesture support), and Expo (a platform for building React Native web applications on mobile devices).
There were no tutorials on how to do this, though. AI proposed one ludicrous non-functioning solution after another, until I gave up, searched the web, and found the reason.
One sentence on the web claiming you can do something is not enough for an AI to provide functioning code if the claim is complex and requires a non-intuitive combination of existing components. In the end, I spent a day combing through the documentation and using my imagination to work out how Skia, Reanimated, and Expo could achieve what I wanted.
Then I wrote and published a tutorial on it. That means that by now, Cursor AI should be providing much better answers to this problem.
I should really go and check that hypothesis.
Collision detection
Because the game I was writing used a bullet-shaped symmetric sprite, I came up with a very efficient method for determining whether the sprite had collided with a wall or not.
Describing the full method in detail to Cursor AI was not enough to get it to produce functioning code. The AI simply did not understand what I was trying to achieve. In the end, I had to break the method down into about twenty different parts, get the AI to produce code for each of them, and then hand-edit it to achieve my aims.
The AI provided scaffolding, but the substance of the code was lacking.
Breaking a digital signing algorithm
I came up with a hypothesis for a potential weakness in the elliptic curve digital signing algorithm (ECDSA), that I wanted to test. Again, the AI was great at producing some Python code for producing private keys, generating signatures, and then verifying them.
Using AI for coding allowed me to quickly construct the framework I needed to test my hypothesis, but the core part required heavy manual coding. Using AI saved me all the time on setting up the right environment, but if I had pushed it too far, then all that saved time would have been lost on subsequent arguments with the AI.
How to vibe code like a surf legend
As with any tool, you need to develop a feel for its abilities and limitations. It is like using a saw; if you charge in and start hacking away, you end up with poor results. The skill lies in focusing on control and consistency, not thoughtless brute force.
Here are six tips that I’ve distilled out of hundreds of hours of vibe coding that should help you on your way:
Add an overview document to your code repository.
 Call it something likenotes.txt
oroverview.txt
, and add it to the AI context in the chat. Write an overview of what you are trying to achieve in your coding project, in English, in that document, as though you were providing an outline or list of aims to a junior developer.
 You can keep expanding on the overview as the project proceeds, and Cursor AI will pick up on that. Make sure you list the third-party libraries you plan to use.Always begin by breaking your programming task into small sub-steps.
Avoid asking the AI to do anything beyond the scope of the current sub-step.
 This should be standard practice for experienced developers in any case. It is easier to get the AI to work on code that is already in a module or separate file than to get it to pull out sub-components from a monolithic function in a single file.Commit your code before every significant change the AI makes.
 I imagine that in the future, the AI tool providers will add this as a form of auto-save functionality, but for now, it is very easy to end up with a complete mess and find that you can’t get back to where you were before the AI decided to completely destroy your code base.
 Over time, you will build up a sense of what requests are trivial and easy to recover from, and which lead to the programming equivalent of a pile of spaghetti bolognese splattered over the floor.Run tests after every change.
 Visually reviewing the changes the AI proposes is not enough to ensure that they do what you want.
 You will soon get into a flow process of prompt → test → accept/revert, and provided you are rigorously following step 2, the number of reverts occurring will go down over time.Learn to recognize overreach.
 It is tempting to get the AI to produce everything for you: the architecture, the logic, the UI, and even to spot edge cases and security risks.
 In practice, this leads to bloated code requiring ever more refactoring. AIs like to add more and more stuff, and rarely remove code unless specifically instructed to. It is you who has to act as the responsible senior developer, optimising and reducing what is present to produce manageable code.Understand what the produced code does.
 If an AI-generated function or procedure just works, it is tempting to move on to the next task. Resist this temptation. Take the time to read through the new code.
 You don’t have to understand every single line, but at the very least, you should have an overview of what it does and how it does it. And you can always ask the AI to provide a more detailed explanation if something is confusing you.
Vibe coding may only be as legit as your vibe, but as with any skill, you can hone it.
Provided you put in the effort.