Wybór języka

Java

Kiedy mam czas, aby mówić o Javie przez ponad godzinę, jest to Deep Dive (nazywam to “Nowości godne uwagi”). Kiedy mam mniej niż czterdzieści minut, możemy ledwo dotknąć powierzchni, stąd nazywa się to wtedy “Surfing Modern Java”. Wszystko pomiędzy, taki normalny wykład, to więcej niż surfowanie, ale mniej niż głębokie nurkowanie, stąd “Sailing Modern Java”.

Podczas takiego wykładu zazwyczaj omawiam jedno lub dwa najnowsze wydania, czasami wspominając o tym, co nas czeka, starając się przemycić jak najwięcej przykładów kodu.

Bądźmy szczerzy: na Wątki Wirtualne (ang. Virtual Threads) czekaliśmy dość długo. Czekaliśmy z niecierpliwością, widzieliśmy zmieniające się nazwy (to nie są fibers ludziska), ale oto wreszcie są: Wątki Wirtualne.

Niektórzy twierdzą, że Project Loom jest największą zmianą w Javie od czasu wersji 8, lambd i strumieni. Inni uważają, że jest to jeszcze większa zmiana. Odkładając dyskusje na bok, zapowiada się na wielką zmianę.

Pamiętam, jak byliśmy podekscytowani (byłem wtedy jeszcze na studiach), że w końcu możemy używać prawdziwych wątków w Javie na Windowsie. Jednak czas leci, branża się zmieniła, sprzęt się zmienił, sposób, w jaki budujemy nasze systemy, również się zmienił. Choć znaleźliśmy sposoby na obejście ograniczeń “jeden wątek systemowy na jeden wątek Javy”, to jednak miało to swoją cenę: zagmatwane stosy wywołań i trudne debugowanie to pierwsze, co przychodzi na myśl. Wątki Wirtualne mają za zadanie utrzymać nas w nuuuuudnym, ale łatwym do zrozumienia modelu wątek-na-żądanie (ang. thread-per-request), jednocześnie odblokowując moc krzemu poniżej.

Minęło kolejne pół roku, pora na wdrożenie kolejnej wersji Javy™ na produkcji. Tym razem na pewno, bo to w końcu LTS. ;-)

Zdaniem wielu “Java jest wolna”. Okazuje się, że rozwój Javy jest tak “wolny”, że kolejne wydania nie są tylko podbiciem wersji, bo mogą znacząco zmieniać reguły gry. To dobry powód na kolejny deep dive w Javie. Będzie mowa o:

  • Pattern Matching for switch,
  • Record Patterns,
  • Virtual Threads,
  • Simple Web server,
  • co wyleciało i wyleci,
  • i innych.

Dużo rzeczy pokazane w kodzie, nie tylko na slajdach.

“Nie jesteś w stanie zrozumieć języka, zanim nie zrozumiesz przynajmniej dwóch”. – Geoffrey Willans

Przez lata programowałem głównie w językach działających na JVM. Czasem w innych językach wywodzących się z C, co było ciekawe i zarazem dość łatwe.

Kilka miesięcy temu (ze względu na zmianę pracy) musiałem się szybko nauczyć programować w Go. Co prawda słowa kluczowe w Go wyglądają podobnie do tych z C, jednak wiele koncepcji jest innych, wręcz niespotykanych w innych językach wywodzących się z C, szczególnie tych zorientowanych na obiekty. Nauka Go to świetna przygoda, a najlepsze są w niej te chwile AH-HA, gdy robiąc coś w Go, można nagle zrozumieć Javę lepiej.

Java jest naprawdę świetna, gdy trzeba napisać program “Hello, World!” Jest również genialna dla wyrafinowanych systemów i algorytmów, pod warunkiem, że ich autorzy piszą kod, który przestrzega kilku dość prostych umów i unika oczywistych pułapek.

Istnieje kilka mantr dotyczących najnowszych cech współczesnej Javy, takich jak:

  • rekordy mogą wszędzie zastąpić JavaBeans
  • nigdy nie musisz pisać hashCode() dla rekordów
  • dopasowanie wzorca za pomocą instanceof jest najlepszym narzędziem dla equals()
  • po prostu zignoruj --illegal-access lub ustaw go na permit
  • synchronize (new Long(42)) jest najlepsze dla monitorowania i tak dalej.

Do tej pory prezentacja pojawiła się w trakcie jLove, Doing Java Better oraz Java Day Lviv.

Minęło kolejne pół roku, pora na wdrożenie kolejnej wersji Javy™ na produkcji. Tym razem na pewno, bo to w końcu LTS. ;-)

Zdaniem wielu “Java jest wolna”. Okazuje się, że rozwój Javy jest tak “wolny”, że kolejne wydania nie są tylko podbiciem wersji, bo mogą znacząco zmieniać reguły gry. To dobry powód na kolejny deep dive w Javie. Była mowa o:

  • –illegal-access=deny,
  • Sealed Classes,
  • dopasowaniu wzorców w switch,
  • z czym się żegnamy i z czym będziemy się żegnać,
  • i innych.

Dużo rzeczy pokazane w kodzie, nie tylko na slajdach.

Co myślę o Lomboku?

Wydaje się, że to ciekawa wyspa, chętnie bym tam kiedyś się wybrał.

Co myślę o Projekcie Lombok?

Cóż, zadano mi to pytanie tak wiele razy, że postanowiłem popełnić ten wpis. Głównie po to, żebym mógł wkleić odnośnik i wycofać się na z góry upatrzone pozycje, gdyż intensywność kolejnej dyskusji może wzrosnąć do poziomu wygrażania pięściami i toczących się głów… Poczyniłem trzy założenia:

  • To są moje opinie. Mogą się komuś podobać lub nie. To zależy od Ciebie, czytelniku, i nic na to nie poradzę. Jeśli dla Ciebie zapoznawanie się z cudzymi opiniami przerasta możliwości samodystansu, to może pora przestać czytać właśnie teraz. Dotyczy to także (choć nie tylko) wszystkich wspaniałych dusz stojących za Projektem Lombok.
  • “Tylko krowa nie zmienia poglądów”, a jako że nie identyfikuję się jako krowa, moje opinie mogą się zmienić. Bo np. po przeczytaniu tego wpisu udało Ci się przekonać mnie, że nie mam racji. Wierz mi, lubię być wyprowadzany z błędu. Uważam to za absolutną podstawę podejścia naukowego. Z tego powodu ten wpis może być przedmiotem zmian wprowadzanych bez ostrzeżenia.
  • Zamiast pisać “Projekt Lombok”, będę pisać po prostu “Lombok”.

Niestety, tłumacz wziął wolne. Wpis dostępny po angielsku.

Minęło kolejne pół roku, kolejne wydanie nowej wersji Javy™ za nami. Zdaniem wielu “Java jest wolna”. Okazuje się, że rozwój Javy jest tak “wolny”, że kolejne wydania nie są tylko podbiciem wersji, bo mogą znacząco zmieniać reguły gry. To dobry powód na kolejny deep dive w Javie. Będzie mowa o:

  • Rekordach: gdzie i jak ich użyć (poza DTO/VO)
  • dopasowaniu do wzorca z instanceof (zwane również smart casting)
  • klasach zapieczętowanych (czyli nowym wymiarze widoczności typów)
  • ostrzeżeniach z projektu Jigsaw (–illegal-access kontratakuje!)
  • i Valhalla (przy złym wykorzystaniu value-based classes)
  • komunikacji z pamięcią natywną z projektu Panama
  • i innych.

Dużo rzeczy pokazane w kodzie, nie tylko na slajdach.

W czwartek 22 października, w ramach JAVIPS online, miałem niekłamaną przyjemność wzięcia udziału w zlocie tytanów, których przedstawiać nikomu nie trzeba

W dawnych mrocznych czasach musieliśmy czekać 3-4 lata, by zobaczyć nową wersję Javy ze zmianami w API, składni i JVM. Obecnie mamy dwa duże wydania każdego roku! Czy możemy korzystać z tych wydań przed pojawieniem się kolejnego LTSa?

Chcesz wiedzieć, co się wydarzyło od czasu Javy 11? Rekordy? Wyrażenia switch? Pattern matching? Jakieś zmiany w NullPointerException? Nowe funkcje w API? O co chodzi z Shenandoah i ZGC? AppCDS, żeby przyspieszyć start?