A Magyar Tudományos Akadémia folyóirata. Alapítva: 1840
 

KEZDŐLAP    ARCHÍVUM    IMPRESSZUM    KERESÉS


 SZOFTVEREK MINŐSÉGELLENŐRZÉSE – A SZOFTVEREK IS ÖREGSZENEK?

X

Gyimóthy Tibor

az MTA doktora, tanszékvezető egyetemi tanár, Szegedi Tudományegyetem Szoftverfejlesztés Tanszék

gyimothy(kukac)inf.u-szeged.hu

 

 

Szoftvererózió

 

Az informatikai rendszerek terjedése egyre gyorsabb, szinte már nincs olyan iparág, ahol az informatikának ne lenne jelentős szerepe. Mindennapi munkánk, társadalmi életünk elképzelhetetlen olyan eszközök nélkül, amelyekben nagyon bonyolult programok működnek: gondoljunk csak például autókra, telefonokra, orvosi eszközökre vagy banki rendszerekre. Egy átlagos felhasználó számára talán nem is annyira nyilvánvaló, hogy ezen eszközök, szolgáltatások biztonságos működésének garantálása óriási erőfeszítéseket igényel az informatikai rendszerek fejlesztőitől és üzemeltetőitől. Ennek egyik oka az, hogy a rohamosan bővülő műszaki lehetőségek, valamint a folyamatosan növekvő felhasználói igények hatására a szoftverek mérete és bonyolultsága is robbanásszerűen növekszik. Egy több millió programsort tartalmazó, összetett kórházi vagy banki rendszer bonyolultsága hasonlítható az ember szervezetéhez. Ez annyit jelent, hogy az informatikai rendszerek elemei között nagyon bonyolult kapcsolatok léteznek. Ha egy helyen megváltoztatunk valamit a szoftverben, annak közvetlen vagy közvetett hatása lehet a szoftver más elemeire is.

Az emberi szervezettel való hasonlóságot az is mutatja, hogy az üzemelő szoftverrendszerek is öregszenek, bármennyire furcsán hangzik is. Úgy is szoktuk mondani, hogy fellép a szoftvererózió folyamata. Az öregedés fő oka, hogy az üzemelő informatikai rendszereket folyamatosan változtatni kell. Ezek a változások elkerülhetetlenek, gondoljunk csak arra, hogy új követelmények keletkeznek, változnak a szabályozások, esetleg új hardverkörnyezetbe telepítjük az adott rendszert. A gyakorlat azt mutatja, hogy ezeket a változtatásokat általában nagyon szűk határidőre kell megvalósítani, nincs idő a szoftverek átgondolt újratervezésére. Ennek az lesz a hatása, hogy néhány év üzemelés után még a kezdetben nagyon gondosan megtervezett és megvalósított szoftverek esetében is fellépnek a szoftvererózió jelei. Azt vesszük észre, hogy még kisebb méretű módosítás esetén is nagyon sok következmény-hiba jelentkezik, egyre költségesebb a módosítás utáni tesztelés. Kiszámíthatatlan lesz a rendszer fejlesztésének költsége, tipikus probléma, hogy a rendszer működése lelassul, megbízhatatlanná válik.

Az 1. ábra szemlélteti ezt a folyamatot. Az X tengely egy szoftver fejlesztésének és üzemeltetésének idejét mutatja, az Y tengely pedig a rendszerben észlelt hibák számát (ez reprezentálja a rendszer minőségét). Azt gondolhatnánk, hogy az ábrán szereplő „idealizált görbe” jól jellemzi egy informatikai rendszer viselkedését. Vagyis a fejlesztés fázisában sok hiba lép fel, azonban ezeket egy intenzív tesztelési folyamattal sikerül kiszűrnünk, és ezután már alacsony hibaszázalékkal tudjuk üzemeltetni a rendszert. Azonban a valóságban sajnos nem ez a helyzet. Amint azt korábban említettük, az üzemelő informatikai rendszerek folyamatosan változnak. A változások miatt hibák keletkeznek, ezeket valamilyen százalékban kiszűrjük, de általában soha nincs arra idő, hogy a változások hatását végigvezessük a rendszeren. Ennek az lesz az eredménye, hogy elromlik a szoftver szerkezete, a módosításoknál egyre több következmény-hiba keletkezik, vagyis romlik a szoftver minősége. Ezt a folyamatot reprezentálja az ábrán a „valós görbe”.

Ha egy kicsit mélyebben meg szeretnénk vizsgálni, hogy konkrétan milyen programozási megoldások vezetnek ehhez a minőségi romláshoz, akkor az ún. copy-paste programozási gyakorlatra mindenképpen fel kell hívni a figyelmet. Ennek lényege az, hogy a programozók nagyon sokszor egy adott rendszerben egy új funkció megvalósításához nem készítenek teljesen új kódot, hanem vesznek egy korábban megírt kódrészletet, azt lemásolják (copy-paste), és ezt alakítják át az új követelménynek megfelelően. Ez nem is okozna problémát, ha az átalakítást körültekintően hajtanák végre. Azonban a gyakorlat azt mutatja, hogy a programozók (sokszor a határidő szorítása miatt) általában csak arra figyelnek, hogy az átalakított kód megvalósítsa az új követelményt, de arra már nem ügyelnek, hogy ezt hogyan teszi. Tipikus hiba például, hogy felesleges kódrészletek maradnak az átalakított kódban, amelyek vagy végre sem hajtódnak, vagy pedig az eredményüket senki sem használja (az ilyen kódot szokás halott kódnak nevezni). Ezek a halott kódrészletek nagyon veszélyesek, hiszen rengeteg felesleges kapcsolatot teremtenek, megnehezítik a programok megértését, és rejtett aknaként nem várt futási hibákat vagy jelentős futási lassulásokat is tudnak okozni. A probléma komolyságát jelzi, hogy vizsgálataink szerint több jelenleg is üzemelő nagy informatikai (pl. banki, telekommunikációs) rendszerben a copy-paste programozással készült kódrészek aránya meghaladja a 30%-ot. Az ilyen rendszerek üzemeltetése nagyon nehéz, új funkciókkal való bővítése egyre nagyobb költséggel jár. Ezt úgy is szoktuk mondani, hogy a rendszerek egy bizonyos idő után az evolúciós fázisból átkerülnek a karbantarthatósági fázisba.

 

A szoftverfejlesztés folyamata

 

A 2. ábrán szemléltetjük a szoftverfejlesztési folyamat egyes fázisait. A folyamatból kiemeljük az evolúciós fázist. Ez a szakasz egy informatikai rendszer első változatának átadása után indul. Ebben a fázisban még kellő pontossággal becsülhető egy új funkció bevezetésének fejlesztési határideje és költsége, kordában tartható a tesztelési ráfordítás. A korábbiakban ismertetett szoftvereróziós folyamat hatására azonban egy üzemelő rendszer bizonyos idő után átkerül a karbantarthatósági fázisba. A szoftverfejlesztés ezen szakaszában már nehezen becsülhetők a fejlesztéshez szükséges erőforrások, és a tesztelés óriási ráfordítást igényel. Ilyenkor már nem célszerű nagyobb fejlesztést végezni, csak egyszerű módosítások, illetve hibajavítási tevékenységek folytathatók. Ez a szakasz lezárul az ún. kivezetési (nyugalmazási) fázissal, amikor megszületik a döntés egy teljesen új rendszer létrehozására. Meg kell jegyezni, hogy ez a döntés nagyon fájdalmas lehet egy cég életében. Alapos elemzések megmutatták, hogy egy több évtizeden át működő, nagyobb méretű informatikai rendszer cserélése rendkívül kockázatos, hiszen legtöbb esetben a vállalatban az évek alatt felgyülemlett üzleti tudást ez a rendszer tartalmazza. Ezt a tudást szinte lehetetlen teljes mértékben átültetni egy új rendszerbe. Tehát arra kell törekednünk, hogy az üzemelő informatikai rendszert minél hosszabb ideig az evolúciós fázisban tartsuk, vagyis lassítanunk kell a szoftvererózió folyamatát. A tapasztalatok azt mutatják, hogy a mindennapi életünkben üzemelő szoftverek egyetlen biztos „specifikációja” a forráskód. Ez még olyan szoftverek estében is igaz, amelyeknél a fejlesztés során készültek részletes specifikációs és tervezési dokumentumok. A folyamatos változtatások hatására ezek a dokumentumok elszakadnak a tényleges implementációtól. Általános, hogy nincs idő és elegendő erőforrás a rendszerspecifikáció és forráskód konzisztenciájának fenntartására. Ezért a forráskód minőségének javítására, illetve romlásának megakadályozására kell törekednünk.

 

Forráskódalapú minőségbiztosítás

 

A 3. ábrán láthatjuk a Columbus forráskódalapú minőségbiztosító módszertan főbb elemeit (Ferenc et al., 2002). Mivel a minőségbiztosítás a forráskód alapján történik, ezért szükség van olyan hatékony elemző módszerek és eszközök kidolgozására, amelyek képesek a több millió soros programok gyors és pontos analízisére. Ezek a forráskódelemző eszközök elolvassák a programokat, és olyan belső reprezentációt állítanak elő, amelyből már könnyen tudunk szerkezeti és mennyiségi adatokat előállítani. Ez a belső reprezentáció lényegében egy nagyméretű, bonyolult gráf, amelyet szokás absztrakt szemantikus gráfnak (ASG) nevezni. Az ASG csomópontjai a program elemei (utasítások, eljárások, osztályok), a gráf élei pedig az elemek közötti függőségeket reprezentálják. A függőségek lehetnek szerkezeti, vezérlési, illetve adatfüggőségek. A szerkezeti függőségek a program felépítéséből származó kapcsolatokat reprezentálják (pl. osztályokon belüli eljárások). A gráf egy vezérlési éle azt mutatja meg, hogy az egyik programelem végrehajtása függ egy másik elem végrehajtási módjától. Egy adatfüggőségi él azt reprezentálja, hogy a program egyik változójának értéke függ a program másik változójának értékétől. A 4. ábrán a Mozilla nyílt forrású webböngésző egy kis programrészletének (kb. 500 programsor) ASG-jét ábrázoltuk. A teljes Mozilla rendszer több mint egymillió programsorból áll. Már ezen a kicsi ASG-n is látszik, hogy vannak programelemek, amelyeknek nagyon sok kapcsolatuk van, így érzékenyek a változtatásokra.

Az ASG felépítése után a Columbus módszertan következő lépése, hogy gráf alapján numerikus értékeket állítson elő (mérés és auditálás). Ez a lépés nagyon hasonlít ahhoz, mint amikor egy orvosi vizsgálat során laborértékeket számítanak. Ezeket a numerikus értékeket szoftvermetrikáknak nevezzük. A szakirodalom több száz metrikát ismer, ezek közül legjelentősebbek a méret, bonyolultság illetve csatolási metrikák (Chidamber et al., 1994). Méretalapú metrika például, hogy egy adott rendszer hány utasítást vagy eljárást tartalmaz. Természetesen az eljárásokra külön is érdekes, hogy hány sorból állnak, hiszen egy több ezer sorból álló eljárás karbantartása nagyon nehéz, ami a szoftverminőség szempontjából magas kockázatot jelent. A bonyolultsági metrikák a program vezérlési szerkezetét vizsgálják, például azt, hogy egy eljárás esetében hány különböző végrehajtási mód lehetséges. Nyilvánvaló, ha nagy egy eljárás bonyolultsági metrikája, akkor ez problémát jelenthet. Ugyanis, ha megváltoztatjuk az eljárást, akkor nagyon sok ráfordítást igényel a különböző végrehajtási utak tesztelése. A csatolási metrikák a programelemek közötti kapcsolatok számát reprezentálják. Ilyen metrika lehet például, hogy egy eljárás hány másik eljárást hív, vagy az, hogy mennyi kapcsolata van adatfüggőségek alapján. A csatolási metrika magas értéke is komoly veszélyre figyelmeztethet. Azt mutatja, hogy az adott programelem sérülékeny, mivel a program változásai nagyobb valószínűséggel hatnak erre az elemre, mint a kisebb csatolási metrika értékkel jellemzett programelemekre.

A szoftvermetrikák számítása mellett az ASG-gráf alapján lehetőség van a program nagyobb szerkezeti egységeinek (komponensek) feltárására és az ezek közötti kapcsolatok azonosítására. A visszatervezési (Reverse Engineering) folyamat fő célja, hogy egy magasabb szintű tervezési dokumentumként megpróbáljuk előállítani az adott rendszer szoftverarchitektúráját. Az orvosi vizsgálat analógiánál maradva ez a folyamat hasonlítható ahhoz, mint amikor kétdimenziós metszetekből megpróbálunk háromdimenziós alakzatokat rekonstruálni.

A Columbus módszertan szerint, miután egy informatikai rendszerre rendelkezésre állnak a szoftvermetrikák, kiegészülve az architektúrára vonatkozó információkkal, lehetőség van a szoftverminőségi problémák feltárására (diagnosztika). Az orvosi vizsgálatokhoz hasonlóan ez a folyamat legnehezebb része. A diagnózis nagyon sok tényezőtől függ, ugyanazon numerikus értékeket fejlesztési platformonként másképpen kell interpretálni, a fejlesztési módszertan is lényegesen befolyásolja a kiértékelést. Bonyolítja a helyzetet, hogy egy nagyobb méretű rendszer esetén több millió metrikus érték alapján kell döntéseket hozni. Sokat segíthet a döntési folyamatban, ha lehetőség van rá, hogy egy adott rendszer változásait hosszabb ideig megfigyeljük, vagyis több egymást követő verzióra tudunk szoftvermetrikákat számolni. Ekkor vizsgálhatjuk a metrikus értékek változásának tendenciáját, ami sokat elárul a szoftverminőség alakulásáról. A minőségi problémák azonosításában kiemelkedő szerepe van a szoftverminőség-modelleknek. Ezek a modellek a metrikák alapján statisztikai, illetve gépi tanulási módszerek felhasználásával próbálják megbecsülni a szoftver problémás elemeit.

A minőségi problémák azonosítása után természetesen szükség van a feltárt hiányosságok javítására (kezelés). Sokszor ezek a problémák nem közvetlenül fellépő hibát jelentenek, hanem olyan hiányosságokat, amelyek nagyon megnehezítik egy rendszer üzemeltetését (például a nagyméretű, komplex eljárások megnövelik a tesztelési költségeket). Sajnos az ilyen jellegű problémák javítása nem könnyű feladat, hiszen gyakran évekkel korábban megírt forráskódrészleteket kell átalakítani. Ezt az átalakítást úgy kell végrehajtani, hogy ne sérüljön a rendszer biztonságos működése, vagyis a felhasználó számára ne jelentsen észlelhető változást. Az ilyen típusú forráskód-változtatásokat, amelyeket nem egy konkrét hiba eltávolítására, hanem a program szerkezetének javítására használunk, refaktoring folyamatnak nevezzük. A szakirodalmi javaslat szerint célszerű lenne a fejlesztési költségek 10%-át folyamatosan refaktoring tevékenységre fordítani. Ezzel tudnánk azt biztosítani, hogy egy adott rendszer hosszabb ideig maradjon evolúciós fázisban. Sajnos a

 

 

tapasztalatok azt mutatják, hogy a szoftverfejlesztő és -üzemeltető cégek a folyamatos piaci nyomás hatására nagyon kevés erőforrást szánnak a szoftverminőség karbantartására. Ezért van szükség időnként egy nagyon intenzív „kezelésre”, vagyis a forráskód alapos vizsgálata után a problémás kódrészletek javítására. A refaktoring lépés után természetesen javasolt egy újabb mérés, vagyis ellenőrizni kell, hogy a változtatások hatására javultak-e a metrikus értékek (jobbak lettek-e a laboreredmények).

Már említettük, hogy egy nagy rendszer utólagos átalakítása nagyon költséges folyamat. Mivel általában a forráskódon kívül nincs más specifikációs dokumentum, ezért a forráskód alapján kell megérteni a rendszer szerkezetét ahhoz, hogy a szükséges javításokat el tudjuk végezni. Nyilvánvalóan sokkal jobb megoldás, ha az utólagos refaktoring helyett megelőzhető lenne a szoftver minőségének romlása (megelőzés). Ez megvalósítható, ha a szoftverfejlesztési folyamatba beépítjük a szoftverminőség-ellenőrző eszközöket. Vagyis amint a programozó elkészít egy új kódrészletet, azt azonnal ellenőrizzük, és addig nem folytathatja a fejlesztést, amíg a feltárt hiányosságokat ki nem javítja. Nagy szoftverrendszereket üzemeltető cégek (például bankok, telekommunikációs cégek) is gondoskodhatnak arról, hogy elkerüljék kódbázisuk minőségének gyors romlását. Mivel az ilyen cégeknél általános, hogy az informatikai rendszereik fejlesztését külső beszállítókkal valósítják meg, ezért meg kell oldani a szállítók minőségi ellenőrzését. Vagyis a beszállítói szoftverek minden változatát nemcsak funkcionálisan kell tesztelni, hanem forráskódelemzéssel, a metrikák számításával meg kell győződni az átadott szoftver minőségéről is.

 

A szoftverminőség mérése

 

A szoftverminőség ellenőrzését csak megfelelő mérések alapján lehet elvégezni, de nem mindegy, hogy mit mérünk. Azt már a szoftverfejlesztés hőskorában felismerték, hogy a tesztelés önmagában nem elegendő a szoftverminőség biztosítására, hiszen még egy viszonylag kis program esetében is általában végtelen sok tesztesetet kellene futtatnunk ahhoz, hogy a program minden lehetséges végrehajtási módját ellenőrizzük. Ezt belátva előtérbe kerültek az olyan megoldások, amelyek a szoftverfejlesztés folyamatára koncentrálva kívánják elérni a szoftverminőség javulását. Ez a szemlélet a szoftverfejlesztést egy klasszikus értelemben vett gyártási folyamatnak tekinti, és az ilyen folyamatokra alkalmazott ISO-követelmények betartását tekinti a szoftverminőség elsődleges feltételének. A későbbiek során annyiban módosult ez a szemlélet, hogy miután világossá vált, hogy a szoftverfejlesztés folyamata nagyon különbözik a szokásos gyártási folyamatoktól, ezért létrejöttek a kifejezetten szoftverfejlesztési folyamatra kidolgozott minősítő módszerek. Ezek közül legismertebb a Carnegie Mellon egyetemen létrehozott Capability Maturity Model Integration (CMMI) módszer. A szoftverfejlesztési folyamatra kidolgozott speciális minősítő módszerek már valóban pontosabban mérték/mérik a szoftverfejlesztő cégek fejlesztési folyamatait, azonban sok esetben nem adnak megbízható következtetést a cégek által előállított szoftvertermékek minőségére. A tapasztalatok azt mutatták, hogy a szoftverfejlesztő cégek megtanulták azt, hogyan lehet úgy alakítani a fejlesztési folyamataikat, hogy például egy CMMI-minősítés során elérjék a legmagasabb szintet, ugyanakkor termékeik minőségében gyakran nem tükröződik ez a magas minősítés.

Szükség van tehát a folyamatok minősítésén túl a szoftvertermékek minőségének mérésére is. A folyamatok és a termékek ellenőrzése numerikus értékek, vagyis metrikák számításán alapul. Folyamatmetrika például egy hiba javításához szükséges átlagos idő vagy egy adott időszak alatt fejlesztett programsorok száma. Termékmetrikák például a korábbiakban már említett méret-, bonyolultsági vagy csatolási metrikák.

A metrikáknak fontos szerepük van a vállalati döntésekben. Segítenek a kockázatok elemzésében, az erőforrás- és költségigény becslésében, segítségükkel regressziós modellek építhetők a szoftvertermék minőségének meghatározására.

A továbbiakban szoftvertermék-metrikákkal foglalkozunk. Ezeket a metrikákat elsősorban a forráskód alapján számítjuk, habár érdemes megjegyezni, hogy az utóbbi években születtek eredmények a forráskódhoz fűzött természetes nyelvi megjegyzések (kommentek) elemzéséből származó metrikák használatával is. Hasznosnak bizonyult például az a csatolási metrika, amely két eljárás kapcsolatát a kommentjeikben szereplő közös szavak gyakoriságával számolja (Újházi et al., 2010)

A termékmetrikákat két nagy csoportra oszthatjuk. A belső metrikák közvetlenül számíthatók a forráskódból, ilyenek például a korábbiakban említett méret, bonyolultság és csatolási metrikák. A másik csoportot a külső vagy másképpen aggregált metrikák alkotják. Ezek a belső metrikákból származtathatók, és az a céljuk, hogy elsősorban a menedzsment számára adjanak mérhető információt az adott szoftver minőségéről. Ilyen metrika pl. a karbantarthatósági, tesztelhetőségi, megbízhatósági metrika. Megjegyezzük, hogy a külső metrikák megbízható származtatása nagyon nehéz, általában valószínűségi modelleken (Bakota et al., 2011), ill. heurisztikus megfontolásokon alapuló (Heitlager et al., 2007) megoldásokat használnak.

A belső metrikák közül hosszú ideig a méretalapú metrikáknak meghatározó szerepük volt. Sokaknak az volt a véleményük, hogy a szoftver mérete (utasítások száma) önmagában elegendő arra, hogy megbecsüljük karbantarthatóságát vagy a teszteléshez szükséges ráfordítást. Méretmetrikákat számíthatunk a teljes szoftverre, illetve a program kisebb egységeire is (eljárások, osztályok). A legegyszerűbb és a gyakorlatban is leginkább használt méretmetrika az utasítások száma, az ún. LOC- (lines of code) metrika. Megjegyezzük, hogy még ezt a legegyszerűbb metrikát sem egyszerű pontosan meghatározni, nagyban függ például a programozói stílustól. Ezt a metrikát régebben használták arra is, hogy mérjék a szoftverfejlesztők teljesítményét, azonban később rájöttek, hogy az ilyen típusú mérésnek komoly negatív hatása is lehet. Arra ösztönzi a programozókat, hogy minél több programsort állítsanak elő, ami pedig elősegíti a korábbiakban említett veszélyes copy-paste típusú programfejlesztést.

A bonyolultsági metrikák között kiemelt szerepű a McCabe-féle bonyolultsági mérték. Programok karbantarthatósága szempontjából fontos kritérium, hogy mennyire bonyolult a vezérlési szerkezetük. McCabe-féle bonyolultsági mértékkel azt mérjük, hogy egy eljárás esetén elméletileg hány lényegileg különböző végrehajtási útvonal van az eljárás kezdő- és végpontja között. Könnyű belátni, hogy minél nagyobb ez a szám, annál problémásabb lehet egy ilyen eljárás karbantartása. Nehezebb a megértése, és változtatás esetén sok tesztesetet kell végrehajtani, ha minden végrehajtási útvonalat legalább egyszer érinteni szeretnénk. A szakirodalom szerint nem tanácsos tíz-tizenöt McCabe-bonyolultságot meghaladó eljárásokat írni. Ugyanakkor tapasztalataink azt mutatják, hogy a napi használatban üzemelő nagy informatikai rendszerek esetében nem ritka a több százas McCabe-bonyolultsági mértékű eljárás. Bizonyos szituációkban elfogadhatók a nagy bonyolultságú eljárások (pl. generált kód), azonban az esetek túlnyomó többségében komoly szoftverminőségi problémát jeleznek.

Napjaink vezető programozási paradigmája az objektumvezérelt programfejlesztés. Ennek lényege, hogy az informatikai rendszerek funkcióit és a hozzájuk tartozó adatokat megpróbáljuk egymástól jól elhatárolható egységekre (objektumosztályokra) osztani. Konkrétan egy osztály adatokat és ezeken műveleteket végrehajtó metódusokat tartalmaz. A rendszer teljes működését az osztályok belső működésével és az osztályok közötti kapcsolatokkal tudjuk megadni. A csatolási metrikák elsősorban az objektumvezérelt programozási nyelvek osztályai közötti kapcsolatok erősségének mérésére jöttek létre. Közülük legismertebb a CBO- (Coupling Between Objects) metrika. Ez a metrika azt méri, hogy egy adott osztály hány további osztállyal áll kapcsolatban. A kapcsolatokat a metódushívások, illetve adattagok közös használata jelenti. Amint azt már említettük, a magas CBO-értékű osztályok a karbantarthatóság szempontjából veszélyesek lehetnek, mivel a program változása esetén a változások következménye nagyobb valószínűséggel érinti ezeket az osztályokat.

A belső metrikákra alapozva lehetőség nyílik szoftverminőség-ellenőrző modellek kidolgozására. Elsősorban olyan modellek készültek, amelyek a metrikák alapján próbálják felderíteni a szoftver azon elemeit (például osztályokat), amelyek leginkább érzékenyek a változtatásokra, vagyis a program módosításakor várhatóan hibák jelentkeznek bennük. Számos modell készült, amelyek közül kiemelhető a Victor Basili és munkatársai által publikált úttörő munka (Basili et al., 1996), azonban ipari méretű programra a Szegedi Tudományegyetem Szoftverfejlesztés Tanszék kutatóival dolgoztunk ki először ilyen modellt (Gyimóthy et al., 2005). A több mint egymillió programsort tartalmazó, nyílt forrású Mozilla webböngésző szoftvert elemeztük, és az osztályokra metrikákat számítottunk. A Mozilla folyamatosan fejlődő rendszer, és egy adatbázisban (Bugzilla) évekre visszamenőleg rendelkezésre álltak az észlelt hibák adatai. Az osztályokhoz hozzárendeltük ezeket a hibákat, így minden osztályra a metrikus értékek mellett rendelkezésre állt az is, hogy a múltban hány hiba jelentkezett az adott osztályban. Ezen adatok alapján statisztikai (lineáris és logisztikus regresszió), valamint gépi tanulási (döntési fa, neuronháló) módszerekkel modelleket készítettünk. Konkrétan azt vizsgáltuk, hogy melyik metrikák a legalkalmasabbak a hibára hajlamos osztályok azonosítására. Tapasztalataink azt mutatták, hogy a statisztikai és a gépi tanulási modellek esetén is a CBO-csatolási metrika alapján lehetett legpontosabban megbecsülni a hibára hajlamos osztályokat. Vagyis a méret és bonyolultság metrikáknál is kritikusabb arra figyelni, hogy csak az igazán szükséges függőségeket építsük ki a szoftverelemek között. Másképpen fogalmazva az olyan szoftverek, melyek „kapcsolati hálója” nagyon sűrű, nagyon sérülékenyek, változtatások esetén sok következmény-hiba jelentkezhet bennük. Ez az eredmény az igen költséges tesztelési folyamat optimalizálását is segítheti. Konkrétan: egy változtatás utáni teszteléskor érdemes nagyobb figyelmet fordítani a magas CBO-értékű osztályok tesztelésére.

Tapasztalataink alapján még számos kérdést kell megválaszolni ahhoz, hogy az ilyen metrikus modellek a mindennapi szoftverfejlesztésben és -üzemeltetésben rutinszerűen alkalmazhatók legyenek. Egyik legfontosabb megoldandó probléma a találati pontosság növelése, a hamis riasztások csökkentése. Ez annyit jelent, hogy ha a modell azonosít egy minőségi problémát, akkor az valódi probléma legyen. Nem várható, hogy olyan általános modellek készülnek, amelyek minden szoftverfejlesztési területre alkalmazhatók lesznek. A szakterület egyedi sajátosságait és a fejlesztési platformok sajátosságait egyaránt figyelembe vevő, metrikaalapú szoftverminőség-modellek elterjedésére azonban reális esély mutatkozik.

 


 

Kulcsszavak: szoftverminőség, szoftverevolúció, metrikák, forráskódalapú szoftverminőség-modellek

 


 

IRODALOM

Bakota Tibor – Hegedűs P. – Körtvélyesi P. – Ferenc R. – Gyimóthy T. (2011): A Probabilistic Software Quality Model. Proceedings of the 27th IEEE International Conference on Software Maintenance. 243–252. DOI:10.1109/ICSM.2011.6080791

Basili, Victor R. – Briand, L. C. – Melo, W. L. (1996): A Validation of Object-Oriented Design Metrics as Quality Indicators. IEEE Transactions on Software Engineering. 22, 10, 751–761. WEBCÍM

Chidamber, Shyam R. – Kemerer, Chris F. (1994): A Metrics Suite for Object-Oriented Design. IEEE Transactions on Software Engineering. 20, 6, 476-493. • WEBCÍM

Ferenc Rudolf – Beszédes Á. – Tarkiainen, M. – Gyimóthy T. (2002): Columbus – Reverse Engineering Tool and Schema for C++. Proc. of the IEEE International Conference on Software Maintenance. 172–181, IEEE Computer Society, Most Influential Paper Award. • WEBCÍM

Gyimóthy Tibor – Ferenc R. – Siket I. (2005): Empirical Validation of Object-oriented Metrics on Open Source Software for Fault Prediction. IEEE Transactions on Software Engineering. 31, 10, 897–910. DOI:10.1109/TSE.2005.112

Heitlager, Ilja – Kuipers, T. – Visser, J. (2007): A Practical Model for Measuring Maintainability. Proceedings of the 6th International Conference on the Quality of Information and Communications Technology. 30–39. • WEBCÍM

Újházi Béla – Ferenc R. – Poshyvanyk, D. – Gyimóthy T. (2010): New Conceptual Coupling and Cohesion Metrics for Object-Oriented Systems. Proceedings of the 10th IEEE International Working Conference on Source Code Analysis and Manipulation. Best paper award. DOI:10.1109/SCAM.2010.14

 


 

 

1. ábra <

 


 

 

2. ábra <

 


 

 

3. ábra <

 


 

 

4. ábra <