Koska tiesin jo ennen materiaalin tekemistä, että se ei tule olemaan heti aivan täydellistä, projektisuunnitelmassa tämä kevät on varattu materiaalin "viimeistelyyn". Tämän blogikirjoituksen on tarkoitus kirkastaa ajatusta siitä miten ja mihin suuntaan sitä pitää muovata.
Rakenne
Koodausta kouluun materiaalin rakenne, jako oppilaan tehtäviin, koodarin käsikirjaan sekä opettajan oppaaseen on toimiva. On hyvä, että on olemassa Koodarin käsikirja, josta löytää helposti tarvitsemansa tiedon, ja joka muuttuu hitaasti. Koska samaa tietoa tarvitaan monessa tehtävässä, teorian on järkevämpää linkittää tehtäviin oikea sivu Koodarin käsikirjasta kuin kirjoittaa samaa asiaa moneenkertaan. Oppilaan tehtävät osion tarkoitus oli alunperin esitellä tehtäväideoita ja pohjia niin, että opettajat voisivat niiden avulla kehittää itse lisää harjoituksia. Sen on toimittava aluksi myös "täydellisenä" materiaalipankkina niille opettajille, jotka aloittelevat ja joilla ei ole aikaa tai taitoa luoda omia tehtäviä. Tämän materiaalipankin tarkoitus ei ole jatkossakaan sisältää "kaikkia mahdollisia tehtäviä", koska niitä on rajattomasti. Opettajan opas sisältää opettajaa kiinnostavaa taustatietoa mm. tavoitteista, linkit materiaaliin liittyviin opetusvideoihin sekä erimerkkiratkaisut kaikkiin tehtäviin. Eliademy on sinänsä toimiva järjestelmä materiaalin tallentamiseen vaikkakin se on usein melko hidas. Tämä rakenne tullaan siis säilyttämään jatkossakin.Etenemisjärjestys ja tehtävien vaikeustaso
Lausekielinen ohjelmointi on vaativaa sen takia, että yksinkertaistenkin ongelmien ratkaisu vaatii tietyn minimityökalupakin. Oppija ei kuitenkaan pysty ottamaan vastaan määräänsä enempää tietoa kerralla, joten asioita pitäisi opetella yksi kerrallaan. Syksyn materiaali oli jaoteltu näin:Alkeet: Peruslaskut
- DrRacket/WeSchemen käyttö, Racketin syntaksi
- peruslaskulausekkeet lukuarvoilla, evaluointi, laskujärjestys (lausekkeiden yhdistäminen)
- peruskuvat, kuvien yhdistäminen (lausekkeiden yhdistäminen), debuggaaminen
- kirjaston käyttäminen (2htdp/image)
- määrittelyt (define)
- Racket turtle - perusteet
- funktion määritteleminen
- ongelman jakaminen useampaan funktioon
- funktion suunnitteluportaat menetelmä ml. check-expect ja stub
- totuusarvot, vertailuoperaattorit, predikaatit, ehtolause, valintalause, Boolean operaattorit
- käyttäjän syötteen tutkiminen (display-read)
- animate ja big-bang (2htdp/universe)
- silmukat higer order funktioiden avulla (map, foldl)
- random
- Racket Turtle - jatko
Sen lisäksi, että asiat tuodaan oppilaalle pienissä paloissa, tämän tutkimuksen mukaan ne kannattaisi tuoda käyttöön kolmiportaisen kaavan kautta asteittain (use-modify-create):
- käyttäminen (käytetään valmista funktiota esim. 2htdp/image kirjastoa)
- muokkaaminen (muokataan valmiin funktion koodi tekemään jotain muuta)
- luominen (tehdään täysin oma funktio)
Kun lähdin ohjelmointia opettamaan, pedagoginen ajatteluni tukeutui siihen, että "kopioimalla" (esim. kirjasta tai tutoriaalista koodirivejä) ei voi oppia ohjelmointia. Käytäntö on kuitenkin näyttänyt, että ensimmäinen vaihe lausekielisen ohjelmoinnin oppimisessa on se, että ensin kopioidaan jotain, vaikkapa seurataan MOOC:in vetäjän tutoriaalivideota ja koodataan samalla tai seurataan opettajan esimerkkiä luokassa ja koodataan samalla. Tässä ei vielä tapahdu varsinaista asian syväoppimista, vain se on tapa tutustua uuteen rakenteeseen tai menetelmään. Tämän jälkeen asiaa harjoitellaan tarkasti rajattujen tehtävien avulla, sellaisten joissa ongelma on valmiiksi muotoiltu ja ratkaiseminen on melko suoraa koodin kirjoittamista, tarvittavat tiedot on annettu ja käytetään niitä rakenteita tai menetelmiä, joita on juuri tutustuttu. Viimeinen taso, jossa varsinainen asia ymmärretään on avoin tehtävä, jossa keksitään itse ongelma ja muotoillaan sille ratkaisu tai jatketaan koodia tekemään sellaista mitä ei ole valmiiksi määritelty.
Melkoinen määrä siis asiaa... Tämä ei tarkoita, että kaikkien oppilaiden ja kaikkien ryhmien olisi käytävä aina kaikki tämä. Tämä on vain polku, jonka avulla materiaali rakennetaan etenemään loogisesti sille tasolle asti, johon tämän materiaalin puitteissa on järkevää edetä. Oppilaiden kanssa tehdään se, mihin kyseinen ryhmä kykenee. Materiaalin on joustettava joka suuntaan.
Opiskeltavien asiakokonaisuuksien portaittainen jako
Funktiot ja
muuttujat:
- valmiiden funktioiden käyttäminen a) Racket BSL, b) kirjasto
- globaalin muuttujan määrittely (define)
- funktion käsite, funktion määritteleminen, valmiin funktiorungon täydentäminen tekemään haluttu asia (stub valmiina)
- funktion testaaminen interaktioikkunasta
- funktion parametrien nimien keksiminen (stub vain osittain valmiina)
- funktion toiminnallisuuden jakaminen kahteen eri funktioon (funktio kutsuu toista, valmista funktiota)
- funktion testaamisen automatisointi check-expectin avulla
- funktion toiminnan suunnittelu ennen koodaamista check-expect:ien avulla
- kokonaan oman funktion suunnittelu analysoimalla muuttujat ja vakiot, stub:in kirjoittaminen, check-expectien kirjoittaminen
- uuden toiminnallisuuden jakaminen omiin osafunktioihin
- funktion sisäiset muuttujat (let)
- inline funktiot (lambda)
- call-back funktiot
Konditionaalinen
logiikka:
- tutustuminen totuusarvoihin true/false
- vertailuoperaattorit (<, >, <=, >=, =)
- predikaatit eli funktiot jotka palauttavat totuusarvoja (number?, positive?)
- ehtolause (if)
- sisäkkäiset ehtolauseet
- Boolean operaattorit (and, or, not)
- valintalause (cond)
Toistorakenteet:
- käytetään kirjaston toteuttamaa toistorakennetta (Racket Turtle repeat)
- tehdään funktio, joka kutsuu itse itseään ilman lopetusehtoa (funktiolla sivuvaikutuksia)
- lisätään silmukalle lopetusehto parametrin avulla
- parametrin käyttäminen silmukan tilan tallentamiseen
- listan iterointi rekursiivisesti
- listan iterointi higer order funktioiden avulla
Tietorakenteet:
- tietotyypit a) luku, merkkijono, b) kuva, c) totuusarvo
- listan käyttäminen staattisena parametrina (Racket turtle, display-read)
- listan käyttäminen dynaamisesti tallentamiseen (lisääminen, poistaminen, member?)
- tietueen käyttö
Hyvät
ohjelmointikäytänteet:
- muuttujien ja funktioiden nimeäminen kuvaavasti
- vakioarvojen määrittely muuttujan avulla (single control point, turhan toiston välttäminen)
- funktio tekee vain yhden asian (modulaarisuus, ei toisteta turhaan)
- funktion testien jättäminen koodiin (check-expect)
- käytetään funktioita aina kuin mahdollista (uudelleen käytettävyys, testattavuus)
- koodin testattavuus (keskitetään sivuvaikutukset yhteen paikkaan, muu toiminta funktioihin)
Automatisointiajattelu:
- ongelman jakaminen osiin ja ratkaiseminen pala kerrallaan
- toistuvien rakenteiden huomaaminen (patterns)
- yksittäinen ratkaisun yleistetäminen (abstraktio)
- vaiheettaisten ohjeiden laatiminen ongelman ratkaisemiseksi (algoritmi)
Uusi tuntijako
Tehtäväsetit pyritään rakentamaan niin, että 3 ensimmäistä tehtävää ovat helpohkoja suoraviivaisia tehtäviä, joiden tekeminen riittää asian perustasoiseen hallintaan. Tehtävissä voi olla mukana myös ns. lisähaaste nopeimmille (saman tiedoston lopussa). Tämän lisäksi on tarjoalla 3 haastavampaa tehtävää, nopeammille oppilaille tai sellaisille ryhmille, joiden lähtötaso on korkeampi tai joilla on enemmän aikaa käytettävänä ohjelmointiin (esim. painotusluokat tai valinnaisaineet).
Tässä vielä hahmotelma eri osa-alueiden jakautumisesta eri vuosiluokille:
Videot
Opettajan materiaalia sekä Koodiaapinen MOOC:ia varten tekemäni ohjelmointivideot ovat olleet käytössä myös oppitunneilla vaikka niitä ei ole tehty, eikä suunniteltu oppilaiden käyttöön. Videoita saa toki käyttää tunneilla, jos ei koe niitä liian pitkä piimäisiksi. Tavoitteenani olisi tehdä lyhyempiä oppitunnille sopivampia opetusvideoita keskeisimmistä teorian kohdista, tosin tällä hetkellä tämä näyttäisi jäävän seuraavaan syksyyn... Näiden videoiden tarkoitus olisi selventää järjestelmän toimintaa ilman koodia, eli kirkastaa sitä mitä konepellin alla pyörii eli auttaa opiskelijaa muodostamaan selkeämpi "notional machine" kaiken tauhkan alta. Lisää tämän "käsitteellisen koneen" merkityksestä automatisointiajattelun synnyssä löytyy täältä.Näiden suuntaviivojen myötä alkaa tehtävien uudelleen muotoilu sekä järjestäminen. Myös kevään MOOC seuraa tätä uutta jakoa. Katsotaan millaista palautetta nyt saadaan.
Ei kommentteja:
Lähetä kommentti