11.2.2013

Ohjelmointia

Olen tässä viime aikoina ohjelmoinut, tai paremminkin voisi sanoa, että yrittänyt ohjelmoida yhtä ohjelmaa. Tai oikeastaan kahta. Tai ehkä kolmea... Hommat tahtoo aina levitä käsistä kuin Hujasen paska.

Ensimmäinen ohjelma, jota yritin saada valmiiksi, on eräänlainen ikuisuusprojekti. Ensimmäisen kerran koodasin sen useita vuosia sitten yhdellä ohjelmointikielellä, jota opiskelin aikaisemmin. Ohjelma oli yksinkertainen, sen tarkoituksen voisi tiivistää hyvin yhteen lyhyeen lauseeseen. Sain ohjelman toimimaan, mutta käyttöliittymä ja toteutus olivat jotenkin perseestä. Koska ohjelma kuitenkin toimi haluamallani tavalla, niin en jaksanut panostaa enää siihen ja mielenkiinto matkasi muihin kohteisiin.

Aikaa myöten opiskelin tuosta ohjelmointikielestä lisää ominaisuuksia ja törmäsin siellä sellaisiin juttuihin, joita olisi voinut käyttää tuossa ohjelman teossa. Päätinkin sitten uudestaan muokata koodia ja käyttöliittymää paremmaksi ja soveltaa opittuja juttuja käytäntöön. Koodi tulikin sitten kirjoitettua kokonaan uusiksi ja samoin käyttöliittymäkin vaihtui paremmaksi. Nyt kehitystyö meni kuitenkin hieman helpommin eteenpäin, sillä enää ei tarvinnut keksiä uudestaan sitä ohjelman varsinaista algoritmia. Tällä kertaa ohjelmasta tuli ihan käytettävä. Joitakin mielessä olleita pikkujuttuja jäi toteuttamatta, mutta koska ne olivat lähinnä lisämausteita, niin niiden poisjäämisestä ei syntynyt suurta itkua.

Käyttelin ohjelmaa tyytyväisenä jonkin aikaa kunnes yhtenä kertana huomasin, että ohjelma teki virheellisen toiminnon yhden tiedoston kohdalla. Kuitenkin aikaisemmin homma oli toiminut ihan kunnolla ja vaikka ajelin tuon jälkeen testejä uudestaan, niin en nähnyt enää tuota virhetoimintaa uudemman kerran. Jatkoin ohjelman käyttämistä ilman korjauksia (hankala se on jotakin asiaa korjata, jos syyllistä ei löydy) mutta tuo seikka jäi kuitenkin jäytämään jonnekin mielen syövereihin.

Kun aloin opiskella viime syksynä toista ohjelmointikieltä, niin tuo mieleen hautautunut asia pulpahti jälleen pinnalle. Ajattelin, että kun nyt on alkanut opiskella tätä kieltä, niin voisi harjoituksena koodata kolmannen kerran uudestaan tämän ohjelman. Jos siitä nyt tällä kertaa tulisi toimiva ja varma tekele... Tällä hetkellä ohjelmasta on kasassa tietoja analysoiva puolisko, enää puuttuu se osio, joka toteuttaa varsinaisen työn. Niin ja sitten vielä päälle se käyttöliittymä.

Tällä hetkellä eniten päänvaivaa tuottaa se, että minkälaisilla härpäkkeillä ohjelman käyttämät tiedot esitettäisiin käyttöliittymässä. Oli härpäke minkälainen tahansa, niin yleensä tiedon esittäminen siinä on vielä suhteellisen helppoa, kunhan tutustuu ensin härpäkkeen ominaisuuksiin. Mutta se onkin sitten eri asia, miten härpäkkeissä nähtävillä olevat käyttäjän muokkaamat tiedot saadaan vietyä takaisin varastoon talteen. Jos tyytyisi yksinkertaisiin asioihin, niin luultavasti homma olisi jo valmiina paketissa. Mutta kun töissä on tottunut käsittelemään erilaisilla ohjelmilla tietomassoja tehokkaasti, niin se nyt on vain yksinkertaisesti perseestä ja syvältä sieltä tehdä vain joku vähä-älyinen kuppainen lomake, jolla voi käsittellä vain muutamia tietoja kerralla. Näitä erilaisia käyttöliittymävaihtoehtoja testaillessa ja räplätessä on sitten tullut tehtyä monta erilaista testiohjelman pätkää ja siinä sivussa kokeiltu uusia taktiikoita toiseen ja kolmanteen ohjelmaa. Haittaa kuitenkin tuo työ tätä harrastustoimintaa sen verran, että taitaa valmistua tämä ohjelma vasta joskus keväällä...

PS.

Näkyi yhdellä deittipalstalla olevan yksi mielenkiintoinen ilmoitus. Tekisi mieli vastata siihen mutta saapahan nähdä tuleeko tehtyä mitään. Siitä on ihan liian paljon vaivaa keksiä sopivan mielenkiintoista vastausta, johon tuskin koskaan tulee saamaan vastakaikua.

2 kommenttia:

Vaeltaja kirjoitti...

On olemassa tiettyjä virheitä, jotka ilmenevät satunnaisesti eri suorituskerroilla, riippuen ohjelman tilasta suoritushetkellä. Klassinen esimerkki on kielet, joissa ei ole automaattista dynaamisen muistin käsittelyä (C/C++), vaan ohjelmoijan täytyy itse huolehtia muistin varauksesta ja vapauttamisesta. Virhe sopivassa paikassa ei välttämättä tule koskaan esille, mutta kun näin tapahtuu, on sen paikallistaminen erittäin hankalaa.

Modernimmissa kielissä satunnaisuutta tuo soppaan useimmiten rinnakkaisuus, jolloin samaa koodia ajetaan yhtäaikaisesti useammassa säikeessä. Tällöin tulee pitää huolta jaettujen resurssien käsittelyn atomisuudesta tai muuten voi ilmetä satunnaisia hankalasti selvitettäviä virhetilanteita eli ns. race condition kahden säikeen välillä. Esimerkiksi juuri samaan tiedostoon kirjoittaminen on tällainen toimenpide, sillä yleensä halutaan, ettei kahden tapahtuman rivit mene tiedostossa sekaisin. Erilaiset lukot (monitorit, mutexit, RW-lockit jne.) on kehitetty juuri näitä tilanteita varten.

Edellä mainittuja virheitä on hankala saada kiinni perinteisillä yksikkötesteillä, debuggauksella tai vastaavilla juuri tuon satunnaisuuden vuoksi. Nykyään on tosin olemassa työkaluja, jotka testaavat säikeitä inkrementaalisesti juuri tällaisten virheiden nappaamiseksi. Kokemukseni mukaan myöskin klassinen matalamman tason säikeillä ohjelmointi on liian hankalaa useimmille ohjelmoijille, koska se vaatii hyvin erilaista ajattelua ohjelman suoritusvuosta perinteiseen malliin verrattuna.

Urpo Turpo kirjoitti...

Jos nuo on hankalia ammattilaisille, niin saati sitten amatööriohjelmoijalle, jolla ei ole tietoa asioista. Tosin siihen auttaa se, että koettaa pitää ohjelmansa hyvin yksinkertaisena ja idioottivarmana, niin mahdollisia virhetilanteita tulee mahdollisimman vähän.