A digitális ipar már több, mint fél évszázados múltra tekint vissza. A szoftverfejlesztés a 70-es és 80-as években kezdett erőre kapni, de az internetes technológiák fejlődésével új szintre lépett és most már szinte teljesen körülvesznek minket a különböző digitális eszközök, amelyek működését legalább néhány sornyi programkód vezérli.

A mesterséges intelligencia megoldásai hasonló ugrást is jelenthetnek majd, mint amit az internet fejlődése jelent - nem kizárt, hogy a közeljövőben a programokat is programok írják majd…

A szoftverfejlesztés lépései

A szoftver nem más, mint parancsok sorozata, amelyet a számítógép (hardver) végrehajt. A szoftvert mindig egy speciális feladatra hozzák létre, tehát egy felmerülő problémára készítünk vele megoldást. A fejlesztés lépései az alábbiak:

1. A probléma definíciója: pontosan mit szeretnék megoldani az új szoftverrel?

2. A szükséges részegységek meghatározása

Szinte minden szoftverben három fő részegységet lehet elkülöníteni, ezek:

  • Adatbázis: az adatok gyűjteménye, amelyekből dolgozik a szoftver
  • Back-end: a szoftver motorja, a konkrét tevékenységeket lefuttató kódrészek
  • Front-end: a szoftver irányítását és rendszerbe illesztését lehetővé tevő felület

3. A fő probléma alproblémákra bontása, és az ezekért felelős programrészek elkészítési sorrendjének meghatározása

A szoftverfejlesztésnél különösen fontos a munka megszervezése, hiszen a különböző részek egymásra is hathatnak. A pontatlan szervezés ellehetetlenítheti a kívánt működés elérését.

4. Sétáló Csontváz (Walking Skeleton)

A minimális működése, a nulladik verzió: már tudja a lényeget, de csak azt.

5. Tesztelések indítása és Verziókövetés

A tesztelés és a további funkciók hozzáadása során több különböző verzió létezik párhuzamosan, a szoftver fejlesztésének kompexitása itt bonyolódik tovább, többféle verzió létezik párhuzamosan, amelyek később egy végső verzióvá állnak majd össze.

6. Béta

A béta az az állapot, amikor a termék összeállt és koncepcionálisan már készen áll, innentől a hibák kiküszöbölése, további optimalizálás jöhet szóba.

7. Végső verzió

A késznek nyilvánított termék. A szoftver mindig fejleszthető tovább, de ezek újabb verziónak számítanak már.

A szoftverfejlesztés története a programnyelvek története is

Programnyelvek története [https://www.thesoftwareguild.com/blog/history-of-programming-languages/]

A különböző programozási kódrendszerek fejlődése sosem áll meg, az egyedi programnyelvek egyesével is bővülnek, gazdagodnak, de teljesen új rendszerek is viszonylag gyakran felmerülnek.

A programnyelvek a szoftverfejlesztésben leginkább a feladatkör alapján csoportosulnak: bizonyos nyelveket használunk adott feladatokra, más nyelveket másra, illetve idővel egy régi nyelv már nem tudja tartani a lépést a kor kihívásaival és kikopik a szoftverfejlesztés világából.

A gépi instrukciók egyik legősibb programnyelve a C. 1972 óta létezik,  és ma is használatos, többféle verziója létezik és számos újabb programnyelv merített belőle. A html elengedhetetlen volt a weboldalak megjelenítéséhez, a php pedig a webhez szolgáltatott háttérmegoldásokat. Ahhoz, hogy nagyobb adatbázisokkal is dolgozhassunk webes eszközökön, kellett az SQL, a webet böngésző szoftverekhez jött létre a JavaScript, a 90-es évek közepén, és a webes programozás egyik alapvető nyelvévé vált.

A szoftverek elég hamar kiléptek a számítógépekről, és számtalan különböző alkalmazott rendszerben, eszközben, készülékben jelentek meg a digitális technológia térhódításával. Emiatt felmerült az igény olyan programnyelvekre, amelyek platformtól függetlenül tudnak futni, bármilyen eszközön és környezetben: erre szállított megoldást a JAVA, és ma is a világ egyik legnépszerűbb programnyelve.

Az újabb generációs nyelvek közül meg kell említeni a Ruby-t, ami a 90-es évek közepén született, de később a webes alkalmazások fejlesztésében jelentős szerep jutott neki, illetve a 2014-ben debütáló Swiftet, amit az Apple hozott létre, de nyílt forráskódú rendszerként bárki használhatja, aki az almás termékekre szeretne szoftvert fejleszteni.

A végére hagytuk a szintén hírneves Python nevű nyelvet. Ez egy “magas szintű” nyelv, vagyis szinte bármire használható, semmiben sem kiemelkedő. Bár már elmúlt 30 éves, megkerülhetetlenné vált, és az elmúlt években meglehetősen komoly a felhajtás körülötte, hiszen ez lett az egyik alap nyelv gépi tanulás területén, a jó öreg C bizonyos verziói mellett.

Természetesen ez csak egy esetleges felsorolás - többszáz működő programnyelv létezik ma már, és bármeddig lehetne vitatkozni azon, hogy melyek a legfontosabbak.

Milyen szoftvereket használ a Lexunit?

Lexunit által használt machine learning / data science library-k

Napjainkban egy olyan fejlesztőcsapat, mint a Lexunit, sokféle programnyelvet ismer és ezek közül jópárat gyakran használ is. A mi esetünkben, feladatrészek szerint nagyjából így fest most a paletta:

React.js - Ez egy JavaScript könyvtár, ami felhasználói felületek (UI) tervezéséhez hasznos

TypeScript - Ez szintén JS, egy speciális fejlesztés, ami az igazán komplex projektekben gyorsítja meg a munkát

Node.js - egy JS fejlesztői környezet, a webes projektjeink során ebben tesztelünk

Python - ezt a sokoldalú programnyelvet mi is többféle dologra használjuk, többek közt a Machine Learning projektjeink során általában ezt a programnyelvet használva írunk a felhasználandó paraméterek statisztikai analízisére készülő programokat

Go - a C távoli leszármazottja, komplex rendszerek fejlesztéséhez használatos programnyelv, a kor követelményeihez igazodva

A közeli jövő - Programozó programok?

A programnyelvek fejlődésében régóta meg lehet tapasztalni azt, hogy egy újabb nyelv képessé válik olyan folyamatok automatikus elvégzésére, amelyeket régebben még le kellett programozni. A programok is képesek programokat futtatni, egy egyszerű weboldal betöltése során is akár 5-6 különböző programnyelven írt kódrészlet, webalapú alkalmazás dolgozik azon, hogy az adott tartalom a szemünk elé kerüljön úgy, ahogy alkotói azt elképzelték.

Az úgynevezett “IDE”-k (Integrated Development Environment, integrált fejlesztési környezet) olyan komplett fejlesztői környezetek, amelyekben más programokat lehet létrehozni anélkül, hogy a “nulláról” megírnánk a kódot. Nem kell feltétlenül a legkomolyabb szakmai felkészültséget igénylő rendszerekre gondolni, sőt, ezek egyik fő célja hogy komplex műveleteket egyszerű, akár vizuális felületeken megvalósíthatóvá tegyen. Alapvető informatikai, számítástechnikai képzéseken is lehet már találkozni a Microsoft Visual C-vel például.

Ezekben a szoftverekben programok forráskódjait lehet szerkeszteni, a programokat egy szeparált környezetben futtatni, és “debugolni”, vagyis automatikus hibakereséseket indítani.

Viszont a szoftverfejlesztés és a gépi tanulás az ilyen rendszerekben jól össze tud hangolódni. Már vannak olyan programíró alkalmazások, amelyekben van valamilyen “AI”. Ahogy az online szövegszerkesztőkben és akár a Gmailben is találkozhatunk már azzal a jelenséggel, hogy a szoftver felismeri, mi a legvalószínűbb következő szó, amit írni akarunk, és felajánlja nekünk, hogy egyetlen gombnyomással beírjuk azt a szót, ugyanígy kellő tapasztalatszerzés után egész programkód-részleteket ajánlhat fel nekünk beillesztésre az IDE algoritmusa a kódba, amin éppen dolgozunk.

Ész az égben: komplex programozási környezetek a felhőben

Egy korábbi posztunkban a “felhő” fogalmát jártuk körül, és leírtuk, hogy miért olyan fontosak most a nagy tech cégek által kínált komplex felhőalkalmazások, mint az Azure, vagy az AWS. A nagy hardverigényű tevékenységekhez “bérelhetünk” kapacitásokat ezeken a platformokon. Olyan tevékenységeknek a kiszervezésére nyílnak lehetőségek, ami még 2-3 éve is nehezen lett volna elképzelhető. Ezeknek a felhőszolgáltatásoknak a fejlődése a legutóbbi évek talán legjelentősebb fejleménye az egész szoftveripar terén.

A közeli jövőben pedig a szoftverfejlesztés terén is egyre komolyabb segítséget fognak tudni nyújtani ezek a felhőrendszerek, ami kétirányú folyamat:

Egyrészt eddig elképzelhetetlenül egyszerűvé válhat sok olyan feladat, amelyhez korábban komolyabb fejlesztői tudás volt szükséges, tehát hozzáférhető lesz különösebb szakképzettséggel nem rendelkezők számára is.

Ez a folyamat már egy ideje zajlik, hiszen ma már tényleg nem kell klasszikus programozói, webfejlesztői tudás ahhoz, hogy valaki egy elfogadható weboldalt és webshopot állítson össze, akár fizetési rendszerrel, közösségi média integrációval és egyéb funkciókkal. Nem triviális, de nem is kell hozzá többéves tanulás. Ezek a moduláris, célorientált, végfelhasználókra tervezett fejlesztői megoldások a jövőben még hatékonyabbá válhatnak, ha a gépi tanulás alkalmazása itt is eléri a megfelelő lendületet.

Másrészt, persze, a profi fejlesztői csapatok munkájának a hatékonysága is tud okos AI-segítséggel szinteket lépni: gyorsul a kódírás folyamata, kevesebb lesz a hiba, nagyobb mennyiségű és többféle tesztet lehet futtatni, jobban lehet a verziókkal kísérletezni, és így tovább.

Bár az nem újdonság, hogy a technológia mindig fejlődik, mégis, arra mindig érdemes odafigyelni, amikor egy teljesen új technológia, esetünkben a különböző mesterséges intelligencia-megoldások, elkezdenek átszőni egy már jóideje működő iparágat. Valószínű, hogy a szoftverek eredeti célja, vagyis a “problémamegoldás” egészen új szintjei válnak elérhetővé és akár hétköznapivá. Gondoljunk bele: itt most nem egyszerűen arról van szó, hogy mesterséges intelligenciát alkalmazunk a szoftvereinkben a problémák megoldására, hanem arról, hogy már a szoftverek tervezése és fejlesztése során is használhatjuk azt. Az AI ereje a végfelhasználó számára így már hatványozottan jelenhet meg…

Szoftver 2.0

Ha egy rendszer képes önmagát tanítani, akkor csak kapacitástól függ az, hogy milyen hatékonyságra juthat el. Számos esetben olyan szinteket lehet így elérni, ami emberileg elérhetetlen és felfoghatatlan. Ha egy szoftver folyamatosan képes egyre hatékonyabban végrehajtani ugyanazt, akkor azzal új távlatok nyílnak meg. A mesterséges intelligencia-technológiák alkalmazása teljesen más, mint a klasszikus programozás. Mint említettük már, senki sem tudja pontosan, hogy mi történik a neurális háló mélységeinek fekete dobozában. Egy ideig mi emberek is tudunk a neurális háló éleinek súlyozásával alakítani a folyamaton, de az igazság az, hogy sokkal elegánsabbnak tűnik hosszabb távon az eredményre koncentrálni. De mit jelent ez?

Andrej Karpathy, a Tesla AI részlegének igazgatója ezt úgy fogalmazza meg, hogy e megközelítés szerint egy konkrét célt fogalmazunk, amelyet szeretnénk, hogy egy program elérjen. Például: nyerjen meg egy Go meccset. Ezután létrehozunk egy neurális háló architektúrában egy programot, de csak a Csontváz szintig, amely arra szolgál, hogy a háló beazonosítsa a “programteret”, a lehetőségek halmazát, amiben az öntanuló háló ezután kutatni fog, egyre jobb és jobb programvariációkat találva.

Ez azért működőképes, mert az elmúlt években kiderült, hogy a Big Data korszakában a valódi világunk valódi problémáinak túlnyomó részében hatékonyabb dolog begyűjteni a adatokat (avagy beazonosítani a kívánatos működés jellemzőit: például az önvezető autó álljon meg a pirosnál), mint megírni rá a programot. Ha kellően sok példát mutatunk a pirosnál megálló autókra, akkor az autó megtanulja a pirosnál megállás fogalmát és végre is hajtja, és mi nem fogjuk pontosan tudni, hogyan csinálja, mi alapján hozza meg a megállás döntését.

Az “adattudósok” (Data Scientist) feladata az, hogy kategorizálják,válogássák, paraméterezzék, finomítsák a rendelkezésre álló adatokat, hogy azok minél magasabb oktánszámú üzemanyagként hajtsák meg a neurális hálót.

Vizsgáljunk meg néhány konkrét példát erről a végtelenül nehezen elképzelhető folyamatról:

Gépi Látás - a közelmúltban ez egy erősen mérnöki feladat volt, egy kis gépi tanulással vegyítve, de időközben kiderült, hogy az óriási képmennyiséggel való betanítás jobb eredményeket produkál, mint bármilyen, a pontos képalkotásra törekvő mérnöki megoldás.

Gép Fordítás - a fordítórobotok működése sokáig frázisokra, elemekre épült, de a neurális hálók egyre jobbnak bizonyulnak ebben is

Játékok - nem éppen gyakorlatias felhasználási mód, de a legutóbbi AI kísérletek szép eredményeket kezdenek olyan rendkívül komplex játékokban is elérni, mint például a StarCraft. Itt is a rengeteg nyertes meccs megmutatása vezetett eredményre, és egy idő után a háló kitermelt az emberi játékosok számára szokatlan, de mégis hatékony megoldásokat is. A játékokban szerzett tapasztalatok természetesen számtalan területen kamatoztathatók.

A neurális hálóknak ezen kívül előnye a nagyfokú rugalmasság, alkalmazkodókészség. Ha valamiért fontos lenne, hogy egy folyamatot felgyorsítsunk a duplájára, némi minőségromlás mellett, ez nem lenne egyszerű megoldani egy klasszikus szoftverrel. A neurális hálóból viszont csak eltávolítuk a csatornák felét, újratanítjuk, és kész.

De ettől még nem lesz csodafegyver. A rendszer sajátossága, hogy tanuláson alapszik, ezért nem tud védekezni az ellen, ha a felhasználásra kerülő adatok emberi hiba folytán valamilyen irányban elfogultak, és néhány esetben meglehetősen szánalmas mértékben lyukra futnak, ebből jönnek az olyan balfogások, mint a villámgyorsan rasszistává váló chatbot esete volt.

A másik probléma, hogy sosem fogjuk tudni, pontosan hogyan hozott meg egy döntést a neurális háló, ezért ott nem fog megnyugtató megoldást kínálni, ahol az ok és az okozat teljes láncolata megkerülhetetlenül fontos, ahol bizonyítható, replikálható folyamatra van szükség. Ahogy Karpathy fogalmaz: “sok esetben dönteni kényszerülünk majd két olyan rendszer között, ahol az  egyik 90% pontosságú, de értjük hogyan működik, a másik pedig 99% pontosságú, de nem értjük, hogyan működik”.

Összességében a “szoftver 2.0” olyan helyzetekben válhat uralkodó megoldássá, ahol a nagyszámú, újra és újra végrehajtott kiértékelés könnyen megoldható, viszont egy “1.0” filozófiájú algoritmust építeni a folyamatra túl bonyolult feladat lenne.