Az 1960-as évekig a programozás módszerei heurisztikus utakat követtek. A programozók jobb híján assemblert használtak, ennélfogva csak kisméretû, egyszerû feladatok megoldására szorítkoztak. Gépi szintû programozás révén a csapatmunka jószerével elképzelhetetlen volt. A programok egyszerû elemi vezérlôszerkezeteket tartalmaztak, csak szimbólikus adatábrázolásra voltak képesek. A programok mobilizálhatósága minimális volt, mivel erôsen hardverspecifikusak voltak, karbantartásuk a programozón kívüli személyeknek szinte lehetelen volt. Program menedzsment nem létezett, az elkészített szoftverek csak igen szûk körben voltak alkalmazottak (iroda, mûhely). Hibakezelés nem volt, mûködését sem nyomon követni sem koordinálni nem lehetett. A programok sok elágazásokat tartalmaztak, gyakran meg kellett elégedni a programkód fôbb logikai szálainak nyomonkövetésével, ám ez azzal a kockázattal járt, hogy igan gyakran bukkant fel hiba az "éles" felhasználás közben. Erre az idôszakra jellemzô állapotot tükröz az 1.a ábra.
Az 1960-as évek végén következett be az ún. szoftverkrízis. A mikroprocesszorok teljesítménynövekedése a hardverárak radikális csökkenését vonták maguk után, ugyanakkor ezen hardverek teljesítménye hasonló ütemben növekedett. Természetes igényként merült fel ezen megnövekedett lehetôségeknek a kihasználása. Egyre nagyobb mennyiségû, terjedelmû és komplexitású programokra volt szükség. Ez viszont már olyan programozói környezetet, olyan eszköztárat és kódolási szemléletet igényelt, amely a 70-es évek elejére gyökeresen megváltoztatta a programok írásának módját. Elôtérbe került az algoritmikus programozás, a szimbólikus információszemléltetést a különbözô adatstruktúrák és algoritmusok váltották fel, amit a programnyelvek alkalmazása tett lehetôvé. A vezérlôszerkezetek is bonyolódtak ezáltal, a nyelveket gépi nyelvvé alakító fordítóprogramok, interpreterek készültek, azonban a programok csak magukban futottak vagy kezdetleges I/O szinten kommunikáltak egymással. A hibakezelés a compilerek és interpreterek révén rugalmasabbá vált (hibajelzés, leállás).
A 80-as évekre alakult ki a "nagybani" programozás. Komplett programrendszerek készültek amik nagy adatbázisokat használtak. A programok projektek formájában, csapatmunka révén készültek, szintén ilyen platformon zajlott a programok karbantartása és menedzselése is. Elkerülhetetlenné vált a programok strukturálása. Megjelentek a tudászemléltetô rendszerek. A hibakezelést átvették a fejlesztésre használt szoftverek, a programozást interaktív helpek, sokrétû dokumentációk segítették.
A szoftverkrízis és annak vonzatai vezettek 1968-ban a szoftver engineering fogalmának megszületéséhez. A szoftver engineering végül is egy új szemlélet bevezetését jeleni, egy módszertant biztosít a programok, programfejlesztési eszközök termékszerû gyártására. Elôtérbe került a szoftver, mint szellemi produktum termékszerû jellege, azaz a minôség, az eladhatóság. A szoftver termékké válását a köztudatban az nehezítette, hogy - "mûszaki" termék létére - olyan tulajdonságokkal is rendelkezik, amelyek az ember által készített élvezeti termékeknek (mûvészet) is sajátjuk. Ezen tulajdonságokat szemlélteti a 2.a táblázat.
|
A szoftver engineering megszületése óta számos definíció látott napvilágot. A legegyszerûbb megfogalmazás szerint a szoftver engineering eszközök és módszerek a szoftver termékszerû elõállítására. A Boehm által 1976-ban adott "klasszikus" definíció kissé részletesebb: tudományos ismeretek célszerû alkalmazása számítógépprogramok valamint a fejlesztésükhöz, mûködésükhöz, karbantartásukhoz szükséges dokumentációk tervezésére és megalkotására. Egy késôbbi definíció jól mutatja a management szerepre jutását a szoftver engineering fogalomkörében: szoftver termékek szisztematikus gyártására és karbantartására és költségvetésére vonatkozó technológiai és menedzsment vezérelv (IEEE 1983).
A szoftver minôség jellemzését az nehezíti, hogy egzakt mutatókkal nem lehet leírni. Ezért külsô és belsô tényezôket kell vizsgálunk, és így alkothatunk képet egy szoftver minôségérôl. A külsô tényezôk határozzák meg, hogy egy szoftvernek elkészülte után milyen kritériumoknak kell megfelelnie, a belsô tényezôk pedig a kódolás módszerét jellemzik. Tulajdonképpen a végeredmény szempontjából csak a külsô tényezôk számítanak, azonban ezeknek jó része erôsen függ a belsô tényezôktôl (módosíthatóság, újrahasználhatóság, kompatibilitás, stb):
Külsô tényezôk:
Belsô tényezôk:
A külsô tényezôk közül az elsô kettô tulajdonképpen a szoftver megbízhatóságát (reliability) jelenti. Egy szoftver akkor tekinthetô megbízhatónak, ha minden körülmények között a specifikációjának megfelelôen mûködik. Váratlan körülménynek felel meg, például hibás adatok beérkezése. Ezt a szoftvernek le kell tudnia kezelni, és meg kell kísérelni a hiba okának meghatározását. Ugyanígy nem szabad problémát okoznia hardver hibának sem. Természetesen a szoftver biztonságosságának növelése költséges dolog, viszont egy olyan szoftver ami nincs felkészülve extrém körülményekre, sokkal nagyobb hibát képes okozni (pl. adatvesztés).
Célja a fejlesztéssel szemben támasztott követelmények meghatározása. A fejlesztõk részérõl elõbb azt kell tisztázni, mik azok az információk amikre egyáltalán szükség van. A szükséges információknak valahogyan a birtokába kell jutniuk, aztán pedig rendszerezni kell a rendelkezésre álló információkat. Ez leggyakrabban egy kétoldalú megbeszélés (sorozat) a majdani felhasználó és a fejlesztômunkát végzô csapat között. Ezen tevékenység eredménye a Projekt terv (4.a ábra).
A Projekt tervnek nincs standard formátuma, de a "házi" szabályokat szokás betartani, vagy ha egy adott meglévô fejlesztô eszköt használunk, akkor igazodni kell az abban található struktúrához. Az alábbiakban a Projekt terv egy lehetséges struktúrájára láthatunk példát.
|
|
|
|
|
|
Szintén kétoldalú megbeszélés, az elkészítendô programrendszer részletes, formális leírását foglalja magában, speciális esetben szolgálhat a két fél közötti szerzôdésként is. A specifikáció úgy is felfogható, mint a követelmény analízis folytatása formális eszközökkel. Három fõ tevékenysége a következõ:
Fogyasztó: | felhasználó | szoftver fejlesztõ |
Nyelv: | természetes nyelv | formális nyelv |
Pontosság: | nem precíz | precíz |
Terminológia: | az alkalmazás szakkifejezései | szoftver terminológia |
Szemlélet: | nem technológiai | technológiai |
A specifikáció végtermékei a Szoftver követelmény analízis, a Szoftver ellenõrzési terv és a Felhasználói kézikönyv, melyekbõl a Szoftver követelmény analízis-re adunk meg egy követésre érdemes struktúrát (az elõzõ alfejezet végén található Projekt terv-hez hasonlóan).
|
|
|
|
|
|
A tervezési fázis során a követelmény analízis és a specifikáció által reprezentált bemenetbõl az elkészítendõ program(rendszer) struktúrája és annak elemei állnak elõ (4.c ábra). Ebben a fázisban történik a programrendszer mûködéséhez szükséges fontosabb adatszerkezeteknek, rutinoknak és azok interfészének, moduloknak és azok kapcsolatainak valamint a szükséges algoritmusoknak a kidolgozása. Míg a követelmény analízis a mit?, a specifikáció a milyet?, a tervezés a hogyan? kérdésre adja meg a választ, feladata az absztrakciós szint csökkentése. A megvalósítási folyamat ezen szakaszában lépnek be a hardver és szoftver környezet valamint a tervezõ személyek befolyásoló jellemzõi (4.d táblázat).
kapacitás korlátok
hálózati viszonyok speciális eszközök architektúra | fejlesztõi környezet
adatbáziskezelõ operációs rendszer | kreativitás
gyakorlat fantázia |
Ez tulajdonképpen a kódolási folyamat, a szükséges modulok és programok elkészítése.
Ezen a ponton történik a program installálása és mûködésének vizsgálata a fejlesztõk által. Tesztelésre kerül a program viselkedése hibás adatbevitel illetve nem megfelelõ kezelés esetén. A programozás során elõre nehezen megjósolható futásidõben fellépõ hibák legtöbbje ebben a szakaszban bekövetkezik.
Ha a programrendszert más környezetben, megváltozott igények mellett akarják felhasználni, bizonyos komponenseit meg kell változtatni. Továbbá a leggondosabb tervezés és implementáció mellett is elôfordulnak hibák, miket gyorsan és kis ráfordítással kell helyrehozni. Mind a megrendelõ mind a kivitelezõ részérõl fontos szerephez jutnak a specifikációban rögzített követelmények.
A karbantartás a teljes költség 80% -át is elérheti. Ennek megoszlása a következô lehet:
fejlesztô (perfective): 65%, a felhasználó vagy a programozó által még a fejlesztés fázisában javasolt módosítások;
alkalmazkodó (adaptive): 18%, a szoftver környezetében történt változásokhoz igazítás miatti módosítások;
javító (corrective):
17% a mûködés közben felfedezett hibák
miatti javítások.
A szoftver költségét befolyásolják:
Minden szoftver termék felbontható adat, processz és reláció komponensekre (5.a ábra). Attól függõen, hogy ezek közül mit választunk a rendszer specifikáció alapjául, beszélünk adat- illetve processz-specifikációról.
Ennél a módszernél a struktúrát képezõ objektumok az eljárások, vagy módszerek, a struktúráló szempont pedig az eljárás funkcionális jelentése.
Az adatfolyam diagram leírja
A diagram komponensei és Yourdan-DeMarco-féle jelölésük a 5.b táblázatban látható.
Az adatfolyam-diagram kifejtésében elsô lépésben minden processzt ki kell bontani úgy, hogy maximum 3-4 szint legyen, és azokban egy-egy ábra 4-5 processzt reprezentáljon. E folyamat révén újabb adatforrásokat és adatnyelôket lehet ábrázolni, továbbá növeli az adatelemek (azaz a nyilak) számát is. Gyakran hasznos alternatív megoldások kidolgozása is.
Célszerû a folyamatok idôegységek szerinti csoportosítása. Folyamatok idôhorizontjaira 3 kategória jellemzô:
a) 10 mp-en belüli: online programozást igényel;
b) 1 órán belüli: a felhasználó által indított háttérfolyamatokkal érhetô el;
c) "idônkénti": a hagyományos kötegelt (batch) feldolgozással valósítható meg.
Példa |
A SADT egy formális top-down módszer funkcionális modell felépítésére grafikus úton. A top-down dekompozíciót kétféleképpen lehet alkalmazni: a grafikus ábrázolásban a téglalapok a tevékenységeket jelölik, a nyilak pedig az adatáramlást a tevékenységek között (tevékenység dekompzíció), vagy a téglalapok az adatokat reprezentálják, a nyilak pedig az adatok közötti mûveleteket (adat dekompozíció). A továbbiakban a tevékenység dekompozíciót részletezzük. A 5.c ábra mutatja, hogyan alakul egy tevékenység környezete.
A modell felépítése különbözô lapokon történik, a lapok a modell hierarchiai szintjeinek felelnek meg. Mindel alsóbb szintet kifejtô lap egy, a "fölötte" lévô lapon szereplô téglalap (tevékenység) kibontása (5.d ábra).
Példa |
Adatspecifikációs módszerek esetében a struktúra alapobjektumát az adategység, struktúráló szempontját az adatok közötti szemantikai tartalom szolgáltatja. A struktúrában szinteket különböztetönk meg, a magasabb szinteken csak általános tartalmi hozzárendeléseket teszünk az adatokra, melyeket az alsóbb szinteken szétbontunk konkretizálva ezáltal a szinteket.
Blokk diagramot akkor használunk, mikor egy rendszerben csak az adatok egymástól függõségét akarjuk szemléltetni, érdektelen a az illetõ adatok tartalma, formátuma. Például az egyetem hierarchikus felépítését szemlélteti az 5.e ábra.
A Warnier diagram annyiban mutat túl a blokk diagramon, hogy benne van az adattagok ismétlõdésének és a feltételességének lekezelése.
Példa |
Az ER diagram a rendszert felépítõ adatokból és azoknak relációját mrghatározó relációkból épül fel. Az alkalmazott jelöléseket a 5.f ábra mutatja. A kapcsolat fajtáját tekintve 3 féle lehet:
Példa |
Az elkészült rendszerstruktúra elemeit (processz, elemi adat, adatszerkezet, adatcsoport) nyilván kell tartani. Ennek számítógépes megvalósítása az adatszótár. Ennek formátumára nincs megkötés, de ajánlatos a következô sémát követni:
|
|
|
|
|
A tervezési fázisban három szintet különböztetünk meg azon vezérelv alapján, hogy milyen mértékben áll kapcsolatban az illetõ rendszer a külvilággal. Ennek megfelelõen megkülönböztethetünk külsõ (interface), architekturális és részletes tervezést.
A külsõ tervezés feladata a szoftver külvilággal való kapcsolatának megtervezése. Külvilágnak a mûködtetõ hardvert vagy rendszer szoftvert, egyéb alkalmazásokat (további szoftverek), valamint a felhasználót tekintjük. Ezek a külsõ tényezõk egymással is kapcsolatban állnak, ahogyan azt a 6.a ábra mutatja.
A felhasználó a tervezendõ szoftverrel a felhasználói felület-en keresztül tartja a kapcsolatot (6.a ábra), ezért ezen kapcsolódási felület megtervezése központi szerephez jut a tervezés tervezés során mivel más alkalmazói szoftverekkel és a hardver elemekkel való kapcsolat megoldása csupán technikai kérdés, a felhasználó csupán ezek járulékos hatásaival találkozhat a használat során (a hibák is a felhasználói felületen keresztül jelennek meg).
Ebben a fejezetben azon szempontokat tekinjük át, melyek technikai vonatkozásaiban fontosak a felhasználói felület és a felhasználó viszonylatában. Ezek a kritériumok olyan, a fejlesztõ(k) által lerögzített dolgok, melyek nélkül a felhasználó és az szoftver kapcsolata kritikussá válhat, tehát figyelembevételük elengedhetetlenül szükséges a tervezés során.
Míg az elõzõ alfejezet a felhasználó és a felhasználói felület kapcsolatának technikai vonatkozásait tekintette át, ez a fejezet inkább a kapcsolat emberi oldaláról közelíti meg a kérdést. Ezen szempontok nem elengedhetetlenül szükségesek a felület és a felhasználó kapcsolatában, de a szoftverrel való munka hatékonyságát nagymértékben megnövelik
Az architekturális tervezési fázisban kerül megtervezésre, hogy hogyan és milyen lépéseken keresztül lehet a külsõ tervezéstõl a részletes tervezésig eljutni (6.d ábra). Egy tervezési szintet reprezentáló komponens a fölötte álló szint dekompozíciójával jön létre. A lépések száma a tervezendõ rendszer méretétõl függ.
Minden lépés a következõ tevékenységek sorozata:
azaz a rendszert modulok és interface-k segítségével írjuk le. A modul egy jól definiált, független egység, az interface pedig a modulok közötti kapcsolatot írja le. Vigyázni kell azonban, mert a modul nem biztos, hogy egy procedúrát, eljárást jelent, lehet az egy adatelem is. Ílymódon különböztethetünk meg adat-alapú és funkcionális alapú dekompozíciót. Ezt nevezzük az architekturális tervezés dualitásának.
A két dekompozíciós példa között nem húzható éles határvonal, mint ahogyan azt az objektum orientált programozás példája is illusztrálja. Az OOP technikák alkalmazásával osztályok tartalmazzák az adatmodulokat, függvény interface-k teszik lehetõvé az adatmodulok korlátozott manipulálását. Mindkét dekompozíciós módszer ugyanolyan fontos és ugyanúgy alkalmazható a tervezésben.
Egy tervezési fázisnak akkor lesz vége, ha a modulok közötti interface-k komplexitása megközelíti a modulokon belóli funkcionális- és adatstruktúrák komplexitását. A modulok egymással kohéziós kapcsolatban állnak, ami szoros összetartozásukat, más moduloktól való elkülönülésüket jelenti, és ez nehézzé teszi a további lebontást. Ennek az lesz a következménye, hogy a modulok valamely egyszerû, de fontos adatelem köré szervezõdnek, vagy valamilyen egyszerû funkcionális absztrakciót implementálnak. A moduláris kohézió fajtáit és azok jellemzõit a 6.f táblázat foglalja össze.
funkcionális | jól definiált, egyszerû funkció |
informális | osztott adatstruktúra vagy adatbázis |
szekvenciális | kötött sorrendben következõ funkciók |
kommunikációs | XXXXXXXXXXX, nem strukturált adathalmaz |
procedurális | a szoftver által elõállított, ugyanazon eredménnyel kapcsolatos funkciók |
temporális | a szoftver vérgehajtásának ugyanazon részéhez kapcsolódó funkciók (például inicializálás) |
logikai | felületes hasonlóság |
véletlen | véletlenszerûen csoportosított funkciók |
A kohézió további következménye, hogy a modulok relatíve függetlenek egymástól, interface-eik relatíve egynemûek. Ennek az önállóságnak különbözõ fokozatai vannak, amiket a 6.g táblázat összegez.
függetlenség | semmi kapcsolat nincs a modulok között |
adat | csak a szükséges adatelemek, jól definiált interface-eken keresztül |
adatstruktúra | az inteface-en egy nagyobb adatstruktúra jelenik meg, amely a modul számára fölösleges adatokat is tartalmaz |
vezérlés | az interface-en olyan adatok jelennek meg, amely más modulok végrehajtását vezérli |
külsõ | a modulok az interface-en kívül más eszközökkel (például fájlok) is kommunikálnak |
közös | a modulok nem explicit interface-ekkel, hanem globális adatstruktúrákon keresztül kommunikálnak |
tartalmi | a modulok el tudják érni és módosítani tudják egymás belsõ adatait és utasításait |
A feladat tehát a rendszer modulokra bontása és a modulok közötti kapcsolatok tisztázása. Ennek véghezviteléhez általában több absztrakciós szintet kell alkalmazni, így az esetek többségében beszélhetünk magasszintû, középszintû és alacsonyszintû tervezésrõl.
Magasszintû tervezés:
Elsô lépés a rendszer alrendszerekre bontása. Döntéshozatal történik az alrendszerek struktúrájáról, az alrendszerek közötti kommunikációról, a globális adatszerkezetekrôl. Ezen a szinten a részletes tervezés az input és output adatok megállapítására terjed ki. A tervezés felülrôl-lefelé történik (top-down dekompozíció). Segédletei a HIPO kártyák illetve a rendszer folyamatábrák.
Középszintû tervezés:
Ezen a szinten az alrendszerek is lebontódnak iteratív módon programokra. Rögzítôdik a vezérlés módja és a programegységek közötti adatcsere. Erre a következô technikák és adateszközök ismertek:
Alacsonyszintû tervezés:
A programok lebontása alprogram szintre. Lokális adatstruktúrák és algoritmusok definíciója is ezen a szinten történik. Itt kell lerögzíteni a programban használt neveket is. Az erre használt technikák és eszözök:
Az input adatok megtervezésénél az input adatok forrása valamilyen speciális eszköz (scanner, vonalkód olvasó, mágneskártya olvasó stb.) fájlok, adatbázisok vagy a képernyô lehet. Ezen legutolsó esetben ismét felhívjuk a figyelmet az ergonómiai tervezésre, hiszen a felhasználói felület a rendszer elfogadtatása szempontjából döntô lehet.
A fejezet következõ részében a hagyományos középszintû tervezésekbõl tekintünk át néhányat.
A tervezési módszer kiindulási segédletei az adatfolyam diagramok valamit a specifikációs fázis végén elõálló adatszótár (lásd 5.2.4 fejezet). Az adatfolyam diagramokból a modulokat tartalmazó struktúra diagram és modul-leírás készül. A struktúra diagram rajzi jeleit a 7.a ábra mutatja. Architekturális (középszintû) tervezésre ez a módszer a legalkalmasabb. Tartalmazza a modulok hívási (függõségi) hierarchiáját, az adatelemeket és azok áramlási irányát, az adatelemek leírását, a modulok funkcionális leírását. Nem tartalmazza viszont a modulok hívási sorrnedjét és a modulok hívásának számát, tehát nincsenek benne alacsony szintû vezérlési struktúrák (ezek megalkotása az alacsonyszintû tervezés feladata).
A struktúra diagram részei
A struktúra diagram moduljainak négy alaptípusát különböztetjük meg a 7.b ábrán látható módon, a leírásban szereplõ alapvetõ folyamatokat pedig a 7.c ábra mutatja.
A struktúra diagram készítésének lépései
A struktúra diagramban középen helyezkednek el a központi transzformáció elemei, tõle balra az afferens, jobbra az efferens részek (7.f ábra az elõzõ példa alapján). A határok megválasztása részben szubjektív. A "fontos" transzformáció kell, hogy alkossa a transzformációs központot.
Elemekre bontás (faktoring)
Az elemekre bontás az egy modellben elhelyezkedõ funkciók önálló modulokra történõ szétválasztását jelenti. Ez a következõk miatt elõnyös:
A döntés összetartás elve
A döntések két részbõl állnak: feltétel és végrehajtandó akció. A struktúra diagram megalkotásánál alapvetõ szempont, hogy a két rész minél közelebb kerüljön egymáshoz. Egy ágban lehetõleg minimális számú végrehajtandó mûveletet gyûjtsünk össze.
A kiegyenlített rendszer
A rendszer kiegyenlített, ha igaz rá, hogy:
A kiegyenlített rendszer azért hasznos, mert könnyû implementálni, külsõ interface könnyet változtatható, továbbá ezzel a módszerrel az alsóbb szinteken újrahasznosítható rutinok keletkeznek.
Vegyünk példaként a kiegyenlített rendszer illusztrálására egy tipikus részfeladatot: egy rekord szerkezetû adatbázis (adatfájl) tranzakció vezérelt karbantartását! ( 7.g ábra) A tranzakciót egy-egy adatsor írja le.
A programstruktúra és az adatstruktúra egyeztetése
A programsztruktúra és az adatstruktúra egyeztetés azt jelenti, hogy lehetõség szerint a feldolgozás szerkezete kövesse az adatszerkezetet. Ha például az adott fájlból az adatok karakterenként érkeznek, akkor a feldolgozás is történjen karakterenként. Ennek az ellenkezõje a rekordonként érkezõ adatok karakterenkénti feldolgozása. (7.h ábra).
Az adatstruktúrák kifejezésének uniformizálására vonatkozó igény megköveteli, hogy általános, nyelvfüggetlen módon is le lehessen írni azokat. Erre alkalmas a Jackson módszer.
A Jackson-módszer alapelvei
A Jackson-módszer lépései
szekvencia | A seq
B C D A end | |
iteráció | A iter until feltétel
B A end
A iter while feltétel B A end | |
szelekció | A select feltétel1
B A or feltétel2 C A or feltétel3 D A end |
A 7.i táblázatban találhatók a Jackson-módszerben alkalmazott adatszerkezet elemek mind grafikus, mind pszeudokód alakjukban. Vigyázni kell, azonben, mert ezek elemi szerkezetek, a szerkezetben pedig csak egyféle viszony lehet egy felsõbb elemhez kapcsolva, ezért lenne hibás a
konstrukció.