Hæv kodekvaliteten med refaktorering og SonerQube

Scott/Tiger - IT konsulenthus / Udvikling  / Hæv kodekvaliteten med refaktorering og SonerQube

Hæv kodekvaliteten med refaktorering og SonerQube

Du kan med fordel hæve kodekvaliteten i dine IT-applikationer. Med en overskuelig kode opnår du bl.a. lavere omkostninger, færre flaskehalse og en kode, som er nem at vedligeholde og teste. Scott/Tiger har medvirket i et refaktoreringsprojekt hos en større dansk IT-virksomhed. Målet var at hæve kodekvaliteten i et af deres systemer, der efter en del år med udvikling og videreudvikling havde pådraget sig nogle skavanker. Specifikt var der områder af koden, der var blevet særdeles omfattende og uoverskuelige, og dermed svære at vedligeholde og videreudvikle.

Fra velskrevet til uoverskuelig kode
De fleste udviklere ved godt hvordan fornuftig og overskuelig kode ser ud, og bestræber sig på så vidt muligt at skrive denne form for kode. Men kodekvalitet kommer nemt til at skride lidt med tiden. Ofte sker der det, at der med tiden laves flere og flere tilføjelser til kode, der oprindeligt var velskrevet og overskuelig, indtil den på et tidspunkt næsten ikke er til at have med at gøre. Den enkelte tilføjelse vil som regel ikke forringe kvaliteten mærkbart – en enkelt ekstra betingelse her, en enkelt ekstra værditildeling der – og således vil det sjældent falde den enkelte udvikler ind, at NU er det på tide at skrive koden helt om. Dertil kommer, at det kan være svært at få sat tid af til at lave større omskrivninger af koden når det, der er behov for her og nu, kun er en lille tilføjelse. Endelig er der det aspekt, at forskellige udviklere kan have forskellige idéer om kodekvalitet – i særdeleshed, hvis der ikke er fastsat fælles retningslinjer.

God kodekvalitet
Hvad er det så, der er kendetegnende for god kodekvalitet? Som nævnt kan der være forskellige meninger om dette. De fleste udviklere skulle gerne kunne blive enige om, at kode skal være forståelig og overskuelig, og nem at vedligeholde og teste.

Alle erfaringer tyder på, at dette bedst opnås ved at sørge for at de enkelte kodeenheder (for eksempel metoder i Java, eller funktioner og procedurer i PL/SQL) opfylder følgende:

  • De bliver holdt så små som muligt.
    Dermed vil det i de fleste tilfælde være nemt at gennemskue, hvilken handling den enkelte enhed udfører.
  • Én enhed udfører kun én opgave (også kendt som ”single responsibility”).
    Derved undgår man en situation, hvor det meste af koden i en enhed virker, men at enheden samlet set fejler, fordi en enkelt handling eller opgave går galt.
  • De har et begrænset antal parametre.
    Dette sikrer, at der ikke er for mange eksterne faktorer, man skal holde styr på, når man arbejder med en given enhed.
  • De har begrænset kompleksitet.
    Mængden af betinget kode og løkker må ikke være for stor i en enkelt enhed. Overordnet set handler det om at begrænse antallet af mulige veje, man kan navigere fra start til slut af koden – for hver vej kræver sin egen test-case.
  • De indeholder unik kode.
    Hvis dele af koden i to eller flere enheder er identisk giver det god mening at placere disse dele i en enhed for sig selv, og kalde denne enhed de steder, der er brug for det. Dette sikrer dels, at man slipper for at skrive den samme kode flere gange, og giver dels en tidsbesparelse i forhold til senere vedligehold.

Det kan – og vil – selvfølgelig være nødvendigt at tillade undtagelser til disse regler. I de tilfælde, hvor det vil hæmme forståelsen eller overskueligheden at tvinge en enhed til at opfylde alle disse regler, skal man selvfølgelig ikke gøre det. Der kan også være bindinger til kode udenfor ens egen kontrol, f.eks. kald af en webservice fra et andet system, som sætter begrænsninger for mulighederne for at skrive optimal kode. Det faktum, at der findes enkelte enheder, som ikke kan komme til at opfylde reglerne, bør ikke bruges som begrundelse for at ingen enheder gør det.

Fordele ved at hæve kodekvaliteten
Med kode som er overskuelig og nem at vedligeholde og teste, opnår man følgende:

  • Lavere omkostninger og time-to-market for kommende opgaver.
    Jo mindre tid udviklere skal bruge på at finde, forstå, rette og teste kode, jo hurtigere og billigere kan opgaver udføres.
  • Alle områder af koden kan ændres.
    Hvis størstedelen af koden i et system overholder de nævnte regler, undgår man, at der opstår et eller flere områder af koden, der er så kompleks, uoverskuelig og skrøbelig, at man i praksis er tvunget til at undlade at lave ændringer i den og i stedet må lære at leve med uhensigtsmæssigheder.
  • Færre flaskehalse.
    Hvis der findes områder af et system, som det er svært at arbejde med på grund af uoverskuelighed og høj kompleksitet, går det nemt sådan, at opgaver der involverer disse områder altid bliver udført af de få udviklere, som kender det godt og har arbejdet med det før. Uden disse problemområder kan flere opgaver sendes til en bredere vifte af udviklere, i stedet for at stå i kø hos en bestemt udvikler.

SonarQube
I refaktoreringsprojektet benyttede vi os af værktøjet SonarQube. Dette værktøj er nyttigt til at påpege fejl, sårbarheder og større og mindre sårbarheder i kode ud fra et konfigurérbart sæt af regler, så udviklerne kan koncentrere sig om at rette fejlene i stedet for at finde dem. SonarQube har indbygget historik, så udviklerne eksempelvis kan se om de seneste ændringer, som de har lavet trækker kodekvaliteten i en rigtig eller forkert retning.

Refaktoreringsprojektets betydning for fremtiden
Projektet har givet en styrket bevidsthed om kodekvalitet, og hvad der helt konkret kræves af god kode. Denne viden er i øjeblikket ved at blive delt med systemets andre udviklere, og med udviklere på andre systemer indenfor virksomheden. En ny arbejdsgang er ved at blive implementeret, hvor ny kode løbende køres igennem SonarQube. Målet er, at holde kodekvaliteten høj hele tiden, så der ikke igen bliver behov for at refaktorere kode, som er blevet uoverskuelig.

Kontakt os
Kunne du tænke dig at høre mere om refaktorering, så tag kontakt til Torben Bolvig på tlf. 4546 0301 eller mail torben.bolvig@scott-tiger.dk.

Forfatter
Andreas Lund Nielsen
Senior System Engineer
Scott/Tiger

Download printvenlig version