Gépi tanuláson alapuló megoldások programozás során.

A következő cikkben megpróbáljuk felmérni, milyen lehetőségeink vannak jelenleg a mesterséges intelligencia és a gépi tanulás eszközeinek használatára az átlagos programozói tevékenység során.

Előszó

Két hete egy baráti grill-party keretében a jelen lévő – jellemzően fejlesztő, illetve projektvezető – informatikusok között feljött a téma: a mostanában feltörekvő gépi tanulás által megtámogatott mesterséges intelligencia megoldásokat hogyan tudnánk esetleg a napi munkánk során felhasználni a programfejlesztés folyamatában? Elsődleges cél, hogy az általános programozási tevékenységet próbáljuk meg támogatni azért, hogy jobb minőségben (kevesebb hibával, a megrendelői elvárásoknak még jobban megfelelve), gyorsabban és kevesebb munkával álljon elő a produktum.

Miért is foglalkozunk most ezzel?

A négy legnagyobb IT óriás (Apple, Microsoft, Amazon, Google) az elmúlt időszakban kiemelt hangsúlyt fektet a saját mesterséges intelligencia megoldásaira. Fokozatosan teszik egyre nagyobb mértékben elérhetővé a nagyközönség számára is az egyes eszközeiket jórészt ingyenes megoldások keretében. (Tegyük hozzá, hogy bőven megéri neki ingyenesen elérhetővé tenni az gépi tanulási rendszereik API-jait, mivel a rajtuk átfuttatott adatok sokszínűsége számtalan egyéb tudományterületen és piaci alkalmazásban is felhasználhatóak később, amelyek profitjait már ők arathatják le.) Mára már a jól dokumentált, példa programokkal bíró gépi tanulási rendszerek nagyon könnyen felhasználhatóak saját projektekre, bőven adnak lehetőséget a kísérletezésre.

Nap mint nap jelennek meg cikkek arról, hogy a jövőben mely szakmákat fogják teljesen kiváltani a mesterséges intelligencia alapú megoldások. Ezek némelyike eléggé elrugaszkodik a valóságtól, de szinte mindegyikben közös, hogy az alkalmazott mesterséges intelligenciákat mint egy támogató eszközt alkalmazzák a különböző feladatok elvégzéséhez, nem pedig egy-az-egyben az emberi tényező kiiktatására törekednek. Közös céljuk, hogy a munkavégzésben adódó manuális és időrabló tevékenységeket a lehető legnagyobb mértékben kiiktassák a folyamatokból meghagyva a humán faktor számára azokat a kritikus pontokat, amelyekre valójában koncentrálni kell mert nem automatizálható vagy biztonsági okokból nem nélkülözhető ott az emberi közreműködés.

Ha az általános programozási tevékenységünk során megtaláljuk azokat a pontokat, amelyek akár manuális munkaigényük miatt, akár mert elemi döntési lépésekből felépíthetőek könnyen “kiszervezhetőek” egy gépi tanulással bíró mesterséges intelligencia alapú rendszerbe, relatíve könnyen létre tudunk hozni egy kísérleti projektet az új eszköz használatára.

Nézzünk is pár példát, mely olyan fejlesztési lépéseket találhatunk, ahol hozhat eredményt egy ilyen rendszer alkalmazása:

A code review támogatása

A fejlesztői közegben manapság leginkább használatos ún. Agilis módszertanokban rendre felbukkanó ún. code review folyamata számos egyszerű eszközzel támogatható (ezekről pár példák egy korábbi cikkünkben is megemlítettünk), azonban ezek jórészt előre definiált szempontok szerint ellenőrzik az elkészített kód minőségét. Ide tartozik többek között a klasszikus hibakereső funkciót, a szintaktikai ellenőrzést, a felesleges ismétlődéseket figyelő megoldások, illetve a belső kódkonvenciónak való megfelelést ellenőrző eljárások.

A code review során azonban nemcsak a fentieknek történő megfelelést (ún. statikus kódellenőrzés) kell ellenőrizni, hanem egyfajta minőségellenőrzésre is használható (pl. könnyen érthető-e más fejlesztő számára az elkészült kód), ezt hívják dinamikus kódellenőrzésnek. A dinamikus kódellenőrzés eszközrendszerébe tartozik pl. megfelelő tesztlefedettség ellenőrzése, az egységbe zártságot, a közös használható common lib-ek felüldefiniálásait/módosításait/kiterjesztéseit, a megfelelő mértékű dokumentáltságot, a tervezési hibákat, a karbantarthatóság hiányosságait,  a hibás interfész-specifikációk meglétét ellenőrző módszerek. A code review során ezeket az ellenőrzéseket eddig jellemzően legalább egy külső (nem az adott kódváltoztatásért felelős) fejlesztő végezte el, többnyire kézi munkával. Az újonnan rendelkezésünkre álló szabad mesterséges intelligencia megoldások révén, azonban már ezekre a feladatokra mind felhasználhatunk egy gépi tanuláson alapuló mesterséges intelligencia alapú rendszert, amelyet megfelelő mennyiségű code review riporttal megtámogatva akár az alkalmazott programozási nyelvhez / adatbázis kiszolgálóhoz tudjuk “illeszteni” az eszközünk. Fontos azonban megjegyezni, hogy a tanulási folyamat elején mindenképpen legalább egy vezető fejlesztő tudással rendelkező humán kontroll is értékelje az új rendszer által jelzett eltéréseket!

Tesztesetek generálása

Szorosan kapcsolódik a fejlesztéshez – akármelyik fejlesztési módszertan szerint is dolgozunk – az elkészült program(rész) tesztelése. Akár egységtesztekről (unit teszt), akár integrációs tesztekről beszélünk az egyes teszt forgatókönyvek minden különösebb nehézség nélkül előállíthatóak akár egy scriptnyelv támogatásával, akár egy erre specializált alkalmazással.
Azonban az alapesetektől eltekintve az ilyen eszközök a bonyolúltabb teszt forgatókönyveket már képtelenek előállítani. Ilyenkor lehet és érdemes felhasználni a gépi tanuláson alapuló mesterséges intelligencia rendszereket: ezekkel kell elkészíteni a teszteseteket generáló scriptek és alkalmazások számára a tesztek funkcionális vázát. Belátható, hogy minél jobb tesztlefedettséggel rendelkezik egy alkalmazás, annál könnyebben vezethető be continous deployment, ami – ügyesen és ésszel használva – jelentős terhet vesz le a fejlesztők válláról.
Az elkészült programmódosításokat egy mesterséges intelligencia alapú teszt-eset ellenőrző és generáló alkalmazáson “átengedve” jelentős mértékű tesztelői erőforrást szabadíthatunk fel, mivel a meglévő teszt forgatókönyvek minőségének / mennyiségének ellenőrzésére sokkal kevesebb figyelmet kell fordítani, ráadásul a rendszer a folyamatos tanulás révén egyre bonyolultabb tesztesetek előállítását is elvégezheti.

Funkcionális specifikáció feldoglozása, mock-olt funkciók létrehozása

A ma legtöbb helyen alkalmazott, számos eltérő módon implementált Agilis módszertan megoldások közös sajátossága, hogy a megrendelőtől megkapott vagy az interjúk során elhangzottakból készített funkcionális specifikáció “kezdeményt” a product owner-nek / projektvezetőnek jelentős idő ráfordításával kell az adott fejlesztői csapatot ismerve, az ő szájuk íze szerinti módon megfogalmazva önálló story-kká fordítania. Külön szakirodalma van a storykészítési technikáknak, így attól most tekintsünk is el, koncentráljunk inkább arra, milyen módon tudnák a fejlesztési munka ezen részén egyszerűsíteni.

Szinten minden épeszű product owner korábbi meglévő saját story-jaiból merít a munkája során: ha egyszer az agilis csapaton már “átment” egy story (megértették, megtervezték, becsülték többször is, elkészítették, tesztelték), akkor az ott használt csapaton belüli leíró nyelv megfogalmazásai biztosan érthetőek számukra, s kevés bizonytalanságot okoz annak újbóli használata.
Viszont ha egy jól használható, kellően “betanított” gépi tanulással bíró rendszerrel megtámogatjuk a story-készítés “favágó”, jelentős manuális munkáját igénylő részt, akkor a PO-ról, illetve a neki “besegítő” BA(k)-ról nagyfokú terhelést tudunk levenni, ráadásul az elkészített story-k minősége is egységesedik. A folyamatosan bővített tudással bíró mesterséges intelligencia alapú rendszerrel fokozatosan egyre bonyolultabb story-k alkothatóak, egyre vázlatosabb specifikáció / interjúvázlat alapján. Gyakran élünk a fejlesztési feladatok ütemezése során azzal a megoldással amikor is egy, a jövőben elkészítendő programrészt / modult a fejlesztés elején nem definiálunk kellően, nem dolgozzuk ki a belső működését kapcsolatait mivel a fejlesztés aktuális fázisában elegendő számunkra csak a külső rendszerekkel/modulokkal való kapcsolatával, interface-ekkel foglalkozni. Ilyen, ún. mock-olt funkciók létrehozásában is kényelmesen felhasználható egy-egy gépi tanulásos rendszer mivel a belső működési megoldások definiálásának minimalizálására törekszik és csak a külső kapcsolatok megfelelősségére tartalmaz előírásokat az általa létrehozott story-k összessége.

Continous delivery

Ma már szinten minden közepesebb-nagyobb fejlesztői csapatnál megjelenik a CD iránti igény. Egyrészt, mert maga a megrendelő várja el, másrészt mert a csapat fejlődött szépen lassan arra a szintre, hogy képes a CD által megfogalmazott szintű produktum folyamatos biztosítására.
Ennek egyik elengedhetetlen feltétele a megfelelő szintű monitorozás. Ilyenkor azonban kiemelten fontos, hogy ne csak a kiszolgáló környezet (alkalmazás-szerver, adatbázis-szerver, log architektúra, stb.) monitorozzuk, hanem magának az alkalmazásnak a belső működését is. Hol lehetnek szűkületek, hogy kell a felhasználónak feleslegesen sokat időzni, mik a tipikus funkció/folyamat bejárási útvonalak, gyakori riportok, stb.
Tudatosan fel kell készíteni az alkalmazásunk az ilyen információk gyűjtésére is, ezáltal biztosítva a megfelelően gyakori fejlesztői elemzést, amelyet követően tovább javíthatjuk akár az alkalmazás működését, akár csak a felhasználói élményt.
Egy gépi tanulással megtámogatott mesterséges intelligencia alapú belső monitoring rendszer hasznos kiegészítése lehet a csupán infrastruktúrális elemeket monitorozó korábbi megoldásoknak. Segítségével könnyen azonosíthatóak azok a jellemző felhasználói szokások, amelyek egy-egy speciális alkalmazás viselkedésért, helyzetért felelősek.
Szerencsés esetben akár egy nagyobb terhelési csúcsot is előre tudnak ezek a rendszerek jelezni, amelyet lekezelve automata módon indíthatunk új node-okat az alkalmazásunk kiszolgálására, vagy ha a rendszer arra utaló nyomokat észlel, akár egy rendszer szintű összeomlást is megelőzhetünk egy időben elindított auto-recovery környezet elindításával (tehát akár a DRP folyamataink bemeneteként is felhasználhatjuk a mesterséges intelligencia alapú megoldások kimenetét).

Összefoglalás

Úgy tűnik, nem légből kapott mondás, ha azt mondjuk: már napjainkban is van létjogosultsága a különböző gépi tanuláson alapuló mesterséges intelligencia rendszerek alkalmazásának a fejlesztési tevékenységek során. Ezek segítségével egy összetett rendszer kialakítása, üzemeltetése, folyamatos továbbfejlesztési hatékonyabban megvalósítható. Merjünk kísérletezni, merjünk új eszközöket és megoldásokat találni magunk számára, hogy segítségükkel kevesebb erőforrás ráfordítással, hatékonyabb és jobb minőségűbb alkalmazásokat készíthessünk.

Felhasznált irodalmak: