Probleemoplossing bij programmeeropgaven.

Een centraal onderdeel van een goede programmeertraining, is probleemoplossing van opgaves. Daarom is het goed om stil te staan bij hoe je studenten zo goed mogelijk ondersteund bij het oplossen van programmeerproblemen. In dit artikel deel ik tips om dit te doen.

Voor ik begin met het artikel, wil ik de volgende bron vermelden. Ik heb de inspiratie en informatie voor dit artikel verkregen uit de video Problemlösen, van wiskundeleraar Christian Spannagel.

Wat is probleemoplossing?

Een probleem bestaat uit de formulering van een bepaalde huidige toestand en een gewenste toestand. Het doel is om bij de gewenste toestand (de oplossing) te komen.

Als men in de gewenste toestand is aangekomen, is het probleem opgelost. Een voorbeeld is bij het spelletje hieronder, waar het probleem is dat er allemaal puntjes op het scherm staan en het probleem opgelost is, als alle puntjes zijn opgegeten.

In een spel als Pacman zijn er vele manieren om het probleem op te lossen. Er zijn ook veel manieren om te mislukken.

Als je voor de eerste keer met een bepaald probleem geconfronteerd wordt, is een oplossing vinden vaak een creatief proces. En misschien kun je ook wat vaardigheden gebruiken, die bij het oplossen van vergelijkbare problemen zijn geleerd.

Een complex proces

Vaak is één handeling niet genoeg en is het process gecompliceerder omdat meerdere handelingen met elkaar gecombineerd moeten worden. Deze handelingen noemt met probleemoplossingoperatoren. Hierbij helpt het om milestones (tussendoelen) te definiëren. Soms kom je in een doodlopende straat en net zoals in de doolhof van Pacman dient gezocht te worden naar de juiste volgorde van activiteiten om bij het doel uit te komen.

Voorbeeld van een programeerprobleem

Hier is een programmeeropgave met de volgende opgavestelling:

Variabele a bevat een list met getallen. De opgave is om het grootste getal in de lijst te vinden. Het grootste getal wordt op het scherm geprint.

De volgende code is de huidige toestand (of starttoestand).

a = [4, 7, 9, 1, 3, 8]
largest = a[0]

...

print(largest)

De vraag is nu: hoe komt de student van de starttoestand in de doeltoestand? Let op de drie puntjes in de code. Wat komt er op de plek van die puntjes zodat het probleem opgelost wordt? De code die geschreven wordt, zijn de probleemoplossingoperatoren die op de juiste manier gecombineerd moeten worden, om uiteindelijk het gewenste programma te hebben, dat uit een lijst met getallen het grootste getal toont.

En de vraag voor de trainer is: Hoe kun je dit didactisch begeleiden? Daarvoor moeten we kijken hoe informatieverwerking in ons brein werkt.

Geheugen

Elke informatie die bij ons binnenkomt, legt de volgende weg af:

Informatie komt binnen via de zintuigen en wordt voor korte tijd opgeslagen in het zintuigelijk geheugen. De informatie waar de aandacht op gericht wordt, bijvoorbeeld bepaalde beelden of geluiden, worden overgenomen in het kortetermijngeheugen.

Het kortetermijngeheugen wordt gebruikt voor de bewuste informatieverwerking, beter bekend als 'denken'. Je kunt dit vergelijken met de processor van een computer, waarin een beperkt aantal registers zit, die gevuld zijn met data.

Met zegt dat het kortetermijngeheugen ongeveer 7 dingen kan bevatten. Daarom is het moeilijk een lang telefoonnummer te onthouden zonder het op te schrijven.

Het brein bevat ook een langetermijngeheugen met veel meer capaciteit. Je kunt dit zelf controleren door te denken aan de stad waar je geboren bent of door nu spontaan het refrein van Hotel California te zingen. Toe maar, ik wacht wel even. 🎵🎶

Het langetermijngeheugen kun je vergelijken met het werkgeheugen van een computer. Informatie uit het langetermijngeheugen moet eerst in de processor gestopt worden om verwerkt te worden.

En zo werkt het ook in het brein: informatie uit het langetermijngeheugen wordt verplaatst naar het kortetermijngeheugen en gemixt met nieuwe informatie die via de zintuigen binnenkomt.

Het resultaat van dit 'denken' kan weer worden opgeslagen als nieuwe informatie in het langetermijngeheugen. Dat dit zo werkt, is niets minder dan een wonder!

Cognitive overload

Omdat het kortetermijngeheugen maar een beperkte capaciteit heeft, kan het ook overbelast worden. Dit kan probleemoplossing onmogelijk maken omdat het kortetermijngeheugen teveel informatie bevat.

En hier wordt het voor de leraar belangrijk!

Cognitive load theory

We weten nu dat het kortetermijngeheugen maar een beperkt aantal dingen kan bevatten, dus moeten we ervoor zorgen dat er niets overbodigs inzit, op het moment dat de student dingen moet gaan begrijpen!

Het kortetermijngeheugen kan grofweg gevuld worden met 3 soorten informatie:

Intrinsic cognitive load

Dit is de belasting op basis van de complexiteit van de inhoud. Als de inhoud gecompliceerd is, is de intrinsic load hoger. Dit hangt heel erg samen met voorkennis. Een expert heeft al ervaring met de inhoud en kan bij de verwerking ook kennis uit het langetermijngeheugen gebruiken. Een beginner zal alle benodigde informatie om het probleem op te lossen in het kortetermijngeheugen moeten bewaren.

Extraneous cognitive load

Deze belasting berust op de weergave van het leermateriaal. Hierop heeft de trainer directe invloed. Een hoge Extraneous load kan bijvoorbeeld veroorzaakt worden door onduidelijke probleemstelling, te veel informatie die niet nodig is voor het probleem, misplaatste humor (zoals inside jokes) of mijn favoriet: Een coding tutorial met te veel code in te kleine lettertjes met daarnaast een video van een pratend hoofd.

Germane cognitive load

Deze belasting wordt gebruikt om nieuwe informatie te koppelen aan andere informatie en zo 'leren' mogelijk te maken.

Het is dus belangrijk dat in het kortetermijngeheugen ruimte vrij is voor de Germane load, omdat er anders niet geleerd wordt!

Conclusie:

Het doel van leermateriaal is dus om de extraneous load bij een gegeven intrinsic load zo laag mogelijk te houden, zodat er capaciteit overblijft voor de germane load, die nodig is om het geleerde op te slaan.

Hoe doe je dit?

Nu we weten wat het probleem is bij probleemoplossing, kunnen we ook naar oplossingen zoeken. Als voorbeeld, neem ik het eerder genoemde programeerprobleem:

a = [4, 7, 9, 1, 3, 8]
largest = a[0]

...

print(largest)

Voor een beginner is de intrinsic load hoog. De student moet kennis hebben van lijsten, loops, variabelen. De student zal vooral bezig zijn om de probleemoplossingoperatoren te zoeken, die nodig zijn om het probleem op te lossen. Dit zoeken naar probleemoplossingoperatoren zorgt dat de extraneous load zo hoog is, dat de student misschien helemaal niet tot een oplossing komt. Laat staan tot leren van dit probleem en de student zal zeker geen concept formuleren hoe vergelijkbare problemen opgelost kunnen worden.

Wat kan gedaan worden om de studenten bij het leren te ondersteunen?

Worked example

Voor het oplossen van problemen in een bepaalde klasse, kan men een uitgewerkt voorbeeld gebruiken.

De student krijgt een volledig opgelost probleem en moet dit zelfstanding proberen te begrijpen, zodat problemen uit dezelfde klasse zelfstandig kunnen worden opgelost.

Het concept van probleemoplossing binnen deze klasse wordt dus aangeboden. Een voorbeeld is als volgt. We tonen de volledige code om het grootste getal in de lijst te vinden:

a = [4, 7, 9, 1, 3, 8]
largest = a[0]

for x in a:  # loop through all numbers
  if x > largest:  # if number is greater then largest,
    largest = x    # set largest to number from list

print(largest)

Als de student tijd heeft gehad om het voorbeeld door te werken, komt er een nieuwe probleemopgave.

Maak een programma dat uit een lijst met getallen, het kleinste element vind.

Hierbij kan gekozen worden voor:

Completion problem

Een mogelijkheid is om na een worked probleem eerst een completion problem te geven. Hierbij wordt een bijna volledig voorbeeld getoont, waarbij sommige elementen ontbreken. Hier is een voorbeeld:

a = [4, 7, 9, 1, 3, 8]
smallest = a[0]

for         :
  if              :
    smallest = x

print(smallest)

De studenten moeten bij een completion problem niet nadenken over de probleemoplossingoperatoren want die zijn al voorgegeven. De student hoeft alleen de individuele missende delen van de code in te vullen.

Volledig probleem

Als volgende stap, kan men een nieuw probleem uit de zelfde probleemklasse tonen, waarbij de student zowel de probleemoplossingoperatoren moet zoeken, zoals de code die bij de individuele operatoren hoort.

a = [4, 7, 9, 1, 3, 8]
smallest = a[0]

...

print(smallest)

We zagen dat studenten bij de worked example veel hulp krijgen en naar mate het thema vordert, ze meer stappen zelf moeten ondernemen, om het probleem op te lossen.

Process oriented Worked example

Er zijn verschillende manieren om een oplossingsvoorbeeld te geven. Tot nu toe zagen we voorgedrukte text waarbij de student de ontbrekende code moest invullen.

Een alternatief hiervoor is het procesgeorienteerde oplossingsvoorbeeld. Hierbij wordt het "expert-denken" van de leraar ge-externaliseerd.

Hiervoor is een live demo of een video nodig, waarbij de trainer hardop denkt en de stappen beschrijft die nodig gaan zijn om de voorbeeldcode te schrijven. Hierbij hoeft de code niet compleet te zijn maar alle stappen (probleemoplossingoperatoren) zijn door de trainer benoemd en (gedeeltelijk) geschreven. Hierbij wordt ook getoont, dat het worked example misschien niet van boven naar beneden geschreven is maar dat het example een resultaat is van een evolutionair process, waarbij sommige regels tussen andere regels zijn ingevoegd.

Conclusie

Je hebt nu gezien waarom het belangrijk is om een goede probleemstelling te definiëren. Cognitieve belasting bestaat uit complexiteit, weergave van het leermateriaal en de inspanning die nodig is om het geleerde vast te leggen in het langetermijngeheugen. Als het materiaal gecompliceerd is, en de probleemstelling lastig te begrijpen is, kan dit betekenen dat er geen cognitieve ruimte meer is, waardoor het leren gehinderd wordt.

Je zag in dit artikel verschillende methoden om een programmeeropgave te presenteren al naar gelang de student meer ervaring krijgt met het thema. Ik hoop dat deze informatie je helpt om je studenten het ultieme doel te laten bereiken: Programmeren leren!

Written by Loek van den Ouweland on 2021-04-23. Questions regarding this artice? You can send them to the address below.