Prompting With Purpose
Using LLMs to create software isn’t just “vibe coding”. That term implies a very informal approach to software: “hey Claude, make me an app that does X”. Sure, Claude (or whatever agent you use) will do that, but the less you specify, the more guesses it has to make. You can iteratively make changes, but it’s essentially building on shifting sand, and that is why more complex systems tend to have difficulty with that type of approach.
Instead, you should be very deliberate about what you’re trying to do, and yes, this takes some skill and knowledge of how software should work. Programming and software engineering aren’t dead, they’re just disciplines that need to evolve to new tools.
Start by putting your LLM aside for a minute. Write a short document describing what your actual goal is. List out the features that are vital, which ones are optional but nice to have, and even features that might normally be associated with the overall idea that aren’t wanted or needed.
Figure out your constraints. Are there performance metrics you have to hit? Specific platforms and configurations that must be supported? What TYPE of program is it — phone app, SaaS, standalone application, etc? Are you ok with incorporating existing open source projects or not, based on licenses? Write these constraints down, too.
If the material you’ve collected so far indicates a clear decomposition into smaller parts, do it now. Otherwise, the next phase will help with that.
Now pull up your LLM. Start by instructing it that you want to develop a plan to create a new application and feed it the document you created. Include instructions that you want to construct a roadmap on how to break the project up into smaller pieces with a sensible order in constructing them so they build off of each other. If you allow for the inclusion of open source projects or libraries, ask for the LLM to evaluate which ones exist and can be useful. The first phase should focus on the project environment: setting up any tooling, revision control systems, processes, etc.
REVIEW THE PLAN. Especially look at any assumptions the LLM makes, and make sure you agree with them. Suggest changes to order or ask it to explain decisions it made if you don’t immediately agree with them. Refine the plan until you’re happy with it.
Optionally, iterate the break the plan down into smaller sub-plans across the board, but I’d recommend skipping that, and instead…
Pick up the first phase of the plan. Break it down into sub-plans until you reach a granularity that lends itself to individual tasks, reviewing the plans at each stage. Once you have things down to the task level, that’s when you should let the LLM start coding. And if you’ve done your plans coherently enough, you should be able to have the LLM go from one task to the next quickly, making corrections to the plan as real experience lets you revisit previous decisions and assumptions and make necessary changes.
(Note that this is why I suggest against breaking down the entire project plan into fine-grained sub-plans before starting. Those sub-plans will inevitably require changes anyway, better to fold int he learned experience at the time you break the phase down into sub-plans.)
Think big, design smaller, refine smaller still. Implement in small, testable chunks. Incorporate lessons learned back into the plan.
Ok, maybe you’re slower than the vibe coder, but the vibe coder has a program. You have a working product.