Genis

Isot asiat alkavat pienestä

Ajattelin eräänä iltana Koodi2016-projektia; kuinka mahtava juttu, että nyt Suomessa on otettu virallinen suunta ohjelmoinnin osaamisen edistämiseen. Suomi on tosin siinä mielessä “petollinen”, että täällä on paljon kansallisen tason asioita, jotka eivät välttämättä jalkaudu jostain syystä käytännön tasolle asti.

Uskon että Koodi2016 -projekti on erilainen. Sen merkitys voi olla suurempi kuin tällä hetkellä käsitetäänkin. Maallemme on yksi asia keskeinen; resurssimme ovat sekä paikallisesti että globaalisti suhteellisen pienet. Suomen valtti on aina ollut korkeatasoinen osaaminen, henkinen pääoma. Koodi2016 voi olla eräs keskeisiä tämän perinteen jatkajia ja uudenlaisen osaamisen luomisvimman kipinöittäjiä. Toivon, että parinkymmenen vuoden päästä tuo on selvinnyt!

Tie, matka, ja määränpäät ovat metaforia, joilla keskustellaan usein kun on kyse kehityksestä ja projekteista. Siinä mielessä voisin omasta kokemuksestani kertoa, että kenties määränpään tarkka määrittely on vaikeaa ja jopa haitallista. Ohjelmoinnille tyypillistä tuntuu olevan ainakin teknologioiden kiivastahtinen kehitys. Se on virkistävää!

Syntyi “Genis”. Aloin siis kirjoitella mietteitä asian tiimoilta blogiini, tänne Jukkasoftiin. Jukkasoft on nimi, jonka keksin 12-vuotiaana – kun olin vissi ja varma, että isona omistan ohjelmistoyrityksen! 🙂
Vaikka tämä haave ei ole toteutunut, nimi on säilynyt.

Yritä!

Haluaisin itse luovuttaa eteenpäin sitä mahtavaa kokemusten viidakkoa, jonka vuosikaudet tietokoneiden parissa hääräämisestä on saanut.Tiedän hyvin vähän tällä hetkellä pedagogiasta; tiedän vain sen, että usein riittää, kun on valmis yrittämään – ennakkoluulottomasti, ilman pelkoja, avoimin mielin. Tämä on samalla ehkä tärkein opastus, minkä ylipäätään voin antaa – oli kyse koodauksesta, oppimisesta tai elämässä pärjäämisestä: yritä!

Mikä tietokone on?

Ohjelmoinnin taustojen ymmärtämiseksi on hyvä lyhyesti käydä läpi tietokone.

Tietokoneiden esihistoriassa oikeastaan puhuttiin mekaanisista tai elektronisista laskimista – tästä myös juontuu englanninkielinen termi “computer”, eli tarkkaan kääntäen: laskija. Ihmiskunnan esihistoriassa ylipäätään kirjallista tuotantoa käytettiin erilaisten omistussuhteiden, lukumäärien ja pinta-alojen tallentamiseen; toisinsanoen kirjanpitoon. Tietokoneiden alkuperäinen käyttötarkoitus on hyvin lähellä näitä.

Lisäksi sotateollisuus tarvitsi ja hyötyi paljon tietokoneista, jotka laskivat mm. tykistön ammuntojen liikeratoja. Ensimmäisen avaruusmatkat olisivat myös olleet käytännössä mahdottomia ilman näitä aikaisia “elektronisia aivoja”. 1980-luvulta eteenpäin tietokoneet tekivät myös ihmisten kotona läpimurron, niin viihteen kuin hyödyn saralla.

Tietokonepelit ovat nykyään suurempi teollisuudenala kuin elokuvat, jos suuruutta mitataan myynnistä saatavien tulojen perusteella.

Pieni kertaus. Tietokoneiden sovellusalueita ovat olleet:

  • kirjanpito
  • sotatoimet
  • tutkimus; myös avaruusmatkailu
  • pelit ja viihde

Tietokone on “kasa muistipaikkoja ja operaatioita muistin sisällön avulla”. Kaikki tieto tallennetaan siis muistiin. Muisti voi olla joko pysyvää tai väliaikaista työmuistia. Työjako näiden välillä on looginen: pysyvään muistiin tallennetaan esimerkiksi asiakirjat, kuvat, ja myös itse ohjelmakoodi.

Työmuistiin ladataan sekä koodi (ohjelma) että tieto, ja sen jälkeen koodi suorittaa tiedolla noita edellämainittuja operaatioita. Ennen tämän pysyvän muistin eli ns. massatallennusvälineen keksimistä tietokoneiden käyttö oli huomattavasti työläämpää, sillä joka kerta, kun kone käynnistettiin, tarvittavat ohjelmat piti syöttää (yleensä näppäimistöllä) tietokoneelle uudestaan. Toisinsanoen ohjelmointi oli “loppukäyttäjänkin” jokapäiväistä rutiinia.

Nykyään ohjelmoijat luovat nämä ohjelmat, ja suurin osa tietokoneiden parissa työskentelevistä ihmisistä vain käyttää ohjelmia hyväkseen.

Esimerkiksi näin: “Tuskinpa osaisin koodata, koska en ole kovin hyvä matematiikassa.”

Aloittelin itse tietokoneisiin tutustumisen puhtaasti harrastepohjalta vuonna 1984. Isäni osti Commodore 64 -merkkisen kotitietokoneen. Koulun välitunneilla keskustelimme kaverien kanssa aika paljon lähinnä peleistä. Nyt myöhemmin huomaan että vaikka tuolloin ei vielä ollut Internetiä, tietokoneet olivat itse asiassa erittäin sosiaalinen asia. Aivan päinvastoin kuin usein annettiin ymmärtää, tietokoneiden parissa viihtyminen ei suinkaan eristänyt, vaan avasi eräänlaisen uuden portin jonka kautta pystyi sekä kehittämään ajatteluaan, viihtymään ja lisäksi saamaan ystäviä!

Mitä vaiheita ohjelmoinnoissa on?

Kun tuplaklikkaat Windowsissa ohjelman käyntiin, käytät sitä lopputulosta, joka on tullut kohtuullisen pitkän ketjun läpi. Ohjelmoijat suunnittelevat, kirjoittavat ja testaavat ohjelmansa joko yksin tai tiimityöskentelynä.

Ohjelmistojen monimutkaisuus vaihtelee paljon: esimerkiksi Windows-käyttöjärjestelmän tai laajan toimisto-ohjelmistopaketin koko voi olla kymmeniä miljoonia rivejä, tai jopa satoja miljoonia rivejä.

“Clark Code: ei ennen testattu!”

Käydään ohjelmoinnin vaiheet tarkemmin läpi:

Ohjelmointia edeltää jonkinlainen tutustuminen ohjelmointiympäristöön ja ohjelmointikielen ominaisuuksiin. Vaikka yrityksissä pyritään rekrytoimaan usein tiettyyn kieleen tottunut asiantuntija, hyvin usein projekteissa myös tarvitaan taitoja omaksua uutta. Siksi ainakaan itse en suosittele rajautumista kovin kapealle alalle; jokainen teknologia, oli se omana aikanaan kuinka suositun tai vankkumattoman näköinen hyvänsä, voi myös nopeasti ajautua pois muodista.

Ohjelmointiympäristö ja sen asetukset ovat monipuolistuneet. Tärkeintä on kuitenkin se, että IDE tuntuu omalta: on kiva näpytellä tekstiä, on helppo poistaa tai kopioida kokonaisia rivejä tai tekstilohkoja, ja löytää haluamansa koodin sisältä. Jos työskentelee verkkoympäristössä, jossa koodi tallennetaan versionhallintajärjestelmään, kannattaa nähdä hieman vaivaa että tuo käy helposti; muutama näppäinyhdistelmä pitäisi riittää.

Kuten Koodi2016 -hankkeessa kerrotaan, ohjelmoinnissa on kyse ajattelusta. Kaikki ohjelmointi pyrkii ratkaisemaan joitakin ongelmia; käyttämään tietokonetta tekemään asiat paremmin, ja vapauttamaan ihminen pois yksityiskohdista johtamaan prosessia.

Suurimmat tietokoneilla saavutetut asiat ovat olleet tietomassojen käsittelyä; suuryrityksen palkanlaskenta, kirjanpito, varastonhallinta, julkishallinnon erilaiset rekisterit, terveydenhuollon tietotarpeet, liikenteen ratkaisut. On tehty tietokantahakuja rekistereihin, jotka sisältävät miljoonia tietueita. Tuloksia on rajattu, yhdistelty, ja näin saatu jalostettua tietoa ulos primitiivisestä tietovarastosta.

Ns. mobiilivallankumous siirsi tietotekniikan käyttöaluetta lähemmäs ihmisten välitöntä arkea: viestintä, valokuvien jako, luovuus, viihde. Ihmiset käyttävät nykyään lähes joka sekunti tietotekniikkaa jossain muodossa. Päivä lähtee usein kännykän herätyksestä liikkeelle.

Suuri muutos kohti verkottunutta (Internetiin kytkettyä) tietojenkäsittelyä alkoi tapahtua 1990-luvulla. Vielä kuitenkin esimerkiksi Suomessa 1990-luvun alkupuolella käytiin enemmän ns. BBS :issä eli sähköisissä “purkeissa”, jotka eivät olleet automaattisesti yhteydessä toisiinsa. BBS toimi postitoimistona, jossa voitiin säilyttää tiedostoja, ja vaihtaa viestejä joko kahdenkeskeisesti tai keskusteluryhmissä. Jos BBS:n omistajalla oli enemmän rahkeita (tai esimerkiksi rahoitusta käyttäjiltä), purkissa saattoi olla runsaasti sisäänsoittolinjoja (engl. “dial-in”). Muuten purkkiin piti jonottaa, ja siellä saattoi olla vain yksi käyttäjä kerrallaan modeemilla tekemässä tietojenvaihtoa. Muut saivat soittaessaan “varattu” -tuuttauksen, ja joutuivat yrittämään uudelleen kunnes linja vapautuu.

(Ohjelmointi)kieliasiat ja teknologia tulevat siinä mielessä kuvaan, että sulautuminen olemassaoleviin ratkaisuihin (esimerkiksi kun koodia on tarkoitus laajentaa toiminnoiltaan) helpottuu jos on käytössä suoraan yhteensopivat palikat.

Ympäristö on vähintäänkin itse tietokone, tekstieditori, mahdollisesti kääntäjä, ja ajoaikainen ympäristö. Esimerkiksi Windows-ohjelmat kirjoitetaan useimmiten C# (‘C sharp’ englanniksi) tai C++ kielellä, jonka jälkeen ne käännetään eli muunnetaan Windowsin ja tietokoneen käyttämän prosessorin ymmärtämiksi konekielisiksi käskyiksi. Konekieli on sitä, mitä tietokonelaitteisto ihan oikeasti ymmärtää, eli voi suorittaa. Kaikki “hienostuneempi” ohjelmakoodi lopulta tavalla tai toisella päätyy konekieleksi, koska muuten prosessori ei yksinkertaisesti pystyisi suorittamaan sitä. Tässä on mainio esimerkki delegoinnista eli asioiden saavuttamisesta siten, että “asiakas”-osapuoli laatii suunnitelman ja jokin muu suorittaa sen lopulta.

Miltä ohjelmointi tuntuu?

Tietokoneisiin ja teknologiaan voi muodostua jopa hyvin henkilökohtainen suhde. Vaikka koneet eivät tunteile, ihminen tunteilee tunnetusti, ja kohde voi olla elävä tai mekaaninen. Autot, tietokoneet, tai vaikka kulutushyödykkeet — kuten kotistereot — “tuntuvat” tietynlaisilta. Koemme sekä positiivisia että negatiivisia tunteita näiden laitteiden kanssa ja niitä kohtaan.

Tietokoneet ovat vuorovaikutukseltaan periaatteessa hyvin rajoittuneita, mutta niiden kautta muodostamme suhteita ympäröivään maailmaan ja muihin ihmisiin. Siksi assosioimme myös itse laitteisiin sekä positiivisia että negatiivisia tunteita.

Kenties juuri tämän vuoksi tietokoneista tulee ajattelutoimintamme fokuksia, tai ainakin tuon aktiviteetin läpimenokanavia.

“Ulkoisten” asioiden merkitys tunteelle

Aikoinaan kun tekstieditorien ulkoasu oli ruma, teimme kaverini kanssa pienen ohjelman, joka muutti kirjaimet paremman näköisiksi. No, ohjelmahan ei lainkaan ollut kovin pieni, ja siitä tuli varsinainen “baby” eli oma mieliprojekti aika pitkäksi aikaa. Teknisesti kyse oli kahdesta asiasta:

  • toisella ohjelmalla luotiin fontit, eli se oli editori. Tietokoneen näytöllä pystyi piirtämään ruudukossa (tyypillisesti fontit olivat silloin 8×14 pikselin kokoisia) kirjainten muodot pikseli kerrallaan.

Eli emme enää tyytyneet käyttämään tietokoneeseen valmiiksi asennettua fonttia, vaan itse asiassa suunnittelimme sekä uuden ilmeen että tuon ohjelman, joka mahdollisti fontin vaihtamisen. (Tämä oli ennen Microsoft Windowsin aikakautta – nykypäivänä fontin vaihtamiseen ei tarvitse itse ohjelmoida! 🙂

JetBrains_IDE_modern_navigation
Moderni, n. vuoden 2014 editointiympäristö (C) JetBrains

Hyvännäköisellä fontilla oli huomattavasti tuottavampaa myös ohjelmoida. Ymmärsin silloin, miten paljon estetiikalla ja nimenomaan tuolla tunteella voi olla olla merkitystä. Applen perustaja, edesmennyt Steve Jobs, painotti paljon kauneuden ja estetiikan sekä viimeistelyn merkitystä teknologiassa. Ilmeisesti kyseessä on meidän, ihmisten, luonnollinen suhtautumisen muutos mikäli koemme jonkin epäesteettiseksi.

Toinen asia joka vaikuttaa ohjelmoinnin tuottavuuteen on tekstin luettavuus – sen vuoksi kannattaa nähdä hieman vaivaa usein oman ohjelmointiympäristön muokkaamiseen itseä miellyttäväksi.

Ohjelmointi on aika haastavaa puuhaa. Se voi antaa erittäin suurta onnistumisen tunnetta. Toisinaan virheen etsiminen koodista voi olla pään lyömistä seinään.

Hyvä ohjelmoija myös suunnittelee ja dokumentoi tekemänsä

Vuosikymmeniä sitten on jo huomattu, että ohjelmoinnin “flow” -vaiheessa on suuri riski aliarvioida dokumentoinnin tärkeys. Kun koodia syntyy, ohjelmoija ei halua keskeyttää tätä hyvänolon tunnetta dokumentoinnin vuoksi. Dokumentointi on kuitenkin lähes kullanarvoista myöhemmin, kun ohjelmaan halutaan tehdä muutoksia. Dokumentti kertoo “ulkopuoliselle” havainnoitsijalle, mistä ohjelmassa on kyse; ja mitkä ovat sen olettamat periaatteet ja rajoitukset.

Ajan kuluminen helposti hävittää tehokkaasti alkuperäisten ohjelmoijien mielestä pieniä yksityiskohtia, jotka ovat ohjanneet ohjelmointiprosessia. Tätä (luultavasti ihmisen “lähimuistin” ylläpitämää) kontekstia on vaikea ymmärtää, jos ei ole itse joskus ollut sekä luomassa laajempaa ohjelmaa, että korjaamassa jonkun toisen tekemää laajaa ohjelmaa.

“Business or pleasure?”

Ohjelmoinnista nauttii enemmän kokemuksen myötä. Eräs asia, jonka itse olen huomannut, on että projekti voi olla kahdenlainen: harrasteprojekti, tai työ. Näihin kahteen suhtautuu hieman eri tavalla. Harrasteprojekteissa on usein rennompi aikataulu tai ei aikataulua lainkaan. Esimerkiksi Linux, kuuluisa suomalainen käyttöjärjestelmä, alkoi Linus Torvaldsin “lemmikkiprojektina”. Sinänsä työ- ja harrasteprojekteilla ei ole teknologisesti eroja; molemmissa voidaan käyttää samoja työkaluja ja ohjelmointikieliä. Töissä usein työkalut voivat maksaa enemmän, kuin mihin harrastelijoilla on varaa; esimerkiksi valmiilla ohjelmistokirjastoilla (moduleilla) voidaan nopeuttaa kehitystä, mutta nämä maksavat jopa kymmeniä tuhansia euroja.

Moniteknologiaympäristöön

Aiemmin ohjelmoijalla ei ollut kovin paljoa valinnan varaa, kun halusi tehdä koodia. Kokonaiset kehitysympäristöt olivat joko kalliita tai hyvin heikoilla ominaisuuksilla varustettuja. Ohjelman teko sisälsi koodaamisen lisäksi myös paljon ohjelman ylläpitoon liittyviä toimenpiteitä: käännöskomennot ajettiin “karusta” komentokehotteesta, kirjoittamalla komentoja joissa ei usein tuntunut olevan järjen häivää. Ohjelmistot ovat kasvaneet kooltaan ja monipuolisuudeltaan nykypäivään tultaessa, ja valinnanvaraa on monikymmenkertaisesti. Itse asiassa nykyään on tietynlainen runsaudenpula. Se voi aiheuttaa toisinaan tietynlaisen häkeltymisen tai “tyhjän sivun syndrooman”, eli on vaikea päästä alkuun, koska ennen ensimmäistäkään koodiriviä on pitänyt tutustua näiden erilaisten työkalujen ominaisuuksiin ja ainakin peruskäyttöön.

Sivuavia aihepiirejä:

  • Avoin lähdekoodi
  • Ohjelmistojen tietoturva
  • Ohjelmistotestaus
  • Peliohjelmointi

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s