Samuli Siivonen
4 min readDec 19, 2018

Huonoa ja hyvää koodia

Olen tähän mennessä kirjoitellut kaikenlaista koodista, mutta riviäkään oikeaa koodia ei ole näkynyt. Se muuttuu nyt. Lähdetään vastaesimerkin kautta ja katsotaan ensin vähän huonoa koodia.

Huonoa koodia

Tämä koodi on PHP:tä. PHP on ohjelmointikieli, jota suurin osa koodaajista ei pidä minkään arvoisena. Se on siis kieli, jonka päälle Facebook on rakennettu ja joka on käytössä noin puolella internetin sivuista.

Tämä koodi ottaa yhteyden MySQL-tietokantaan. Se tehdään käyttäen PHP:n sisäistä tietokantafunktiota. Tämä koodi ei ole modernia. Moderni PHP on olio-ohjelmointikieli, joka näyttää vähän vanhalta Javalta. Myöskään käytetty funktio ei ole enää suositeltu tapa kommunikoida tietokannan kanssa. Se on koodin puolelta vähän kömpelö käyttää eikä estä SQL injektiota. Myöskään charsetin asettaminen joka kerta erikseen ja aikavyöhykkeen asettaminen SET komennolla mahdollisesti joka kerta ei tunnu parhaalta ratkaisulta. Lisäksi tästä koodista löytyy lähes identtinen kopio, jota käytetään master-tietokantayhteyksiin. On paljon koodin kehityksen ammattilaisia, jotka eivät näe tässä esimerkkikoodissa oikein mitään hyvää.

Vaikka tämän koodin muokkaisi oliotyyliseksi, vähentäisi toisteisuutta, käyttäisi uusimpien suositusten mukaista tietokantayhteyttä ja tukkisi SQL-injektioreiän, ei se silti välttämättä muuttuisi hyväksi. Ensinnäkin se olisi edelleen kirjoitettu väärällä kielellä (mikään PHP-koodi ei voi olla hyvää). Ne jotka ovat OK PHP:n kansa, eivät silti välttämättä haluaisi käyttää tällaista suoraa tietokantayhteyttä vaan paljon mieluummin käyttäisivät ORMia tai muuta vastaavaa keinoa, joka häivyttää taustalla ajetut SQL-komennot. On käytännössä mahdotonta muokata tästä koodista sellaista, että kaikki pitäisivät sitä hyvänä. Tämä toki pitää paikkansa kaiken koodin ja kaikkien ohjelmointikielten osalta. Kyse on kuitenkin hyvin paljon mielipideasioista.

Nyt kun on katseltu vähän huonoa koodia, niin katsotaanpa sitten hyvää koodia.

Hyvää koodia

Tarkkasilmäisimmät huomasivat, että tässähän on täysin samat koodirivit kuin aiemmassa esimerkissä. Pitää paikkansa. Se johtuu siitä, että tämä on mielestäni varsin hyvää koodia. Ja minulla on ihan hyvät perusteetkin tähän.

Satun tuntemaan tämän koodin. Olen omin pikku kätösin siirtänyt sen ja noin miljoona muuta riviä Intiassa olevalta CVS serveriltä GitHubiin vajaa kolme vuotta sitten. Ensimmäiset versiot tästä koodista on kirjoitettu noin 15 vuotta sitten. Muutoksia on toki matkan varrella tehty, mutta perusta on vieläkin pysynyt samanlaisena.

Yksi syy miksi tämä koodi on mielestäni hyvää koodia on yksinkertaisesti, että se on vieläkin elossa. 15 vuotta on todella pitkä aika IT-alalla. Uskoisin, että mikään koodi, jonka olen 20-vuotisen ammattikoodarin urani aikana kirjoittanut ei ole ollut tuotantokäytössä 10 vuotta. Ja jos on, ei ainakaan kovin aktiivisessa käytössä. Ja ne jotka sen kanssa vielä joutuvat työskentelemään, pitävät sitä tuhoon tuomittuna legacynä, josta pitäisi päästä eroon heti kun mahdollista. Varsinkin fronttikoodin osalta tämä vanhentumisvauhti on jo naurettavissa mittasuhteissa. Olen nähnyt moderneja web projekteja, joita ei saa edes pystyyn parin kuukauden hiljaiselon jälkeen, koska käytetyt kirjastot ovat jälleen muuttuneet taaksepäin epäyhteensopivasti. Tai kun kirjoitetaan uutta softaa neljä kuukautta, niin käytetyt teknologiat ovat jo vanhentuneet, ennen kuin softa saadaan liveksi.

Yleinen mielipide tuntuu olevan, että legacy-koodi on aina huono asia. Itse olen sitä mieltä, että meidän kaikkien pitäisi pyrkiä kirjoittamaan tulevaisuuden legacy-koodia. Jos jokin kirjoittamasi koodi on 5 vuotta kirjoittamisen jälkeen tuotannossa, pitäisi sitä juhlia eikä häpeillä. IT-hommissa maailma muuttuu niin nopeasti, että totta kai 5 vuotta vanha koodi näyttää pahalta nykysilmin katsottuna. Mutta se ei ole oleellista. Sama pätee nyt juuri kirjoittamaasi moderniin ja parhaiden periaatteiden mukaiseen koodiisi. Se ei tule kaunistumaan vanhetessaan ja jos se joskus saavuttaa legacy-koodin arvostetun statuksen, voit olla ylpeä rumasta koodistasi.

Toinen asia, joka tekee yllä olevan koodin hyväksi koodiksi, on sen käyttöaste. Olen joskus kirjoittanut puoli vuotta asiakkaalle koodia, joka päätettiin lopuksi olla käyttämättä. Siis asiakas maksoi minun työtunteinani siitä koodista reilusti yli 100 000€ ja päätti lopuksi heittää kaiken roskiin. Itse en ole koskaan heittänyt sataa tonnia roskiin. Vastaavaa järjettömyyttä tapahtuu IT-projekteissa jatkuvasti. Siksi on hienoa nähdä koodia, jota oikeasti käytetään. Arvioisin, että eilen illalla yllä esiteltyä koodia on keskimäärin ajettu noin 15 000 kertaa sekunnissa. Siis sekunnissa! Lähes mikään kirjoitettu koodi ei pääse näihin lukemiin. Oli koodi minkä näköistä tahansa, tällaisia lukemia pitäisi kunnioittaa ja ainakin minun silmissäni vastaava koodi on hyvää koodia.

Kolmas oleellinen syy yllä olevan esimerkkikoodin hyvyydelle on sen business-arvo. Maailma on täynnä tietojärjestelmiä, joita juuri kukaan ei käytä ja jotka tuottavat vain kuluja omistajilleen. Tällaisen tekeminen ei ole kovin vaikeaa. Paljon vaikeampaa on tehdä softaa, joka tuottaa voittoa. Tällaisen softan hyvyys ei välttämättä näy koodia katsottaessa. Jotain on kuitenkin softankehityspuolella tehty oikein, jos saadaan tällainen softa aikaiseksi. Yllä olevan koodin kyljessä on noin miljoona riviä muutakin koodia. Kaikkea tätä kehitetään koko ajan. Tehokkaasti ja nopeasti. Ja tämä softa tekee omistajilleen rahaa. Paljon. Kun softa on suuri on äärimmäisen oleellista keskittyä oleelliseen. Kaiken kehitysajan pystyisi käyttämään olemassa olevan, toimivan koodin muokkaamiseen nykyaikaisempaan muotoon. Tähän ei kuitenkaan ole lähdetty ja hyvä niin. Käytetään sekin aika johonkin hyödyllisempään.

Keksisin vielä muitakin syitä miksi esimerkkikoodi on hyvää koodia, mutta ei pitkitetä tätä kirjoitusta enempää. Oleellinen pointti mitä yritän sanoa on, että ei dissata legacy-koodia. Eihän? Kuten muussakin elämässä, voi koodauksessakin keskittyä ennemmin sisäiseen kuin ulkoiseen kauneuteen.

🙂

Samuli Siivonen

Samuli Siivonen Oyn vanhempi konsultti, neljän nuoremman konsultin isä, Batmanin alainen ja superkoodari