Gérard Berry
A szoftver mint mindennapi használati tárgy

Belső rugalmassága és alkalmazhatóságának változatossága miatt az informatika egyre növekvő mértékben válik mindennapi életünk részévé, és mélyen átalakítja társadalmunkat. Az informatika először az 1980-as években, a személyi számítógép megjelenésével lépett ki hagyományos szerepéből, amely a tudományos számítások világához és a nagy szervezetek irányításához kötötte. Számos új terep nyílt meg előtte: mindenféle szervezetek irányítása, az üzemek és a közlekedési ágazatok automatizálása, szinte minden területen új koncepciók kidolgozása, technikai és művészeti dokumentumok, játékok előállítása stb. 1995–2000 között aztán az internet elterjedése változtatta meg alaposan a számítógép szerepét, amely így sokkal inkább az információs társadalomhoz kötött hordozó lett, mint a tértől-időtől független számítások eszköze. Ma ott tartunk, hogy a számítógép elveszíti billentyűzetét és monitorát, és a legkülönbözőbb tárgyakba költözik be: autókba, háztartási és audiovizuális gépekbe, mobiltelefonokba, orvosi protézisekbe, és a lista vég nélkül meghosszabbítható. A informatikán alapuló tárgyak nagy hálózattá állnak össze, így állandó kapcsolatba kerülünk azzal az információs rendszerrel, amely életünk minden részét érinti.
Ez a nagy szintetikus idegrendszer olyan anyagi vagy szellemi összetevőkön nyugszik, amelyek messzemenően ismeretlenek a nagyközönség előtt, hiszen tökéletesen láthatatlanok, ellentétben például egy kerékpár vagy egy autó mechanikus alkotórészeivel. Sem egy processzor belseje, sem a működését szabályozó programok nem látszanak, nem érzékelhetők. A megértés szokásos módszerei vagy a tárgyak érzéki benyomásokon alapuló választása itt nem működik, ami nagyrészt megmagyarázza, miért olyan nehéz sok embernek, hogy a társadalom informatizáltságát beépítse saját világképébe. Ez sajnos érvényes az informatizált tárgyak alkotóira is, akiknek nem mindig sikerül optimális minőséget létrehozniuk.
Rövid eszmefuttatásunkban megpróbáljuk megmagyarázni, mi az informatika lényege, melyek a belőle fakadó nehézségek – ezeket igen gyakran alábecsülik –, és mitől várhatjuk az informatizált termékek minőségének javulását.

*A szoftver
Az első dolog, amit jól meg kell értenünk, a processzorok szerepe. Ez olyan szerkezet, amely meghökkentő sebességgel és csaknem tökéletes megbízhatósággal képes rá, hogy önállóan műveleteket hajtson végre, az érdeklődés legcsekélyebb jele nélkül; a legfontosabb e tekintetben az, hogy vesz valahonnan egy információt, majd elrakja máshova, miután esetleg módosította. Ez csaknem minden processzorra érvényes, a nagy PC-chipektől azokig a kis chipekig, amelyek az autók fékeit vezérlik, vagy a fényképezőgépekben a képet rögzítik. Mind ugyanazon az alapelven működik, egészen jelentéktelen eltérésekkel.
A bámulatos Moore-törvény azt mondja, hogy a teljesítmények 18 havonta megkétszereződnek, azonos költségek mellett. Vagyis 1985 és 2000 között megezerszereződtek. A törvény igaznak bizonyul több mint tizenöt éve, és ma sem látszik, hogy volna időbeli korlátja. A fejlődés különféle jelenségek egybeesésének az eredménye: esetünkben az elektronikus elemek méretének folyamatos csökkenéséről, a gyártási technikák fejlődéséről, a működési frekvenciák növekedéséről (a híres megahertzek) és a processzorok ésszerű architektúrájának állandó fejlődéséről van szó.
A chip azonban csak hűséges szolga; a hozzáadott érték, amelyet létrehoz, csak azoknak az utasításoknak az egymásutánjából jöhet, amelyeket mi adunk neki, és amelyet a szoftverek szállítanak. Szoftvert alkotni nem más, mint meghatározni azt a végrehajtandó műveletsort, amely a számunkra érdekes végeredményt kiadja: kinyomtatni egy szöveget, elkészíteni egy fényképet, zenét hallgatni vagy telefonálni. Minthogy az egyes műveletek szinte semmit sem csinálnak önmagukban, mérhetetlen mennyiség kell belőlük ahhoz, hogy elérjük, amit akarunk. Valójában tucatnyi számítógépen végrehajtott műveletek milliárdjaira van szükség már egy egyszerű telefonhívás lebonyolításához is. Némely műveletre azért van szükség, hogy a hangot 0-s és 1-es információs elemekké alakítsa át, másokra azért, hogy ezekből az elemekből csomagokat állítsanak össze, megint másokra azért, hogy létrehozzák a kapcsolatokat, és a megfelelő csomagokat a megfelelő beszélgetőpartnerhez továbbítsák, és persze egy részükre azért, hogy kiállítsák a számlát.
A legelemibb műveletek többségét többször is végrehajtják az egymást követő adatokon; nincs tehát közvetlen kapcsolat a ténylegesen elvégzett műveletek száma és annak a programnak a mérete között, amelyet a programozó megírt. Ez a méret azonban ettől még igen nagy: a széles körben elterjedt alkalmazások esetében ezernyi, sőt milliónyi különálló programsort kell megírni.
Még a processzorok tervezése is alapvetően szoftver-ügy. Egy-egy chip megtervezése még a közelmúltban is úgy zajlott, hogy az elektromosság és az ésszerűség szabályainak megfelelően összeállították a tranzisztorokat, majd megpróbálták miniatürizálni ezeket az elemeket úgy, hogy adott idő alatt a lehető legtöbb elektromosság áramoljon át rajtuk. Ma már egyetlen chipben is milliónyi összetevő van, és nincs más eszköz a kezeléséhez, mint a speciális szoftver. Ami azt jelenti, hogy az informatikai kígyó saját farkába harapott, és elkerülhetetlen, hogy a múlt gépeit a jövő gépeinek megalkotásához használjuk fel.

*A szoftver sajátos problémája: a bug
Minthogy a nagyságrendek adottak, most már jobban megérthetjük a szoftver két nagy problémáját: hogyan irányítsunk egy tökéletesen buta gépet, és hogyan kezeljünk milliónyi utasítást? Egyszerű hasonlattal élve: képzeljük el, hogy egy nagyvállalat élén állunk, amelynek minden alkalmazottja tökéletes engedelmességgel és hatékonysággal működik, de a legcsekélyebb kezdeményezőképesség is hiányzik belőlük; van-e rá esélyünk, hogy elérjük, amit akarunk? Vajon sikerül-e megírnunk minden művelet minden apró részletét minden egyes beosztott számára? Az emberi társadalmak a szereplők helyi alkalmazkodási képességén nyugszanak, és azon, hogy a szereplők értik cselekedeteik hatását; nem így a mikroprocesszorok. Ha a legcsekélyebb mértékben is hamis utasítás adunk nekik, azt is hibátlan szakmai lelkiismerettel és minden humorérzék nélkül végre fogják hajtani. Tegyük fel azonban, hogy sikerült pontosan meghatároznunk a végrehajtandó műveletet. Minthogy minden apró részletet hiánytalanul meg kell hozzá adnunk, a dokumentációnk túl vaskosra sikeredik, rosszul szerkesztett, és épp annyira szórakoztató, mint egy telefonkönyv. Egy év múltán aztán elhatározzuk, hogy néhány helyen megváltoztatjuk a szoftverünket. Vissza tudunk-e emlékezni, mire való az a rengeteg apró részlet, amellyel korábban dolgoztunk, és ha szükséges, vajon át tudjuk-e adni olyasvalakinek a módosítási munkákat, aki nem csinálta végig az eredeti dokumentáció létrehozását? Nos hát pontosan ezek azok a nehézségek, amellyel az informatikusok szembe találják magukat minden munkájukban.
Ezeken a nehézségeken túl van egy különösen alattomos ellenség: a bug [poloska]. A kifejezés arra utal, hogy az első számítógép-leállások egyikét egy kis rovar okozta. A bug aprócska hiba, amely olykor csak a program néhány karakterét érinti, mégis félelmetes hatásokkal járó láncreakciókat indíthat el: telefonközpontok leállása, rakéták felrobbanása, műholdak elvesztése, PC-k ismételt leállása, biztonsági lyukak keletkezése a hálózatokban – a feketelista végeláthatatlan. Így például a csúcsinformatikával ellátott amerikai Smart Ship hajón történt, hogy az egyik operátor véletlenül 0 értéket írt be pozitív érték helyett valamelyik közönséges paraméterhez. Ez 0-val való osztást eredményezett, amely további problémákat okozott az illető számítógépben, majd magában az egész rendszerben is. Néhány perc elteltével a hajó ellenőrizhetetlenné vált, a motorok leálltak. A bug abszolút mértékben determinálja a folyamatokat: az Ariane V felrobbanása, amely az első kilövéskor bekövetkezett, száz kilövésből százszor megtörtént volna ugyanazon a helyen (ma már természetesen kijavították a hibát).
A számítógéptervezők számára már magának a bugnak a létezése is nagy meglepetés volt. Idézzük fel az informatika egyik úttörője, Maurice Wilkes meglepő gondolatait 1949-ből: „Mihelyt elkezdtünk programokat írni, legnagyobb meglepetésünkre rájöttünk, hogy a feladat korántsem olyan egyszerű, mint hittük. Fel kellett fedeznünk a «hibamentesítés» műveletét. Emlékszem arra a pillanatra, amikor rájöttem, életem nagy része a jövőben azzal telik majd, hogy hibák után kutatok a saját programomban.” De ennyire tapasztalt szakemberek miért hoznak létre bugokat? Az ok: roppant bonyolult „interakciók” mennek végbe a szoftver és környezete, illetve a szoftver különböző részei közt. Még egy olyan, látszólag egyszerű szoftvernél is, mint amelyik a telefonhívásokat bonyolítja, a kezelendő esetszám csillagászati méretű lehet, a közvetlen emberi felfogóképesség határain messze túl. Minthogy a szoftvernek nincs semmiféle automatikus alkalmazkodó vagy önjavító képessége, egy eseményre adott válasza pontosan olyan lesz, amilyet beleírtak a programba. De a „beleírt” nem szükségképpen jelenti azt, hogy „végiggondolt”. 
A gyakorlatban sokszor megtörténik, hogy egy nem kifejezetten előre látott esemény a szoftver egyes részeiben átjárókat hoz létre bizonyos helyekhez vagy bizonyos időpillanatokban, kiszámíthatatlan módon, s ez rendellenes akciókhoz vezet, amelyek hatása a környezetre abszolút mértékben tetszőleges lehet. Így okozhatták például betegek halálát egy besugárzó szerkezet vezérlőbillentyűzetének kezelésére írt program igen apró hibái, amelyek hatására a gép rendellenesen nagy dózisokat bocsátott ki. Más típusú, az utolsó pillanatban távvezérléssel kijavított hibák miatt veszett el csaknem a híres Mars-robot, a Sojourner. Jegyezzük meg, hogy a bugok a chipekben is léteznek. Egy elosztótábla látszólag használaton kívüli helyén keletkezett apró hiba okozta a híres bugot az Intel Pentium chipjében. Ez a bug a társaságnak hivatalosan  475 millió dollárjába került.

*A szoftverek ipari fejlesztése
Mint sok más iparágat, az elektronikai és informatikai iparágakat is alapvetően a híres time to market irányítja, amelyet minimalizálni kell. A helyzet azonban változik: ma már maximalizálni is kell, a time to bug-ot. Szaporodnak azok az esetek, ahol a szoftverben vagy a chipen lévő egyetlen bug következményeinek költségei jóval meghaladják a rendszer kifejlesztésének teljes költségét. A költség nemcsak magának a komplikációnak a költsége: egy internetes játék új verziójának letöltése ma már közönséges dolognak számít; korántsem az egy autótípus minden egyes példányánál a motort vezérlő szoftver kijavítása. A bugokon kívül komoly kezelési problémák lépnek fel a projektek összehangolásánál is. Olyan nagy projekteket kellett teljesen leállítani, hihetetlen pénzek ráköltése után, mint az angol tőzsde informatizálása, vagy az Egyesült Államokban az adóívek kezeléséé, vagy bizonyos repülőtereken a csomagkezelésé. Nem könnyű bánni egy olyan projekttel, amely a láthatatlan tartományban működik.

Egyszerű receptjei vannak annak, hogyan kell megírni egy rossz minőségű szoftvert. Nem árt, ha bemutatjuk őket, mert még ma is igen gyakoriak, különösen azokon a helyeken, ahol a probléma létezését még nem fogták fel:
– Ráhagyatkozás a látszólagos rugalmasságra. Minthogy egy szoftver szövegének a kijavítása technikailag egyszerű dolog, gyakran előfordul, hogy a megrendelő nem határozza meg pontosan, mit is akar; abban bízik, hogy később még mindig ráér módosíttatni a programot. A szolgáltatók általában ezt nem tartják bajnak (az ügyfél nem tudja, mit akar, minthogy azonban ő fizet, megcsináljuk neki). Amikor aztán egymás után jönnek a módosítások, a rendszer gyorsan válik egy kártyavárhoz hasonlatossá.
– Spórolás az emberi erőforrásokkal. A szoftverkészítés kevéssé automatizált terület, ahol az emberek termelékenysége rendkívül változó, és nagy mértékben függ a képzettségüktől. A programozók egymással korántsem felcserélhetők, és teljesítményük a végtermékben kifejezve egy és tíz között változik (klasszikus módszer, hogy úgy akarják behozni valamely projektnél a lemaradást, hogy több, kevésbé képzett programozót vesznek fel). Egyébként a tesztek elvégzése rendkívül drága dolog emberben számítva: olykor a projekt költségének 30–50 százaléka is lehet. Ezen a ponton tehát nyilvánvalóan nagy a kísértés a spórolásra – a következményeket ki lehet találni.
– A nem megfelelő eszközhasználat. Gyakran látni eszközökkel kevéssé vagy rosszul felszerelt projekteket. Sokáig volt egyfajta bizalmatlanság a szoftvereszközök iránt: képzettebb személyzetet kívánnak meg (lásd az előző problémát), és az eszközök maguk is tartalmazhatnak vagy keletkeztethetnek bugokat. Gyakori tehát, hogy projekteket a nulláról indítanak el, és újra megcsinálják hozzá az alapeszközök jó részét. Miután rádöbbentek arra, hogy fölösleges újra feltalálni a kereket, a projektvezetők átestek a ló másik oldalára, és elkezdték megkövetelni, hogy munkatársaik következetesen támaszkodjanak a polcokon elheverő komponensekre. Ez azonban sokszor oda vezetett, hogy kevéssé megbízható vagy eredeti céljuktól meglehetősen eltérített, s így gyenge lábakon álló elemeket használtak fel. Az egyensúlyt nem könnyű megteremteni.

Összefoglalva azt mondhatjuk, van egy egyszerű és garantált eszköz arra, hogy bármilyen szoftverprojektet kudarcra ítéljünk: ha nem vesszük kellőképpen komolyan. Megbízható szoftvereket írni, ez a következőket követeli meg: pontosan meg kell érteni az igényeket; a funkcionalitásokat szigorúan a szükséges mennyiségre kell korlátozni; a lehető legalaposabban elemezni kell az interakciókat; mindig a legteljesebb mértékben kell uralni a projektet intellektuálisan is, technikailag is; jó eszközellátottságot kell biztosítani, hogy a szoftvernek a lehető legtöbb sajátosságát láthatóvá tegyük; minél több jól megalapozott szoftverelemet kell újrahasznosítani, defenzív módon programozni, azaz sohasem bízni vakon a többi elem viselkedésében, pontosan dokumentálni, egyszóval minden pillanatban szigorúnak kell lenni.
Különösen nagy figyelmet kell fordítani az „ember–gép-interface”-re, különösen a nagyközönségnek szánt termékeknél. Az ember csak álmélkodik, amikor látja a nagyszámú informatizált jegykiadó-automatát, a nyilvánvalóan kifinomult telefonokat vagy fotómasinákat, amelyek jórészt használhatatlanok, mert az informatikusok nem figyeltek oda rá, hogy végiggondolják, hogyan is fogják megérteni és használni őket az egyszerű halandók.

*A szoftver matematikája
Minthogy a bugok roppant alattomos természetűek, a világ legjobb tervezői sem tudják kiküszöbölni őket. Ahány rendszer csak van, legyen az akár a legegyszerűbb, megtartja a bugját, ha csak empirikus tesztekkel ellenőrizték le, minthogy benne a potenciális interakciók száma kombinatorikusan robban, tehát kevéssé megközelíthető szokásos gondolkodási formáinkkal. De a kutatók az informatika kezdetei óta úgy tekintenek a szoftverre, mint lényege szerint matematikai természetű tárgyra, amelyre alkalmazhatók a formális és olykor automatizálható gondolkodás szabályai.
A „algoritmus” matematikai fogalma vagy a mechanikusan végrehajtható műveletek egymásutánja igen régi találmány, amelyet eredetileg a számok és alakzatok kezelésére fejlesztettek ki. A számítógép születése új lendületet adott az algoritmuskutatásnak. A modern algoritmusok alkalmazási területei igen különbözőek: mindenféle információkezelés, igen nagy mennyiségű adatban való keresés, hang- és képvezérlés, titkosítás stb. Ma már megbízható algoritmus-könyvtárral rendelkezünk sok állandó problémára. Nemrégiben jelentek meg az „elosztott” algoritmusok, amelyek több aritmetikai egységet iktattak be; ezek igen fontosak az olyan új alkalmazásoknál, mint az elektronikus kereskedelem, de roppant nehéz felfogni és elemezni őket. Az erősen matematikai irányultságú algoritmuskutatást általában az algoritmusok fogalma és teljesítményük tanulmányozása érdekli. A központi nehézség abban áll, hogy a fontos problémák pontosan a gyakorlatban kivitelezhető és kivitelezhetetlen határán vannak. Ennek a határnak a meghatározása a terület legnagyobb tudományos kihívása.

Az informatika tudományának másik ága az, amelyet „szemantikának” hívnak. Ez a megírt programok jelentését próbálja megérteni és uralni, és például kimutatni, hogy egy program a legcsekélyebb tévedés nélkül valósít meg egy absztrakt módon elgondolt algoritmust. A szemantika alapjai egyrészt a görögökig, a logikai dedukció tanulmányozásáig, másrészt a 20. század eleji matematikai alapokig mennek vissza. A terület hatalmas lendületet kapott Church, Gödel és Turing munkái nyomán, még a számítógépek megjelenése előtt. Nagykorúvá akkor vált, amikor rájöttek, hogy a logikai és szemantikai megközelítések nélkülözhetetlenek a jól felépített és jól meghatározott programnyelvek létrehozásához: ezeknél a nyelveknél alapkérdés a minőségük, minthogy ők hordozzák a programírást. Végül a területen végbement tudományos előrelépés nyomán az is lehetővé vált, hogy kifejlesszék a programok vagy a chipek megfelelő viselkedésének matematikai verifikációs technikáit. Ez a tárgykör, amely nemrég még a tiszta tudományos kutatás terepéhez tartozott, ma már figyelemre méltó áttörést ért el az iparban, hiszen itt elsődleges érdek, hogy felderítsék az alattomos bugokat, még mielőtt a következményeiket el kellene viselni.

      MIHANCSIK ZSÓFIA FORDÍTÁSA

(A szerző 2001-ig az Alkalmazott matematikai kutatások központjának kutatási igazgatója, Párizs, École des Mines; azóta az Esterel Technologies tudományos igazgatója. Előadása 2000. szeptember 10-én hangzott el Párizsban az UTLS keretében.)
 


Kérjük küldje el véleményét címünkre: lettre@c3.hu


C3 Alapítványc3.hu/scripta/