Monday, June 06, 2005

Koodattu menneisyys

Ensimmäinen koneemme (minun ja veljen) oli MSX. Se oli Commodore 64:ään verrattava laite, mutta Suomessa paljon harvinaisempi. Se oli ostettu käytettynä parinkymmenen pelin kera. Saimme sen käyttöömme, kun olin ala-asteella.

Sisäisenä kielenä oli Basic, ja kone käynnistyi suoraan Basic-tulkkiin. Koneen mukana tuli kaksi suomenkielistä manuaalia: n. 20 sivun aloitusopas, sekä n.150 sivun referenssi, jossa esiteltiin kaikki Basic-komennot. Eräänä tylsänä kesäpäivänä aloin selailla tuota 20 sivun aloitusopasta. Se kertoi ohjelmoinnista juuri riittävän yksinkertaisella tasolla. Oppaan esittelemät komennot olivat print, input(syötteen lukemiseen näppäimistöltä), goto, if ja gosub. En muista, mitä ensimmäiset ohjelmani tekivät. Nämä viisi komentoa riittävät ainakin yksinkertaisen flashcard-ohjelman tekemiseen, jossa sanasto on hardkoodattu sisään.

Paksumpi manuaali oli kovempi pala. En alkuun ymmärtänyt komentojen syntaksia. Seuraava esimerkki on kuvitteellinen (kone on myyty pois yli kymmenen vuotta sitten):

CIRCLE (X, Y), R [, C]

Piirtää R-säteisen ympyrän, jonka keskipiste on (X, Y) värillä C.


Kun ei ollut neuvojia, meni kauan aikaa tajuta, että [, C] tarkoitti vapaaehtoista parametria (ei sitä, että kirjoitetaan komentoon hakasulut), ja että ennen komennon käyttöä pitää antaa toinen komento, joka siirtää näytön tekstitilasta grafiikkatilaan. Kirjastoautolta löytyi yksi ohjelmointiopas, jossa oli tekstiseikkailupelien lähdekoodeja. Naputtelin ne koneelle, ja opin esimerkeistä jotain.

Hienoin saavutukseni MSX:n kanssa oli piirto-ohjelma. Esim. viiva piirrettiin niin, että vietiin kursori h-i-t-a-i-l-l-a nuolinäppäimillä alkupisteeseen, painettiin tiettyä näppäintä, siirrettiin viiva loppupisteeseen, ja painettiin toista näppäintä. Toimintoja olivat ainakin viiva, laatiko, ympyrä ja yksittäinen piste. Ruutuun oli myös piirretty paletti, josta valittiin värejä (16 kpl) viemällä kursori oikeaan kohtaan. Kuvia ei voinut tallentaa.

Assembleriin en tutustunut; C64:lle oli saatavilla montakin assembler-opasta, mutta MSX:lle ei yhtään. Myöskään manuaali ei antanut mitään ohjeita.

MSX:n hienoin komento oli Play. Sille annettiin nuottikirjoitusta rakenteellisesti muistuttava merkkijono. Esim. Ukko Nooa olisi "c4c4c4e4d4d4d4f4e4e4d4d4e2". 4 tarkoittaa neljäsosanuottia. Kanavia oli 2 tai 4 (en muista), mikä riitti sekä melodiaan että säestykseen. Soittimena oli siniaalto.

Ala-asteen lopussa ja yläasteen alussa koneemme oli Amiga. Siinä ei ollut sisäänrakennettua ohjelmointikieltä, mutta mukana tuli AmigaBasic. AmigaBasic oli huono. Koneen käynnistämisestä AmigaBasicin lataamiseen meni useampi minuutti. IDE oli suttuinen, eikä AmigaBasicissa ollut mitään hienoja ominaisuuksia, kuten kääntäminen tai olio-ohjelmoitavuus. Lisäksi Amigalle oli saatavissa liian paljon pelejä. En saanut mitään kunnollista aikaan, vaikka mukana tulikin monta esimerkkiä. Jossain vaiheessa tilasin postimyynnistä A68k -assemblerin, mutta en saanut sitä koskaan toimimaan. Ajatus kääntäjästä oli minulle vieras; MSX:ssä ja AmigaBasicissa editori ja kääntäjä olivat samassa ohjelmassa.

Yläasteella tuli PC:n aikakausi. MS-DOS:in mukana tuli QBasic. QBasic oli salamannopea verrattuna aikaisempiin Basic-tulkkeihin. Tein sillä yhden pelaajan PingPong-pelin, jossa liikuteltiin laattaa ja pompoteltiin pallolla muuria rikki. Aikaisemmilla Basic-tulkeilla ei olisi tullut edes mieleen tehdä reaaliaikaista interaktiivista peliä, joka päivitti ruudun ainakin 10 kertaa sekunnissa.

Tällöin MikroBitisssä alkoi ohjelmointiartikkelien sarja. Siinä esiteltiin ilmainen DJGPP-kääntäjä, joka on gcc:n MS-DOS-portti. Kopioin sen MBNet:istä, joka siihen aikaan oli ns. purkki, eli BBS-systeemi. Internet oli jo keksitty, mutta ei laajalle levinnyt. Yhdessä "C-Kieli" -kirjan kanssa pääsin alkuun C:n ihmeelliseen maailmaan. Perinteisten tietojenkäsittelyalgoritmien sijasta piirsin alusta asti pisteitä ja viivoja.

Tässä vaiheessa aloin ostamaan kirjoja. "486-konekieli" sai minut kokeilemaan Assemblerin optimointia. Tein ohjelman, joka printtasi ruudulle tekstiä, ja alkoi vierittää sitä. Optimoin sen ainakin kaksinkertaiseksi. Tavallisten mov-komentojen sijasta tavut kopioitiin sarjassa movs:illa. Flickeröinti estettiin lukemalla näyttökortista vertical sync-bitti (monikohan lukija ymmärtää kaksi edellistä lausetta?).

"SVGA-ohjelmointi" oli pienoinen pettymys. Siitä opin erilaisten bittimaskien käsittelyn, ja leikin pirullisella 16-värisellä tilalla. Tuossa tilassa oli 4 muistipuskuria. Kukin muistipuskuri määritti jokaisesta pikselistä yhden bitin. Tällöin oli mahdollista piirtää 2-värinen kuva kirjoittamalla vain yhteen puskuriin, mutta 16 värin aikaansaaminen edellytti kaikkiin puskureihin kirjoittamista. Jos kuvaa halusi vierittää vaakasuunnassa yhden pikselin verran, piti tehdä helvetillisen vaikeita bittisiirto-operaatioita.

Viimeinen kirja oli Michael Abrashin (yksi Doom:in tekijöistä) The Art Of 3D Programming. Koodasin siitä jonkin viivanpiirtoalgoritmin, joka oli optimoitu versio Bresenham:ista. Sain myös jonkinlaisen 3D-kuution kehikon pyörimään, mutta muuten en tyhmyttäni saanut kirjasta irti edes murto-osaa siitä, mitä olisin voinut saada.

Hienoin saavutukseni oli yksinkertainen peli, jossa vieritettiin palloja. Veljeni piirsi siihen grafiikat. Kovin kaksinen se ei ollut.

Lukion 1. luokan jälkeen vaihdoin lukiota Päivölään. Siellä sain ensimmäistä kertaa opetusta ohjelmoinnissa, kun vielä kesän aikana meidät laitettiin TTKK:n luennoijien pitämälle ohjelmoinnin peruskurssille. Ohjelmointiopetuksen motiivi olisi se, että pystyisimme rahoittamaan opiskelumme työharjoittelulla. Tuolla kurssilla törmäsin ensimmäistä kertaa olio-ohjelmointiin ja C++:aan. Uutta oli myös se, että joku katsoi, mitä olen koodannut, ja asetti vaatimuksia. Ensimmäistä kertaa olin seurassa, jossa joku muukin oli koodannut. Porin lukossa oli muutama tyyppi, jotka olivat koodanneet, mutta en koskaan keskustellut heidän kanssaan. Kuulin heidän joskus puhuvan Midas-äänijärjestelmästä, joten ilmeisesti he tekivät demokoodausta. Oli tuohon aikaan mielenvikaisen epäsosiaalinen.

Myös diskreetin matikan eli algoritmimatikan kurssi oli hieno. Siellä käsiteltiin logiikkaa, joukko-oppia (sitä yksinkertaista peruskamaa; ei mitään valinta-aksiomaattista skeidaa), relaatioita, puita, asymptoottista kompleksisuutta, uudelleenkirjoitusjärjestelmiä jne. En aikaisemmin tiennyt, että tietojenkäsittelyllä on minkäänlaista vakaata matemaattista pohjaa.

Ohjelmointiopetus ei jatkunut. Yritin vääntää PNG-purkajaa, mutta LZ77 osoittautui liian kovaksi palaksi. Päivät täyttyivät muusta tekemisestä niin, ettei vapaa-ajan ohjelmointiin jäänyt energiaa. Ohjelmaan kuuluneessa työharjoittelussa tein toisena vuonna (eli lukion 3.luokka) hieman Symbian-koodausta. Porttasin kuulanvierityspelin Symbian 5:n emulaattoriin. Ei tullut tilaisuutta kokeilla sitä raudalla.

Samalla luokalla oli 2 henkilöä, jotka olivat kehittäneet ?teollisuustason? ohjelmointitaidon. Kummallakin jompikumpi vanhemmista oli kykenevä antamaan neuvoja. (Linus Torvaldsilla isoisä antoi ohjeita. Hänen isoisänsä oli matematiikan professori, ja laittoi ala-asteikäisen poikansa naputtelemaan numeerisen laskennan ohjelmia VIC-20 -koneelle. Minun vanhempani saattaisivat juuri ja juuri pystyä lukemaan tätä blogia, jos antaisin heille osoitteen.) Siellä oli muitakin ihmisiä, jotka olivat aloittaneet koodauksen itsekseen. Tyypillinen yhteinen kokemus oli sattuman suuri vaikutus. Yksi oli lainannut Stroustrupin C++-teoksen (Stroustroup on alan arvostetuin referenssi), toisilla ei käynyt yhtä hyvää tuuria. Voi kuitenkin esittää hypoteesin, että teollisuustason koodaustaidon kehittäminen 16-vuotiaana edellyttää joko sitä, että on joku mentori, tai sitä, että liittyy johonkin demoporukkaan.

Päivölään liittyneen työharjoittelun seurauksena sain lukion jälkeen kesätyötä ohjelmointialalta. Tein useampana kesänä sekalaista ohjelmointityötä samalle firmalle.

Töissä ja armeijassa vietetyn välivuoden jälkeen alkoivat tietojenkäsittelyn opinnot. Niistä ei ole paljon lapsille kertomista. Se on sitä samaa huttua, jota kaikki tietojenkäsittelijät opiskelevat. Olin tutor-ryhmän ainut jäsen, joka oli aloittanut koodauksen ennen yliopistoa. Suuntauduin algoritmiikkaan. Kieliteknologian luennot saivat minut kiinnostumaan luonnollisen kielen käsittelystä, josta gradukin on tarkoitus tehdä.

Viimeinen mainittava aikakausi oli töissä vietetty väliaika. Siihen sisältyi n. 2v työtekoa, ensin osa-aikaisena, sitten täyspäiväisenä. Kyseessä oli reaaliaikainen Symbian-ohjelmointi. Tässä vaiheessa kiinnostus siirtyi ohjelmoinnin tekniikasta sosiaalisiin asioihin. Kun aloitin, yksikössä ei ollut minkäänlaista ohjelmistoprosessia. Aloin lukemaan Joel on Softwarea ja vastaavaa ohjelmistonkehitysmatskua, jossa kerrottiin mm. yksikkötestauksesta ja sunnittelumalleista. Yksikkötestausta ei siis Firmassa harjoitettu, ja olio-ohjelmoinnin kanssakin oli vähän niin ja näin. Dokumentaatiotakaan ei kirjoitettu, koska sitä "ei kukaan kuitenkaan lukisi", puhumattakaan koodauskonventioista. Kesken välivuotta sattui organisaatiomuutos, jonka jälkeen meidät laitettiin koodaamaan hyvin raskaan ohjelmistoprosessin alaisena. Muutos oli hyvin opettavainen kokemus, ja toi lihaa luetun teorian ympärille. Muilla ei selvästikään ollut käsitteitä muutoksen jäsentämiseen, koska prosessin muutoksista ja sen hyvistä ja huonoista puolista ei juuri keskusteltu (teknisistä asioista pystyttiin vääntämään juttua tuntikaupalla).

No comments: