Хочу описать свои наблюдения и впечатления о самом популярном языке серверного программирования для Enterprise под названием Java. Наблюдения и впечатления на сравнении и контрасте с “похожей” платформой .NET, с которой я очень хорошо знаком. Уверен, что ~год назад, когда будущее нового дотнета в очередной раз показалось мне чересчур туманным и мысль сменить технологический стек окончательно материализовалась в голове, данная статья оказалась бы очень полезной. Я постараюсь не вдаваться в мелкие технические/стилистические различия языков программирования, которые легко нагуглить, а предложу скорее взгляд сверху — на экосистему в целом. Итак, Java глазами матёрого дотнетчика с десятилетним стажем. Прошу под кат.
Disclaimer
Когда-то давно у меня уже возникали похожие мысли написать про интересные отличия Microsoft Sql Server / Oracle, в стиле “ух ты, нету типа bool”, “длинные транзакции это норма, серьезно?”, “как это нет авто-коммита в настройках по умолчанию” и т.д. Но внутренний перфекционист всё думал, что я еще “недостаточно долго и хорошо всё изучил”, “где-нибудь ошибусь”, “поспешишь людей насмешишь” и т.д. — всё откладывал на “попозже”, а потом все впечатления буквально смылись и писать стало нечего. Так что в этот раз я решил слишком долго не ждать, иначе писать снова может стать не о чем. Поэтому отдельная просьба указывать мне на неточности, если они присутствуют. А я в свою очередь постараюсь не вдаваться в банальности “как же неудобно писать без var” (уже дождались на днях Java 10), “extension methods отсутствуют” и прочие “type erasure” и "multiline-strings".
Итак, экосистема.
1. IDE и терминология
В .NET выбор очевиден — Visual Studio. Работа в студии идет с проектами (projects), которые сгруппированы в солюшн (последний то .sln, то .json, то снова .sln, не сильно важно). Всё достаточно просто.
В мире Java в качестве IDE внимания на данный момент заслуживают двое парней — это Intellij Idea и Eclipse. На “постсоветском пространстве” первая победила. У зарубежных авторов эклипс живее всех живых. Казалось бы, какая разница чем пользуешься, хоть блокнотом, но в этом месте сразу же возникает проблема в терминологии.
В Eclipse самый верхний уровень — workspace, который состоит из projects.
В Idea самый верхний уровень — project, который состоит из modules.
В какой терминологии общаться разработчикам, использующим разные IDE, неясно. Часто принято общаться в терминологии “сборщиков”. Так, в случае например maven, дистрибутив собирается из модулей (modules), которые сгруппированы в pom-нике.
Если я правильно понимаю, то данную путаницу принесло отсутствие ранее в языке модульности “из коробки” и каждый инструмент ранее нагородил “модульность” в тех терминах, в которых счел нужным.
Отдельно хочу отметить бины (Beans). В .Net никому не придет в голову вводить новые термины для обычных классов, зарегистрированных в контейнере. На многих проектах контейнеры вообще не используются, даже в 2018 году (да, на это больно смотреть, но я это наблюдал и ни раз). В мире Java наоборот — культ контейнера и часто принято общаться в терминах бинов.
2. Сборка проекта
В первую очередь в новой экосистеме поражает несколько другая утилитарная “нарезка”. В некоторых случаях более крупная, в некоторых — более мелкая.
В мире .Net как средство управления пакетами/зависимостями используется nuget, для сборки — msbuild.
В Java всё склеено в один инструмент (впрочем, здесь снова есть выбор — Maven или Gradle). К каждому существует куча плагинов. В кровавом интерпрайзе доминирует первый.
Есть очень удобные wrapper-ы над сборщиками, позволяющие просто взять и начать сборку (кто сталкивался с поиском нужных версий msbuild-а на разных машинах, меня поймёт).
Дотнет сейчас тоже пытается двигаться в эту же сторону (привет, Cake).
3. Прикладные фреймворки
Здесь абсолютное доминирование Java-платформы. Есть два основных монстра: EJB и Spring с огромнейшей экосистемой и практиками “вокруг”. Доминирует второй. Со временем он тоже стал большим и сложным, поэтому даже придумали фреймворк для фреймворка — Spring Boot. Который, хочу отдать должное, действительно сильно облегчает жизнь.
В .Net ничего этого нет. Зато есть изобретение велосипедов “в каждом проекте по-своему”. Вплоть до выбора нужного DI/IoC-контейнера на вкус разработчика (если разработчик вообще в курсе про существование контейнеров) и решение как управлять транзакциями (если разработчик опять же знает, что такое транзакции и кто-то догадался отключить автокоммит на Sql Server-е). Разве что ASP.NET MVC немного похож на Spring MVC (который лишь малая часть Spring Framework).
4. Сервер приложений
И был IIS един и монолитен. И поняли Микрософт, что System.Web это плохо. И придумали OWIN. Впрочем, адекватные альтернативы IIS под Windows от этого не появились (да я знаю про Kestrel для .Net Core).
В Java выбор огромный, есть Servlet API, или новенький Reactive Streams(привет .Net Async Controllers) и множество реализаций, из которых Tomcat одна из самых популярных “коробочных”.
5. Community
Java Community Process и этим всё сказано. Формальный процесс, в котором заинтересованные лица могут участвовать в обсуждении и формировании новых версий платформы.
Только спустя 15 лет в Микрософт поняли, что это хорошо и пора перестать диктовать миру “как правильно жить” (помните ныне расформированный Microsoft Patterns and Practices group?) и придумал аналог — .NET Foundation.
6. Работа с БД
Это до сих пор не до конца понятный для меня момент, почему люди продолжают использовать JPQL в 2018 году. Единственное объяснение, которое я нашел, состоит в том, что типизированная Criteria — ужасна и многословна.
Это одно из немногих мест, где дотнетчикам повезло больше, т.к. 99% запросов к БД в .NET пишутся на типизированном Compile-time LINQ.
Да, я знаю про jOOQ, но ни разу не видел его использование хоть в чем-то, напоминающем продакшен. Возможно потому что это полу-платный новодел без JSR, возможно по другой причине.
7. XML hell
До сих пор популярно заблуждение, что java — это тонны xml когда. Но на текущем этапе развития экосистемы это совсем не так. Скорее даже наоборот! Я могу написать web-приложение на Java без единой строчки xml (привет Spring Boot), и не могу это сделать на .Net (привет web.config, который “по сути” тот же web.xml, только еще и перемешанный с конфигом).
Выводы
Каждый, если захочет, сделает сам. Нет черного и белого, плюсы, минусы и компромисы есть везде и на всех платформах. Могу написать только личное — что смена основного языка программирования и экосистемы в целом после многих лет разработки на одной и той же платформе — это очень интересно, полезно и буквально как глоток свежего воздуха. На многие концептуальные и архитектурные вещи начинаешь смотреть по-другому и с другого ракурса.
P.S.: На КПДВ — старое, но еще смешное видео.
Автор: Enrey