Vienetas 8 / 12

Refaktoringas ir techninis skolų valdymas

Pelnas:

  • Galimybė nustatyti bandomąjį apsauginį tinklą, kuris fiksuotų esamą elgesį prieš atliekant pakartotinį apdorojimą
  • Galimybė prašyti dirbtinio intelekto mažų, vieno žingsnio, elgesį išsaugančių transformacijų ir patvirtinti kiekvieną žingsnį
  • Gebėjimas atpažinti technines skolas ir jas teikti pirmenybę verslo kontekste

Pertvarkymas – tai vidinės kodo struktūros tobulinimas, nekeičiant jo išorinės elgsenos: padaryti jį skaitomesnį, paprastesnį, lengviau prižiūrimą. Kita vertus, techninė skola yra dizaino kompromisas dėl greito sprendimo ir laikui bėgant grąžinamas „su palūkanomis“ – kiekvienas šiandien nupjautas kampas rytoj grįš kaip sulėtėjimas ar klaida. Dirbtinis intelektas yra galingas asistentas, kuris pagreitina pasikartojančias ir mechanines pertvarkymo užduotis; Tačiau yra viena auksinė pertvarkymo taisyklė, ir vienas AI negali to garantuoti: elgesys neturi keistis.

Šiame skyriuje mes mokomės, kaip atlikti saugų refaktorizavimą naudojant AI: nedideli ir grįžtami žingsniai, apsauga naudojant testus, kodo kvapų aptikimas ir techninės skolos prioritetas. Kritinis taškas yra toks: išlaikyti bandymus, o ne dirbtinio intelekto žodis, įrodo, kad elgesys yra išsaugotas.

Auksinė pertvarkymo taisyklė: elgesys išlieka pastovus

Refaktorizavimą pavojingu daro tai, kad nesąmoningai keičiasi elgesys sakydamas „tobulėju“. Atmetus didžiųjų ir mažųjų raidžių raidę supaprastinant sąlygą, pažeidžiant tvarką transformuojant kilpą, nepastebėjus pašalinio efekto skaidant funkciją – visa tai sukuria „švariai atrodantį“, bet neveikiantį kodą.

Štai kodėl testavimas yra būtina sąlyga norint pakeisti veiksnį: prieš keisdami, turite turėti testus, kurie užfiksuotų esamą elgesį. Šie testai yra „saugos tinklas“; Jei netyčia ką nors sulaužysite per refaktorizavimą, jie sulaužys ir jus įspės. Jei neturite testų, pirmiausia parašykite testus, kurie ištaiso esamą elgseną (kaip sužinojome 5 skyriuje) – čia AI pradeda sparčiai veikti.

Atsargiai: dirbtinio intelekto padedamas pertvarkymas be testneto yra vienas klastingiausių klaidų šaltinių. Lengva pasakyti „išsaugiau elgesį“; Įrodymas yra tas, kad tie patys testai praeina prieš ir po pakeitimo.

Žingsnis po žingsnio: saugus pertvarkymo srautas

  1. Nustatykite apsauginį tinklą. Tegul yra testai, fiksuojantys esamą kodo, kurį pakeisite, elgseną; Jei ne, pirmiausia juos užsirašykite (ir pamatykite, kaip jie praeina).
  2. Pavadinkite kvapą. Ką tobulinate ir kodėl? „Ši funkcija atlieka 3 dalykus“, „ta pati logika kartojasi 4 vietose“, „pavadinimai klaidina“.
  3. Paprašykite mažų, vieno žingsnio žingsnių. Paprašykite AI atlikti vieną transformaciją (pvz., tiesiog „padalyti šią funkciją per pusę“), o ne perrašyti viso failo.
  4. Paleiskite testus. Po kiekvieno žingsnio. Jei jis žalias, tęskite, jei raudonas, atsiimkite.
  5. Skaityti Diff. Eilutę po eilutės patvirtinkite, kad pokytis iš tiesų išsaugo elgesį; Gali būti loginis nukrypimas, kai sakoma, kad AI yra „tik struktūra“.
  6. Sumaišykite į mažus gabalėlius. Dideli vienkartiniai pertvarkymo PR yra rizikingi ir neperžiūrimi.

Trys mini dėklai

1 atvejis – 220 eilučių funkcija saugiai padalinta. Viena komanda turėjo 220 eilučių užsakymų apdorojimo funkciją. Pirmieji 14 testų buvo parašyti (naudojant AI), kurie užfiksavo dabartinį elgesį, visi jie buvo išlaikyti. Tada AI žingsnis po žingsnio funkcija buvo padalinta į 5 mažesnes funkcijas; Testai buvo atliekami po kiekvieno žingsnio. Vienu žingsniu buvo sugadinti du bandymai – AI nesugebėjo sugrįžti kraštutinėje byloje. Testai tai iškart pastebėjo ir ištaisė. Be tinklo klaida galėjo pereiti iki gamybos.

2 atvejis – nelaimė be bandomojo tinklo. Kitas kūrėjas „išvalė“ datos skaičiavimo modulį, kuriame nebuvo jokių AI testų. Kodas atrodė geriau, bet jis neteisingai apskaičiavo keliamuosius metus; Klaida pasirodė po dviejų savaičių su kliento skundu. Nuostolis gerokai viršijo sutaupytą laiką, sutaupytą po pertvarkymo. Pamoka: pertvarkymas be testavimo yra azartas.

3 atvejis. Techninis skolos prioritetas. Viena komanda AI skyrė maždaug 30 „patobulinamų“ taškų ir kiekviena iš jų įvertino pagal ašį „keitimo dažnis × rizika × pastangos“. Gautoje lentelėje bjaurus modulis, kuris buvo retai liečiamas, iš tikrųjų buvo žemo prioriteto, o vidutinio sudėtingumo modulis, kuris dažnai keitėsi, buvo didelis prioritetas. Komanda nukreipė savo energiją į reikiamą vietą.

Keturi kopijuojami šablonai

Kodinis kvapo aptikimas ir prioritetų nustatymas:

Šiame kode išvardykite pakartotinio veiksmingumo kandidatų „kvepia“: ilga funkcija, kartojimas (DRYViolation), klaidinantis pavadinimas, giliai įdėta sąlyga, paslėptas šalutinis poveikis, magiškas skaičius. Kiekvienam: vieta, problemos priežastis, siūlomas mažas žingsnis, numatoma rizika (žema / vidutinė / didelė). Dar NEKEISKITE kodo, tiesiog suplanuokite.{{code}}

Vieno žingsnio, elgesį išsauganti transformacija:

TIESIOG darykite taip: {{vienkartinė konversija, pvz. Padalinkite šią funkciją į 3 mažesnes pavadintas funkcijas}}. PAKEISTI matomą elgesį, parašą ir grąžinimo reikšmes. 1 sakiniu parašykite, kodėl viskas, ką pakeitėte, išlaiko elgseną.{{code}}

Apsauginis tinklas prieš reaktorių (apibūdinimo bandymas):

Parašykite testus, kuriuose užfiksuota DABARTINĖ šios funkcijos elgsena (teisinga ar ne); tikslas yra sugauti, jei elgesys pasikeičia per refaktorizavimą. Įtraukite tipinius + krašto įrašus. Parašykite lūkesčius pagal esamą funkcijos išvestį.{{function}}

Techninių skolų įrašų (atlikimo) generavimas:

Sudėkite šį kvapų sąrašą į prioritetų lentelę: medžiaga, paveikta sritis, keitimo dažnis (mano žiniomis: {{...}}), rizika, numatomos pastangos, rekomenduojamas prioritetas. Viršuje padėkite stiprius smūgius ir mažai pastangų reikalaujančius. {{smell_list}}

Silpnas raginimas / Stiprus raginimas

Silpnas: „Išvalykite šį kodą ir patobulinkite“.
Stiprus: "Padalinkite šią 90 eilučių funkciją į 3 mažesnes funkcijas su viena atsakomybe, nekeičiant jos išorinio elgesio ir parašo. Šalutinį poveikį (DB rašo) laikykite esama tvarka. Turiu testus, elgesys turėtų išlikti toks pat. Nurodykite skirtumą ir vienu sakiniu paaiškinkite, kodėl kiekvienas padalijimas išlaiko elgesį. [kodas]"

Galinga versija; Tai reikalauja vienos konkrečios transformacijos, aiškiai nustato elgesio ir parašo apribojimus ir reikalauja pateisinimo. Neaiškūs prašymai, tokie kaip „padaryk geriau“, veda prie nekontroliuojamų ir rizikingų pokyčių.

Refaktoringo tipas

AI patikimumas

Būtina sąlyga

pervadinti

aukštas

Ar taikymo sritis teisinga?

Funkcijų padalijimas

vidutinio aukšto

Testnet yra būtinas

Pasidalijimas pasikartojimu

vidutinis

Elgesio skirtumai gali būti paslėpti

Algoritmo/struktūros keitimas

žemas

Išsamus bandymas + žmogaus patvirtinimas

Architektūrinis pertvarkymas

žemas

Žmogaus vadovaujamas, AI palaikomas

Techninės skolos valdymas, o ne grąžinimas

Techninė skola nėra blogai; Kartais sąmoningas skolinimasis (siekiant pristatyti) yra teisingas sprendimas. Tikslas yra ne panaikinti skolą, o padaryti ją matomą ir valdomą. Dirbtinis intelektas greitai nustato skolą ir nustato prioritetus, tačiau norint nuspręsti, „kurią skolą reikia sumokėti, o kurios atsisakyti“, reikia verslo konteksto: kaip dažnai keičiasi šis modulis, kiek žmonių tai paveikia, kokia yra rizika? Šį sprendimą priima komanda, kuri žino kodo bazę ir produktą; AI tik paaiškina parinktis.

Patarimas: tvarkykite savo PR atskirai nuo viešųjų ryšių, kuriuose keičiasi elgesys. Galimybė pasakyti, kad „šis viešasis ryšys yra tik pertvarkymas, elgesys yra toks pat“ palengvina tyrimą ir leidžia greitai susiaurinti priežastį, jei iškiltų problema.

Dažnos klaidos

  • Refaktorizavimas be testneto. Jūs neturite nieko, kas įrodytų, kad elgesys yra išsaugotas.
  • Tai reiškia „išvalyti visą failą“. Dideli, nekontroliuojami pakeitimai slepia klaidą ir negali būti tiriami.
  • Diff priėmimas jo neperskaičius. AI galėjo paklysti logika, kai pasakė „tiesiog struktūra“.
  • Painiojantis refaktorizavimą su elgesio pokyčiais. Atliekant abu tuo pačiu viešųjų ryšių ryšiu, neįmanoma nustatyti pagrindinės priežasties.
  • Stengiasi pataisyti kiekvieną kvapą. Bjaurus kodas, kuris retai keičiasi, dažnai yra žemo prioriteto; Paskirkite energiją vietai, kuri dažnai keičiasi.

Apibendrinant

Vienintelė pertvarkymo taisyklė yra ta, kad elgesys išlieka pastovus, o to įrodymas yra testai. AI yra galingas aptikdamas kodo kvapus, vieno žingsnio transformacijas ir teikia pirmenybę techninei skolai; bet jūs turite nustatyti apsauginį tinklą, atlikti testus ir po kiekvieno veiksmo perskaityti skirtumą. Žengti mažus, grįžtamus žingsnelius; atskirti pertvarkymą nuo elgesio pokyčių; ir leiskite komandai, kuri žino verslo kontekstą, nuspręsti, kurią skolą sumokėti.

Taikymo užduotis

Iš savo kodų bazės pasirinkite funkciją, kuri jums atrodo ilga arba sudėtinga. Pirmieji spausdinimo testai, kuriuose užfiksuota dabartinė jo elgsena naudojant „saugos tinklo“ šabloną, ir patikrinama, ar jie visi atitinka. Tada pakartokite funkciją vienu būdu (pvz., padalinkite per pusę) naudodami „vieno žingsnio, elgesį išsaugančios transformacijos“ modelį ir dar kartą paleiskite testus. Jei bandymas nutrūksta, išsiaiškinkite, kodėl; Jei jis visai nelūžta, perskaitykite skirtumą eilutę po eilutės, kad įsitikintumėte, jog elgesys iš tikrųjų išlieka.

kontrolinis sąrašas

  • [ ] Žinau, kad pertvarkymas neturėtų keisti elgesio, ir yra bandymų, įrodančių tai.
  • [ ] Aš nustatau apsauginį tinklą, kuris užfiksuoja esamą elgseną prieš refaktorių.
  • [ ] Noriu mažų, vieno žingsnio transformacijų iš AI, o ne didelių vienkartinių.
  • [ ] Po kiekvieno žingsnio atlieku testus ir perskaitau skirtumą.
  • [ ] Atskiriu PR pertvarkymą nuo elgesio pokyčių PR.
  • [ ] Techninėms skoloms pirmenybę teikiu verslo kontekstui, o ne aklai stengiuosi nulįsti.