2019. április 7., vasárnap

A software tesztelés problémái - nem teljesség


Mindig is bosszant, amikor akár egy operációs rendszerben, akár egy felhasználói programban bukkanok rá valamilyen hibára. Minél ostobább egy hiba, annál inkább tűnik érthetetlennek, hogy a mai korszerű programfejlesztő eszközökkel hogyan maradhatnak ilyen hibák egy termékben.

Talán mégsem annyira fejlett a programírás elmélete és gyakorlata, mint amennyire hinni szeretnénk ebben? Talán a kapkodás, a pénzhajhászás magyarázza a primitív hibák jelenlétét? Vagy valami egészen másról van szó?

Elkezdtem ezen gondolkodni, és elképzelni egy olyan tesztelő rendszert, amivel ki lehetne szűrni minden programozási és rendszer hibát. És arra jöttem rá, hogy ilyen rendszer nem készíthető, legalábbis ami a tesztek egyik fajtáját, a "black-box" (fekete-doboz, vagy külső) tesztelést illeti.

Ez olyan tesztelési technika, amikor a tesztelő nem rendelkezik a forrásprogrammal, csak a végleges termék van a kezében. Erről kell megállapítania, hogy hibátlan-e vagy sem. Mondjuk, hogy a kezében van a specifikáció, sorban ellenőrzi az abban foglalt elvárásokat, ha mindegyiket sorra vette, és nem talált a futtatás során hibát, akkor ugye hibátlannak tekinthető a vizsgált termék. Egyáltalán nem. A specifikáció ugyanis nem biztos, hogy tartalmazza a különleges eseteket is. Elfogy a hely a lemezen, elfogy a memória, megszakad a hálózati kapcsolat, a felhasználó olyan adatokat ad a programnak, amit a specifikáció szerint nem adhatna, de a felhasználó már csak ilyen, szándékosan, vagy véletlenül olyan feltételek közé viheti a programot, amire a specifikáció készítői nem gondoltak.

De még ha rendelkezünk is egy teljes specifikációval, amely minden határesetre és különleges helyzetre tartalmaz viselkedési leírást, akkor sem teljesíthetjük tökéletesen a tesztelési feladatunkat.

Ennek belátásához nézzünk meg egy nagyon egyszerű esetet, kapunk valahonnan egy max() függvényt (mondjuk egy DLL-ben), ami két egészet vár, és visszaadja a kettő közül a nagyobbikat. Le tudjuk-e úgy tesztelni black-box módszerrel ezt a függvényt, hogy kijelenthessük, a függvény 100%-osan hibamentes és minden körülmények között vissza fogja adni a két kapott egész érték közül a nagyobbat?

Írjunk egy tesztprogramot, tegyük bele a max(1, 2) és a max(2 ,1) hívást, mindkét esetben 2-t kell, hogy kapjunk eredményül. A biztonság kedvéért hívjuk meg a függvényt max(2, 2) módon is, ekkor is 2-t kell, hogy kapjunk. Készen vagyunk vajon a teszteléssel? A kód 100%-osan hibamentes?

Elvileg igen. A gyakorlatban számolnunk kell a rosszindulatú kódoló esetével, ez egy olyan programozó, aki szándékosan hibát rejt el a kódban, ezt ráadásul nagyon fondorlatos módokon tudja megtenni. Az elvileg 100%-osan hibamentes kódunk tehát valójában rengeteg hibát rejthet magában.

Mert mi van, ha a kódban van egy részlet, ami a kapott argumentumoktól függően működik, és ha valamelyik argumentum mondjuk 1 000 000, akkor nem a nagyobb, hanem a kisebb argumentumot adja vissza. Ezt csak úgy tudjuk tesztelni és a hibát detektálni, ha 1 000 000-ig mindenféle kombinációban meghívjuk a max() függvényt. És mivel nem tudhatjuk, hogy hol van a hiba elrejtve, ki kell próbálnunk nemcsak 1 000 000-ig, hanem a gépen ábrázolható maximális nagyságú egész számig minden hívás kombinációt.

Ez a teszt már tovább fog tartani, mint a legelső, lefuttatjuk, nem találunk hibát. Vajon 100%-osan hibátlannak nyilváníthatjuk most a függvényt?

Nem, még nem. A programozónk lehet még ennél is rosszindulatúbb, és elrejthet dátumhoz és időponthoz kötött hibát is. Ennek megtalálásához az összes elképzelhető dátumra és időpontra be kell állítanunk a gépünk óráját, és meg kell ismételnünk az összes lehetséges egész szám kombinációra a tesztet, hiszen a programozó a dátum-, és az argumentum vizsgálatot össze is kapcsolhatta úgy, hogy a függvény elképzelhető, hogy csak az elkövetkező ötven év egyetlen bizonyos másodpercében egyetlen kombinációra fog hibás választ adni, a többi esetben hibátlan lesz. De elég egyetlen hiba ahhoz, hogy a kódot ne tekinthessük tökéletesen hibamentesnek.

Azt hiszem, már látjuk a reménytelen jövőt. A rosszindulatú kódolónk az argumentumok és a rendszeridő mellé odaveheti a program méretét, az összes-, és a szabad memória méretét, azt, hogy egy bizonyos regiszterben páros-, vagy páratlan szám van-e éppen, letárolhatja, hogy hányszor hívták már meg, és ettől függően működik jól, vagy rosszul. Gyakorlatilag végtelenek a lehetőségek, emiatt pedig teljesen esélytelen, hogy emberi idő alatt végezzünk.

Persze mondhatjuk, hogy ezek a példák eléggé abszurd rosszindulatot tételeznek fel a kódolónk részéről, de mi most nem azt vizsgáltuk, hogy mennyire életszerű ez az elképzelés, hanem annak szerettünk volna utánajárni, hogy elvileg lehetséges-e a tökéletes black-box tesztelés.

Én az eddig elmondottak alapján bizonyítottnak látom, hogy külső eszközökkel nem állapítható meg egy programról, vagy kódról, hogy az hibátlan-e vagy sem. Még százalékos becslést sem tudunk mondani, hiszen nem tudjuk, hogy egy-egy felderített hibára hány felderítetlen jut.

Ezzel nem szeretném még véletlenül sem azt a látszatot kelteni, hogy felmentést érdemelnek mindazok, akik hibás kódot adnak ki a kezükből. Szó sincs erről. Egyszerűen tény, hogy a black-box tesztelés nem adhat nekünk teljes biztonságot.

Hogy akkor hol keressük a teljes biztonságot? Elsősorban a saját magunk számára készített saját kódunkban bízhatunk meg, hiszen arról tudjuk, hogy nem egy rosszindulatú kódoló írta, és nem abból a célból, hogy kárt okozzon vele. Másrészt fokozottan megbízhatunk azokban a nyílt forrású kódokban, amiket elvileg sokan ellenőrizhetnek, így kiderülhet, ha esetleg rosszindulatú kód van benne. Bár attól, hogy valami nyílt forrású, még nem biztos, hogy ellenőrzött. Elvileg minden nyílt forrású kód mellé kapnunk kellene egy ellenőrzési listát arról, hogy ki, mikor, milyen részeket, és milyen mélységig elemezte a kódot. Mondanom sem kell, ilyen manapság nem létezik, és elképzelni is nehéz hány ember-év kellene egy-egy nyílt forrású program ellenőrzési listájának elkészítéséhez. És ez a lista, csak az első módosításig lenne megbízható, utána felül kellene vizsgálni minden egyes módosítás után.

Mivel láttuk, hogy a black-box tesztelés milyen határok között megbízható, nézzük meg, hogy vajon javíthatunk-e a megbízhatóságán. Ehhez a "black-box"-ot valamennyire ki kell nyitnunk, azaz bele kell néznünk a kódba is. Ehhez nyomkövetőt, visszafordítót, vagy automatikus elemző programot használhatunk. Így már némileg több esélyünk van arra, hogy rátaláljunk egy-egy furcsa konstansra, vagy feltételes ugró utasításra, ami rosszindulatú kódra utalhat. Ez például egy max() függvény esetében még működhet is, de hát egy max() függvényt mi magunk is megírhatunk ahelyett, hogy a rengeteg időt az elemzésére fordítanánk. Csakhogy a kódok legtöbbször sokkal-sokkal bonyolultabbak a példánkban szereplő max() függvénynél. Egy nagyobb programban nyomkövetéssel, vagy visszafejtéssel rátalálni valamilyen rejtett kódra anélkül, hogy a teljes program működését megértenénk, nagyon nagy feladat.

Úgy néz ki tehát, hogy a "nyitott black-box" technikával, vagy akár a nyílt forrású kód elemzésével sem fogunk tudni eljutni a 100%-os bizonyosságig.

Hogy más eszközökkel juthatunk-e ennél messzebbre, arra példaként a legjobb, ha a víruskeresőket vizsgáljuk meg egy kicsit közelebbről, vajon ők milyen szintre jutottak a rosszindulatú kódok automatikus felderítésében. Sajnos azt mondhatjuk, nagyon sok a bizonytalanság. Amikor egy amúgy népszerű, széles körben használt, megvásárolt kereső heurisztikus elemzését kell kikapcsolni, mert olyan programokat töröl le, amik nélkül nem tudunk dolgozni (nem egyet saját magunk írtunk), akkor úgy tűnik, az elemzés vagy olyan kódot is gyanúsnak talál, ami nem az, vagy pedig túl engedékeny és elnéző, ezzel a valóban vírusos kódot is veszélytelennek mutatja.

Talán az automatikus kódelemzéstől 100%-os teljesítményt várni ugyanolyan lehetetlen elvárás, mint olyan program megírásában bízni, amely bármely másik programról megmondja, hogy végtelen ciklusba kerül-e, vagy megáll majd valamikor. Erről már tudjuk, hogy lehetetlen. Talán a kártékony kód és a programhibák automatikus elemzéssel történő 100%-os detektálása is ugyanilyen lehetetlen feladat. Erre persze nem tudok bizonyítással szolgálni.

Itt lenne az ideje annak, hogy valaki elkészítsen egy, Hilbert 23 pontos listájához (ami a matematika megoldandó problémáit sorolta fel) hasonló listát a nyitott, még megoldandó számítástechnikai problémákról, ezen a listán szerepelhetne a kérdés: "Lehetséges-e programhelyesség bizonyító programot írni, ha nem, akkor miért nem?". Talán már látjuk is a választ a kérdésre, valószínűleg a megállási probléma megoldhatatlansága a kulcs itt is.

Tudom, hogy ha elkészülne egy ilyen program, akkor először ennek a helyességéről kellene meggyőződni, és talán ez az az ok, ami miatt soha nem fog elkészülni ez a program sem...

Nyíregyháza, 2018. szeptember 27 - 2019. április 13.




2019. március 30., szombat

Miért nem hiszek az UFO történetekben?


 Időről-időre újra és újra felbukkannak az ismeretterjesztő TV csatornákon a különböző UFO észlelésekről szóló műsorok, legutóbb a roswelli incidens egy újabb feldolgozását láttam. Valószínűleg azért népszerűek ezek a műsorok, mert sokan szeretik a titkokat, sokak fantáziáját megmozgatja az idegen civilizációk földi látogatásának lehetősége, még többen vannak, akik egyszerűen csak a kormányukkal szembeni bizalmatlanságukat fejezik ki azzal, hogy elhiszik, a kormányuk összeesküvést sző a titkok leplezésére, és igaznak látszó hazugságok terjesztésével takarják el a valódi tényeket.

Amellett, hogy osztozok a mindenkori kormányokkal szembeni bizalmatlanságban, és azzal együtt, hogy mélyen hiszek a földönkívüli intelligens élet létezésében, eddig egyetlen olyan UFO történettel sem találkoztam, amit hitelesnek tudnék elfogadni. Talán a roswelli az egyetlen, ami jobban elgondolkodtatott, elsősorban azért, mert olyan szemtanúi vannak, akikről nagyon nehéz elhinni, hogy összetévesztenék egy meteorológiai ballon maradványait egy földönkívüli jármű roncsaival.
De a roswelli eset sem meggyőző, úgy gondolom, ha az amerikai hadseregnek a birtokában lenne egy idegen űrjármű, akkor nem lett volna hidegháború, és az űrkutatás sem ott tartana, ahol ma tart. Egy idegen technológia birtoklása elképzelhetetlen technikai forradalmat indított volna el, ennek pedig semmi nyomát nem látni. A jelenlegi fejlődés, akár az űrkutatást, akár a számítástechnikát nézzük, folyamatos, nem látszik rajta egyetlen óriási törés sem, ami idegen technológia befolyására utalna.
Egyetlen igazi oka van annak, hogy miért nem hiszek az UFO történetekben, és ez egyszerű és merőben racionális. Nem kell mást tennünk, csak el kell gondolkodni az ismert tényeken.

Egy olyan óriási Univerzumban élünk, ahol az eddigi egyetlen ismert élet, egy csillag körül megfelelő távolságban keringő bolygón alakult ki, ez a csillag egy galaxis tagja, a galaxissal együtt pedig egyre nagyobb és nagyobb struktúrák része. Ha elfogadjuk, hogy a földön kívüli élet is valami hasonló helyen keresendő, akkor feltehetjük, hogy valahol az Univerzum  valamely galaxisának valamelyik csillaga körül keringő bolygó hordozza a földönkívüli életet. Ez lehet egyetlen másik bolygó, de lehet megszámlálhatatlanul sok ilyen világ is.

Hogy egy földönkívüli civilizáció meglátogasson bennünket, ahhoz a jelenlegi ismereteink szerint olyan űrhajó szükséges, amely képes a két bolygó közötti űr átszelésére. Az eddigi UFO észlelések is idegen űrjárművekről szólnak, olyan nem fordul elő, hogy egy idegen lény csak úgy megjelenik, az észlelések mind különféle és különböző módon mozgó járművekről szólnak, ezek a járművek hordozzák az idegeneket.

A fizika ma ismert törvényei kizárják a fénysebességgel, vagy annál gyorsabban mozgó járművek építésének lehetőségét, első közelítésként tehát fogadjuk el, hogy az idegenek is csak korlátos sebességgel tudnak közlekedni az űrben. Azonban az biztos, hogy a mi jelenlegi űrtechnikánknál sokkal fejlettebb űrhajóépítési módszereik lehetnek, amivel megfelelően gyors járműveket tudnak készíteni a bolygók közötti távolság leküzdésére.

Ami azonban a legérdekesebb, az az, hogy teljesen mindegy, milyen gyors űrhajóik vannak, rendelkezhetnek akár a fény sebességénél nagyobb sebességre képes járművekkel is, a megjelenésük a Földön mindenképpen egy paradox jelenség.

Ha lassú űrhajóik vannak, akkor a civilizációnak a Földhöz közel kell lennie. Ebben az esetben azzal a problémával szembesülhetünk, hogy az élet az Univerzumban rendkívül gyakori. Ez ellentmondana annak a ténynek, hogy eddig még nem találtunk egyetlen idegen civilizációt sem.

Ha ezzel ellentétben gyors űrhajóik vannak, akár a fénysebesség többszörösével haladó járművek (fogadjuk el egyelőre ezt is, annak ellenére, hogy a jelenlegi tudásunk ezt kizárja), akkor viszont nagyon messziről kellene érkezniük, ami azt mutatná, hogy az élet igen ritka jelenség az Univerzumban, ekkor azzal a kérdéssel kell szembenéznünk, hogy miképpen voltak képesek megtalálni bennünket az óriási távolság ellenére.

Képzeljünk el egy bolygót, ahol a városok nagyjából egyforma távolságra vannak egymástól és minden városból kereskedők indulnak el a szomszédos városok felé. Ha sok város van a bolygón, akkor kicsi a távolság a városok között, egy-egy városból elindulva kevés kereskedő is könnyen rátalál a szomszédos városokra, de mivel sok közeli szomszédos város van, sok az idegen kereskedő az egyes városokban. Ha ezzel ellentétben kevés város található a bolygón, akkor ezek távol esnek egymástól, egy-egy városból nagyon sok kereskedőnek kell elindulnia minden irányban, és még így is nagyon kevesen fognak másik várost találni, az egyes városokban nagyon kevés idegen kereskedő lesz, de lehet, hogy nem lesz egyetlen egy sem.

Ha tehát az élet elterjedt az Univerzumban, akkor lassú űrhajókkal is már több civilizáció is meglátogatott volna bennünket, ha viszont az élet ritka jelenség, akkor nagyon kicsi az esély arra, hogy akár villámgyors űrhajókkal közlekedő idegenek is ránktaláljanak.
Ha tényleg komolyan vennénk az UFO észleléseket, ez azt jelentené, hogy az élet elterjedt jelenség az Univerzumban, ekkor azonban már a rádiótávcsöveknek is fognia kellett volna az idegen civilizációk jeleit. Ezek a műszerek eddig viszont semmilyen értelmes civilizációra utaló jelet nem fogtak. Furcsa lenne, hogy idegen űrhajók szelik át a kozmoszt, de a szülő civilizációjuk teljes rádiócsendben, észrevétlenül létezik valahol a közelben.

A közeli idegen civilizációk létezését tehát valószínűtlenné teszi a hallgatásuk. A távoliak esetében pedig ahogy azt már említettük, az a probléma, hogy nem tudnak bennünket megtalálni. A Föld nagyjából száz fényév sugarú körben szórta szét eddig a rádióhullámait, tehát csak arra van remény, hogy az ebben a térségben hallgatózó idegenek tudhatnak rólunk. Egy másik galaxisban lévő civilizációnak semmilyen esélye nincs arra, hogy ránktaláljon. Ha el is érne olyan messzire a Föld rádióhullám "szennyezése", annak már olyan kicsi lenne az energiája, hogy észlelhetetlen lenne. A jelenlegi elképzelések szerint a Galaxis 100-200 milliárd csillagot tartalmaz. Képzeljük el, hogy nekünk kellene ezek környezetét megvizsgálni, hogy rátaláljunk arra az egy-két bolygóra, ahol értelmes civilizáció lakik. Reménytelen vállalkozás. Még ha az utazás végtelen sebességgel történik is, a bolygók átvizsgálása mindenképpen időbe telik. Nagyon sok, nagyon gyors űrhajó kellene ahhoz, hogy ekkora teret átvizsgáljunk.

A paradoxon összefoglalva tehát így szól: vagy nagyon sok civilizáció van az Univerzumban, és akkor már többel találkoznunk is kellett volna, de ha mást nem, a rádiójeleiket már mindenképpen detektálnunk kellett volna, vagy nagyon ritka az élet, és akkor semmi esély a találkozásra.
Az UFO történetek egyik lehetőségnek sem felelnek meg: az első esetben hiányoznak a rádiójelek, a második esetben ott a kérdés, vajon hogyan találtak ránk.

Ezért nem hiszek az UFO történetekben, és ebben a pillanatban azt gondolom, hogy vagy teljesen egyedül vagyunk az egész Univerzumban, vagy olyan távol vagyunk egymástól, hogy a találkozásra csak több millió, vagy akár milliárd év múlva kerülhet csak sor, vagy pedig az Univerzum maga egészen más, mint amilyennek jelenleg észleljük és gondoljuk, és akkor bármi megtörténhet (ez utóbbi inkább egy olyan menekülő megoldás a számomra, és persze csupán feltételezés).

Mindenesetre a földön kívüli értelmes élet bizonyítékaként én csak kétségbevonhatatlan észleléseket tudok elfogadni: rádiójeleket, amik nem jöhettek természetes forrásból, egy idegen űrhajót teljes valóságában, vagy egy idegen élőlényt, aki olyan tudással rendelkezik, amit csak a csillagokból hozhatott magával. Minden egyebet, az asztro-archeológiától kezdve az UFO észlelésekig és az idegenek általi elrablásokat és orvosi kísérleteket is beleértve merő fikciónak tartok. Ezeket bármilyen, magukat szakértőnek mondó áltudósok bármilyen határozottan állítsanak is, bizonyítékként nem megfelelőek.

Az UFO üzlet virágzik, és virágozni is fog, mert mélyen mindenkiben benne van a csillagok utáni sóvárgás, a titkok megismerésének kísértő vágya, és annak reménye, hogy nem vagyunk egyedül az Univerzumban.

A tények elfogulatlan vizsgálata azonban egy olyan paradoxonhoz vezet, aminek a feloldása egyelőre nem lehetséges.

Nyíregyháza, 2018. október 15. - 2019. április 13.

2018. július 24., kedd

2018. július 20., péntek

Harmadnap

Harmadnapra a város elcsendesedett. Az idő két lépés között észrevétlen állapodott meg.

Mozdulatlan, hideg érzés csapott végig a házakon. A teremtés rosszkedvű napja volt az a nap. Minden mi elrendeltetett, megtörtént. Minden mi írva volt, elkövetkezett. Minden mi homályos volt, alakot öltött, és minden mi kérdés volt, válaszát meglelte azon a napon.

A próféta eleven sebeit szemlélve ült a világ képmása előtt. Nem volt tiszta, és nem volt bizonyos. Nem volt hitszegő, és nem alkudott egykönnyen. Félt, mert egyedül maradt. Elkoptak mellőle mind az illúziók. Elfogytak előle mind a választható utak, elkerülte minden, ami evilági.

Már csak egyetlen jelet látott. Fényesen és ragyogva égett a jel a bőrére festve, átsütött a húsán, a fénylés láthatóvá tette összetört csontjait. A jel nem kopott el sohasem. Nem fogta sem víz, sem eső, sem tenger, nem fakította nap, nem halványította idő és feledés.

A jel csupán hitvány utánzata volt annak a valaminek, ami a próféta egész életében, hol nyilvánvalóan, hol mélyen lapulva, de ott volt benne, az agyában, a szívében, minden sejtjében és minden egyes molekulájában.

A jel csupán kiválasztotta őt, csupán nem hagyta, hogy olyan legyen, mint a többiek. De ez a jel, nem a könnyű jelek közül való volt. Nem mutatott és nem informált. Nem kérdezett és nem válaszolt.

Csak ott volt, kitörölhetetlenül és megtagadhatatlanul.

A próféta elvesztette mindenét, ami ezen a jelen kívül eddig neki jutott ebből a világból. És ő megértette, hogy soha nem is lesz más, ami igazán az övé lehet. Meg kell elégednie ezzel, nem várhat, nem kérhet, nem követelhet egyebet.

És minden mi ezen kívül van, érdektelen és megszerezhető.

A software tesztelés problémái - nem teljesség

Mindig is bosszant, amikor akár egy operációs rendszerben, akár egy felhasználói programban bukkanok rá valamilyen hibára. Minél ostobább ...