Иллюзия готового кода
почему «работает» не значит «правильно»
Что это
Код от ИИ выглядит законченным. Ровные отступы, осмысленные имена, аннотации типов, аккуратные комментарии. Он выглядит как код, который кто-то продумал.
Это ощущение обманчиво, и обманчиво оно по трём причинам. Разобрать их стоит в начале книги, потому что дальше вся работа строится на том, чтобы им не поддаваться.
Три иллюзии
Иллюзия первая: выглядит аккуратно
Опрятность кода ничего не говорит о его правильности. Человек, который пишет небрежно, обычно пишет небрежно везде, и по виду кода можно было что-то предположить. У ИИ этой связи нет: он одинаково аккуратно оформляет и верное решение, и неверное.
Более того, аккуратность работает против тебя — она усыпляет. Код с кривыми отступами читают внимательно; код, который выглядит как из учебника, пролистывают.
Иллюзия вторая: запустилось
Запуск проверяет ровно один случай — тот, который ты запустил. Обычно это удачный путь: город нашёлся, данные пришли, пользователь ввёл что ожидалось.
temp = data.get("main", {}).get("temp", 0)Эта строка запустится всегда. На корректных данных она даёт верный ответ, на ошибке сервера — «Сейчас 0 градусов». Программа работает. Программа врёт.
Именно поэтому в книге столько внимания уделяется неудачным случаям: пустым данным, обрывам сети, мусору на входе. Там живут ошибки, которые запуск не находит.
Иллюзия третья: ИИ уверен
Тон ответа не зависит от того, насколько ИИ прав (статья 1.3). Он не говорит «я не уверен», не ставит оговорок и не выделяет места, где угадывал. Объяснение несуществующего метода звучит так же убедительно, как описание того, который он знает назубок.
Что вместо
Книга предлагает заменить ощущение «вроде нормально» на четыре конкретных вопроса. Это те же вопросы, что в статье 2.1, и они закрывают все три иллюзии:
- Что эта функция принимает и что возвращает?
- Меняет ли она что-то снаружи себя?
- Что будет, если данные придут не те?
- Где она вызывается?
Третий вопрос — противоядие от второй иллюзии. Он заставляет подумать о случаях, которые ты не запускал.
Как сказать ИИ
Иллюзию уверенности пробивает прямой вопрос:
Назови три места в этом коде, где он сломается
при неожиданных данных. Если таких мест нет — объясни,
почему их нет.Иллюзию запуска — вопрос о непроверенном:
Я запустил и получил верный ответ. Какие случаи
мой запуск не проверил?А иллюзию аккуратности — просьба показать компромиссы:
Какие решения в этом коде спорные? Что ты выбрал
не задумываясь, потому что так принято?Последний вопрос часто вытаскивает самое интересное: решения, которые ИИ принял по привычке, а не потому, что они подходят твоему случаю.
На что смотреть
Ты принял код, не задав ни одного вопроса. Нормальная работа — это несколько уточнений на каждую нетривиальную правку.
Проверка свелась к запуску. Запустил, ответ верный, принял. Так проверяется один сценарий из десяти.
Комментарии вместо кода. # TODO: обработать пустой список — это дыра,
оформленная так, будто о ней подумали (статья 2.14).
Ощущение, что всё слишком гладко. Если задача была нетривиальной, а решение пришло без единой оговорки и без вопросов, — скорее всего, часть сложности просто не замечена.
Шпаргалка
Аккуратное оформление не говорит о правильности и усыпляет внимание.
Запуск проверяет один случай — обычно удачный.
Уверенный тон не зависит от того, прав ли ИИ.
Вместо ощущения — четыре вопроса: принимает · возвращает · меняет · где вызывается.
Спроси: «какие случаи мой запуск не проверил?»
Слишком гладко на сложной задаче — сложность не замечена.