Enhed 5 / 12

Fejlfinding og fejlfinding

Gevinster:

  • Evne til effektivt at beskrive en fejl til AI med fejlmeddelelse, staksporing og mindste reproduktionsforekomst
  • Evne til at køre et systematisk debugging flow med AI for at finde årsagen ved at hypotese og indsnævre den trin for trin
  • Evne til at verificere, at den rettelse, AI foreslog, faktisk løste problemet ved at reproducere og regressionstest

Debugging er opgaven med at finde ud af, hvorfor et program opfører sig anderledes end forventet, og rette op på det, og det bruger meget af de fleste ingeniørers tid. God debugging er ikke baseret på et gættespil, men på systematisk indsnævring: afklar symptomet, angiv hypotesen, test hypotesen, find den grundlæggende årsag. AI er en meget stærk partner i denne cyklus; Men kun hvis du giver ham de rigtige oplysninger. At sige "koden virker ikke, ret den" tvinger AI til at gætte og komme med generelle forslag. Giv den den fulde fejlmeddelelse, staksporet og den mindste reproduktionsprøve, og sammen finder I årsagen.

I denne enhed vil vi se, hvordan man effektivt beskriver en fejl til AI, indsnævrer hypoteser trin for trin og verificerer gennem regressionstest, at den foreslåede rettelse rent faktisk løser problemet. Husk: "at rette" en fejl og "undertrykke symptomet på fejlen" er to forskellige ting; Korrektion foretaget uden at finde hovedårsagen flytter fejlen til et andet sted.

Begreber: Stack trace: Et dump, der viser hvilke funktioner der blev kaldt i hvilken rækkefølge på fejltidspunktet. Minimal repro: Den enkleste, korteste kode/input, der udløser fejlen. Grundårsag: Den egentlige kilde til problemet, ikke symptomet. Regressionstest: Test, der sikrer, at den samme fejl ikke gentager sig.

Beskriver en fejl til AI

Sandsynligheden for, at AI finder årsagen, er direkte proportional med kvaliteten af den information, du giver. En god fejlbeskrivelse inkluderer: hvad du forsøgte at gøre, hvad du forventede, hvad der skete, den nøjagtige fejltekst og staksporing, den involverede kode, miljøet (sprog/version/OS) og den mindste prøve, der producerede fejlen.

  1. Afklar symptomet. I formatet "Forventet X, aktualiseret Y".
  2. Indsæt den fulde fejltekst og staksporing. Forkort det ikke, censurér det, men bryder ikke strukturen.
  3. Giv den mindste gengivelse. Minimum input og kode, der udløser fejlen.
  4. Angiv miljøet. Sprogversion, biblioteksversion, runtime-miljø.

Effektiv fejlbeskrivelsesprompt: "Jeg fejlretter en fejl. Oplysninger:- Hvad jeg prøver at gøre: [X]- Forventet adfærd: [Y]- Faktisk adfærd: [Z]- Fuld fejlmeddelelse og staksporing: [indsæt]- Miljø: [sprog/version, bibliotek/version]- Minimumskode involveret: [kode] Fortæl mig ikke, hvad der er sandsynligt, hvad der sandsynligvis er en direkte 3-rettelse for mig. tjek for at bekræfte for hver."

Indsnævring af flow ved hypotese

Systematisk debugging er kunsten at eliminere muligheder én efter én. Brug AI til at generere hypoteser og design eksperimentet for at teste hver hypotese; Kør derefter eksperimentet og returner resultatet. Denne cyklus er meget hurtigere end vanen med at foretage tilfældige ændringer og stoppe, kaldet "shotgun debugging".

Binær søgning (bisektion) hjælpeprompt: "Denne fejl var der ikke i går, den er der i dag. Jeg vil gerne finde ud af, hvilken af ​​de sidste 20 ændringer, der førte fejlen med bisect. Giv mig en trin-for-trin plan: hvilket punkt skal jeg teste, hvilken halvdel skal jeg gå til afhængigt af resultatet. Fortæl mig også præcis, hvad jeg skal tjekke ved hvert trin."

Logindsættelsesstrategiprompt: "Jeg kan ikke finde fejlen, fordi jeg ikke kan se de mellemliggende værdier i denne funktion. Fortæl mig, på hvilke punkter jeg skal tilføje loglinjer, der udskriver hvilke variabler. Tilføj en 'hvad vil jeg lære af denne log'-forklaring for hver log. Angiv også advarslerne, der forhindrer mig i at logge fortrolige data."

Tip: Hvis du ikke kan løse en fejl, er problemet for det meste et sted, du antog forkert. Spørg AI'en "hvilken min antagelse kan være forkert?" At spørge vil bryde din blindhed. De hårdeste fejl gemmer sig på det sted, hvor du siger "Jeg er sikker på, at det her fungerer rigtigt".

Svag prompt / stærk prompt

SVAG:"Min kode giver en fejl, ret den: [200 linjer kode]"(Resultat: AI ved ikke, hvilken fejl det er, hvad der forventes; den giver generelle forslag baseret på gætværk, de fleste af dem er ubrugelige.)STERK:"Jeg får NullPointerException. Forventet: brugerlisten skal returneres. Faktisk: Eksploderer ved opkald til getUsers:(7). gentagelse: Det sker, når brugerlisten er tom, men ikke når den er fuld. Relateret 15 linjer: [kode] Forklar årsagen, og hvorfor den tomme liste udløses, og foreslå en rettelse.

Den kraftige prompt sætter fejlen i kontekst: i så fald sker den (tom liste), i hvilket tilfælde den ikke sker (fuld liste). Denne enkelte ledetråd ("skeder, når den er tom") peger næsten direkte på årsagen. Da denne information ikke er tilgængelig i den svage prompt, laver AI et blindt gæt.

Bekræftelse af rettelsen

En rettelse er kun en reel rettelse, hvis den gør tre ting:

kontrol

Spørgsmål

Sådan verificeres

Er fejlen væk?

Virker den samme post nu?

Kør minimal repro igen

Ingen nye fejl?

Er der ellers gået i stykker?

Kør hele testpakken

Vil det ikke gentage sig?

Vil den samme fejl opstå igen?

Tilføj regressionstest til dette scenarie

Korrektioner foretaget uden at finde årsagen undertrykker ofte symptomet. F.eks. overskydning af en nul-fejl med "spring over, hvis null" gør den egentlige grund, "hvorfor kommer dataene null?" usynlig, og fejlen opstår igen andre steder.

Mini sager

Case 1 - Symptomundertrykkelsesfælden. Et hold dæmper en lejlighedsvis nul-fejl med en try-catch; Fejlen forsvinder, men efter 2 uger ser dataene ud til at mangle. Den egentlige årsag er, at en tjeneste returnerer null ved timeout. Når du spørger AI "hvorfor bliver den nul?", dukker den grundlæggende årsag frem; Den rigtige løsning tager 1 time, men er permanent.

Tilfælde 2 — Minimal reprokraft. En udvikler kan ikke rette en fejl, der siger "den går ned en gang imellem." Det reducerer fejlen til det mindste input med AI's forslag: problemet opstår kun med filnavne, der indeholder tyrkiske tegn (kodningsfejl). Når 300 linjers usikkerhed reduceres til 5 linjers definitiv repro, bliver løsningen indlysende.

Case 3 - Anti-regressionstest. AI retter en datoberegningsfejl. Ingeniøren er ikke tilfreds med dette; tilføjer en regressionstest for det fejlagtige scenarie (månedsafslutning, 31. januar + 1 måned). Når en anden ændring berører det samme område 4 måneder senere, bliver testen rød, og fejlen fanges, før den når produktionen.

Almindelige fejl

  • Det betyder "det virker ikke, fix det". Uden fejltekst, forventning og repro, gætter AI.
  • Giver ikke stakken spor. Staksporet angiver ofte direkte årsagen.
  • Bliv ved med at foretage tilfældige ændringer. Eksperimenter uden at etablere en hypotese spilder tid.
  • Undertrykke symptomet og gå glip af den grundlæggende årsag. Fejlen er genfødt et andet sted.
  • Sikrer ikke rettelsen med regressionstest. Den samme fejl kommer stille tilbage i fremtiden.

Sammenfattende

Effektiv debugging er systematisk indsnævring, ikke gæt. At give AI den fulde fejltekst, staksporing, minimal reproduktion og miljøinformation øger eksponentielt chancerne for at finde årsagen. Brug AI til at generere hypoteser og design eksperimentet for at teste hver hypotese; Du kører eksperimentet. Overvej først en rettelse "færdig", når du ser, at fejlen er væk, ingen nye fejl introduceres, og den er beskyttet af regressionstest.

Ansøgningsopgave

Overvej en reel eller kunstig fejl. Reducer først fejlen til den mindste gengivelse (i hvilken input den forekommer, i hvilken den ikke sker). Brug den effektive fejlopskriftsprompt, spørg AI om 3 grundårsagshypoteser og et verifikationstrin for hver. Find grundårsagen ved at teste hypoteserne én efter én, ret den, skriv og kør derefter en regressionstest for dette scenarie for at vise, at fejlen er væk, og testen giver beskyttelse.

tjekliste

  • [ ] Jeg præciserede symptomet som "forventet vs realiseret".
  • [ ] Jeg gav den fulde fejltekst og staksporing til AI.
  • [ ] Jeg reducerede fejlen til den mindste gengivelse.
  • [ ] Ved at teste hypoteserne én efter én fandt jeg årsagen.
  • [ ] I stedet for at undertrykke symptomet fik jeg løst årsagen.
  • [ ] Jeg tilføjede og kørte en regressionstest for den samme fejl.