Modernin tietokoneen sielunelämää: millainen systeemi se on?


Nykyaikaisia tietokoneohjelmistoja ei voida suunnitella ad hoc,  sieltä täältä koodia kasaten, vaan kehittäjällä täytyy olla tietoisuutta rakenteesta, käyttäytymisestä ja siitä, miten oliomainen järjestelmä luo itsensä toimivaksi. Nämä ovatkin suunnittelumallien päätehtävät.

Tietokoneen “sielu” syntyy siitä, millaisia suunnittelumalleja koodi hyödyntää toimiessaan, vaikka toiminnallisuus olisikin jakaantunut kovasti eri tavoin kuin valitut mallit.

Suunnittelumalleja ja koodin vääristymiä tutkiessani löysin Magnus Kardell:n gradun, tehty Umeån yliopistossa (linkki). Siinä on hyvää visuaalistakin analyysiä suunnittelumalleista.

Design Patterns: YhteenvetoKuva sopii mainiosti Metayliopiston sivulla esiteltäväksi, koska näin tulee kuvattua geneerinen ohjelmiston logiikka, missä on eri tasoillaan toistuvia malleja, joita ohjelmoija voi napata mukaansa tilanteensa perusteella.

Luontifunktio kuvataan vasemmalta yläviistosta ja muutoin elementit on sijoitettu abstraktiotason mukaan ylhäältä alas. Tulkki on korkein taso kutsua sitä paitsi, että Mediaattori voi ulkoa kutsua ohjelmistoa fasadin kautta. Perustekniikat on sijoitettu alas; siis toiminnot, jotka eivät perustu suunnittelumalleihin.

Suunnittelumalleja voi automaattisesti jäljittää koodista. Näin mm Rational Rose on tehnyt jo viime vuosikymmenellä. Parhaimmat kehittimet kykenevät siihen.

Yhteenveto

Ohjelma on tietokoneen sielu, ja siinä näkyy yleensä tekijänsä käden jälki. Kaikki suunnittelumallit ovat tavallaan systeemeitä ja systeemin osia. Niillä on oma tarkoituksensa ja yhdessä niistä muodostuu toimiva järjestelmä, mikäli siinä ei ole pahoja ongelmia.

Käyttämällä kuvan mukaista layoutia ohjelmoija voi suunnitella logiikkansa visuaalisesti laittamalla siihen niitä olioita ja luokkia, jotka siinä ovat keskeisiä (vain tärkeimmät näkyviin). Kuvasta ei näy arkkitehtuurimallit, jotka ovat korkeamman tason elementtejä (MVC, PCMEF, DB, Pipe/Filter jne).

Näin ajatellen ohjelmistot ovat sisäkkäisten systeemien keskinäisiä vaikutusketjuja. Väitöksessäni (Symbolic analysis) pelkistin vielä, että koodi on aina symbolien välisten vaikutusten muodostama kokonaisuus. Tietojärjestelmät ovat ympäristönsä ja käyttäjien sekä laitteiston ja ohjelmiston muodostamia systeemeitä. Systeemi voidaan hahmotella näkyville jokaisella arkkitehtuurin tasolla ja sitä voidaan mallintaa GoodReason-skeemoilla ennen luomista ja luotaessa ja valmiina jälkeenpäinkin. Systeemiajattelu ja ohjelmistoajattelu sopivat mainiosti yhteen tukemaan toisiaan, jos näin halutaan.