bigstock-Code-bug-13044284

Er is een verschil tussen mensen en computers. Als programmeur en docent werk ik met beide, dus ik zou het moeten weten. Mensen zijn kwetsbaar. Neem nou die oude dame, die ik weleens tegenkom. Ze is laatst op de stoep vastgelopen met haar rollator. Gevallen, nekwervel gebroken. Geen zenuwen beschadigd, het is een klein wonder. De nekwervel moet wel weer aangroeien. En zal dat doen. Maar wat gebeurt er als een computer vastloopt? Dat is vrijwel altijd een software-kwestie. En wat doen we eraan: we herstarten de computer en beginnen opnieuw. Da’s met mensen toch een stuk lastiger.

Ik heb dus een eenvoudig vak, een arts zou er jaloers op zijn. Als de computer vastloopt door een fout in mijn software dan moet ik die fout zien te vinden en oplossen. Zo’n fout heet een bug, volgens de overlevering omdat computers vroeger grote aantallen mechanische onderdelen hadden, relais, die voortdurend open en dicht gingen om de computer te laten werken. Als daar een insect tussen kwam, een bug in het engels, dan was er storing in de computer. Tegenwoordig is een bug meestal een programmeerfout, een menselijke denkfout. Het vinden en verwijderen van de bug heet debugging. En dat is een vak apart. Zo’n bug is namelijk, in tegenstelling tot vroeger, niet meer met het blote oog te vinden. Hij is niet eens tastbaar.

De allereerste voorwaarde voor het oplossen van een bug is het kunnen reproduceren van de situatie waarin de fout optreedt. Soms is dat eenvoudig, omdat goed gemaakte software zo veel mogelijk informatie geeft over de plek waar het fout is gegaan. In Java zou er een exception kunnen optreden, die zichzelf goed beschrijft in een log file. Soms is het afhankelijk van externe omstandigheden, en moet je heel vaak “herstarten” om alle mogelijke externe omstandigheden uit te proberen. Maar als dat eenmaal lukt, dan komt de grote magie: je zet een breakpoint. Je laat de software stoppen vlak voor de fout optreedt. Niet echt stoppen, maar meer pauzeren. Alle gegevens die op dat moment bekend zijn, blijven bewaard en kunnen worden bekeken. Hopelijk geven ze een aanwijzing voor wat er op dat moment al fout is gegaan, of nog fout zal gaan. Daarna kun je weer verder gaan, om te zien wat er gaat gebeuren. Dat kan zelfs in stappen, regel voor regel. Na iedere stap kan je dan weer zien hoe je verder bent gekomen. Of je kunt weer helemaal zonder pauzes doorstarten (en het nogmaals fout laten lopen, natuurlijk).

Allemaal nog wel te doen, zeker met de software tools die programmeurs tot hun beschikking hebben. Het wordt pas echt moeilijk als er meerdere externe of interne omstandigheden zijn, die niet altijd op hetzelfde moment plaatsvinden. Er zijn dan ontelbaar veel mogelijke combinaties van omstandigheden. Niet te reproduceren, omdat ze in willekeurige combinaties plaatsvinden. Dit noemen we een timing probleem. De nachtmerrie van een programmeur. Letterlijk, vaak. Wat doe je eraan? Blijven proberen, maar vooral: nadenken. Wat kan ik fout hebben gedaan? Welke combinatie zou funest kunnen zijn? En anders: elimineren. Zo veel mogelijk delen van de code uitschakelen. De externe omstandigheden één voor één uitschakelen. En veel, heel veel, herstarten. Ik ben weleens tot 3 uur ’s nachts doorgegaan met zo’n probleem, zonder de oorzaak te vinden. (Daarna, in mijn slaap, droomde ik de oplossing. Om 7 uur opgestaan, en ja hoor. Ik moet het dus al die tijd geweten hebben, denk ik.)

Oftewel: de eerste voorwaarde voor het oplossen van een bug is het kunnen reproduceren van de foutsituatie. Dan goed kijken terwijl het fout gaat. Herstarten. Nog eens proberen. Tot je het exacte moment en de exacte plek ziet waar het fout gaat. Tot je het echt fout ziet gaan. Je snapt meteen waarom dit met computers wel werkt maar met mensen niet. Stel je voor dat de dokter zou kunnen zeggen: we spoelen u even terug tot vlak voor de val, en dan doen we het nog een keer. Of anders: we herstarten u tot u opnieuw bij dit moment komt, en dan zetten we een breakpoint om te zien wat er mis gaat. Net zo lang herstarten tot je uiteindelijk helemaal “foutloos” door het leven komt. Maar dat zou jammer zijn, toch? Dan zijn we allemaal perfect en misschien wel allemaal hetzelfde. Terwijl mensen toch worden gevormd door de butsen die ze onderweg oplopen. Dus laat maar zo, ik kan ermee leven. Met vallen en opstaan.

Advertenties