25.9.11

Miksi koodia ei juuri lueta?

Psykologiset syyt
Miksi koodia ei juuri lueta? Ehkä sitä ei ole kirjoitettu luettavaksi. Koodin tärkein ominaisuus on eittämättä sen toimivuus. Pelkkä toimivuus riittää, kun  puhutaan pienestä määrästä testikoodia ja pienten hyötyohjelmien tekemisestä. Isommissa projekteissa koodin ylläpidettävyys nousee suureen arvoon. Väittäisinpä jopa, että joskus koodin ylläpidettävyys on tärkeämpää kuin sen toimivuus [Saa kommentoida. Onko kellään teistä Tikkikingeistä esimerkkiä? Milloin koodi saa olla rikki, jos se on luettavaa?]. 
    Jos kerran riittää, että koodi toimii, miksi lukea sitä? Tilastotiede kertoo, että suuri enemmistö menee sieltä mistä aita on riittävän matala. Nämä Norminörtit eivät sinänsä ole pahoja, he vain tekevät työnsä niin hyvin kuin osaavat tai kuin heiltä osataan vaatia. Tilastotieteen valossa koko populaatiosta pieni vähemmistö yrittää huijata ja luikerralla aidan ali. Heitä voikin hyvällä syyllä nimittää Koodikyiksi. He ovat langenneet Voiman Pimeälle Puolelle.  Yhtä pieni vähemmistö pyrkii aktiivisesti nostamaan rimaa. Te Tikkikingit, eli tämän blogin lukijat, olette ohjelmistokehityksen paras ja ainoa toivo. 
    Norminörtit kirjoittavat usein koodia, joka vain toimii. He eivät usein ajattelekaan joutuvansa lukemaan omaa koodiaan. Lukukelvottoman koodin kirjoitustapa saa vain vahvistusta niistä painokelvottomista voimasanoista, jotka seuraavat Norminörtin joutuessa lukemaan muiden kirjoittamaa koodia. Jokainen itseään arvostava keittiöpsykologi tietää, että oma asennoituminen värjää suhtautumista muihin ihmisiin. Jos Marjatta juoruaa hänelle uskottuja salaisuuksia eteenpäin, hän on luultavasti varovainen kertomaan omia salaisuuksiaan kenellekään. Jos Marjatta ei osaa pitää salaisuuksia, kuinka hän voisi olettaa muiden tekevän niin? Koska Keijo puijaa ja valehtelee jopa ja erityisesti puolisolleen, täytyy hänen sisäisesti lähteä siitä olettamuksesta, että muutkin valehtelevat lähes koko ajan. Koska Mikko on aina kivuliaan rehellinen, hänen sinisilmäisyyttään on helppo hyödyntää. Hänhän uskoo kaikkien puhuvan koko ajan pääasiassa totta.
    Jos siis koodi, jota itse tuotan, ei ole lukukelpoista, kuinka kenenkään muunkaan kirjoittama olisi. Lukukelvotonta koodia ei juuri lueta, vaikka juuri sitä pitäisi lukea.


Täydellisyyden metsästys
Miksi koodia ei juuri lueta? “Kaikella on aikansa ja paikkansa” sanoo vanha kansa ja, kuten kaikki yleistykset, on väärässä kuin suunnistaja kiitoradalla. Koodin lukemiselle ei oikeaa aikaa löydy. Jos koodi ei ole aivan valmis, kannattaako sitä vielä lukea? Jos koodi on ollut jo pitkään mukana suht toimivassa järjestelmässä, kannattaako sitä enää lukea? Täydellinen koodinlukuaika on kangastus, illuusio, olematon. Aaveenmetsästäjillä on tuloksekkaampaa kuin täydellisen koodinlukuajan odottelijoilla. 
    Vanhan viidakon legendan mukaan täydellinen koodinlukuaika on heti koodin valmistumisen jälkeen, ennen testausta, viimeisen muutoksen jälkeen, niin aikaisin kuin mahdollista, vasta kun kirjoittaja on koodiinsa tyytyväinen ja ennen kuin suuria väärinymmärryksiä on ehditty lisätä koodiin. Kuten legendat yleensäkin, aikaikkunan vaatimuksia on paisuteltu mahdottomuuteen asti. Vaikka aikaikkunan vaatimuksia lievennettäisiin tasosta “Täydellinen” tasolle “Juuri Oikea”, aikaikkunan koko on kiivaan projektin aikajanalla silti superlyhyt. Juuri oikea aika lukea koodia vilahtaa ohi liian nopeasti ja päästää mennessään samanlaisen äänen kuin Douglas Adamsin pitämät deadlinet
    Ällöimelissä, romanttisissa Hollywood-komedioissa jännite syntyy sen Ainoan Oikean etsimisestä. Joko sellaista ei yrityksistä huolimatta löydy, tai sitten löydetystä koitetaan etsiä mitä tahansa vikoja, jotka osoittaisivat ettei kyseessä ole Juuri Se Oikea. Sen Ainoan  Oikean koodinlukuajan odottaminen on yhtä turhaa. Paljon käytännöllisempää on tajuta, että täydellisyyttä ei ole olemassa missään muodossa (paitsi Olkiluodossa).


Taitamaton lykkää mieluiten
Miksi koodia ei juuri lueta? Asioiden lykkääminen on helpoimmillaan, kun niiden sisältö ei ole täysin selvillä. Norminörtit eivät tiedä, miten koodia tulisi lukea ja mitä sieltä olisi syytä hakea. Luulisi, että koska Norminörtit osaavat kirjoittaa koodia, he osaisivat myös lukea sitä. On kuitenkin kaksi aivan eri asiaa lukea kirjaa viihteenä kuin lukea sitä taka-ajatuksenaan kirjoittaa siitä arvosteleva raportti. Kriittinen lukeminen poikkeaa tavallisesta lukemisesta kuin seepran raidat. Tekstin tuottaminen on huomattavasti helpompaa kuin hyvän tekstin tuottaminen, mikä selittänee Norminörttien kyvyn tuottaa koodia. Koodin lukeminen kriittisesti vaatii taitoa ja kokemusta. Kun koodia tuijottaa riittävän pitkään saamatta aikaan juuri mitään mainitsemisen arvoista, jää homma helposti seuraavalla kerralla kokonaan aloittamatta. 


Palautteen antaminen on sosiaalisesti vaativaa
Miksi koodia ei juuri lueta? Jos kritiikin luominen on vaikeaa, sen välittäminen kirjoittajalle se vasta taitoa vaatiikiin. Palautteen antaminen vaatii sosiaalisia taitoja. Jokainen johtaja tietää, kuinka vaikeaa erityisesti negatiivisen palautteen antaminen on. Kuinka arvostella toista siten, että tämä silti haluaa jatkaa työtään ja vielä parantaa tulostaan? Kritiikki tulee muotoilla rakentavasti, mutta sitä ei saa naamioida liian positiivisesti, niin ettei sitä tunnista arvosteluksi. Arvonsa tuntevan ammattilaisen saamat ansaitsemattomat kehut valuvat tämän korvien ohitse kuin vesi hanhen selästä. Kun yhtälöstä poistetaan hierarkian suoma auktoriteetti, eli kun samassa työtehtävässä olevan työtoverin työtä tulee arvostella, liikutaan hyvin herkällä alueella. Huolimattomuusvirheistä huomauttaminen vaikuttaa kirjoittajasta pahimmillaan epäluottamuslauseelta ja suurien virheiden osoittaminen saattaa saada kirjoittajan tuntemaan itsensä tyhmäksi tai työhönsä kelpaamattomaksi. Kummassakaan tapauksessa palautteen antaminen ei ole sujunut oikein. Terveeseen työympäristöön kuuluu myös jatkuva rakentavan kritiikin jakelu. Kaikilla on aina aihetta parannukseen.


Tarkistaminen on aliarvostettua
Miksi koodia ei juuri lueta? Norminörttien mielestä työn tulosten tarkistaminen ei tunnu yhtä tuottavalta työltä kuin uuden koodin kirjoittaminen. Tämä syy saattaa olla myös testaamattomuuden takana. Jos tarkistamisen tärkeys ei ole riittävän korkealla, ei sitä koskaan priorisoida niin korkealle, että se tulisi tehtyä. Tehtävän arvo riippuu sen tuottamista tuloksista, joten jos tarkistamalla ei pysty löytämään riittävän arvokkaita korjauskohteita, ei itse tehtävääkään kannata tehdä. Sen sijaan että hukkaisi aikansa toisarvoiseen työhön, voi tehdä lisää koodia, jonka itseisarvo tuntuu suurelta, vaikka suuri osa ns. normikoodista olisi huomattavasti järkevämpää yksinkertaisesti jättää kirjoittamatta.


Ratkaisu
Koodia luetaan,
-kun jokainen kirjoittaa koodiaan muille ihmisille, 
-kun koodin tarkistaminen nähdään välttämättömänä osana ohjelmistokehitystä,
-kun koodin lukeminen ja tarkistaminen osataan, 
-kun tarkistamisen tuottama palaute on rakentavaa ja kehittävää ja 
-kun tarkistamisen tulokset parantavat tarkistettua koodia (ja kaikkea tulevaisuudessa tuotettua koodia) silminnähden.