Liigu edasi põhisisu juurde
illustratsioon erinevate programmeerimiskeelte kohta

Java on päris lahe... aga saab ka teisiti

Karl Viiburg & Silver Jõgi

Java on kõikjal meie ümber. Keel, mis loodi üle 25 aasta tagasi kodumasinate tarbeks, on nüüdseks kasvanud ettevõtte selgroosüsteemides üheks populaarseimaks programmeerimiskeeleks oma lihtsasti arusaadava süntaksi, mitmeplatvormilisuse ning objektorienteeritud stiili poolest. 

 

25 aasta jooksul on muidugi väga palju muutunud. Java suur menukus suurkorporatsioonide hulgas on pannud Oracle (Java praegune omanik) keerulisse seisu. Uusi innovaatilisi uuendusi pole Java pikalt enam näinud, kuna ärikliendid ootavad võimalikult stabiilset ja pikalt tagasiulatuvat tuge oma süsteemidele.

 

Võib isegi öelda, et Java on osaliselt stagneerunud. Samal ajal on uuenduslikumad ja dünaamilisemad keeled palju järgi jõudnud ning võimekuselt on nad Javaga samal pulgal. Siit ka meie postituse kangelane – JavaScript

 

 

JavaScript – Zero to Hero 

Kuigi nimeliselt on Java ja JavaScript sarnased, ei ole nad omavahel seotud. JavaScript algas Netscape’i aegadest eesmärgiga muuta veebilehed dünaamilisemaks. Enam ei pidanud muudatuste kuvamiseks lehekülge värskendama, vaid see kõik juhtus kasutajate silme ees. 

 

Ajalukku pikemalt sukeldumata hakkas JavaScript koguma hõõrdejõudu, kui Netscape annetas JavaScripti tehnoloogia ECMA Foundation’ile eesmärgiga võimaldada erinevatel brauseri tootjatel seda omaks võtta ning pakkuda ka oma kasutajatele. Läbi selle sai alguse ka ECMAScript – JavaScripti standardiseeritud alustala. 

 

Pilt

 

JavaScript on ajapikku jõudnud brauseritest telefonidesse, desktopile, autodesse ja NodeJS tulekuga ka back-end süsteemidesse. Nüüdseks on JavaScript populaarseim programmeerimiskeel maailmas, mida kasutavad paljud professionaalsed arendajad. 

 

 

Java ja NodeJS back-endis 

Kuna valdavalt kasutatakse Javat ikkagi back-end süsteemides, siis keskendume selles artiklis rohkem just sellele köögipoolele ning käime läbi olulisemad punktid. 

 

Lihtsasti õpitav süntaks 

Java on lihtsasti arusaadava süntaksiga, mis teeb selle üpris kergesti õpitavaks. JavaScript on paljudes disaini otsustes võtnud šnitti Java pealt, mistõttu süntaksi seisukohalt on mõlemal palju sarnasusi.

 

JavaScriptile leidub internetis - lisaks ametlikule dokumentatsioonile - erinevate kommuunide poolt ka väga palju abimaterjale ja artikleid. Hätta JavaScriptis juba ei jää :)

 

Java:

public class ArrayUtil { 
    public static String[] sortByLength(String[] items) { 
        Arrays.sort(items, (a, b) -> a.length() - b.length()); // Comparator.comparingInt(String::length) 
        return items; 
    } 
} 

 

JavaScript:

export function sortByLength(items: string[]) { 
  return items.sort((a, b) => a.length - b.length); 
} 

 

Asünkroonsus 

Java võimaldab kasutada thread’e, millega jaotada töötlust mitmele harule, et paralleelselt käitada erinevaid tegevusi.  

 

Thread’e võib metafooriliselt samastada mahukate tööde juhtimisega - suunav organ annab töökäsud teistele (antud juhul harudele) ette. Kui töö on valmis ning käsud täidetud, kontrollib organ, kui hästi harud oma töödega hakkama said.

 

NodeJS on juba disainilt asünkroonne ja kasutab JavaScripti Promise API’t, millega jaotatakse töötlust mitmele harule. Õnnestunud või ebaõnnestunud tulemust võib tulevikus vastavalt vajadusele töödelda.

 

Promise API liides on kättesaadav ka brauserite JavaScriptis. See võimaldab front-end rakendustes viia suuremahulisi tegevusi peamiselt User Interface (UI) harult eemale, et tagada kasutajale kiirem ja mugavam kasutuskogemus

 

Ka JavaScript saab hakkama erinevates seadmetes 

Java suur eelis on olnud, et see töötab iga seadmega, olgu selleks tavaline arvuti, server, telefon, desktop rakendus vms. Lai kasutajapagas ning vajadus alternatiividele on suunanud ka JavaScripti.

 

JS’i saab rakendada desktop rakendustes läbi ElectronJS’i või siis äppide jaoks Cordova/React Native’i. JavaScriptiga on võimalik oma lahendus viia turule ükskõik millisel platvormil - alates nutikülmkappidest autodeni välja. 

 

Turvalisus 

Iga suure ja väikse infosüsteemi nurgakiviks on turvalisus. Olgu selleks siis krüptograafia või koodi tasandil vigade vähendamine, kasutades strict typing reeglistikku. Krüptograafia jaoks on JavaScriptil olemas ka lahendus.

 

NodeJS toetab eri liiki krüptograafiaid, alates liikluse turvamiseks läbi TLS krüpteeringu kuni PKI võtmepõhiste andmete krüpteerimiseni.

 

Lisaks on NodeJS ökosüsteemis olemas arendajate kommuuni poolt loodud RFC’dele (Request For Comments) vastavaid mooduleid, millega implementeerida oma nõuetele vastavaid krüptograafilisi lahendusi. RFC’d võib vaadata kui ülemaailmselt kokkulepitud standardit, mille järgimist soojalt soovitatakse. 

 

if (data.signature.algorithm.endsWith('ECEncryption')) { 
  const ec = new EDDSA('ed25519'); 
  const key = ec.keyFromSecret(this.request.hash.raw); 
  if (!key.verify(Buffer.from(data.cert, 'base64'), data.signature.value)) { 
    throw new Error('Invalid EC signature (verification failure)'); 
  } 
} else { 
  const verifier = crypto.createVerify(data.signature.algorithm); 
  verifier.update(this.request.hash.raw); 
  if (!verifier.verify(cert, data.signature.value, 'base64')) { 
    throw new Error('Invalid RSA signature (verification failure)'); 
  } 
} 

 

JavaScripti ökosüsteemis on strict typing’uks olemas TypeScript. See on Microsofti poolt loodud avatud lähtekoodiga laiend JavaScriptile, mis laseb kasutada strict typing’ut sarnaselt Javale.

 

See võimaldab juba arenduse ajal märgata vigu, mis muidu oleks alles käitamise ajal välja tulnud. Otsesene väärtus on mõõdetav süsteemi kvaliteedi märgatavas tõusus

 

export default function debounce<T extends unknown[], U>(callback: (...args: T) => PromiseLike<U> | U, wait: number) { 
  let timer: NodeJS.Timer; 
 
  return (...args: T): Promise<U> => { 
    clearTimeout(timer); 
    return new Promise((resolve) => { 
      timer = setTimeout(() => resolve(callback(...args)), wait); 
    }); 
  }; 
} 

 

Implementatsioonidel, kus on väga ranged nõuded ligipääsudele eri süsteemi komponentidele (failisüsteem, erinevad võrgud, keskkonnad), on olemas Deno, mis on loodud NodeJS looja poolt.

 

Deno on keskendunud turvalisusele (centered around security) ehk vaikimisi ei ole rakendusel lubatud ligipääsu erinevatele süsteemi komponentidele ilma eraldiseisva loata. Lisaks on Denol valitud kolmandate osapoolte moodulite valik, mis on eraldi auditeeritud, et tagada maksimaalne tugi ja turvalisus. 

 

Mitmeplatvormilisus 

Java saavutab oma mitmeplatvormilisuse läbi virtualiseerimise, kasutades JVM’i (Java Virtual Machine). NodeJS’il sisseehitatud virtualiseerimine puudub, kuid seda ei peagi olema. Nii nagu Javat, saab ka JavaScripti põhjal olevaid NodeJS lahendusi liigutada eri arhitektuuriga süsteemide vahel.  

 

NodeJS põhineb Google’i poolt arendatud JavaScripti V8 mootoril. “V8” on seeläbi tuttav termin nii muskelauto sõpradele kui arendajatele - nagu nimigi ütleb on tegemist väga võimeka mootoriga. NodeJS toetab nii x86, ARM kui ka isegi IBM serverite arhitektuuri (32 ja 64-bit). 

 

Lisaks ülaltoodud erinevate arhitektuuride toele saab NodeJS rakendused konteineriseerida ning virtualiseerida läbi töövahendite - näiteks Docker.

 

Dockerist pikemalt saab lugeda meie varasemast blogipostitusest, kuid lühidalt öeldes, iga süsteem, mis toetab virtualiseerimist, toetab ka Dockerit ning sellega konteineriseeritult saab oma NodeJS rakendust liigutada  sinna, kuhu hing ihkab. Magus kirss tordil on skaleeritavus, mille saab pealekauba. 

 

Avatud lähtekood 

Mõnikord tekib funktsionaalsuste disainimisel ja arendamisel isu ning vajadus teada, kuidas teatud raamistik või süsteem baassisendina kirjutatud on. JavaScripti populaarses maailmas dokumentatsioonist puudust ei ole – erandlikult on kõikidele arhitektuuri- ja disainiotsustele kergesti kättesaadavad sisendid

 

Nii JavaScript kui kõik levinud raamistikud - sealhulgas NodeJS - on avatud lähtekoodiga. See tähendab, et iga hetk on võimalik vaadata koodi sisse, et näha, kuidas see on kirjutatud, milliseid otsuseid on tehtud funktsionaalsuses, disainis jpm. Lõpptulemina on avatud lähtekoodiga raamistikud asendamatud abimehed turvalisuse tagamiseks.  

 

Lisanduva väärtusena on suurel hulgal kogenenud arendajatel võimalik anda oma panus erinevate raamistike parendamisele läbi koodimuudatuste pakkumise. See omakorda suurendadab raamistiku võimekust ning annab sisendi auditeerimise turvalisuse parandadamiseks

 

Nii NodeJS, Deno kui ka Electron on avatud lähtekoodiga ja erinevalt Javast ei pea nende kommertskasutuseks ostma kallist litsentsi. Vajadusel on õnneks võimalik soetada ka Java taskukohasemalt läbi OpenJDK projekti. 

 

 

Miks eelistada oma järgmises süsteemis JavaScripti ja NodeJS’i? 

Kulu 

Teadupoolest peab Java arendajaid tikutulega otsima. Olles oskuslikud arendajad leidnud, peab tõdema, et kõikvõimeka keele arendajate oskuspagas ei ole odav. Javale meeldib kasutada suurel hulgal ressursse. Sellest tulenevalt lisab erinevate tehnoloogiate kasutus ning riistvaraliste ressursside vajadus keerukust nii vaimselt kui rahaliselt.  

 

Nagu varasemalt välja tõime, on JavaScript praeguse seisuga kõige populaarsem arenduskeel. See tähendab, et tulenevalt laiast rakendusbaasist on avatud lähtekoodiga JavaScript ja NodeJS arendajaid märgatavalt lihtsam leida.  

 

Lihtsus 

NodeJS ja JavaScript vähendavad keerukust, sest kogu tehnoloogiline pinu põhineb ainult ühel programmeerimiskeelel - vähendades ressursi kulu ning võimaldades ajaliselt kiiremini luua suuri terviklahendusi. 

 

Kiirus 

 

Pilt

 

Nali-naljaks, arendajad muidugi tahtlikult selliseid vabandusi ei kasuta, kuid kahjuks peab tõdema, et Java kompileerimine võtab omajagu aega. Suuremate ja keerukamate süsteemide puhul (Java eelistamisel arenduskeelena, kuulub siia alla valdav enamus projekte) on keskmine kompileerimistsükkel 5-6 minutit.  

 

Esmapilgul ei tundu 5-6 minutit palju. Arvestades, et projekti võivad paralleelselt täiendada 6 arendajat, kes kõik kompileerivad projekti päevas mitmeid kordi, ulatub projekti tervikkulu aga juba kümnetesse “arendusvabadesse” tundidesse. 

 

JavaScripti mootorid on JIT (Just In Time) kompileerimisloogikaga, kus kood kompileeritakse ja jooksutatakse käivitamise hetkel, mis toimub millisekunditega (tuhandetes kordades kiiremini kui Javas). 

 

NodeJS pole tagasihoidlik ka rakenduse kiirusel. NodeJS’il kulub ühe päringutsükli (alates päringu tegemisest kuni vastuse saamiseni) vähem aega kui Javal, mis võimaldab Node’il sekundis teenindada rohkem päringuid madalama ressursikasutusega

 

 

Ja lõpetuseks - kas Java on arenduskeelena suremas? 

Praegu on lihtne vastus “Ei”. Olenevalt maailmavaatest võivad erinevad arendajad antud küsimusele anda väga seinast-seina vastuseid. Lähimateks aastateks on aga kõne- ja arutlusainet kindlasti veel ning Java on ja jääb väga võimsaks arenduskeeleks. 

 

Plusse ja miinuseid on kõikidel keeltel. Erinevalt 25 aasta tagusest ajast oleme praegu aga tarkvaraarenduskeeltega seisus, kus spetsiifiliste probleemide lahendamiseks ei ole trumpkaardid ainult ühe või teise arenduskeele käes.

 

Java on ajalooliselt mänginud väga suurt rolli laiahaardeliste ja mitmeplatvormiliste süsteemide lahendustes. Praegu ei ole Java enam omasuguste seas ainulaadne ning tulenevalt eelpool mainitud kiiruse, lihtsuse ning kulu argumentidest, on tarkvaraarenduse eelistused liikunud alternatiivsetele keeltele (JavaScript; Python; Golang jpt.) 

 

Kokkuvõtvalt võimaldavad alternatiivsed keeled lahendada kõiki probleeme, milleks on varasemalt pöördutud Java poole. Sisuline otsus tuleb sellegipoolest vastu võtta projekti spetsiifiliselt, kuid kaalukauss nihkub järjest suuremas osas kaasaegsemate keelte poole.  

 

Paar näidet NodeJS baasile arendatud rakendustest: 

 

Oleme otsimas oma tiimi NodeJS arendajat. Kui sinagi oled otsimas uusi väljakutseid, siis tutvu meie töökuulutusega ja võta julgesti ühendust.