Zyski:
- Możliwość skutecznego opisania błędu AI za pomocą komunikatu o błędzie, śledzenia stosu i najmniejszej instancji reprodukcji
- Możliwość prowadzenia systematycznego debugowania za pomocą sztucznej inteligencji w celu znalezienia pierwotnej przyczyny poprzez stawianie hipotez i zawężanie jej krok po kroku
- Możliwość sprawdzenia, czy poprawka sugerowana przez sztuczną inteligencję faktycznie rozwiązała problem poprzez odtwarzanie i testowanie regresji
Debugowanie to zadanie polegające na ustaleniu, dlaczego program zachowuje się inaczej niż oczekiwano, i naprawieniu tego, co pochłania dużo czasu większości inżynierów. Dobre debugowanie nie opiera się na zgadywaniu, ale na systematycznym zawężaniu: wyjaśnij symptom, postaw hipotezę, sprawdź hipotezę, dotrzyj do pierwotnej przyczyny. Sztuczna inteligencja jest bardzo potężnym partnerem w tym cyklu; Ale tylko jeśli podasz mu prawidłowe informacje. Powiedzenie „kod nie działa, napraw to” zmusza sztuczną inteligencję do zgadywania i przedstawiania ogólnych sugestii. Podaj pełny komunikat o błędzie, ślad stosu i najmniejszą próbkę reprodukcji, a razem znajdziesz pierwotną przyczynę.
W tej części zobaczymy, jak skutecznie opisać błąd w sztucznej inteligencji, krok po kroku zawęzić hipotezy i zweryfikować poprzez testy regresyjne, czy proponowana poprawka faktycznie rozwiązuje problem. Pamiętaj: „naprawianie” błędu i „usuwanie objawów błędu” to dwie różne rzeczy; Korekta dokonana bez znalezienia przyczyny przenosi błąd w inne miejsce.
Pojęcia: Ślad stosu: Zrzut pokazujący, które funkcje zostały wywołane w jakiej kolejności w momencie wystąpienia błędu. Minimalne powtórzenie: najprostszy, najkrótszy kod/dane wejściowe, które powodują błąd. Pierwotna przyczyna: Prawdziwe źródło problemu, a nie objaw. Testowanie regresyjne: Testowanie zapewniające, że ten sam błąd się nie powtórzy.
Opisywanie błędu w AI
Prawdopodobieństwo znalezienia pierwotnej przyczyny przez sztuczną inteligencję jest wprost proporcjonalne do jakości podanych informacji. Dobry opis błędu obejmuje: co próbowałeś zrobić, czego się spodziewałeś, co się stało, dokładny tekst błędu i ślad stosu, zaangażowany kod, środowisko (język/wersja/system operacyjny) i najmniejszą próbkę, która spowodowała błąd.
- Wyjaśnij objaw. W formacie „Oczekiwane X, aktualne Y”.
- Wklej pełny tekst błędu i ślad stosu. Nie skracaj, nie cenzuruj, ale nie niszcz struktury.
- Daj najmniejszą reprodukcję. Minimalna ilość danych wejściowych i kod, który powoduje błąd.
- Określ środowisko. Wersja językowa, wersja biblioteki, środowisko uruchomieniowe.
Skuteczny monit z opisem błędu: „Debuguję błąd. Informacje: – Co próbuję zrobić: [X] – Oczekiwane zachowanie: [Y] – Rzeczywiste zachowanie: [Z] – Pełny komunikat o błędzie i ślad stosu: [wklej] – Środowisko: [język/wersja, biblioteka/wersja] – Minimalny wymagany kod: [kod] Nie daj mi bezpośredniej poprawki. Najpierw wypisz 3 najbardziej prawdopodobne przyczyny główne w kolejności prawdopodobieństwa i powiedz mi, jakie kontrole należy sprawdzić w przypadku każdej z nich.
Zawężanie przepływu przez hipotezę
Systematyczne debugowanie to sztuka eliminowania możliwości jedna po drugiej. Użyj sztucznej inteligencji do generowania hipotez i zaprojektuj eksperyment, aby przetestować każdą hipotezę; Następnie uruchom eksperyment i zwróć wynik. Cykl ten jest znacznie szybszy niż zwyczaj dokonywania przypadkowych zmian i zatrzymywania, zwany „debugowaniem shotguna”.
Monit pomocnika wyszukiwania binarnego (bisekcji): „Tego błędu nie było wczoraj, jest dzisiaj. Chcę się dowiedzieć, która z ostatnich 20 zmian spowodowała błąd w bisect. Podaj mi plan krok po kroku: który punkt powinienem przetestować, do której połowy powinienem się udać w zależności od wyniku. Powiedz mi też dokładnie, co mam sprawdzić na każdym kroku.”
Monit dotyczący strategii wstawiania dziennika: „Nie mogę znaleźć błędu, ponieważ nie widzę wartości pośrednich w tej funkcji. Powiedz mi, w których punktach muszę dodać linie dziennika wyświetlające jakie zmienne. Dodaj wyjaśnienie „Czego się dowiem z tego dziennika” dla każdego dziennika. Określ także ostrzeżenia, które uniemożliwią mi rejestrowanie poufnych danych.
Wskazówka: jeśli nie możesz rozwiązać błędu, w większości przypadków problem leży w miejscu, które błędnie założyłeś. Zapytaj sztuczną inteligencję „które moje założenie może być błędne?” Pytanie przełamie twoją ślepotę. Najtrudniejsze błędy kryją się w miejscu, w którym mówisz „Jestem pewien, że to działa dobrze”.
Słaba podpowiedź/silna podpowiedź
SŁABY: „Mój kod zawiera błąd, napraw go: [200 linii kodu]” (Rezultat: sztuczna inteligencja nie wie, jaki to błąd i czego się spodziewać; podaje ogólne sugestie oparte na domysłach, większość z nich jest bezużyteczna.) SILNY: „Otrzymuję wyjątek NullPointerException. Oczekiwane: powinna zostać zwrócona lista użytkowników. Rzeczywisty: Eksploduje przy wywołaniu getUsers(). Ślad stosu: [wklej]. Środowisko: Java 17. Minimum powtórzenie: Dzieje się tak, gdy lista użytkowników jest pusta, ale nie wtedy, gdy jest pełna. Powiązane 15 wierszy: [kod] Wyjaśnij główną przyczynę i powód wyzwolenia pustej listy, a następnie zasugeruj rozwiązanie.
Potężny monit umieszcza błąd w kontekście: w którym przypadku wystąpi (pusta lista), w którym przypadku nie wystąpi (pełna lista). Ta pojedyncza wskazówka („dzieje się, gdy jest pusta”) niemal bezpośrednio wskazuje na pierwotną przyczynę. Ponieważ ta informacja nie jest dostępna w słabym pytaniu, sztuczna inteligencja zgaduje na ślepo.
Weryfikacja poprawki
Poprawka jest prawdziwą poprawką tylko wtedy, gdy zapewnia trzy rzeczy:
kontrola
Pytanie
Jak zweryfikować
Czy błąd zniknął?
Czy teraz działa ten sam wpis?
Uruchom ponownie minimalną reprodukcję
Żadnych nowych błędów?
Czy coś jeszcze jest uszkodzone?
Uruchom cały zestaw testów
Czy to się nie powtórzy?
Czy ten sam błąd pojawi się ponownie?
Dodaj test regresji dla tego scenariusza
Korekty dokonane bez znalezienia pierwotnej przyczyny często tłumią objawy. Na przykład zamaskowanie błędu zerowego za pomocą „pomiń, jeśli null” powoduje, że prawdziwym powodem jest „dlaczego dane przychodzą zerowe?” niewidoczne i błąd pojawia się gdzie indziej.
Mini etui
Przypadek 1 — Pułapka tłumienia objawów. Zespół wycisza okazjonalny błąd zerowy za pomocą try-catch; Błąd znika, ale po 2 tygodniach wydaje się, że brakuje danych. Prawdziwym powodem jest to, że usługa zwraca wartość null po przekroczeniu limitu czasu. Kiedy pytasz sztuczną inteligencję „dlaczego robi się zerowa?”, pojawia się pierwotna przyczyna; Prawdziwa naprawa zajmuje 1 godzinę, ale jest trwała.
Przypadek 2 – Minimalna siła reprodukcji. Programista nie może naprawić błędu, który mówi, że „od czasu do czasu ulega awarii”. Zmniejsza błąd do najmniejszego wejścia zgodnie z sugestią AI: problem występuje tylko w przypadku nazw plików zawierających znaki tureckie (błąd kodowania). Kiedy 300 linii niepewności sprowadzi się do 5 linii ostatecznego odwzorowania, rozwiązanie stanie się oczywiste.
Przypadek 3 — Test antyregresyjny. AI naprawia błąd obliczania daty. Inżynier nie jest z tego zadowolony; dodaje test regresji dla błędnego scenariusza (koniec miesiąca, 31 stycznia + 1 miesiąc). Kiedy 4 miesiące później kolejna zmiana dotknie tego samego obszaru, kolor testu zmieni się na czerwony, a błąd zostanie wykryty, zanim trafi do produkcji.
Typowe błędy
- Oznacza to „to nie działa, napraw to”. Bez tekstu błędu, oczekiwań i reprodukcji sztuczna inteligencja zgaduje.
- Nie podawanie śladu stosu. Ślad stosu często bezpośrednio wskazuje pierwotną przyczynę.
- Kontynuuj wprowadzanie przypadkowych zmian. Eksperymenty bez stawiania hipotez to strata czasu.
- Tłumienie objawów i pomijanie pierwotnej przyczyny. Błąd pojawia się gdzie indziej.
- Brak zabezpieczenia poprawki za pomocą testów regresyjnych. Ten sam błąd powraca po cichu w przyszłości.
Podsumowując
Skuteczne debugowanie to systematyczne zawężanie, a nie zgadywanie. Przekazanie AI pełnego tekstu błędu, śladu stosu, minimalnej reprodukcji i informacji o środowisku wykładniczo zwiększa szanse na znalezienie pierwotnej przyczyny. Użyj sztucznej inteligencji do generowania hipotez i zaprojektuj eksperyment, aby przetestować każdą hipotezę; Przeprowadzasz eksperyment. Uznaj poprawkę za wykonaną tylko wtedy, gdy widzisz, że błąd zniknął, nie pojawiły się żadne nowe błędy i jest ona chroniona przez testy regresyjne.
Zadanie aplikacji
Rozważmy prawdziwy lub sztuczny błąd. Najpierw sprowadź błąd do najmniejszej reprodukcji (na którym wejściu występuje, a na którym nie). Korzystając z podpowiedzi dotyczącego skutecznego przepisu na błąd, poproś sztuczną inteligencję o 3 hipotezy dotyczące głównych przyczyn i etap weryfikacji każdej z nich. Znajdź pierwotną przyczynę, testując hipotezy jedna po drugiej, napraw ją, a następnie napisz i uruchom test regresji dla tego scenariusza, aby wykazać, że błąd zniknął, a test zapewnia ochronę.
lista kontrolna
- [ ] Wyjaśniłem objaw jako „oczekiwany vs zrealizowany”.
- [ ] Podałem AI pełny tekst błędu i ślad stosu.
- [ ] Zmniejszyłem błąd do najmniejszego odwzorowania.
- [ ] Testując hipotezy jedna po drugiej, znalazłem pierwotną przyczynę.
- [ ] Zamiast tłumić objawy, naprawiłem pierwotną przyczynę.
- [ ] Dodałem i przeprowadziłem test regresji pod kątem tego samego błędu.