Principles for vibe coding
1. You get out of it what you put into it
- I’ve seen engineers say “AI doesn’t work well” and simultaneously be giving Claude Code prompts like “fix this.” If your task description to the agent wouldn’t be good enough for a human engineer, it’s not going to be good enough for an agent.
- Using agents is work! They can dramatically speed you up but you need to make use of them well.
- Building an intuition for what an agent will do well at and where it will struggle is critical.
2. Get clear on what you want to build
- Do you want to modify a React button to update on an app change? How do you want the button to change? What color should the button be? What state should the button store?
- If you can answer these questions, you will get a better response from the agent.
3. Use o3 for planning
- So far, o3 seems to be the best thinking model for coding. I dump my code into o3 in ChatGPT using Repo Prompt, ask for a plan that I can put in Claude Code, and then run the plan.
- If I am struggling with a bug, I ask o3 for information on the bug.
- Using Wisper Flow dramatically speeds up my prompting. I find myself giving a bunch of additional context to the model when I’m speaking instead of typing.
4. Test agent output just like you would an intern!
- You would not trust an intern’s code!
- You would pull the PR, test it thoroughly and review it.
- You should treat AI generated code similarly.
- You can speed up review with o3 before taking a look at the code to catch any obvious issues.
5. You are the architect and your existing codebase is the guide
- Do not trust the agent to architect well! You should ask o3 to plan good decomposition in advance and instruct it to structure things well.
- Your codebase being well decomposed will help here! If it’s clear to you where something should go, it will be clear to an agent.
- This is one of the biggest struggles for vibe coding. You can get started quickly but multiple Claude Code sessions later and your codebase is a mess. I often have o3 suggest a refactor which works quite well!
6. Have tests!
- This is one I am still struggling with. When I’m iterating quickly on a codebase, it seems superfluous to create integration tests.
- On the other hand, when an agent can run the tests, or at a minimum, run the type checker, it can usually iterate to a decent solution.