Laadukkaan ohjelmiston tunnusmerkit

Laadukas ohjelmisto mahdollistaa kestävän menestyksen.

Laadukas ohjelmistotuote on tarkoituksenmukainen, toimii ilman virheitä ja on joustavasti jatkokehitettävissä. Tuotteen elinkaaren kustannusten kannalta on ratkaisevaa, miten on mahdollista toteuttaa kehittyviä tarpeita vastaavat muutokset ja laajennukset.

 

Laadun monet ulottuvuudet

Laadun käsite on laaja ja määritelmät ovat subjektiivisia. Käyttäjälle laadukas ohjelmistotuote täyttää tarpeet ja odotukset. Toimittajan näkökulmasta laadulla on usein teknisiä sekä liiketoiminnallisia ulottuvuuksia.

Laadukkaassa tuotteessa on ne ominaisuudet, joita käyttäjät tarvitsevat ja ne myös toimivat oikein sekä riittävällä suorituskyvyllä. Tuotteen ulkoinen laatu onkin siis helppo kokea. Ohjelmistotuotteen sisäinen laatu taas jää useimmiten pienemmälle huomiolle, mutta on käytännössä ratkaisevassa asemassa, jotta ulkoinen laatu ja arvo käyttäjälle toteutuu kustannustehokkaasti.

Pureudutaan tarkemmin, mistä ominaisuuksista laadukas ohjelmistotuote koostuu.

 

Ohjelmistolla pitää olla liiketoiminnallista arvoa

Tärkein peruste ohjelmistotuotteen olemassaololle on sen tarkoituksenmukaisuus. Se tuottaa lisäarvoa käyttäjilleen ja toisaalta tuotteella on liiketoiminnallinen arvo. Tarkoituksenmukainen ohjelmisto ratkaisee siis oikea-aikaisesti oikean ongelman kustannustehokkaasti. Ajan saatossa käyttäjien tarpeet ja tuotteen toimintaympäristö muuttuvat, minkä vuoksi varsinkin pitkän elinkaaren tuotteen on oltava jatkuvasti kehitettävissä. Tuotekehityksen kustannuksista keskimäärin jopa 60% on todettu kertyvän ylläpidosta ja tästä yli puolet kuluu uusien ominaisuuksien kehittämiseen [1].

Tuotteen on sovittava tarkoitukseensa myös teknisesti. Oikeat suunnittelu- ja teknologiaratkaisut mahdollistavat tuotteen toiminnan sen ennakoidussa ympäristössä. Laajaan käyttöön suunnattu palvelu tulee olla skaalautuva, jotta se ei kaadu suuren käyttäjämäärän alla. Toisaalta autonomiseksi tarkoitetun sovelluksen täytyy kyetä selviytymään virhetilanteista itsenäisesti. Joskus tuotteeksi riittää ominaisuuksiltaan hyvin rajattu ohjelmisto ja toisessa ääripäässä ohjelmisto on suunniteltava maksimoimaan laajennettavuus vaihteleviin nykyisiin ja tuleviin käyttötarpeisiin.

 

Ulkoinen laatu näkyy

Laadukkaan ohjelmistotuotteen on toimittava oikein. Tällöin puhutaan ulkoisesta laadusta. Tarpeellisetkin ominaisuudet ovat hyödyttömiä niiden toimiessa väärin tai liian hitaasti. Pahimmillaan virheet ohjelmiston toiminnassa tai puutteet tietoturvassa,  aiheuttavat vaaratilanteita (Yle, 2020) ja massiivisia PR-vahinkoja (Vastaamo haettu konkurssiin). Vähimmilläänkin ongelmat karkoittavat käyttäjiä sekä aiheuttavat lisäkustannuksia virheistä johtuvien ongelmien selvittelyyn. Huono ulkoinen laatu voi hidastaa tuotteen käyttöönottoa tai siirtää resursseja pois tuotteen jatkokehityksestä.

Huono ulkoinen laatu tuskastuttaa käyttäjiä ja heikentää ohjelmistosta saatavaa liiketoiminta-arvoa.

Ulkoiseen laatuun panostaminen onkin selvästi kannattavaa ja sen arvo on myös suhteellisen helppo ymmärtää. Ulkoisen laadun varmistaminen tapahtuu testaamalla, mutta sen rakentaminen alkaa hyvistä ohjelmistokehityskäytännöistä ja ohjelmiston sisäisestä laadusta.

 

Sisäinen laatu mahdollistaa

Nimensä mukaisesti sisäinen laatu ei suoraan näy ohjelmistotuotteesta ulospäin. Sisäisen laadun mittareina voidaan kuitenkin käyttää ulkoisia ominaisuuksia kuten: miten helposti ohjelmisto on ymmärrettävissä, muutettavissa, laajennettavissa, testattavissa ja niin edelleen. Voidaan siis ajatella, että sisäinen laatu mahdollistaa hyvän ulkoisen laadun ja tuotteen kehittämisen vastaamaan muuttuvia tarpeita. Hyvä tekninen rakenne tekee toimivan ja ajantasaisen ohjelmistotuotteen kehittämisen kustannustehokkaaksi. Sisäisen laadun merkitys onkin erityisen suuri, kun tehdään pitkän elinkaaren ohjelmistoja.

Sen sijaan huonon sisäisen laadun tunnusmerkit näkyvät. Virheitä ohjelmiston toiminnoissa esiintyy paljon ja niitä syntyy huomaamatta muutoksien sivuvaikutuksina. Uusien ominaisuuksien tekeminen kestää yhä kauemmin, mitä pidemmälle kehitystyössä edetään. Pahimmillaan ohjelmisto ajautuu niin epäselväksi ja monimutkaiseksi, että jatkokehitys ja jopa virheiden korjaus osoittautuu liiketaloudellisesti mahdottomaksi. Lopulta voidaan joutua luopumaan ohjelmistotuotteesta, johon on sijoitettu paljon ja rakentamaan uusi järjestelmä alusta.

 

Selkeästi laadukkaampaa

Ohjelmistotuotteen sisäisestä laadusta puhuttaessa tarkastellaan sen teknistä rakennetta. Tekninen rakenne muodostuu käytännössä ohjelmakoodista ja siitä miten se on jäsennelty. Kuten laatu ylipäätänsä, myös sisäisen laadun määritelmä on laaja  ja osittain subjektiivinen. Ohjelmisto, jossa kokonaisuudet on loogisesti jaoteltu on kuitenkin hyvä lähtökohta ja kulmakivi sisäiselle laadulle.

Loogisesti jaoteltu koodi helpottaa kehitystyötä ja on yksi laadukkaan ohjelmiston kulmakivistä.

Ohjelmiston sisäisen rakenteen selkeys on ensiarvoisen tärkeää, sillä ohjelmiston kehittämisen edellytys on olemassa olevan koodin ymmärrys. Erään tutkimuksen [2] mukaan keskimäärin jopa 58% prosenttia kehittäjien ajasta kuluu ohjelmiston ja sovelluslogiikan ymmärtämiseen. Selkeyttä saadaan pitämällä yhteen kuuluvat asiat yhdessä, toisistaan riippumattomat irrallaan sekä näiden väliset viittaukset johdonmukaisina. Näin saavutetaan modulaarinen rakenne, jossa komponentit abstrahoivat yksityiskohtia taakseen. Tällöin kehittäjä voi keskittyä kulloinkin olennaisiin osiin, eikä tarvitse kerralla pitää mielessä koko ohjelmakoodia.

Ohjelmiston sisäisen rakenteen selkeydellä on merkitystä, sillä tutkimuksen mukaan keskimäärin jopa 58% kehitysajasta kuluu ohjelmiston koodin ja sovelluslogiikan ymmärtämiseen. (Lähde: Xia Xin et al. Measuring Program Comprehension: A Large-Scale Field Study with Professionals. IEEE Transactions on Software Engineering 2017)

 

Laadukas koodi nopeuttaa kehitystyötä

Ohjelmiston tekninen rakenne heijastuu paitsi yksittäisen kehittäjän, myös koko tuotekehitystiimin tehokkuutteen. Ohjelmisto, jossa komponentit muodostavat monien keskinäisten riippuvuuksien verkon, luo sidoksia myös kehittäjien välille: yhden kehittäjän muutokset heijastuvat usealle muulle kehittäjälle ja toisaalta yhden kehittäjän täytyy olla selvillä monien kehittäjien tekemisistä. Sotkuisen koodin myötä tiimin jäsenten välinen koordinaatio ja kommunikointi muodostuu valtavaksi aikasyöpöksi ja jatkuvien palaverien sarjaksi, mikä heikentää ennustettavuutta. Täten huonorakenteisen sovelluksen kehitystyö ei välttämättä nopeudu edes lisäresurssien myötä, mutta kustannukset kasvavat takuulla kohisten.

Huonolaatuinen ja paljon keskinäisiä riippuvuuksia sisältävän ohjelmisto aiheuttaa paljon riippuvuuksia myös kehittäjien välillä, mikä kasvattaa kehitysaikaa ja vähentää tuotekehityksen ennustettavuutta.

Sisäinen laatu on jatkuva prosessi

Hyvä sisäinen laatu ei synny itsestään vaan vaatii suunnitelmallista ja kurinalaista työtä. Laatua ei voi myöskään enää liimata valmiin tuotteen päälle kohtuullisin kustannuksin. Sisäisen laadun tuottaminen edellyttää asiantuntevaa suunnittelua projektin alkuvaiheessa sekä jatkuvaa panosta tuotekehityksen aikana. Ohjelmistossa mallinnettuja käsitteitä ja reaalimaailman prosesseja on päivitettävä sitä mukaan kun ymmärrys ratkaistavasta ongelmasta tarkentuu. Ammattitaitoinen kumppani ohjelmistokehityksessä osaakin esittää asiakkaalle oikeat kysymykset, jotta laadukkaat ratkaisut löydetään ja saadaan toteutettua tuotteeseen mahdollisimman tehokkaasti.

On mahdollista tuottaa aluksi nopeammin heikkolaatuinen tuote, mutta huonon laadun aiheuttama kehitystyön hitaus ja ulkoiset virheet nostavat kustannuksia elinkaaren mittaan. Kustannusten nousu voi olla hyvinkin jyrkkää ja kun tilanteeseen havahtuu, voi olla jo liian myöhäistä parantaa ohjelmiston laatua, niin että sen jatkokehitys onnistuu taloudellisesti kannattavasti.

 

Pidämme huolta sisäisestä laadusta

Sisäinen laatu on rakennettava ohjelmistoon kehittäjien toimesta – sitä ei voi ulkoistaa vaikkapa projektipäällikön vastuulle. Ammattitaitoiset kehittäjät osaavat hyödyntää hyväksi todettuja suunnittelumalleja oikeissa paikoissa luoden helposti ymmärrettäviä ratkaisuja. Valveutuneiden koodarien työkalupakista löytyvät lisäksi muun muassa jatkuvat koodikatselmoinnit, automaattitestit sekä erilaisten ohjelmistoarkkitehtuurien tuntemus.

Sisäisen laadun ylläpitäminen laajassa pitkän elinkaaren ohjelmistossa vaatii taitoa investoida työpanos sinne, mistä hyöty on merkittävin. Kriittiset osa-alueet sovelluksessa on tunnistettava ja toteutettava huolella niin, että ylläpito ja jatkokehitys on helppoa. Tässä me monadilaiset olemme eksperttejä, sillä kokemus ja ammattitaito ovat valttia laadukkaan ohjelmiston tuottamisessa.

 

Raine Kelkka – Senior Software Engineer

Kirjoittaja työskentelee jo toista vuosikymmentä laadukkaan koodin puolesta

Lähteet:

1) Robert L. Glass, “Frequently Forgotten Fundamental Facts about Software Engineering”, IEEE Software, 2001

2) Xia, Xin & Bao, Lingfeng & Lo, David & Xing, Zhenchang & Hassan, Ahmed E. & Li, Shanping. (2017). Measuring Program Comprehension: A Large-Scale Field Study with Professionals. IEEE Transactions on Software Engineering. PP. 1-1. 10.1109/TSE.2017.2734091 (https://www.researchgate.net/publication/318811113_Measuring_Program_Comprehension_A_Large-Scale_Field_Study_with_Professionals)