Undervisningsmetoder#

Det finnes mange måter å undervise programmering på, og både forskning og erfaring kan fortelle oss en del om hva som faktisk virker. Det viktigste er å ta hensyn til generelle pedagogiske prinsipper når du velger metode, slik at du ikke velger metode blindt. Noen ting du kan tenke på når du velger eller lager programmeringsoppgaver, er:

  • Hva målet er med undervisningen. Hvis for eksempel målet er å lære løkker og gjentakende strukturer, kan det være gunstig å bruke andre metoden enn hvis målet er å forstå hvordan en tallfølge utvikler seg.

  • Hva målgruppen er. Elever på høyere nivå trenger større og mer åpne oppgaver enn elever som akkurat skal lære seg å programmere.

  • Hvor heterogen målgruppen er. Oppgaver kan utformes på ulike måter, noe som gir muligheter for differensiering. Se her for et eksempel på hvordan samme oppgave kan nivådifferensieres.

La oss nå se på ulike metoder som du kan benytte i undervisningen.

Metode

Kort forklaring

Bruk av analogier og konkreter

Noen konsepter som variabler og objekter kan være greit å illustrere med noe konkret.

Liveprogrammering

Læreren programmerer et program live i klasserommet. Her kan en f.eks. stille spørsmål underveis, be elevene/studentene fortsette på koden og legge inn (bevisst og ubevisst) feil som en kan feilsøke sammen.

Parprogrammering

To arbeider sammen. Én skriver kode, en annen dikterer hva vedkommende skal skrive.

Diskuter hva programmet gjør

Introduksjon til temaer eller faglige poenger vha. korte, intuitive kodesnutter som elevene kanskje kan skjønne uten å kjenne syntaksen.

Utfylling

Kode kan lages med noen linjer som mangler, og som elevene skal fylle inn, enten live eller som oppgaver.

Programmeringspuslespill (Parsons-problemer)

Programlinjene er gitt, men i feil rekkefølge. Fokuset blir på problemløsning, ikke syntaks. Nettbaserte puslespill kan brukes.

Flytskjemaer

Bruk av flytskjemaer til å systematisere vilkår.

Sammenlikninger

Sammenlikne hva to nesten like kodesnutter gjør. Kan være fokus på syntaks eller den realfaglige problemstillingen.

Feilsøking og feilretting

Finn feilen i koden når koden er gitt. Feilen kan være av algoritmisk (realfaglig) eller syntaktisk art.

Begrepsalias

Spillet alias med viktige begreper som variabel, tilordning, parameter, funksjon, vilkår osv.

Pseudokode

Uformell beskrivelse av et dataprogram. Legg vekt på logikk framfor syntaks. Beskrive eller utforme pseudokoden selv.

PRIMM

Gradvis oppbygging av oppgaven (Predict-Run-Investigate-Modify-Make).

Undervisningsopplegg

Lag et undervisningsopplegg som inneholder programmering i et av dine fag. Gjør rede for læringsmål, formål, metode og aktivitet. Knytt også opplegget til læreplanen (kompetansemål, grunnleggende ferdigheter, kjerneelementer og tverrfaglige temaer).

Vi kan også differensiere oppgaver ved å benytte blokkbasert programmering i tillegg til tekstbasert programmering. Ser denne siden for mer om dette.

1. Bruk av analogier og konkreter#

Noen programmeringskonsepter kan fint illustreres med fysiske analoger. For eksempel:

  • Variabler som bokser/skuffer. Dersom du putter en ny ting (for eksempel en sokk) i skuffen, blir dette det samme som “skuff = skuff + 1”

  • Dersom du skal undervise i objektorientert programmering, kan det være nyttig å sammenlikne objekter som fysiske objekter med felles egenskaper og ulike egenskaper. For eksempel kan en klasse være “Glass”, der vi lager ulike objekter, som alle er glass med en del felles egenskaper. Deretter kan vi bruke metoder til å endre egenskapene til noen av glassene, slik at vi får glass med for eksempel ulikt volum og ulik varmeledningsevne.

2. Liveprogrammering#

Livekoding betyr at læreren programmerer for elevene i undervisningsøkta. Dette er mye mer effektivt enn å presentere masse ferdig kode på en PP eller liknende. Du trenger ikke lage programmet lineært - ta heller elevene med på en reise i hvordan du tenker når du skal bygge opp programmet. Og la gjerne elevene hjelpe deg. En mulig framgangsmåte er slik:

  1. Skisser hva programmet skal gjøre. Gjerne med pseudokode på tavla, avhengig av kompleksiteten på problemet.

  2. Lag litt av programmet.

  3. Spør elevene underveis om hva neste linje skal være, hva vi mangler eller om programmet kan fungere som det er. La gjerne elevene diskutere parvis innimellom.

  4. Evaluer programmet, gjerne gruppevis, før det kjøres.

  5. Legg eventuelt inn feil i programmet underveis som elevene må rette opp i plenum (eller kanskje dukker de opp automatisk hvis du liveprogrammerer uten å forberede deg!).

3. Parprogrammering#

Parprogrammering kan være en måte å sikre at alle elevene er aktive når de samarbeider. Det går ut på at én elev sier hva den andre skal programmere, mens den andre bare programmerer. Den ene eleven må da formidle det han/hun ønsker å gjøre på en god nok måte til at den andre eleven forstår dette. Deretter byttes rollene. Metoden sikrer at begge elevene er involverte i både programmeringen og den algoritmiske tenkningen.

Eksempeloppgaver

  1. Lag et program som tar to tall som input og skriver ut hvilket av disse tallene som er størst.

  2. Lag et program som beregner og skriver ut summen av de 100 første naturlige tallene.

  3. Lag et program som beregner volumet til en kule og/eller en sylinder (\(V_{kule}=\frac{4}{3}\pi r^3\), \(V_{sylinder}=\pi r ^2h\))

  4. Lag et program som regner ut denne summen:

\[\sum_{n=2}^{16} ((n^2 + 1) + n)\]

4. Diskutere programmer#

Det ligger mye læring i å diskutere hva et program gjør, både før og etter at en har kjørt det. Et program kan forklares på overordna nivå og linje for linje. Begge deler gir god læring, men fokuset bør være på hvordan programmet løser et problem, ikke på syntaksdetaljer.

Eksempel: Hva gjør dette programmet?

startbeløp = 25000
rente = 5.5         
beholdning = startbeløp 
år = 0

while beholdning <= 2*startbeløp:
    beholdning = beholdning + (rente/100)*beholdning
    år = år + 1

5. Utfylling#

Å fylle inn det som mangler kan gi god forståelse av hvordan et program fungerer og hva som må til for å løse det realfaglige problemet. Du kan lage halvferdige programmer i f.eks. Trinket. Disse kan deles med elevene dersom du sparer på lenka. Programmene du lager på Trinket, blir lagret, men du kan ikke endre dem dersom du ikke har et abonnement. Et abonnement er derimot ikke dyrt, og anbefales sterkt.

6. Parsons-problemer (programmeringspuslespill)#

Programmeringspuslespill (også kalt Parsons-problemer) legger fokus på logikk og struktur, ikke syntaks. Her kommer hver linje ferdig, og oppgava er å finne rekkefølge og struktur. Parsons-problemer er faktisk vist å være en svært god metode for å få fram forståelse av programmene og det realfaglige innholdet. Dessuten er det en del enklere enn å måtte lage et program helt fra begynnelsen av. Du kan klippe, lime og laminere puslespill, men det finnes også digitale varianter, for eksempel http://parsons.problemsolving.io/. Husk derimot at den digitale versjonen kun tillater én løsning – pass derfor på at du lager puslespill som ikke har altfor mange tillatte varianter. Husk også å bruke korrekte innrykk. For å teste metoden, kan du prøve ut dette puslespillet, som skal bli et program som avgjør maksimumsverdien i en liste gjennom en Python-funksjon.

7. Flytskjemaer#

Flytskjemaer kan være et fint virkemiddel for å sortere logiske slutninger og vilkår. For eksempel kan vi lage flytskjemaer for å beskrive ulike utfall i disse situasjonene:

  1. Bestemmelsesnøkkel i biologi.

  2. pH - Hva er sur, basisk og nøytral løsning?

  3. Er trekanten likebeint, likesidet eller ingen av delene?

Eksempel:

8. Sammenlikninger#

Å sammenlikne programmer kan gi god forståelse av programstruktur og det realfaglige innholdet.

Kodeteknisk eksempel: Hva blir output fra de to kodesnuttene nedenfor?

a = 0
while a < 10:
    a = a + 1
    print(a)
b = 10
while b < 10:
    b = b + 1
print(b)

Realfaglig eksempel: Hva gjør de to programsnuttene nedenfor?

from pylab import *

oksonium = 1.2E-7
pH = -log10(oksonium)
if pH > 7:
    print("Løsningen har pH =", pH, "og er basisk.")
elif pH < 7:
    print("Løsningen har pH =", pH, "og er sur.")
else:
    print("Løsningen har pH =", pH, "og er nøytral.")
from pylab import *

oksonium = 1.2E-7
pH = -log10(oksonium)
tol = 0.1
if pH > (7 + tol):
    print("Løsningen har pH =", pH, "og er basisk.")
elif pH < (7 - tol):
    print("Løsningen har pH =", pH, "og er sur.")
else:
    print("Løsningen har pH =", pH, "og er nøytral.")

9. Feilsøking og feilretting#

Det å finne både egne og andres feil gir god trening i både programmering og god forståelse i det realfaglige innholdet. I feilsøkingsoppgaver anbefales det å legge inn feil i det realfaglige innholdet, ikke i syntaksen. Det gir mer realfaglig læring i å finne ut at den kinetiske energien ikke stemmer enn at det mangler et kolon på linje 7.

Eksempel: Programmet skal regne ut hvor lang tid det tar å doble et beløp i banken med 3 % rente og et årlig sparebeløp. Programmet fungerer ikke som det skal – hva er feil, og hvordan kan vi rette opp i feilen?

startkapital = 10000
rente = 0.03
sparing = 500
tid = 0
sluttsum = startkapital*2
kapital = startkapital
while kapital <= sluttsum:
    kapital = kapital*rente + sparing
    tid = tid + 1
print("Det tar", tid "år å doble beløpet.")

10. Pseudokode#

Pseudokode er en beskrivelse av en algoritme eller programkode som teknisk sett kan oversettes til alle programmeringsspråk. Det finnes ingen absolutte standarder for pseudokode - det viktigste er at hovedideene formidles på en god måte. Å beskrive en pseudokode kan være en fin måte å formidle det realfaglige innholdet under for eksempel en muntlig eksamen. For eksempel kan en i naturfag be elevene om å beskrive en pseudokode for å simulere enkel nedarving av øyenfarge. Her er det også viktig å formidle hvordan algoritmen/programmet beskriver det realfaglige innholdet, og hva som er begrensninger og forutsetninger som ligger til grunn for algoritmen.

Her er et eksempel på en pseudokode som beskriver en algoritme for å finne kvadratroten av et tall:

a = 12

x_gammel = 3.5

gjenta n ganger:

  • x_ny = 0.5*(x_gammel + a/x_gammel)

  • x_gammel = x_ny

PRIMM#

PRIMM er en metode som er utviklet av Susan Sentance og står for Predict-Run-Investigate-Modify-Make. Når vi lager en aktivitet med programmering, kan vi bruke deler av eller hele denne prosedyren:

  1. Forklar hva programmet gjør. Her må elevene analysere det realfaglige problemet og dekode problemstillingen. Dette blir elevenes hypotese.

  2. Kjør programmet. Stemmer hypotesen? Hva sier resultatet oss?

  3. Uforsk programmet. Prøv å endre på noen variabler og se hva som skjer. Her gjelder variabelkontroll på samme måte som i et naturvitenskapelig eksperiment.

  4. Modifiser programmet. Gjør noen endringer i premisser eller metoder og tolk resultatene.

  5. Skap et nytt program. Lag et nytt program med utgangspunkt i programmet som er brukt i de foregående punktene.

Det er flere eksempler på denne sida for hvordan du kan bruke PRIMM til å designe programmeringsoppgaver, for eksempel disse oppgavene fra matematikk 1P, fysikk og biologi.

Prosjektoppgaver#

Noen ganger har en mulighet til å sette av tid til større, åpne oppgaver der elevene skal sette seg inn i en sammensatt problemstilling som enten er gitt eller selvvalgt. Spesielt modellering egner seg til slike prosjekter. Du kan finne et eksempel på et slik prosjekt her. Arbeid med slike prosjekter tar en del tid, men de stimulerer til refleksjon, samarbeid krativitet og meningssøking på en svært god måte. Her er det også mange muligheter for å jobbe tverrfaglig!

Elevene kan bruke for eksempel Jupyter Notebook til å skrive rapporter fra prosjektene. Da får de anledning til å beskrive teorien, modellene og framgangsmåten integrert sammen med koden.