Ylläpidettävät ohjelmat Perintöohjelmat (legacy software) legacy (perintö, jäämistö) Ohjelmistoevoluutio Lehmanin esittämä ohjelmien jaottelu Lehmanin evoluutiolait Perintöohjelmiston rakenne Jatkotoimenpiteet perintöohjelmille Spagettikoodi ja sen korjaaminen Muutostarpeita (evoluution syitä) Yrityksen sisäiset toiminnan muutokset uudet liiketoiminta-alueet toimintatapa- ja organisaatiomuutokset uudet sovellusalueet Ulkoiset syyt viranomaisten toimenpiteet kilpailijat ja heidän toimenpiteensä yhteistyökumppanit ja verkostoituminen asiakkaat Järjestelmien sisäiset muutostarpeet järjestelmien puutteet ja virheet uuden tekniikan vaikutukset järjestelmän huono suunnittelu TTY Ohjelmistotekniikka TTY Ohjelmistotekniikka Ohjelmien luokittelu (Lehman) Ongelma Ohjelma Käyttäjätyytyväisyys S-ohjelmat (specification) ongelma voidaan määritellä tarkasti ohjelma miten hyvin ohjelma vastaa määrittelyään P-ohjelmat (problem, paradigm) ongelman tarkka määrittely vaikeaa miten hyvin ohjelma vastaa todellisuutta ongelma E-ohjelmat (evolution) sovellusalue ohjelmat ratkaisevat reaalimaailmassa esiintyviä tehtäviä miten hyvin ohjelma pystyy muuntumaan ympäristön muutosten mukaisesti Evoluutiolait (Lehman) I laki: Jatkuva muutos II laki: Lisääntyvä monimutkaisuus III laki: Itseohjautuvuus suurten järjestelmien evoluutio IV laki: Vakaus (organisaatio) kehittämisnopeuden muuttumattomuus V laki: Vakaus (julkistusversiot) versioiden välisten erojen muuttumattomuus VI laki: Jatkuva kasvu toiminnallisuuden lisääminen käyttäjien vaatimuksesta VII laki: Heikkenevä laatu kasvun aiheuttama laadun huononeminen VIII: Vuorovaikutteisuus voimien ja vastavoimien välisen tasapainon etsiminen TTY Ohjelmistotekniikka TTY Ohjelmistotekniikka Lakien keskinäiset suhteet. Jatkuva muutos 8. Vuorovaikutteisuus 6. Jatkuva kasvu. Vakaus (organisaatio). Itseohjautuvuus. Vakaus (julkistusversiot) kuukausia kuukausia I henkilöitä III Lehmanin. laki Erilaisia tehtäviä I Tehtävä, joka voidaan jakaa II Tehtävä, jota ei voida jakaa III Tehtävä, ä, joka voidaan odaa jakaa mutta joka vaatii kommunikointia IV Tehtävä, jonka osatehtävillä on monimutkaisia keskinäisiä kytköksiä kuukausia kuukausia II henkilöitä IV. Lisääntyvä monimutkaisuus 7. Heikkenevä laatu TTY Ohjelmistotekniikka henkilöitä Brooks: The Mythical Man-Month henkilöitä TTY Ohjelmistotekniikka 6
Lehmanin. laki Yhteyksien määrä (kommunikaation lisääntyminen) Ohjelmoijia: Ohjelmoijia: j Ohjelmoijia: j Yhteyksiä: Yhteyksiä: Yhteyksiä: 6 Ohjelmoijia: Yhteyksiä: 0 Ohjelmoijia: 0 Yhteyksiä: TTY Ohjelmistotekniikka 7 Lehmanin. laki Esimerkki myöhästymisestä Tehtävän koko: henkilötyökuukautta työntekijää kuukautta henk. I A B C D kk 0 6 7 8 TTY Ohjelmistotekniikka 8 Lehmanin. laki Myöhästymiseen reagointi Oletetaan, että vain vaihe A oli väärin arvioitu koko tehtävä valmistuu kk myöhässä jos halutaan pysyä aikataulussa jäljellä oleva työ: 9 htkk jäljellä oleva aika: kk tarvitaan. henkilöä ( lisää) A B C D II 0 6 7 8 TTY Ohjelmistotekniikka 9 Lehmanin. laki Myöhästymiseen reagointi Oletetaan, että kaikki vaiheet on arvioitu väärin vastaavalla tavalla koko tehtävä valmistuu kk myöhässä jos halutaan pysyä aikataulussa jäljellä oleva työ: 8 htkk jäljellä oleva aika: kk tarvitaan 9 henkilöä (6 lisää) III A B C D 0 6 7 8 TTY Ohjelmistotekniikka 0 Myöhästymiseen reagointi Aikaa tarvitaan myös uusien työntekijöiden kouluttamiseen työn jakamiseen uudelleen IV B C D A koulutus päättyy 0 6 7 8 Lehmanin. laki Vrt. kuvia II ja IV TTY Ohjelmistotekniikka Lehmanin kritiikkiä Tarkat määritelmät puuttuvat Lait perustuvat suppeaan ja epätyypilliseen sovellusalueeseen käyttöjärjestelmiä (OS/60, VME), pankkitapahtumajärjestelmiä Tutkittujen ohjelmistojen asiakkaina suuryritykset Termin laki käyttö ilmiöitä, jotka kuvaavat inhimillistä toimintaa toisaalta: kysynnän ja tarjonnan laki Lakien todistaminen ja testaaminen vaikeaa Ohjelmien minimointi TTY Ohjelmistotekniikka
Lehmanin lakien soveltaminen Avoin ohjelmistokehitys (Linu) Linu 99-999 (9 versiota) kasvu lähes eksponentiaalista laiteajurit monimutkaisuus ei (ainakaan vielä) ole lisääntynyt Avoimen ohjelmistokehityksen ksen tyypillisiä piirteitä: aikatauluun ei kohdistu liiketaloudellisia paineita koodin laatu vaihtelee, ei tiukkoja standardeja lopputuote voi olla epävakaa ja puolivalmis Linu: eri tuotelinjat valmiimmille versioille ja kokeiluasteen koodille testaus ja ylläpito ei etukäteen suunniteltua TTY Ohjelmistotekniikka Perintöohjelmiston rakenne ajetaan Laitteisto käyttää ajetaan käyttää Sovelluksen data Sovellusalueen toimintaprosessit Sovellusohjelmisto Tukiohjelmisto Laitteisto Tuki- ohjelmisto Sovellus- ohjelmisto ovat Sovellusalueen sulautu- käytännöt ja neina säännöt käyttävät rajoittavat Sovellusalueen toimintaprosessit TTY Ohjelmistotekniikka Rakenteen muuttuminen Ideaalirakenne (alkuperäinen rakenne) Käyttöliittymä Todellinen rakenne Käyttöliittymä Perintöohjelmiston data Vanha järjestelmä: Uusi järjestelmä: Ohjelma Ohjelma Ohjelma Ohjelma Ohjelma Ohjelma Ohjelma Ohjelma P a l v e l u t Tietokanta Tietokanta Tiedosto Tiedosto Tiedosto Tiedosto Tietokannanhallintajärjestelmä TTY Ohjelmistotekniikka TTY Ohjelmistotekniikka 6 Perintöohjelmien alkuperäinen suunnittelu Syötteet Järjestelmä Prosessointi Tulosteet TTY Ohjelmistotekniikka 7 Syötteet Prosessointi Tulosteet loop repeat Print( Welcome Please enter your card ); until Card_input; Account_number := Read_card; Get_account_details(PIN, Account_balance, Cash_available); if Invalid_card(PIN) then Retain_card; Print( Card retained please contact your bank ); else repeat Print_operation_select_message; Button := Get_button; case Button is when Cash_only => Dispense_cash(Cash_available, Amount_dispensed); when Print_balance => Print_customer_balance(Account_balance); when Statement => Order_statement(Account_number); when Check_book => Order_checkbook(Account_number); end case; Print( Press CONTINUE for more services or STOP to finish ); Button := Get_button; until Button = STOP; Eject_card; Print( Please take your card ); Update_account_information(Account_number, Amount_dispensed); TTY Ohjelmistotekniikka 8 end loop;
Implisiittiset koodaussäännöt Ei löydy järjestelmän dokumenteista, vaan kokeneiden ohjelmoijien ja ylläpitäjien muistista Järjestelmäkohtaisia Sääntöjen noudattamatta jättäminen johtaa virheelliseen koodiin Implisiittinen koodaussääntö Jotta funktio A toimisi oikein, anna globaalille muuttujalle B alkuarvo ennen funktion C kutsua. Ennen kuin kutsut funktiota X, kutsu funktiota Y. Virheellinen koodi Funktiota C kutsutaan sijoittamatta B:lle alkuarvoa. Funktiota X kutsutaan ilman funktion Y kutsumista. Mitä perintöohjelmille voidaan tehdä? Järjestelm män laatu Ylläpidä/ hylkää Hylkää/ korvaa Jatkokehitä Uudista Liiketaloudellinen arvo TTY Ohjelmistotekniikka 9 TTY Ohjelmistotekniikka 0 Arviointiin liittyviä kysymyksiä Järjestelmän ymmärrettävyys kuinka ymmärrettävää lähdekoodi on? kuinka monimutkaisia kontrollirakenteita on käytetty? onko muuttujilla kuvaavat nimet? Dokumentit mitä dokumentteja järjestelmästä on olemassa? kuinka k luotettavia tt dokumentit ovat? Järjestelmän data noudattaako järjestelmän data jotakin tiettyä tietomallia? onko eri tiedostoissa oleva data päällekkäistä? miten yhtenäistä data on? Toiminta toimiiko järjestelmä oikein? haittaavatko suorituskykyyn liittyvät ongelmat järjestelmän käyttöä? TTY Ohjelmistotekniikka Arviointiin liittyviä kysymyksiä () Ohjelmointikieli onko käytetylle ohjelmointikielelle kääntäjiä? käytetäänkö ohjelmointikieltä uusien ohjelmien kehittämisessä? Testaus ovatko järjestelmän testaustiedot saatavilla? Ohjelmoijien taidot onko saatavilla osaavia ihmisiä järjestelmän ylläpitoon? kuinka suurella osalla ohjelmoijista on käsitys koko ohjelmasta? TTY Ohjelmistotekniikka Järjestelmien strateginen luokittelu Toiminnan kehittämisen mahdollistavat järjestelmät uuden liiketoiminnan luominen ja olemassa olevan kehittäminen olennaisia kilpailukyvyn kannalta esim. asiakkaiden analysointi, sähköinen kaupankäynti Toiminnan i perusjärjestelmät j ät keskeisten operatiivisten toimintojen tukeminen esim. toiminnan ohjaus, myynnin tuki Toiminnan tukijärjestelmät toiminnan perusasioiden hoitaminen esim. kirjanpito, laskutus Muut järjestelmät esim. vain yhden henkilön käytössä olevat järjestelmät Korvaaminen on hankalaa, koska Tarkat määrittely- ja muut dokumentit puuttuvat Yrityksen toimintasäännöt ja prosessit voivat olla koodattuina perintöohjelmiin Korvattavaa ja korvaavaa järjestelmää voidaan joutua ylläpitämään samanaikaisesti Uuden järjestelmän kehittäminen aiheuttaa aina riskejä TTY Ohjelmistotekniikka TTY Ohjelmistotekniikka
Muuttaminen on hankalaa, koska Ohjelmointityyli voi olla epäyhtenäinen Ohjelmointikieli voi olla vanhanaikainen Dokumentit puuttuvat Ohjelman alkuperäistä rakennetta on vaikea tunnistaa Arkkitehtuuri ei tue muutoksia Koodia on optimoitu Tietorakenteet ovat hajanaisia ja epäyhtenäisiä TTY Ohjelmistotekniikka start: Get ( Time-on, Time-off, Time, Setting, Temp, Switch ) if Switch = off goto off if Switch = on goto on goto cntrld off: if Heating-status = on goto sw-off goto loop on: if Heating-status = off goto sw-on goto loop cntrld: if Time = Time-on goto on if Time = Time-off goto off if Time < Time-on goto start if Time > Time-off goto start if Temp > Setting goto off if Temp < Setting goto on sw-off: Heating-status := off goto switch sw-on: Heating-status := on switch: Switch-heating loop: goto start Spagettikoodia A badly structured program is likened to a plateful of spaghetti: if one strand is pulled, then the ramifications can be seen at the other side of the plate where there is mysterious turbulence and upheaval. (Rushby) TTY Ohjelmistotekniikka 6 loop -- Get statement finds values for the given variables from the -- system s environment Get ( Time-on, Time-off, Time, Setting, Temp, Switch ); case Switch is when on => if Heating-status = off then Heating-status := on; Switch-heating; end if; when off => if Heating-status = on then Heating-status := off; Spagettikoodista saatu rakenteellinen koodi Switch-heating; end if; when Controlled => if Time >= Time-on and Time <= Time-off then if Temp > Setting and Heating-status = on then Heating-status := off; Switch-heating; elsif Temp < Setting and Heating-status = off then Heating-status := on; Switch-heating; end if; end if; Ohjelmien end case; ylläpito ja evoluutio TTY Ohjelmistotekniikka 7 end loop; Spagettikoodista rakenteelliseksi Rakenteellinen koodi one entry one eit tiedetään, mistä kuhunkin ohjelmakohtaan on tultu Systemaattisia keinoja spagettikoodin poistamiseen: tilamuuttujan lisääminen monistaminen looginen yksinkertaistaminen TTY Ohjelmistotekniikka 8 Tilamuuttujan lisääminen: alkuperäinen tilanne Tilamuuttujan lisääminen: periaate Set I = B D A C E I = 0? f I =? f I =? f t t t STOP 0 F I = n? t n TTY Ohjelmistotekniikka 9 TTY Ohjelmistotekniikka 0
Set I = I = 0? I =? I =? I =? I =? I =? A STOP I = I = B I = C D E I = I = I = I = 0 I = 0 Tilamuuttujan lisääminen: lopputulos TTY Ohjelmistotekniikka Monistaminen: alkuperäinen tilanne 7 9 8 6 TTY Ohjelmistotekniikka X Monistaminen: lopputulos 7 7 8 7 8 8 6 Y Looginen yksinkertaistaminen. Piirrä ohjelmasta vuokaavio. Johda boolean-lauseke jokaisen peruslohkon lausejonolle. Yksinkertaista boolean-lausekkeet. Rakenna ohjelma uudestaan 9 TTY Ohjelmistotekniikka TTY Ohjelmistotekniikka B B = A = A = A Λ B = A Λ B = ( A Λ B) V (A Λ B) = B 6 = A Λ B 7 = A Λ B Λ C 8 = A Λ B Λ C Λ D End A Begin B A Alkuperäinen ohjelma B 6 C C 7 9 D D 8 Vuokaaviota vastaava totuustaulu A B C D 6 7 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 TTY Ohjelmistotekniikka TTY Ohjelmistotekniikka 6 6
B Action B B Action A Action Proc Begin End A Proc Action C B Action 6 Parannettu ohjelma C D Action 7 D Proc 9 Proc 9 Action 8 D TTY Ohjelmistotekniikka 7 D Koodin muuttaminen (esimerkki evoluutiosta) Tilanne: tarvitaan uusi toiminto melkein (mutta ei ihan) samanlainen toiminto on jo olemassa Ad hoc ratkaisuja: lisätään parametri, jolla säädellään toimintoa monistaminen Parempi ratkaisu: koodin jakaminen useammaksi uudeksi aliohjelmaksi TTY Ohjelmistotekniikka 8 jaettavaa koodia Esimerkkitilanne AllowableTemperature := MaAllowableTemperature (Environment ); /* get most recent temperature from the stack */ Temperature := Stack.Temperature [ Stack.Top ]; Stack.Temperature [ Stack.Top ] := INITIAL_TEMPERATURE; if ( Stack.Top > 0 ) then begin Stack.Top := Stack.Top end; if ( Temperature > AllowableTemperature ) then begin ShutdownReactor ( Environment, Temperature ) end; Ohjelmien ylläpito ja evoluutio TTY Ohjelmistotekniikka 9 Alkuperäinen tilanne Jaettu koodi kutsuttavassa operaatiossa Koodin jakamistapoja Monistaminen operaatio tarvitsee toisen operaation koodia operaatio sisältää koodia, jota toinen operaatio tarvitsee Jaettu koodi kutsuvassa operaatiossa TTY Ohjelmistotekniikka 0 Jaettu koodi kutsuttavassa Alkuperäinen toiminto Uusi versio Toinen toiminto joka tarvitsee jaettua koodia Jaettu koodi kutsuttavassa Lukeminen ID:n tarkistaminen Kenttien tarkistaminen Tallentaminen [kutsuva operaatio] ListMissilePosition- ListNewMissile- ListMissileUpdate- ListMissileID- jaetun koodin kutsut Read- MessageID ( ) MessageFields ( ) Save- Jaettu koodi TTY Ohjelmistotekniikka TTY Ohjelmistotekniikka 7
Jaettu koodi kutsuvassa Yleisiä: Lukeminen ID:n tarkistaminen Tallentaminen Tapauskohtainen: Kenttien tarkistaminen [kutsuva operaatio] ListMissile- MissilePosition- Fields ( ) NewMissile- Fields ( ) MissileUpdate- Fields ( ) MissileID- Fields ( ) TTY Ohjelmistotekniikka 8