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 Ohjelmien luokittelu (Lehman) Ongelma Ohjelma Käyttäjätyytyväisyys S-ohjelmat (specification) ongelma voidaan määritellä tarkasti miten hyvin ohjelma vastaa määrittelyään P-ohjelmat (problem, paradigm) ongelman tarkka määrittely vaikeaa miten hyvin ohjelma vastaa todellisuutta E-ohjelmat (embedded, evolution) ohjelmat ratkaisevat reaalimaailmassa esiintyviä tehtäviä ohjelmien täytyy muuntua ympäristön muutosten mukaan ohjelma ongelma sovellusalue 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 Lakien keskinäiset suhteet. Jatkuva muutos. Lisääntyvä monimutkaisuus 8. Vuorovaikutteisuus 6. Jatkuva kasvu. Vakaus (organisaatio) 7. Heikkenevä laatu. Itseohjautuvuus. Vakaus (julkistusversiot) Muutosten hallinnan helpottaminen Lehmanin. laki jantasainen dokumentointi Syiden ja perusteluiden dokumentointi miksi jokin muutos on tehty, mitä oletuksia on tehty Katselmoinnit versioinnin yhteydessä ristiriitaisuuksien havaitseminen Sellaisten versioiden julkaisu, joissa on keskitytty virheiden korjaamiseen, suorituskyvyn parantamiseen ja rakenteellisiin parannuksiin Muutostarpeiden kohdentumisen seuraaminen haavoittuvien ja muutosalttiiden kohtien löytäminen 6
Monimutkaisuuden ilmeneminen Sovellusalue ja sen toiminnallisuus Määrittely ja vaatimukset rkkitehtuuri Suunnittelu ja toteutus Rakenteet osajärjestelmät, moduulit, oliot, kutsuketjut, koodi, dokumentit jne. Lehmanin. laki 7 kuukausia kuukausia henkilöitä henkilöitä I II Lehmanin. laki Erilaisia tehtäviä I Tehtävä, joka voidaan jakaa II Tehtävä, jota ei voida jakaa III Tehtävä, joka voidaan jakaa mutta joka vaatii kommunikointia IV Tehtävä, jonka osatehtävillä on monimutkaisia keskinäisiä kytköksiä Brooks: The Mythical Man-Month kuukausia kuukausia III henkilöitä IV henkilöitä 8 Yhteyksien määrä (kommunikaation lisääntyminen) Ohjelmoijia: Yhteyksiä: Ohjelmoijia: Yhteyksiä: 0 Ohjelmoijia: Yhteyksiä: Ohjelmoijia: 0 Yhteyksiä: Lehmanin. laki Ohjelmoijia: Yhteyksiä: 6 9 Esimerkki myöhästymisestä Tehtävän koko: henkilötyökuukautta työntekijää kuukautta henk. Lehmanin. laki I B C D kk 0 6 7 8 0 Lehmanin. laki Myöhästymiseen reagointi Lehmanin. laki Myöhästymiseen reagointi Oletetaan, että vain vaihe 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ää) B C D 0 6 7 8 II 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 B C D 0 6 7 8
Lehmanin. laki Myöhästymiseen reagointi Jatkuva kasvu Lehmanin 6. laki ikaa tarvitaan myös uusien työntekijöiden kouluttamiseen työn jakamiseen uudelleen B C D IV koulutus päättyy 0 6 7 8 Vrt. kuvia II ja IV Kasvun aiheuttajia: laiteajurit graafinen käyttöliittymä hajautetut järjestelmät Toiminnallisuuden lisääntyminen asiakasvaatimukset taloudelliset ja kilpailulliset tekijät Lehmanin lakien soveltaminen voin ohjelmistokehitys (Linu) Lehmanin kritiikkiä Linu 99-999 (9 versiota) kasvu lähes eksponentiaalista laiteajurit monimutkaisuus ei (ainakaan vielä) ole lisääntynyt voimen ohjelmistokehityksen 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 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 6 Laaja näkökulma perintöohjelmistoon käyttää Tukiohjelmisto Sovellusohjelmisto ovat sulautuneina Sovellusalueen toimintaprosessit Sovellusohjelmisto Tukiohjelmisto Laitteisto Sovellusalueen käytännöt ja säännöt Järjestelmän data Vanha järjestelmä: Uusi järjestelmä: Ohjelma Ohjelma Ohjelma Ohjelma Ohjelma Ohjelma Ohjelma Ohjelma ajetaan Laitteisto ajetaan käyttää Sovelluksen data käyttävät rajoittavat Sovellusalueen toimintaprosessit Tiedosto Tiedosto Tiedosto Tiedosto Tietokannanhallintajärjestelmä 7 8
Perintöohjelmien rakenne Perintöohjelmien alkuperäinen suunnittelu Ideaalirakenne (alkuperäinen rakenne) Käyttöliittymä Todellinen rakenne Käyttöliittymä Järjestelmä P a l v e l u t Tietokanta Tietokanta Syötteet Prosessointi Tulosteet 9 0 Syötteet loop repeat Print( Welcome Please enter your card ); until Card_input; ccount_number := Read_card; Get_account_details(PIN, ccount_balance, Cash_available); Prosessointi Retain_card; if Invalid_card(PIN) then 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, mount_dispensed); when Print_balance => Print_customer_balance(ccount_balance); when Statement => Order_statement(ccount_number); when Check_book => Order_checkbook(ccount_number); end case; Print( Press CONTINUE for more services or STOP to finish ); Button := Get_button; until Button = STOP; Tulosteet Eject_card; Print( Please take your card ); Update_account_information(ccount_number, mount_dispensed); 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 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. Vaihtoehtoisia jatkotoimenpiteitä perintöohjelmille Järjestelmän hylkääminen kokonaan Järjestelmän ylläpidon jatkaminen Järjestelmän uudistaminen ylläpidettävyyden parantaminen Järjestelmän korvaaminen uudella Muita ratkaisuja: kääriminen palveluiden ulkoistaminen jäädyttäminen Järjestelmän laatu Jatkotoimenpiteiden päätösmatriisi Ylläpidä/ hylkää Hylkää/ korvaa Jatkokehitä Uudista Liiketaloudellinen arvo
Perintöohjelmien korvaaminen Hankaloittavia tekijöitä: tarkkojen (määrittely)dokumenttien puuttuminen yrityksen toimintasäännöt ja prosessit usein koodattuna perintöohjelmiin korvattavan ja korvaavan järjestelmän yhtäaikainen ylläpito yleiset uuden järjestelmän kehittämiseen sisältyvät riskit Perintöohjelmien muuttaminen Hankaloittavia tekijöitä: epäyhtenäinen ohjelmointityyli vanhanaikaiset ohjelmointikielet dokumenttien puuttuminen ohjelman alkuperäisen rakenteen tunnistamisen vaikeus muutoksia tukematon arkkitehtuuri koodin optimointi tietorakenteiden hajanaisuus ja epäyhtenäisyys 6 rviointiin liittyviä kysymyksiä Järjestelmän ymmärtäminen 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 luotettavia dokumentit ovat? Järjestelmän data onko järjestelmällä erityinen tietomalli (data model)? 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öä? rviointiin 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 ohjelmasta? 7 8 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 perusjärjestelmä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 9 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 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) 0
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; 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 end loop; Spagettikoodista saatu rakenteellinen koodi Spagettikoodista rakenteelliseksi Rakenteellinen koodi one entry one eit tiedetään, mistä kuhunkin ohjelmakohtaan on tultu Systemaattisia keinoja spagettikoodin poistamiseen: tilamuuttujan lisääminen monistaminen Muita systemaattisia parannuskeinoja: ehtojen yksinkertaistaminen looginen yksinkertaistaminen Tilamuuttujan lisääminen: alkuperäinen tilanne Tilamuuttujan lisääminen: periaate Set I = B D C E I = 0? f I =? f I =? f t t t STOP 0 F I = n? t n Set I = I = 0? I =? I =? STOP I = I = B I = Tilamuuttujan lisääminen: lopputulos Monistaminen: alkuperäinen tilanne I =? I =? C D I = I = I = I = 0 7 9 8 6 I =? E I = 0 6 6
Monistaminen: lopputulos Monistamisesta yleisemmin X 7 7 8 7 8 8 9 6 Y 7 Tilanne: tarvitaan uusi toiminto melkein (mutta ei ihan) samanlainen toiminto on jo olemassa d hoc ratkaisuja: lisätään parametri, jolla säädellään toimintoa monistaminen Parempi ratkaisu: koodin jakaminen useammaksi uudeksi aliohjelmaksi 8 jaettavaa koodia Esimerkki koodin jakamisesta llowabletemperature := MallowableTemperature (Environment ); /* get most recent temperature from the stack */ Temperature := Stack.Temperature [ Stack.Top ]; Stack.Temperature [ Stack.Top ] := INITIL_TEMPERTURE; if ( Stack.Top > 0 ) then begin Stack.Top := Stack.Top end; Esimerkki koodin jakamisesta lkuperäinen toiminto Toiminnon jaettu versio jaetun koodin kutsut Uusi toiminto joka tarvitsee jaettua koodia if ( Temperature > llowabletemperature ) then begin ShutdownReactor ( Environment, Temperature ) end; Ohjelmien ylläpito ja evoluutio 9 Jaettu koodi 0 Ehtojen yksinkertaistaminen Monimutkainen ehto: if not ( > B and (C > D or not (E > F)))... Yksinkertaistettu ehto: if ( <= B or (C >= D and E > F))... Looginen yksinkertaistaminen. Piirrä ohjelmasta vuokaavio. Johda boolean-lauseke jokaisen peruslohkon lausejonolle. Yksinkertaista boolean-lausekkeet. Rakenna ohjelma uudestaan 7
= = = B = B = ( B) V ( B) = B 6 = B 7 = B C 8 = B C D Begin B B B End lkuperäinen ohjelma B 6 C C 7 9 D D 8 Vuokaaviota vastaava totuustaulu B C D 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 6 7 8 ction ction Proc Begin B ction B B Proc ction C B ction 6 Parannettu ohjelma C D ction 7 D Proc 9 ction 8 D Proc 9 D End 8