Verbeter je code-kwaliteit

Nog niet eens zo heel lang geleden had ik geen idee hoe belangrijk code van goede kwaliteit is voor het laten slagen van een project. Als junior projectmedewerker snapte ik de toegevoegde waarde van unit tests nog niet. Het bouwen aan een nieuwe feature is immers leuker dan het testen en herschrijven van code. Niet verrassend: op een dag ging het helemaal mis.

Wat vooraf ging…
Met een Scrum-team van vijf collega’s werkten we aan het beheer van een systeem met honderden gebruikers. Het systeem is gebouwd met Java 6. De opdrachtgever wilde steeds meer features introduceren en er was geen tijd om code op te schonen of te verbeteren. Hierdoor werd de applicatie steeds langzamer. Plotseling moesten gebruikers tientallen seconden wachten op een response van de server, in plaats van milliseconden… En dat gebeurde, terwijl deze revisie een release kandidaat was, die natuurlijk een no-go kreeg. Kortom, een fiasco.

Vervolgens kwamen er de vanzelfsprekende vragen vanuit de klant. “Waarom komt dit pas tijdens de go/no-go test aan het licht? Waarom was dit niet eerder voorzien? Waardoor is deze fout geïntroduceerd?” Zoals je je misschien wel kunt voorstellen, was het geen prettig gesprek. Toen werden de getallen over de code-kwaliteit bekend gemaakt. Conclusie: het was slechter dan de norm en wij als projectteam waren de verantwoordelijken. Tijdens de ontwikkeluren waren we alleen maar bezig geweest met code toevoegen en er was geen motivatie om de code te verbeteren. Als we onlogische code tegenkwamen, dan bedachten we een workaround in plaats van een gestructureerde oplossing, want dat was op dat moment sneller. Alle workarounds stapelden zich op, en voor we het wisten hadden we een blocking issue gecreëerd. Het project liep in het honderd en het vertrouwen van onze klant was flink aangetast. Hoe hadden we dit kunnen voorkomen?

Het begin
Voordat ik aan de slag ging bij CGI was ik een fanatiek gamende student. Naast mijn opleiding Game Studies aan de Universiteit van Amsterdam, besteedde ik minimaal 25 uur per week aan gamen. Kort gezegd: ik vind games tof. Maar hoe komt het dat ik zoveel tijd besteed aan games en gamen? En hoe kan ik het antwoord hierop, dat ik heb geleerd tijdens mijn studie, toepassen in de praktijk?

Motivatie. Veel in de wereld om ons heen draait om motivatie. Sport is motivatie. Games draaien om motivatie. Werk gaat om motivatie. Toen ik erachter kwam, dat er geen motivatie of prikkel was om onze code-kwaliteit te verbeteren, gingen er wat belletjes rinkelen.  We kunnen veel leren van hoe games motiveren en door middel van gamificatie wilde ik gaan proberen om dat ook voor elkaar te krijgen binnen mijn eigen team.

Simpel gezegd is gamificatie het toepassen van game-mechanieken in de werkelijke wereld om problemen op te lossen. Veel mensen zijn er al in aanraking mee gekomen. Voorbeelden van applicaties die gegamificeerde feedback geven om gebruikers te motiveren om bepaalde acties uit te voeren zijn Runkeeper en LinkedIn. FoldIT gebruikt bijvoorbeeld een hele game-structuur (bestaande uit punten, leaderboards, etc.) om spelers te motiveren en te betrekken. Zo zijn er talloze voorbeelden van succesvolle (en ook minder succesvolle) toepassingen van gamificatie.  Dit wetende zijn mijn projectteam en ik aan de slag gegaan om een applicatie te ontwerpen, die programmeurs motiveert om hoge kwaliteit code op te leveren. Hieruit is Quincy Adams geboren: your quality code assistant.

Een connectie met Jenkins bleek handig om de benodigde data te verzamelen over de codebase. Voor het prototype lag de focus op test coverage, maar zolang de data in Jenkins beschikbaar is, kunnen alle soorten gegevens worden uitgelezen. Hierdoor biedt de applicatie meer mogelijkheden dan enkel feedback geven op test coverage. Om het principe van frequent verschaffen van feedback aan de gebruiker zo goed mogelijk uitvoerbaar te maken, is besloten om van Quincy Adams een mobiele applicatie te maken voor Android. Op het moment dat iemand iets commit, dan wordt hier middels een notificatie feedback op gegeven. Communicatie tussen de applicatie en de server instantie in de Microsoft Azure Cloud gaat via een REST interface. De Quincy-server is ontwikkeld met Java EE 7 en bevat de game-engine voor de Quincy Adams app.  Deze game-engine regelt het bijhouden van spelers (committers) en het uitdelen van scores aan een build. De informatie over de build jobs en kwaliteit van de code wordt via de REST interface van Jenkins opgevraagd.

Met de basis van de applicaties gereed was het tijd om met de gamificatie aan de slag te gaan. Met een team bestaande uit programmeurs en enthousiaste gamers hebben we onderzocht welke mechanismen uit games ervoor zorgen, dat deze als motiverend en stimulerend worden ervaren. Uiteindelijk zijn we uitgekomen bij vier basisprincipes: competitie, groepsdruk, progressie en beloningssystemen.

Competitie
Competitie is één van de sterkste vormen van motivatie en dus overal te vinden. Welke land heeft het beste voetbalteam? Welk bedrijf heeft de hoogste winst? De beste advocaten adverteren vaak met kreten als “advocaten die elke zaak winnen”. Games gebruiken competitie ook vaak om spelers aan het spelen te houden. De meest populaire games van tegenwoordig zijn extreem competitief. In DOTA 2 strijden spelers bijvoorbeeld in een 5 tegen 5 match met elkaar. Het winnende team krijgt een beloning in de vorm van punten, terwijl het verliezende team als straf puntenaftrek krijgt. Dit gaat via een zogenaamd ELO-systeem, een rating-systeem vernoemd naar zijn ontwerper Arpad Elo. ELO-systemen worden in sporten zoals schaken ingezet om te bepalen hoe goed iemand is om ervoor te zorgen dat een speler tegen een vergelijkbare tegenspeler strijdt. Alle grote games van dit moment (DOTA 2, Counter-Strike, League of Legends, Hearthstone en World of Warcraft) maken gebruik van dit systeem. Immers, als speler wil je erkenning krijgen voor de tijd en moeite die je in een spel steekt.  Daarom doe je vaak je best om hoger op de “ELO-ladder” te klimmen.

Gebruik maken van een ELO is niet de enige manier om competitie aan te sporen binnen een spel. Een alternatief is het werken met ranglijsten. Tegenwoordig worden ranglijsten bijna overal voor gebruikt. Bij transportbedrijven hangen ranglijsten om te kijken wie de meest zuinige bestuurders zijn. Apps als Runkeeper en LinkedIn gebruiken ranglijsten om te bepalen welke gebruikers de beste profielen hebben. Binnen Quincy hebben ranglijsten het doel om te bepalen wie het meest heeft bijgedragen aan het verbeteren van de code-kwaliteit. Hoe beter de bijdrage, des te hoger de positie op de ranglijst. Dat wordt door toekenning van punten bepaald, een soort beloningssysteem. De spelers verdienen punten met hun commits, die wordt bijgehouden door de app en wordt weergegeven in de ranglijst. Hoe meer punten je hebt, hoe hoger je staat.

Groepsdruk
Groepsdruk wordt gedefinieerd als de “sociale dwang binnen een groep, waardoor iemand tot bepaald gedrag kan vervallen”. De associatie, die men hiermee heeft, is eerder negatief dan positief. Negatief als men er niet in slaagt om zich te conformeren aan de normen en waarden die in een groep heersen, waardoor aansluiting en aanvaarding mislukt. Toch kan groepsdruk ook een positieve invloed hebben op mensen. Als de aanpassing van een individu aan de groep succesvol is, levert dit aanvaarding, erkenning of aanzien op. Gevolgen met een sterk motiverende werking, want we willen graag ergens bij horen. Een direct gevolg van groepsdruk is teamwerk/teamgevoel. Mocht een groep mensen zich kunnen conformeren aan het gedrag van een groep, dan krijg je een sterker teamgevoel. Als de meerderheid van een team dan zuinig rijdt, is het waarschijnlijker dat de rest van het team dit gedrag overneemt.  Op bedrijfsniveau is er sprake van een bedrijfscultuur: nieuwe werknemers nemen de cultuur van het bedrijf over, om er onderdeel van te worden. Kortom: groepsdruk kan een positieve motivator zijn voor gedragsverandering.

Binnen games wordt vaak ook gebruik gemaakt van groepsdruk. Online games gebruiken zogenaamde “guilds”. Dit zijn groepen, die mensen zelf kunnen oprichten en waar ze andere mensen voor kunnen uitnodigen. Samen met jouw guild heb je als doel om zo goed mogelijk te presteren en is de guild gebaat bij een goede samenwerking.

Binnen Quincy was het creëren van teamgevoel simpel te ontwikkelen: laat gebruikers in reeds bestaande teams werken; hun eigen projectteams. Door strafmechanismes worden teamgenoten gemotiveerd om code van goede kwaliteit te committen.  Als iemand een falende build commit, dan heeft diegene 15 minuten om de build te fixen. Als dit niet lukt, ontvangt het volledige team een notificatie hiervan. Daarnaast kan iedereen de puntentelling zien van zijn teamgenoten. Het uiteindelijke doel is om verschillende teams met elkaar te vergelijken en in beeld te krijgen welk projectteam het meeste doet om de code-kwaliteit van het project hoog te houden.

Progressie
Binnen games is progressie één van de belangrijkste mechanismen om spelers gemotiveerd te houden. Spelers moeten altijd ervaren, dat ze vooruitgang boeken in een game. Stagnatie zorgt vaak voor frustratie, met als gevaar dat een game gestaakt wordt. Om dit te voorkomen introduceren veel games puntensystemen en levels. Zo krijgen spelers het gevoel dat ze nóg beter kunnen worden en dat de tijd die ze in de game investeren niet voor niets is geweest.

Ook hierbij verschilt de werking van een game niet veel met de realiteit. In het bedrijfsleven wordt vaak gebruik gemaakt van motivatie middels progressie. Een voorbeeld is het geven van een promotie of scholing om de medewerker perspectief en groeimogelijkheden te bieden.

Progressie maakt een belangrijk deel uit van Quincy. Er worden hier drie verschillende manieren voor toegepast. Allereerst moet het projectteam kunnen zien, dat de kwaliteit van hun code vooruit gaat en dat ze zelf ook beter worden. Daarom krijgen ze een overzicht te zien met al hun builds en de bijbehorende scores. Daarmee kunnen ze controleren of ze beter worden. Ten tweede verliezen spelers/gebruikers geen punten. Zo ervaren ze uitsluitend vooruitgang en geen achteruitgang. Als laatste ontvangen gebruikers tips, gebaseerd op de code-base. Hoe beter de kwaliteit van de code, hoe specifieker de tips worden. Hoe slechter de kwaliteit, hoe algemener de tips. Wordt een tip op de juiste manier toegepast, dan levert dit een aanvullende beloning op.

Beloningssystemen
Belonen is de beste manier om te motiveren voor gedragsverandering. De honden van Pavlov liggen aan de basis hiervan: juist gewenst gedrag belonen en ongewenst gedrag ontmoedigen. Games maken gebruik van ditzelfde mechanisme. Ze leren spelers hoe ze moeten spelen door juiste acties te belonen en verkeerde acties te bestraffen. Als een speler een tegenstander verslaat, dan wordt hij daarvoor beloond. Zolang dat niet lukt, kan hij niet verder in het spel. Ook wordt hij met materialen beloond: door goud, badges of items te geven, experience points toe te kennen en de speler in levels te laten stijgen.

 

In het bedrijfsleven willen werknemers ook graag beloond worden als ze iets goeds doen. Bij een promotie volgt vaak een salarisverhoging als beloning. Een “werknemer van de maand” model is een andere manier om de meest gemotiveerde personen te belonen.

Binnen Quincy worden gebruikers beloond door het behalen van punten. Hoe hoger de kwaliteit van unit tests, des te meer punten iemand krijgt. Doet iemand iets met een gegeven tip, dan krijgt hij daar extra punten voor. Binnen Quincy zitten ook meerdere uitdagingen, die aangeboden kunnen worden door bijvoorbeeld de product owner of projectmanager. Als teamleden die uitdagingen aangaan en succesvol afronden, ontvangt het team extra punten. Uiteindelijk willen we dat spelers verdere personalisatie-opties ontgrendelen door het verzamelen van punten, waar de punten als valuta gebruikt kunnen worden. Daarmee krijgen de beloningen meer waarde voor de speler.
 

Tot slot
Gamificatie is een nieuw en geschikt middel om gebruikers te motiveren en te stimuleren. Met Quincy Adams hebben we stappen gezet om programmeurs te motiveren om betere code op te leveren. Maar nog belangrijker, we hopen dat het dankzij de applicatie nog leuker wordt voor programmeurs om aan de slag te gaan met hun project. Gebruik van Quincy binnen ons eigen projectteam leverden heel positieve ervaringen op. Bij een falende build zaten teamleden druk met elkaar te telefoneren en bij een geslaagde build draagt het hele team vol trots de resultaten. De kwaliteit van de code is verbeterd en de test coverage is gestegen. Al met al komt het de sfeer in het volledige team ten goede! Na deze test zijn we van plan om Quincy breder in te zetten binnen CGI. We hopen in de nabije toekomst input en feedback te krijgen van de leden van NLJUG. We zijn benieuwd!