Slide 1

Slide 1 text

Modern Java for decade-old problems co ma do zaoferowania Java w 10 letnim projekcie open-source Mateusz Gajewski 🤍 Confitura 2023

Slide 2

Slide 2 text

Co ja tu robię • Z programowaniem jestem związany całe życie, • Wcześniej: • mniejsze firmy, • startup, który stał się korpo ;-), • startupy, • konsulting, • Aktualnie: • Staff Software Engineer w Starburst Data, • @wendigo na Twitterze i Githubie 2

Slide 3

Slide 3 text

Agenda • Open-source Trino: • Dlaczego akurat Java? • Jakie problemy chcemy nią rozwiązać? • 10 lat rozwoju języka i platformy: • Rozwój za czasów Oracle, • Jak ugryźć migrację, • Jakie problemy adresują nowe wydania, • Czy Java ma jeszcze przyszłość? 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

Trino (dawniej PrestoSQL) 5 Skalowalny i wydajny silnik zapytań (MPP) Federacja dostępu do danych (Data Mesh, Data Virtualization) Deployment na dowolnej infrastrukturze (cloud, on premise) Uniwersalność zastosowań (ETL, ad-hoc, batch) Aktywne i różnorodne community Otwarty i darmowy kod źródłowy (Apache License 2.0)

Slide 6

Slide 6 text

Filozofia rozwoju projektu • Pisanie czytelnego kodu, który jest: • poprawny obliczeniowo, • bezpieczny i wydajny, • skaluje się na najnowszym hardwarze, • rozwiązuje realne problemy, • Produkt który, łatwo się wdraża: • na różne architektury sprzętowe i systemy, • poprzez brak natywnych zależności, • samowystarczalne artefakty 6 https://trino.io/development/vision.html

Slide 7

Slide 7 text

2013: Dlaczego Java a nie np. C++? • Balans: produktywność vs wydajność wykonania, • Skalowalność i multiplatformowość, • Ekosystem bibliotek, narzędzi i specjalistów, • Dostęp niskopoziomowy do zasobów, • Kompatybilność wsteczna, • Automatyczne zarządzanie pamięcią, • 10 lat temu nie było większego wyboru ;-) 7

Slide 8

Slide 8 text

10 lat innowacji w Javie 8

Slide 9

Slide 9 text

Oracle przejmuje Javę (~2010) Java Enhancement Proposals (https://openjdk.org/jeps/1): 
 • Incubator (https://openjdk.org/jeps/11): • Całe moduły zawierające niesfinalizowane API i narzędzia, • Mogą, ale nie muszą być w całości usunięte/zmienione w przyszłości, 
 • Preview (https://openjdk.org/jeps/12): • W pełni wyspecyfikowana, zaimplementowana funkcjonalność języka lub JVMa, • Może stać się finalna i publiczna w przyszłości. 9

Slide 10

Slide 10 text

Nowy cykl wydawniczy STS (short-term support) co 6 mc-y (10 wydań w dekadzie) LTS (long-term support) co 2 lata (4 wydania w dekadzie) 10

Slide 11

Slide 11 text

Dlaczego tylko LTS ma sens? • Wydanie STS ma wsparcie: • 6 miesięcy na wydanie, 6 miesięcy na krytyczne błędy bezpieczeństwa, • Wydanie LTS ma wsparcie: • 5 lat na wydanie, 8 lat na krytyczne błędy bezpieczeństwa, • Duże przedsiębiorstwa korzystają tylko z LTSów, • Z doświadczenia: • większa stabilność, • mniejsza liczba regresji (dłuższy okres integracji i testowania) 11

Slide 12

Slide 12 text

Wielka czwórka projektów 1. Panama (2014): “Uproszczenie interakcji pomiędzy Javą a zewnętrznymi (nie-javowymi) API, np. kodem natywnym napisanym w C, C++ itp” 2. Valhalla (2014): “Rozszerzenie modelu obiektowego Javy o obiekty wartościowe (value objects) i typy prymitywne zdefiniowane przez użytkownika, łącząc ze sobą abstrakcje programowania obiektowego z wydajnością charakterystyczną dla typów prymitywnych” 3. Amber (2016): “Odkrycie i wprowadzenie małych, zorientowanych na poprawnie produktywność funkcjonalności języka Java” 4. Loom (2018): “Drastyczne zredukowanie kosztu wytworzenia, utrzymania i monitorowania współbieżnych aplikacji o dużej przepustowości, wykorzystujących w pełni potencjał dostępnych platform sprzętowych” 12

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

Jak przeżyć migrację? 14

Slide 15

Slide 15 text

Złożoność projektu Trino (2023) • ~100 modułów w Mavenie, • ~800 zależności projektowych, • ~21K pom LOXML ;-) • ~1.5M Java LOC, • ~ 5K commitów, 1K PR, 40 releaseów / rok, 2m40s fast build na M1 Max* * kiedy ściągneliśmy już połowę MavenCentral i wyłączyliśmy wszystkie checki ;) 15

Slide 16

Slide 16 text

Java target • Runtime target: • Kod skompliowany starszą wersją, uruchamia się na nowej, • Możemy testować kompatybilność w przód, • Możemy nadal wspierać wcześniejsze wersje, • Compile target (trudniejsze): • Kod skompilowany nowszą wersją i na niej uruchamiany, • Nowy class format, • Pozwala wykorzystać nowe możliwości języką i API (language level), • Nie ma drogi powrotu :( 16

Slide 17

Slide 17 text

Najczęstsze problemy • Usunięte lub zmienione funkcjonalności: deprecated/experimental/preview, • Niekompatybilne wersje bibliotek: • Nowy class format (ASM, ByteBuddy), • Niedozwolona/nieprawidłowa refleksja (od JDK 16), • Grzebanie w internalach Javy 😑 (Unsafe, ByteBuffer, compiler API itp), • Brak wsparcia dla nowych elementów języka (np. Record class), • Niekompatybilny tooling: • pluginy Maven’a, • infrastruktura testowa (obrazy Docker-owe, Github Actions, Jenkins itp), • wsparcie IDE ;-) 17

Slide 18

Slide 18 text

Historia LTSów w Trino 18 Nowy compile target & language level: • Java 8 - 02.2014 (+6 mc za wydaniem) • Java 11 - 02.2020 (+18 mc za wydaniem) • Java 17 - 11.2021 (+3 mc za wydaniem) • Java 21 - 12.2023 (+3 mc za wydaniem)

Slide 19

Slide 19 text

Migracja do JDK 11 (2020) 19

Slide 20

Slide 20 text

Najnudniejszy LTS ever? • prywatne metody w interfejsach, • Process API, • słowo kluczowe var (local type inference), • metody fabryczne dla niemutowalnych kolekcji i ich kopiowania, • nowa implementacja klienta HTTP, • jshell 20

Slide 21

Slide 21 text

Najnudniejszy LTS ever? Pod maską natomiast wielkie porządki: • Konsolidacja kodu Javy w jednym repo (296) + nowy build system, • JPMS (200), • Java dla Linux/AArch64 (237, 315) • Wydzielenie API podsystemu GC, Epsilon, ZGC, • Unicode 10, • Zintegrowanie Java Flight Recordera (JFR) (328) • Java-based JIT compiler, • Zunifikowane logowanie w JVMie. 21

Slide 22

Slide 22 text

22 TL;DR: Java 11 przygotowała grunt pod innowacje w Javie Werdykt: porządne wydanie, ale nie rozwiązało zbyt wiele z naszych problemów

Slide 23

Slide 23 text

Migracja do JDK 17 (2021) 23

Slide 24

Slide 24 text

Amber: Records 24

Slide 25

Slide 25 text

Amber: Text blocks 25

Slide 26

Slide 26 text

Amber: enhanced instanceof 26

Slide 27

Slide 27 text

Amber: enhanced switch 27

Slide 28

Slide 28 text

Amber: Sealed classes 28

Slide 29

Slide 29 text

JEP 358: Smart NPE 29

Slide 30

Slide 30 text

Valhalla: Hidden Classes 30

Slide 31

Slide 31 text

Trudności w migracji do 17 • Dostęp refleksyjny domyślnie zablokowany (w JDK 16), • Problem ze starymi bibliotekami: • zmiany w zakresie security: • SecurityManager (deprecated), • Kerberos, • wycofane algorytmy, • Niekompatybilne pluginy Mavena, • Kilka niespodzianek: • zmiana InetSocketAddress::toString (JDK-8225499), • wycofany -XX:+UseBiasedLocking, • strictfp domyślnie, 31

Slide 32

Slide 32 text

32 TL;DR: Java 17 dostarcza kilka użytecznych funkcjonalności
 Werdykt: trudna, ale konieczna migracja.

Slide 33

Slide 33 text

Migracja do 21 (2023/2024) 33 https://github.com/trinodb/trino/pull/17520

Slide 34

Slide 34 text

Loom: Virtual threads
 (GA) 34 • Executors.newVirtualThreadPerTaskExecutor() + Thread.ofVirtual().start() • Mają sens dla kodu I/O-intensive: • kod musi być Loom-friendly by współpracować ze schedulerem, • synchronized method & synchronized (object) nie są kooperatywne, • można rozwiązać za pomocą ReentrantLock-ów, • ExecutorService implements AutoCloseable, • Brak obsługi priorytetów, thready są zawsze daemon, • Kosztowna obsługa ThreadLocal-i, • -Djdk.tracePinnedThreads=full/short na ratunek

Slide 35

Slide 35 text

Panama: Foreign Memory API
 (3rd preview) 35 vs

Slide 36

Slide 36 text

Panama: Foreign Function API
 (3rd preview) 36 ./bin/jextract -- source -- output target -l libsnappy -I/opt/homebrew/include \ 
 -I/Library/Developer/CommandLineTools/Library\ SDKs/MacOSX.sdk/usr/include /opt/homebrew/include/snappy-c.h

Slide 37

Slide 37 text

Panama: Vector API
 (incubator) 37

Slide 38

Slide 38 text

Więcej dobroci w JDK 21 38 • JEP 440: Record patterns, • JEP 441: Pattern matching for switch, • JEP 430: String templates (preview), • JEP 445: Unnamed classed and instance main methods (preview), • JEP 439: Generational ZGC, • JEP 431: Sequenced Collections.

Slide 39

Slide 39 text

Trudności w migracji do 21 (dotąd) • Wiele niekompatybilnych pluginów mavena: • nowy class format (ASM), • zmianami w internalach compiler API, • Kilka niespodzianek: • Zmiana konstruktora DirectByteBuffera: JDK-8299684, • Zmiana reprezentacji Double i Float.toString: JDK-4511638 39

Slide 40

Slide 40 text

40 TL;DR: Java 21 to najlepsze wydanie Werdykt: największe wydanie rozwiązujące wiele z podstawowych problemów systemów rozproszonych, migracja z 17 bez większych problemów.

Slide 41

Slide 41 text

Czy Java ma sens w 2023? 41

Slide 42

Slide 42 text

42

Slide 43

Slide 43 text

Na co jeszcze czekamy? • Loom (projects/loom) - sfinalizowanie incubator & preview features: • JEP 453 - Structured concurrency, • JEP 429 - Scoped values, • Valhalla (projects/valhalla): • JEP 401 - Value & primitive objects, • JEP 218 - generics over primitive types & universal generics (draft), • Panama (projects/panama): • Sfinalizowanie Vector API, wsparcie dla obliczeń na GPU, rozwiązanie problemu GCLockera 🙏 • Amber (projects/amber): • Statements before super() • Leyden (projects/leyden): • Pewnie o nim nie słyszeliście ;-)? 43

Slide 44

Slide 44 text

Dziękuję! Mateusz Gajewski 🤍 Confitura 2023