Kodekvalitet er målbar. Den påstand lyder indlysende, indtil du prøver at besvare det spørgsmål, en CTO stiller, før han anskaffer et softwareprodukt, eller en teknisk ledende stiller, før han forpligter sig til et refactoringprogram: Hvordan ved du, at koden er god? "Den virker" er ikke et svar. "Teamet har gennemgået den" er ikke et svar. Svaret kræver objektive målinger, der anvendes konsekvent: cyklomatisk kompleksitet pr. funktion, vedligeholdelsesindeks pr. modul, defektdensitet pr. tusinde linjer, testdækning pr. komponent, kodechurn pr. fil pr. sprint. Hver af disse er et tal. Tal kan trendes, benchmarkes og handles på.
Kodeforståelse starter her
SMART TS XL beregner kvalitetsmålinger på tværs af alle sprog og platforme i dit miljø.
Klik herUdfordringen er, at metrikker for kodekvalitet ikke er udskiftelige og ikke universelt fortolkelige. Et højt vedligeholdelsesindeks i et COBOL-program betyder noget andet end den samme score i et Python-script. En cyklomatisk kompleksitet på 15 er acceptabel i en velafprøvet tilstandsmaskine og et alvorligt problem i en valideringsfunktion. En defektdensitet på 2 fejl pr. KLOC er fremragende i systemprogrammering og alarmerende i en sikkerhedskritisk indlejret applikation. For at gøre metrikker nyttige kræver det forståelse af, hvad hver enkelt måler, hvad der driver den op eller ned, og hvilke tærskler der er passende for konteksten. Resten af denne artikel beskriver præcis det.
Hvad er kodekvalitet?
Kodekvalitet er den grad, i hvilken kildekode opfylder et sæt målbare egenskaber, der gør den korrekt, vedligeholdelig, læsbar, effektiv, sikker og testbar. Ingen enkelt egenskab definerer kvalitet isoleret set. Kode, der kører korrekt, men er ulæselig, forringes i kvalitet med hver ændring, fordi udviklere, der ikke kan forstå den, ikke kan ændre den sikkert. Kode, der er læsbar, men utestet, bærer skjulte defekter. Kode, der er testet, men strukturelt kompleks, akkumulerer flere defekter, efterhånden som den vokser, fordi kompleksiteten ganger sandsynligheden for, at en given ændring ødelægger noget uventet.
En formel definition fra ISO/IEC 25010-standarden identificerer otte softwarekvalitetskarakteristika: funktionel egnethed, ydeevneeffektivitet, kompatibilitet, brugervenlighed, pålidelighed, sikkerhed, vedligeholdelsesvenlighed og portabilitet. Specifikt for kildekode er de karakteristika, der kan måles direkte ud fra selve koden, snarere end ud fra runtime-adfærd, vedligeholdelsesvenlighed, pålidelighed (approksimeret ved defekt- og kompleksitetsmålinger), sikkerhed (via statisk analyse) og funktionel egnethed (via testdækning). De andre karakteristika kræver udførelse af koden for at måle. Kodekvalitetsmålinger dækker derfor en defineret og vigtig delmængde af softwarekvalitet, ikke dens helhed.
Hvorfor kodekvalitet er vigtig
Tekniske teams ved, hvorfor kodekvalitet er vigtig. For forretningsinteressenter og for teams, der skal argumentere internt, er sammenhængen gennem omkostninger og tid. Undersøgelser foretaget af McKinsey og Consortium for IT Software Quality (CISQ) viser konsekvent, at udviklere bruger mellem 30 og 40 procent af deres tid på at arbejde omkring eksisterende teknisk gæld i stedet for at udvikle ny funktionalitet. Dårlig kodekvalitet er den mekanisme, hvorved teknisk gæld akkumuleres: hver fejl, der ikke opdages tidligt, hver funktion, der er mere kompleks end nødvendigt, hver duplikeret logikblok, der skal vedligeholdes separat, øger omkostningerne ved den næste ændring. Høj kodekvalitet reducerer disse omkostninger løbende og forværres i løbet af systemets levetid.
Kodekvalitetsmålinger: Komplet reference
Metrikkene nedenfor dækker alle større kategorier af måling af kodekvalitet. For hver metrik forklares definitionen, målemetoden, det acceptable område og fortolkningen. Tærsklerne i tabellen nedenfor afspejler bredt citerede branchebenchmarks; teams i sikkerhedskritiske eller regulerede miljøer bør anvende strengere tærskler.
Kompleksitetsmål
Cyklomatisk kompleksitet måler antallet af lineært uafhængige stier gennem en funktion eller metode. Den blev introduceret af Thomas McCabe i 1976 og er fortsat den mest anvendte kompleksitetsmåling. Formlen tæller beslutningspunkter, if, else if, switch tilfælde, løkkebetingelser, catch blokke og betingede operatorer, og adderer 1. En funktion uden forgreninger har en cyklomatisk kompleksitet på 1.
| Cyklomatisk kompleksitet | Fortolkning |
|---|---|
| 1-5 | Enkel, nem at teste |
| 6-10 | Moderat, håndterbar |
| 11-20 | Kompleks, testning bliver vanskelig |
| 21-50 | Meget høj risiko, refactoring anbefales |
| 50 + | Utestbar, næsten sikker på at indeholde defekter |
Høj cyklomatisk kompleksitet er stærkt korreleret med defekttæthed. Forskning offentliggjort i IEEE Transactions on Software Engineering viste, at funktioner med cyklomatisk kompleksitet over 10 har signifikant højere defektrater end enklere funktioner. cyklomatisk kompleksitetsanalyse I ældre kodebaser er problemet at finde funktioner, der har akkumuleret beslutningslogik over mange års vedligeholdelse, uden at nogen nogensinde har refaktoreret den overordnede struktur.
NPath kompleksitet tæller antallet af unikke udførelsesstier gennem en funktion, inklusive stier oprettet af indlejrede betingelser og løkker. Hvor cyklomatisk kompleksitet tæller grene lineært, multiplicerer NPath-kompleksitet dem: en funktion med tre sekventielle if-else-blokke har en cyklomatisk kompleksitet på 4, men en NPath-kompleksitet på 8, fordi hver betingelse kan være sand eller falsk uafhængigt. NPath-kompleksiteten vokser eksponentielt med indlejring. En værdi over 200 indikerer en funktion, der ville kræve flere testcases, end noget team realistisk kan skrive.
Kognitiv kompleksitet blev introduceret af SonarSource og måler, hvor vanskelig kode er at forstå, snarere end hvor mange stier den indeholder. Den straffer indlejring hårdere end lineær forgrening: en if inde i while inde i en anden if scorer højere end tre på hinanden følgende if udsagn med samme cyklomatiske kompleksitet. Kognitiv kompleksitet stemmer bedre overens med den faktiske vanskelighed, som udviklere oplever, når de læser kode. En kognitiv kompleksitet over 15 pr. metode markeres generelt til gennemgang; over 25 indikerer det en funktion, som de fleste udviklere vil finde virkelig vanskelig at ræsonnere om.
Halstead Metrics udlede en familie af målinger fra fire tællinger i kildekoden: distinkte operatorer (n1), distinkte operander (n2), samlede operatorer (N1) og samlede operander (N2). Ud fra disse beregner Halstead:
- Bind (N × log2(n)): implementeringens størrelse i informationsindhold
- Vanskelighed (n1/2 × N2/n2): et estimat af, hvor vanskelig koden er at skrive eller forstå
- Indsats (Volumen × Sværhedsgrad): den anslåede samlede mentale indsats for at implementere eller forstå koden
Halstead-metrikker er særligt nyttige til at sammenligne funktioner med lignende cyklomatisk kompleksitet for at bestemme, hvilken der er sværest at forstå. En funktion med 10 grene over tydeligt navngivne variabler har lavere Halstead-sværhedsgrad end en med 10 grene over beregnede indekser og enkelttegnsidentifikatorer.
Vedligeholdelsesmålinger
Vedligeholdelsesindeks er en sammensat metrik, der oprindeligt blev udviklet af Paul Oman og Jack Hagemeister og senere blev taget i brug af Microsoft Visual Studio som standard vedligeholdelsesmål. Den kombinerer Halstead-volumen, cyklomatisk kompleksitet og kodelinjer i en enkelt score.
Visual Studio-formlen giver en score fra 0 til 100:
| Vedligeholdelsesindeks | Rating |
|---|---|
| 20-100 | Vedligeholdelig (grøn) |
| 10-19 | Moderat vedligeholdelsesproblem (gul) |
| 0-9 | Vanskelig at vedligeholde (rød) |
Vedligeholdelsesindekset er en opsummerende statistik. Det er mest nyttigt til at identificere outliers, filer eller moduler, der scorer i den røde zone, snarere end til finkornet sammenligning mellem moduler i den grønne zone. I Python er radon Biblioteket beregner vedligeholdelsesindekset direkte. I Visual Studio vises det i vinduet Kodemetrikker. For statisk kodeanalyse platforme, vedligeholdelsesindeks er typisk et af standardoutputtet sammen med cyklomatisk kompleksitet og kodelinjer.
Kodelinjer (LOC) og KLOC Mål størrelsen af kodebasen i linjer eller tusindvis af linjer. LOC alene fortæller dig intet om kvalitet, men det giver essentielle nævnere for andre målinger: defektdensitet er fejl pr. KLOC, kommentardensitet er kommentarer pr. LOC, testdensitet er testpåstande pr. LOC. LOC skalerer også omkostningerne ved kompleksitet: en funktion på 500 linjer med en cyklomatisk kompleksitet på 20 er et meget større problem end en funktion på 50 linjer med samme score.
Kode Churn er den hastighed, hvormed kode ændrer sig over tid, målt som tilføjede linjer plus slettede linjer plus ændrede linjer pr. fil pr. tidsenhed. Høj kodeudskiftning indikerer ustabilitet: kode, der ændres ofte, kan reagere på et design, der ikke var korrekt fra starten, krav, der ikke var stabile, eller fejl, der bliver ved med at kræve programrettelser. Forskning fra Microsoft viste, at filer i de top 10 % af kodeudskiftning indeholdt fem gange flere defekter end filer med lav churn. Sporing af kodeudskiftning sammen med defektrater afslører, om hyppige ændringer forbedrer kvaliteten eller genererer nye problemer.
Kodedækningsmålinger
Enhedstestdækning er procentdelen af linjer, forgreninger eller betingelser i kodebasen, der udføres af enhedstests. Den mest meningsfulde form er forgreningsdækning: om hver beslutning i koden kan nås af mindst én test i både det sande og det falske resultat. Linjedækning er lettere at game; en test, der udfører hver linje uden at hævde noget, opnår 100 % linjedækning og fanger ingenting.
Branchebenchmarks for dækning af enhedstest:
- Under 50%: utilstrækkelig, de fleste defekter vil ikke blive opdaget af test
- 50-75%: moderat, større stier dækket, kantsager sandsynligvis overset
- 75-90%: god til det meste programkode
- Over 90%: egnet til sikkerhedskritiske eller højpålidelige systemer
Kodedækning i sikkerhedskritiske applikationer følger strengere standarder. DO-178C for luftfartssoftware og IEC 61508 for funktionel sikkerhed specificerer dækningskrav (MC/DC-dækning for de højeste kritikalitetsniveauer), der går ud over, hvad standard enhedstestning opnår. Forbedring af kodekvaliteten i sikkerhedskritiske applikationer kræver dækningsværktøjer, der sporer tilstands-/beslutningsdækning og kan producere den formelle dokumentation, der kræves af certificeringsmyndighederne.
Testdensitet supplerer dækningen ved at måle antallet af testpåstande i forhold til produktionskodens størrelse. Høj dækning med lav testdensitet kan indikere tests, der udfører kode uden meningsfuldt at verificere adfærd. Høj testdensitet med lav dækning indikerer tests koncentreret i en lille del af kodebasen.
Fejlmålinger
Bugdensitet (også Defektdensitet) er antallet af bekræftede defekter pr. tusinde linjer kode (KLOC). Det er det mest direkte kvantitative mål for kodekorrekthed. Branchebenchmarks fra CISQ viser, at kommerciel standardsoftware i gennemsnit har omkring 15-50 defekter pr. KLOC før testning; efter testning og udgivelse kører kommerciel software af høj kvalitet typisk under 1 defekt pr. KLOC.
Resultater af statisk analyse omtrentlig defektdensitet, før defekter bekræftes gennem test eller produktionsbrug. Værktøjer som SonarQube, Checkmarx og SMART TS XL Analyser kodebasen for mønstre forbundet med kendte defekt- og sårbarhedsklasser, og udarbejd en optælling af potentielle problemer kategoriseret efter alvorlighed. Forholdet mellem kritiske og blokerende fund og LOC giver et tidligt signal om kodekvalitet, før koden når test.
Kode Lugttæthed tæller tilstedeværelsen af antimønstre, duplikeret kode, for lange funktioner, overdreven klassekobling, feature misundelse, gudobjekter, pr. KLOC. Kodelugt forårsager ikke øjeblikkelige fejl, men forudsiger fremtidige defekter og vedligeholdelsesomkostninger. En kodebase med høj kodelugtdensitet er en, hvor omkostningerne ved enhver fremtidig ændring er forhøjede, fordi hver ændring skal navigere i de akkumulerede strukturelle problemer.
Læsbarheds- og stilmålinger
Kommentartæthed er forholdet mellem kommentarlinjer og kodelinjer. Optimale intervaller varierer afhængigt af sprog og teamkonvention, men ligger typisk mellem 10-30 %. Under 10 % kan indikere utilstrækkeligt dokumenteret kode; over 50 % kan indikere kode, der er så kompleks, at den kræver en omfattende forklaring af ikke-indlysende logik. Kommentarernes kvalitet er vigtigere end mængden: en kommentar, der gentager, hvad koden gør (// increment i by 1) tilføjer intet, mens en kommentar, der forklarer, hvorfor en specifik algoritme blev valgt, tilføjer betydelig værdi.
Overholdelse af navngivningskonventionen måler procentdelen af identifikatorer (variabler, funktioner, klasser), der overholder projektets navngivningskonventioner. Automatiserede værktøjer kan håndhæve navngivningskonventioner som en del af linting-konfigurationen. Konsistent navngivning er en af de mest effektive læsbarhedsforbedringer, fordi det giver udviklere mulighed for at forudsige formålet med en identifikator alene ud fra dens navn, hvilket reducerer den kognitive belastning ved at læse ukendt kode.
Kodeduplikeringsrate måler procentdelen af kodebasen, der er duplikeret på tværs af flere placeringer. Duplikering over 5% markeres typisk. Duplikeret kode mangedobler vedligeholdelsesindsatsen: en fejl i duplikeret logik skal findes og rettes i hver kopi, og ændringer i adfærd skal anvendes konsekvent på tværs af alle kopier. Duplikering tilslører også den sande størrelse af kodebasen: et system, der ser ud til at have 100,000 linjer, kan indeholde 40,000 linjer unik logik og 60,000 linjer kopier.
Sikkerheds- og tekniske gældsmålinger
Teknisk gældsgrad defineres af SonarQube som forholdet mellem de estimerede afhjælpningsomkostninger og de estimerede udviklingsomkostninger for kodebasen. En teknisk gældsgrad under 5% betragtes som en ren kodebase; over 20% indikerer betydelig akkumuleret gæld, der vil bremse fremtidig udvikling betydeligt.
Tæthed af sikkerhedshotspots tæller antallet af sikkerhedshotspots, kodemønstre, der kræver sikkerhedsgennemgang, og ikke-bekræftede sårbarheder, pr. KLOC. Eksempler omfatter uparametriserede SQL-forespørgsler, brug af forældede kryptografiske funktioner og uvalideret inputhåndtering. Statiske analyseværktøjer identificerer disse mønstre og præsenterer dem som elementer, der kræver manuel sikkerhedsgennemgang.
Sårbarhedstæthed tæller bekræftede sikkerhedssårbarheder pr. KLOC, typisk kategoriseret efter CVSS-alvorlighed. Denne metrik er mest meningsfuld i forbindelse med sikkerhedsrevisioner efter udgivelsen eller løbende sikkerhedsovervågningspipelines.
Sådan måler du kodekvalitet: En praktisk tilgang
Måling af kodekvalitet er ikke en enkeltstående handling, men en kontinuerlig praksis, der er indlejret i udviklingsarbejdsgangen. En pragmatisk firefaset tilgang fungerer godt for teams, der starter fra en umålt kodebase.
Fase 1: Etablering af et udgangspunkt. Kør en komplet statisk analyse på tværs af kodebasen, før du foretager ændringer. Registrer de aktuelle værdier for cyklomatisk kompleksitetsfordeling, vedligeholdelsesindeks pr. fil, defektdensitet, dækning og duplikeringsrate. Denne baseline er udgangspunktet, som alle fremtidige målinger sammenlignes med. Uden en baseline kan du ikke afgøre, om ændringer forbedrer eller forringer kvaliteten.
Fase 2: Definer tærskler. Etabler acceptable tærskler for hver metrik, der er passende for konteksten. En kommerciel webapplikation og et sikkerhedskritisk medicinsk udstyr har forskellige passende tærskler. Dokumenter disse tærskler i projektets kvalitetsstandarder, og gør dem synlige for hele teamet.
Fase 3: Integrer i CI/CD. Konfigurer CI-pipelinen til at beregne nøglemetrikker for hver commit- eller pull-anmodning. Marker ændringer, der flytter en metrik uden for dens acceptable område. Bloker sammenføjninger, der introducerer ny kode med cyklomatisk kompleksitet over tærsklen, der reducerer dækningen under tærsklen, eller som introducerer kritiske statiske analyseresultater. Dette omdanner metriktærskler fra retningslinjer til håndhævede standarder.
Fase 4: Gennemgå tendenser, ikke øjebliksbilleder. En enkelt metrikmåling er informativ; en trend er handlingsrettet. Kode-churn med en opadgående tendens i et specifikt modul, dækning med en nedadgående tendens i løbet af udgivelsescyklussen, eller vedligeholdelsesindeks med en nedadgående tendens for en specifik fil signalerer alle problemer, som en snapshot-måling muligvis overser. Gennemgå metriktendenser ved hver sprint-retrospektiv.
Kodekvalitetsmålinger i Enterprise-, Agile- og sikkerhedskritiske kontekster
Kodekvalitetsmålinger i agil udvikling
Agile teams står over for en specifik udfordring med kodekvalitetsmålinger: vægtningen på at levere fungerende software i korte cyklusser kan skabe pres for at levere, før kvalitetsproblemerne er løst. Løsningen er ikke at opgive målinger, men at inkludere dem i definitionen af "færdig". En historie er ikke færdig, når funktionen fungerer; den er færdig, når funktionen fungerer, og den nye kode opfylder teamets kvalitetstærskler.
Ledende indikatorer i agile kontekster, metrikker der forudsiger fremtidige problemer, før de manifesterer sig, omfatter kodechurnrate, ny teknisk gæld introduceret pr. sprint og tendensen i antallet af statiske analyseresultater pr. udgivelse. Forsinkelsesindikatorer, metrikker der måler resultater, der allerede er produceret, omfatter defektdensitet fundet i test, tid brugt på vedligeholdelse versus nye funktioner og produktionshændelsesrate pr. udgivelse.
Kodekvalitet til teknisk due diligence
Teknisk due diligence i forbindelse med fusioner og opkøb, leverandørudvælgelse og systemanskaffelsesprocesser kræver en struktureret vurdering af kodekvalitet på tværs af hele kodebasen. De vigtigste målinger i denne sammenhæng er:
- Fordeling af vedligeholdelsesindeks: hvor stor en procentdel af kodebasen ligger i de røde, gule og grønne zoner
- Teknisk gældsprocentHvad er de anslåede afhjælpningsomkostninger i forhold til udviklingsomkostningerne?
- DefektdensitetHvor mange kendte defekter findes der pr. KLOC, og hvordan er dette sammenlignet med branchens benchmarks?
- Testdækning: hvilken procentdel af kodebasen er dækket af automatiserede tests, og på hvilket niveau (linje, branch, condition)
- AfhængighedssundhedHvor mange eksterne afhængigheder findes der, hvor mange er forældede eller opgivne, og hvor dybt forbundet er arkitekturen?
- Kode duplikering: hvilken andel af kodebasen der er duplikeret, hvilket indikerer vedligeholdelsesrisiko
Som undersøgt i forbindelse med konsekvensanalyse for vurdering af virksomhedskodeDet er afgørende at forstå ikke blot, hvad hver komponent scorer på kvalitetsmålinger, men også hvordan komponenterne afhænger af hinanden for at opnå præcis due diligence: et isoleret modul af lav kvalitet kan repræsentere håndterbare afhjælpningsomkostninger, mens det samme modul i midten af en tæt afhængighedsgraf repræsenterer en meget større risiko.
Kodekvalitet i sikkerhedskritiske og fintech-applikationer
Sikkerhedskritiske applikationer inden for luftfart, bilindustrien, medicinsk udstyr og industriel kontrol kræver kodekvalitetsstandarder, der går ud over typisk kommerciel software. Vigtigste forskelle:
- Grænser for cyklomatiske kompleksitet er typisk sat til 10 eller lavere, og undtagelser kræver formel begrundelse.
- Dækningskrav bruger MC/DC (Modified Condition/Decision Coverage) i stedet for linje- eller filialdækning
- Statisk analyse skal udføres med certificerede værktøjer, og overtrædelser skal dokumenteres og løses eller formelt accepteres.
- Kodeskift overvåges som en sikkerhedsindikator: høje ændringsrater i sikkerhedskritiske moduler udløser yderligere gennemgang og revalidering
Fintech-applikationer står over for lignende pres fra lovgivningsmæssige rammer. PCI DSS kræver sikre kodningsstandarder og kodegennemgangsprocesser. SOX-compliance for finansielle rapporteringssystemer kræver dokumenteret sporbarhed fra krav gennem kode til test. Kodekvalitetsmålinger giver objektivt bevis for, at disse processer fungerer: dækningsrapporter beviser, at der findes test, statiske analyserapporter beviser, at kendte sårbarhedsmønstre blev kontrolleret, og kompleksitetsrapporter viser, at korrekturlæsere med rimelighed kunne evaluere koden.
Kodekvalitetsmålinger efter sprog
Python-kodekvalitetsmålinger kan beregnes ved hjælp af radon (cyklomatisk kompleksitets- og vedligeholdelsesindeks) pylint (kodelugt og stilbrud), coverage.py (testdækning), bandit (sikkerhedsproblemer), og mypy or pyright (typekorrekthed). Vedligeholdelsesindekset i radon bruger en modificeret Halstead-formel kalibreret til Python. Grad A er over 20, grad B er 10-20, grad C er under 10.
RPG-kodekvalitet På IBM i kræver det specialiserede værktøjer, fordi metriske værktøjer af standardkvalitet ikke analyserer RPG-syntaks. SMART TS XL Leverer cyklomatisk kompleksitets-, kodelinjer- og afhængighedsanalyse til RPG-programmer, hvilket er særligt værdifuldt for IBM i-butikker, der administrerer store ældre kodebaser, hvor kvalitetsmåling tidligere har været umulig at automatisere.
Kodegennemgangsmålinger
Kodegennemgang er en kvalitetskontrolaktivitet, hvis egen effektivitet kan måles:
- Gennemgå dækningProcentdel af committed kode, der har gennemgået en formel gennemgang før sammenlægning
- Fejl fundet pr. gennemgangAntallet af defekter opdaget under gennemgangen i forhold til størrelsen af det gennemgåede ændringssæt
- Gennemgangstid: tiden fra en pull request åbnes til den gennemgås og flettes sammen
- Løsningsprocent for anmeldelser af kommentarer: procentdelen af anmeldelseskommentarer, der resulterer i en kodeændring versus at blive afvist
Højtydende teams viser typisk en dækning på over 90 % af gennemgangen, et gennemsnitligt antal fejl fundet pr. gennemgang på mellem 1-3 pr. hundrede gennemgåede linjer og korte ekspeditionstider. Gennemgangsmålinger hjælper med at identificere, om kodegennemgang fungerer som en kvalitetskontrol eller som en formalitet.
Kontinuerlig overvågning af kodekvalitet
Engangsmåling af kodekvalitet er betydeligt mindre værdifuld end kontinuerlig overvågning. Kodekvalitet er ikke en fast egenskab ved en kodebase; den ændrer sig med hver commit. En kodebase, der måler godt i dag, kan forringes betydeligt i tre sprints med forhastet udvikling, hvis kvalitetsmålinger ikke spores kontinuerligt.
Effektiv kontinuerlig overvågning af kodekvalitet omfatter:
- Beregning af metrik pr. commitcyklomatisk kompleksitet og statiske analyseresultater beregnet ved hvert tryk
- Trenddashboards: visuelle visninger af nøgletal over tid, opdateret dagligt eller pr. udgivelse
- Kvalitetsporte i CI/CDautomatiseret håndhævelse af minimumstærskler for metrikker, der påvirker vedligeholdelse, sikkerhed og defektrisiko
- Regressionsdetektion: advarer, når en metrik bevæger sig markant i den forkerte retning mellem udgivelser
De ledende indikatorer for forbedring af kodekvalitet, de signaler, der forudsiger, om kvaliteten vil være bedre eller dårligere i den næste udgivelse, er dækningstrenden, ny kompleksitet introduceret pr. sprint og forholdet mellem løste kodelugte og introducerede kodelugte. Når disse bevæger sig i den rigtige retning, vil kvaliteten forbedres. Når de ikke gør det, er forringelsen forudsigelig, før den er fuldt ud indtruffet.
Hvordan SMART TS XL Måler og forbedrer kodekvalitet
SMART TS XL beregner det fulde sæt af kodekvalitetsmålinger, der er beskrevet i denne artikel, på tværs af alle sprog og platforme i udviklingsmiljøet: COBOL, JCL, Java, .NET, Python, JavaScript, TypeScript, RPG, SQL og andre. Hvor de fleste kvalitetsværktøjer fungerer på et enkelt sprog ad gangen, SMART TS XL opbygger en samlet kvalitetsmodel for hele systemet, hvilket gør det muligt at sammenligne kvalitet på tværs af sprog, spore metrikker på systemniveau i stedet for filniveau og identificere kvalitetsproblemer på tværs af komponenter, som værktøjer på kun ét sprog ikke kan se.
For store virksomheder med store, flersprogede kodebaser, statisk kodeanalyse evne til SMART TS XL giver den baseline-måling, som teknisk due diligence, moderniseringsplanlægning inden for ældre teknologi og løbende kvalitetsforbedring alle kræver. afhængighedskortlægning Funktionaliteten udvider kvalitetsvurderingen til at omfatte strukturelle bekymringer: hvilke komponenter er mest afhængige af, hvilke ændringer har den største eksplosionsradius, og hvilke områder af kodebasen repræsenterer den højeste vedligeholdelsesrisiko, når kvalitetsmålinger kombineres med afhængighedscentralitet.
SMART TS XL's kodekvalitetsmålinger integreres med DevOps-pipelines gennem dens API, hvilket muliggør kvalitetsporte på CI/CD-laget. Når en commit introducerer en funktion med cyklomatisk kompleksitet over tærsklen, eller reducerer dækningen under det konfigurerede minimum, eller introducerer et kritisk statisk analysefund, kan pipelinen fejle build'et med en specifik diagnosticering, der fortæller udvikleren præcis, hvad der blev målt, og hvorfor den ikke nåede tærsklen. Dette flytter kvalitetshåndhævelse fra revisioner efter udgivelsen til feedback under udvikling, hvilket reducerer omkostningerne ved kvalitetsproblemer ved at fange dem på det punkt, hvor de er billigst at løse.
Kodekvalitet er en teamdisciplin, ikke en rapport
Værdien af kodekvalitetsmålinger bestemmes udelukkende af, hvad teams gør med dem. En kvartalsrapport om kodekvalitet, som ingen handler på, er værre end ingen rapport, fordi den skaber illusionen om, at kvaliteten styres, mens kodebasen forringes ukontrolleret. Målinger bliver værdifulde, når de driver specifikke handlinger: når en cyklomatisk kompleksitetsstigning i en ny funktion udløser en refactoring-samtale, før funktionen flettes sammen, når et fald i dækningen i et modul udløser en testsprint, når en stigende defektdensitet i en specifik komponent udløser en formel gennemgang af den pågældende komponents design.
At opbygge den kultur kræver, at metrikker synliggøres på det rigtige tidspunkt, under udviklingen, ikke efter udgivelsen, og at de forbindes med konkrete teamforpligtelser. Teams, der gennemgår deres kodekvalitetstendenser ved hvert sprint-retrospektiv, som inkluderer kvalitetstærskler i deres definition af "done", og som tager en metrisk regression lige så alvorligt som en funktionsregression, bygger kodebaser, der koster mindre at vedligeholde og producerer færre produktionshændelser over tid. Målingen er udgangspunktet. Disciplinen er det, der producerer resultatet.