{"id":811,"date":"2017-01-10T11:04:54","date_gmt":"2017-01-10T09:04:54","guid":{"rendered":"https:\/\/www.bartbarnard.nl\/blog\/?p=811"},"modified":"2017-01-11T11:32:24","modified_gmt":"2017-01-11T09:32:24","slug":"bettercodehub","status":"publish","type":"post","link":"https:\/\/www.bartbarnard.nl\/blog\/bettercodehub\/","title":{"rendered":"bettercodehub"},"content":{"rendered":"<p><strong>Inleiding<\/strong><br \/>\nVoor 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.<\/p>\n<p>Er zijn <a href=\"https:\/\/www.owasp.org\/index.php\/Source_Code_Analysis_Tools\">verschillende code-analysetools<\/a>, maar de meeste hiervan zijn <a href=\"https:\/\/www.sonarqube.org\/\">behoorlijk complex om te installeren<\/a>, vereisen <a href=\"https:\/\/about.sonarqube.com\/get-started\/\">veel administratieve handelingen<\/a>, gaan uit van heel strikte eisen die aan de code gesteld worden, of geven <a href=\"http:\/\/metrics.sourceforge.net\/\">zoveel data<\/a> dat je door de bomen het bos niet meer ziet. Nu was ik al een tijdje in gesprek met mensen van de <a href=\"https:\/\/www.sig.eu\/\">Software Improvement Group<\/a>, die met het analyseren van broncode hun brood verdienen. Enige tijd geleden heeft <a href=\"http:\/\/www.cs.ru.nl\/J.Visser\/\">Joost Visser<\/a> een praatje gehouden <a href=\"https:\/\/twitter.com\/sig_eu\/status\/729983620337831936\">voor ons honoursprogramma<\/a> naar aanleiding van <a href=\"http:\/\/amzn.eu\/gbpD31v\">een boekje<\/a> dat hij vorig jaar heeft geschreven. Dit boekje heeft geresulteerd in de <a href=\"https:\/\/bettercodehub.com\/\">bettercodehub<\/a>, een automatisch online analysetool die github-repositories op basis van de tien <em>guidelines<\/em> die Visser in zijn boekje beschrijft.<\/p>\n<p><strong>Analyse<\/strong><br \/>\nOm eens te kijken hoe deze tool exact werkte, pushte ik <a href=\"https:\/\/www.bartbarnard.nl\/blog\/?p=599\">mijn funda-harvester <\/a>naar mijn github account en ging naar <a href=\"https:\/\/bettercodehub.com\/\">bettercodehub<\/a>, 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).<\/p>\n<p>De resultaten worden in een overzichtelijk schema getoond, georganiseerd volgens de tien <em>guidelines<\/em> en de score bovenaan (Figuur 1). Je kunt op een <em>guideline<\/em> klikken om de details van de analyse te zien. Aan de linkerkant krijg je dan een beschrijving van de betreffende <em>guideline<\/em> te zien, en aan de rechterkant de resultaten van de analyse. In Figuur 2 is te zien hoe de harvester scoorde op het onderdeel &#8216;complexiteit&#8217;. 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 <em>refactoring candidates<\/em> zelf. Zo zie je bijvoorbeeld in Figuur 3 dat hier nog een refactoring mogelijk is, omdat er een <em>TODO<\/em> in productiecode staat.<\/p>\n<div id=\"attachment_812\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/1.overzicht.png\"><img aria-describedby=\"caption-attachment-812\" loading=\"lazy\" class=\"wp-image-812 size-medium\" src=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/1.overzicht-300x190.png\" alt=\"1.overzicht\" width=\"300\" height=\"190\" srcset=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/1.overzicht-300x190.png 300w, https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/1.overzicht.png 884w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-812\" class=\"wp-caption-text\">Figuur 1: overzicht van de resultaten.<\/p><\/div>\n<div id=\"attachment_813\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/2.simple_units_code.png\"><img aria-describedby=\"caption-attachment-813\" loading=\"lazy\" class=\"wp-image-813 size-medium\" src=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/2.simple_units_code-300x220.png\" alt=\"2.simple_units_code\" width=\"300\" height=\"220\" srcset=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/2.simple_units_code-300x220.png 300w, https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/2.simple_units_code.png 862w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-813\" class=\"wp-caption-text\">Figuur 2: het detail-scherm van \u00e9\u00e9n van de tien guidelines.<\/p><\/div>\n<div id=\"attachment_814\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/3.codevoorbeeld.png\"><img aria-describedby=\"caption-attachment-814\" loading=\"lazy\" class=\"wp-image-814 size-medium\" src=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/3.codevoorbeeld-300x183.png\" alt=\"3.codevoorbeeld\" width=\"300\" height=\"183\" srcset=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/3.codevoorbeeld-300x183.png 300w, https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/3.codevoorbeeld.png 972w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-814\" class=\"wp-caption-text\">Figuur 3: een refactor candidate met de betreffende regel gearceerd.<\/p><\/div>\n<p>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 <em>retrospective<\/em> kan fungeren of je nieuwe actielijst kan defini\u00ebren. 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.<\/p>\n<div id=\"attachment_815\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/4.tasklist.png\"><img aria-describedby=\"caption-attachment-815\" loading=\"lazy\" class=\"wp-image-815 size-medium\" src=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/4.tasklist-300x198.png\" alt=\"4.tasklist\" width=\"300\" height=\"198\" srcset=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/4.tasklist-300x198.png 300w, https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/4.tasklist.png 841w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-815\" class=\"wp-caption-text\">Figuur 4: de resultaten met een hoeveelheid taken die daaruit naar voren is gekomen.<\/p><\/div>\n<p>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 \u2013 wat zich weer kan laten vertalen in een cijfer.<\/p>\n<div id=\"attachment_816\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/5a.overzicht_harvester.png\"><img aria-describedby=\"caption-attachment-816\" loading=\"lazy\" class=\"wp-image-816 size-medium\" src=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/5a.overzicht_harvester-300x115.png\" alt=\"5a.overzicht_harvester\" width=\"300\" height=\"115\" srcset=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/5a.overzicht_harvester-300x115.png 300w, https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/5a.overzicht_harvester.png 537w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-816\" class=\"wp-caption-text\">Figuur 5a: overzicht en score van de funda-harvester.<\/p><\/div>\n<div id=\"attachment_817\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/5b.overzicht_studenten.png\"><img aria-describedby=\"caption-attachment-817\" loading=\"lazy\" class=\"wp-image-817 size-medium\" src=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/5b.overzicht_studenten-300x112.png\" alt=\"5b.overzicht_studenten\" width=\"300\" height=\"112\" srcset=\"https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/5b.overzicht_studenten-300x112.png 300w, https:\/\/www.bartbarnard.nl\/blog\/wp-content\/uploads\/2017\/01\/5b.overzicht_studenten.png 542w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-817\" class=\"wp-caption-text\">Figuur 5a: overzicht en score van een studentenproject.<\/p><\/div>\n<p><strong>Conclusie<\/strong><br \/>\nDeze <a href=\"https:\/\/bettercodehub.com\/\">bettercodehub<\/a> 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.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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<\/p>\n<p class=\"more-link\"><a href=\"https:\/\/www.bartbarnard.nl\/blog\/bettercodehub\/\" class=\"themebutton2\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[19],"tags":[],"_links":{"self":[{"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/posts\/811"}],"collection":[{"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/comments?post=811"}],"version-history":[{"count":2,"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/posts\/811\/revisions"}],"predecessor-version":[{"id":819,"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/posts\/811\/revisions\/819"}],"wp:attachment":[{"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/media?parent=811"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/categories?post=811"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bartbarnard.nl\/blog\/wp-json\/wp\/v2\/tags?post=811"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}