Наконец-то попалась интересная книга :) Если Хорстманн рассказывает о Java в контексте языка, то эти ребята не ограничивают себя одним языком, затрагивая и экосистему, её историю и развитие. В начальных главах кратко знакомят с изменениями от Java 8 и версии 17: - новый цикл выпусков, синтаксис var, однофайловое выполнение, switch, какой-то синтаксический сахар, модули Java и пр. Описан процесс добавления новых функций, от начала обсуждения до релиза, в том числе такие механизмы, как JSR и JEP. О самих новых функциях, а точнее проектах, подробнее будет сказано в конце книги.
Так же, в самом начале, знакомят с важной частью - байт-кодом и на этот самый байт-код в дальнейшем будут часто опираться при разборе деталей работы некоторых технологий, так что я бы рекомендовал обязательно разобраться с этим материалом на месте и уже после двигаться дальше. Да и в целом, это очень удобный инструмент, который позволяет понять, как работает код “под капотом”. А, еще в конце книги будет немного подробностей о внутренним устройстве виртуальной машины, что то же без знаний байт-кода будет проблематично. В общем, тема полезная.
Не плохо раскрыта тема конкурентного выполнения (включая многопоточность), описаны два интерфейса - блоковый, или как его еще называют “классическим” и новый, на основе пакета java.util.concureent. В целом, материал подается постепенно, начиная от концепции и заканчивая примерами кода и диаграммами (насколько это возможно отразить). Описаны как сильные, так и слабые стороны и в целом объема достаточно для того, что бы можно был пробовать. Там же есть отсылка к книге Java Concurrency на практике, книга не дорогая, но надо помнить, что ей уже около 20 лет. Не знаю, может быть когда-нить доберусь, но вряд ли…
Вообще, тема конкурентности будет подниматься на протяжении всей книги, постепенно развиваясь уже с учетом того материала, который будет подан. Она будет включать особенности продвинутые технологии как на Java, вроде фреймворка “Fork/Join”, так и корутины Kotlin или persistent data structure и агентов в Clojure. И вот тут то же уже было бы хорошо понимать байт-код, организацию памяти и всё такое.
Одна из глав посвящена производительности. В ней последовательно раскрывается эта тема, начиная от терминологии и общих советов по выявлению проблем, до рассуждений на тему “почему вообще необходима оптимизация” и почему сложно оптимизировать код на Java. Так же в главе раскрывается тема сборщика мусора и JIT-компиляции, история их развития, современный подход к анализу их работы. Материал подан очень последовательно и очень интересно.
Понравились детали. Например, в контексте анализа упоминается, что линейная масштабируемость невозможна, о чем гласит закон Амдала. Другой проблемой является то, что масштабируемость не является постоянной, рано или поздно она столкнется с “коленом производительности”. Упоминается S.M.A.R.T.-method, на который стоит полагаться при постановке целей производительности.
Третья часть книги посвящена мультиязычному программированию и альтернативным языкам на основе Java Virtual Machine, таким как Kotlin и Clojure. Не углубляясь в детали описываются особенности и различия других языков, их классификация, потребности в языках в целом и общие вопросы, вроде сложности их выбора. Кратко описываются история возникновения Kotlin, его особенности, включая совместимость с Java, вплоть до перегенерации кода в обе стороны и как это возможно. Объясняется то, почему он считается безопасным, проводится первое знакомство с корутинами. В общем, проводят первое знакомство с языком, без погружения в детали.
Если с Kotlin я был немного знаком, то вот о Clojure до этого ничего не знал, кроме существования такого языка. Оказалось, что это одна из реализаций LISP, только для JVM. То есть, никаких оптимизаций хвостовой рекурсии, и решений из Lisp с рекурсивными алгоритмами работать не будут. В целом, конечно, язык зубодробительный, как и сам Lisp, собственно. Так или иначе, даже для знакомства с языком этого материала мало. Немного спасает несколько глав, посвященные функциональному программированию в целом, как на Java, так и на Kotlin с Clojure. Весь этот материал подается с намеком на то, что за функциональным программированием - будущее, в том числе и Java будет постепенно приближаться к нему.
Следующая часть книги посвящена системам сборки в целом, и двум система Maven и Gradle в частности. После ознакомления становится хотя бы примерно понятно, как они функционируют, чем отличаются, как при помощи этих систем можно настраивать сборки и расширять, включая примеры написания собственных плагинов.
Помимо этого рассматривается тестирование кода, начиная от юнит тестирования и заканчивая сквозным. Немного забавно то, что в этой книге тема тестирования раскрыта лучше, чем в некоторых других, которые собственно, этому самому тестированию посвящены. Например, тут рассказывается не только о самом тестировании, но еще и работе в с контейнерами (включая Docker и Kubernetes). О взаимодействии с внешними зависимостями, вроде Redis и PostgeSQL, пара слов о работе с Selenium, внедрении тестирования в процесс непрерывной интеграции… Конечно, не авторы не обошли стороной и тестирование в Kotiln и Clojure, что так же добавляет интереса.
В общем, эта книга оказалась на удивление классной. Надо будет посмотреть, может быть у авторов есть еще какие-то издания.
Что касается качества книги, то это крепкий середнячок: - хорошая полиграфия, иллюстрации и сноски по теме, с переводом никаких проблем не заметил. Разве что, не смог найти никаких упоминаний о “колене производительности”, скорее всего это какой-то неудачно переведенный термин. Пожалуй, это единственное замечание.
Авторы
- Benjamin Evans
- Jason Clark
- Martijn Verburg
Год издания: 2024
Количество страниц: 736
Оценка: 5/5
Издатель: Питер
Ссылка на страницу книги на сайте издательства: https://www.piter.com/collection/all/product/java-dlya-opytnyh-razrabotchikov-2-e-izdanie
Оригинальное название: The Well-Grounded Java Developer
Год издания оригинала: 2023
Репозиторий с примерами из книги: https://github.com/well-grounded-java/resources