Winst:
- Mogelijkheid om een bug effectief aan AI te beschrijven met een foutmelding, stacktracering en de kleinste reproductie-instantie
- Mogelijkheid om een systematische foutopsporingsstroom met AI uit te voeren om de hoofdoorzaak te vinden door deze stap voor stap te hypothetiseren en te verfijnen
- Mogelijkheid om te verifiëren dat de oplossing die de AI voorstelde het probleem daadwerkelijk oploste door reproductie- en regressietests
Debuggen is de taak om erachter te komen waarom een programma zich anders gedraagt dan verwacht en dit op te lossen, en het kost de meeste ingenieurs veel tijd. Goed debuggen is niet gebaseerd op een gokspel, maar op systematische verfijning: verhelder het symptoom, maak een hypothese, test de hypothese, ga naar de hoofdoorzaak. AI is een zeer krachtige partner in deze cyclus; Maar alleen als je hem de juiste informatie geeft. Door te zeggen “code werkt niet, repareer het” dwingt de AI te raden en algemene suggesties te doen. Geef het de volledige foutmelding, de stacktrace en het kleinste reproductiemonster, en samen zul je de hoofdoorzaak vinden.
In dit onderdeel zullen we zien hoe we een bug effectief aan AI kunnen beschrijven, hypothesen stap voor stap kunnen verfijnen en door middel van regressietesten kunnen verifiëren dat de voorgestelde oplossing het probleem daadwerkelijk oplost. Onthoud: het ‘repareren’ van een bug en het ‘onderdrukken van het symptoom van de bug’ zijn twee verschillende dingen; Correctie die wordt uitgevoerd zonder de hoofdoorzaak te vinden, verplaatst de fout naar een andere plaats.
Concepten: Stacktrace: een dump die laat zien welke functies in welke volgorde zijn aangeroepen op het moment van de fout. Minimale repro: de eenvoudigste, kortste code/invoer die de fout activeert. Oorzaak: de werkelijke oorzaak van het probleem, niet het symptoom. Regressietesten: testen die ervoor zorgen dat dezelfde fout zich niet herhaalt.
Een bug voor AI beschrijven
De kans dat AI de oorzaak vindt, is recht evenredig met de kwaliteit van de informatie die u verstrekt. Een goede foutbeschrijving omvat: wat u probeerde te doen, wat u verwachtte, wat er gebeurde, de exacte fouttekst en stacktrace, de betrokken code, de omgeving (taal/versie/besturingssysteem) en het kleinste voorbeeld dat de fout veroorzaakte.
- Verduidelijk het symptoom. In het formaat "Verwacht X, geactualiseerde Y".
- Plak de volledige fouttekst en stacktrace. Kort het niet in, censureer het niet, maar breek de structuur niet.
- Geef de kleinste reproductie. Minimale invoer en code die de fout veroorzaakt.
- Geef de omgeving op. Taalversie, bibliotheekversie, runtime-omgeving.
Effectieve foutbeschrijvingsprompt: "Ik debug een bug. Informatie: - Wat ik probeer te doen: [X] - Verwacht gedrag: [Y] - Werkelijk gedrag: [Z] - Volledige foutmelding en stacktrace: [plakken] - Omgeving: [taal/versie, bibliotheek/versie] - Minimale betrokken code: [code] Geef me geen directe oplossing. Noem eerst de drie meest waarschijnlijke hoofdoorzaken in volgorde van waarschijnlijkheid en vertel me welke controle ik voor elk moet verifiëren."
Vernauwing van de stroom door hypothese
Systematisch debuggen is de kunst van het één voor één elimineren van mogelijkheden. Gebruik AI om hypothesen te genereren en ontwerp het experiment om elke hypothese te testen; Voer vervolgens het experiment uit en retourneer het resultaat. Deze cyclus is veel sneller dan de gewoonte om willekeurige wijzigingen aan te brengen en te stoppen, ook wel "shotgun debugging" genoemd.
Helperprompt voor binair zoeken (disectie): "Deze fout was er gisteren niet, hij is er vandaag. Ik wil weten welke van de laatste 20 wijzigingen de fout met bisect hebben veroorzaakt. Geef me een stappenplan: welk punt moet ik testen, naar welke helft moet ik gaan, afhankelijk van het resultaat. Vertel me ook precies wat ik bij elke stap moet controleren."
Strategieprompt voor log-invoeging: "Ik kan de fout niet vinden omdat ik de tussenliggende waarden in deze functie niet kan zien. Vertel me op welke punten ik logregels moet toevoegen die welke variabelen afdrukken. Voeg een 'wat zal ik van dit log leren'-uitleg toe voor elk log. Geef ook de waarschuwingen op die voorkomen dat ik vertrouwelijke gegevens log."
Tip: Als u een fout niet kunt oplossen, ligt het probleem meestal ergens waar u ten onrechte van uitging. Vraag de AI “welke aanname van mij zou verkeerd kunnen zijn?” Vragen zal je blindheid doorbreken. De moeilijkste fouten schuilen op de plaats waar je zegt: "Ik weet zeker dat dit goed werkt".
Zwakke prompt/sterke prompt
ZWAK: "Mijn code geeft een fout, repareer deze: [200 regels code]" (Resultaat: AI weet niet welke fout het is en wat er wordt verwacht; het geeft algemene suggesties op basis van giswerk, de meeste zijn nutteloos.) STERK: "Ik krijg NullPointerException. Verwacht: gebruikerslijst moet worden geretourneerd. Werkelijk: explodeert bij aanroep van getUsers(). Stack trace: [plakken]. Omgeving: Java 17. Minimale herhaling: het gebeurt wanneer de gebruikerslijst leeg is, maar niet wanneer deze vol is. Gerelateerde 15 regels: [code]. Leg de oorzaak uit en waarom de lege lijst wordt geactiveerd, en stel vervolgens een oplossing voor."
De krachtige prompt plaatst de fout in context: in welk geval het gebeurt (lege lijst), in welk geval het niet gebeurt (volledige lijst). Deze enkele aanwijzing ("gebeurt wanneer leeg") wijst vrijwel direct naar de hoofdoorzaak. Omdat deze informatie niet beschikbaar is in de zwakke prompt, doet AI een blinde gok.
De oplossing verifiëren
Een oplossing is pas een echte oplossing als deze drie dingen doet:
controle
Vraag
Hoe te verifiëren
Is de fout verdwenen?
Werkt dezelfde invoer nu?
Voer opnieuw een minimale repro uit
Geen nieuwe fouten?
Is er nog iets kapot?
Voer de volledige testsuite uit
Zal het zich niet herhalen?
Zal dezelfde fout opnieuw optreden?
Voeg een regressietest toe voor dit scenario
Correcties die worden uitgevoerd zonder de oorzaak te vinden, onderdrukken vaak het symptoom. Als u bijvoorbeeld een nulfout verdoezelt met 'skip if null', ontstaat de echte reden: 'waarom zijn de gegevens nul?' onzichtbaar en de fout treedt elders opnieuw op.
Mini-hoesjes
Geval 1 – De valkuil van symptoomonderdrukking. Een team onderdrukt een occasionele nulfout met een try-catch; De fout verdwijnt, maar na 2 weken lijken de gegevens te ontbreken. De echte reden is dat een service bij een time-out nul retourneert. Als je AI vraagt: "Waarom wordt het nul?", Komt de hoofdoorzaak naar voren; De echte oplossing duurt 1 uur, maar is permanent.
Geval 2 — Minimale reproductiekracht. Een ontwikkelaar kan geen bug repareren die zegt dat hij af en toe crasht. Het reduceert de fout tot de kleinste invoer met de suggestie van AI: het probleem treedt alleen op bij bestandsnamen die Turkse tekens bevatten (coderingsfout). Wanneer 300 regels onzekerheid worden teruggebracht tot 5 regels definitieve reproductie, wordt de oplossing duidelijk.
Geval 3 — Antiregressietest. AI repareert een fout bij het berekenen van de datum. De ingenieur is hier niet tevreden mee; voegt een regressietest toe voor het foutieve scenario (maandeinde, 31 januari + 1 maand). Wanneer vier maanden later een andere wijziging hetzelfde gebied raakt, wordt de test rood en wordt de bug ontdekt voordat deze in productie komt.
Veel voorkomende fouten
- Het betekent "het werkt niet, repareer het". Zonder fouttekst, verwachting en repro, gissingen AI.
- Geeft geen stacktrace weer. De stacktrace geeft vaak direct de hoofdoorzaak aan.
- Blijf willekeurige wijzigingen aanbrengen. Experimenten zonder een hypothese vast te stellen, verspillen tijd.
- Het onderdrukken van het symptoom en het missen van de oorzaak. De fout wordt elders herboren.
- De oplossing niet veiligstellen met regressietesten. Dezelfde fout komt in de toekomst stilletjes terug.
Samengevat
Effectief debuggen is systematische vernauwing, niet gissen. Door de AI de volledige fouttekst, stacktrace, minimale reproductie en omgevingsinformatie te geven, vergroot je de kans op het vinden van de hoofdoorzaak exponentieel. Gebruik AI om hypothesen te genereren en ontwerp het experiment om elke hypothese te testen; Jij voert het experiment uit. Beschouw een oplossing alleen als 'klaar' als je ziet dat de bug verdwenen is, er geen nieuwe bugs zijn geïntroduceerd en deze wordt beschermd door regressietests.
Applicatie taak
Denk aan een echte of kunstmatige fout. Reduceer eerst de fout tot de kleinste reproductie (bij welke invoer het voorkomt, bij welke niet). Vraag de AI met behulp van de effectieve bugreceptprompt om 3 hoofdoorzaakhypothesen en een verificatiestap voor elk. Vind de hoofdoorzaak door de hypothesen één voor één te testen, repareer deze en schrijf en voer vervolgens een regressietest uit voor dit scenario om aan te tonen dat de bug verdwenen is en dat de test bescherming biedt.
controlelijst
- [ ] Ik heb het symptoom verduidelijkt als 'verwacht versus gerealiseerd'.
- [ ] Ik heb de volledige fouttekst en de stacktrace aan de AI gegeven.
- [ ] Ik heb de fout teruggebracht tot de kleinste reproductie.
- [ ] Door de hypothesen één voor één te testen, vond ik de oorzaak.
- [ ] In plaats van het symptoom te onderdrukken, heb ik de oorzaak aangepakt.
- [ ] Ik heb een regressietest toegevoegd en uitgevoerd voor dezelfde fout.