Se on siinä!

Päällimäisenä Studio 1 syksystä jäivät mieleen deadlinet. Kyseiset päivämäärät ja kellonajat loivat selkärangan koko raastavalle fuksisyksylle, jolle ei ainakaan koodauksen puolesta näkynyt loppua vielä edes jouluaattona. Kyseisten ajankohtien väliin hukkuivat niin fuksisitsit kuin ensilumi. Viime syksynä elämän tapahtumat on vaikea sijoittaa viikonpäiville tai kuukausille, mutta koodikierrosten ja teoriapalautusten väliin ne löytävät paikkansa mainiosti. Tuntui jopa jotenkin oudolta, kun sunnuntai-iltana katsoessani seuraavan viikon kalenteria, ei sieltä löytynyt enää lauantaipäivän huumaa ja kliimaksia: kello n. melkein kuuden Rubyric-hetkeä.

”Kuolemanviivoista” kuitenkin selvittiin ja nyt viimeisen deadlinen porteilla odotan pääsyä Studio 1 vapaaseen maailmaan. Maailmaan ilman OLO-sessioiden ”Post-it”-sotaa. Onko se kirkkaampi ja parempi kuin sitä edeltänyt vai kohtaanko seuralaisteni kanssa vain lapsuuden jouluista tutun ilmapalloefektin? Ehkä olemme odottaneet loppua turhaan ja ehkä Studio 1 oli elämiemme parasta aikaa.

Studio 1 opetti paljon. Nykyisin osaan tehdä käsitekarttoja ja vihaan tavallisia miellekarttoja, joista ei ole jälkipolville mitään informatiivista hyötyä. Aivoni viittaavat nykyisin Javan kuullessaan tietokoneohjelmiin eikä kahvikuppilogoon. Tärkeimpänä oppina pidän kuitenkin sitä, että aina löytyy joku ihminen, joka on taistellut tai taistelee parhaillaan saman ongelman kanssa kuin itse ja parhaassa tapauksessa kaltaiseni on valmis auttamaan. Kieltämättä osaan nykyisin koodata mitä hienoimpia sovelluksen palasia, mutta kyseiset tiedot ja taidot ovat täysin hyödyttömiä, jos en uskaltaisi tulla ulos ongelmieni kanssa. Vaikka aluksi epäilin, Studio 1 opetti paljon muutakin kuin koodaamista.

Viime kesänä pääsykoetulosten mukana tuli taiteltu A4-kokoinen paperi, joka oli ensimmäinen kosketus Studio 1 maailmaan. Tarkkaa sanamuotoa en muista, mutta kyseinen paperi loppui sanoihin, jotka kehottivat valmistumaan matkaan. Kyseiset sanat olivat oikeassa. Henkilökohtaisesti Studio 1 on ollut hyvin pitkä tie. Ensimmäinen koodikierrokseni alkoi lannistavalla ”ykkösellä”, joka kuitenkin kehittyi viimeisen koodikierrokseen saavuttaessa melko hienoksi ”vitoseksi”. Vaikka en missään vaiheessa joidenkin elämäntapakoodareiden arkipäiväistä kuutosta saanutkaan, koin onnistuneeni edes jossain. Viimeistään oman androidprojektini toi onnistumisen ja osaamisen tunteita. Nyt viikko projektin palautuksen jälkeen nämä tunteet ovat yhä vahvistuneet. Onnistuin kurssin aikana pääsemään kiinni johonkin, mistä minulla ei ollut aavistustakaan vielä viime kesänä.

Työmäärä kurssin aikana oli mitä oli ja ylempien tahojen suhtautuminen asioihin välillä vähintääkin suututtava, mutta selvisin hengissä. Yksikään koodi tai teoria ei lähtenyt NullPointerina tai tullut takaisin bumerangina. Kurssin aikana toivoin, että jälkipolvien ei tarvitsisi kärsiä samaa kuin itse jouduin, mutta nyt kalkkiviivoilla toivon, että jokainen infolainen tulee jatkossakin kärsimään saman hapokkuuden kuin jokainen häntä ennen. Ihminen oppii parhaiten uimaan, kun hänet heitetään veteen ja pinnalle päästyään yritetään hukuttaa yhä uudelleen ja uudelleen.

Vaikka itse en bumerangia kohdannut, haluan jälkipolville jättää muiston Abban muodossa:

Boomerang is love

Ohjelmointikierros 4: Hyvästi seikkailupelit!

Viimeinen seikkailupeliin liittyvä ohjelmointikierros oli myös kaikista vapain. Tämä oli myös viimeinen kierros, kun kaikki edelliskierrosten onnistumiset ja epäonnistumiset kumuloituivat kierroksen tuotokseen. Eräällä tavalla kyseessä oli jopa motivoivin kierros kaikista, kun kierroksen lopussa odotti (ilman bumerangia) ikuinen vapaus seikkailupelistä. Lähtökohdat olivat siis hyvät.

Ohjelmointikierros alkoi omien rajapintaluokkien luomisella, joka tuntui aluksi hyvin vaikeaselkoiselta. Nyt myöhemmin on rajapintaluokkien olemassaolon syyt ja seuraukset selvinneet ja niiden opettelun syy on järkeistynyt. Seikkailupelissä ensimmäinen rajapintaluokka oli Sektorintarkkailija, joka tarkkailee omaa sektoriaan. Käytännössä Sektorintarkkailija toteutettiin esimerkiksi Marsalkka-luokassa, jonka ominaisuutena oli nukkua, heräillä ja hyökätä sektorissa liikkuvien olentojen mukaan.

Sektorintarkkailijoiden jälkeen ohjelmointikierroksessa luotiin toinen rajapintaluokka Vuorollinen, jota hyödynnettiin myös myöhemmin pelissä. Vuorollinen tuntui koodikierroksessa huomattavasti ymmärrettävämmältä kuin Sektorintarkkailija ja kyseinen rajapinta auttoi myös ymmärtämään paljon paremmin koko rajapinnan ideaa. Vuorollisen kautta alkoi koko seikkailupelin tarkoitus ja kaikkien syksyn koodailujen idea vihdoin selvitä.

Kun Vuorollinen rajapinta oli luotu ja Olento laitettu toteuttamaan se, oli vuorossa oman Avatarin luominen ja itse Pelimoottorin suunnittelu. Kierroksen samalla mukavin ja hankalin vaihe alkoi tästä. Vihdoin sai tähän järjettömyyteen alkaa tuoda myös omia näkemyksiä. Oman pelini ideaksi tuli hyvin yksinkertainen. Pelaajan oli tarkoitus tappaa muita olentoja maastosta ja saada niistä pisteitä. Tietyn pistemäärän jälkeen peli loppui. Eri olioista sai eri määrän pisteitä sen mukaan kuinka helppoja ne olivat tappaa ja kuinka hanakasti ne hyökkäsivät olennon päälle.

Tämän kierroksen opettavin osuus oli luultavasti erilaisten komentojen luku ja syöttö käyttäjän antamasta syötteestä. Myös luokkien main metodin ”String[] args”-parametri sai vihdoin järjellisen merkityksen. Käyttäjän antamien komentojen parsiminen oli mielenkiintoista ja vääränlaisten komentojen käsittelyn toteuttaminen mielenkiintoista. Jälkikäteen ajateltuna kuitenkin esimerkiksi oma toteutukseni oli hyvin purkkainen.

Lopulliseksi arvosanaksi sain tästä kierroksesta 3, joka tuntui riittävältä. Pääasia oli, että alusta alkaen vihaamani seikkailupeli oli takana. Sen sijaan edessä odottanut miinaharava oli ensimmäinen koodikierros, jonka tehtävänantoa olin odottanut koko kurssin alkamisesta lähtien. Seikkailupeli tulee kuitenkin jäämään aina mieliini ohjelmana, joka opetti minut rakastamaan ja vihaaman java samanaikaisesti mihin vuorokauden aikaan tahansa.

Tentti 20.12.

Tentti oli ja meni. Neljäs tehtävä oli ainakin allekirjoittaneen mielestä mielenkiintoinen ja ohessa kyseisen tehtävän koodi:

public class Hissi {
    protected boolean virratPäällä;

    public Hissi(){
        System.out.println("Kone Oyj");
        virratPäällä = true;
    }
    public static void main(String[] args){
        Hissi h1 = new PaterNoster();
        System.out.println("-----");
        Hissi h2 = new Automaattihissi();
        System.out.println("-----");
        h1.liiku();
        System.out.println("-----");
        h2.liiku();
    }
    public void liiku(){
        System.out.println("liiku()");
    }
    public String toString(){
        return "Geneerinen hissi";
    }
    private static class PaterNoster extends Hissi {
        public void liiku(){
            if (this instanceof Object && this.virratPäällä){
                System.out.println("toimii");
            }
            else{
                System.out.println("ei toimi");
            }
            Hissi hissi = this;
            System.out.println(hissi.toString());
            System.out.println(this);
        }
        public String toString(){
            super.toString();
            return "Tervetuloa!";
        }
    }

    private static class Automaattihissi extends Hissi {
        private int kerros;

        public Automaattihissi(){
            super();
            System.out.println("Automatic");
        }
        public void liiku(){
            for (this.alusta(); this.ehto(); this.muuta()){
                System.out.println("Liikutaan");
            }
        }
        private void alusta(){
            this.kerros = 3;
            System.out.println("Lähtökerros: " + this.kerros);
        }
        private boolean ehto(){
            boolean b = this.kerros > 0;
            System.out.println("Jatketaan: " + b);
            return b;
        }
        private void muuta(){
            this.kerros--;
            System.out.println("Seuraava kerros: "+ this.kerros);
        }
    }

}

Allekirjoittaneella meni ainakin väärin :). Tammikuussa nähdään!

Teoria 4 – Perjantai-illan huumaa

Nyt ”kovan” ja ”uuvuttavan” tenttirupeaman välipäivinä on hyvä aika palata muistelemaan hieman vanhoja ja hyviä hetkiä Studio 1:n parissa.

Teoriakierros 4:n tehtävänanto oli seuraava:

”Swing

Laadi essee tai käsitekartta graafisten käyttöliittymien toteutuksesta Swing- komponenttikirjaston avulla. Kannattaa keskittyä oleelliseen ja rajata mukaan otettavia asioita, jottei kokonaisuudesta tule tarpeettoman laajaa. Esimerkiksi kaikkia olemassa olevia komponenttiluokkia ei välttämättä kannata esitellä.”

Päällimmäinen muisto kyseisestä kierroksesta oli tehtävänanto PDF:n ensimmäinen avaus, jossa kummitteli sana Swing, joka ei ainakaan silloin herättänyt mitään suurempia tunteita. Olkkarilla olin kyseisen sanan joskus kuullut, mutta en kovin kiitolliseen sävyyn. Tarinoiden mukaan jokin Processing olis paljon parempi.

Kuitenkin torstai-iltana totesin taas ajan olevan kypsä iki-ihanan CMapin avaamiseen. Jostain kumman syystä perjantaiaamun mennessä oli loistavaan käsitekarttaan ilmestynyt n. 3 palluraa ja jatko näytti hyvin synkältä. Taistelu kuitenkin jatkui pakollisten perjantaitoimien jälkeen ja valmistakin kerkesi kerran tulla ainakin melkein, kunnes CMap päätti kaatua ja kaataa koko tietokoneen. Muutaman Studio1:ä ja Cmapia ylistävän sanan jälkeen muutaman tunnin työ palautettiin tunnissa. Lupasin myös itselleni, että en enää ikinä käyttäisi kyseistä ohjelmaa, mutta lupaus kesti vain seuraavaan teoriatehtävään asti. Kun käsitekartta oli valmis, mieliin palasi odotettavissa oleva elämä tämän kaiken jälkeen. Arvosanaksi tuli 3 ja tuotos oli tämä:

Image

Jotta tämänkin tekstin virallinen osuus täyttyisi, pitäisi hieman kertoa, kuinka tämä teoriatehtävä auttoi todella ”paljon” myöhempää koodaamistani.  Tyydyn kuitenkin vain toteamaan, että pääsin kyllä alkeellisesti sisälle siihen, mitä Swing on, mutta en kyllä pätkääkään hyötynyt siitä, kun itse Swingiä aloin hyödyntämään viimeisellä ohjelmointikierroksella. Jälkikäteen ajateltuna tämä teoria tuntui pakotetulta täytekierrokselta.

Tapaus_1: Alun loppu

Toisen OLOwi-session alkupuolisko käytettiin ensimmäisen session purkamiseen. Edellisellä kerralla sovitut oppimistavoitteet olivat viikon aikana kokeneet monentyyppistä ja -tasoista analyysiä päätyen vihdoin OLO-ryhmän armottoman raadin eteen.

”Tapaus ykköstä” lähdettiin purkamaan aluksi filosofiselta näkökannalta. Platonin ideaoppi todettiin alustuksen jälkeen yhteistuumin jokseenkin toimivaksi. Filosofista ihanuutta seurasi tieteellinen sytematiikkaa lähestyvä näkökanta luokittelun syvälliseen maailman. Hyvin tyhjentävän systematiikkaa käsittelevän esityksen jälkeen oli aika siirtyä kohti haastavampia tilanteita. Luokittelun ongelmia lähestyttiin niin yleiseltä kuin kultturiselta tasolta, jotka molemmat osoittautuivat hyvin samankaltaisiksi. Tärkein huomioitava asia tästä purkuosuudesta oli kenties se, että luokittelussa ei ole suuria kulttuurillisia eroja ja harvemmin eri kultturien erot aiheuttavat ongelmia.

Kun ongelma oli luotu ja esitelty, pääsimme käsiksi luokittelun tavoitteisiin. Luokkaa ”Syötävä” edustavien olioita nauttiessa ryhmämme tuli hiljaisessa yhteisymmärryksessä tulokseen, että luokittelun tavoitteena on yksinkertaisesti helpottaa erilaisten sovellusten ja asioiden käyttöä ja luoda niille yhteisiä rajapintoja, sekä vähentää työtä, kun jokaiselle yksittäiselle asialle ei tarvitse luoda kaikkea uudelleen alusta.

Koko purkuosuutemme kliimaksi oli koko viikon kaikkien mieltä kutkuttanut Javan luokkien, olioiden ja periytymisen eksistenssi. Luokat ja oliot jäivät toisen OLO-ryhmän jäsenen terrorin (tai katoamisen) takia vähemmälle huomiolle, mutta se ei estänyt Javan voittokulkua periytymisen esittäydyttä kahden anonyymin ryhmäläisemme toimesta (PP-esitys on tuleva yleisön pyynnöstä myös tänne blogiin).

Loisteliaan purkusession jälkeen uljas OLO-ryhmämme oli viimein valmis tarpomaan kohti yhä korkeampia huippuja.