JavaGovno
Java - попытка поиска альтернативы / За что я не люблю Java
Мысли - Много минусов
- СИСЕК НЕТ - Что на ней писать-то? - Там, где нужно быстро - пишут на C++ (игры-биржи-системный софт) - Ибо JVM-то сама по себе быстрая, НО! У неё же как минимум GC. А ещё из-за ориентации на многопоточность трудно сделать shared-nothing / thread-per-core - Там, где нужно много сети - пишут на том, что умеет работать как событийная машина - Там, где более-менее пофиг - есть куча альтернатив. Скриптота, Go... - ML - питон, юля (а был хадуп, да. но оказался слегка тормоз ну и писать неудобно) - Десктоп - всё-таки в основном пишут нативно - Ну, мобилы... да - тут зря оракл судится, Андроид спас яву - Остаётся "энтерпрайз" / "банки". Но что такое "энтерпрайз"? Я пока знаю только одну характеристику и она не хорошая - это те компании, в которых всё плохо, медленно, легаси и так далее. Качество кода? Не... чот не видел. Может где-то есть страна единорогов, но... - С другой - там, где не нужно - есть дохрена альтернатив, причём не только скриптота - ещё Go - Событийной машины нет [ссылки на извраты: quasar, ea-async - но специфично и не очень удобно - драйверы к БД - отдельный изврат и т.п.] => проигрывает JS и Go (да-да, nodejs тащит 1млн соединений на 1 хосте) - Зато куча херни для многопоточности, с которой можно огрести много весёлых багов - Встроенного синтаксического сахара нет [и видимо не будет]. Ни async/await, ни перегрузки, ни JSON, ни хотя бы просто встроенного в синтаксис хеша. Тем, кто не писал на чём-то другом оно, может, и не надо. Но, простите, в C++ я могу сказать json["x"] = 1. А в java нет. - Много легаси. Аппликейшн серверы (неудачная попытка шаред хостинга на яве), IBM MQ, EJB, куча спецификаций и т.д и т.п. Потому что сделали ещё вот тогда и - ну, работает, не переписывать же - Причём с другой стороны матёрым чувакам, которые ещё кодили на EJB - наоборот смешно смотреть на новодел, потому что вот это всё ещё вот тогда в 2000 было уже возможно - С одной стороны, толстое встроенное API, которое тащат от версии к версии и тяжело развивают с сохранением совместимости - С другой - оно хоть толстое, но его не достаточно для написания веб-приложений! - Поэтому любое приложение тащит сразу 50-100 мб зависимостей - Разделяемых библиотек нет - При этом хаос с версиями библиотек не хуже, чем в NPM - Можно бесконечно смотреть на три вещи - как горит огонь, как течёт вода и как работает Maven - Системный софт вообще не попишешь, там без разделяемости никак - Один из вариантов это был бы AOT. Его нет. - В C# есть (GAC) - В Dalvik/ART есть - А в яве нет - Поэтому ЖОР ПАМЯТИ! - На андроиде, пока не было AOT, вообще была ЗИГОТА (мега-костыль) - На самом деле есть OSGi. Но специфичная вещь и редко кто её юзает - А, ещё один важный момент - К яве и C# не пишутся (точнее, плохо пишутся) внешние биндинги. Был бы Android Framework на C - можно было бы кодить на любых языках. Я бы кодил) - Поэтому же медленный запуск - Правда, смотрите на nodejs (V8) и учитесь скорости - он и на быстрый старт, и на JIT оптимизирован. Хотя чему-то и он, конечно, у JVM сам научился - Память течёт, как и везде (кроме ПХП) или хуже - Разработчиков нет/дороже (пока в вилларибо настраивают сборку, в виллабаджо уже сделали MVP). Ну тут некоторое лукавство - для разработчика-то это плюс :) - ...и хорошим - грустно. В итоге вместо тупого монолита на ПХП появляются микросервисы, рэббиты, синхронизаторы баз данных и так далее... - Из-за типизации - сплошной ORM. Из-за сплошного ORM - никто ни хрена не знает, как работает СУБД. То есть средний уровень так себе. - Ценность готового софта на яве во многом сомнительная - Странная культура разработки. Крупные "куски софта" - довольно страшные - DDD... что-то там ещё DD... - Из свежего есть правда эластик и логстеш. Но логстеш СИЛЬНО ругают за жор ресурсов. - А вот например Go - Веб-френдли: встроенные массив и хеш, встроенная JSON сериализация - Эффективная и простая многопоточность - goroutine-ы - Умеет как статическую, так и динамическую сборку - Совместим с C библиотеками - Интересные решения на тему наследования - Популярен и в вебе, и для системного софта - Нет эксепшнов (плохо), нет генериков (где-то хорошо, где-то плохо) - Синтаксис немного безумный - А вот например node.js - Самый быстрый движок из всех интерпретируемых языков - "нативные модули не нужны" - "First-class" событийная машина, async/await - Нейтральный C-подобный синтаксис - Возможность сборки в том числе серверного кода в единый bundle (был опыт по превращению ~500 мб зависимостей в 1 12 мб файл) - А например PHP - Узкоспециализирован, но очень удобен, для веба - Для написания веб-приложения достаточно встроенных возможностей. Зависимости в 90% случаев не нужны ВООБЩЕ - Кардинально решены проблема утечек памяти, расхода ресурсов - Кардинально другой подход к работе приложения (отсутствие прогрева) - Жора памяти тоже нет - Полный "serverless" ещё со времён шаред хостингов
- Засилье Spring
- Не от хорошей жизни: по сути, спринг путём грязных хаков добавляет в яву динамику (связывания в рантайме), которой там так не хватает - И синтаксического сахара - местами и имхо некрасиво. - Даже сами концепции DI/IoC в первую очередь популярны именно в яве и C#. Разработчикам ядра Linux про это расскажите - обсмеют - "А как нам протестить один класс отдельно, если там статические ссылки на другие"... Когда это в PHP было проблемой? Убей не пойму - "Изолента-ориентед-программинг". Ощущение, как будто насовываешь в разные места кусочки изоленты и они в рантайме как-то в итоге слипаются - Всё это ценой ЕЩЁ БОЛЬШЕГО времени запуска, может и пять минут быть. Цикл "code-test" СЛЕГКА замедляется
- IT-фэшн - мода на микросервисы (уже подыхает)
- Микросервисы, естественно, не обязывают писать на яве - Однако МНОГИЕ адепты рассказывают про микросервисы именно в контексте явы - Либо у них была ява и монолит стал говном - Либо у них была ява, всем надоело на ней писать и захотели писать на питоне и получили микросервисы - Есть целые Spring Cloud-ы про микросервисы. В других языках такого нет! - видимо, не нужно - На практике тоже не раз слышал про применение MSA именно от тех, кто работает с явой - Есть подозрение, что постулат "толстый монолит превращается в говно" - тоже исходит от них - видимо, это ява-проблемы - При этом микросервисы на яве - совсем не микро. Даже vert.x, даже spark тянут с собой метров по 100 зависимостей. - Не, никто не спорит - можно прикольно поупражняться и потом сходить на конференцию рассказать про свой опыт. Были доклады от Одноглазников, которые изобрели свой сериализатор, чтобы гонять данные юзеров между (микро?)сервисом юзеров и другими сервисами - Поправка - если вы Гугл или Фейсбук - то микросервисы у вас, конечно, возникнут сами по себе - Если "сами по себе" они не возникают - они вам не нужны. поупражняться можно, но это тупо затраты в никуда (на инфраструктуру...). - Даже Фаулер говорит "monolith first". - Единственная польза - продавать это другим таким же бедолагам. - "А если один сервис на спринге всю память сожрёт..." - ну ой. Не пишите на спринге, пишите на пхп. Точно не сожрёт. - Подобный опыт у нашей компании есть на практике. Вдаваться в детали не буду - наверное, нельзя - но, в общем, с MSA может быть на ПОРЯДОК дороже, чем без, при отсутствии каких-либо выгод.
- Попытка улучшить жизнь: vert.x
- Что это такое - Попробовали на этом написать прототип новой системы - Увы, java IMDG - говно 100%, спросите БДСМщика (Jepsen) - Попытка межсервисной коммуникации по "шыне" умерла при первой же подаче нагрузки - Шынные сервисы не дружат с vertx-web - Библиотеки непривычные, Quasar кривой - Многоязыковость - маразм (зачем писать на яве, если потом писать на руби) - ea-async - не очень удобно, т.к. почти "лестница колбэков" - Ну и - явистам всё это не нужно, им и со спрингом и 5 минутами запуска хорошо - Остальным тоже не нужно, т.к. им не нужна ява (картинка "совершенство не требует доработок") - Итог: штука интересная, но на практике не прижилась - Возможно, где-то может быть полезно, само существование событийной машины - это уже что-то - Ну и если я что-то буду писать на яве - велика вероятность, что именно на вертексе
- Ещё есть Spark
Вы вроде говорили, что там достаточно кратких тезисов для дальнейшего обсуждения.
Я там записал какой-то поток мыслей, но это не тезисы, конечно... Если кратко описать суть доклада, то как-то так:
Доклад служит высокой цели расширения кругозора слушателей и рассказывает про нашу попытку что-то изменить в нашем мире ява-разработки. Зачем менять? Ну, все же знают, что Алиса сказала про IT - нужно бежать очень-очень быстро, чтобы только остаться на месте. Спойлер: далеко убежать не удалось, но опыт был интересным.
Первая часть доклада - фичи языка/платформы. Почему на яве не писать системный софт? Откуда в андроиде "зигота"? Кто быстрее - ява или яваскрипт? Есть ли жизнь за пределами Spring-а? Почему PHP-шники не хотят писать на яве? Из-за чего вообще "обидно", чего так не хватает при Java-программировании? Что-то из этого поправимо сейчас? А есть ли шансы, что поправится в будущем?
Вторая часть - IT-мода на микросервисные архитектуры - к счастью, уже проходящая. Главный вопрос здесь в том, какой урок из этой "моды" стоит нам вынести.
Ну и напоследок вас ждёт краткий рассказ про vert.x - асинхронный фреймворк нового поколения от Eclipse - и нашу попытку улучшить им себе жизнь.