
Translate requirements into observable behavior
Begin by restating who needs what and how success can be observed. Ask questions about unclear states, permissions, empty results, and failure behavior before writing code.
For a request to add a “save for later” button, clarify whether saved items persist across devices, which users can save, and what the interface displays when saving fails.
Explore the repository before editing
Read the project instructions and locate the relevant route, component, data model, and tests. Ask AI to trace the current behavior and name likely files, then verify each claim yourself.
This step matters in frontend work, where an existing design system may determine the right component; in backend work, where authorization and validation boundaries are essential; and in full-stack changes, where data contracts connect both sides.
Break the feature into small tasks
Write a short plan with steps that can be reviewed independently: define the data shape, implement the server behavior, connect the interface, add loading and error states, and cover the behavior in tests.
Ask for alternatives when a step is unclear, but choose a plan that fits the repository rather than adding a new pattern for a small feature.
Implement one slice at a time
Make a small change, read the diff, and run the most relevant check before moving on. If the assistant edits multiple unrelated areas, ask it to explain each change and remove anything that is not needed.
Keep a note of the reason for non-obvious decisions. You should be able to describe the data flow and the behavior you added without relying on the conversation history.
Example: adding a saved-items feature
Suppose a learning dashboard needs a way to bookmark a lesson. First identify the learner identity source, lesson identifier, existing dashboard API, and any access checks. Agree on behavior: a learner can save or remove a bookmark, and only sees their own saved items.
Implement the persistence and authorization path, then expose a small API response. Connect a button with clear saved, saving, and error states. Add checks for an unauthenticated request, a user attempting to access another account’s data, repeated saves, and a missing lesson. Finally verify the interface at narrow widths and confirm existing course access still works.
Validate and review the complete change
Run focused tests first, then the project’s lint, type, and build checks where available. Review the final diff for accidental secrets, debug output, unrelated formatting, missing error states, and changes to permissions.
If a check fails, preserve the exact output and investigate the first relevant failure. Ask AI to explain the output or suggest a diagnostic experiment; do not suppress a failing check without understanding its meaning.
Build understanding as you build features
Use AI explanations to learn concepts, then confirm them through code, documentation, and experiments. Ask what assumptions a solution makes and what would change if those assumptions were false.
A useful workflow leaves you with working code, repeatable validation, and a clearer mental model of the system. For a guided collection of these practices, see the course and its free preview below.
Keep learning
Explore the AI-Powered Developer Productivity course or read the free chapter preview.