единица 5 / 12

Отстраняване на грешки и отстраняване на неизправности

Печалби:

  • Възможност за ефективно описание на грешка на AI със съобщение за грешка, проследяване на стека и най-малък екземпляр за възпроизвеждане
  • Възможност за провеждане на систематичен поток за отстраняване на грешки с AI, за да се намери основната причина чрез хипотеза и стесняването й стъпка по стъпка
  • Възможност да се провери дали поправката, предложена от AI, действително е отстранила проблема чрез възпроизвеждане и регресионно тестване

Отстраняването на грешки е задачата да се открие защо дадена програма се държи различно от очакваното и да се поправи, и отнема много време на повечето инженери. Доброто отстраняване на грешки не се основава на игра на отгатване, а на систематично стесняване: изяснете симптома, измислете хипотеза, тествайте хипотезата, стигнете до първопричината. AI е много мощен партньор в този цикъл; Но само ако му дадете правилната информация. Казването „кодът не работи, поправете го“ принуждава AI да отгатва и да прави общи предложения. Дайте му пълното съобщение за грешка, проследяването на стека и най-малката проба за възпроизвеждане и заедно ще откриете първопричината.

В тази част ще видим как ефективно да опишем грешка на AI, да стесним хипотезите стъпка по стъпка и да проверим чрез регресионно тестване, че предложената корекция действително решава проблема. Запомнете: „поправяне“ на грешка и „потискане на симптома на грешка“ са две различни неща; Корекцията, направена без намиране на основната причина, премества грешката на друго място.

Понятия: Проследяване на стека: Дъмп, показващ кои функции са били извикани в какъв ред по време на грешката. Минимално възпроизвеждане: Най-простият, най-кратък код/вход, който задейства грешката. Основна причина: Истинският източник на проблема, а не симптомът. Регресионно тестване: Тестване, което гарантира, че същата грешка няма да се повтори.

Описване на грешка за AI

Вероятността AI да открие първопричината е правопропорционална на качеството на информацията, която предоставяте. Доброто описание на грешката включва: какво сте се опитали да направите, какво сте очаквали, какво се е случило, точния текст на грешката и проследяването на стека, използвания код, средата (език/версия/ОС) и най-малката извадка, довела до грешката.

  1. Изяснете симптома. Във формат „Очаквано X, актуализирано Y“.
  2. Поставете пълния текст на грешката и трасирането на стека. Не го съкращавайте, цензурирайте го, но не нарушавайте структурата.
  3. Дайте най-малката репродукция. Минимален вход и код, който задейства грешката.
  4. Посочете средата. Езикова версия, библиотечна версия, среда за изпълнение.

Подкана за ефективно описание на грешка: „Отстранявам грешка. Информация: - Какво се опитвам да направя: [X] - Очаквано поведение: [Y] - Действително поведение: [Z] - Пълно съобщение за грешка и проследяване на стека: [поставяне] - Околна среда: [език/версия, библиотека/версия] - Включен минимален код: [код] Не ми давайте директна корекция. Първо избройте 3-те най-вероятни първопричини по реда на вероятност и ми кажете каква проверка да проверя за всеки."

Стесняване на потока чрез хипотеза

Систематичното отстраняване на грешки е изкуството да се елиминират възможностите една по една. Използвайте AI за генериране на хипотези и проектирайте експеримента, за да тествате всяка хипотеза; След това стартирайте експеримента и върнете резултата. Този цикъл е много по-бърз от навика за произволни промени и спиране, наречен "отстраняване на грешки с пушка".

Подкана за помощ при двоично търсене (бисекция): „Тази грешка я нямаше вчера, има я днес. Искам да разбера коя от последните 20 промени е довела до грешката с ъглополовяща. Дайте ми план стъпка по стъпка: коя точка трябва да тествам, към коя половина да отида в зависимост от резултата. Кажете ми също какво точно да проверявам на всяка стъпка.“

Подкана за стратегия за вмъкване на журнал: „Не мога да намеря грешката, защото не мога да видя междинните стойности в тази функция. Кажете ми в кои моменти трябва да добавя редове на журнал, които отпечатват кои променливи. Добавете обяснение „какво ще науча от този журнал“ за всеки журнал. Също така посочете предупрежденията, които ще ми попречат да регистрирам поверителни данни.“

Съвет: Ако не можете да разрешите грешка, през повечето време проблемът е някъде, където сте предположили неправилно. Попитайте AI "какво мое предположение може да е грешно?" Питането ще разчупи слепотата ви. Най-тежките грешки се крият там, където казвате „Сигурен съм, че това работи правилно“.

Слаба подкана / Силна подкана

СЛАБО: „Кодът ми дава грешка, поправете я: [200 реда код]“ (Резултат: AI не знае каква е грешката, какво се очаква; дава общи предложения въз основа на предположения, повечето от тях са безполезни.) СИЛНО: „Получавам NullPointerException. Очаква се: потребителският списък трябва да бъде върнат. Действително: Експлодира при повикване към getUsers(). Проследяване на стека: [поставяне].Среда: Java 17. Минимално повторение: Случва се, когато списъкът с потребители е празен, но не и когато е пълен. Свързани 15 реда: [код]. Обяснете основната причина и защо се задейства празен списък, след което предложете поправка."

Мощната подкана поставя грешката в контекст: в кой случай се случва (празен списък), в кой случай не се случва (пълен списък). Тази единствена следа („случва се, когато е празно“) почти директно сочи към основната причина. Тъй като тази информация не е налична в слабата подкана, AI прави сляпо предположение.

Проверка на корекцията

Корекцията е истинска корекция само ако прави три неща:

контрол

Въпрос

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

Грешката изчезна ли?

Същият запис работи ли сега?

Изпълнете отново минимално възпроизвеждане

Няма нови грешки?

Нещо друго счупено ли е?

Изпълнете целия тестов пакет

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

Ще се появи ли отново същата грешка?

Добавете регресионен тест за този сценарий

Корекциите, направени без откриване на първопричината, често потискат симптома. Например, замазването на нулева грешка с "пропускане, ако е нулева" прави истинската причина "защо данните идват нулеви?" невидим и грешката се появява отново на друго място.

Мини калъфи

Случай 1 — Капанът за потискане на симптомите. Екип заглушава случайна нулева грешка с try-catch; Грешката изчезва, но след 2 седмици данните изглежда липсват. Истинската причина е, че услугата връща нула при изчакване. Когато попитате AI "защо става нулев?", първопричината се появява; Истинската корекция отнема 1 час, но е постоянна.

Случай 2 — Минимална възпроизвеждаща мощност. Разработчикът не може да поправи грешка, която казва, че "се срива от време на време." Той намалява грешката до най-малкия вход с предложението на AI: проблемът възниква само с имена на файлове, съдържащи турски знаци (грешка в кодирането). Когато 300 реда несигурност се редуцират до 5 реда окончателно възпроизвеждане, решението става очевидно.

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

Често срещани грешки

  • Това означава "не работи, поправи го". Без текст за грешка, очакване и повторение, AI предполага.
  • Не дава проследяване на стека. Проследяването на стека често директно показва основната причина.
  • Продължете да правите произволни промени. Експериментите без поставяне на хипотеза губят време.
  • Потискане на симптома и пропускане на първопричината. Грешката се преражда другаде.
  • Корекцията не се осигурява с регресионно тестване. Същата грешка се връща безшумно в бъдеще.

В обобщение

Ефективното отстраняване на грешки е систематично стесняване, а не отгатване. Предоставянето на AI на пълния текст на грешката, проследяване на стека, минимално възпроизвеждане и информация за околната среда експоненциално увеличава шансовете за намиране на първопричината. Използвайте AI за генериране на хипотези и проектирайте експеримента, за да тествате всяка хипотеза; Вие провеждате експеримента. Считайте корекцията за „извършена“ само когато видите, че грешката е изчезнала, не са въведени нови грешки и е защитена чрез регресионно тестване.

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

Помислете за истинска или изкуствена грешка. Първо намалете грешката до най-малкото възпроизвеждане (в кой вход се появява, в кой не). Използвайки подканата за ефективна рецепта за грешка, поискайте от AI 3 хипотези за първопричината и стъпка за проверка за всяка. Намерете основната причина, като тествате хипотезите една по една, поправете я, след това напишете и стартирайте регресионен тест за този сценарий, за да покажете, че грешката е изчезнала и тестът осигурява защита.

контролен списък

  • [ ] Изясних симптома като „очаквано срещу реализирано“.
  • [ ] Дадох пълния текст на грешката и трасирането на стека на AI.
  • [ ] Намалих грешката до най-малкото възпроизвеждане.
  • [ ] Като тествах хипотезите една по една, открих първопричината.
  • [ ] Вместо да потискам симптома, поправих първопричината.
  • [] Добавих и проведох регресионен тест за същата грешка.