Enota 4 / 12

Pregled kode, preoblikovanje in tehnični dolg

Dobički:

  • Sposobnost uporabe AI kot drugega očesa pri pregledu kode za berljivost, logiko in varnost
  • Sposobnost načrtovanja korakov refaktoriranja s podporo AI brez motenj zapletenega vedenja kode
  • Zmožnost preverjanja priporočil AI za pregled in urejanje s testiranjem in primerjavo nadzora različic

V programskem inženiringu se koda veliko bolj bere, kot se piše. Vrstica kode je napisana enkrat, vendar se v mesecih več desetkrat prebere, spremeni in nadgradi. Zato sta pregled kode (pregled kode nekoga drugega ali lastne glede logike, berljivosti in varnosti) in preoblikovanje (izboljšanje strukture kode brez spreminjanja njenega obnašanja) v središču inženiringa. Umetna inteligenca postane zmogljivo »drugo oko« za ti dve nalogi: hitro predlaga berljivost, opozori na spregledane logične in varnostne težave ter razdeli veliko refaktoriranje na manjše varne korake. Vendar obstaja kritično pravilo: preoblikovanje ne sme spremeniti vedenja in edina stvar, ki to zagotavlja, je testiranje.

V tej enoti bomo videli, kako uporabiti AI na strukturiran način za pregled kode, kako popraviti zapleteno kodo, ne da bi porušili njeno delovanje, in kako upravljati tehnični dolg (hitre, a drage odločitve o kodi).

Koncepti: Tehnični dolg: Kodirajte odločitve, sprejete danes za hitrost, ki otežujejo vzdrževanje v prihodnosti. Vonj po kodi: Vzorci, ki sami po sebi niso napake, ampak kažejo na težave (predolge funkcije, ponavljajoča se koda). Regresija: Ko sprememba prekine nekaj, kar je prej delovalo.

Uporaba umetne inteligence pri pregledu strukturirane kode

Ko je čas omejen, se je treba osredotočiti na najbolj tvegana vprašanja. Samodejni oblikovalnik obravnava težave pri oblikovanju, kot sta zamik in razmik; Človeško pozornost morate posvetiti logiki, varnosti in vedenju na robovih. Pri pregledu z umetno inteligenco prosite za prednostni seznam, ne za navaden val pregledov.

  1. Podajte obseg. Kakšna koda, kaj narediti, v kakšnem kontekstu deluje.
  2. Določite prednostno os. Najprej natančnost in varnost, nato berljivost.
  3. Prosite za konkreten popravek. »Zakaj težava« in »priporočena rešitev« za vsako ugotovitev.
  4. Vi preverite ugotovitve. AI proizvaja tudi lažno pozitivne rezultate; Vsako ugotovitev preverite glede na kodo in testiranje.

Poziv za strukturirani pregled: "Preglejte naslednjo funkcijo kot višji inženir. Navedite ugotovitve po pomembnosti in jih označite s temi oznakami: [KRITIČNO] logika/varnost, [SREDNJE] robni primer/zmogljivost, [NIZKA] berljivost/ime. Za vsako ugotovitev: zakaj vprašati, konkreten predlog popravka. NE PRESKOČITE težav z oblikovanjem/zamikom, avtomatizirano orodje bo to rešilo. Koda: [koda]"

Poziv za pregled, osredotočen na varnost: "Preglejte to kodo samo za varnostne namene: pomanjkanje preverjanja vnosa, tveganje vbrizgavanja, pomanjkanje nadzora pooblastil, uhajanje zaupnih informacij, nevarne privzete nastavitve. Vsaki ugotovitvi dodajte primer scenarija napada. Če ni nobene varnostne težave, jasno navedite 'Nisem našel nobenih kritičnih varnostnih težav'. Koda: [koda]"

Pozor: samo zato, ker AI pravi, da "ni problema", še ni dokaz, da ni problema. AI lahko proizvede lažno negativne rezultate; lahko zaobide resnično varnostno težavo. Pregled z umetno inteligenco dopolnjuje, ne nadomešča, človeški pregled in varnostno testiranje. Pri varnostno kritični kodi ima zadnjo besedo pristojni inženir.

Testno ohranjeno preoblikovanje

Zlato pravilo refaktoriranja: najprej preizkusite, pozneje spremenite. Preden popravite kodo, bi morali obstajati testi, ki zaklenejo trenutno vedenje, tako da takoj veste, ali sprememba kaj pokvari. Ne kršite vrstnega reda, ko izvajate preoblikovanje AI.

  1. Preizkusite trenutno vedenje. V nasprotnem primeru naj umetna inteligenca izdela "karakterizacijski test" (test, ki zajame trenutno vedenje, kakršno je).
  2. Popravite ga v majhnih korakih. Testiranje mora ostati zeleno na vsakem koraku.
  3. Zaženite ga po vsakem koraku. Ujemite regresijo zgodaj.

Poziv načrta za varno preoblikovanje: "Naslednja 60-vrstična funkcija naredi preveč in je težko berljiva. Želim jo preoblikovati, BREZ da bi spremenil njeno vedenje. Najprej: navedite, katere testne primere potrebujem, da zaklenem trenutno vedenje. Nato: razdelite preoblikovanje na majhne korake, od katerih je vsakega mogoče izvesti, ko so testi zeleni. Ne napišite še kode, najprej dajte načrt. Koda: [koda]"

Šibek poziv / močan poziv

WEAK: "Izboljšajte to kodo." (Rezultat: nejasno, kaj izboljšati; umetna inteligenca naredi poljubne spremembe, lahko tiho spremeni vedenje.) MOČNO: "Preoblikujte to funkcijo izračuna plačila za berljivost. OMEJITEV: vedenje mora ostati popolnoma enako, vrnjene vrednosti se ne smejo spremeniti. Dolgo funkcijo razdelite na smiselne uporabne funkcije, povečajte čarobna števila v imenovane konstante. Navedite spremembe element za elementom in razložite, ZAKAJ vsak element ne spremeni vedenja. Koda: [koda]"

Zmogljiv poziv jasno navaja omejitev "vedenje mora ostati popolnoma enako" in kaj je treba izboljšati. Brez te omejitve lahko AI spremeni logiko v imenu "izboljšanja" in ustvari tiho regresijo.

Upravljanje tehničnega dolga

Pristop

Kratkoročno

na dolgi rok

ignoriranje dolga

hiter napredek

Vzdrževalna paraliza, ekipa upočasnjuje

prepisati vse

Razvoj stalnih funkcij

Negotov donos, visoko tveganje

Izmerjeno, s testom zaščiteno preoblikovanje

manjša upočasnitev

Trajnostna hitrost

Najbolj zdrav način je tretji: naredite dolg viden (sledite mu na seznamu), začnite tam, kjer najbolj boli, in preizkusite vsako rešitev. AI je dobra pomoč pri prepoznavanju in razvrščanju postavk dolga, vendar je poslovna odločitev, kateri dolg plačati.

Mini etuiji

Primer 1 – Tiha regresija. Razvijalec pove AI ​​naj "poenostavi to funkcijo"; AI ​​nepravilno prevede pogoj in izračun vračila je pokvarjen. Ker testiranja ni, se napaka pojavi po 3 tednih s pritožbo stranke. Ekipa opravi isto delo tako, da najprej napiše karakterizacijski test in pri prvem zagonu ujame napako z rdečim testom.

Primer 2 – Uporabno drugo oko. Pri pregledu kode AI ugotovi, da se pooblastilo uporabnika preveri samo v vmesniku in ne na strežniku. To je ranljivost nepooblaščenega dostopa. Engineer doda preverjanje avtorizacije na strani strežnika; Pregled z umetno inteligenco prepreči dejanski varnostni incident.

Primer 3 – Lažno pozitivno. AI pravi, da "ta spremenljivka ni nikoli uporabljena, izbrišite jo"; Vendar pa se uporablja posredno prek spremenljivega odbojnega mehanizma. Če inženir ne bi preveril predloga glede na preizkus, bi bil izbrisan in prišlo bi do napake med izvajanjem. Vsaka ugotovitev umetne inteligence mora biti pred izvedbo potrjena.

Pogoste napake

  • Refactoring brez testiranja. Nič več ne zagotavlja, da se vedenje ohrani.
  • Uporaba ugotovitev AI brez njihove potrditve. Lažno pozitivni in lažno negativni se zgodijo.
  • Zapravljanje človeškega časa s težavami s formatom. Osredotočanje na naloge, ki jih je mogoče rešiti z avtomatiziranimi orodji, zasenči dejanska tveganja.
  • Odgovor "Ni problema" vzeti kot jamstvo. AI lahko zaobide ranljivost; potreben je človeški pregled.
  • Poskusite poplačati celoten dolg naenkrat. Večje prepisovanje je tvegano; Zaželeni so koraki, ki so izmerjeni in zaščiteni s testiranjem.

Če povzamem

Pregled in preoblikovanje kode določata dolgoživost kode. AI je zmogljivo drugo oko in generator načrtov: zagotavlja prednostne ugotovitve, varnostne scenarije in načrte za refaktoriranje v majhnih korakih. Toda preoblikovanje ne bi smelo spremeniti vedenja in to zagotavlja le testiranje. Potrdite vsako ugotovitev AI glede na kodo in testiranje; Odgovora "ni problema" ne jemljite kot dokaz. Naredite tehnični dolg viden in ga odplačujte v odmerjenih, s testom zaščitenih korakih.

Aplikacijska naloga

Vzemite vrstico 40-70, nekoliko zapleteno funkcijo, ki jo imate (ali naj generira AI). Najprej sledite pozivu za strukturiran pregled in razvrstite ugotovitve kot [KRITIČNO]/[SREDNJE]/[NIZKO]; Ročno preverite vsaj eno ugotovitev glede na kodo. Nato s pozivom načrta za varno preoblikovanje najprej ustvarite in zaženite karakterizacijske teste, nato uporabite preoblikovanje v majhnih korakih in preverite, ali testi ostanejo zeleni pri vsakem koraku.

kontrolni seznam

  • [ ] Pregled sem strukturiral s prednostnimi oznakami (kritično/srednje/nizko).
  • [ ] Vsaj eno ugotovitev AI sem preveril glede na kodo/test.
  • [ ] Pred refaktoriranjem sem preizkusil trenutno vedenje.
  • [ ] Spremembe sem izvajal v majhnih korakih in izvajal teste pri vsakem koraku.
  • [ ] V pozivu sem določil omejitev »Vedenje mora ostati enako«.
  • [ ] Potrdil sem, da varnostne ugotovitve zahtevajo človeško potrditev.