You are currently browsing Suni's articles.
Nyt se on sitten ohi…
Ei olisi vielä viime elokuussa osannut kuvitellakkaan mitä syksy toi tullessaan. Olin kyllä kuullut aikaisemmin erinäisiä asioita tästä kurssista: lähinnä sitä, että töitä tulee riittämään javan parissa koko syksyn. Siitä huolimatta heti syyskuussa Studio1 löi päin näköä kuin Mike Tyson konsanaan ja sama pyöritys jatkui täydet 12 erää (== reilut 2 periodia). Lopulta valtavan loppurutistuksen jälkeen kello kilahtaa ja on aika heittää hanskat naulakkoon. Olen selvinnyt voittajana todellisesta raskaansarjan ottelusta.
Kun nyt projektin valmistuttua rupeaa miettimään, on vaikea kuvitellakkaan mitä silloin osasi, kun opiskelut tänä syksynä alkoivat. Tai ehkä paremminkin: mitä silloin ei osannut. Java oli jotain aivan uutta ja ihmeellistä. Nyt se sujuu siihen malliin, että itse kukin meistä pystyy suunnittelemaan ja toteuttamaan kokonaisia ohjelmia ja peleja sillä. On aivan uskomatonta minkälaista kehitystä näin lyhyessä ajassa voi tapahtua.
Ilman uhrauksia tämä kaikki ei kuitenkaan ole tapahtunut. Koodin parissa vietetyt pitkät päivät ja vielä pidemmät yöt ovat olleet valtavana taakkana koko kurssin ajan. Lähestulkoon jokaviikkoiset DL:t ovat repineet hermoja riekaleiksi niin moneen oteesee, että on ihme, että sitä on vielä täysissä hengenvoimissaan. Kurssi on yksi TKK:n laajimmista (ellei jopa laajin… mene ja tiedä…) ja sen kyllä huomaa. Neljäntoista opintopisteen eteen on saanut pistää itseään likoon oikein urakalla.
Muutama asia on kuitenkin saanut jaksamaan tämän raskaan kurssin läpi: tämä kurssi on ollut järjestelyiltään aivan uskomattoman toimiva ja kohtalotoverit tällä kurssilla ovat aivan uskomattoman mukavaa porukkaa. On vaikea kuvitella paremmin suunniteltua ja toteutettua kurssia mitä Studio1 on. Kurssi on saanut Javan tuntumaan mielenkintoiselta ja mukavalta (tai ainakin siedettävältä). Kurssilla on opittu valtavan paljon ja suurimman osan siitä on joutunut itse kaivamaan esiin, mikä parantaa huomattavasti oppimista. Kuitenkin hädän hetkillä apua on ollut aina saatavilla. Kuitenkin se tärkein asia mikä tekee tästä kurssista niin hienon ovat kaikki sitä tekevät ihmiset, niin kanssakoodaajat kuin assaritkin. Ilman heitä Studio1 ei olisi Studio1.
Vaikka syksyn mittaan ahdistuksen hetkiä on ollut useita ja useampaan otteeseen on kiroiluttanut oikein urakalla, niin silti kurssista jäi erittäin positiivinen jälkimaku.
Kurssin alkajaisiksi meidät ohjattiin käyttämään koodauspuuhissa Emacs-tekstieditoria. Silloin ei vielä tiennyt paremmasta ja niinpä se tuntuikin silloin varsin hyvältä ohjelmalta. Ainakin itse ajattelin, että onpas hienoa kun tekstieditori helpottaa työskentelyä värjäämällä koodista javaksi tunnistamiansa sanoja. Kurssin mittaan ajatukset kyseisestä ohjelmasta ovat kuitenkin muuttuneet “hiukan”.
Parin harjoituskierroksen jälkeen alkoi korviin kantautua huhuja jostain toisesta ohjelmasta, joka helpottaisi koodausta entisestään. Ohjelman nimeksi paljastui Eclipse ja pakkohan sitä oli sitten heti kokeilla. Mitä pidemmälle tehtäväkierrokset etenivät, sitä useampi phuksi oli vaihtanut Emacsin Eclipseen. Lopulta kun tehtävissä alettiin tarvitsemaan swingiä, meille pidettiin luento Eclipsestä ja meitä kehoitettiin viimeistään siinä vaiheessa vaihtamaan siihen. Kun kokeilin Eclipseä ensimmäistä kertaa oli järkytys suuri. Se osasi kertoa melkein virheestä kuin virheestä, heti kun sen oli kirjoittanut. Muutenkin Eclipse oli yhtä juhlaa Emacsin jälkeen.
Vaikka ymmärränkin mihin sillä, että alkukurssilla suositaan Emacsia, pyritään, olen useampaankin kertaan miettinyt onko siitä oikeasti niin paljon hyötyä, että sen käyttö kannattaa. Tottahan se on, että Emacsia käyttäen oppii tietyt asiat kunnolla kantapään kautta, mutta toisaalta sitä käyttäessä menee aikaa luvattoman paljon hukkaan monen turhan asian kanssa. Esimerkiksi kirjoitusvirheiden metsästys koodin seasta on mielestäni täysin turhaa touhua. Lisäksi Emacs ei ole käytettävyydeltään mikään maailman loistavin ohjelma, joten onko sen käytön opetteleminen muutamaa harjoitustehtävää varten kovin mielekästä.
Kurssin mittaan tuli tarvetta myös monille muille ohjelmille pelkän tekstieditorin lisäksi. Kaikennäköisiä ssh-, tiedostonsiirto-, tekstinkäsittelyohjelmia, jne… on tullut kurssin aikana käytettyä. Ja tietenkin, ah niin ihanat, käsitekartta ja dialogikarttaohjelmat. Lähes kaikkien tarvittavien ohjelmien käyttö on käyty läpi joko lapiokurssilla tai Studio1:llä. Mielestäni olisi kuitenkin hyvä lisätä kurssin kotisivuille linkkejä tai pieniä ohjeia esimerkiksi kuvankäsittelyyn ja äänitiedostojen muokkaukseen liittyen, sillä useat niitä kuitenkin tarvitsevat viimeistään projektia tehdessä.
Ohjelmointi on hankala asia opettaa. Ohjelmointi on loppupeleissä aika pitkälti käytännön työskentelyä, jota oppii vain tekemällä, mutta kuitenkin jo pelkästään alkuun pääseminen vaatii paljon pohjatietoa, mitä on pakko opetella jotenkin muuten. Tämä asettaa paljon haasteita ohjelmoinnin opettamiselle. Opetuksessa pitäisi löytää se sopiva tasapaino käytännön harjoituksien ja teoripohjaisen opetuksen kuten luentojen ja kirjan pänttäyksen välille.
Studio1-kurssilla opetuksessa keskityttiin lähinnä käytännön harjoitteluun. Luentoja oli syksyn mittaan hyvin vähän, mutta muuta tekemistä sitäkin enemmän. Itse kaipasin lisää luentoja vain aivan kurssin ensimmäisille viikoille, jolloin työskentely oli vasta aluillaan ja kaikki aivan perusasiatkin olivat vielä täysin hukassa. Loppukurssista luentoja ei enää oikeastaan kaivannut ollenkaan ja nekin luennot, joita oli, tuntuivat vähän väkisin väännetyiltä ja turhilta. Samat asiat oppi paremmin seuraamalla netistä löytyviä tutoriaaleja.
Tärkeintä ohjelmoinnin opettamisessa on opettaa opetettavalle mistä hän voi etsiä tietoa ja ratkaisuja ongelmiin. Koska ongelmia on niin paljon eri tyypisiä, että on mahdotonta opettaa ratkaisuja niihin kaikkiin, on tärkeämpää opettaa mistä ratkaisuja voi etsiä. Kirjoista löytyy kattavasti tietoa lähes asiasta kuin asiasta, mutta tiedon etsiminen on usein hidasta ja työlästä. Niinpä opetuksessa kannattaa painottaa sähköisten tietolähteiden merkitystä tiedon etsimisen välineinä. (En haluaisi mainostaa, mutta…) Google on ohjelmoijan paras kaveri. API tulee heti perässä hyvänä kakkosena.
Assarivetoiset harjoitukset ovat elintärkeitä osia ohjelmointikurssin järjestämisessä. Kun itsenäinen harjoitusten vääntäminen tyssää johonkin ylimaalliseen ongelmaan on tärkeää, että viikottain on mahdollisuuksia konsultoida assareita, jottei yksi ongelma kaataisi koko tehtävän tekemistä. Näitä ohjelmointiharkkojakin voi vetää monella eri tavalla. Joillakin ohjelmoinnin peruskursseilla harjoitukset ovat (kuulemma) hyvin assaripainoitteisia: assari käy läpi kädestä kiinni pitäen kuinka asiat tulee tehdä. Itse olen kyllä vahvasti itsenäisemmän työskentelyn kannalla, jossa assarit ovat vain ongelmatilanteita varten.
Olen kaikinpuolin erittäin tyytyväinen kohta loppuvaan Studio1-kurssiin ja sen käytännön järjestelyihin. Muut kurssit voisivat hyvin ottaa mallia siitä miten hommat Studio1:llä on hoidettu. Kurssi on pakottanut tekemään itsenäistä työtä ja raitkaisemaan ongelmia omin neuvoin, mutta ei ole kuitenkaan jättänyt ketään hätään vaan aina on ollut apua saatavilla tarpeeksi. Tämä itsenäiseen tiedonhakuun ja ongelmanratkaisuun ohjaaminen on se asia mihin kaikessa ohjelmoinnin opetuksessa tulisi pyrkiä. Ohjelmoinnissa tärkeintä on, että osaa hakea ja soveltaa uutta tietoa erilaisista tietolähteistä, koska lähes ongelmaan kuin ongelmaan löytyy ratkaisu kaikille avoimista tietolähteistä, jos vain sitä osaa etsiä.
Kolmas Java-tehtävä lähti käyntiin tuttuun tapaan: hyvä olo, joka oli jäänyt edellisen tehtävän palautuksesta, katosi kuin tuhka tuuleen heti seuraavana päivänä kun eteen aukeni uusi, niin hirveän pitkältä ja vaikealta tuntuva tehtävänanto. Onneksi tällä kertaa tehtävän tekemiseen oli aikaa ruhtinaalliset kolme viikkoa, josta saamme kiittää mennyttä tenttiviikkoa.
![]()
Tämänkertainen tehtävä tuntui aiheensa puolesta edellisiä tehtäviä mielenkiintoisemmalta. Ainakin yksi syy lienee siinä, että tällä kertaa siirryimme staattisen maailman rakentelusta pelin toiminnallisempiin osiin. Teimme mm. muutamille eri olentotyypeille kuten merirosvoille (yarrrr!) toimintamalleja, joihin olentojen liikkuminen maailmassa perustuu.
Tehtävässä vaadittiin taas kourallinen uusia temppuja, mutta ihme kyllä ne eivät osoittautuneetkaan tehtävän pahimmiksi möröiksi. Abstraktit luokat ja mureenapoikkeukset luonnistuivat yllättävän vähillä ponnistuksilla. Sen sijaan päänvaivaa aiheutti ohjelman paisunut koko ja tehtävänannon monimutkaistuminen. Nyt kun mukana olivat kaikki tähän mennessä tekemämme luokat, tuli välillä suuria ongelmia hahmottaa ohjelman toimintaa kokonaisuudessaan.
Vaikka aikaa tehtävän tekemiseen olikin kolme viikkoa, jostain kumman syystä silti meinasi tulla kiire. (Johtuu mahdollisesti omasta laiskuudesta ja taipumuksesta jättää kaikki aina viime tippaan.) Varsinkin kun vähän ennen deadlinea saimme ylemmältä taholta epävirallisen testiohjelman, jolla pystyi tarkastelemaan oman ohjelman toimivuutta. Sen avulla ohjelmasta löytyi useita kohtia, jotka vaativat pientä viilailua.
Lopulta tehtävä tuli palautettua ja sen jälkeen tuli taas tyytyväinen olo. Aina kun vertaa edellistä tehtävää juuri palauttamaansa huomaa kuinka paljon kehitystä on todella tapahtunut vaivaisessa muutamassa viikossa. Tästä on taas hyvä jatkaa seuraavaan tehtävään…
Oli synkkä ja myrskyinen yö… eiku. Oli aika uuden ryhmäkohtaisen tehtävän…
Monille tämä OLO-sessio taisi tulla vähän puun takaa. Viimekertaisen olon jälkeen ainakin itselleni jäi sellainen käsitys, että se olisi ollut viimeinen “normaali” sessio ja että seuraava tapaaminen olisi vain joku pieni ohjeistus seuraavaa tehtävää varten (ja että siihen olisi aikaa ainakin pari viikkoa). Mutta sitten kävikin ilmi, että ihan normaali OLO-sessiohan se oli. Hyvä näin, sillä nyt saimme sylikaupalla ideoita hautumaan tulevaa varten.
Tällä kertaa robotin sijasta joudumme suunnittelemaan ja toteuttamaan IRC-botin. Ensi töiksemme saimme eteemme kolme kappaletta virikkeitä, jotka käsittelivät IRCin bottien tarkoitusta ja toimintaperiaatetta. Virikkeet olivat mukavaa luettavaa, mutta ei niistä oikein irronnut “ahaa-elämyksiä” eikä muutakaan varsinaista hyötyä.
Virikkeet luettuamme kävimme innolla tehtävien kimppuun. Ensimmäiseksi rupesimme keksimään toimintoja, joita oma bottimme (tai botit ylipäätään) voisi mahdollisesti sisältää, ja lätkimme ne tuttuun tapaan Post-it® -lappuina taululle. Ideoita syntyi laidasta laitaan: niin hyötytoimintoja (mm. bussiaikataulujen ja Otaniemen ruokalistojen haku) kuin jotain aivan muutakin (mm. vitsien kertominen, paljaan pinnan vilauttelu). Ideat olivat hyviä ja monet niistä ovat jopa toteutettavissa. Suurin ongelma oli keksiä omaperäisiä, täysin uusia ideoita, joihin ei vielä olisi törmännyt aikaisemmin missään.
Seuraavaksi ryhdyimme pohtimaan arkkitehtuuria, jolla toiminnot saataisiin sisällytettyä bottiin jollain järkevällä tavalla. Lähtökohtana pidimme yhtä pääluokkaa, joka hallitsisi botin yleisiä toimintoja kuten IRC-kanavan ja ajan seuraamista ja kutsuisi aina haluttuja toimintoja vastaavia luokkia. Ongelmaksi muodostui se, että kenelläkään ei ollut varsinaista tietoa siitä miten homma käytännössä toimii, joten yksityiskohtaisemman ja monimutkaisemman toimintamallin suunnittelu ei oikein luonnistunut.
Aloitimme pariinkin kertaan (assarin vinkistä) toimintojen järjestelyn jonkin näköiseen järjestykseen, mutta homma tyssäsi aina ennen kuin pääsimme edes vauhtiin, sillä vastaan tuli taas oma tietämättömyytemme. Koska emme tienneet miten botti loppupeleissä toimii, oli hyvin vaikea miettiä toiminnoille ryhmitystä, josta olisi mitään käytännön hyötyä.
Keskustelu oli vilkasta, mutta se ajautui koko ajan botin keskustelukykyyn. Totesimme, että sen toteuttaminen on erittäin hankalaa, koska tekstistä on erittäin hankala poimia ns. tärkeitä sanoja (erityisesti suomen kielestä sanojen taivuttelun vuoksi) ja tehdä niistä päätelmiä. Siitä saimmekin muutaman hyvän oppimistavoitteen ensi kertaa varten.
Vaikka botin lopullinen toteutus on vielä täyttä hepreaa, jäi meille tästä sessiosta käteen iso kasa toinen toistaan parempia ideoita mitä botti voisi tehdä.
Jo totuttuun tapaan aloitimme kolmannen OLO-tapaamisemme edellisen kerran oppimistavoitteiden purkamisella. Viime tapaamisessa sovimme oppimistavoitteiksi silmukoiden ja ehtolauseiden rakenteet ja käytön java-ohjelmoinnissa. Kuitenkin edellisestä kerrasta poiketen, tällä kertaa oppimistavoitteet olivat yhteiset kaikille.
Purku lähti käyntiin aika vaisusti. Koska oppimistavoitteet olivat olleet yhteiset, oli aluksi vähän epäröintiä, että kuka rohkenisi “avata pelin” ja aloittaa keskustelu. Kun alkuun oli päästy niin alkoi mietteitä aiheesta tulla hiljalleen ympäri pöytää. Keskustelutuokion jälkeen keräsimme vielä taululle esimerkkirakenteet aiheinamme olleista silmukoista ja ehtolauseista. Taululle kootut esimerkit valaisivat meille silmukoiden ja ehtolauseiden syvintä olemusta ja polttivat ne verkkokalvoihimme, jotta varmasti osaisimme käyttää niitä tulevissa ohjelmointitehtävissämme.
Vaikka purku olikin jossain määrin vaisu, niin silti ainakin omasta mielestäni tämänkertainen purku oli antoisampi kuin edellinen. Oppimistavoitteet olivat hyvin käytännönläheisiä ja jokaisella oli varmasti paljon opittavaa silmukoiden ja ehtolauseiden käytöstä. Jokainen meistä tulee kuitenkin jatkossa väistämättä tarvitsemaan niitä vähän väliä ja silloin ne olisi kätevää hallita.
