Enhet 8 / 12

Refaktorering og teknisk gjeldsforvaltning

Gevinster:

  • Evne til å sette opp et testsikkerhetsnett som fanger opp gjeldende oppførsel før refaktorisering
  • Evne til å be AI om små, ett-trinns, atferdsbevarende transformasjoner og validere hvert trinn
  • Evne til å identifisere og prioritere teknisk gjeld innenfor forretningssammenheng

Refaktorering er å forbedre den interne strukturen til en kode uten å endre dens eksterne oppførsel: å gjøre den mer lesbar, enklere, mer vedlikeholdbar. Teknisk gjeld, på den annen side, er et designkompromiss gjort for en rask løsnings skyld og betalt tilbake "med renter" over tid - hvert hjørne du klipper i dag vil komme tilbake som en nedgang eller feil i morgen. Kunstig intelligens er en kraftig assistent som øker hastigheten på repeterende og mekaniske refaktoreringsoppgaver; Men det er én gylden regel for refactoring, og AI alene kan ikke garantere det: atferd må ikke endres.

I denne enheten lærer vi hvordan du gjør sikker refactoring med AI: små og reversible trinn, beskyttelse med tester, oppdage kodelukter og prioritering av teknisk gjeld. Det kritiske punktet er dette: det er beståtte tester, ikke AIs ord, som beviser at oppførselen er bevart.

Den gyldne regel for refaktorering: Atferd forblir konstant

Det som gjør refaktorering farlig er å ubevisst endre atferd mens du sier «jeg forbedrer meg». Å slippe en kantsak når du forenkler en betingelse, bryte rekkefølgen når du transformerer en sløyfe, mangler en bieffekt når du deler en funksjon – alt produserer "rent utseende", men ødelagt kode.

Derfor er testing en forutsetning for refactoring: før du endrer, må du ha tester som fanger opp eksisterende atferd. Disse testene er et "sikkerhetsnett"; Hvis du ved et uhell bryter noe under refaktorisering, vil de gå i stykker og advare deg. Hvis du ikke har tester, skriv tester som fikser eksisterende atferd først (som vi lærte i enhet 5) - det er her AI får en hurtigstart.

Forsiktig: AI-assistert refactoring uten et testnett er en av de mest lumske kildene til feil. Det er lett å si «jeg bevarte oppførselen»; Beviset er at de samme testene består før og etter endringen.

Trinn for trinn: Sikker Refactoring Flow

  1. Sett opp sikkerhetsnettet. La det være tester som fanger opp den nåværende oppførselen til koden du skal refaktorisere; Hvis ikke, skriv dem ned først (og se dem gå gjennom).
  2. Gi navn til lukten. Hva forbedrer du og hvorfor? "Denne funksjonen gjør 3 ting", "den samme logikken gjentas på 4 steder", "navn er misvisende".
  3. Be om små ett-trinns trinn. Be AI om en enkelt transformasjon (f.eks. "del denne funksjonen i to"), for ikke å omskrive hele filen.
  4. Kjør testene. Etter hvert trinn. Hvis den er grønn, fortsett, hvis den er rød, ta den tilbake.
  5. Les Diff. Bekreft linje for linje at endringen faktisk er atferdsbevarende; Det kan være en logikkglidning når man sier AI er "bare struktur".
  6. Kombiner til små biter. Store engangsrefaktorerende PR-er er både risikable og ikke kan gjennomgås.

Tre minivesker

Veske 1 — 220-linjers funksjon trygt delt. Ett team hadde en 220-linjers ordrebehandlingsfunksjon. De første 14 testene ble skrevet (ved hjelp av AI) som fanget opp den nåværende oppførselen, alle besto. Deretter ble funksjonen delt inn i 5 mindre funksjoner trinn for trinn av AI; Tester ble kjørt etter hvert trinn. To tester ble brutt i ett trinn - AI hadde bommet på returen i en kantkasse. Tester fanget dette umiddelbart og fikset det. Uten nettverket kunne feilen gått helt til produksjon.

Tilfelle 2 – Katastrofe uten testnett. En annen utvikler "ryddet opp" i en datoberegningsmodul som ikke hadde noen tester med AI. Koden så bedre ut, men den beregnet skuddåret feil; Feilen kom ut to uker senere med en kundeklage. Tapet veide langt opp for tiden spart fra refaktorisering. Leksjon: Refaktorering uten testing er et gamble.

Sak 3 — Teknisk gjeldsprioritering. Ett lag ga AI-en et etterslep på omtrent 30 "forbedre" poeng og fikk hver av dem scoret på en "endringsfrekvens × risiko × innsats"-akse. I den resulterende tabellen var en stygg modul som sjelden ble berørt faktisk lav prioritet, mens en middels kompleksitetsmodul som endret seg ofte hadde høy prioritet. Teamet rettet energien til rett sted.

Fire kopierbare maler

Kodeluktdeteksjon og prioritering:

List refactoring kandidat "lukter" i denne koden: lang funksjon, repetisjon (DRYViolation), misvisende navn, dyp nestet tilstand, skjult bivirkning, magisk tall. For hver: plassering, hvorfor problemet, foreslått lite trinn, estimert risiko (lav/middels/høy). IKKE ENDRE koden ennå, bare planlegg.{{code}}

Ett-trinns, atferdsbevarende transformasjon:

BARE gjør dette: {{enkel konvertering, f.eks. Del denne funksjonen inn i 3 mindre navngitte funksjoner}}. ENDRE synlig oppførsel, signatur og returverdier. Skriv i 1 setning hvorfor alt du endret bevarer atferden.{{code}}

Sikkerhetsnett før refactor (karakteriseringstesting):

Skriv tester som fanger den AKTUELLE oppførselen til denne funksjonen (riktig eller ikke); målet er å fange opp hvis atferden endres under refaktorisering. Ta med typiske + kantoppføringer. Skriv forventninger basert på gjeldende utgang av funksjonen.{{function}}

Generering av teknisk gjeldsrekord (etterslep):

Fyll følgende luktliste i en prioriteringstabell: stoff, berørt område, endringsfrekvens (min kunnskap: {{...}}), risiko, estimert innsats, anbefalt prioritet. Sett de høye virkningene + lav innsats øverst. {{smell_list}}

Svak forespørsel / Sterk forespørsel

Svak: "Rydd opp i denne koden og gjør den bedre."
Sterk: "Del denne 90-linjers funksjonen i 3 mindre funksjoner med enkelt ansvar, uten å endre dens ytre atferd og signatur. Hold bivirkningene (skriver DB) i gjeldende rekkefølge. Jeg har tester, atferden skal forbli den samme. Gi diff og forklar i én setning hvorfor hver splitt er atferdsbevarende. [kode]"

Kraftig versjon; Det krever en enkelt spesifikk transformasjon, pålegger eksplisitt en atferds- og signaturbegrensning, og krever begrunnelse. Vage forespørsler som «gjør det bedre» fører til ukontrollerte og risikable endringer.

Refaktoreringstype

AI-pålitelighet

Forutsetning

endre navn

høy

Er omfanget riktig?

Funksjonsinndeling

middels høy

Testnett er et must

Deler repetisjon

medium

Atferdsforskjeller kan være skjult

Algoritme/strukturendring

lav

Omfattende testing + menneskelig validering

Arkitektonisk omorganisering

lav

Menneskestyrt, AI-støttet

Håndtere teknisk gjeld, ikke tilbakestille den

Teknisk gjeld er ikke bare dårlig; Noen ganger er bevisst låneopptak (for å møte en leveranse) den riktige avgjørelsen. Målet er ikke å eliminere gjeld, men å gjøre den synlig og håndterbar. AI er rask til å oppdage og prioritere gjeld, men å bestemme «hvilken gjeld som skal betales og hvilken som skal forlates» krever forretningskontekst: hvor ofte endres denne modulen, hvor mange mennesker påvirker den, hva er risikoen? Denne beslutningen tas av teamet som kjenner kodebasen og produktet; AI tydeliggjør bare alternativene.

Tips: Hold din refaktorerende PR atskilt fra PR-er som involverer atferdsendring. Å kunne si "denne PR er bare en refaktorering, atferden er den samme" gjør det lettere å undersøke og lar deg raskt avgrense årsaken hvis det oppstår et problem.

Vanlige feil

  • Refaktorering uten testnett. Du sitter igjen med ingenting som kan bevise at oppførselen er bevart.
  • Det betyr "tøm hele filen". Store, ukontrollerte endringer skjuler feilen og kan ikke undersøkes.
  • Godtar Diff uten å lese den. AI kan ha mistet litt logikk da den sa "bare struktur".
  • Forvirrende refactoring med atferdsendring. Å gjøre begge deler i samme PR gjør rotårsakssporing umulig.
  • Prøver å fikse hver eneste lukt. Stygg kode som sjelden endres har ofte lav prioritet; Tildel energi til stedet som endres ofte.

Oppsummert

Den eneste regelen for refactoring er at atferden forblir konstant, og beviset på dette er testene. AI er kraftig til å oppdage kodelukter, ett-trinns transformasjoner og prioritering av teknisk gjeld; men du må sette opp sikkerhetsnettet, kjøre testene og lese diff etter hvert trinn. Ta små, reversible skritt; skille refactoring fra atferdsendring; og la teamet som kjenner forretningskonteksten bestemme hvilken gjeld som skal betales.

Søknadsoppgave

Velg en funksjon fra kodebasen som ser lang eller kompleks ut for deg. Skriv først ut tester som fanger opp den nåværende oppførselen med "sikkerhetsnett"-malen og se om alle består. Deretter har funksjonen refaktorert på en enkelt måte (f.eks. delt i to) med "ett-trinns, atferdsbevarende transformasjon"-mønsteret og kjør testene på nytt. Hvis en test går i stykker, finn ut hvorfor; Hvis det ikke går i stykker i det hele tatt, les forskjellen linje for linje for å bekrefte at atferden faktisk er bevart.

sjekkliste

  • [ ] Jeg vet at refactoring ikke bør endre atferd, og det finnes tester for å bevise det.
  • [ ] Jeg setter opp et sikkerhetsnett som fanger opp gjeldende atferd før refactor.
  • [ ] Jeg vil ha små, ett-trinns transformasjoner fra AI, ikke store engangseffekter.
  • [ ] Etter hvert trinn kjører jeg testene og leser diff.
  • [ ] Jeg fortsetter å refaktorere PR atskilt fra atferdsendring PR.
  • [ ] Jeg prioriterer teknisk gjeld med forretningskontekst, og prøver ikke blindt å nullstille.