Inleiding
Voor de ontwikkeling van het nieuwe tweedejaars onderwijs waren we op zoek naar een manier om eenvoudig een redelijk beargumenteerd cijfer te geven op een programmeeropdracht. Tijdens de gesprekken hierover rees het idee om de studenten de kwaliteit van hun code te laten beoordelen en hierop te laten reflecteren. Op die manier zouden ze er niet meer mee wegkomen door eenvoudig iets op te leveren dat werkt, maar zouden ze ook actief iets moeten zeggen over hun code.

Er zijn verschillende code-analysetools, maar de meeste hiervan zijn behoorlijk complex om te installeren, vereisen veel administratieve handelingen, gaan uit van heel strikte eisen die aan de code gesteld worden, of geven zoveel data dat je door de bomen het bos niet meer ziet. Nu was ik al een tijdje in gesprek met mensen van de Software Improvement Group, die met het analyseren van broncode hun brood verdienen. Enige tijd geleden heeft Joost Visser een praatje gehouden voor ons honoursprogramma naar aanleiding van een boekje dat hij vorig jaar heeft geschreven. Dit boekje heeft geresulteerd in de bettercodehub, een automatisch online analysetool die github-repositories op basis van de tien guidelines die Visser in zijn boekje beschrijft.

Analyse
Om eens te kijken hoe deze tool exact werkte, pushte ik mijn funda-harvester naar mijn github account en ging naar bettercodehub, waar ik hem onmiddellijk tussen mijn andere repositories zag staan. Om de code te analyseren hoefde ik alleen maar op het pijltje rechtsonder te klikken. Nadat ik de standaardconfiguratie had geselecteerd werd er een kloon gemaakt van de repo, die werd geanalyseerd en tenslotte weer verwijderd. Het totale proces duurde ongeveer een halve minuut (nu is die harvester niet heel groot, een kleine duizend regels code, maar evengoed is dit behoorlijk snel).

De resultaten worden in een overzichtelijk schema getoond, georganiseerd volgens de tien guidelines en de score bovenaan (Figuur 1). Je kunt op een guideline klikken om de details van de analyse te zien. Aan de linkerkant krijg je dan een beschrijving van de betreffende guideline te zien, en aan de rechterkant de resultaten van de analyse. In Figuur 2 is te zien hoe de harvester scoorde op het onderdeel ‘complexiteit’. De grafiek onderaan geeft de totale score van de code-base weer, en de teksten eronder zijn hyperlinks waarmee je de betreffende classen in het bovenste deel kunt laten zien. Deze klassen zijn op hun beurt weer hyperlinks naar de code van de refactoring candidates zelf. Zo zie je bijvoorbeeld in Figuur 3 dat hier nog een refactoring mogelijk is, omdat er een TODO in productiecode staat.

1.overzicht

Figuur 1: overzicht van de resultaten.

2.simple_units_code

Figuur 2: het detail-scherm van één van de tien guidelines.

3.codevoorbeeld

Figuur 3: een refactor candidate met de betreffende regel gearceerd.

Nadat je deze analyse hebt bekeken kun je onderdelen hiervan op je takenlijst zetten. Deze lijst komt dan weer terug op je dashboard, wat direct als input voor je retrospective kan fungeren of je nieuwe actielijst kan definiëren. Nadat je deze wijzigingen hebt ingevoerd en je een nieuwe push naar github doet kun je de analyse herhalen en zie je gelijk de verbeteringen in de analyse terugkomen. Het idee van bettercodehub is dat het op die manier een inherent onderdeel wordt van de productiecyclus.

4.tasklist

Figuur 4: de resultaten met een hoeveelheid taken die daaruit naar voren is gekomen.

Nadat ik mijn eigen code had geanalyseerd, heb ik ook nog even een studentenuitwerking van een tweedejaars project geanalyseerd (een project dat qua lines of code vergelijkbaar is met de harvester). Zoals blijkt uit Figuur 5a en b scoort deze code op een aantal onderdelen minder goed dan mijn code. Op basis van die soort vergelijkingen kun je dus redelijk gefundeerd stellen dat de ene code beter is dan de andere – wat zich weer kan laten vertalen in een cijfer.

5a.overzicht_harvester

Figuur 5a: overzicht en score van de funda-harvester.

5b.overzicht_studenten

Figuur 5a: overzicht en score van een studentenproject.

Conclusie
Deze bettercodehub heeft een aantal voordelen boven de meer traditionele analysetools. Allereerst is het online en gekoppeld aan github, dus het aan de praat krijgen hiervan kost eigenlijk geen tijd. Een ander groot voordeel is dat je niet wordt doodgegooid met allerlei details en rode lijntjes, zoals bijvoorbeeld met metrics for Eclipse het geval is. Tenslotte geeft het direct feedback met mogelijke refactoring-slagen, waarbij je op eenvoudige manier input kunt krijgen voor je retrospective. Al met al is dit de beste automatische analysetool die ik ken.