Чтобы лучше соответствовать технологическому стеку на моей новой работе, я за последние две недели заново познакомился со своим старым другом: Java. Не так давно он положил начало моей карьере программиста с непревзойденным рвением и энергией. Это путешествие длилось примерно два с половиной года, но вскоре прекратилось с появлением контейнеров и микросервисов. Перенесемся в сегодняшний день: прошло три года с тех пор, как я в последний раз писал серьезный код на Java. И, честно говоря, я никогда не ожидал, что он снова увидит это, особенно в среде микросервисов.

Итак, что случилось? Ответ прост: нас захлестнула всепроникающая волна микросервисов.

  • Высокая доступность
  • Более простая кодовая база благодаря тому, что не нужно беспокоиться о параллелизме и многопоточности.
  • Преимущества переносимости благодаря контейнеризации
  • «https://www.servier.ie/sites/default/files/webform/Videos-mx-fight-vivo17.pdf»
    «https://www.servier.ie/sites/default/files/ webform/Videos-mx-fight-vivo16.pdf»
    «https://www.servier.ie/sites/default/files/webform/Videos-mx-fight-vivo15.pdf»
    « https://www.servier.ie/sites/default/files/webform/Videos-mx-fight-vivo12.pdf»
    «https://www.servier.ie/sites/default/files/webform /Videos-mx-fight-vivo11.pdf»
    «https://www.servier.ie/sites/default/files/webform/Videos-mx-fight-vivo10.pdf»
    «https ://www.servier.ie/sites/default/files/webform/Videos-mx-fight-vivo10.pdf»
    «https://www.servier.ie/sites/default/files/webform/ Видео-mx-fight-vivo9.pdf»
    «https://www.servier.ie/sites/default/files/webform/Videos-fr-awards5.pdf»
    «https:// www.servier.ie/sites/default/files/webform/Videos-fr-awards3.pdf»
    «https://www.servier.ie/sites/default/files/webform/EnDirect.pdf»< br /> «https://www.mcvvftrentino.it/sites/default/files/webform/moto%20club/Videos-mx -fight-vivo17.pdf»
    «https://www.mcvvftrentino.it/sites/default/files/webform/moto%20club/Videos-mx-fight-vivo16.pdf»
    «https ://www.mcvvftrentino.it/sites/default/files/webform/moto%20club/Videos-mx-fight-vivo14.pdf»
    «https://www.mcvvftrentino.it/sites/default/ files/webform/moto%20club/Videos-mx-fight-vivo11.pdf»
    «https://www.mcvvftrentino.it/sites/default/files/webform/moto%20club/Videos-fr-awards7 .pdf»
    «https://www.mcvvftrentino.it/sites/default/files/webform/moto%20club/Videos-fr-awards5.pdf»
    «https://www.mcvvftrentino .it/sites/default/files/webform/moto%20club/Videos-fr-awards4.pdf»
    «https://www.mcvvftrentino.it/sites/default/files/webform/moto%20club/ Endirecto.pdf»
    «https://www.mcvvftrentino.it/sites/default/files/webform/moto%20club/EnDirect.pdf»
    «https://wisem.rutgers.edu/ site/default/files/webform/Videos-mx-fight-vivo9.pdf»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/video-Miss-v -Франция-fr- direct33.html»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/video-Miss-v-France-fr-direct31.html»
    « https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/video-Miss-v-France-fr-direct30.html»
    «https://www.construct.ee /sites/default/files/webform/quote_request/_sid_/video-jp-ekdin6.html»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/video- jp-ekdin5.html»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/video-jp-ekdin4.html»
    «https:// www.construct.ee/sites/default/files/webform/quote_request/_sid_/Videos-fr-awards3.pdf»
    «https://www.construct.ee/sites/default/files/webform/quote_request /_sid_/Videos-fr-awards2.pdf»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/video-jp-ekdin1.html»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/canelo-vs-smith-cuando-es-vivo12.html»
    «https://w ww.construct.ee/sites/default/files/webform/quote_request/_sid_/canelo-vs-smith-cuando-es-05.html»
    «https://www.construct.ee/sites/default /files/webform/quote_request/_sid_/canelo-vs-smith-cuando-es-vivo-5.html»
    «https://www.construct.ee/sites/default/files/webform/quote_request/ _sid_/canelo-vs-smith-cuando-es-vivo7.html»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/canelo-vs-smith-cuando -es-vivo-4.html»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/canelo-vs-smith-cuando-es-vivo10.html»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/Videos-jp-marathan6.pdf»
    «https://www.construct.ee/ site/default/files/webform/quote_request/_sid_/Videos-jp-marathan5.pdf»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/Videos-jp -marathan3.pdf»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/Videos-jp-marathan2.pdf»
    «https://www.construct.ee/sites/default/files/webform/quote_request/_sid_/Videos-jp-marathan1.pdf»

Все эти факторы побудили нас усомниться в эффективности Java (точнее, JVM), не говоря уже о его самой печально известной среде — Spring.

Временами, когда руки были погружены в такие технологии, как Kubernetes, казалось, что время Java почти прошло и что она не очень хорошо вписывается в экосистему контейнеров и микросервисов (что было ключом к масштабируемости и высокой доступности программного обеспечения). Но как когда-то стойкий сторонник Java — и несмотря на то, что меня поразила простота и элегантность таких языков, как Python (который теперь стал моим любимым языком), — я по-прежнему сохранял запас некоторых неоспоримых достоинств Java. достоинства.

Ключевые выводы из нашего журнала Kubernetes

medium.com

Церемония Явы и Весны

Например, я был хорошо осведомлен о мощных возможностях многопоточности в Java, так как использовал их в начале своей карьеры для критически важных банковских приложений. Хотя несправедливо сравнивать показатели производительности скомпилированного языка со скриптовыми языками, непревзойденная производительность Java просто не имеет себе равных.

Но в мире горизонтальной масштабируемости и микросервисной архитектуры эта врожденная производительность языка имела слишком мало значения, поскольку можно было просто создать больше контейнеров для достижения гораздо более высокой производительности. Ясно, что эти языки сценариев в сочетании с их способностью мгновенно увеличивать или уменьшать масштаб в мире контейнеров давали Java хорошие шансы на успех. Я был полностью убежден раз и навсегда, что с Java покончено (по крайней мере, в мире микросервисов). И я был прав!

На моей новой работе эти убеждения только еще больше укрепились и болезненно заставили меня осознать, насколько утомительным, раздражительным и запутанным стал язык — отчасти из-за анахроничных церемониальных структур, таких как Spring.

Держать его просто глупо

Начнем с пресловутого фреймворка Spring.

Spring такой же громоздкий и запутанный, как и пять лет назад, пронизанный бесконечными аннотациями, которые оставляют разработчиков на милость руководств или примеров кода каждый раз, когда им нужно что-то сделать. Либо это, либо трудная задача изучения собственной исчерпывающей документации Spring.

На самом деле моя бифштекс больше связана с такими фреймворками, как Spring, чем с самой Java. Spring усугубляет проблему, беря и без того церемонный язык, завуалируя его однострочными аннотациями и, казалось бы, редукционистскими обертками, которые в конечном итоге вызывают карнавал вызовов и экземпляров классов, которые вам часто не нужны. Как согласится любой разработчик, контроль, управление и прозрачность языка имеют решающее значение для эффективной разработки программного обеспечения. Проще говоря, как разработчик, вы хотите точно знать, что происходит в вашем коде и какие подпрограммы выполняются — по крайней мере, на высоком уровне. Но Весна болезненно сдерживает вас в этом аспекте.

Если вам нужно поместить шесть аннотаций поверх вашего класса, каждая из которых делает свое дело, запутанно взаимосвязанное в сетке весенних контекстов, вы находитесь на темной территории. И это не только Весна. Возьмем, к примеру, библиотеку Ломбока. Это его линия фронта, как рекламируется на их домашней странице:

«Project Lombok — это библиотека Java, которая автоматически подключается к вашему редактору и инструментам сборки, добавляя пикантности вашему java. Никогда больше не пишите еще один метод getter или equals, с одной аннотацией у вашего класса есть полнофункциональный конструктор, автоматизация переменных ведения журнала и многое другое».

Эта отрыгнутая цель сжатия кода Java разочаровывает и болезненно работает против языка, а не приносит реальной пользы.

Java следует просто перестать пытаться соответствовать краткости языков сценариев. Во-первых, это приносит в жертву согласованность в коде Java: представьте, что вы возвращаетесь к Java только для того, чтобы обнаружить, что все ваши геттеры и сеттеры исчезли (что-то, что мы когда-то узнали, было критически важным для автосвязывания Spring), теперь заменено однострочной аннотацией @NoArgsConstructor. Где в этом последовательность?

Во-вторых, это добавляет к уже запутанному набору абстракций. Здесь, например, Spring по понятным причинам настраивает автопроводку (внедрение bean-компонентов) за кулисами, но тогда где Lombok живет в контексте приложения и как организуется передача сообщений между ними? Если у меня есть шесть аннотаций для каждого из моих классов, сколько других подпрограмм или классов было создано этими аннотациями для выполнения этой упрощенной работы? Ни один настоящий разработчик не хотел бы, чтобы весь этот лишний код таился по углам. К сожалению, именно с таким Java-кодом я столкнулся спустя три года. Ничего не изменилось. На самом деле, даже небольшие изменения, которые произошли, только усугубили ситуацию.

Java по-прежнему фокусируется на глупых правилах, определяющих, какими должны быть имена классов, в какие пакеты они должны входить и должны ли переменные быть закрытыми или защищенными. Серьезно, кого это волнует?

Напротив, «Мы все здесь взрослые» — это буквально официальный ответ Python на отсутствие спецификаторов доступа в языке. Этот насмешливый, но убедительный однострочный ответ мгновенно задел меня. Это, наконец, придало некоторую здравомыслие концепции, которую я часто считал абсурдной и ненужной.

Если и есть что-то, что вы будете слышать снова и снова в индустрии программного обеспечения, так это аббревиатуру KISS: Будь проще, тупица. Это то, о чем Java нужно серьезно подумать, если она хочет выжить.

Простота масштабирования

Сегодня шаблон микросервисов стал почти повсеместным в индустрии программного обеспечения. Даже многие организации, использующие устаревшие приложения, все чаще заменяют свои старые монолиты, чтобы упростить дизайн и улучшить масштабируемость. Для программистов это означает, что их обширная кодовая база или сложная бизнес-логика будут разбиты на более простые и лаконичные функции — парадигма, которая устраняет необходимость управления состоянием в коде, избавляя нас от проблем параллелизма и многопоточных кошмаров.

В конце концов, все службы в той или иной форме просто обрабатывают данные в некотором формате (JSON или XML), а затем передают их на шину сообщений, такую ​​как Kafka, для дальнейшей обработки. И даже в таких смехотворно простых условиях, как эта, Java и Spring продолжают извергать анахроничную риторику церемониального синтаксиса кода, Application Contexts, запутанных bean injections, autowiring, POJO mappers, жадных до памяти JVM и печально известных class loader — все это бессмысленно болезненно для понимания. иметь дело с.

Вердикт? "Держать его просто глупо!"

Почему Java умирает