Programinės įrangos projektavimo svarba
Šiuo metu programinė įranga jau yra neatsiejama daugumos verslo organizacijų infrastruktūros dalis, tačiau jos kūrimo apimtys ir toliau auga. Ypač daug dėmesio skiriama paskirstytų interneto tinklui orientuotų sistemų kūrimui bei įvairių informacinių sistemų integracijai. Augant kuriamos programinės įrangos apimčiai ir sudėtingumui, projektavimas tampa vis svarbesne IT sistemų inžinerijos dalimi, o projektavimas dažnai lyginamas su pastatų architektūra. Christopherio Alexanderio parašytos klasikinės architektūros knygos „The Timeless Way of Building“ ir „A Pattern Language: Towns, Buildings, Construction“ nepaprastai išpopuliarėjo dėl pastebėtų paralelių su programinės įrangos architektūros projektavimu. Programinės įrangos projektavimas gali būti neformalus ir nedokumentuojamas, jeigu yra kuriamos nesudėtingos sistemos (galima palyginti su lauko sandėliuku arba pavėsine), kurių nenumatoma palaikyti ir plėsti. Tuo tarpu sudėtingesnių sistemų (galima palyginti su dangoraižiu arba aerouostu) be detalaus projektavimo sukurti iš viso neįmanoma. Programinės įrangos projektavimas ir architektūros dokumentavimas taip pat labai svarbūs sistemos palaikymui – plėtimui, aptiktų defektų taisymui, sistemos adaptavimui skirtingoms platformoms, integravimui su kitomis sistemomis. Kadangi dauguma šiuo metu kuriamų programinės įrangos sistemų yra sudėtingos, ir beveik visada yra siekiama užtikrinti jų išliekamąją vertę, yra būtina:
- Prieš kuriant sistemą, suprojektuoti jos realizaciją;
- Dokumentuoti projektavimo sprendimus;
- Aptarti, įvertinti ir optimizuoti projektavimo sprendimus;
- Programuoti pagal sukurtą architektūrą;
- Tikrinti ar programinis kodas nenukrypo nuo sukurtos architektūros.
Projektavimo veikla programinės įrangos kūrimo proceso kontekste
1 paveikslas. Projektavimo veikla programinės įrangos kūrimo proceso kontekste
Programinės įrangos kūrimo inžinerinių veiklų eiliškumas nepriklausomai nuo pasirinkto modelio visada yra Reikalavimai -> Projektavimas -> Programavimas -> Testavimas. Viso projekto metu vyksta ir valdymo veiklos – projekto valdymas bei kokybės valdymas. Dažnai valdymo veiklos akcentuoja tik išorines inžinerines veiklas: projekto valdymas – reikalavimus, o kokybės valdymas – testavimą. Projektavimas ir programavimas yra vidinės veiklos, kurių tiesiogiai nemato programinės įrangos užsakovai. Todėl jos paprastai yra mažiau kontroliuojamos projektų vadovų. Programinė įranga vertinama pagal atitikimą reikalavimams ir kokybę, kuri dažnai siejama su testavimo veikla. Tačiau iš tikrųjų testavimas leidžia tik patikrinti kokybę ir atrasti defektus, o pati kokybė ir kitos programinės įrangos savybės, tokios kaip palaikomumas, greitis, našumas, tiesiogiai priklauso nuo projektavimo sprendimų.
UML modeliavimo kalbos panaudojimas, projektuojant programinę įrangą
Šiuo metu programinės įrangos industrijoje yra plačiai naudojama UML (Unified Modeling Language) modeliavimo kalba, leidžianti aprašyti projektavimo sprendimus. UML yra vizuali kalba, apibrėžianti grafinę notaciją, skirtą įvairių programinės įrangos architektūros aspektų modeliavimui. Sakoma, kad paveikslėlis vertas tūkstančio žodžių, o UML modelis dar daugiau. UML modeliai taip pat dar vadinami programinės įrangos žemėlapiais – jie leidžia greičiau ir lengviau suprasti programinės įrangos struktūrą ir veikimo principus, todėl yra efektyviai panaudojami programinės įrangos architektūros dokumentavimui bei projektavimo sprendimų aptarimui. Programinės įrangos rinkoje siūloma daug brandžių UML įrankių, leidžiančių patogiai ir efektyviai modeliuoti projektavimo sprendimus. „MagicDraw UML“, kuris kuriamas UAB „Baltijos programinės įranga“ darbuotojų pagal „No Magic, Inc.“ užsakymą, yra vienas žinomiausių pasaulyje UML įrankių. Tai įrodo ir gauti prestižiniai tarptautinių žurnalų apdovanojimai – „JDJ Readers’ Choice Award ir Jolt Productivity Award“.
Praktinės projektavimo problemos
Reikia pripažinti, kad praktikoje taikomi projektavimo metodai dažnai neduoda naudos, kurią akcentuoja teorija. Lietuvoje projektavimo praktikos taip pat dar nėra nusistovėjusios. Šių pastebėjimų dėka galima teigti, kad ir pats projektavimas nėra stipriai akcentuojama veikla:
- programinę įrangą kuriančiose kompanijose dažnai nėra išskirta sistemų architekto specializacija;
- daug programinę įrangą kuriančių įmonių nenaudoja programinės įrangos projektavimui skirtos UML modeliavimo kalbos ir jai specializuotų įrankių;
- programinės įrangos architektūros dokumentacija dažnai nėra ruošiama.
Viena neefektyvaus projektavimo priežasčių – per daug detaliai modeliuojami dažnai kintantys realizacijos lygio aspektai, tuo tarpu aukštesnio lygio sistemos architektūros projektavimas vykdomas nepakankamai. Todėl dažnai projektavimo modeliai vertinami pagal detalumo lygį, tačiau nepastebimi prasti projektavimo sprendimai, kuriuose nesilaikoma projektavimo principų. Taip pat nėra išlaikomi ryšiai tarp reikalavimų analizės, aukšto lygio architektūrinių sprendimų bei detalių realizacijos sprendimų modelių – neišskiriami ir nesusiejami skirtingi modeliavimo abstrakcijos lygiai. Daugelyje įmonių nėra naudojama UML modeliavimo kalba, o projektavimo sprendimai aprašomi tekstu arba paprastomis diagramomis, nenaudojant sutartinės notacijos. Tai sukelia komunikacijos problemų bei apriboja projektavimo sprendimų dokumentavimo galimybes.
UAB „Baltijos programinė įranga“ pirmieji projektai, kuriuose buvo pradėtas naudoti modeliavimas UML kalba, taip pat pateko į pernelyg detalaus modeliavimo „spąstus“. Dėl didelio entuziazmo taikant naują technologiją, buvo pernelyg detaliai modeliuojamos realizacijos lygio klasių diagramos, kuriose tiksliai specifikuojami klasių metodai ir atributai. Buvo paruošta išsami programinės įrangos architektūros dokumentacija, o iš paruoštų detalių realizacijos lygio diagramų sugeneruota pradinė programinio kodo struktūra. Tačiau, pradėjus programuoti, daug detalių ėmė keistis dėl įvairių iš anksto nenumatytų aspektų, o paruoštas detalias realizacijos diagramas teko dažnai atnaujinti, kad jos būtų sinchronizuotos su kodu. Tai tapo nuobodžiu ir daug laiko užimančiu darbu, kuris nedavė realios naudos, todėl sinchronizavimas buvo apleistas. Projekto eigoje dauguma detalių diagramų nebeatitiko programinio kodo struktūros, todėl tapo nevertingos ir nebuvo naudojamos. Tuo tarpu pagrindinius architektūros sprendimus akcentuojančios mažesnio detalumo diagramos pakito minimaliai ir buvo dažnai naudojamos aptariant įvairius sistemos realizacijos aspektus.
Praktiniai patarimai, kaip efektyviau projektuoti programinės įrangos architektūrą
Apie tai galite paskaityti skyriuje „Naudingi patarimai“.
Žvilgsnis į ateitį
Lietuvoje po truputį auga dėmesys geriems projektavimo sprendimams ir pačiai projektavimo veiklai: domimasi projektavimo ir UML modeliavimo kalbos mokymais ir konsultacijomis, daugėja kompanijų, kurios įsigyja ir naudoja UML įrankius, apsibrėžia projektavimo dokumentų ruošinius ir dokumentavimo stilių, įveda programinės įrangos architektų specializaciją. Projektavimo, naudojant UML modeliavimo kalbą, disciplinos jau yra dėstomos informatikos specialybės studentams daugumoje universitetų (VDU, KTU, VU ir kt.). Lietuvos programinės įrangos kūrimo pramonė plečiasi, o kartu auga ir poreikis kurti didesnės apimties programinės įrangos sistemas, kur programinės įrangos architektūros projektavimas tampa vis svarbesnis. Lietuvos IT darbo kaštai jau priartėjo prie kitų Europos šalių, tokių kaip Vokietija, Anglija, Prancūzija, todėl reikia kelti programinės įrangos kokybę ir darbo efektyvumą. Efektyvus kokybiškos didelės apimties programinės įrangos kūrimas neįmanomas be profesionalaus projektavimo, todėl mes esame įsitikinę, kad ir toliau augs poreikis projektavimo žinioms, priemonėms ir metodams.
Bibliotekos informacinės sistemos projektavimo pavyzdžiai
Pateiksime UML kalba sumodeliuotų projektavimo sprendimų pavyzdžius bibliotekos informacinei sistemai.
Architektūrinės struktūros modeliavimas
2 paveikslas. Bibliotekos informacinės sistemos išskaidymas į modulius bei realizacijos architektūra
Antrame paveiksle esančioje diagramoje pavaizduota kuriamos sistemos techninės realizacijos infrastruktūra, pagrindiniai programinės įrangos komponentai, jų priklausomybės ryšiai, realizacijos technologijos bei protokolai, kuriais jie bendraus. Detalesniame lygyje būtų galima nurodyti ir komponentų bendravimo sąsajų struktūras, tačiau šiuo metu jos yra neaiškios ir neišvengiamai kis, todėl nėra modeliuojamos.
3 paveikslas. Bibliotekos sistemos viršutinio lygio paketų išskaidymas
Trečiame paveiksle pavaizduota viršutinio lygio paketų išskaidymo struktūra, kur sumodeliuoti priklausomybės ryšiai. Paketų struktūra suprojektuota pagal rekomenduotą sluoksniuotos architektūros principą, taikant MVC šabloną, ir išskiriant bendrai naudojamas klases į atskirą paketą. Paketų priklausomybės ryšiai nesudaro ciklų, priklausomybės ryšiai suformuoti stabilumo kryptimi, kadangi paprastai vartotojo sąsaja keičiasi dažniausiai, verslo logika keičiasi rečiau, duomenų valdymas ir duomenų klasių struktūros – rečiausiai. Reikėtų pabrėžti, kad dauguma UML įrankių leidžia atstatyti modelį iš programinio kodo ir atsekti, ar neatsirado papildomų ryšių, kurie dažnai indikuoja programavimo nusižengimus projektavimo sprendimams.
Duomenų klasių modeliavimas
Duomenys yra svarbiausia informacinių sistemų dalis, todėl juos reikia išanalizuoti ir sumodeliuoti įvairiuose abstrakcijos lygiuose – vartotojo suprantamus ryšius, klasių ir duomenų bazių realizacijos struktūras.
4 paveikslas. Konceptualus duomenų klasių ryšių modeliavimas.
Ketvirtame paveiksle pateiktas konceptualus duomenų klasių modelis, kuriame akcentuojami loginiai ryšiai, nenagrinėjant jų vidinių savybių. Tokios diagramos leidžia aptarti duomenų sąryšius su vartotojais, padeda analizuoti reikalavimus, ir yra pirminis šaltinis realizacijos duomenų klasių modeliavimui.
5 paveikslas. Realizacijos duomenų klasių modeliavimas.
Penktame paveiksle pateikta objektinė realizacijos duomenų struktūra, kurioje konceptualaus duomenų klasių struktūra transformuojama, pritaikant ją realizacijai: pridedant klasių savybių atributus ir nurodant Java programavimo kalbos duomenų tipus. Šis pavyzdys iliustruoja modeliavimą skirtinguose abstrakcijos lygiuose.
Detalus servisų sąsajų metodų modeliavimas
Programinės įrangos funkcionalumas tiesiogiai atspindimas veiklos logikos servisų sąsajų metoduose, kurie dažniausiai yra detaliai modeliuojami. Prisimenant modeliavimą skirtinguose abstrakcijos lygiuose, galima teigti, kad reikalavimų analizei naudojami panaudojimo atvejai turi išlaikyti atitikmenis veiklos logikos servisuose. Šeštame paveiksle pavaizduota detali bibliotekos logikos servisų sąsajos paketo struktūra. Joje akcentuojami sąsajų metodai ir klasė „ServiceFactory“, kuri bus atsakinga už konkrečių servisų realizacijų sukūrimą ir pateikimą.
6 paveikslas. Detalus bibliotekos servisų sąsajų modelis.