Enhet 4 / 12

Kodegjennomgang, refaktorering og teknisk gjeld

Gevinster:

  • Evne til å bruke AI som et andre øye i kodegjennomgang for lesbarhet, logikk og sikkerhet
  • Evne til å planlegge refaktoriseringstrinn med AI-støtte uten å forstyrre kompleks kodeatferd
  • Evne til å verifisere AIs gjennomgang og redigere anbefalinger med testing og sammenligning av versjonskontroll

I programvareteknikk leses kode mye mer enn det er skrevet. En kodelinje skrives én gang, men leses, endres og bygges på dusinvis av ganger i løpet av måneder. Det er derfor kodegjennomgang (gjennomgang av andres eller din egen kode for logikk, lesbarhet og sikkerhet) og refaktorering (forbedring av strukturen til koden uten å endre dens oppførsel) er kjernen i ingeniørkunst. AI blir et kraftig "andre øye" for disse to oppgavene: det foreslår raskt lesbarhet, påpeker oversett logikk og sikkerhetsproblemer, og bryter en stor refaktorisering i mindre trygge trinn. Men det er en kritisk regel: Refaktorering skal ikke endre atferd, og det eneste som garanterer dette er testing.

I denne enheten vil vi se hvordan du bruker AI på en strukturert måte for kodegjennomgang, hvordan du fikser kompleks kode uten å bryte oppførselen, og hvordan du håndterer teknisk gjeld (raske, men kostbare kodebeslutninger).

Konsepter: Teknisk gjeld: Kode beslutninger tatt i dag for hastighet som gjør vedlikehold vanskelig i fremtiden. Kodelukt: Mønstre som ikke er feil i seg selv, men som indikerer problemer (for lange funksjoner, repeterende kode). Regresjon: Når en endring bryter noe som tidligere fungerte.

Bruke AI i strukturert kodegjennomgang

Når tiden er begrenset, er det nødvendig å fokusere på de høyeste risikoproblemene. Den automatiske formateringen håndterer formateringsproblemer som innrykk og mellomrom; Du må vie menneskelig oppmerksomhet til logikk, sikkerhet og adferd med kantsaker. Når du har AI-gjennomgangen, be om en prioritert liste, ikke en ren byge av anmeldelser.

  1. Gi omfanget. Hvilken kode, hva du skal gjøre, i hvilken sammenheng fungerer det.
  2. Spesifiser prioritetsaksen. Nøyaktighet og sikkerhet først, lesbarhet dernest.
  3. Be om konkret retting. "Hvorfor problemet" og "anbefalt løsning" for hvert funn.
  4. Du bekrefter funnene. AI produserer også falske positiver; Verifiser hvert funn mot kode og testing.

Strukturert gjennomgangsprompt: "Undersøk følgende funksjon som en senioringeniør. List opp funnene i rekkefølge etter viktighet og merk dem med disse kodene: [KRITISK] logikk/sikkerhet, [MIDDELS] kantsak/ytelse, [LAV] lesbarhet/navn. For hvert funn: hvorfor spørre, konkrete forslag til rettelser. IKKE HOPPE over formatering/innrykk, det vil håndtere problemer med kodeverktøyet].

Sikkerhetsfokusert gjennomgangsprompt: "Gjennomgå denne koden kun for sikkerhetsformål: mangel på inndatavalidering, risiko for injeksjon, mangel på autorisasjonskontroll, lekkasje av konfidensiell informasjon, usikre standardinnstillinger. Legg til et eksempel på angrepsscenario til hvert funn. Hvis det ikke er noe sikkerhetsproblem, oppgi tydelig "Jeg fant ingen kritiske sikkerhetsproblemer". Kode: [kode]"

Forsiktig: Bare fordi AI sier "ikke noe problem", er ikke et bevis på at det ikke er noe problem. AI kan produsere falske negativer; kan omgå et reelt sikkerhetsproblem. AI-gjennomgang supplerer, ikke erstatter, menneskelig vurdering og sikkerhetstesting. I sikkerhetskritisk kode har den kompetente ingeniøren det siste ordet.

Testbevart Refactoring

Den gylne regelen for refactoring: test først, endre senere. Før du fikser koden, bør det være tester som låser gjeldende atferd slik at du umiddelbart vet om endringen bryter noe. Ikke bryt rekkefølgen når du har AI-refaktorering.

  1. Sett gjeldende oppførsel på prøve. Ellers, få AI til å produsere en "karakteriseringstest" (test som fanger opp gjeldende oppførsel slik den er).
  2. Fiks det i små trinn. Testingen må forbli grønn ved hvert trinn.
  3. Kjør den etter hvert trinn. Fange regresjon tidlig.

Sikker refactoring plan-prompt: "Den følgende 60-linjers funksjonen gjør for mye og er vanskelig å lese. Jeg vil refaktorisere den UTEN å endre oppførselen. Først: liste opp hvilke testtilfeller jeg trenger for å låse ned gjeldende oppførsel. Deretter: del opp refactoring i små trinn, som hver kan utføres mens testene er grønne. Ikke gi planen koden først ennå, kode:"

Svak forespørsel / sterk forespørsel

SVAK: "Gjør denne koden bedre." (Resultat: uklart hva som skal forbedres; AI gjør vilkårlige endringer, kan endre atferd i det stille.) STERK: "Refaktorer denne betalingsberegningsfunksjonen for lesbarhet. BEGRENSNING: atferd må forbli nøyaktig den samme, returverdier må ikke endres. Del opp den lange funksjonen i meningsfulle hjelpefunksjoner, øke de magiske tallene til navngitte konstanter. Listendringer vare for gjenstand og forklar ikke atferd."

Den kraftige oppfordringen sier tydelig at "atferden må forbli nøyaktig den samme" begrensningen og hva som må forbedres. Uten denne begrensningen kan AI endre logikk i navnet "forbedring" og produsere en stille regresjon.

Håndtering av teknisk gjeld

Tilnærming

På kort sikt

i det lange løp

ignorerer gjeld

rask fremgang

Vedlikeholdslammelse, team senker farten

skrive om alt

Utvikling av stående funksjoner

Usikker avkastning, høy risiko

Målt, testbeskyttet refaktorering

mindre nedgang

Bærekraftig hastighet

Den sunneste måten er den tredje: gjør gjelden synlig (spor den i en liste), start der det gjør mest vondt, og testbevis hver løsning. AI er en god hjelp til å identifisere og prioritere gjeldsposter, men hvilken gjeld som skal betales er en forretningsavgjørelse.

Minivesker

Tilfelle 1 - Stille regresjon. En utvikler ber AI om å "forenkle denne funksjonen"; AI oversetter en tilstand feil og returberegningen er ødelagt. Siden det ikke er testing, oppstår feilen etter 3 uker med en kundeklage. Teamet gjør den samme jobben ved først å skrive en karakteriseringstest og fanger opp feilen med en rød test ved første kjøring.

Tilfelle 2 - Nyttig andre øye. I en kodegjennomgang innser AI at brukerautorisasjon bare sjekkes i grensesnittet og ikke på serveren. Dette er et sikkerhetsproblem med uautorisert tilgang. Ingeniør legger til autorisasjonskontroll på serversiden; AI-inspeksjon forhindrer en faktisk sikkerhetshendelse.

Sak 3 — Falsk positiv. AI sier "denne variabelen blir aldri brukt, slett den"; Imidlertid brukes den indirekte gjennom en variabel refleksjonsmekanisme. Hvis teknikeren ikke bekreftet forslaget mot testen, ville det bli slettet og det ville oppstå en kjøretidsfeil. Alle AI-funn må bekreftes før implementering.

Vanlige feil

  • Refaktorering uten testing. Det er ingenting igjen for å sikre at atferden blir bevart.
  • Bruke AI-funn uten å validere dem. Både falske positive og falske negative resultater forekommer.
  • Å kaste bort menneskelig tid på formatproblemer. Å fokusere på oppgaver som kan løses med automatiserte verktøy overskygger de reelle risikoene.
  • Tar svaret "Ingen problem" som en garanti. AI kan omgå sårbarhet; menneskelig vurdering er nødvendig.
  • Prøver å betale ned hele gjelden på en gang. Store omskrivinger er risikable; Trinn som er målt og beskyttet ved testing foretrekkes.

Oppsummert

Kodegjennomgang og refaktorisering bestemmer kodens levetid. AI er en kraftig andre øye- og plangenerator: gir prioriterte funn, sikkerhetsscenarier og småtrinns refactoring-planer. Men refaktorering bør ikke endre atferd, og bare testing garanterer dette. Validere hvert AI-funn mot kode og testing; Ikke ta "ingen problem"-svaret som bevis. Gjør teknisk gjeld synlig og nedbetal den i målte, testbeskyttede trinn.

Søknadsoppgave

Ta en 40-70 linje, noe kompleks funksjon du har (eller har AI generere). Følg først den strukturerte gjennomgangsmeldingen og sorter funnene som [KRITISK]/[MIDDELS]/[LAV]; Kontroller minst ett funn manuelt mot koden. Deretter, med ledeteksten for sikker refaktoreringsplan, genererer og kjører du først karakteriseringstestene, bruker deretter refaktoreringen i små trinn og kontrollerer at testene forblir grønne i hvert trinn.

sjekkliste

  • [ ] Jeg strukturerte anmeldelsen med prioriterte tagger (kritisk/middels/lav).
  • [ ] Jeg har verifisert minst ett AI-funn mot koden/testen.
  • [ ] Jeg testet den nåværende oppførselen før jeg refaktorerte.
  • [ ] Jeg gjorde endringene i små trinn og kjørte tester på hvert trinn.
  • [ ] Jeg spesifiserte "Behavior must be the same"-begrensningen i ledeteksten.
  • [ ] Jeg har bekreftet at sikkerhetsfunn krever menneskelig bekreftelse.