Po moim trupie! Apologia Javy
Jakiś czas temu natknąłem się na bardzo dobrą odpowiedz, mocno merytoryczną na zagadnienie, na które szukałem odpowiedzi (niestety nie pamiętam co to było – takie to było ważne ?) i przez to poznałem portal/platformę Quora. Zalogowałem się tam i tak jak po rejestracji na Netflix czy Filmweb można podać swoje preferencje tematyczne – zaznaczyłem kilka kategorii i m.in. technologia i oczywiście tworzenie oprogramowania czy języki programowania.
Czy Java kopnie w kalendarz w 2021?
Zaczęły mnie zalewać (by nie użyć słowa spam) pytania i odpowiedzi ludzi z całego świata o różne różności. Jednego razu, jedno pytanie mnie mocno zaszokowało, a brzmiało ono po polsku mniej więcej tak: czy Java kopnie w kalendarz w 2021? (org. ang. Is Java dying in 2021?). „Po moim trupie” - pomyślałem ?. Ktoś chce mnie pozbawić całkiem lukratywnej profesji ?.
Zaraz nasunęło mi się pytanie: dlaczego ktoś mógłby zadać takie pytanie? Czy ta osoba nie wie, że Java dzisiaj jest „wszechobecna”? Największe firmy, te średnie i te malutkie tworzą oprogramowanie w Javie. Java jest rozwijana od ponad 26 lat. Sprawdzona w boju na większość sposobów, jaki dzisiejsze oprogramowanie może być sprawdzane – wiec skąd to pytanie?
Nie ma głupich pytań
Ktoś kiedyś powiedział, że nie ma głupich pytań. Zgoda. Wiec domyślam się, że pytanie o „przedwczesne” uśmiercenie Javy wynika z braku wiedzy. Pewnie tak – no bo skąd osoba wchodząca na scenę IT dzisiaj, czy to świeżo upieczony absolwent sztuk komputerowych, czy też samouk ma wiedzieć kto i co w świecie IT, jeśli nie pracowała jeszcze w żadnej firmie i nie ma doświadczenia. Od wykładowcy, który możliwe, że pamięta jeszcze składnie Fortrana lub Algola a możliwe, że nigdy nie pracował nad komercyjnym oprogramowaniem — ciężko oczekiwać, że wprowadzi narybek programistyczny w powszedni chleb branży.
Java nie jest sexy
A samouk? No cóż, jeśli poczyta trochę artykułów typu „jaki język jest najbardziej hot w 2021” nie ujrzy tam Javy i może wyciągnąć mylące wnioski. Java nie jest sexy. Java nie jest hype. Cóż można powiedzieć, że Java nie jest młodzieżowa (Duke nie płacz, znajdziesz przyjaciół). Dzisiaj na fali „hype” jest JavaScript, Python i kto wie, czy nie Go. Nie jest tematem tego artykułu, dlaczego moda jest taka, a nie inna a programiści jako grupa społeczna jest mocno podatna na trendy modowe.
Java rządzi!
Mów co chcesz i myśl co chcesz – fakty są takie: „Java rządzi”?. Pamiętasz, jak kiedyś na okienkach Windows instalowała się „Java” (JRE) pojawiał baner: 3 Billion Device Run Java. Ja zawsze miałem problem z tymi bilionami po angielsku, zawsze mi się to myliło: 3 biliardy czy 3 miliardy? Tak czy inaczej - dużo. Ciężko sobie wyobrazić ile to jest. A trzeba dodać, że ta statystyka dotyczy czasów przed Androidowych (jeśli ktoś jeszcze nie wie android to dobrze zrobiony j2me)– dzisiaj nikt już nawet nie próbuje policzyć gdzie i kto używa Javy – za dużo tego i „komu to potrzebne?”. Tak drogi czytelniku — to są fakty.
Java jest jednym z najpopularniejszych języków na świecie (todo dodać jakiś raport). Nawet Microsoft zmałpował trochę w .Net językiem C# (Java była małpką C++, C++ z C, C z BCPL itd. — każdy małpuje i coś poprawia po drodze — w sumie to nic złego). Java jest używana powszechnie przez największe firmy na najbliższym nam wszystkim ciele niebieskim do utrzymywania i rozwijania (tutaj implikacja) najważniejszych systemów tychże firm. Zapytaj w banku, w firmie telekomunikacyjnej, zapytaj pralkę lub lodówkę – tam wszędzie znajdziesz Javę.
Mylisz się: w korporacjach to rządzi Excel i PowerPoint, a nie Java
Pakiet biurowy Microsoft i technologie, jakie gigant z Reymont oferuje, robi robotę w korporacjach. Zgadzam się. Z osobistego doświadczenia w życiu kilka razy przepisałem parę procesów biznesowych bazujących na email+excel na aplikacje webowe w Javie. Zapytasz, dlaczego w Javie to pisałeś? Mogłeś w JavaScripcie (np. Nodejs + jeden framework frontendowy najlepiej wybrany poprzez rzut kostką) lub Go? W sumie gdy przepisywałem te procesy, Ryan już wyciągnął silnik V8 z przeglądarki, a Go raczkował, ale nie wiedziałem, że istnieje. Tak czy inaczej, nikt nie pozwoliłby mi użyć tych „niedogrzanych” w tym czasie jeszcze technologii – tak w korporacjach są źli ludzie, którzy zabraniają robić ciekawe, nowe, hype rzeczy programistom.
Ale nawet gdybym miał zgodę i tak wybrałbym ekosystem Javy – dlatego że jest łatwo i przyjemnie taką pracę wykonać. Ale wracając prędzej czy później proces ręczny w organizacji zostanie zautomatyzowany. Wiec gdzieś potężne biurowe oprogramowanie potrzebuje transformacji w automatyczny proces – tutaj Microsoft dostarcza tuziny rozwiązań w swoim ekosystemie, ale napisanie takiego oprogramowania Javie też jest opcją i ma swoje zalety w zależności od wymagań biznesowych.
Javą w kosmos nie polecisz!
Jak ktoś chce rzucić „cień” na Jave i troszkę podokuczać to wyciąga te niewygodne tematy jak systemy czasu rzeczywistego. No są implementacje czasu rzeczywistego wirtualnej maszyny javy wiec ktoś działa w temacie np. US Navy uzbroił jakieś rakiety Javą, ale to nie jest coś, czym można się chwalić :/. Nie mam tutaj dużej wiedzy wiec drogi czytelniku jeśli możesz tutaj trochę obronić Javę — proszę, napisz o tym w komentarzu. Nie wiem, czy to nie plotka, ale ponoć francuski rząd zakazał używania Javy w rozrusznikach serca, gdyż faza „stop-the-world” GC w JVM w tym urządzeniu faktycznie mogą, by zatrzymać świat dla takiego pacjenta.
Muszę się zgodzić, że dla starych mikroukładów, chipów gdzie każdy cykl procesora przeliczany jest na zużytą energię i nie można pozwolić sobie na odrobinę abstrakcji maszyny wirtualnej, to faktycznie Java nie będzie najlepszym rozwiązaniem. Ale jeśli dysponujesz mocą procesora i troszkę większą pamięcią tak, że okrojony zoptymalizowany JVM ruszy to ekosystem Javy może mocno przyśpieszyć Twoją prace oraz możliwość migracji na inne układy sprzętowe co może oszczędzić mnóstwo czasu jak i kosztów z tym związanych.
Skoro ruszyłem kwestię lotu w kosmos to Java nie raz pewnie była na orbicie w laptopach astronautów, ale czy była użyta do krytycznych funkcji lotu na statku kosmicznym? Niestety nie mam przykładów. Wiem, że na Ziemi w centrum lotów kosmicznych Java była używana do zdalnego sterowania łazikami. Wiec Java też ma swój wkład w podbój kosmosu ?
Java jest wolna jak Twoja…
Hola hola! Bez tych wycieczek personalnych! Kiedyś możliwe, że uzasadnione było określenie Javy jako wolnej technologii – nie w tym sensie jak wolne czy też otwarte oprogramowanie (chociaż specyfikacja języka i jvm jest otwarta), ale wolnej jak np. żółw. To są stare dzieje i można te historie puścić w niepamięć. Java w ostatnich latach przyśpieszyła zarówno z wydawaniem nowych wersji jak i patrząc z perspektywy wydajnościowej. Tutaj jest to temat rzeka, ale pozwolę sobie przedstawić parę moim zdaniem popierających tę tezę faktów i rzeczy, którymi Java może się pochwalić.
Kompatybilność
Po pierwsze primo (pamiętasz Poranek Kojota?): Kompatybilność. Nie wiem, czy wiesz, że aplikacje napisane w Javie to nie jest pistolet na kapiszony z odpustu, który po 2 dniach jest do wyrzucenia. Aplikacje napisane w Javie kilkanaście lat temu nadal bez problemów wykonują swoje zadania na najnowszych maszynach wirtualnych mimo upływu czasu (nawet aplety Javy by śmigały, ale ktoś się uparł, że to niebezpieczne i poblokował przeglądarki sic!).
A to dzięki silnemu wsparciu wstecznemu – nieuwstecznianiu tylko wspieraniu miliardów pieniążków wydanych by to, co działało kiedyś, działało dzisiaj – firmom bardzo się to podoba. Java posiada mocne wsparcie kompatybilności wstecz i to jest super, ale ma swoje minusy. Przez ta dwadzieścia parę lat nazbierało się trochę rzeczy, które mogłyby trafić do lamusa. I tak się stało po wprowadzeniu modularności pakietów wewnętrznych od Javy 9 (jak chcesz to swoją aplikację też możesz zmodularyzować w ten sam sposób co sama Java). Zaczęto wyodrębniać i wyjmować z bazowej dystrybucji rzeczy, które nie wnoszą wartości dla większości programistów (jeśli jesteś tym wyjątkiem, to nie ma problemu — dalej możesz korzystać z takich „wyjętych” funkcjonalności, ale poprzez dodanie wprost biblioteki do aplikacji).
Modularność
Po drugie primo: Modularność. Świat się „shift & lift” do chmury – cokolwiek to znaczy (proszę wygoogluj, bo ten artykuł nie może przekroczyć 1600 słów, inaczej Iwona mnie zabije). No i faktycznie w wersji Javy 8 takie przenosiny nawet małej aplikacji do kontenera było kosztowne jeśli chodzi o zasoby, wydajność i coś jeszcze, ale zapomniałem. Nowsze wersje Javy pozwalają na budowanie dedykowanych wydań Javy (custom JRE) gdzie Java ma tylko to, co potrzebuje Twoja aplikacja – jest szybka, lekka i prosta w utrzymaniu. Można by powiedzieć szyta na miarę!
GraalVM
Po trzecie primo nie-ultimo (mam tego więcej): GraalVM. Nareszcie JVM napisany w dużej części w Javie – wszystkiego się nie da, bo optymalnie część portów na poszczególne architektury musi być napisana natywnym kodem. Ale ja nie o tym. GraalVM wniósł do ekosystemu Javy „kompilacje zawczasu” Ahead-Of-Time (AOT, przyznaj — ładnie przetłumaczyłem, co?) — kolejny skrót, ale ten jest z tych dobrych.
Jakbym miał to porównać do akcesoriów kuchennych — wybrałbym nóż kuchenny. Normalnie Javowy JVM to taki nóż, który podczas używania zaczyna się ostrzyć pod kątem rzeczy, które kroi. Brzmi dziwnie, ale tak to działa. Jakby Java kroiła chleb, to w tym nożu zaczynają pojawiać się ząbki, a jak mięso z kością to nóż zamienia powoli w tasak. W GraalVM optymalizacja pod kątem krojenia wykonywana jest w czasie kompilacji, tak by nie tracić czasu podczas krojenia w transformacje noża. No i co z tego – w C tak było od zawsze?
W C jak wprost nie tego nie zaprogramujesz, to cała Twoja aplikacja leci na jednym wątku — nieważne ile miałbyś procesorów. A Java dynamicznie i inteligentnie potrafi optymalizować i rozrzucać pracę na wiele wątków, ale do tego potrzebuje trochę popatrzeć, jak aplikacja się zachowuje. A w GraalVM próba optymalizacji wydajności zachodzi na poziomie kompilowania. Pozwala to np. na możliwość napisania w Javie serwer, który obsługuje logikę serverless i jak nie jest potrzebna, to śpi sobie gdzieś na repozytorium obrazów, ale kiedy pojawi się potrzeba, bardzo szybko (naprawdę szybko) taka usługa może zacząć obsługiwać przychodzące żądania obliczeniowe. Coś pięknego. Zrozumiesz różnicę, jak podepniesz kartę kredytową pod AWS lub OVH.
Nie potrzeba apologii Javy
Na zakończenie dodam, że Java nie potrzebuje obrony. Sama się lepiej broni niż nieudolnie próbowałem ja to zrobić w tym artykule. Nie musimy się też martwić, że Java zostanie porzucona dla innej technologii w najbliższej przyszłości. Pamiętam moment na studiach gdy przeszedłem z programowania w C/C++ na projekty robione w Javie. Jaka to była ulga gdy nie musiałem martwić się o deklarowanie i zwalnianie pamięci – coś pięknego. Do dziś nie rozumiem gdzie popełniłem błąd w algorytmie Dijkstry napisanym w symulatorze/grze genetycznej w C++ gdzie po 30 min od uruchomienia mojego dzieła wyciek pamięci sięgał 6 GB pamięci RAM ?. Podsumowując: Java jest w doskonałej formie (ang. live and kicking) i kto wie, ile innych języków programowania jeszcze przeżyje!