Programmeren is te leren

Zoals ik vorige week schreef ben ik druk bezig een team kinderen te coachen dat gaat meedoen aan de First Lego League. Daarvoor moeten ze een onderzoeksproject doen waarbij ze een oplossing bedenken voor een probleem, dit jaar in het thema de stad. En de andere helft van de wedstrijd is dat waar ze allemaal op af zijn gekomen: het bouwen en programmeren van een Mindstormsrobot* om in tweeënhalve minuut zoveel mogelijk missies te voltooien op een speeltafel. En da’s nog helemaal niet makkelijk.

Reden om het nog eens te hebben over computational thinking. Want de stap van weten dát de robot iets kan naar programmeren hoe hij dat moet doen is erg groot. En dus leerzaam! De denkstappen:

Denkstap 1: snappen dat je een robot elk klein stapje moet voorzeggen

De lastigste stap is snappen hoe dom de meeste robots eigenlijk zijn. (No offense C3PO!) Als je hem niet precies vertelt wat hij moet doen, doet de robot niet wat je wilt. En dat moet in veel detail. Moderne robots hebben veel details al ingeprogrammeerd, maar ergens diep vanbinnen zit die domheid nog steeds. Een Segway of hoverboard bijvoorbeeld: daarin zit een programmaatje dat zegt: kiep je naar voren, ga dan naar achter, kiep je naar achter, ga dan naar voren. Los van dat je het ding nog moet kunnen bedienen, hij niet door elke hobbel in het wegdek overstuur moet raken enzovoorts.

Als mens doe je heel veel onbewust: is iets heet dan trek je je hand terug, als je een glas water aanpakt houd je dat recht, als er een auto aankomt wacht je met oversteken. Een robot moet je dat allemaal leren. In stapjes. Ik zag eens een presentatie op internet van iemand die liet zien hoeveel kleine handelingen je doet bij zoiets simpels als spaghetti koken, de presentatie heette iets als “How to cook spaghetti in 445 easy steps.” (Kon hem helaas niet vinden.) Een mooi beeld. Je denkt: water opzetten, spaghetti in kokend water, lang genoeg wachten, klaar. Maar denk maar eens na: spaghetti in de pan doen bestaat al uit bijvoorbeeld spaghetti boven de pan houden, spaghetti rustig laten zakken, voorkomen dat je hand in het water komt, spaghetti loslaten enzovoorts. Als je een robot dat wilt leren, zul je hem elke (deel)stap van die 445 easy steps moeten uitleggen.

Denkstap 2: de robot zelf laten denken

“Onze” robot moet navigeren naar de opdrachten die hij moet uitvoeren. In eerste instantie was mijn team bezig hem te leren naar de opdrachten te rijden aan de hand van een instructie: rijd zolang rechtdoor, dan een bocht van 30 graden, dan rechtdoor voor zoveel seconden. (Een beetje zoals met de Blue Bot waar ik eerder over schreef. Alleen is die voor kleuters en werk ik nu met de slimste kinderen van groep 7 en 8). Dat kan. Maar het is ook foutgevoelig: als de robot bijvoorbeeld met één wiel een beetje slipt, raakt hij uit koers, en als hij daarop voortborduurt wordt de afwijking steeds groter.

Slimmer is het gebruik te maken van de hersens van de robot. Je kunt zijn sensoren gebruiken om informatie over de wereld om hem heen mee te verzamelen, en daar kun je hem op laten reageren. Dat kan nog steeds stap voor stap, maar is minder foutgevoelig, omdat de robot zelf kan “bijsturen”.

Denkstap 3: bepalen welke informatie de robot kan gebruiken, en hoe dan

Het is dus handig sensoren te gebruiken voor de navigatie. Nou staan er dikke zwarte lijnen met witte randen eromheen op het speelveld, als een soort route naar alle plekken waar de robot iets moet doen. Die zou de robot kunnen volgen. Zover zijn de kinderen. Maar dan komt het moeilijke stuk: hoe dan? OK, met de licht- en kleursensor. Hoe dan? Je kunt zo’n ding niet zeggen “volg de zwarte lijn tot…”. Dus dat wordt iets van: als je zwart ziet, houd koers. Zie je wit, dan slinger je een beetje terug. En we moeten hem vertellen welke gemeten waarde wij wit noemen, en welke zwart. En wat “terug” is. Nog lastiger is de opdracht waarbij de robot moet stoppen op een brug. Hoe weet hij wanneer hij boven is? We kunnen hem vertellen hoe ver hij moet rijden, we kunnen zeggen hoe lang hij moet rijden, we kunnen zeggen dat hij gebruik moet maken van het ding dat zijn positie meet (bijvoorbeeld horizontaal of schuin), we kunnen hopen dat hij kan zien waar hij is… En dan nog combinaties daarvan.

Denkstap 4: het gaat altijd anders

OK, dan hebben we een doel, een beeld van wat we moeten programmeren én de juiste programmeerblokken, en dan dóet ie niks. En vind dan maar eens uit waar het aan ligt… Programmeren klinkt zo lekker exact, maar helaas heb je ook te maken met de onvoorspelbare werkelijkheid, waarin mensen foutjes maken en dingen anders gaan dan je hoopte. En dus duurt alles langer dan verwacht. Tenzij je dat al weet natuurlijk…

Mijn team is zich dit nog aan het realiseren. Ze hebben weinig tijd om het te leren: de wedstrijd is over 13 dagen al. Ik probeer ze aan het werk te krijgen, en bij sommige kinderen lukt dat, anderen vertrouwen er volledig op dat het vanzelf goed komt, ook als ze hun tijd besteden aan activiteiten die blijkgeven van een minder taakgerichte aanpak. Ik ben dankbaar voor het vertrouwen, maar werk me ondertussen uit de naad om te snappen hoe ik hun programma’s kan debuggen. Want ik snáp hoe de robot werkt, maar zelf complexe acties programmeren is nog een heel ander verhaal. Ik ben zover dat ik dát snap, nu mijn topteam nog! Want wat leren we ondertussen veel.

*De Mindstormsrobot is een door Lego bedachte robot. In de basis een blok waar sensoren en motoren op aan te sluiten zijn, en dat je kunt inbouwen in een voertuig of machine of in een mens- of dierachtige robot, van onderdelen van (technisch) Lego. Voor de Lego League wordt door de meeste teams een rijdende robot met een shovel of grijper gebruikt. Naast een “retailversie” wordt de robot ook aangeboden in een education-versie, compleet met lespakketten. Lego heeft ook eenvoudiger robots (bijvoorbeeld Boost), die hebben minder mogelijkheden en zijn daardoor veel makkelijker te programmeren. Maar die kunnen bijvoorbeeld dit niet: