The Method
Full Lesson Reference
How to actually build things with AI.
The Core Loop
Building with AI follows a simple loop:
Describe → Review → Refine → Repeat
- Describe what you want
- Review what Claude creates
- Refine with feedback
- Repeat until it's right
That's it. Everything else is technique within this loop.
Starting a Project
The first prompt matters less than you think.
Don't overthink it. Don't try to specify everything upfront. Start with the outcome:
I want to build a menu bar app that shows my calendar events for today
That's enough. Claude will ask clarifying questions if it needs more information:
- What platform?
- What should happen when you click events?
- Where does calendar data come from?
Answer the questions. The project emerges through conversation.
Bad first prompts
Create a SwiftUI macOS application using AppKit's NSStatusItem for menu bar presence
with a NSPopover containing a List view bound to an array of CalendarEvent structs
fetched via EventKit framework with proper permission handlingThis is too specific too early. You're guessing at implementation details before you understand the problem. Let Claude figure out the technical approach.
Good first prompts
I want a menu bar app that shows today's calendar events. When I click an event,
it should open in Calendar.Clear outcome. No implementation details. Room for Claude to ask questions.
Describing Features Like a Designer
You already know how to do this. It's the same skill you use when writing specs or user stories.
Think outcomes, not implementation
Don't say:
Create a function that iterates through the array and filters items where
isCompleted equals falseDo say:
Show only the incomplete tasks
You care about what the user sees and experiences. Let Claude figure out how to make that happen.
Reference what you know
Claude understands references to existing products:
- Make the sidebar collapse like Notion's
- I want a command palette like Linear's
- The animation should feel like Apple's spring animations
These references convey a lot of information efficiently.
Be specific about what matters
Vague:
Make it look better
Specific:
The spacing feels too tight. Add more padding between list items, and make the
text slightly larger.The more specific your intent, the better the output.
The Iteration Loop
Nobody gets it right on the first try. That's fine — iteration is the point.
Small prompts beat big prompts
Instead of describing five features at once, do one at a time:
- "Add a button that saves the note"
- Review the result
- "Now add a confirmation when it saves successfully"
- Review
- "Make the confirmation disappear after 2 seconds"
Each cycle takes seconds. You stay in control. You catch issues early.
"Not quite" is useful feedback
When the result isn't what you wanted, describe the gap:
- That's close, but the button should be in the top right, not the bottom
- The animation is too fast — it should take about half a second
- This works, but I wanted it to also [X]
Claude adjusts. You don't need to know how to fix it — you just need to know what's wrong.
You don't need to understand all the code
When Claude shows you code, you don't need to understand every line. Focus on:
- Does it work?
- Does it feel right?
- Does it do what I asked?
If yes, move on. If no, describe the problem. You can always ask Claude to explain something: "What does this part do?" But understanding isn't required for progress.
Reading Code You Didn't Write
Sometimes you'll want to understand what's happening. Here's how to navigate without getting overwhelmed.
Files match features
Code is usually organized around features:
Views/SettingsView.swift→ the settings screenModels/User.swift→ user dataServices/CalendarService.swift→ calendar-related functionality
If you want to modify the settings screen, look at files with "Settings" in the name.
Ask Claude to explain
- What does the CalendarService file do?
- Walk me through how the data flows when a user taps "Save"
- Why is this component structured this way?
Claude can explain code at whatever level of detail you want.
The goal is navigation, not mastery
You don't need to understand Swift or SwiftUI or whatever framework you're using. You need to know enough to find the right file to talk about, understand roughly what's happening, and describe what you want to change. That's it.
When Things Break
They will. This is normal. Even experienced developers spend significant time debugging.
First move: describe what happened
- I clicked the save button and nothing happened
- The app crashes when I open the settings
- It shows this error: [paste the error]
Error messages look scary, but they're information. Copy the whole thing and show Claude. It'll know what to do.
Don't panic
When something breaks, the instinct is to think "I broke it" or "I can't do this." Resist that. Every bug has a cause. Claude can usually find it. Your job is just to describe what you observed:
- Describe what you did
- Describe what happened (or didn't)
- Share any error messages
When to Trust vs. Push Back
Claude is good, but it's not perfect. Knowing when to trust and when to push back is a skill.
Trust: implementation details
Claude generally makes good choices about how to structure code, what syntax to use, which APIs to call, and technical patterns. Unless you have specific knowledge that contradicts its choice, trust these decisions.
Push back: when results don't match intent
If the result isn't what you wanted, say so:
- That's not what I meant. I wanted [X], not [Y].
- This works technically, but it doesn't feel right. The interaction should be [describe it].
- You added [feature], but I didn't ask for that. Can we keep it simpler?
Push back: over-engineering
Claude sometimes adds complexity you didn't ask for — extra features, abstraction layers, configuration options.
This is more complicated than I need. Can we simplify? I just want [core requirement].
Simpler is usually better, especially when you're learning.
The "Good Enough" Mindset
Shipping beats perfection.
- First version teaches you. You won't know what the second version needs until you use the first. Ship something basic. Use it. Learn what's missing. Then improve.
- You can always improve later. Code isn't permanent. The feature you ship today can be refined tomorrow. Don't let "it could be better" stop you from shipping "it works."
- Design thinking applies. Real feedback beats theoretical perfection. Ship, test with real use, iterate.
Putting It Together
Here's the workflow in practice:
- Start with an outcome — "I want to build [X] that does [Y]"
- Let the conversation develop — answer Claude's questions, add details as they become relevant, don't specify everything upfront
- Work in small increments — one feature at a time, review each change, refine before moving on
- Describe problems, not solutions — "this doesn't feel right" is valid; let Claude propose fixes
- Ship when it works — "good enough" is good enough; improve based on real use
Exercises
- Write a "good first prompt" for an app idea — a clear outcome with no implementation details — and notice the clarifying questions Claude asks back.
- Take a vague piece of feedback like "make it look better" and rewrite it as specific, outcome-focused intent.
- Practice the small-prompt loop: build one tiny feature, review it, then refine it in a second prompt — instead of asking for everything at once.