Hva er refaktorering?
Refaktorering er å forbedre kodens indre struktur uten å endre hva den gjør utad. Oppførselen er den samme før og etter, men koden blir renere, tydeligere og lettere å bygge videre på. Det er nedbetalingen av teknisk gjeld: Brukeren merker ingenting, men alt fremtidig arbeid går raskere. Det bør skje løpende, ikke samles i et stort prosjekt.
Refaktorering er et av de begrepene som lett høres ut som teknisk luksus, noe utviklere gjerne vil drive med, men som ikke gir virksomheten noe. Det bildet er feil, og det kan bli dyrt. Her går vi gjennom hva refaktorering faktisk er, og hvorfor det er en av de klokeste investeringene i et system.
Hva refaktorering er
Refaktorering vil si å forbedre den indre strukturen i koden uten å endre hva den gjør. Systemet oppfører seg nøyaktig likt før og etter (de samme knappene, de samme svarene, de samme resultatene), men under overflaten har koden blitt renere, tydeligere og lettere å jobbe i.
Tenk på det som å rydde og organisere et kjøkken uten å bytte ut komfyren. Maten som lages, blir den samme, men alt er raskere å finne, benkeplatene er ryddet, og den neste som skal lage mat, slipper å lete. Koden gjør det samme som før; den er bare lettere å bygge videre på.
Derfor beskrives refaktorering ofte som nedbetaling av teknisk gjeld: Du betaler ned på det fremtidige merarbeidet som ellers bygges opp.
Hvorfor ingenting vises, men alt går raskere
Her ligger den vanlige misforståelsen. Fordi refaktorering ikke legger til noen funksjon, ser brukeren (og ofte også kunden) ingen forskjell i det hele tatt. Det kan føles som om man har betalt for ingenting.
Men verdien ligger nettopp i det usynlige. Ren, velstrukturert kode er raskere å forstå, tryggere å endre og lettere å bygge nytt i. En funksjon som i en rotete kodebase ville ha tatt to uker og ført med seg nye feil, tar i en velholdt kodebase noen dager og holder. Forskjellen viser seg ikke i den enkelte endringen, men i tempoet over tid.
Uten løpende refaktorering går det motsatt vei. Hver rask snarvei og hver del som ikke ryddes, gjør systemet litt tregere å jobbe i. Til slutt blir selv trivielle endringer dyre, trege og risikable. Koden «råtner» ikke av seg selv, men den tynger ned alt som bygges oppå.
Forskjellen på refaktorering og omskriving
Det er lett å blande sammen refaktorering og omskriving, men det er to ulike ting med helt ulik risiko. Refaktorering forbedrer koden som finnes, i små og trygge steg, mens en omskriving kaster den gamle løsningen og bygger en ny fra grunnen av: et stort, dyrt og risikofylt prosjekt der man midlertidig mister det utprøvde gamle. Nesten alltid er trinnvis refaktorering det tryggere valget.
Et konkret scenario
Si at et team skal legge til en ny betalingsmetode i en tjeneste. De åpner den delen av koden som håndterer betalinger, og oppdager at den er rotete: Den samme logikken er kopiert på fem steder, navngivingen er forvirrende, og ingen tør egentlig å røre den.
Velger de bare å «presse inn» den nye metoden, vokser rotet, og neste endring blir enda verre. Velger de i stedet å refaktorere først, altså samle den felles logikken på ett sted og gi ting forståelige navn, tar det litt lengre tid denne gangen, men oppførselen er uendret, og neste betalingsmetode blir enkel å legge til. De betalte ned på gjelden i stedet for å øke den.
Rådet: løpende, ikke som et stort prosjekt
Det viktigste prinsippet er at refaktorering skal inngå løpende i det vanlige arbeidet, ikke spares opp til et stort, separat «ryddeprosjekt». Det beste tidspunktet for å forbedre en del av koden er når man uansett er inne i den for å bygge eller rette noe, for da skjer ryddingen i samme slengen.
Et stort, frittstående refaktoreringsprosjekt er vanskeligere å forsvare, mer risikabelt og lettere å utsette i det uendelige. Litt om gangen, ofte, som en naturlig del av hver sprint, er både billigere og tryggere.
Vil dere at systemet skal forbli raskt og billig å bygge videre på år etter år, bygger vi i Weapp løpende rydding i koden inn i utviklingsarbeidet fra start.
Ofte stilte spørsmål
Hva er forskjellen på å refaktorere og å skrive om koden?
Refaktorering forbedrer den eksisterende koden i små, trygge steg uten å endre hva den gjør. En omskriving kaster den gamle løsningen og bygger nytt fra grunnen av. Refaktorering har lav risiko og pågår løpende; en omskriving er et stort, risikofylt prosjekt der man midlertidig mister det gamle. Som oftest er trinnvis refaktorering det klokere valget.
Hvorfor skal vi betale for noe vi ikke ser?
Fordi det som ikke vises, avgjør hvor raskt og trygt alt annet går. Refaktorering holder koden forståelig slik at nye funksjoner kan bygges raskere og med færre feil. Uten den vokser den tekniske gjelden til selv små endringer blir dyre og risikable. Dere betaler enten litt løpende eller mye senere.
Hva er teknisk gjeld i denne sammenhengen?
Teknisk gjeld er det fremtidige merarbeidet som bygges opp når kode skrives raskt eller ikke ryddes opp i. Akkurat som på et lån påløper det renter: Jo lenger den blir liggende, desto tregere blir hver ny endring. Med refaktorering betaler man ned gjelden slik at den ikke vokser seg uhåndterlig.
Når bør man refaktorere?
Løpende, som en naturlig del av arbeidet. Det beste tidspunktet er når man uansett er inne i en del av koden for å bygge eller rette noe, for da ryddes den samtidig. Å spare opp all refaktorering til et stort, separat prosjekt er dyrere, mer risikabelt og vanskeligere å forsvare. Litt om gangen, ofte, er regelen.
Innebærer refaktorering noen risiko?
Risikoen er lav når det gjøres riktig: i små steg med gode tester som bekrefter at oppførselen er uendret. Faren oppstår når man tar for store skritt på en gang eller mangler tester som fanger opp om noe har gått i stykker. Med riktig arbeidsmåte er refaktorering en av de tryggeste måtene å forbedre et system på.