OLO-sessiot

Sisällys

Tapaus 0 ja OLO-menetelmä

Ensimmäisessä tapauksessa tutustuimme lähinnä OLO-menetelmään eli ongelmalähtöiseen oppimiseen. OLOssa tutustutaan virikkeisiin ja keksitään virikkeisiin sopiva työotsake. Seuraavaksi on vuorossa virikkeiden pohtiminen yhdessä. Käytännössä tämä tarkoittaa post-it-lappujen liimailemista ja järjestämistä taululle ja näiden pohjalta ratkaisun kehittämistä. Sen jälkeen asetetaan oppimistavoitteet, joiden mukaan ryhmän jäsenet opiskelevat itsenäisesti ja yrittävät keksiä virikkeisiin ratkaisuja. Viimeisenä, purussa, noin viikon itseopiskelun jälkeen kerätään ryhmän jäsenien kehittämät ratkaisut ja menetelmät.

OLO-sessioissa piti olla 80-prosenttisesti paikalla kurssin läpäistäkseen. Kurssiarvosanaan OLO-aktiivisuus ei kuitenkaan vaikuta, joten sessioissa aktiivisuus ei ollut paras mahdollinen ainakaan itselläni.

Tapaus 1: Javan perusrakenteet

Ensimmäinen "oikea" OLO-tapaus koski Javan syntaksia ja perusrakenteita. Meille annettiin vain koodi käteen ja sen toiminnasta piti saada selkoa. Ryhmässämme vain parilla oli aikaisempaa ohjelmointikokemusta, joten vähemmän yllättäen Java-syntaksi tuotti meille suuria ongelmia. Itse jonkinlaisen ohjelmointikokemuksen omaavana sain suurimmasta osasta riveistä selvää, mutta luokista, metodeista, niiden välisistä suhteista ja suorittamisjärjestyksestä minulla ei ollut mitään hajua.

Päädyimme pitkän pohdinnan (ja assarien hyvien vinkkien) jälkeen seuraaviin määritelmiin:

(Kuvausten pukemisen sanoiksi tehnyt Riikka Mäenpää)

Tapaus 2: Javaohjelmoinnin filosofiaa

Toisessa tapauksessa virikkeenä oli kuvaukset Platonin ideaopista ja toisaalta Javan luokka-olio-suhteesta. Lisäksi meille annettiin Aristoteleen näkemys samasta asiasta ja ote Ola Larsmon esseestä, josta en ainakaan henkilökohtaisesti saanut oikein mitään irti.

Vielä toinen (kolmas) tapaus meni hyvin menetelmää opeteltaessa ainakin minun kohdallani. Kirjoittamieni lappujen määrä oli laskettavissa lähes nollan käden sormilla eikä muutenkaan ideoita liiemmin esiintynyt.

Tapaus 3: kokoelmat ja taulukot

Kokoelmat ja taulukot, ah, vihdoin jotain konkreettisempaa. Tämä aihe sopi minulle huomattavan paljon paremmin kuin niin teoreettiset aikaisemmat virikkeet. Vieläkään en, ehkä osittain menetelmän outouden takia, osannut lappuja kirjoitella, mutta sain edes virikkeen ongelmien toteutusohjeita kakistettua kurkustani.

Oppimistavoitteet meillä oli suoraan sanottuna kehitetty "nopeasti täältä pois" -meiningillä. Meillä oli tavoitteena selvittää taulukkojen ja kokoelmien syvintä olemusta ja käyttöä sekä miettiä verkkokirjakaupan kehittämistä. Varsin järkeviä siis. Vähemmän yllättäen purussa ei mitään kovin konkreettista ja järkevää tullut esille.

Tapaus 4: Liikkumisalgoritmi

Neljännessä ja mielestäni mielenkiintoisimmassa tapauksessa kehitettiin labyrintissä suunnistavalle robotille (tai oliolle) liikkumisalgoritmia. Toisena positiivisena asiana tapauksesta oli suoraa käytännön hyötyä seuraavaa Java-tehtävää tehdessä, siinä kun piti toteuttaa olennolleen jonkinlainen liikkumisalgoritmi.

Tapauksessa annettiin neljä erityyppistä, vaikeustasoltaan kovenevaa labyrinttiä, joihin jokaiseen piti suunnitella oma reitinhakualgoritmi. Ryhmämme ryhtyi kuitenkin suunnittelemaan kaikille labyrinteille yhteistä algoritmia, mikä yllättäen ei ollut kovin helppoa. Osittain tästä johtuen meillä jäikin puolet labyrinteistä kokonaan käymättä ja ne määrättiin kotiläksyksi eli oppimistavoitteisiin.

Taululle kehittelimme Tommin ehdottaman "oikea käsi seinässä" -algoritmin jonain pseudokoodin ja Javakoodin välimuotona. Tätä menetelmää käytin myös omassa harjoitustyössäni ihan kohtuullisella menestyksellä.

Tapaus 5: Rekursio

Viidennessä olo-tapauksessa olin vierailevana tähtenä ensimmäisen OLO-ryhmän sessiossa. Tämän olo-ryhmän menetelmä poikkesi omastamme suuresti, luottaen enemmän avoimeen keskusteluun kuin (hieman karrikoiden) satunnaisten lappujen liimailuun. Ryhmässä tunnuttiin saavan enemmän aikaan kuin omassani, tosin osittain tämä johtui varmaankin siitä, että ryhmässä oli muutama jo aikaisemmin Javan kanssa tutuksi tullutta koodaajaa.

Itse sopeuduin jopa paremmin tähän suullista keskustelua painottavaan oppimistapaan, mikä on perin kummallista ottaen huomioon suullisen viestinnän taitoni. Osasyyllisenä tosin taisi olla se, että jostain syystä mietin kaikkea painettua (kirjoitettua) tekstiä huomattavasti tarkemmin kuin puhuttua, ja se OLO-sessioiden aivoriihimäisessä toiminnassa ei ole erityisen hyväksi.

Itse tapauksessa meille annettiin virikkeenä kahden toString-metodin ristikkäin kutsumisen aiheuttama loputon rekursio ja sen aiheuttama StackOverflowException. Päädyimme ongelman ratkaisemiseksi (kiertämiseksi) yksinkertaisesti muuttamaan (supistamaan) metodien tulostamista siten, ettei rekursiota pääse syntymään.

Viimeisessä virikkeen osassa oli kolme luokkaa, abstrakti Tiedosto-luokka ja perivät Dokumentti ja Kansio. Luokat siis kuvaavat yksinkertaista tiedostojärjestelmää. Virikkeessä tehtävänä oli toteuttaa tiedostojärjestelmän perustoimintojen, kuten tiedostojen siirtämisen ja koon näyttämisen, javakielinen toteutus.

Pidin myös suuresti huumoripitoisista virikkeistä "PHP - onko tämä sinusta hauskaa?" ja rekursien tietosanakirjamääritelmä.

Tapaus 6: Ohjelmavirheet ja testaaminen

Tapaus kuutosessa saimme eteemme pienen pätkän ohjelmakoodia, josta piti löytää ja korjata virheet. Saimme huomata toisen koodin, josta ei itsellä ole mitään tarkempaa tietoa, debuggauksen erittäin hankalaksi ja ikäväksi hommaksi, ilmeisesti virikkeen tarkoituksena oli saada meidät testaamaan omia softiamme siten, ettei muiden sitä tarvitse tehdä.

Tämänkertainen toinen virike oli mielestäni huomattavasti mukavampi (kuitenkaan mitenkään väheksymättä ensimmäisen tärkeyttä), siinä oli tietokoneohjelman tekemisen haastavuuden neljä pääsyypäätä:

( http://www2.cs.hut.fi/~studio1/olo/tapaus6/)

Oppimistavoitteiksi saimme lähinnä pohdittavaa, mm. miksi ohjelmia tarvitsee testata ja miten virheitä löydetään. Konkreettisempana tavoitteena oli meiltä hyvin väliin jäänyt virheiden etsiminen ensimmäisestä virikkeestä, ei siis mitään herkkua sekään. Viikon päästä purussa ei kovinkaan paljon pohtimisen tulosta näkynyt. Tämä tapaus oli todennäköisesti ikävin näistä kymmenestä, mutta varmasti hyödyllinen.

Tapaus 7: Pelitilanteen tallentaminen

Seitsemännessä tehtävässä meille annettiin pohdittavaksi pelitilanteen, kuten seikkailupelissä tai Tetriksessä, tallentamista tiedostoon pelin jatkamista varten.

Ratkaisuksi virikkeen ongelmaan tarjosimme olioiden attribuuttien tallentamista tiedostoon. Isommille (keskenään samankaltaisille) tiedostoille ehdotin myös ns. mallitiedostoa, josta poikkeavat tiedot tallennettaisiin pelikohtaisiin tiedostoihin. Tällä päästäisiin pienempiin tiedostokokoihin tulkitsemisajan kustannuksella. Saimme myös selville, että Integer- ja Double-luokista löytyy metodit merkkijonomuodossa olevien lukujen tulkitsemiseksi kokonais- tai liukuluvuiksi.

Mielestäni tekstitiedostoon tallentaminen sopii hyvin olioille, joiden attribuutit ovat yksinkertaisia (alkeistyyppejä, merkkijonoja...), mutta jo kokoelmien kanssa tallentamisesta voi tullaa hyvin monimutkainen prosessi vähänkään isommalla ohjelmalla. Isommilla ohjelmilla helpompi tapa voi olla sarjallistaminen, johon emme ehtineet tapauksen yhteiskäsittelyn aikana pääsemään, vaan se jäi oppimistavoitteeksi. Sarjallistamisessa oliot tallennetaan suoraan binääritiedostoina, jolloin aikaa ei tarvitse hukata tyyppimuunnoksissa.

Tapaus 8: digitaalinen valokuva-albumi

Kahdeksannessa tapauksessa meille annettiin mietittäväksi valokuva-albumisoftan toteuttaminen ja sitä kautta Swingin sekä graafisuuden ihmeelliseen maailmaan.

Erityisesti saimme vastuullemme käyttöliittymän suunnittelemisen. Päädyimme lopulta kevyeen lookiin, jossa kuva näytetään isolla ja sen alapuolella on minimalistiset eteenpäin-taaksepäin-hallintanapit.

Oppimistavoitteiksi saimme miettiä, mitä swing-luokkia toteutuksessa tulisi käyttää, miten komponentteja käytetään ja mitä tapahtuu seuraava-nappia painettaessa.

Purussa päädyimme GridBagLayoutin tai BorderLayoutin käyttämiseen asettelijana sekä kuvien toteuttamisessa luokkaa, johon tallennetaan kuva tai sen tiedostonimi ja muut tiedot sekä luokkaa, joka kuvaa albumia. Seuraava-nappia painettaessa vaihdettaisiin vaan kuvapaneelin attribuutin arvoa.

Tapaus 9: laivanupotuspeli

OLO-maratoonin toiseksi viimeisessä tapauksessa päästiin kehittämään oman laivanupotuspelin toiminnallisuutta. Päädyimme lopulta kahden ruudukon näyttämiseen, ensimmäiseen omat laivat ja vastustajan laukaukset, toiseen omat laukaukset. Kehittelimme ensin ruudukon tilan mallintamiseen kahta boolean-tyyppistä attribuuttia kertomaan siitä, onko ruutuun ammuttu ja onko ruudussa laiva. Lopulta päädyimme kuitenkin tekemään enumeraation, jolla nämä tiedot saa tallennettua yhteen attribuuttiin. (Näin jälkeenpäin ajatellen laivoja olisi ehkä voinut mallintaa omina olioinaan.)

Saimme myös pohdittavaksemme käyttöliittymän elementtien ja kuuntelijoiden käytön suunnittelun. Päätimme käyttää ruudun mallintamiseen JButton-oliota ja GridLayoutia, mutta kuuntelijoiden käytön jätimme suosiolla oppimistavoitteisiin. Ja oppihan ne, koska loppuviikolla Java-tehtävää tehdessä niitä joutui käyttämään. Muita oppimistavoitteita oli JButtonin oman aliluokan toteutus ja pelin toiminnallisuuden jalostaminen.

Tapaus 10: piirto-ohjelma

Viimeisessä tapauksessa tehtävänä oli yksinkertaisen piirto-ohjelman laatiminen, erityisesti erilaisten kuvioiden piirtäminen ja pyyhkiminen.

Päädyimme toteuttamaan erilaisia kuvioita olioina; palloina, neliöinä yms. Ongelmista kinkkisin oli ehkä kaadon StackOverflow-ongelma, joka seuraa siitä, että suuressa kuvassa rekursiivinen kaato aiheuttaa StackOverflowException-poikkeuksen, vaikkei kaato olekaan loputon. Jonkinlaiseksi ratkaisuksi kehitimme alkuperäisen tilanteen tallentamisen ja uuden rekursiopinon luomisen. Lopullinen ratkaisu jäi kuitenkin oppimistavoitteisiin. Samoin oppimistavoitteisiin jäi kuvioiden siirtämisen toteutus ja Graphics-luokkaan tutustuminen

Purussa Graphics-luokan metodeista tulivat esille fillOval, drawImage, drawRect ja muutama muu peruspiirtämismetodi. Kuvioiden siirtämisen toteuttamisen todettiin vaativan siirtämistavasta riippuen melkoisia muutoksia ohjelmassa, pitäisi kuvaa kuvata pikseli kerrallaan tai kuvio kerrallaan siten, että esimerkiksi ympyrä tietäisi keskipisteensä ja säteensä. Kaato-ongelmaan ehdotettiin ratkaisuksi depthFirstSearch-tyyppistä ratkaisua.

Yleistä loppuhopinää OLOista

OLOt parantuivat mielestäni selvästi loppua kohden, todennäköisesti johtuen pääasiassa kolmesta seikasta: ryhmä tulivat sinuiksi OLO-systeemin kanssa, ryhmän Java- ja koodaustaidot karttuivat hyvin paljon ja kolmanneksi aiheet tulivat käytännönläheisemmiksi. Itse pidin käytännönläheisemmistä aiheista paljon enemmän ja siten sain viimeisistä tehtävistä paljon enemmän irti kuin esimerkiksi kolmannesta tapauksesta (tapaus 2).