Единица 5 / 12

Отладка и устранение неполадок

Прибыль:

  • Способность эффективно описывать ошибку ИИ с помощью сообщения об ошибке, трассировки стека и наименьшего экземпляра воспроизведения.
  • Возможность запускать систематический процесс отладки с помощью ИИ, чтобы найти основную причину, выдвигая гипотезы и шаг за шагом сужая ее.
  • Возможность проверить, что исправление, предложенное ИИ, действительно устранило проблему, путем воспроизведения и регрессионного тестирования.

Отладка — это задача выяснения, почему программа ведет себя не так, как ожидалось, и ее исправления, и она отнимает много времени у большинства инженеров. Хорошая отладка основана не на игре в угадайку, а на систематическом сужении круга вопросов: уточнить симптом, выдвинуть гипотезу, проверить гипотезу, добраться до основной причины. ИИ — очень мощный партнер в этом цикле; Но только если вы дадите ему правильную информацию. Слова «код не работает, исправьте его» заставляют ИИ догадываться и делать общие предложения. Предоставьте ему полное сообщение об ошибке, трассировку стека и наименьший образец воспроизведения, и вместе вы найдете основную причину.

В этом модуле мы увидим, как эффективно описать ошибку ИИ, шаг за шагом сузить гипотезы и проверить с помощью регрессионного тестирования, что предлагаемое исправление действительно решает проблему. Помните: «исправление» ошибки и «подавление симптомов ошибки» — это две разные вещи; Исправление, произведенное без обнаружения основной причины, перемещает ошибку в другое место.

Основные понятия: Трассировка стека: дамп, показывающий, какие функции в каком порядке вызывались во время ошибки. Минимальное воспроизведение: самый простой и кратчайший код/ввод, который вызывает ошибку. Основная причина: настоящий источник проблемы, а не симптом. Регрессионное тестирование: тестирование, гарантирующее, что одна и та же ошибка не повторится.

Описание ошибки для ИИ

Вероятность того, что ИИ обнаружит первопричину, прямо пропорциональна качеству предоставляемой вами информации. Хорошее описание ошибки включает в себя: что вы пытались сделать, чего ожидали, что произошло, точный текст ошибки и трассировку стека, задействованный код, среду (язык/версию/ОС) и наименьший образец, вызвавший ошибку.

  1. Уточните симптом. В формате «Ожидал X, осуществился Y».
  2. Вставьте полный текст ошибки и трассировку стека. Не сокращайте, не подвергайте цензуре, но и не нарушайте структуру.
  3. Дайте самую маленькую репродукцию. Минимальный ввод и код, который вызывает ошибку.
  4. Укажите среду. Языковая версия, версия библиотеки, среда выполнения.

Эффективное описание ошибки: «Я отлаживаю ошибку. Информация: — Что я пытаюсь сделать: [X] — Ожидаемое поведение: [Y] — Фактическое поведение: [Z] — Полное сообщение об ошибке и трассировка стека: [вставить] — Среда: [язык/версия, библиотека/версия] — Минимальный задействованный код: [код] Не давайте мне прямого исправления. Сначала перечислите 3 наиболее вероятные основные причины в порядке вероятности и скажите мне, какую проверку следует проверить для каждой».

Сужение потока по гипотезе

Систематическая отладка — это искусство исключения возможностей одну за другой. Используйте ИИ для генерации гипотез и разработки эксперимента для проверки каждой гипотезы; Затем запустите эксперимент и верните результат. Этот цикл намного быстрее, чем привычка вносить случайные изменения и останавливаться, называемая «отладкой дробовика».

Подсказка помощника бинарного поиска (бисекции): "Эта ошибка не была вчера, она есть сегодня. Я хочу узнать, какое из последних 20 изменений привело к ошибке с биссектрисой. Дайте мне пошаговый план: какую точку мне следует проверить, к какой половине перейти в зависимости от результата. Также скажите мне, что именно проверять на каждом шаге".

Подсказка стратегии вставки журнала: «Я не могу найти ошибку, потому что не вижу промежуточных значений в этой функции. Скажите мне, в каких точках мне нужно добавить строки журнала, которые печатают какие переменные. Добавьте объяснение «что я узнаю из этого журнала» для каждого журнала. Также укажите предупреждения, которые не позволят мне регистрировать конфиденциальные данные».

Совет: Если вы не можете устранить ошибку, в большинстве случаев проблема кроется в том, что вы неправильно предположили. Спросите ИИ «какое мое предположение может быть неверным?» Просьба сломает вашу слепоту. Самые серьезные ошибки таятся там, где вы говорите: «Я уверен, что все работает правильно».

Слабая подсказка/Сильная подсказка

СЛАБЫЙ: «Мой код выдает ошибку, исправьте ее: [200 строк кода]» (Результат: ИИ не знает, что это за ошибка и что ожидается; он дает общие предложения, основанные на догадках, большинство из них бесполезны.) СИЛЬНЫЙ: «Я получаю исключение NullPointerException. Ожидается: должен быть возвращен список пользователей. Фактический: взрывается при вызове getUsers(). Трассировка стека: [вставить]. Среда: Java 17. Минимальное повторение: это происходит когда список пользователей пуст, но не когда он полон. Связанные 15 строк: [код]. Объясните основную причину и почему срабатывает пустой список, а затем предложите исправление».

Мощная подсказка помещает ошибку в контекст: в каком случае она произойдет (пустой список), в каком случае она не произойдет (полный список). Эта единственная подсказка («происходит, когда пусто») почти напрямую указывает на основную причину. Поскольку эта информация недоступна в слабом приглашении, ИИ делает слепое предположение.

Проверка исправления

Исправление является настоящим исправлением только в том случае, если оно выполняет три функции:

контроль

Вопрос

Как проверить

Ошибка исчезла?

Сейчас та же запись работает?

Снова запустите минимальное воспроизведение

Нет новых ошибок?

Что-нибудь еще сломано?

Запустите весь набор тестов

Не повторится ли?

Повторится ли та же ошибка снова?

Добавьте регрессионный тест для этого сценария.

Исправления, сделанные без выявления основной причины, часто подавляют симптом. Например, если замаскировать нулевую ошибку с помощью «пропустить, если ноль» становится реальной причиной, «почему данные становятся нулевыми?» невидим, и ошибка повторяется в другом месте.

Мини-кейсы

Случай 1. Ловушка подавления симптомов. Команда подавляет случайную нулевую ошибку с помощью try-catch; Ошибка исчезает, но через 2 недели данные отсутствуют. Настоящая причина в том, что служба возвращает ноль по тайм-ауту. Когда вы спрашиваете ИИ: «Почему он становится нулевым?», выявляется основная причина; Настоящее исправление занимает 1 час, но является постоянным.

Случай 2 — Минимальная воспроизводящая способность. Разработчик не может исправить ошибку, которая говорит: «время от времени происходит сбой». По предложению ИИ это уменьшает ошибку до минимального ввода: проблема возникает только с именами файлов, содержащими турецкие символы (ошибка кодировки). Когда 300 строк неопределенности сокращаются до 5 строк точного воспроизведения, решение становится очевидным.

Случай 3 — Антирегрессионный тест. ИИ исправляет ошибку расчета даты. Инженера это не устраивает; добавляет регрессионный тест для ошибочного сценария (конец месяца, 31 января + 1 месяц). Когда через 4 месяца другое изменение затрагивает ту же область, тест становится красным, и ошибка обнаруживается до того, как она достигнет рабочей среды.

Распространенные ошибки

  • Это значит «не работает, исправьте». Без текста ошибки, ожидания и воспроизведения, догадывается ИИ.
  • Не давать трассировку стека. Трассировка стека часто прямо указывает на основную причину.
  • Продолжайте вносить случайные изменения. Эксперименты без установления гипотезы напрасно тратят время.
  • Подавление симптома и упущение первопричины. Ошибка возрождается в другом месте.
  • Не обеспечить исправление с помощью регрессионного тестирования. Та же ошибка возвращается молча в будущем.

В итоге

Эффективная отладка — это систематическое сужение, а не догадки. Предоставление ИИ полного текста ошибки, трассировки стека, минимального воспроизведения и информации об окружающей среде экспоненциально увеличивает шансы найти первопричину. Используйте ИИ для генерации гипотез и разработки эксперимента для проверки каждой гипотезы; Вы проводите эксперимент. Считайте исправление «готовым» только тогда, когда вы увидите, что ошибка исчезла, новые ошибки не появились и оно защищено регрессионным тестированием.

Задача приложения

Рассмотрим реальную или искусственную ошибку. Сначала сведите ошибку к наименьшему воспроизведению (на каком входе она возникает, на каком нет). Используя подсказку эффективного рецепта ошибки, попросите ИИ предоставить 3 гипотезы об основной причине и этап проверки для каждой. Найдите основную причину, проверив гипотезы одну за другой, исправьте ее, затем напишите и запустите регрессионный тест для этого сценария, чтобы показать, что ошибка устранена и тест обеспечивает защиту.

контрольный список

  • [ ] Я уточнил симптом как «ожидаемый или реализованный».
  • [ ] Я передал ИИ полный текст ошибки и трассировку стека.
  • [ ] Я свел ошибку к минимальному воспроизведению.
  • [ ] Проверяя гипотезы одну за другой, я нашел основную причину.
  • [ ] Вместо подавления симптома я устранил первопричину.
  • [ ] Я добавил и запустил регрессионный тест на ту же ошибку.