раздел 03 · подстраница 5

Первая реальная задача

Хватит теории. Делаем сквозной сценарий "от нуля до пофикшенного бага за 10 минут". Цель - почувствовать, как Claude Code читает файлы, правит, запускает тесты, проверяет результат.

Что будем делать

Создадим Python-скрипт с классическим off-by-one багом в функции sum_range. Попросим Claude найти ошибку, починить, написать тесты и убедиться, что тесты проходят.

Никаких внешних зависимостей - только Python 3 и Claude Code.

Шаг 1 - подготовка папки (1 минута)

В терминале:

mkdir ~/claude-first-task && cd ~/claude-first-task

Создаём файл math_utils.py с багом:

# math_utils.py
def sum_range(start, end):
    """Сумма всех целых чисел от start до end ВКЛЮЧИТЕЛЬНО."""
    total = 0
    for i in range(start, end):  # bug: должно быть end + 1
        total += i
    return total


if __name__ == "__main__":
    # ожидаем 15 (1+2+3+4+5), а получим 10 (1+2+3+4)
    print(sum_range(1, 5))

Запустим - убедимся, что баг проявляется:

python3 math_utils.py
# 10   ← а должно быть 15

Шаг 2 - запускаем Claude (1 минута)

claude

Если это первый запуск в этой папке - сделаем /init:

> /init

Claude посмотрит на содержимое (один файл math_utils.py) и создаст короткий CLAUDE.md. Хорошая привычка - в новой папке всегда начинать с /init.

Шаг 3 - формулируем задачу (1 минута)

Переключимся в plan-режим, чтобы Claude сначала рассказал план, а не сразу полез править:

Shift+Tab до состояния [mode: plan].

Теперь промпт:

> в @math_utils.py есть баг: sum_range(1, 5) возвращает 10,
  а должно 15 (сумма 1..5 включительно). Найди причину,
  предложи фикс, потом покрой функцию pytest-тестами:
  обычные случаи, граничные (start == end), отрицательные числа.

Шаг 4 - читаем план (2 минуты)

Claude прочитает файл и выдаст что-то вроде:

План:
1. Прочитать math_utils.py - подтвердить наличие бага в range().
2. Заменить range(start, end) на range(start, end + 1).
3. Создать tests/test_math_utils.py с pytest-тестами:
   - test_basic_sum: sum_range(1, 5) == 15
   - test_single: sum_range(7, 7) == 7
   - test_negative: sum_range(-3, 3) == 0
4. Запустить pytest, убедиться что всё зелёное.

Approve plan? [y/n]

Если план выглядит разумно - y. Если что-то не нравится - можно ответить "добавь ещё тест на start > end - функция должна возвращать 0" и Claude дополнит план.

Шаг 5 - наблюдаем за работой (3 минуты)

После approve Claude автоматически выйдет из plan-режима и начнёт исполнять. В терминале будут появляться tool-calls:

● Read(math_utils.py)
● Edit(math_utils.py)
   - for i in range(start, end):
   + for i in range(start, end + 1):
● Bash(mkdir -p tests)   [y/n]?
> y
● Write(tests/test_math_utils.py)
● Bash(pip install pytest)   [y/n]?
> y
● Bash(python3 -m pytest tests/ -v)
   ===== 3 passed in 0.04s =====

Если вы в accept-edits - подтверждения на Edit не будет, только на Bash. Поведение режимов разобрано в отдельной главе.

Шаг 6 - проверяем результат (2 минуты)

Сначала глазами:

cat math_utils.py
cat tests/test_math_utils.py

Убеждаемся, что range(start, end + 1) встал, тесты осмысленные. Запускаем сами, не доверяя Claude на слово:

python3 math_utils.py        # должно быть 15
python3 -m pytest tests/ -v  # все тесты должны быть green

Если что-то не так - возвращаемся в Claude и говорим прямо:

> тест test_negative падает: sum_range(-3, 3) даёт 0, но pytest ожидает -3+...+3 = 0, всё ок.
  но мне нужен ещё кейс на start > end, добавь.

Claude дополнит тесты, перезапустит pytest.

Шаг 7 - финальная проверка через /verify

Это необязательно для такой простой задачи, но полезно как привычка:

> /verify

Claude ещё раз запустит код и тесты "глазами свежего агента", чтобы убедиться, что всё реально работает, а не только в его голове.

Что вы только что увидели

За 10 минут вы:

  • Создали проект с нуля.
  • Прошли через /init, Shift+Tab (plan-режим), @file упоминание.
  • Получили план до правок, одобрили его.
  • Увидели как Claude читает, правит, создаёт файлы, ставит зависимости, гоняет тесты.
  • Проверили результат руками.
  • Закрыли цикл через /verify.

Это базовый workflow для любой задачи сложнее однострочника. Дальше курса - просто масштабирование того же цикла.

Антипаттерны

  • Пропустить /init. Без него Claude каждый раз заново открывает проект.
  • Не использовать plan-режим на новой задаче. План занимает минуту и спасает от 10 минут переделок.
  • Не запускать код руками после Claude. Модель уверенно скажет "тесты прошли", даже если pytest не установлен. Доверяй, но проверяй.

Полезные ссылки

  • pytest docs - быстрый старт по pytest
  • Quickstart - официальный quickstart Claude Code
  • Plan mode - подробнее про plan-режим