Чтобы учиться, когда ИИ пишет код, используйте модель как подсказку и ревьюера, а не как замену попытке. Сначала запишите свой прогноз, запросите один следующий шаг, запустите тесты, объясните каждую строку и на следующий день повторите похожую задачу без готового ответа.
Работа разработчика сдвигается от набора строк к постановке задачи, проверке и исправлению результата. Эти навыки тоже требуют базы. Если ученик не понимает типы, состояние и поток выполнения, он не заметит выдуманный API, лишнюю зависимость или тест, который ничего не проверяет. Полезный AI-режим оставляет усилие там, где формируется модель мышления, и ускоряет рутину вокруг него.
Свой план, пример входа и ожидаемый результат.
Одна подсказка или вопрос, а не полный проект.
Трассировка, тесты и повтор без истории чата.

Как учиться, когда ИИ пишет код: упражнение с тестами
Попросите AI не решать задачу, а придумать граничные случаи. Затем реализуйте функцию самостоятельно. В примере скидка не должна быть отрицательной или превышать цену. Assert превращает размытое «работает» в четыре проверяемых условия. Если тест падает, сначала объясните причину словами и только потом просите подсказку.
def final_price(price: int, discount: int) -> int:
if price < 0 or discount < 0:
raise ValueError("Values must be non-negative")
return max(0, price - discount)
assert final_price(100, 30) == 70
assert final_price(100, 0) == 100
assert final_price(100, 150) == 0
try:
final_price(-1, 0)
except ValueError:
pass
else:
raise AssertionError("Negative price must fail")- Четыре сценария проходят без вывода
- Ученик может объяснить ветки и придумать ещё один тест
Следующий шаг состоит не в усложнении функции, а в восстановлении по памяти. Закройте ответ и напишите похожую shipping_cost с другими правилами. Если структура переносится, знание закрепляется. Если без AI остаётся пустой файл, уменьшите размер подсказки: попросите назвать концепцию, задать вопрос или показать один контрпример вместо полного решения.
Режимы AI по уровню помощи
| Элемент | Что означает | Что делать |
|---|---|---|
| Сократический вопрос | Минимальная помощь | Когда можете продолжить сами |
| Намёк на концепцию | Небольшая помощь | Когда не знаете следующий инструмент |
| Псевдокод | Средняя помощь | Когда понятна идея, но теряется порядок |
| Частичный код | Высокая помощь | Для разбора нового API |
| Полное решение | Максимальная помощь | Только как материал для review и повтора |
Исследования обучения с AI отмечают напряжение между мгновенной помощью и самостоятельной метакогнитивной работой. Практический вывод прост: ученик должен планировать, наблюдать ошибку и оценивать результат. В профессиональной работе GitHub также рекомендует запускать тесты и статический анализ, проверять зависимости, контекст и назначение каждого AI-изменения.

Практика: напишите final_price сами и проверьте себя четырьмя assert
Заведите пустой файл price.py и не открывайте чат первым делом. Сначала запишите свой прогноз, потом сами реализуйте final_price(price, discount), а у модели попросите только список граничных случаев. Успех: python price.py отрабатывает молча, и вы можете вслух объяснить каждую ветку функции.
- Прогноз в комментарии. Первой строкой price.py напишите комментарий: что функция вернёт при discount больше price и что должно случиться при отрицательной цене. С этим предсказанием вы будете сравнивать и свой код, и ответ модели.
- Граничные случаи от модели. Попросите AI не решать задачу, а перечислить граничные случаи для расчёта скидки. Возьмите из ответа только формулировки: скидка больше цены, нулевая скидка, отрицательные значения на входе.
- Своя реализация final_price. Напишите функцию руками: проверка price < 0 or discount < 0 с raise ValueError и возврат max(0, price - discount). Код модели пока не показывайте и не вставляйте.
- Четыре assert и запуск. Добавьте assert на 70, на 100 и на 0, а четвёртой проверкой сделайте блок try, except ValueError, else с raise AssertionError. Запустите python price.py: успех выглядит как полностью пустой вывод.
- shipping_cost по памяти. На следующий день закройте price.py и историю чата и напишите похожую функцию shipping_cost с другими правилами. Если структура переносится, знание закрепилось, а если файл остаётся пустым, уменьшите размер подсказки до одного вопроса.
Теперь сломайте функцию специально. Замените max(0, price - discount) на price - discount и запустите снова: строка assert final_price(100, 150) == 0 упадёт с AssertionError, потому что вернётся -50. Затем уберите проверку на отрицательные значения, и четвёртый сценарий выдаст AssertionError с текстом "Negative price must fail", ведь ValueError больше никто не поднимает. Верните обе строки, убедитесь в пустом выводе и запишите, какое требование фиксировал каждый упавший assert.
Дальше усложняйте требования, а не размер функции: добавьте процентную скидку с округлением и перенесите проверки в pytest с parametrize. Попросите модель сделать review вашего кода и на каждое замечание ответьте, согласны вы или нет и почему. Заведите правило по времени: 15 минут самостоятельно, затем один намёк, и только после решения просите разбор.
Частые ошибки и почему они появляются
Слепое копирование заметно не в момент ответа, а при первой новой ошибке. Другая ловушка состоит в бесконечном диалоге: каждая следующая подсказка уменьшает необходимость удерживать задачу в голове. Третья ошибка: просить AI сгенерировать и код, и тесты, а затем считать их взаимным доказательством без собственного ожидаемого результата.
Даже пять минут прогноза создают вопросы, по которым ответ можно оценить.
Тест фиксирует требование. Исправляйте причину или явно меняйте контракт.
Убедитесь, что пакет существует, поддерживается, совместим по лицензии и действительно нужен.
Самопроверка
Что записать до того, как спрашивать AI?
До запроса запишите три вещи: план решения, пример входа и ожидаемый результат. Тогда ответ модели есть с чем сравнить, и вы заметите выдуманный API или тест, который ничего не проверяет.
Как понять, что знание закрепилось, а не скопировалось?
Перенос знания проверяется повтором: на следующий день решите похожую задачу без истории чата и без открытого прошлого ответа. Если структура функции восстанавливается по памяти, знание ваше, а если файл остаётся пустым, помощи в прошлый раз было слишком много.
Почему тесты, написанные AI, не доказывают правильность кода?
Тесты от AI не являются доказательством, когда модель писала и реализацию, и ожидаемое поведение: одно и то же неверное понимание задачи попадёт в оба места. Задайте хотя бы одно ожидаемое значение вручную, как assert final_price(100, 150) == 0.
Сколько решать самому, прежде чем просить подсказку?
Рабочий лимит на уроке такой: 15 минут самостоятельной попытки, затем один намёк, а не готовое решение. Даже пять минут прогноза дают вопросы, по которым потом можно оценить ответ модели.
Какой уровень помощи выбрать: намёк, псевдокод или готовый код?
Уровень помощи подбирают по месту застревания: сократический вопрос, когда можете продолжить сами, намёк на концепцию, когда не знаете следующий инструмент, псевдокод, когда идея понятна, но теряется порядок. Частичный код берите для разбора нового API, а полное решение только как материал для review и повтора.
Что делать, если AI предлагает удалить падающий тест?
Падающий тест удалять нельзя: он фиксирует требование, а не мешает работе. Исправляйте причину падения или сознательно меняйте контракт функции и переписывайте ожидание руками.
Что делать дальше
На следующем уроке установите лимит: сначала 15 минут самостоятельно, затем только один намёк. После решения напишите три теста и объяснение. Практическую базу удобно строить на курсе GenAI. Формат хорошего запроса возьмите из статьи про промты, а инструмент выбирайте через сравнение альтернатив Cursor.
