De menselijke factor in software testing – van vloek tot zegen

Ons leven is sterk afhankelijk van software, van de auto die we rijden tot de bankpas waarmee we betalen. En als die software degelijk is – dat wil zeggen goed getest, zodat maar weinig bugs de gebruiker bereiken – dan wordt ons leven er vooral beter van. "Maar de realiteit is helaas dat ontwikkelaars hun software niet altijd willen of kunnen testen, en hun leidinggevenden net zo min," verklaart Andy Zaidman. Als professor software engineering onderzoekt hij daarom, betere en robuustere manieren van software testing, met oog voor zowel de technische áls de menselijke factor. Met als doel simpelweg nóg betere software.

Vraag een gemiddelde programmeur hoeveel tijd wordt besteed aan het schrijven van nieuwe code, en hoeveel tijd wordt besteed aan het controleren van die code, dan zal het antwoord waarschijnlijk ‘50/50’ zijn. “Maar als je goed gaat kijken, en dat hebben we gedaan, is dat bijna nooit het geval” aldus Zaidman, “een gemiddelde programmeur besteedt ongeveer 25%  van  hun tijd aan testen.” Als zo’n gebrek aan aandacht voor kwaliteit consequent is, dan kunnen problemen in de code zich opstapelen, totdat het een keer helemaal misgaat. “Naar schatting loopt de economie van de VS elk jaar 1.7 miljard dollar mis door softwarebugs. En dat is alleen omzet, het kan nog veel erger. Stel bijvoorbeeld dat kritieke software-systemen op een Intensive Care-afdeling in een ziekenhuis plotseling uitvallen. Kortom, hoe afhankelijker we zijn van software, hoe belangrijker het is dat die software degelijk is. Daarom ben ik zo gemotiveerd om alle problemen rondom dit essentiële onderdeel  van software engineering aan te pakken.”

There’s a bug in the system

Terug naar de basis: wat is ‘testing’ en wat zijn de fouten die het kan voorkomen? Heel simpel gezegd is de softwarecode een instructie voor de computer, in de kern vergelijkbaar met instructies als ‘als de melk op is, koop dan nieuwe’. Bij het schrijven van dat soort code is de truc om de instructies zo compleet mogelijk te maken  – dan gaat de code werken. Maar als je je bedenkt dat moderne code, bijvoorbeeld voor een auto, al snel miljoenen lijnen code bevat, vaak geschreven door honderden of zelfs duizenden ontwikkelaars, verspreid over vele jaren, dan begrijp je dat er een grote kans is dat er fouten in de code terechtkomen. Door problemen in de afstemming, of door simpelweg aandachtsgebrek. Nieuwe software is daardoor vrijwel nooit helemaal correct of volledig, en dat betekent dat de computer op onvoorziene momenten op een dwaalspoor kan komen. Stel bijvoorbeeld dat er wel melk is, maar dat de houdbaarheidsdatum verstreken is, dan werken de eerder genoemde instructies niet meer. Althans, niet als je verwacht verse melk te vinden. Dit noemt men in vaktermen een ‘bug’.

Het grote voordeel én nadeel van software is dat je het continu kan aanpassen

Maar zo onschuldig als zure melk zijn softwarebugs dus niet altijd.  Zo gaf online betaalservice PayPal jarenlang elke dag nieuw koopkrediet aan een willekeurige man uit de VS – totdat zijn kredietvermogen opliep tot 92 miljard . “Dat is een heel goed voorbeeld van hoe de veelvoorkomende bedrijfsfilosofie ‘move fast  and break things’ tot totaal onvoorziene situaties kan leiden. Het grote voordeel én nadeel van software is dat je het continu kan aanpassen. Dus als er een foutje in de code blijkt te zitten, dan kun je dat gewoon oplossen met een update. Maar dan ga je er wel vanuit dat zo’n bug onschuldig is, en dat je hem opspoort voordat het écht fout gaat. Dat is lang niet altijd het geval, helaas. Zelfs bij auto’s, waar de ‘hardware’ altijd ontzettend grondig wordt  gecontroleerd: doen de remmen het, zijn de wielen goed uitgelijnd, noem het maar. Maar de software wordt soms met talloze gebreken meegeleverd uit de fabriek,” concludeert Zaidman met zichtbare frustratie.

Met gezonde tegenzin op speurtocht

“Vaak komen bugs op hele specifieke momenten, met hele specifieke randvoorwaarden voor. Testen is daarom niet gemakkelijk en kost veel tijd en aandacht. Bovendien: mensen zijn liever creatief bezig met het maken van iets nieuws, in plaats van destructief, waarmee ik bedoel dat je je eigen creatie kritisch tegen het licht houdt.” Allemaal redenen waarom mensen liever niet veel of vaak testen, maar ook de reden waarom ontwikkelaars inschatten zo’n 50% van hun tijd eraan te besteden, waar het eigenlijk maar 25% is. Daarbij speelt ‘chronoceptie’ een belangrijke rol. “Het idee dat vervelende taken, zoals de afwas, heel lang lijken te duren, terwijl leuke taken als koken heel snel voorbij gaan,” vat Zaidman samen. “Bij het verbeteren van testprocedures moet je ook aandacht geven aan dat soort psychologische verschijnselen.”

Bij het verbeteren van testprocedures moet je ook aandacht geven aan psychologische verschijnselen

Behalve die psychologische dimensie, spelen ook groepsprocessen een belangrijke rol. Immers is software-ontwikkeling vaak een groepsproject. Testen komt er daarom vaak op neer dat je andermans werk moet gaan bekritiseren: “Dat vinden mensen moeilijk. Heel logisch natuurlijk.”

Eén van de mogelijke oplossingen op dat probleem is het inzetten van artificiële intelligentie (AI).  AI zal namelijk nooit klagen dat testen saai is. “Maar we liepen al heel snel tegen twee grote problemen aan. Zo veronderstelt een AI programma dat een stuk software test dat de huidige versie van die software foutloos is, en dat enkel aanpassingen aan die software fouten kunnen bevatten.   Maar misschien is het tegenovergestelde wel waar? Daarnaast is het natuurlijk zo dat testen niet enkel moeten laten zien dat er fouten in een stuk code zitten, ze moeten ook helpen bij het opsporen van die fout: welke instructies moeten aangepast worden? Maar die AI-gegenereerde testen zijn helemaal niet zo makkelijk te begrijpen voor een software ontwikkelaar, dus daar schieten we ook niet heel erg mee op.”

Veel meer gereedschap in de koffer

Ondanks de twee tekortkomingen was er na de eerste testen één ding overduidelijk: AI is ontzettend efficient in het controleren van code die getest moet worden, tot in quasi alle uithoeken van die code..   AI geeft, om het in vaktermen uit te drukken, een bijna perfecte ‘coverage’. Terug naar de tekentafel dus: hoe kan je die unieke kracht van AI toch gebruiken? In zijn onderzoek probeert Zaidman AI samen te laten werken met mensen. “We kunnen een testopzet aan het AI-algoritme geven, zodat die het tot in de laatste uithoeken kan doorontwikkelen en verder te testen. De resultaten van die testen zijn dan makkelijker te begrijpen door de ontwikkelaar, waardoor die minder tijd kwijt is om op zoek te gaan naar de oorzaak van de bug..

Hoe kan je de unieke kracht van AI toch gebruiken?

Waar zo’n grootschalige en grondige aanpak toe kan leiden ervaart Zaidman elke dag als docent. “Er zijn weinig universiteiten waar grondig en goed testen zo’n integraal onderdeel is van het onderwijs als hier. Tijdens mijn bachelorvak in het eerste kwartaal van het eerste jaar vraag ik studenten al vanaf de derde week om alle code die ze inleveren te testen.” Volgens Zaidman kan dit in eerste instantie tot onbegrip leiden, sommige opdrachten zijn immers maar 10 regels code – maar ook die moeten grondig getest worden. “Studenten zeggen dan: dit is zo weinig code, ik zie gelijk dat het goed zit. En dat klopt vaak ook, maar die code wordt al snel 10 keer zo lang, en dan wordt gewoon “zien” dat het programma goed is een stuk lastiger. Dan moet er zeker getest worden en daarom kan je er niet op tijd genoeg mee beginnen.” In latere fases van de bachelor bijvoorbeeld, ziet Zaidman dat die grondige filosofie wel zijn vruchten afwerpt: de code is dan meestal consequent getest, en daarom aantoonbaar beter en robuuster. Dat laat nog maar eens zien dat je voor het verbeteren van code – en dus het verbeteren van ons volledig digitale leven – meer vereist dan alleen technische oplossingen. De menselijke dimensie is even belangrijk.