Projektavimas

Programinės įrangos architektūros projektavimas

Autorius: Darius Šilingas,
No Magic Europe sprendimų skyriaus vadovas

Rašyti komentarus

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ų Internet 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. Christopher Alexander 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:

  1. Prieš kuriant sistemą, suprojektuoti jos realizaciją;
  2. Dokumentuoti projektavimo sprendimus;
  3. Aptarti, įvertinti ir optimizuoti projektavimo sprendimus;
  4. Programuoti pagal sukurtą architektūrą;
  5. Tikrinti ar programinis kodas nenukrypo nuo sukurtos architektūros.

Projektavimo veikla programinės įrangos kūrimo proceso kontekste

 

projektavimas

 

1paveikslas. 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, kuris kuriamas No Magic Europe, UAB 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

 

No Magic Europe, UAB 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ą

Pateiksime keletą praktinių patarimų, kaip pasiekti, kad programinės įrangos architektūros projektavimas būtų efektyvus ir teiktų ilgalaikę naudą — leistų efektyviau realizuoti kokybišką ir nesunkiai palaikomą programinę įrangą.

Pirmas žingsnis: Projektavimo veiklos apibrėžimas


 

Visų pirma reikia įvertinti projektavimo veiklos svarbą planuojant ir išskirti jai pakankamai laikoTaip pat reikia nutarti, kas iš projekto vykdytojų bus atsakingas už programinės įrangos architektūrą. Didesniuose projektuose reikalinga sistemų architekto specializacija, o mažesniuose projektuose tai gali atlikti ir programuotojai. Taip pat svarbu apibrėžti projektavimo sprendimų dokumentavimo taisykles, nustatyti jų aptarimo ir priėmimo procedūras.


Antras žingsnis: UML modeliavimo kalbos įsisavinimas


 

Šiuo metu UML modeliavimo kalba yra standartinė projektavimo priemonė, kuri visuotinai naudojama pasaulyje ir praktiškai neturi rimtesnių “konkurentų”. Todėl, jeigu siekiate standartizuoti modeliavimo notaciją, kuri būtų plačiai suprantama, vienareikšmiškai rekomenduojame pasirinkti UML. UML apibrėžia 12 rūšių diagramas, kurios leidžia specifikuoti įvairius architektūros aspektus. Tačiau tikrai nebūtina naudoti visų diagramų. Čia, kaip ir daugelyje kitų sričių galioja 80/20 taisyklė: 80% projekto užtenka 20% UML galimybių. Nebūtinai reikia ir specializuotų UML įrankių – nedideliuose projektuose galima braižyti UML diagramas bendrais diagramų modeliavimo įrankiais, pvz. Microsoft Visio, arba tiesiog ranka ant popieriaus ar lentos. Visgi didesniuose projektuose specializuotų UML įrankių naudojimas leidžia dirbti daug efektyviau.

 

Naudojant UML, galima modeliuoti sistemą skirtingais abstrakcijos lygiais. Pavyzdžiui, kuriamos sistemos esybes ir jų ryšius vaizduojanti klasių diagrama gali būti naudojama reikalavimų analizės metu, o vėliau pagal ją gali būti sukuriama detali realizacijos klasių diagrama, kurioje nurodomi specifiniai realizacijos kalbos duomenų tipai, atliekamos reikalingos ryšių transformacijos, pridedamos tik realizacijai reikalingos savybės, tokios kaip identifikaciniai kodai. Modeliavimas skirtingais abstrakcijos lygiais leižia glaudžiau susieti programinės įrangos architektūros projektavimą su reikalavimų analizės veikla.

Trečias žingsnis: Projektavimo principų žinojimas ir taikymas


 

Norint priimti gerus projektavimo sprendimus, reikia žinoti ir taikyti projektavimo principus, kurie yra išbandyti ir pasiteisinę praktikoje. Tokių principų pavyzdžiai: sistemų skaidymas į posistemių sluoksnius, MVC ( Model-View-Controller ) karkasas, projektavimo šablonai, aprašyti klasika tapusioje Design Patterns: Elements of Reusable Object-Oriented Software bei kitose knygose. Principų ir šablonų naudojimas leidžia panaudoti sukauptą projektavimo išmintį, nekartoti klaidų ir “neišradinėti dviračio”.

 

Yra daug gyvenimiškų principų, kurie puikiai tinka projektuojant programinę įrangą. Vienas iš tokių — dar romėnų imperijos kūrimo laikais taikytas “skaldyk ir valdyk”. Bet kurią sudėtingesnę programinės įrangos sistemą reikia suskaidyti į dalis, kad būtų galima efektyviai padalinti kūrimą grupei žmonių. Čia labai svarbu tiksliai apibrėžti tų dalių bendravimo principus ir sąsajas. Vienas iš plačiausiai taikomų sprendimų — sluoksniuotos posistemių architektūra, kurioje bendravimas tarp sluoksnių yra griežtai ribojamas hierarchijos — auščiausio lygio sluoksnis bendrauja tik su po juo esančiu sluoksniu, šis su dar žemesniu ir t.t. Nėra leidžiamas bendravimas iš žemesnių sluoksnių į aukštesnius arba “peršokant” tarpinius sluoksnius. Toks sistemų organizavimas labai palengvina sistemų palaikomumą. Sluoksniuota architektūra dažnai jungiama su MVC (angl. Model-View-Controller) šablonu, kuris siūlo skaidyti programinę įrangą į vartotojo sąsajos, duomenų modelio ir veiklos logikos dalis.

3lygiu architektura

2paveikslas. Sluoksniuota trijų lygių architektūra pagal MVC projektavimo šabloną

Sluoksniuotos architektūros, pagrįstos MVC šablonu, schema puikiai tinka taikyti daugumoje programinės įrangos sistemų, kadangi tiek vartotojo sąsaja, tiek duomenys yra praktiškai bet kurioje programinėje įrangoje, o didesnėse verslo optimizavimui skirtose sistemose dažniausiai yra pakankamai sudėtinga veiklos logika, kuri gali kisti priklausomai nuo įmonės strategijos, todėl ją verta išskirti kaip atskirą modulį. Toks organizavimas leidžia realizuoti nesunkiai praplečiamą ir palaikomą programinę įrangą bei lengvai paskirstyti darbus.

 

Ketvirtas žingsnis: Projektavimo sprendimų dokumentavimas


 

Tam, kad projektavimo sprendimai būtų gerai suprantami ir įsisavinami, juos būtų galima analizuoti ir įvertinti, reikia dokumentuoti svarbiausius projektavimo sprendimus. Paprastai dokumentavimą labai palengvina ruošinio, kuriuo apibrėžta dokumento struktūra ir paaiškinta, ką ir kaip kiekviename skyriuje reikia aprašyti. Žemiau pateikta pavyzdinė programinės įrangos architektūros dokumento struktūra, kuri yra siūloma RUP proceso ruošinyje (Rational Unified Process).

 

RUP dokumentas

Modeliuojant projektavimo sprendimus ir juos dokumentuojant, taip pat reikia laikytis modeliavimo stiliaus taisyklių, kurios leidžia sukurti paprastesnes, aiškesnes ir geriau suprantamas diagramas. UML stiliaus taisyklių rinkinys pateiktas knygoje The Elements of UML Style. Tokių taisyklių pavyzdžiai:

  • diagramoje turėtų būti 7±2 elementai, o didesnes diagramas reikia skaidyti į keletą mažesnių;
  • vengti besikertančių, vingiuotų, ilgų linijų, vaizduojančių ryšius tarp elementų;
  • naudoti spalvas skirtingiems pagal reikšmę elementams atskirti;
  • stengtis išlaikyti diagramos elementų išdėstymo simetriją.

Penktas žingsnis: Projektavimo sprendimų aptarimas


 

Projektavimo sprendimus būtina aptarti ir įvertinti, kad būti priimti geriausi ir visi juos puikiai suprastų ir pritaikytų. Tai daroma organizuojant techninių sprendimų pristatymo ir aptarimo susirinkimus, kurie gali būti tiek formalūs, tiek neformalūs. Taip pat rekomenduojama atlikti periodines peržiūras. Kai dirbama su naujomis technologijomis arba pagal naują metodiką patartina samdyti techninius konsultantus.


Šeštas žingsnis: programinio kodo atitikimo architektūrai analizė

Reikia ne tik suprojektuoti ir dokumentuoti programinės įrangos architektūrą, bet ir siekti, kad ji būtų tinkamai perkeliama į programinį kodą nepažeidžiant architektūroje nustatytų principų. Pirminis įrankis analizuojant programinio kodo atitikimą architektūrai yra programinio kodo peržiūros, kurias taip pat rekomenduotina atlikti periodiškai ir įtraukti į projekto planus. Programinio kodo peržiūrai ir vertinimui gali labai padėti specializuotų kodo statinės analizės įrankių naudojimas. Analizuoti kodą padeda ir UML įrankiai, tokie kaip MagicDraw, palaikantys atgalinės inžinerijos funkcijas, leidžiančias atstatyti programinės įrangos realizacijos modelį iš programinio kodo ir jį vizualizuoti bei analizuoti.

Ž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

Bibliotekos IS architektura small

 

3 paveikslas. Bibliotekos informacinės sistemos išskaidymas į modulius bei realizacijos architektūra

Trečiame 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.

Bibliotekos virsutinis lygis small

 

4 paveikslas. Bibliotekos sistemos viršutinio lygio paketų išskaidymas

Ketvirtame 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.

duomenu klases small

 

5 paveikslas. Konceptualus duomenų klasių ryšių modeliavimas.

Penktame 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.

duomenu realizacija small

 

6 paveikslas. Realizacijos duomenų klasių modeliavimas.

Šeštame 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. Septintame 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ą.

servisu sasajos small

 

7 paveikslas. Detalus bibliotekos servisų sąsajų modelis.

Šis el.pašto adresas yra apsaugotas nuo šiukšlų. Jums reikia įgalinti JavaScript, kad peržiūrėti jį.