Arkkitehtuurityylejä ja suunnittelutaktiikoita

Samankaltaiset tiedostot
Ohjelmistoarkkitehtuurit, syksy

Arkkitehtuurityylejä ja suunnittelutaktiikoita

ITK130 Ohjelmistojen luonne

Sytyke ry:n laivaseminaari Software Technology Transfer Pekka Forselius

Yleiskuvaus - LVpalvelukerroksen. laadulliset vaatimukset Jari Kokko & Vesa Mettovaara LUVAT JA VALVONTA -KÄRKIHANKE

Ohjelmistoarkkitehtuurit kevät

Ohjelmistoarkkitehtuurit

9. Ohjelmistoarkkitehtuurien arviointi

Ohjelmistoarkkitehtuurien arviointi

Kevät Ohjelmistoarkkitehtuurit 2014

ISO/IEC sarja (SQUARE)

Kevät 2016 Arkkitehtuurin arviointi, ATAM. Ohjelmistoarkkitehtuurit 2016

Testaustyökalut. Luento 11 Antti-Pekka Tuovinen. Faculty of Science Department of Computer Science

Laatukustannukset. Laadun hallinta. Laadun kustannuksista

Dynaaminen analyysi I

Arkkitehtuurien tutkimus Outi Räihä. OHJ-3200 Ohjelmistoarkkitehtuurit. Darwin-projekti. Johdanto

Laadun hallinta. Laatukustannukset. Laadun kustannuksista. Sami Kollanus TJTA330 Ohjelmistotuotanto

Laadun hallinta. Laatukustannukset. Sami Kollanus TJTA330 Ohjelmistotuotanto

Ohjelmiston testaus ja laatu. Ohjelmistotekniikka elinkaarimallit

7. Ohjelmistoarkkitehtuurien arviointi

Ohjelmistoarkkitehtuurin suunnittelu

Ohjelmistojen suunnittelu

Arkkitehtuurityylejä ja suunnittelutaktiikoita

Ohjelmistojen testaus

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

Testiautomaatio tietovarastossa. Automaattisen regressiotestauksen periaate ja hyödyt

Oppimistavoitteet. Ohjelmistoarkkitehtuurin suunnittelu. Referenssejä L. Bass, P. Clements, R. Kazman: I. Mistrik, A. W. Brown, M. Ali Babar 8.9.

Harjoitustehtävät viikolle 42

Tenttikysymykset. + UML-kaavioiden mallintamistehtävät

Ohjelmiston toteutussuunnitelma

Ohjelmistoarkkitehtuurit. Kevät

Testauksen tuki nopealle tuotekehitykselle. Antti Jääskeläinen Matti Vuori

Suunnitteluvaihe prosessissa

Rinnakkaistietokoneet luento S

Testaus käsite. Sekalaista testausasiaa. Testauksen käsitteestä. Kattavuusmitat. Jos ajatellaan, että testaus = V&V, voidaan erottaa:

811312A Tietorakenteet ja algoritmit I Johdanto

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen,

Opetusteknologian standardoinnin tilanne. Antti Auer

Koodimalli Code Model

Kontrollipolkujen määrä

Dynaaminen analyysi II

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Ohjelmistojen mallintaminen. Luento 11, 7.12.

Ohjelmistoarkkitehtuurit. Syksy 2008

Tenttikysymykset. + UML- kaavioiden mallintamistehtävät

Ohjelmistoarkkitehtuurit. Syksy 2010

Luento 12. Jouni Lappalainen, Ilkka Tervonen, additions & editions by Antti Juustila

Suunnitteluratkaisut ja niiden arviointi sulautetuissa järjestelmissä

Ohjelmistotekniikan menetelmät, kevät 2008

Palveluperustaiset arkkitehtuurityylit

Tik Tietojenkäsittelyopin ohjelmatyö Tietotekniikan osasto Teknillinen korkeakoulu. LiKe Liiketoiminnan kehityksen tukiprojekti

Testauksen hallinta Testaustyökalut Luento 7 Antti-Pekka Tuovinen

Web-palvelu voidaan ajatella jaettavaksi kahteen erilliseen kokonaisuuteen: itse palvelun toiminnallisuuden toteuttava osa ja osa, joka mahdollistaa k

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

Testaus-tietoisku: Tärkeimpiä asioita testauksesta projektityökurssilaisille

Algoritmit 1. Luento 1 Ti Timo Männikkö

Tiedonsiirto- ja rajapintastandardit

Rinnakkaisuuden hyväksikäyttö peleissä. Paula Kemppi

Dynaaminen analyysi II Luento 4 Antti-Pekka Tuovinen

Ohjelmistotekniikan menetelmät, kesä 2008

SUD SUD. Haasteet. Haasteet Esimerkki riskilähtöisestä arkkitehtuurityöstä ja mallinnuksesta. Esimerkkitapauksen rajaukset ja oletukset

CT60A4150 OHJELMISTOTESTAUKSEN PERUSTEET. Jussi Kasurinen Kevät 2016

7 Sulautettujen järjestelmien suunnittelumallit. OhAr Marko Leppänen

Ohjelmiston testaus ja laatu. Testaustasot

Tietojärjestelmän osat

Toiminnallinen turvallisuus

Enterprise SOA. Nyt. Systeemi-integraattorin näkökulma

Ohjelmistoarkkitehtuurit. Kevät

Ohjelmistoarkkitehtuurit

Ohjelmistoarkkitehtuurit. Syksy 2007

OA:n kanoninen malli III

Testaaminen ohjelmiston kehitysprosessin aikana

LUKU 5: SUUNNITTELU. Suunnitteluun liittyviä käsitteitä:

Ohjelmistojen mallintaminen, kesä 2009

Liite 1: KualiKSB skenaariot ja PoC tulokset. 1. Palvelun kehittäjän näkökulma. KualiKSB. Sivu 1. Tilanne Vaatimus Ongelma jos vaatimus ei toteudu

Tietorakenteet ja algoritmit - syksy

SEPA diary. Dokumentti: SEPA_diary_PK_HS.doc Päiväys: Projekti: AgileElephant Versio: V0.3

7 Viestipohjaisten yritysjärjestelmien suunnittelumallit

Satunnaisalgoritmit. Topi Paavilainen. Laskennan teorian opintopiiri HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Ohjelmistotekniikka: Luento 6

jotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja

TOIMINNALLINEN MÄÄRITTELY MS

Ohjelmistoarkkitehtuurit Kevät käytäntöjä

Testaussuunnitelma Labra

Oppimistavoitteet. Koodimalli Code Model. Näkymätyypit. Näkymätyypit Yksi arkkitehtuuri monta näkymää NÄKYMÄTYYPIT

TIE Ohjelmistojen suunnittelu

Liite 1: ServiceMix skenaariot ja PoC tulokset 1. Palvelun kehittäjän näkökulma

EUREFin vaikutukset organisaatioiden tietojärjestelmiin

SEPA - Design Patterns

Ohjelmistoarkkitehtuurit Syksy 2009 TTY Ohjelmistotekniikka 1

Viestinvälitysarkkitehtuurit

Luento 6. Jouni Lappalainen, Ilkka Tervonen, additions & editions by Antti Juustila

Ohjelmistotestaus -09

Otanta ilman takaisinpanoa

Käyttäjien tunnistaminen ja käyttöoikeuksien hallinta hajautetussa ympäristössä

JHS 156 suosituksen päivitys

1 Johdanto. TTY Ohjelmistotekniikka. Ohjelmistoarkkitehtuurit Syksy 2008

Luento 12: XML ja metatieto

Ohjelmistotuotanto vs. muut insinööritieteet. (Usein näennäinen) luotettavuus ja edullisuus

SEPA päiväkirja. Aihe: Suunnittelumallit Tekijät: Tuukka Laakso ja Antti Kettunen

Transkriptio:

Arkkitehtuurityylejä ja suunnittelutaktiikoita Luento 5 2. osa 16.9.2014 581385 Ohjelmistoarkkitehtuurit 1 Oppimistavoitteet Arkkitehtuurityylejä (esityksen 1. osa) jaettu tietovarasto, viestinvälitysarkkitehtuurit, vertaisverkkoarkkitehtuuri, map-reduce Suunnittelutaktiikoita laatuominaisuuksien saavuttamiseksi (esityksen 2. osa) Suorituskyky-, muunneltavuus- ja testattavuustaktiikat 16.9.2014 581385 Ohjelmistoarkkitehtuurit 2 1

SUUNNITTELUTAKTIIKAT 16.9.2014 581385 Ohjelmistoarkkitehtuurit 3 Laatutekijät arkkitehtuurisuunnittelussa Onnistunut arkkitehtuuri on edellytys järjestelmän keskeisten laatuvaatimusten täyttymiseksi Tyylien ja patternien soveltaminen suunnittelussa auttaa haluttujen laatuominaisuuksien saavuttamisessa Yksittäinen arkkitehtuurityyli tai patterni ei kuitenkaan ota kantaa kaikkiin mahdollisiin laatuvaatimuksiin Patterneja täytyy sovittaa ja muokata suunnittelun kohteena olevan järjestelmän (SUD, system under design) spesifisten vaatimusten, rajoitteiden ja muun kontekstin perusteella The devil is in the details 16.9.2014 581385 Ohjelmistoarkkitehtuurit 4 2

Laatutekijät arkkitehtuurisuunnittelussa Laatuominaisuudet (a.k.a laatuattribuutit, laatutekijät) vaikuttavat toisiinsa Esimerkiksi millä tahansa muulla laatuattribuutilla on yleensä negatiivinen vaikutus suorituskykyyn (vrt. esim. muokattavuus, turvallisuus, saatavuus, ) Laatuominaisuuksien tasapainottelua (trade-off) ei voi yleensä välttää (esim. Rackspace tapaus 1. luennolta) Ei voida keskittyä laatuattribuutteihin yksittäin, vaan kokonaisuus ratkaisee 16.9.2014 581385 Ohjelmistoarkkitehtuurit 5 Laatutekijät arkkitehtuurisuunnittelussa Laatuattribuutteja accessibility, accountability, accuracy, adaptability, administrability, affordability, auditability, autonomy, availability, credibility, process capabilities, compatibility, composability, configurability, correctness, customizability, degradability, determinability, demonstrability, dependability, deployability, distributability, durability, efficiency, evolvability, extensibility, failure transparency, fault-tolerance, fidelity, flexibility, installability, Integrity, interchangeability, interoperability, learnability, maintainability, mobility, modularity,nomadicity, operability. orthogonality, portability, precision, predictability. provability. recoverability, relevance, reliability, repeatability, reproducibility, resilience, responsiveness, reusability, robustness, safety, scalability, seamlessness, self-sustainability, serviceability, securability, simplicity, stability, standards compliance, survivability, sustainability, tailorability, testability, timeliness, traceability, ubiquity, understandability, upgradability, usability (Wikipedia) Ohjelmistojen laatumalli: ISO 25000 standardisarja (a.k.a SQuaRE, luettavissa Kumpulan tiedekirjastossa) 16.9.2014 581385 Ohjelmistoarkkitehtuurit 6 3

Laatutekijät arkkitehtuurisuunnittelussa Bass et al. 1 ovat määritelleet taktiikoita laatuominaisuuksien saavuttamiseen Taktiikka on suunnitteluprimitiivi, joka vaikuttaa tietyn laatuominaisuuden toteutumiseen Tyylejä ja malleja yksityiskohtaisempia ja lähempänä toteutusta ja yleiskäyttöisiä Voidaan soveltaa monessa eri kontekstissa Tarkastellaan esimerkkeinä suorituskykyä, ylläpidettävyyttä ja testattavuutta 1 http://etutorials.org/programming/software+architecture+in+practice,+second+edition/ 16.9.2014 Part+Two+Creating+an+Architecture/Chapter+5.+Achieving+Qualities/ 581385 Ohjelmistoarkkitehtuurit 7 Suorituskyky Suorituskykytaktiikoidentavoitteena on saavuttaa määrätty reaktio-/vastausaika (response time) johonkin järjestelmän vastaanottamaan tapahtumaan ja saavuttaa haluttu suoritusteho (throughput) Vastausaika ja suoritusteho riippuvat 1. resurssien käytöstä 2. odotusajasta Kilpailu resursseista resurssin saatavuus Riippuvuus muusta toiminnasta Resurssitarpeeseen vaikuttavat taktiikat (= kuinka paljon prosessointia saapuvan työn tekeminen vaatii) laskennan tehostaminen (algoritmi, välitulosten käsittely) yleisrasitteen vähentäminen (esim. etäkutsut paikallisiksi) tapahtumamäärän vähentäminen tapahtumien vastaanoton kontrollointi käsittelyajan rajoittaminen jonojen koon rajoittaminen Huom: Laskennan määrää vähennettäessä joudutaan usein tinkimään tulosten tarkkuudesta 16.9.2014 581385 Ohjelmistoarkkitehtuurit 8 4

Suorituskyky Resurssien hallintataktiikat (= kuinka paljon ja millaisia resursseja käytetään) Rinnakkaisuuden lisääminen Toiminnan / datan monistaminen Resurssien/tehokkaampien resurssien lisääminen Resurssien allokointitaktiikat (= miten eri työt saavat resursseja käyttöön) jono prioriteettijono dynaaminen prioriteettijono staattinen allokointi [ Ohjelmistojen suorituskyvyn suunnittelusta on oma kurssinsa ] 16.9.2014 581385 Ohjelmistoarkkitehtuurit 9 Muunneltavuus (modifiability tactics) Ohjelmiston muunneltavuutta mitataan laskemalla aikaa ja kustannuksia, jotka kuluvat ohjelmistomuutosten toteuttamiseen, testaamiseen ja käyttöönottoon Korjaukset, uudet toiminnot, toimintaympäristön muutokset jne. Muunneltavuutta lähellä olevia tekijöitä: adaptability, evolvability, maintainability voidaan jakaa kolmeen ryhmään Muutosten lokalisointiin perustuvat taktiikat Heijastusvaikutusten (ripple effect) estämiseen perustuvat taktiikat Sidonnan viivästämiseen perustuvat taktiikat 16.9.2014 581385 Ohjelmistoarkkitehtuurit 10 5

Muutosten lokalisointi Tavoitteena rajoittaa odotettavissa olevien muutosten vaikutus mahdollisimman pieneen joukkoon komponentteja Määrätään komponenttien vastuut siten, että odotettavissa olevat muutokset koskevat rajattua joukkoa komponentteja Lokalisointitaktiikkoja: Komponentin vastuiden semanttinen yhtenäisyys (semantic coherence) Vastuut hoidettavissa ilman laajaa ulkopuolista kommunikointia Yleiskäyttöisten palvelujen eristäminen omiin moduuleihin Odotettavissa oleviin muutoksiin varautuminen Yleistäminen ja parametrisointi Erikoistaminen parametrien kautta parametrien tulkinta Vaihtoehtojen rajoittaminen Korvattavien komponenttien/palvelujen tyypin rajoittaminen 16.9.2014 581385 Ohjelmistoarkkitehtuurit 11 Heijastusvaikutusten esto Ohjelmamuutoksen heijastusvaikutukset (ripple effects) tarkoittavat muutoksia, jotka täytyy tehdä moduuleihin, joita varsinainen muutos ei suoraan koske Jos moduulia A muutetaan, niin moduulia B joudutaan muuttamaan vain siksi, että A:ta on muutettu ei siksi että B:n ominaisuuksia on ollut tarve muuttaa Tämä heijastusvaikutus johtuu siitä, että B:n toteutuksessa on jokin riippuvuus A:n toteutukseen 16.9.2014 581385 Ohjelmistoarkkitehtuurit 12 6

Heijastusvaikutusten esto Moduulien välisiä riippuvuustyyppejä: Syntaktinen (muotoa koskeva) riippuvuus koskien dataa tai palveluja Yhteinen formaatti datalle, palveluiden kutsumuodot Semanttinen (merkitystä koskeva) riippuvuus koskien dataa tai palveluja Datan/palvelun käyttäjän on tulkittava merkitys samoin kuin tuottajan Järjestysriippuvuus koskien dataa tai kontrollia Datan osien saapuminen tietyssä järjestyksessä Palveluiden suorittaminen tietyssä järjestyksessä A.n pitää olla suorittanut palvelu A1 ennen kuin B voi suorittaa palvelun B1 Rajapinnan identiteetti tunnettava Nimi tai kahva ( handle ) oltava tiedossa käännös ja suoritusaikana 16.9.2014 581385 Ohjelmistoarkkitehtuurit 13 Heijastusvaikutusten esto Moduulien välisiä riippuvuustyyppejä Suoritusaikainen sijainti tunnettava Esim. IP-osoitteen tietäminen Datan tai palvelun laatutaso tunnettava esim. tarkkuus (onko sentit mukana?) Komponentin olemassaolon edellyttäminen Ei voida luoda dynaamisesti Moduulin käyttämien resurssien tunteminen 16.9.2014 581385 Ohjelmistoarkkitehtuurit 14 7

Heijastusvaikutusten esto Semanttisiin riippuvuuksiin perustuvia heijastusvaikutuksia on yleisesti ottaen vaikea estää Voi olla epätarkoituksenmukaista tarjota kaikille käyttäjille semantiikaltaan täsmälleen samanlaista rajapintaa ja käyttäytymistä kuin ennen muutoksia Vanhan implementaation muuttamiseen on yleensä painavia syitä Kahta erillistä implementaatiota voidaan joutua ylläpitämään siirtymäkauden ajan (vanhaa uuden rinnalla) Seuraavassa esitetyistä taktiikoista mikään ei välttämättä estä semanttisiin riippuvuuksiin perustuvia heijastusvaikutuksia 16.9.2014 581385 Ohjelmistoarkkitehtuurit 15 Heijastusvaikutusten esto Tiedon piilotus (Information hiding) Odotettavissa oleviin muutoksiin varautumista Todennäköisesti muuttuvien ominaisuuksien piilottaminen on moduulijaon yhtenä pääperiaatteena Olemassa olevien rajapintojen säilytys (Maintain existing interfaces) Jos B riippuu A:n tarjoaman rajapinnan nimestä tai kutsumuodoista, rajapinnan ja syntaksin säilyttäminen tarkoittaa, ettei B:tä tarvitse muuttaa A:n päivityksen yhteydessä Ei välttämättä auta, jos riippuvuudet ovat semanttisia tai palveluiden/datan laatutasoon tai resurssien käyttöön liittyviä Rajapintojen lisääminen, sovittimen (adapter) tai edustajaolion käyttö (proxy) 16.9.2014 581385 Ohjelmistoarkkitehtuurit 16 8

Heijastusvaikutusten esto Kommunikaatioväylien rajoittaminen Rajoitetaan niiden moduulien määrää, joiden kanssa tietty moduuli käyttää samaa dataa Rajoitetaan niiden moduulien määrää, jotka tuottavat tietyn moduulin käyttämää dataa tai jotka käyttävät sen tuottamaa dataa Välittäjän käyttö Jos B:n riippuvuus A:sta ei ole semanttista tyyppiä, on aina mahdollista lisätä välittäjä B:n ja A:n väliin Välittäjä piilottaa riippuvuuden konkreettisen ilmentymän ja tarjoaa B:lle muuttumattoman näkymän A:han Välittäjä vastuulla on vain riippuvuuden hallinta, ei mitään muuta Erilaisia välittäjiä eri tarpeisiin: nimipalvelin, resurssimanageri 16.9.2014 581385 Ohjelmistoarkkitehtuurit 17 Sidonnan viivästäminen Edellä kuvatut taktiikat pyrkivät vähentämään muutosten kustannuksia pienentämällä muutettavien moduulien määrää Niistä ei kuitenkaan ole hyötyä, jos halutaan lisätä ohjelmiston muunneltavuutta koskien moduulien käyttöönottotapaa ja aikaa tai halutaan mahdollistaa muiden kuin kehittäjien tekemän muutokset 16.9.2014 581385 Ohjelmistoarkkitehtuurit 18 9

Sidonnan viivästäminen Sidonnan viivästäminen tukee molempia tavoitteita Periaate: lisäominaisuus tai muunneltu toiminnallisuus voidaan ottaa käyttöön ja kytkeä muuhun ohjelmistoon ajoaikana (vs. koostamisaika, build-time) Nopeuttaa käyttöönottoa: järjestelmää ei tarvitse ajaa alas (ja käynnistää uudelleen) Vaatii lisäinfrastruktuuria -> kasvattaa kustannuksia 16.9.2014 581385 Ohjelmistoarkkitehtuurit 19 Sidonnan viivästäminen Ajonaikainen rekisteröinti (runtime registration) mahdollistaa plug-and-play operaatiot. Rekisteröinti aiheuttaa lisäkustannuksia. Tuottaja/kuluttaja rekisteröinti voidaan tehdä ajoaikaisesti tai latauksen yhteydessä. Konfigurointitiedostoissa voidaan säädellä käynnistyksen yhteydessä tehtäviä sidontoja ja parametreja. Polymorfismi mahdollistaa metodikutsujen myöhäisen sidonnan. Komponentin korvaus mahdollistaa latausaikaisen sidonnan. Protokollien noudattaminen mahdollistaa prosessien ajonaikaisen sidonnan 16.9.2014 581385 Ohjelmistoarkkitehtuurit 20 10

Testattavuustaktiikat Ohjelman tai sen osan (komponentin) testauksen malli syöte Ohjelma (testauksen kohde, System under test) tulos sisäinen tila Oraakkeli Testin tulos: Hyväksytty / Hylätty 16.9.2014 581385 Ohjelmistoarkkitehtuurit 21 Testattavuustaktiikat Jotta ohjelmistoa (tai sen osaa) voi mielekkäästi testata, on voitava Kontrolloida ohjelman ja sen osien syötteitä Havaita sen tuottamat tulokset Ja joissain tilanteissa myös voitava tarkkailla ohjelman sisäistä tilaa syötteen käsittelyn aikana tai välittömästi käsittelyn jälkeen Tähän tarvitaan yleensä varta vasten rakennettu testipeti (test harness) Testien laatimisen ja suorittamisen sekä testipetien rakentamisen kustannukset voivat olla huomattavat Testien suorituksen ja tulosten raportoinnin automatisointi aivan olennaista ketterässä kehitysessä (TDD, CI) 16.9.2014 581385 Ohjelmistoarkkitehtuurit 22 11

Testattavuustaktiikat Syötteiden ja tulosteiden kontrollointi Record/Playback: Komponenttien rajapintojen kautta tulevien syötteiden nauhoittaminen ohjelman suorituksen aikana, ja nauhotettujen syötteiden käyttö testipedissä testitapausten syötteinä Komponenttien/palvelujen rajapinnan erottaminen niiden toteutuksesta: palvelut, joista testin kohteen suoritus riippuu, voidaan korvata tyngillä tai virtualisoida (stub, mocking), jotta komponentteja voidaan testata erillään ja saada aikaan täsmälleen haluttuja tilanteita (esim. harvinaisia poikkeuksia) 16.9.2014 581385 Ohjelmistoarkkitehtuurit 23 Testattavuustaktiikat Syötteiden ja tulosteiden kontrollointi (jatkuu) Erikoisrajapinnat testausta varten: Komponentit voivat tarjota testipedin käyttöön metatietoa itsestään erityisen rajapinnan kautta Tällöin testipetiä ei tarvitse etukäteen konfiguroida jokaista komponenttia/komponenttityyppiä varten, vaan se voi dynaamisesti testauksen aikana mukauttaa toimintaansa Erikoisrajapinnat pidettävä tiukasti erillään normaaleista palvelurajapinnoista 16.9.2014 581385 Ohjelmistoarkkitehtuurit 24 12

Testattavuustaktiikat Testikohteen sisäisen tilan monitorointi Testin kohde ylläpitää suoritusaikana tietoa omasta tilastaan, kuormituksestaan, käyttäjistään jne. ja tarjoaa pääsyn tähän dataan joko erityisen rajapinnan tai koettimen/jäljittimen kautta (monitor, probe, trace, log) Monitorointi voi olla pysyvää tai tilapäistä (kytketään päälle ja pois käännös-/lataus-/suoritusaikana) Hyödyllistä virheenjäljitystä varten Testaus on yleensä tehtävä myös ilman monitorointia sen aiheuttaman yleisrasituksen vuoksi (overhead) Myös erityiset Set/Get/Reset operaatiot sisäisen tilan manipuloimiseksi ulkopuolelta ovat usein hyödyllisiä 16.9.2014 581385 Ohjelmistoarkkitehtuurit 25 13