1. A problémamegoldás és a számítógép

A hétköznapi életünkben nap, mint nap meg kell oldanunk bizonyos problémákat. Készíteni egy szendvicset, felhívni egy régi ismerőst vagy megjavítani egy defektes bicikligumit. Többé-kevésbé ismerjük a megoldás mikéntjét. Egyes helyzetekben gondolkodás nélkül tudjuk, mit kell éppen tennünk, néha azonban a cél elérése egy összetett folyamat és talán még útmutatást is kell kérnünk. Habár a problémamegoldás képessége egy fontos tulajdonsága az embereknek, sok esetben számítógépet alkalmazunk a megoldás megtalálása érdekében. A számítógépek alapvetően csak néhány elemi feladat elvégzésére képesek, ezért a programozó feladata az, hogy lehetővé tegye a cél elérését az egyszerű lépések megfelelő alkalmazása által. Bizonyos problémák megoldására tehát egy programot, egy szoftvert kell fejlesztenünk, melyet egy számítógépen futtatva megkaphatjuk a kívánt eredményt.

Általánosságban véve a számítógéppel történő problémamegoldás folyamatát 7 lépésre bonthatjuk, amelyeket az alábbi ábra összegez.

A számítógépes problémamegoldás 7 lépése

Kövessük végig ezt a folyamatot lépésenként!

  1. A probléma definiálás:

Első lépésként tisztáznunk kell, mi is a pontos feladat. Mi az elvárt eredmény? Mi az ismeretlen? Első közelítésben egy egyenlet megoldása egy számérték meghatározását jelenti, amely révén az egyenlet két oldala azonos értékűnek bizonyul. Felmerülhetnek azonban kérdések. Csak egyetlen ilyen érték van vagy több is? Biztos, hogy mindig létezik ilyen érték? Milyen típusú értéket várunk el? Elfogadható-e negatív, tört vagy komplex szám megoldásként? Lehet-e egy egyenlet megoldása egy függvény?

Tudnunk kell továbbá azt is, hogy mi az összefüggés a rendelkezésre álló információk és az ismeretlen között. Tegyük fel, hogy adott három szakasz és azt kell megmondanunk, hogy szerkeszthető-e belőlük egy háromszög. Ekkor a rendelkezésre álló információ 3 pozitív szám az elvárt válasz pedig egy logikai jellegű érték: igen vagy nem. Mi az összefüggés közöttük? Elegendő-e egyáltalán a megadott input a megoldás megtalálásához? Geometriánál maradva például egy téglalap oldalainak hosszából meghatározható annak területe, azonban a terület ismert mértéke nem határozza meg egyértelműen a téglalap oldalhosszúságait. Ezt tudnunk kell, mielőtt elkezdünk egy programot írni a megoldás megtalálására.

A feladat megfogalmazásának mindig pontosnak, precíznek kell lennie. Nem lehet félreérthető, mindenki számára ugyanazt kell, hogy jelentse. Az az elvárás, hogy „egy alkalmazás mindenki számára jól használható legyen”, nem egy megfelelő feladatleírás. Csak PC-re vonatkozik a feltétel vagy mobiltelefonra is? A mindenki alatt vakokat és gyengén látókat is kell érteni? Mi a helyzet a nyelvi korlátokkal? A programozó létrehozza a szoftver terméket, a felhasználó pedig majd ezzel megoldja az adott problémáit. Ebben a fázisban a két félnek szorosan együtt kell működnie. Az igényeknek és a lehetőségeknek találkozniuk kell. Hiába akar a felhasználó egy kis felbontású képet óriási méretű éles képpé alakítani, ha a programozó tudja, hogy ez az adott körülmények között lehetetlen. A folyamat végére a problémának (bele értve az elérhető bemenetet és az elvárt kimentet is) és a megoldás körülményeinek olyan teljeskörű specifikációja kell, hogy létrejöjjön, amellyel a felhasználó (megrendelő) és a programozó is egyet ért.

  1. Megoldási vázlat:

Miután a feladat adott, a megoldás menetének körvonalait kell megfogalmazni. A probléma általában összetett és szerteágazó, gyakran számos részproblémát tartalmaz. Ezeket a részfeladatokat kell megfogalmaznunk, elhatárolnunk őket egymástól. Fel kell tárnunk továbbá a köztük lévő viszonyt is. Ha a részfeladat még mindig túl komplex érdemes tovább bontani. Előbb utóbb részfeladatok olyan halmazát kapjuk, amelynek minden eleme egy viszonylag egyszerűen kezelhető probléma. Ezen apróbb problémáknak a megoldásával elő kell, hogy álljon az eredeti nagy probléma megoldása. Követve az „oszd meg és uralkodj” elvet azonosíthatjuk a végső megoldás komponenseit. Ez egy halmaz, azaz nincs közöttük például sorrend. Ha létre szeretnénk hozni egy email klienst, akkor ezeket a komponenseket (a teljesség igénye nélkül) például az alábbi ún. break-out diagrammal is szemléltethetjük.

Egy feladat részproblémára bontásának szemléltetése :width:  5cm
  1. Részletes megoldási terv:

Az előző szinten tehát még nem ismerjük a részproblémák megoldásának pontos menetét, csak körülhatároltuk őket. Finomításra van szükség a részletek megadásával. Meg kell adni egy módszert, egy tevékenység-sorozatot, amelyet követve minden esetben egyértelműen megkapjuk a megoldást véges számú lépés után. Ezt nevezzük majd a későbbiekben algoritmus-nak. Ez a fogalom központi szerepet játszik ebben a jegyzetben, a későbbiek során részletesen tárgyalásra kerül. Megismerkedhetünk majd tulajdonságaival, módosítási lehetőségeivel valamint a leírására szolgáló különböző eszközrendszerekkel. Egyelőre gondoljunk rá úgy, mint egy jó szakácskönyvre. Pontosan megadja milyen alapanyagból, mekkora mennyiséget, milyen sorrendben kell felhasználni és közben milyen műveleteket kell velük végezni.

  1. Tesztelési stratégia fejlesztés:

Amikor készítünk egy megoldási útmutatót (azaz algoritmust), akkor meg kell tudnunk azt, hogy biztosan jól működik-e. Előfordulhat, hogy tévedünk vagy, hogy nem vettünk figyelembe minden eshetőséget. Hogy meggyőződjünk az algoritmus helyességéről, ki kell azt próbálnunk. Bizonyos bemeneti adatok esetén tényleg az elvárt eredményt szolgáltatja-e? Mindig szolgáltat-e eredményt? Ugyanarra a bemenetre minden esetben ugyanazt a kimenetet adja? A próbálkozások során alkalmazott input kombinációkat teszteset-eknek hívjuk. A fejlesztés során készítenünk kell egy teszteset készletet, amellyel a lehető legszélesebb körben tudjuk vizsgálni a működést. Nem csak az alap eseteket kell tesztelnünk, hanem a szélsőségeket is. Például ha meg szeretnénk vizsgálni, hogy egy matematikai műveletet végrehajtó algoritmus jó-e, tudnunk kell, hogy helyes eredményt ad-e ha az operandusai között van nulla, negatív vagy tört érték. Ha a tesztek során bármikor azt tapasztaljuk, hogy az algoritmus vagy a megvalósítása nem működik megfelelő módon, akkor előlröl kell kezdenünk a fejlesztés folyamatát. Lehet, hogy csak az algoritmus kigondolása közben nem kezeltünk jól egy esetet, az is előfordulhat, hogy a részprobléma definíciója volt hibás, vagy akár az eredeti probléma pontatlan leírása volt a teszt elbukásának oka.

  1. A program kódolás és tesztelés:

Az elkészített és tesztelt algoritmus általában nem hajtható végre egy számítógépen. Egy adott reprezentációs technikával elkészült végrehajtási útmutatót a számítógép által is érthető formába kell öntenünk. A lépéssorozatot át kell alakítani egy konkrét programozási nyelvre. Létre kell hoznunk a program kódját.

A teszteset készletet nem csak a korábban „papíron” létező algoritmus tesztelésére használjuk, hanem a megvalósítás során is, amikor már konkrét programnyelven írt kód és a valós számítógépes program működésének helyességét szeretnénk ellenőrizni. Előfordulhat például, hogy két egész szám szorzására vonatkozó algoritmusunk elméletben helyesen működik, de a megvalósítás során használt eszközök bizonyos korlátok között tudnak csak megfelelő módon működni. Ez ilyen helyzetekből származó hibákat is ki kell tudnunk szűrni. A kódolás és tesztelés együttes folyamatát szoktuk implementáció-nak is hívni.

Ezzel a területtel az egyetemi hallgatók a „Programozási nyelvek” című tantárgyak keretében ismerkedhetnek meg részletesen. Ennek bemutatása már túlmutat a jelen jegyzet keretein.

  1. Dokumentáció befejezés:

Nem elegendő csak az szoftvernek az elkészítése, a fejlesztés teljes folyamatát dokumentálnunk kell, így a dokumentáció végigkíséri a szoftver teljes életpályáját. Tartalmaznia kell a fejlesztés fontosabb lépéseinek részletes leírását: a probléma/feladat pontos megfogalmazását, a felismert részproblémákat és kapcsolataikat, a meghozott strukturális döntéseket, a feltárt problémákat és azok megoldására tett lépéseket, az alkalmazott algoritmusokat és adatszerkezeteket, a program forrását magyarázatokkal, a változások nyomon követésére szolgáló bejegyzéseket, felhasználói útmutatót, stb. Ezeket tehát folyamatosan vezetni kell és miután elkészült a szoftver termék a dokumentációnak is rendelkezésre kell állnia.

  1. Karbantartás:

Egy program nem kopik el, nem megy tönkre, mégis szükség van bizonyos karbantartásra. Néha hibás működést tapasztalhatunk, esetleg a program összeomolhat. Ezeknek a problémáknak az az oka, hogy bizonyos esetekben nem volt megfelelően tesztelve. Természetesen nem vizsgálhatunk meg a fejlesztés során végtelen sok input kombinációt és körülményt. Lehetnek esetek, amelyek a fejlesztés alatt rejtve maradnak és csak az intenzív valós felhasználás során kerülnek elő. Az újonnan felmerült hibákat ki kell küszöbölni (a termék átadása után is).

Egyes esetekben a felhasználók igényei, elvárásai változnak meg, esetleg új funkciókat kiegészítéseket kérnek. Netán jogi vagy technológiai változások miatt válik időszerűvé a változtatás. Vannak például hibátlanul működő programok DOS rendszere, amelyeket esetleg a modern operációs rendszerek nem támogatnak. Más esetben előfordulhat, hogy egy PC-s alkalmazás helyett át szeretnénk térni egy online webes felület használatára. Ezekben az esetekben is módosítani kell az eredeti koncepciót. Ne feledkezzünk meg viszont arról, hogy minden a szoftvert érintő változtatás, módosítás meg kell, hogy jelenjen a dokumentációban, így annak folyamatos frissítése szüksége.

Néha az új igényeket kielégítő változtatások olyan mértékűek, hogy óriási erőfeszítést igényelne a program „életben tartása”. Ilyenkor érdemes az egész fejlesztési folyamatot az elejéről indítani és kifejleszteni egy új program terméket. Ezzel tehát a szoftver életciklusa lezárul és újraindul egy másik szoftver kifejlesztésével.

1.1. Kérdések, feladatok

  • Oszd fel részproblémákra egy önmagában elég összetett postai cím eltárolását! Milyen logikailag független adatelemeket tartalmaz egy cím?

  • Határozd meg azokat a részfeladatokat, amelyeket egy egyszerű képszerkesztő programnak (pl. MS Paint) kell megvalósítania! [S102] (A megoldást megtalálod az azonosító alapján a 9. fejezetben.)

  • Magyarázd meg, miért vannak sok szoftvernek újabb és újabb verziói!

  • Keress valódi programdokumentációkat az Interneten!