Ohjelmointia opettajille

Suomen LUMA-keskuksen LUMATIKKA-täydennyskoulutusohjelmassa [1] on kaksitoista maksutonta verkkokurssia. Keväällä 2021 järjestettiin muiden muassa Ohjelmoinnin merkitys matematiikan opetuksessa.

Ohjelmointi on mukana useammallakin LUMATIKKA-ohjelman kurssilla [2], mutta Ohjelmoinnin merkitys matematiikan opetuksessa -kurssilla se on pääosassa. Ohjelmointikielenä on Python. Kurssin laajuus on kaksi opintopistettä, ja se koostuu kahdesta osasta: ohjelmointiharjoittelusta ja oppilaiden kanssa tehdystä kokeilusta.

Kurssin parasta antia on ehkä ollut mahdollisuus saada seurata kurssiraporttien kautta toisten kurssilaisten oppimista ja heidän toimintaansa omien oppilaittensa kanssa.

Edellisen lukuvuoden 2019–2020 aikana tämän kurssin suoritti runsaat sata opettajaa tai opettajaopiskelijaa varhaiskasvatuksesta toiselle asteelle. Kolmasosa (30

Ohjelmointikielenä Python

Python on ajankohtainen valinta ohjelmointikieleksi. Riippumaton asiantuntija, Helsingin yhteislyseon matematiikan ja luonnontieteiden opettaja Mikko Rahikka kommentoi Pythonia näin:

− Python on helppo oppia vaikkapa oppilaan ensimmäisenä kielenä. Se soveltuu loistavasti pikku skriptien kirjoittamiseen, vaikkapa matikan ongelmien ratkomiseen for–next-silmukoilla. En juurikaan ole käyttänyt muita ohjelmointikieliä sen jälkeen, kun tutustuin Pythoniin. Sen avulla ratkon ne ongelmat, joihin GeoGebra ei sovellu.

− Vaikka Pythonin alkuperäisenä ideana oli koodin helppo luettavuus, niin aika monta kertaa törmää esimerkkeihin, jotka käyttävät ohjelman kaikkein eksoottisimpia ominaisuuksia ja menetelmiä. Kun katson omaa koodianikin, niin aina en tajua, miten koodi toimii.

− Pythonissa on sisään rakennettuna mahdollisuus ajatella oliot funktioina tai objekteina, niinpä ohjelmoidessa voi käyttää montaa eri lähestymistapaa.

Lisää tietoa ja esimerkkejä on hänen blogissaan [4].

Ohjelmoinnin harjoittelu

Kurssi on rakennettu käyttäen hyväksi olemassa olevaa materiaalia. Ohjelmointiosa rakentuu Tie koodariksi -järjestelmän Ohjelmoinnin alkeet -kurssin [5] varaan. Se on kaikille avoin sivusto, joka rakentuu 12 luvusta ja 84 tehtävästä. Järjestelmä on ollut käytössä vajaat kolme vuotta. Sinä aikana käyttäjiä, sekä opettajia että oppilaita, on ollut lähes 15 000 eri puolelta Suomea.

− Tehtäviä on tehty lähes miljoona, kertoo järjestelmän ylläpitäjä, yliopistonlehtori Antti Laaksonen Helsingin yliopistosta.

Tehtävissä käydään läpi ohjelmoinnin perusteita alusta pitäen. Ensimmäinen ohjelma on yksirivinen print(”a on apina”). Tästä päätellen ohjelmoinnin opettamisen perusideat ovat säilyneet pitkään samoina, sillä lähes 50 vuotta sitten käymälläni ensimmäisellä atk-kurssilla ensimmäinen Basic-kielinen ohjelma oli PRINT ”Hello!”

Kurssin suorittamiseksi on ratkaistava vähintään 36 tehtävää. Aluksi käydään läpi Pythonin lauseoppia, mikä ei kaikkien kurssilaisten mielestä ole kovin motivoivaa ainakaan oppilaille, mutta pakollista, jos aikoo ryhtyä ohjelmoimaan itsenäisesti. Ohjelmointiympäristö pitää kirjaa suorittamisesta, joten opiskelija voi keskittyä oppimiseen.

Automaattinen ratkaisuntarkistin on armoton. Se hylkää ratkaisun sellaisestakin pienestä erosta, jota tehtävänannossa ei ole edes sanottu. Ei ihme, että joku kurssilainen jäi välistä ”miettimään, että miksi oikean näköinen tuloste ei kelpaakaan vastaukseksi”. Kurssin henkilökunta oli kuitenkin valmis vastaamaan yksityiskohtaisiinkin kysymyksiin, joten itsekseen tuskastelemaan ei ollut tarvetta jäädä.

Aika nopeasti päästään kuitenkin ohjausrakenteisiin, funktioihin, merkkijonoihin ja listoihin. Tehtävät vaikeutuvat haastavasti niin, että jo tehtäväkokoelman puolivälissä pientä ohjelmointikokemustakin omaava opettaja saa hieroa älynystyröitään. Muutamilla luvuilla on sisältöotsikko, esimerkiksi Collatzin algoritmi ja Eratostheneen seula. Edellinen oli yllättäen vanha tuttavuus, sillä olin kirjoittanut siitä oppilaslehteen vuonna 1984 [6]. Silloin sen nimi oli 3N+1-ongelma.

Monentasoista kokemusta

Ohjelmointikokemukseltaan kurssilaiset olivat hyvin kirjava joukko aivan aloittelijoista monia ohjelmointikursseja suorittaneisiin ja monia ohjelmointikieliä osaaviin. Aloittelijat pitivät harjoitustehtäviä vaikeina, mutta järjestelmä antaa myös malliratkaisuja opettajana kirjautuneille. Monilla kurssilaisilla oli myös kokemusta ohjelmoinnin opettamisesta esimerkiksi code.org-sivuston [7] avulla. Siellä on materiaalia sekä opettajille että oppilaille. Näyttökieli on valittavissa myös suomeksi.

Toisena kurssitehtävänä oli suunnitella ohjelmointiharjoitus omille oppilaille. Pohjamateriaaliksi tarjotaan toistakymmentä tehtäväehdotusta, opettajan ohjeita ja muuta perustietoa sisältävää kirjasta Ohjelmointia matematiikan opetukseen [8]. Myös Tie koodariksi -tehtäviä käytettiin tämän jakson aiheina.

Kirjasen tehtäväehdotuksia ovat muiden muassa lukujen tutkiminen (lukujonoja ja summia), Pythagoraan lukukolmikkojen etsiminen, tietokoneen laskentanopeuden tutkiminen, keskustelevan ohjelman laatiminen, todennäköisyys ja kielen tunnistaminen.

Riitta Kotilainen Pielaveden yhtenäiskoulusta arvioi tehtäväehdotusten soveltuvuutta kahdeksasluokkalaisista koostuvan tvt-ryhmänsä oppilaille näin:

− Luin kirjasen läpi ja totesin, että oppilaani eivät pysty tekemään harjoituksia suoraan ja ymmärtää tekemäänsä, koska olemme vasta aloittaneet Python-ohjelmoinnin. Harjoituksissa oli mielestäni liikaa uusia asioita (muuttujat, funktioita, kirjastoja) samassa ohjelmassa ilman selityksiä, miksi näin tehdään. Valitsin kuitenkin ihan ensimmäisen tehtävän Luvun muodostaminen pohjaksi, mutta muokkasin sitä.

Hänen huolenaan on erityisesti kokonaisuuden ymmärtäminen, jotta ohjelmointi ei jäisi vain ulkokohtaiseksi sääntöjen varassa puuhasteluksi.

Pohdiskelua

MOOC-ympäristö automatisoituine toimintoineen on kätevä laajan kurssimateriaalin ja monien käyttäjien kurssisuoritusten hallinnointiin. Joissakin kohdin olisin kovasti toivonut, että kriittisissä kohdissa olisi ollut yksityiskohtaisempia ohjeita. Jouduin – ja kyselyistä päätellen muutama muukin kurssilainen – pyytämään apua saadakseni haluamani suorituksen tehdyksi tai raportoiduksi. Neuvoja kyllä sai auliisti kysyttäessä.

Jokaisella ohjelmointikielellä on oma lauseoppinsa, jonka yksityiskohdat on vain opeteltava. Sen lisäksi, että ohjeissa opastetaan oikea muoto, olisi mukava tietää ja ymmärtää vähän enemmän. Miksi rakenteet ovat sellaisia kuin ovat ja miten kieli on saanut nykyisen muotonsa? Perinne näyttää kuitenkin olevan se, että ohjelmointia opetetaan niin, että aloittelevan ohjelmoijan ei ole tarpeen ymmärtää lauseopin perusteita syvällisemmin ainakaan metatasolla, kunhan vain toimii ohjeen mukaan. Tästä on esimerkkinä silmukkatoisto, jonka pituuden voi määrätä. Komento range(30) tuottaa 30 toistoa indeksin arvoilla 0, 1, 2, 3, …, 29. Miksi lähdetään liikkeelle nollasta ja miksi annetaan toistojen lukumäärä eikä indeksin suurinta arvoa?

Kurssilla tarjotusta tehtävämateriaalista päätellen ohjelmoinnin harjoitustehtävien luonne on muuttunut vain vähän 40 vuodessa. Tehtävät herättivätkin tämän jutun kirjoittajassa vähintään yhtä paljon nostalgisia muistoja ja elämyksiä kuin tuottivat onnistumisen iloa. Tekstin tulostamista, merkeistä rakentuvia kuvioita, paljon laskemista. Siis aivan samantapaisia asioita kuin silloin ennen, kun tietotekniikka oli koulussa oppiaineena ja ohjelmointi oli sen olennainen osa.

Collatzin algoritmin mainitsinkin jo aikaisemmin. Vähän sellaisia graafisia tehtäviä, joilla Logo-kielen käyttäjät opettelivat käyttämään tietokonetta 1980-luvulla. Enemmän 1970-luvun lopun ja 1980-luvun alun tyylisiä tehtäviä, joita Paavo Aaltonen esitteli Funktio-lehdessä atk-palstallaan vuosina 1981–1983, sekä Raili ja Juhani Juntunen vuonna 1984 aiheina ”Basic-kieleen tutustuminen yläasteen matematiikan avulla” ja ”Yhtälöiden ratkaiseminen tietokoneella”. Muiden muassa näitä vuosia olen muistellut jutuissani [9] [10].

Se yllätti kovasti, että vielä lukiotasolla jossakin koulussa saattoi olla opetusryhmä, jonka 30 oppilaasta kukaan ei ollut tutustunut aikaisemmin ohjelmointiin. Tilanne on kovin kirjava, sillä toisaalta saattoi olla lukio, jossa ohjelmointia opetetaan ohjelmointikurssilla. Muutosta on ehkä odotettavissa yleisestikin, sillä ohjelmointi on tulossa myös alaluokkien opetukseen uusien opetussuunnitelmanperusteiden myötä. Tosin jotkut opettajat epäröivät vieläkin sen mukaan ottamista. Eräs kurssilainen ilmaisi asian näin: ”Ohjelmointi ei suoranaisesti kuulu lukion opetussuunnitelmaan.”

Tärkeä perustaito

Ohjelmointi voidaan nähdä nykyään yhtä tärkeäksi perustaidoksi kuin lukeminen, kirjoittaminen ja laskeminen. Ilman koulun toimia asia ei kuitenkaan etene koko ikäluokan osalta, vaikka jo parikymmentä vuotta sitten amerikkalainen kasvatustieteilijä Marc Prensky puhui diginatiiveista ja esitti, että teknologian keskelle syntyneellä uudella sukupolvella on luonnostaan hyvät digitaidot. Tämän kiistää Helsingin yliopiston kasvatustieteen professori Katariina Salmela-Aro ja kirjoittaa [11], että ”diginatiiveja ei oikeasti ole. Myös nuoret voivat olla digimuukalaisia. Taidot kyllä kehittyvät voimakkaasti nuoruudessa, mutta vain silloin, kun niihin panostetaan koulussa ja kotona.”

Samansuuntainen näkemys sisältyy opetus- ja kulttuuriministeriön tuoreeseen koulutuspoliittiseen selontekoon[12]. Siinä sanotaan, että ”vapaa-ajalla tapahtuva aktiivinen digitaalisten laitteiden käyttö ei riitä kartuttamaan tarvittavia taitoja digitalisoituvassa yhteiskunnassa toimimiseen. Perusopetus ei kykene tässä vaiheessa tarjoamaan tasa-arvoisia oppimismahdollisuuksia digitaalisten taitojen kehittymiselle.” Opettajien taidoista selonteko antaa lohduttoman kuvan, sillä sen mukaan lähes puolella opettajista ei ole riittäviä ohjelmointitaitoja ja vain joka viides opettaja ilmoitti kokeilleensa ohjelmointia oppilaiden kanssa.

Selonteossa ohjelmointi nähdään ensisijaisesti teknisenä taitona. Digitaalisuutta ja uusia teknologioita tarkastellaan ensisijaisesti yhteiskunnalliselta kannalta arki- ja työelämässä. Siinä – ainakaan luonnosversiossa – ei puututa ohjelmoinnin yleissivistävään ja maailmankuvaa muokkaavaan merkitykseen. Ohjelmointi on kuitenkin se kieli, jolla pidämme yhteyttä koneiden kanssa. Jonkinlaisen periaatteellisen käsityksen antaminen ohjelmoinnista kaikille oppilaille olisi tärkeää siksi, että jo alkeistason osaaminen auttaisi nuoria ymmärtämään, miten yhä teknistyvämpi ympäristömme toimii ja millaisia valmiuksia se vaatii ja mahdollisuuksia antaa. Oppimisen kannalta ei myöskään ole aivan merkityksetöntä se, että ohjelmointi on omaa tekemistä, aktiivista oppimista.

Lähteitä ja lisää luettavaa

[1] LUMATIKKA-koulutuksen rakenne osoitteessa https://lumatikka.luma.fi/rakenne/

[2] Opettaja, LUMATIKKA 3 -kursseilta ideoita matematiikan integroimiseksi! osoitteessa https://lumatikka.luma.fi/nyt/tag/ohjelmointi/

[3] LUMATIKKA3: Programmering https://lumatikka.luma.fi/sv/programmering/.

[4] MIKON FYSIIKKA JA MATIKKA https://mikonfysiikka.wordpress.com/tag/python/

[5] Tie koodariksi, ohjelmoinnin alkeet osoitteessa https://tie.koodariksi.fi/alkeet/0

[6] Korhonen. H. Puppusanoista lukuketjuihin. Funktio 2/1984 s. 10–11.

[7] Ohjelmoinninopetussivusto code.org osoitteessa https://code.org/

[8] Laaksonen, A. ja Erfving, E. Ohjelmointia matematiikan opetukseen, 16 s. Saatavissa myös avointen oppimateriaalien kirjastosta https://aoe.fi/#/materiaali/338

[9] Korhonen. H. Tietotekniikan kouluopetuksen nousu ja tuho. Dimensio 2/2011, s. 36–37.

[10] Korhonen, H. Koodauksen historiaa: Logo. Dimensio 1/2018, s. 36–41.

[11] Salmela-Aro, Katariina: Diginatiiveja ei ole. Helsingin yliopiston tiedelehti Yliopisto 2/2021, s. 49.

[12] Opetus- ja kulttuuriministeriö. Koulutuspoliittinen selonteko. Luonnos 8.12.2020 osoitteessa https://www.lausuntopalvelu.fi/FI/Proposal/Participation?proposalId=20b02103-fcef-4d3a-b761-d2e05523a6b1

Kirjoittaja