Чтобы получить от ИИ полезное объяснение кода, скажите, сколько вы уже знаете, попросите объяснение построчно и попросите трассировку: таблицу значений, которые принимает каждая переменная при выполнении кода. Голое «объясни этот код» даёт сводку для воображаемого среднего читателя, которая обычно либо слишком простая, либо слишком быстрая для вас.
Построчно, с трассировкой значений
Обе вкладки спрашивают об одной и той же короткой функции. Сравните, что позволяет проверить каждый ответ.
def running_max(nums):
result = []
best = None
for n in nums:
if best is None or n > best:
best = n
result.append(best)
return result
print(running_max([3, 1, 4, 1, 5]))Эта функция вычисляет скользящий максимум списка. Она проходит по числам, хранит в best наибольшее значение из уже увиденных и на каждом шаге добавляет это значение в result. Проверка best is None обрабатывает первый элемент. Вызов выводит [3, 3, 4, 4, 5].
Функция работает за O(n), так как посещает каждый элемент один раз.
Первый ответ точен, но помогает, только если вы уже знаете, что такое скользящий максимум. К тому же он добавляет замечание о временной сложности, о котором никто не просил: такие добавки появляются, когда модель не знает, кто читает. Второй ответ привязывает каждое предложение к строке, на которую можно показать пальцем, а таблица делает конкретным то, что сводка упоминает мимоходом: result.append(best) выполняется на каждом проходе, включая те, где best не меняется. Поэтому 3 встречается дважды, и это видно во второй строке таблицы, а не выводится из слов «на каждом шаге».
Таблица трассировки заодно проверяет само объяснение. Каждую строку можно сверить, запустив код с print(n, best, result) внутри цикла. Если строка расходится с реальным выводом, объяснение где-то неверно, и теперь вы знаете где.
Объяснение на вашем уровне
Самая полезная строка в промпте для объяснения: что вы уже знаете. Она подсказывает модели, какие строки пропустить, а на каких притормозить. Может помочь и предложение с ролью («Ты репетитор для тех, кто учится программировать первый месяц»), но работает оно через тот же механизм: сообщает модели, кто читатель. Что роль меняет и чего не меняет, разобрано на странице ролевой промптинг.
Этот блок: версия для повторного использования. Поменяйте уровень, непонятную часть или код, и объяснение изменится вместе с ними.
text = "the cat and the hat"
counts = {}
for word in text.split():
counts[word] = counts.get(word, 0) + 1
top = sorted(counts.items(), key=lambda kv: kv[1], reverse=True)[:2]
print(top)Цикл считает каждое слово: в итоге counts равен {'the': 2, 'cat': 1, 'and': 1, 'hat': 1}.
Теперь последние две строки, изнутри наружу:
counts.items()даёт пары('the', 2),('cat', 1),('and', 1),('hat', 1).lambda kv: kv[1]: крошечная функция без имени. Она принимает одну пару и возвращает её второй элемент, счётчик. Для('the', 2)она возвращает2.sorted(..., key=...)сортирует пары по тому, что возвращает эта функция, то есть по счётчику.reverse=Trueставит самое большое первым. Слова с одинаковыми счётчиками сохраняют исходный порядок.[:2]оставляет первые две пары.
Значит, top равен [('the', 2), ('cat', 1)], и именно это выводится.
«Слова с одинаковыми счётчиками сохраняют исходный порядок»: деталь, которую быстрое объяснение пропускает, и именно поэтому второе место достаётся cat, а не and или hat. Сортировка sorted в Python устойчивая, и reverse=True эту устойчивость сохраняет. Вы бы не догадались об этом спросить, а на поверхность это вытащила просьба показать «значение, которое каждый кусочек даёт для этого входа».
Спрашивайте об одной части, а не обо всём файле
Если вставить файл на 500 строк и спросить «что это делает», получится экскурсия по структуре файла. Когда вы застряли на одной функции, вставьте эту функцию и строки, которые её вызывают, и спросите о ней прямо: «Почему эта функция досрочно возвращается, когда список пуст?» или «Что делает yield в строке 12 и что изменилось бы, будь там return?» Узкий вопрос даёт ответ о вашем коде; широкий даёт ответ о коде, похожем на ваш.
С большой незнакомой кодовой базой действуйте наоборот: сначала попросите карту («перечисли основные модули и за что отвечает каждый, по одной строке»), а потом спросите о нужном модуле. Это небольшая цепочка промптов, и каждый шаг держит ответ модели достаточно коротким, чтобы его проверить.
Объяснение через знакомый язык
Код на незнакомом языке читать проще, когда объяснение опирается на язык, который вы знаете. Скажите об этом в промпте: «Я знаю Python. Объясни эту функцию на Go и покажи все места, где она ведёт себя не так, как ожидал бы программист на Python». Недопонимание живёт именно в различиях: целочисленное деление, нулевые значения вместо None, срез, который делит память с массивом, из которого он взят. Обычное объяснение кода на Go правильно описало бы эти строки и ни разу не сказало бы, что ваша интуиция насчёт них ошибается.
Проверьте, что вы поняли
Объяснение, которое вы прочитали и с которым согласились, всё равно может оставить вас неспособным написать этот код самому. Этот разрыв закрывают два промпта:
- Сначала предскажите. До того как запускать код или просить объяснение, запишите, что, по-вашему, он выведет. Затем попросите модель объяснить только те строки, где ваше предсказание оказалось неверным.
- Объясните обратно. Напишите своё объяснение и попросите модель указать всё неверное или упущенное, не переписывая его.
def running_max(nums):
result = []
best = None
for n in nums:
if best is None or n > best:
best = n
result.append(best)
return result
Задай мне 3 вопроса, которые проверят, действительно ли я его понимаю, по одному за раз. Включи один вопрос, где я должен предсказать вывод для нового входа. Жди моего ответа, прежде чем задавать следующий вопрос, и говори, верен ли мой ответ и почему.Вопрос 1 из 3: что вернёт running_max([2, 7, 5, 9])? Сначала посчитайте, а потом запускайте.
Тот же подход работает, когда программа ведёт себя неправильно, но тогда вам нужна причина, а не урок: см. промпты для отладки. Когда код перед вами написал ИИ, построчное объяснение: быстрый способ проверить его, прежде чем оставить; остальные проверки перечислены на странице промпты для написания кода.
Часто задаваемые вопросы
Как попросить ChatGPT или Claude объяснить код?
Вставьте код и скажите три вещи: что вы уже знаете, какая часть вас сбивает с толку и в какой форме нужно объяснение. «Объясни каждую строку одним предложением, а потом покажи таблицу переменных после каждого прохода цикла» даёт гораздо более полезный ответ, чем «объясни этот код».
Что такое таблица трассировки?
Таблица трассировки прослеживает программу во время выполнения: одна строка на шаг (часто на один проход цикла), один столбец на переменную и значение каждой переменной в этот момент. Просьба о ней превращает абстрактное описание в конкретные значения, которые можно сверить с кодом. Это письменная запись того, что показывает отладчик, когда вы идёте по программе шаг за шагом.
Может ли ИИ объяснить код на языке, которого я не знаю?
Да, и это одна из самых полезных просьб. Назовите язык, который вы знаете, и попросите модель сравнить: «Я знаю Python; объясни этот код на Rust и покажи, где он ведёт себя иначе, чем Python». Утверждения о поведении языка проверяйте на небольших примерах, потому что в деталях объяснения бывают уверенно неверными.
Вредно ли для учёбы, когда ИИ объясняет код?
Зависит от того, что вы делаете дальше. Прочитать объяснение и пойти дальше почти ничему не учит. Предсказать вывод до запуска кода, попросить модель устроить вам тест или объяснить код своими словами и спросить, что вы поняли неправильно: всё это заставляет думать вас, а учёба происходит именно там.