A Java nagyjából 20 éve folyamatosan a legnépszerűbb programozási nyelv. 1996-os publikálásakor elsősorban a C/C++ nyelvek vetélytársának szánták, tervezésekor a legfontosabb szempontok a hordozhatóság, a biztonság és az egyszerűség voltak. Vajon mennyire tartható ez a sikeresség hosszú távon? Van-e esélye a Javának a megújulásra az egyre szorosabbá váló technológiai versenyben?

Java a mindennapokban

A Java általános célú programnyelv. Előnyös tulajdonságai révén hamar megvetette a lábát a vállalati szektorban. Számtalan felhasználási területe közül néhány:

  • asztali (desktop) alkalmazások
  • web alkalmazások, interfészek
  • Android alkalmazások
  • hálózatok, elosztott rendszerek
  • beágyazott rendszerek, IoT
  • adatbázisok

A siker titka

A Javát objektum-orientált felépítése és könnyű kezelhetősége alkalmassá tette arra, hogy vetélytársainál gyorsabban, produktívabban fejlesszenek vele komplex és biztonságos alkalmazásokat. Az egyszerűség fontos tényező az időtállóság miatt: mivel a szoftvert megírása után akár évekig vagy évtizedekig karban is kell tartani, nagyon fontos a forráskód könnyű olvashatósága, értelmezhetősége. Ezáltal egy nagyobb céghez újonnan felvett fejlesztőnek is felgyorsul a betanulási folyamata.

A Java egy relatíve egyszerűen tanulható programnyelv. Előnye mindenképp, hogy sok helyen használatos, így a felmerülő problémák nagy részére némi kereséssel nagy eséllyel található kész megoldás. Az eddigi Java EE önmagában is használható komplett rendszerekhez, egyéb nyelvek teljes kihagyásával: a backend Java alapú, adatbázis kezeléséhez a JPA megfelelő, frontendre a JSF talán kicsit butuska, de néhány addonnal pofás is lehet. A garbage collector többé-kevésbé általában jól működik, így a memória kezelést az SE és EE szintjén is el lehet felejteni.

– K. Zs., technikai konzultáns, Ixenit

A Java Virtuális Gép (JVM, Java Virtual Machine) is a fő sikertényezők között van: ez garantálja, hogy a Java programok bármilyen operációs rendszeren ugyanúgy lefussanak. A Java nyelven megírt forráskódot a fordítóprogram (compiler) egy „bájtkóddá” alakítja, amely már nagyon közel áll ahhoz a gépi kódhoz, amit a számítógép közvetlenül megért. A bájtkód hordozható, azaz platform-független, és a virtuális gép feladata a bájtkód optimalizált értelmezése (interpreter), azaz végrehajtása a konkrét hardverkörnyezetben. Emellett a JVM végzi futtatás közben az automatikus memóriakezelést (garbage collection), így a fejlesztőnek ezzel nem kell foglalkoznia. JVM futhat nagyteljesítményű szuperszámítógépeken, asztali PC-ken, mobiltelefonokon, de akár egészen szűkös erőforrásokkal rendelkező beágyazott rendszereken is (pl. hálózati eszközök, ATM-ek, IoT eszközök).

A Java amúgy is gazdag saját eszköztára (Core API) gyorsan bővült olyan nyilvános „könyvtárakkal”, keretrendszerekkel, amelyeket a fejlesztők szabadon felhasználhatnak, beépíthetnek programjaikba. Ezek fejlesztésében élen jár például az Apache Foundation és Eclipse Foundation. Még a közkedvelt Java fejlesztőeszközök (IDE, Integrated Development Environment) többsége is Java nyelven íródott.

Egy kis open source történelem

A Javát kifejlesztő Sun Microsystem szoros kapcsolatot ápolt az open source világgal (lásd: Unix, OpenOffice, OpenSolaris, MySQL). A nyelv fejlődési irányát a kezdetektől egy vállalati és egyéni tagokból álló testület határozza meg, amelyhez bárki csatlakozhat. A Sun 2006-ban publikálta GNU licensz keretében a Java nyelvet, itt kezdődött az OpenJDK fejlesztése, amely a Java SE (Standard Edition) funkcionalitását valósítja meg nyílt forráskóddal.

Az Oracle Corporation 2010-ben felvásárolta a Sun-t, ezáltal a Java is az Oracle tulajdonába került. Az akvizíció fő stratégiai célja a Sun hardware üzletágának megszerzése volt, de maga a Java is fontos volt az Oracle-nek, mivel számos szoftver terméke (middleware) nagyrészt Java technológiára épült. Ezáltal különösen érdekelt volt a nyelv fejlesztésében.

Maga az Oracle vs Google per már 10 éve húzódik. A tét nem csupán az a néhány milliárd dollárnyi kártérítési igény, ami mindkét cégnél aprópénznek számít. A több bírói fórumon átesett ügyben olyan kérdéseket próbáltak megválaszolni a döntéshozók, hogy érvényesíthető-e szerzői jog egy nyilvános API specifikációra, és méltányos használatnak számít-e ennek a lemásolása és újraimplementálása (konkrétan a Google az Android API-ban használta fel a Java API-kat). A végszót az USA legfelsőbb bírósága mondhatja ki várhatóan 2020 nyarán. Egy Oracle számára kedvező döntés egyesek szerint akár az egész szoftveripart káoszba és bizonytalanságba taszíthatja. Feszülten várjuk a fejleményeket!

Az első időkben az Oracle meglehetősen elidegenítette, időnként ellehetetlenítette az open source közösséget, amely korábban a Sun termékein és a Java platformon ténykedett. Számos volt Sun alkalmazott távozott más cégekhez, több projektet beszüntettek. A légkört tovább rontotta, hogy az Oracle beperelte a Google-t, az Android API kapcsán felmerülő licensz kérdések miatt.

Feltámadás

A Java fejlesztése az utóbbi években kezdett újra felpörögni, mert látszott, hogy az Oracle által tervezett 3 éves release ciklusok már a vállalati szférában is túl hosszúak. A programnyelv sokat veszít a vonzerejéből, ha tartósan nincs benne semmi innováció, míg más trendi programnyelvek folyamatosan állnak elő okosabb, hatékonyabb, szebb, gyorsabb megoldásokkal. Újabb, JVM alatt futó nyelvek is születtek, hogy megkerüljék a Java hiányosságait és ódivatúságát, mint a Scala, Groovy, Clojure és Kotlin – ezek mindegyikének van valamilyen konkrét alkalmazási területe, amelyben ideálisabb választás lehet, mint a Java, mindemellett a közös JVM gyökerek miatt viszonylag könnyen együtt is tudnak működni a standard Java könyvtárakkal és Java programokkal. Konkurenciát jelent a C# is, amely a Microsoft által fejlesztett, Javához nagyon hasonló programnyelv. A Python nyelv egyszerű szintaxisa miatt, és főként a mesterséges intelligencia területén meglévő képességei révén válik egyre kedveltebb opcióvá.

Égető szükség volt egy komoly megújulásra. Ezért 2018 óta évente két új stabil verziót publikálnak a Java nyelvből, amelyből 3 évente jelölnek ki egy hosszabb távon támogatott (LTS, long-term support) verziót. Ez jelenleg a Java 11. Ahogy a korábbiakban, úgy a jövőben is fokozottan ügyelnek a régebbi verziókkal való kompatibilitás megőrzésére, hogy a régi forráskódok lehetőleg ne törjenek el egy verzióváltáskor. Mindegyik release tartalmaz jó néhány feature-t, amelyeket a nyelv fejlesztését felügyelő bizottság választ ki. Ezek közül vannak kísérleti (preview) feature-ok, amelyeknek még nincs meg a végleges specifikációja, és a visszajelzések alapján még finomítanak rajta vagy akár vissza is vonhatják a jövőben. Az eddigi tapasztalatok alapján a patchek többsége hatékonyság-javító (pl. a JVM vagy a GC teljesítményét tuningoló) fejlesztés, vagy létező API-k újraimplementálása (pl. Socket), és akad néhány új nyelvi elem, ami a fejlesztők kényelmét szolgálja (pl. switch expressions, record).

Ezzel párhuzamosan az Oracle licenszelési modelljén is változtatott, és az OpenJDK új verzióira már csak a fizető ügyfeleinek biztosít supportot. A forráskódok megnyitásával azonban mások előtt is megnyílt a lehetőség, hogy saját JDK implementációt (és saját virtuális gépet) fejlesszenek. Így az Oracle JDK és az OpenJDK mellett már sokféle Javából válogathatunk, eltérő licensz és support feltételekkel: AdoptOpenJDK (Red Hat, IBM), Zulu (Azul), Corretto (Amazon), SapMachine (SAP), Liberica (BellSoft). Az Oracle által szállított HotSpot virtuális gép helyett szintén vannak más opciók, mint OpenJ9 (IBM) és GraalVM (Oracle Labs).

“A cloud-native fejlesztés kapcsán nagy problémának érzem, hogy a Java-ból a mai napig hiányzik a dedikált Developer Mode (mint pl. az Angular-ban). Egy cloud-native fejlesztést jól támogató stack, Developer Mode-ban - tipikusan alacsonyabb teljesítmény mellett - de támogatja az iteratív fejlesztést (kicsit belenyúlok a kódba, kipróbálom stb). Ehhez kellene tudja natívan a megváltozott osztályok dinamikus újraolvasását, amire most csak gyenge minőségű ingyenes (Spring Loaded, DCEVM / HotswapAgent), vagy drága fizetős megoldás van (JRebel). Ennek hiánya miatt az iteratív fejlesztés nagyon lassú körbefordulású a Javascript, Python, Ruby alapú versenytársakhoz képest. Ez alól egyes JVM alapú framework-ök kivételek (pl: Grails), amik adnak legalább valamilyen szintű Developer Mode-ot, de ennek a JVM szintjén kellene megoldva lennie, jó minőségben.”
– S. A., senior fejlesztő, DevOps mérnök, Ixenit

A modern szoftverfejlesztés kihívásai

A felhős szolgáltatások világában nem csak a szoftver fogyasztásának módja változott meg, hanem a szoftverfejlesztés és telepítés (deployment) módszertana is. Ha programjainkat felhőben hostoljuk IaaS / PaaS alapon, jellemzően az infrastruktúráért a felhasznált processzoridő, sávszélesség, memória alapján fizethetünk a szolgáltatónak. Ezért nagyon nem mindegy szoftvereink „lábnyoma”: mérete és teljesítménye. A felhős architektúra jellemzője az is, hogy rugalmasan skálázható elosztott rendszerekkel dolgozunk. A cloud-native fejlesztés a monolitikus alkalmazások helyett mikroszolgáltatások lazán összekapcsolt halmazából építkezik, amelyek mindegyike önállóan is skálázható (felfelé és lefelé is) a terhelésnek / igényeknek megfelelően. Ezt a konténer technológia teszi lehetővé.

A Java legfrissebb újdonságai között számos olyat találunk, amely ezeknek a követelményeknek próbál megfelelni. A korábbi Java EE (Enterprise Edition) azokat a könyvtárakat fogta össze, amelyek a vállalati szoftverek fejlesztéséhez szükségesek. Ennek a nyílt forráskódú utóda, a Jakarta EE most az Eclipse Foundation gondozásában folytatja útját, és a célkitűzése éppen az, hogy a Java nyelvet minél inkább alkalmassá tegye arra, hogy megfeleljen a felhős szoftverfejlesztés kihívásainak.

Emellett jónéhány open-source fejlesztés igyekszik valós alternatívákat és használható eszközöket kínálni a Java programozók számára. A GraalVM virtuális gép például a „native image” technológiával lényegesen csökkenti a lefordított java állományok méretét, és az AOT (ahead-of-time) compiler használatával a programok indításának idejét is lényegesen lerövidíti. A Quarkus keretrendszer, akár a GraalVM-el együttműködve, a forráskódok fordítás előtti optimalizálásával tud jelentős időt megtakarítani komplex programok esetén. A MicroProfile egy mikroszolgáltatások implementálására szolgáló keretrendszer.

Végszó

Számos kritika érheti a Java nyelvet, de tagadhatatlan tény, hogy napjainkban a legtöbbet használt programozási nyelvek egyike. Egyedi vállalati szoftvereken kívül rengeteg olyan open source megoldás is készül Javában, amelyeknek kulcsszerepe van a manapság fontos üzleti területeken is, mint amilyen a Big Data (Apache Hadoop) vagy az IoT (Apache Kafka). Maga a nyelv, és az azt körülvevő aktív fejlesztői közösség akkor tud releváns maradni, ha folyamatos innovációval és megújulással meg tud felelni a modern kor elvárásainak, és hatékonyan tudja támogatni a szoftverfejlesztést. A jelek szerint erre jó esélyek vannak, és Java fejlesztőkre még nagyon hosszú ideig igény lesz.