Про жабие межушного нервного ганглия, или из жизни животных

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

Краткий экскурс в историю позволяет понять один чрезвычайно важный момент - джава никогда не проектировалась и не предполагалась быть заменой С, С++ и прочим ассемблерам. Это, в общем-то, язык для кофеварок (не шутка), который по странному стечению обстоятельств (а скорее благодаря маркетологам-сантехникам) стал довольно-таки популярным языком набора текстов в питейных заведениях Бангалора.

Итак, что ж обычно можно прочитать про жабу на лоре, хабре и прочих юмористических ресурсах.

Сегодня грузчик, завтра жабодевелопер

. Простота синтаксиса. С одной стороны - это благо, потому что код, будучи написаным кем попало - может быть и прочитан кем попало, без необходимости особых навыков и умений (в отличие от цацкеля и скалы например). С другой стороны - это создает обманчивое впечатление “незавершенности” для людей с синдромом “ПГМ” (Плюсы Головного Мозга). Ну не могут там без STL, препроцессора, директив компиляторов и прочего байтоебства. Простота и сопутствующая ей массовость в применении жабы привела к тем же болезням, что и ПХП - порог вхождения в жабу ненамного выше, чем порог вхождения ПХП, и количество случайных людей в ней в процентном соотношении выше, чем в других языках. Однако от этой самой простоты идет другая, более серьезная проблема.

Эк тебя распидорасило

. Раздутость. Раздутость жабьих исходников - притча, пример и проклятие “чтоб тебе всю жизнь на жабе писать без code completion”. Отсутствие указателей или HOF приводит к применению Runnable/Callable со всякими анонимными классами, развитию болезни шаблонов проектирования в код сложности “2+2”. Большое количество wannabe framework developers плодят сотни библиотек в час, которые решают 1 миллипроблему и одновременно приносят макрогеморрой. Побочным эффектом всего этого является простой факт - без IDE на жабе крайне сложно писать какие-то вещи, отличные от hello world. Вот настолько сложно, что прям невозможно. Соответственно, все товарищи, которые приходят программировать жабу - в первую очередь, как правило, видят Eclipse. Или Idea. Или какой-то там Netbeans. И если не обладать любознательностью (а как правило, мало людей правда хотят знать, как и куда работает их тул, за пределами пары-тройки основных юз-кейсов) - случается IDE головного мозга. Когда человек без IDE тупо ничего не может сделать. Если в Ц, хочешь-не хочешь, надо понимать про всякие там хидеры, LD_LIBRARY_PATH и прочее, писать Makefile или применять богомерзкий Autotools - то в жабе в 99% случаев можно программировать и без этого. Кто не верит - спросите себя, когда вы последний раз запускали javap и знаете ли вы вообще что это и зачем.

А сейчас мы с этим попробуем взлететь

. Тулсет. Развитие популярности жабы привело к великому разнообразию всего. Пожалуй, околожабья экосистема - наиболее развитая из всех, что есть на сейчас. У этого есть свои плюсы - почти все уже написано, и свои минусы - никто толком не представляет, а что собственно там написано. Склонность к написанию фреймворка на любой чих приводит к тому, что для одной функции типа просто посчитать MD5 в строке - надо за собой тянуть еще дохуя всего из например commons-codec (да, я знаю про MessageDigest, но почему-то куча народу не в курсе). Причем если в плюсах и прочем Ц компилятор умеет поубирать нахер неиспользующиеся функции (ну, раньше умел во всяком случае) при статической линковке, то в жабе живых и пригодных инструментов для этого нет. И как следствие - простейшее приложение например с применением spring-webmvc с единственной HTML страницей и показом чего-то из базы - вырастает в стомегабайтный WAR всякого говна, из которого в лучшем случае будет использоваться 10% кода. Чтобы облегчить себе войну с этой очередной инкарнацией DLL Hell - чуваки придумали Maven, и для своего времени это правда было круто. Но за прошедшие десятиления, ввиду наличия тысяч библиотек - применение Maven требует определенного терпения, усидчивости и немного мазохизма.

Я не тормоз, я медленный газ

. Жаба тормозит. Да, она действительно тормозит, и при запуске, и при работе. Холодный запуск жабьего приложения и такого же по функциональности нативного - будет различаться на порядки, просто потому что запуск непосредственно VM занимает туеву хучу времени. Я вообще люблю представить это в виде аналогии - вы только проснулись, толком еще не поняли кто вы и где вы - а вам уже тут высыпают на голову паззл и этот паззл надо собрать. Вот кусочками этого паззла будут классы, которые надо где-то загрузить (жаба умеет грузить классы не только из локальной файловой системы, но еще например из базы данных, или например по сети, или вообще генерировать байткод на лету). Понять что и как проиницаилизировать, что сложить в кучу а что - на стек. Заняться сборкой мусора. Но если вернуться в прошлое и понять, что жаба - это кофеваркосистема, то все логично - включили, оно потупило и работает себе. Никто ж не ожидает от кофеварки реал-тайм-системы, правда? Но с другой стороны, если правильно готовить жабу - то можно писать очень крутые вещи, вон знает как. Кроме всего прочего, эти тормоза жабы крайне негативно сказываются на разработке, особенно под уебанские тяжелые контейнеры типа вебсферы, которая стартовать натурально может минут 20 на современном железе. Для этого в частности придумали JRebel, который помогает избавиться от части этого ада (причем это реально работает, хотя и не для GWT или там Scala).

Рабинович напел

. Это явление не характерно исключительно для жабы, и заключается в том, что грубо говоря программисты однокристаллок псят на программистов вебсферы за то, что на кристаллах надо экономить байты, а в вебсфере их никто не считает. Ну то есть любой, среднестатистический кернелодрочер по определению пишет системы более лучше/сложнее/нужноевставить, чем любой среднестатистический жабодрочер. Причем как правило оные товарищи вообще не в теме ни предметной области, ни круга решаемых задач друг друга, ни требований к софту, баблу и срокам. При этом часто случаются казусы - было какое-то там sqlite внутрипроцессное, потом его потребовалось допилить до того, что надо распределять систему на несколько компонентов, вначале (по привычке) был изобретен велосипед “демон над sqlite”, потом это стало грустно - и по итогу внедрили какой-нибудь там PostgreSQL. Нахуя там постгрес - а черт его знает, будет ли он использоваться на 100% - явно нет. Зато с ним удобнее. И вот почему-то это “удобнее” и “чтоб работало” - никак не переносится на другую платформу. Что пацаны в вебе тоже могут взять готовое решение и не использовать его на 100%, ну просто потому что сроки/бабло. Мое личное мнение - каждый товарисч, который псит на жабу - должен хотя бы чучуть на неё попрограммировать, и не хеллоуворлд, а взять сразу макет трейдинговой системы с потоками, блокировками и транзакциями - и охуеть в перспективе. Внезапно может оказаться, что записать три байта в порты ввода-вывода - это нихуя не рокетсцайенс, как казалось ранее. И внутри той же вебсферы есть какие-нибудь красивые решения (я правда их не видел, но и суслика тоже не видел).


Вывод из всего этого - жаба вполне годна для разработки, но хоть она не предполагает знания железяк - все же это знание будет полезным, ну и нужно понимать ограниченность области применения жабы и не пытаться натянуть сову на глобус и с полученным результатом скакать по интернетам с воплями жабо - это же интерпретатор.