Yleisiä ohjeita visualisointien käyttöönotosta ohjelmointikurssilla Tuukka Ahoniemi Ohjelmistotekniikan laitos, TTY tuukka.ahoniemi@tut.fi Yleistä Tämä teksti käsittelee yleisellä tasolla ohjelmoinnin visualisointeja ja niiden tekemiseen käytettäviä työkaluja. Tarkoituksena on tuoda ilmi seikkoja, jotka tulisi ottaa huomioon otettaessa käyttöön kurssimateriaalin oheen visualisointityökalu tai kokonaan uutta työkalua suunniteltaessa. Tämä on tärkeää, jotta visualisointiesimerkkien käyttö kurssilla ei jää vain mielenkiintoiseksi kokeiluksi vaan, että opiskelijat kokevat voivansa käyttää visualisointeja tukimateriaalina pitkin kurssia. Teksti on tehty muutaman kirjallisuuslähteen pohjalta sovellettuna TTY:llä saatuun kokemukseen VIP työkalun (http://www.cs.tut.fi/~vip) käyttöönotosta saatuihin kokemuksiin ohjelmoinnin peruskursseilla. Tarkoituksena on siis helpottaa niitä ongelma, jotka ovat liittyneet jo olemassa olevien visualisointien käyttöönottoon. Näitä ovat [1]: Hyvien esimerkkien hakemiseen kuluva aika Uuden työkalun opetteluun kuluva aika Visualisoinnin tekemiseen kuluva aika Kunnollisten kehitystyökalujen puute Aika, joka opettajalta kuluu visualisointien liittämiseksi omaan opetuslähestymistapaan ja/tai kurssimateriaaliin.
Suositeltavia ominaisuuksia Alustariippumattomuus Mahdollisimman suuren yleisön tavoittamiseksi ohjelman pitäisi toimia erilaisissa työympäristöissä samalla tavoin. Hyvä vaihtoehto sille, että erikseen ylläpidetään eri versioita eri käyttöjärjestelmillä, on työkalun jakelu JavaApplettina, tai ohjelmana. Virtuaalikoneella vältetään eri alustojen ongelmat. Näistä kahdesta verkossa kotisivuilla pyörivä JavaAppletti on käyttäjän kannalta helppokäyttöisempi ja vaivattomampi, mutta ongelmana on estetty pääsy paikallisiin tiedostoihin kuten mahdollisiin aputeksteihin. JavaAppletin ympärille on kuitenkin rakennettava riittävän kattavat WWW sivut, joista kaikki tarvittava opastus on löydettävissä. [1] [2] Hyvä käytettävyys Sekä opiskelijan että opettajan kynnys käyttää visualisointityökalua joko itseopiskeluun tai oman opetuksensa tukena voi olla korkea. Jos työkalu vaikuttaa epäselvältä ja sen opettelemiseen kuluu aikaa, voi moni opiskelija turhautua ennen kuin saa mitään hyötyä koko työkalusta. Turhautumista aiheuttaa eritoten myös käyttöönottoon kuluva aika, joka koostuu työkalun löytämisestä, lataamisesta, asennuksesta ja opettelusta. Opettajan tapauksessa aikaa kuluu lisäksi visualisointiesimerkkien suunnitteluun ja sovittamiseen omaan opetusmateriaaliin, työkalun opettamiseeen opiskelijoille sekä ylläpitoon. [1] Käyttöönottoon kuluvaa aikaa voidaan opiskelijan osalta helpottaa JavaAppletin avulla, joka ei vaadi latausta tai asennusta. Helposti ja nopeasti tehtävät esimerkit Opettajan ajankäytön minimoimisessa esimerkkien toteutukseen kuluvalla ajalla on valtava merkitys. Opetuksen kannalta esimerkkien määrällä on iso merkitys, joten niiden toteuttamisen on oltava yksinkertaista ja nopeaa. Paras ratkaisu tähän on visualisointityökalun rakentaminen tulkin päälle, jolloin itse esimerkkikoodin voi kirjoittaa sellaisenaan ohjelmointikielellä. Koodirivejä ennen lisätään erityisiä tulkin ymmärtämiä ohjetekstejä, jotka sitten näytetään opiskelijalle samaista koodiriviä ajettaessa. Näin esimerkin voi kirjoittaa samaan tapaan kuin kyseisen koodinpätkän esittelisi opiskelijoille: koodia pala kerrallaan ja samalla siihen liittyvä selitys. Käyttäjän mahdollisuus vaikuttaa esimerkkeihin Sen sijaan, että visualisoitaisiin aina samaa esimerkkiä samoilla syötteillä, tulisi
käyttäjän pystyä käyttäjän antamaan myös omia syötteitä esimerkkeihin. Tämänkin voi toteuttaa kahdella tasolla: Käyttäjän tulisi vähintään pystyä antamaan johonkin yksittäiseen esimerkkiin esim. omia lukuja syötteenä, jotka vaikuttavat esimerkin lopputulokseen. Asian ymmärtäminen helpottuu, kun samaa esimerkkiä voi ajaa useaan kertaan ja eri syötteillä. Laajemmin käyttäjän syötteiden sallimisen voi toteuttaa antamalla käyttäjän syöttää omaa koodia koodieditorin avulla. Koodin lisäämiseksi työkalun pitää olla tulkkipohjainen. Tämänkin voi toteuttaa kahdella tavalla: Käyttäjä voi muokata olemassaolevaa koodia kokonaisuudessaan, vaikka kokonaan omaksi koodikseen ja katsoa ohjelman animoivan sitä. Toinen vaihtoehto on antaa käyttäjän muokata tiettyä osaa koodista tehtävämuotoisesti, esim. Muuta silmukan sisältöä siten, että se lopettaa, kun taulukko on järjestyksessä. Tehtävämuotoisista esimerkeistä opiskelijalle on annettava palautetta sekä onnistumisesta että eritoten epäonnistuttaessa siihen johtaneet syyt ja vinkkejä korjaamiseen olisi syytä antaa. Useat samanaikaiset näkymät Esimerkkiä tulisi voida katsoa samanaikaisesti useasta eri näkymästä [3]: koodin kulku, muistin tila, suorituskohtaan liittyvät ohjeet, tulosteikkuna, lausekkeiden evaluointi ikkuna yms. Useat näkymät tukevat kokonaisvaltaista ymmärtämistä ja ottavat huomioon eri tavoin oppivat ihmiset. Esimerkiksi ohjelman muistissa tapahtuvat animaatiot tukevat visualisesti oppivia, kun toisaalla suorituskohtaan liittyvät selitykset tukevat niitä ihmisiä, joiden on helpompi oppia tekstistä lukemalla. Yhtenevyys muuhun materiaaliin Valmiiden esimerkkien liittäminen omaan opetusmateriaaliin voi olla vaikeaa erilaisista lähestymistavoista johtuen. Opettaja joutuu siis mitä todennäköisimmän tukeutumaan itse tehtyihin esimerkkeihin, jolloin edelleen korostuu esimerkkien teon helppous ja nopeus. Itse esimerkkien lisäksi tärkeä osa omaan materiaaliin liittämisessä on myös itse animoinneilla. Monet ohjelmointia opettavat luennoidessaan edesauttavat ymmärtämistä visualisoimalla opetettavaa asiaa piirtämällä kuvia tietorakenteista käsin. Mitään yhtenevää kuvauskieltä tähän ei kuitenkaan, ainakaan yleisesti, ole käytössä, ja eri opettajat yleensä animoivat tietorakenteita nimenomaan aiempia, esim. kirjallisuudessa esiintyneitä, tapoja parhaaksi katsomallaan tavalla soveltaen. Esimerkkinä kuvassa 1 muutamia eri tapoja kuvata nollaosoitinta.
Kuva 1 Erilaisia tapoja esittää nollaosoitin graafisesti Jos kurssilla on tarkoitus käyttää opetuksen apuna jotain visualisointityökalua, on kuitenkin tärkeää, että samat piirrosnotaatiot ovat käytössä sekä opetuksessa käsin piirrettynä, että visualisointityökalussa. Siten visualisointityökalun käyttämä piirrosnotaatio on syytä dokumentoida hyvin. Toinen yhtenevyysseikka muun materiaalin kanssa on ohjelmointityyli. Erityisesti ensimmäisellä ohjelmointikurssilla opiskelijoilla on tapana sovelletusti matkia oppimateriaalia syvemmän ymmärtämisen sijasta. Jos visualisointiesimerkkien tyyliseikat eriävät muusta materiaalista, on hämmennyksen vaara ilmeinen. Pientenkin yksityiskohtien, kuten palautetaanko pääohjelmasta arvo 0 vai EXIT_SUCCESS tulisi olla yhteneviä. Selkeät esimerkit Yksittäisen esimerkin tulisi keskittyä demonstroimaan yksittäistä asiaa. Jos esimerkki on liian monimutkainen ja pitkä, voi opiskelija kyllästyä esimerkin läpikäyntiin tai olla huomaamatta osaa tärkeistä asioista. Esimerkin yhteydessä on myös selvästi kerrottava, mitä esimerkin on tarkoitus demonstroida ja mihin sitä läpikäydessä kannattaa kiinnittää huomiota. Esimerkkikoodien, joiden tarkoituksena on demonstroida esimerkiksi vain jotakin tiettyä rakennetta tai kielen erikoistapausta, ei tarvitse olla sellaisia, että aina ratkaisisivat jonkun hyödyllisen ongelman. On tietenkin hyvä, että koodi on hyödyllistä (kuten karkausvuoden tarkastelu), mutta tällaisen kytköksen vaatiessa esimerkin pituuden reilua kasvattamista on syytä kyseenalaistaa, saavutetaanko tällä mitään erityistä hyötyä mielekkyydessä suhteessa siihen, että esimerkin varsinainen opetuksellinen tavoite voi jäädä jopa saavuttamatta. Saman asian eri oppimisvaiheiden tukeminen Perusohjelmointikursseilla visualisointeja käytetään yleensä vain esittelemään uusia asioita perusteellisesti, jolloin niiden käyttötarkoitus on lähinnä luentojen syvällisempi, opiskelijan omaan tahtiin tapahtuva kertaaminen. Koko kurssin kannalta tämä jättää kuitenkin mahdolliset visualisointien käyttötilanteet kuitenkin kohtalaisen vähäiseksi. Ymmärrettyään tietyn asian, ei opiskelijalle enää ole mielekästä käyttää
visualisointeja koskien kyseistä asiaa. Näiden esittelevien esimerkkien lisäksi tarjoamalla opiskelijalle myös visualisointeja, jotka vaativat paljon enemmän osallistumista, tuetaan myös ymmärtämisen jälkeistä oppimista. [4] Enemmän oppimista vaativat visualisoinnit voivat olla esim. tehtäviä, missä opiskelijan täytyy muuttaa valmiiksi visualisoitua koodia tai analysoida, mitä joku monimutkaisempi koodinpätkä tekee. Tällaiset tehtävät on myös mahdollista integroida osaksi kurssin viikottaisia viikkoharjoituksia. Lähteet [1] iticse 2003 working group reports: Evaluating the Educational Impact of Visualization, T. Naps et al., SIGCSE Bulletin, June 2003 [2] A Testbed for Pedagogical Requirements in Algorithm Visualizations, G. Rössling, and T. Naps, ITiCSE '02, June 2002 [3] ITiCSE 2002 working group report: Exploring the Role of Visualization and Engagement in Computer Science Education, Naps et al. SIGCSE Bulletin, June 2002 [4] Visualizations to Support Programming on Different Levels of Cognitive Development, E.Lahtinen, and T. Ahoniemi. Proceedings of the Fifth Finnish/Baltic Sea Conference on Computer Science Education, November 2005.