Tarkvara disain

**Tarkvara [[disain]]** on protsess, mille käigus disainer loob tarkvara toote spetsifikatsiooni, kasutades hulka primitiivseid komponente, et lahendada ettenähtud ülesannet. Tarkvara disain tavaliselt hõlmab probleemide lahendamist ja tarkvaralahenduse planeerimist. See sisaldab nii madalatasemelist komponentide ja algoritmide disaini kui ka kõrgtasemelist arhitektuuri disaini.

## Ülevaade
Tarkvara disain on tarkvaralahenduste rakendamise protsess ühele või mitmele probleemile. Üks tarkvara disaini põhikomponente on tarkvara nõuete analüüs. Tarkvara nõuete analüüs on osa tarkvara arenduse protsessist, mis määrab spetsifikatsioonid, mida kasutatakse tarkvara arendamisel. Kui tarkvara on pool-automaatne või kasutaja keskne, võib tarkvara disain hõlmata kasutajaliidese kujundamist. Kui aga tarkvara on täis-automaatne (ilma kasutaja või kasutajaliideseta), võib tarkvara disain koosneda kõigest skeemist või tekstist, mis kirjeldab planeeritud sündmuste järjestust.

Põhiline erinevus tarkvara analüüsi ja disaini vahel on see, et tarkvara analüüsi tulem koosneb väiksematest probleemidest, mis vajavad lahendamist. Lisaks, tarkvara analüüs ei tohiks olla koostatud väga erinevalt grupi erinevate liikmete poolt. Seevastu tarkvara disain keskendub disaineri võimetele, mistõttu saab olla mitu disaini sama probleemi lahendamiseks. Disain tihti erineb sõltuvalt sellest, kas see on loodud kasutades üldtuntud raamistikke või sobivaid disainimustreid. Tarkvara disain hõlmab operatsioonisüsteeme, veebilehti, mobiilseid seadmeid või isegi uusi pilvelahendusi.

Tarkvara disain on nii protsess kui ka mudel. Disaini protsess on järjestus sammudest, mis võimaldavad disaineril kirjeldada kõiki tarkvara ehitamise aspekte. Loovad oskused, varasemad kogemused, teadmine, mis teeb "hea" tarkvara, ja üleüldine pühendumus kvaliteedile on näited kriitilistest edu faktoritest kompetentse disaini jaoks. Küll aga on tähtis välja tuua, et disainimisprotsess ei ole alati üksühene protseduur. Seda saab võrrelda maja arhitektuurilise plaaniga. See algab terviku kujutamisega (maja puhul kolmemõõtmeline mudel), millele ajapikku lisatakse detaile, mis näitavad, kuidas konstrueerida igat selle osa (näiteks torustik maja puhul). Sarnaselt, disaini mudel, mis on loodud tarkvara jaoks, pakub mitut erinevat vaatenurka valmivale tarkvarale. Põhilised disaini printsiibid võimaldavad tarkvara inseneril navigeerida läbi disaini protsessi.

### Disaini kaalutlused
On mitmeid aspekte, mida tuleb kaaluda tarkvara disainides. Iga kaalutluse tähtsus peaks peegeldama eesmärke ja ootusi, mida loodav tarkvara täitma peab. Nende aspektide seas on näiteks:
* Ühilduvus – tarkvara võime toimida koos teiste (tarkvara) toodetega mis on disainitud toimima samades süsteemides. Näiteks, tarkvara võib olla ühilduv oma enda eelmise versiooniga.
* Laiendatavus – uusi võimalusi saab tarkvarale lisada ilma suuremate muutusteta tarkvara arhitektuurile.
* Modulaarsus – tulem tarkvara koosneb täpselt määratletud sõltumatutest komponentidest, mis toob kaasa parema hooldatavuse. Komponendid on siis eraldi rakendatavad ja testitavad isolatsioonis enne nende integreerimist suuremasse tarkvara süsteemi. See võimaldab töö jagamist tarkvara arendusprojektis.
* Veakindlus – tarkvara on võimeline jääma tööle ja taastume üha komponendi põrumise järel.
* Hooldatavus – mõõde, mis näitab kui lihtsasti on võimalik parandada väiksemaid vigu või teha funktsionaalseid muudatusi. 
* Töökindlus – tarkvara on võimeline töötama ettenähtud tingimustes ettenähtud aja jooksul.
* Taaskasutatavus – võimalus kasutada mõnda komponenti või kõiki olemasoleva tarkvara komponente teistes projektides väheste muutustega (või täiesti ilma muutusteta).
* Robustsus – tarkvara võime taluda suurt töökoormust ja/või valesid sisendeid kasutaja poolt. Näiteks tarkvara võime töötada vähese mälu korral. 
* Turvalisus – tarkvara võime vastu pidada vaenulikele rünnakutele ja mõjudele.
* Kasutatavus – tarkvara kasutajaliides peab olema arusaadav ja kasutatav neile, kel on vaja sellega töötada. 
* Jõudlus – tarkvara lahendab oma ülesande kiirusega, mis on aktsepteeritav kasutajale ja ei nõua liialt palju mälu.
* Kaasaskantavus – tarkvara peaks olema sobilik kasutamiseks paljudel erinevatel tingimustel eri keskkondades.
* Skaleeritavus – tarkvara on võimeline kohanema andmete või kasutajate arvu suurenemisega.

### Disaini mustrid

Tarkvara disainer või arhitekt võib märgata disaini probleemi, mida on ka varem kohatud ning mis võib olla isegi kellegi poolt varem lahendatud. Vormi või mustrit, mis kirjeldab lahendust tuntud probleemile nimetatakse disaini mustriks. Selliste mustrite taaskasutus aitab kiirendada tarkvara arendamise protsessi.

Terminit "disain" on tarkvara juures mõneti raske kasutada, kuna mõnel juhul programmi lähtekood ongi disain sellele programmile, mida see toodab. Teatud piirini saab väita, et "tarkvara disain" on disaini disain.

## Viited