Lektionsupplägg: Det här är programmering

De flesta programmeringslärare är överens om att programmering inte är att skriva kod. Kodskrivandet är egentligen bara de där sista procenten av det egentliga arbetet. Det här är något många elever missar, och jag är inte förvånad – traditionell programmeringsundervisning har fokuserat på koder och formalia, att lära sig rätt funktioner i programmeringsspråken. Man lägger ofta in problemlösning som ett kriterie för högre betyg, men vad jag sett skapas sällan förutsättningar för inlärning av just problemlösning. Detta trots att lärarna är rörande överens om att just problemlösning, att kunna dela upp ett stort problem i mindre delar, är det som är centralt för ämnet. Är MVG-kriterierna något eleven måste kunna uppnå helt själv? Ha med sig från början? Jag har svårt för den tanken. I min värld kan alla få MVG, men då måste de ges utrymme och möjligheter för att träna i och utveckla MVG-kompetenserna. De kan inte få vara något som bara spontant uppstår.

Det här lektionsupplägget är tänkt att vara en utgångspunkt för en bredare diskussion med eleverna om vad programmering egentligen är och vad som menas med ”problemlösning”.

Lektionsuppläggets grundtanke är egentligen enkel: Utgå från kunskap eleverna redan har, och visa dem hur de kan gå därifrån till den sortens problemförståelse som krävs för programmering. Barnlekar används som utgångspunkt. Upplägget kan antingen genomföras under en och samma lektion, eller som inslag i flera lektioner.

Enligt den gamla kursplanen för Programmering A så skall eleven:

 kunna analysera programmeringsuppgifter och formulera strukturerad pseudokod samt konstruera enkla algoritmer

kunna systemera och strukturera programmeringsarbetet samt skriva enkla program och felsöka källkod

Den nya kursplanen i GY11 är mindre flexibel, och Programmering 1 låser sig vid detaljer om sökalgoritmer och annat ospännande, men eleven ska i varje fall ges tillfälle att utveckla

”förmåga att formulera och planera programmeringsuppgifter med pseudokod och diagramteknik.”

GY 11, kursplan för Programmering

Det är de kompetenserna den här övningen riktar in sig mot; att kunna planera, fundera och skapa sig en förståelse för vad programmering innebär.

Del 1

Elevernas uppgift: Att skriva ner reglerna för en barnlek (kull, kurragömma, tjuv och polis) så exakt och detaljerat de kan. Detta kan ske i grupp i klassrummet (c:a 10 minuter) eller som läxa.

Sedan går man tillsammans i klassrummet igenom elevernas regelförslag, och arbetar sig fram till ett resultat alla är nöjda med. Lärarens mål är att få eleverna att förklara vad som händer och i vilken ordning. Hur ser villkoren ut? Vad leder till vad? På det viset får man fram en pseudokod som beskriver leken.

Här är till exempel reglerna för Sten, Sax, Påse:

Man räknar ner från 3 till 1.
När man nått till 1:
Spelare 1 väljer sten, sax eller påse.
Spelare 2 väljer sten, sax eller påse.
Båda visar det de valt samtidigt.

Jämför:
sten vinner över sax, förlorar mot påse
påse vinner mot sten, förlorar mot sax
sax vinner över påse, förlorar mot sten
Om båda väljer samma så kör vi om.

Visa vem som vinner

Del 2

Elevernas uppgift är nu att på samma sätt som i första delen skriva ner reglerna för leken ”hänga gubbe”. Precis som i del 1 kan de få den delen i läxa eller få klassrumstid. Min erfarenhet säger mig att det i båda fallen blir bättre med jobb i grupper om 2 eller 3 i klassrummet. Det kan bli mer reflekterande, kreativt och intressant.

När eleverna är klara har man diskussion i helklass. Målet är nu att försöka nå konsensus om en uppsättning generella psudokodsregler som beskriver Hänga gubbe, eller ”hangman” som ju leken heter på engelska.

De reglerna kan till exempel se ut ungefär såhär:

Välj en lekledare
Lekledaren väljer ett ord
Räkna ut hur många bokstäver det finns i det utvalda ordet
Skriv ut så många streck på tavlan
Från början har man 7 chanser

Så länge spelarna inte gissat hela ordet och det finns chanser kvar:
De som vill gissa signalerar detta
Lekledaren väljer vem som ska få gissa
Den utvalde spelaren gissar på en bokstav
Om spelaren gissar på något som inte är en bokstav så frågar den igen.
Om gissningen innehåller flera bokstäver, kolla alla en efter en.
Om bokstaven finns i ordet minst en gång
Lekledaren kollar vilka platser i ordet bokstaven finns på
Lekledaren byter ut de streck på tavlan som motsvarar bokstäverna.
Om bokstaven inte finns med
Antalet chanser minskar med 1
Lekledaren skriver upp den felaktiga bokstaven
Lekledaren ritar till en ytterligare del av den hängda personen

Om man har vunnit, gratulera
Om man förlorat, beklaga
Skriv ordet i dess helhet

Nästa steg är att diskutera vilka delar av den här strukturen som blir onödiga, om vi antar att vi vill att datorn ska vara lekledare. De raderna markeras med ett minus.

Sedan diskuteras vilka delar man kan ta bort utan att lekens kärna försvinner. Här finns utrymme för många bra diskussioner: vad är egentligen kärnan i en lek? I hänga gubbe är det, brukar man kunna komma fram till, att ha ett ord man ska gissa bokstäverna i, och man har ett visst antal chanser. Alla delar som inte är absolut nödvändiga för att spelet ska fungera markerad med en stjärna. Resultatet kan se ut ungefär såhär:

-Välj en lekledare
Lekledaren väljer ett ord
Räkna ut hur många bokstäver det finns i det utvalda ordet
Skriv ut så många streck på tavlan
Från början har man 7 chanser

Så länge spelarna inte gissat hela ordet och det finns chanser kvar:
-De som vill gissa signalerar detta
-Lekledaren väljer vem som ska få gissa
Den utvalde spelaren gissar på en bokstav
*Om spelaren gissar på något som inte är en bokstav så frågar den igen.
*Om gissningen innehåller flera bokstäver, kolla alla en efter en.
Om bokstaven finns i ordet minst en gång
Lekledaren kollar vilka platser i ordet bokstaven finns på
Lekledaren byter ut de streck på tavlan som motsvarar bokstäverna.
Om bokstaven inte finns med
Antalet chanser minskar med 1
*Lekledaren skriver upp den felaktiga bokstaven
*Lekledaren ritar till en ytterligare del av den hängda personen

*Om man har vunnit, gratulera
*Om man förlorat, beklaga
*Skriv ordet i dess helhet

Och om man då tar bort allt med minus eller stjärnor framför, så får vi det här:

Lekledaren väljer ett ord
Räkna ut hur många bokstäver det finns i det utvalda ordet
Skriv ut så många streck på tavlan
Från början har man 7 chanser

Så länge spelarna inte gissat hela ordet och det finns chanser kvar:
Den utvalde spelaren gissar på en bokstav
Om bokstaven finns i ordet minst en gång
Lekledaren kollar vilka platser i ordet bokstaven finns på
Lekledaren byter ut de streck på tavlan som motsvarar bokstäverna.
Om bokstaven inte finns med
Antalet chanser minskar med 1

Med dessa regler som grund kan eleverna sedan få skriva just ett program som leker Hänga gubbe med dem, ett ganska komplext spel som kräver viss problemlösning på vägen och som brukar kunna inbegripa loopar, arrayer, funktioner, typomvandlingar (arrayer till strings), villkorade satser, och även grafikprogrammering och annat avancerat om man vill utveckla projektet lite ytterligare. Det programmet kan såklart skrivas i vilket språk som helst och ser ungefär lilafärgad ut oavsett vilket språk man väljer. Jag har själv använt Python och Javascript, men jag ser inga hinder för att använda C++, Java eller PHP.

Huvudsaken är dock själva regelkonstruktionen. Genom att möta eleverna där de är, utgå från något de redan kan (hänga gubbe) och locka med att bygga något de är intresserade av (datorspel) och i slutänden kan tänkas vilja visa för andra, och genom att börja övningen helt utan kod, skapas en situation med optimala förutsättningar för lärande.

Jag kommer att återkomma till ämnena spel, spelteori och entusiasm i klassrummet. Antagligen flera gånger, för de är bland mina favoritämnen.

Nå, jag hoppas att den här övningen kommer att komma till nytta. Reagera gärna i kommentarerna!