AnyLearn
All lessons
AIbeginner

AI-aided software development: working with Copilot, Cursor, and Claude Code

What modern AI dev tools actually do, where they sit on a spectrum from inline completion to autonomous agents, and the workflow habits that separate developers who 2x their output from developers who ship subtly broken code.

Not signed in โ€” your progress and quiz score won't be saved.
Lesson progress1 / 8

The four tiers of AI dev tooling

Modern tools fall on a spectrum from least to most autonomous:

  1. Inline completion (GitHub Copilot, Cursor Tab) โ€” suggests the next few lines as you type. You stay in control of every keystroke.
  2. Chat panels (Cursor Chat, ChatGPT, Claude.ai) โ€” you ask, the model answers, you copy-paste.
  3. In-editor agents (Cursor Composer, Cline, Windsurf) โ€” the model edits multiple files in your editor; you review and accept.
  4. Terminal/coding agents (Claude Code, Aider, Codex CLI) โ€” the model can also run commands, install deps, run tests, and iterate.

More autonomy means more leverage but more review burden. The right tier depends on the task, not preference.

Full lesson text

All 8 steps on one page โ€” for reading, reference, and search.

Show

1. The four tiers of AI dev tooling

Modern tools fall on a spectrum from least to most autonomous:

  1. Inline completion (GitHub Copilot, Cursor Tab) โ€” suggests the next few lines as you type. You stay in control of every keystroke.
  2. Chat panels (Cursor Chat, ChatGPT, Claude.ai) โ€” you ask, the model answers, you copy-paste.
  3. In-editor agents (Cursor Composer, Cline, Windsurf) โ€” the model edits multiple files in your editor; you review and accept.
  4. Terminal/coding agents (Claude Code, Aider, Codex CLI) โ€” the model can also run commands, install deps, run tests, and iterate.

More autonomy means more leverage but more review burden. The right tier depends on the task, not preference.

2. Where each tier wins

TierWins onLoses on
InlineBoilerplate, repetitive patterns, type hints, testsCross-file changes, new architectures
ChatConcept questions, code review, debugging helpAnything requiring real codebase context
In-editor agentMulti-file refactors, feature scaffoldingTasks needing real execution (tests, builds)
Coding agentBug hunts, full feature builds, ops-y tasksTasks needing real-time user judgement

A pragmatic stack for most engineers: inline + coding agent. Inline handles "write this obvious function" muscle. Coding agent handles "investigate this failing test and fix it" thinking. The middle tiers are useful but optional.

3. What it's great at

These tasks consistently get a real productivity boost from AI:

  • Boilerplate that's tedious but unambiguous (CRUD endpoints, JSON parsing, type definitions).
  • Test writing โ€” "write tests for this function" is usually better than the tests humans write by hand.
  • Translation between languages, dialects, frameworks (Python โ†’ TypeScript, REST โ†’ GraphQL).
  • Spelunking in unfamiliar codebases โ€” "where is X defined? what calls Y?"
  • Refactors with a clear mechanical pattern (rename, extract function, split a file).
  • Documentation for code that already exists.

The common thread: tasks where the desired behaviour is clear and the code is grunt work.

4. What it gets wrong

Equally predictable failure modes:

  • Inventing APIs: confidently calling methods that don't exist on libraries it has seen.
  • Subtle off-by-one and edge cases: code that looks correct, passes a happy-path test, breaks on empty arrays or unicode.
  • Aggressive refactors: rewrites that work but throw away accidental complexity that was load-bearing.
  • Security regressions: turning safe defaults into unsafe ones without flagging it.
  • Stale knowledge: APIs/syntax from before the model's training cutoff.
  • Over-confidence on architecture: happily proposes a microservices rewrite for a 200-LOC script.

These aren't fixed by switching models. They're consequences of generation without verification โ€” which is why workflow matters more than tool choice.

5. Workflow patterns that compound

Habits that separate the 2x developers from the "my AI gives me bugs" crowd:

  1. Write the test first (or ask the AI to). Then ask the AI to make it pass. The test is the contract.
  2. Constrain the scope. "Modify this one function" beats "refactor this module".
  3. Read the diff. Every line. AI tools make this fast precisely because you're meant to review, not skim.
  4. Plan before implementing on anything non-trivial. "Outline the steps you'd take" โ†’ review โ†’ then "OK, do step 1".
  5. Keep a tight feedback loop: tests run, types check, lint clean before you accept the next change.
  6. Roll back early. If a generation introduces five changes and you only wanted two, reject the whole thing and try again with a tighter prompt.

6. A workflow that actually works

Plan, generate, verify, repeat โ€” not just generate.

flowchart LR
  Goal["Define the task"] --> Plan["Ask AI for a plan"]
  Plan --> Review["Review the plan"]
  Review --> Gen["Generate one step"]
  Gen --> Verify["Run tests / read diff"]
  Verify --> Done["Accept and commit"]
  Verify --> Reject["Reject and re-prompt"]
  Reject --> Gen

7. Context is the lever

AI dev tools succeed or fail mostly on how much relevant context the model has. You can influence this:

  • Open the right files in your editor. Most tools include open tabs in the prompt.
  • Maintain a CLAUDE.md / README.md. Project-level conventions ("we use Tailwind", "prefer async/await over .then") save the model from making up house style.
  • Be specific about constraints. "Use the existing useToast hook" beats letting the model invent its own.
  • Show, don't tell. "Like OrderCard.tsx but for Invoices" gives the model a concrete template.
  • Trim irrelevant context. Pasting a 5000-line file in chat dilutes attention. Quote the function and the type signature; that's usually enough.

More relevant context โ†’ better output. More irrelevant context โ†’ worse output. They're not the same thing.

8. Review obligations don't go away

If you ship AI-generated code without reading it, you've outsourced typing but not thinking. The bugs you didn't notice are still yours.

Practical disciplines:

  • Read every diff before commit. Yes, every one.
  • Run the tests locally; don't rely on CI to catch issues you should have caught.
  • For anything touching auth, payments, or data deletion, demand a second pair of eyes โ€” yours and a colleague's.
  • Treat AI-generated code as "junior contributor" output. Reviewable, sometimes excellent, occasionally embarrassingly wrong.

The productivity gain isn't "the AI does it for you" โ€” it's "the AI does the typing, you do the thinking faster". Skip the thinking part and you just ship faster bugs.

Check your understanding

The lesson ends with a 5-question quiz. Take it in the player above to see your score.

  1. You need to scaffold a new CRUD endpoint with associated tests. Which tier of tool is the best fit?
    • Inline completion only
    • Chat panel with copy-paste
    • An in-editor or coding agent that can touch multiple files
    • No AI; do it by hand for control
  2. Which is the *least* well-suited task for current AI dev tools?
    • Writing unit tests for an existing function
    • Translating a Python function to TypeScript
    • Making a security-critical decision about token storage
    • Renaming a variable consistently across a file
  3. Your AI agent confidently uses `Array.prototype.findLast()` in a Node 14 codebase. What's the underlying issue?
    • The agent is malfunctioning
    • Stale training data or no awareness of your runtime version
    • JavaScript doesn't have a findLast method
    • The agent is testing you
  4. Which habit most reliably improves AI-generated code quality on non-trivial tasks?
    • Always use the latest model
    • Ask the AI to outline a plan first, review the plan, then implement
    • Run more tests after the fact
    • Write longer prompts
  5. When pasting context into an AI dev tool, what's usually the *wrong* move?
    • Including the relevant function and its type signature
    • Mentioning project conventions ("we use Tailwind, async/await")
    • Pasting an entire 5,000-line file when only 50 lines are relevant
    • Pointing to an existing component as a template

Related lessons