Node.js против Java: эпическая битва за мысли разработчиков

1995 год был сумасшедшим временем в истории вычислительной техники. Сначала появилась Java, затем за ней последовал JavaScript. Имена делали их похожими на сиамских близнецов, только что отделившихся, но они не могли быть более разными. Один из них скомпилирован и статически типизирован; другой интерпретируется и динамически типизируется. Это только начало технических различий между этими двумя совершенно разными языками, которые с тех пор превратились в своего рода столкновение благодаря Node.js.

Если вы достаточно взрослые, чтобы жить в то время, возможно, вы помните ранний эпический пик Java. Он покинул лабораторию, и его измеритель ажиотажа был закреплен. Все видели в этом революцию, которая остановится ни на чем ином, как на полном захвате вычислительной техники. Это предсказание оказалось верным лишь частично. Сегодня Java доминирует в телефонах Android, корпоративных вычислениях и некоторых встроенных мирах, таких как диски Blu-ray.

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

Между тем то, что программисты изначально приняли за тупого близнеца, стало само собой разумеющимся. Несомненно, JavaScript оставался на плаву в течение нескольких лет, пока HTML и Интернет потянули за собой мир боргов. Но все изменилось с AJAX. Внезапно у немого близнеца появилась сила.

Затем появился Node.js, поразивший разработчиков своей скоростью. Мало того, что JavaScript был быстрее на сервере, чем кто-либо ожидал, но он часто был быстрее, чем Java и другие варианты. Его постоянная диета из небольших, быстрых и бесконечных запросов данных с тех пор сделала Node.js более распространенным, поскольку веб-страницы стали более динамичными.

20 лет назад это было немыслимо, но сейчас квази-близнецы сражаются за контроль над миром программирования. С одной стороны, глубокие основы прочной инженерии и архитектуры. С другой стороны - простота и повсеместность. Сможет ли старый мир Java, управляемый компиляторами, устоять, или скорость и гибкость Node.js помогут JavaScript и дальше поглощать все на своем пути?

Где побеждает Java: прочный фундамент

Я слышу смех разработчиков. Некоторые могут даже умирать от сердечной недостаточности. Да, у Java есть глюки и баги, но условно говоря, это Гибралтарская скала. До той же веры в Node.js осталось много лет. Фактически, могут пройти десятилетия, прежде чем команда разработчиков JavaScript напишет почти столько же регрессионных тестов, сколько Sun / Oracle разработало для тестирования виртуальной машины Java. Когда вы загружаете JVM, вы получаете 20-летний опыт работы надежного куратора, решившего доминировать на корпоративном сервере. 

Мир JavaScript быстро догоняет. Когда большая часть всей сети зависит от механизма выполнения JavaScript, на полировку всех краев уходит миллиард часов разработчика. Но у всех инноваций есть обратная сторона, потому что новые функции могут распространяться быстрее, чем база разработчиков может их усвоить. Разработчиков старой школы часто сбивает с толку код, наполненный новыми усовершенствованиями синтаксиса ECMAScript - и этот же новый код незаметно приведет к сбою некоторых старых браузеров. Бесконечный запас инновационных препроцессоров, таких как CoffeeScript и JSX, может быть отличным для разработчиков, которым нужны эти функции, но они усложняют остальным из нас, чтобы открыть случайный файл и немедленно его понять.

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

Где Node.js побеждает: вездесущность

Благодаря Node.js JavaScript находит себе место на сервере и в браузере. Код, который вы пишете для одного, скорее всего, будет работать одинаково для обоих. В жизни нет ничего гарантированного, но это так близко, как в компьютерном бизнесе. Гораздо проще придерживаться JavaScript для обеих сторон разделения клиент / сервер, чем написать что-то один раз на Java и еще раз на JavaScript, что вам, вероятно, потребуется сделать, если вы решили перенести бизнес-логику, написанную на Java, для сервер в браузер. Или, может быть, начальник будет настаивать на переносе логики, созданной вами для браузера, на сервер. В любом направлении Node.js и JavaScript значительно упрощают перенос кода.

Лидерство Node в этом мире только увеличивается. Самые сложные веб-фреймворки, такие как React, в последнюю секунду решают, запускать ли код на сервере или на клиенте. Один день он будет работать на клиенте, а в другой - на сервере. Какая-то умная логика примет решение на лету, основываясь на нагрузке, свободной оперативной памяти или еще чем-то. Некоторые фреймворки отправляют JavaScript в базу данных в качестве запроса, где он выполняется. Ваш код может работать где угодно, и уследить за ним становится все труднее, потому что он не отправляет открытки домой. Просто будьте счастливы, потому что вам не нужно думать о деталях.

Где Java побеждает: лучшие IDE

У разработчиков Java есть Eclipse, NetBeans или IntelliJ, три первоклассных инструмента, которые хорошо интегрированы с отладчиками, декомпиляторами и серверами. У каждого есть годы разработки, преданные пользователи и солидные экосистемы, наполненные плагинами.

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

Некоторые разработчики используют Eclipse или Visual Studio, оба из которых поддерживают Node.js. Конечно, всплеск интереса к Node.js означает появление новых инструментов, некоторые из которых, такие как IBM Node-RED, предлагают интригующие подходы, но они все еще далеки от того, чтобы стать такими же законченными или доминирующими, как Eclipse или IntelliJ.

Странно то, что разработчики, похоже, не используют эти инструменты. Командная строка должна была исчезнуть 35 лет назад с появлением Mac, но никто не сообщил об этом разработчикам Node.js. Варианты есть. Например, WebStorm - это надежный коммерческий инструмент от JetBrains, который включает в себя множество инструментов сборки из командной строки.

Конечно, если вы ищете среду IDE, которая редактирует и манипулирует кодом, новых инструментов, поддерживающих Node.js, будет достаточно. Но если вы попросите свою IDE разрешить вам редактировать, пока вы работаете с работающим исходным кодом, как кардиохирург разрезает сундук, ну, инструменты Java намного мощнее. Это все есть, и все это местное.

Где Node.js побеждает: запросы к базе данных

Запросы для некоторых новых баз данных, таких как CouchDB и MongoDB, написаны на JavaScript. Смешивание Node.js и вызова базы данных не требует переключения передач, не говоря уже о необходимости помнить о различиях синтаксиса. 

Между тем многие разработчики Java используют SQL. Даже когда они используют Java DB - ранее Derby, базу данных, написанную на Java для разработчиков Java, - они пишут свои запросы на SQL. Вы могли подумать, что они просто вызовут методы Java, но ошиблись. Вы должны написать код своей базы данных на SQL, а затем позволить Derby проанализировать SQL. SQL - хороший язык, но он полностью отличается от Java, и многим командам разработчиков нужны разные люди для написания SQL и Java.

Что еще хуже, многие программисты Java используют сложные библиотеки и схемы для преобразования данных из запроса SQL в объекты Java, чтобы они могли преобразовать их в шаблоны. Это безумный процесс и в конечном итоге довольно расточительный.

Где побеждает Java: типы 

Многие вводные курсы по программированию продолжают использовать Java, потому что многим серьезным программистам нравится статически типизированный код как из соображений простоты, так и безопасности. Код становится более строгим после того, как компилятор обнаруживает очевидные ошибки.

Однако JavaScript догоняет, и некоторые разработчики переходят на TypeScript, статически типизированный надмножество JavaScript, которое применяет всю магию проверки типов перед тем, как выплюнуть что-то, что выполняется в стеке JavaScript вашего браузера. Если вы любите шрифты, этого может быть достаточно, чтобы использовать JavaScript. Или вы могли бы просто признать имитацию самой искренней формой лести и придерживаться Java, которая с самого начала использовала статическую типизацию.

Где Node.js побеждает: синтаксическая гибкость

Раньше JavaScript был простым языком для всплывающих окон нежелательных предупреждений и двойной проверки ввода формы. Затем сообщество разработчиков создало множество различных версий языка, которые можно было преобразовать во что-то для браузера. Есть толпа CoffeeScript, предлагающая несколько различных синтаксисов, призванных удовлетворить вкус к более чистой пунктуации. Есть толпа React / Vue, которая смешивает HTML и JavaScript просто потому, что он чище. Есть TypeScript для любителей шрифтов и LiveScript для приверженцев функционального языка.

В мире Java вы также найдете огромное количество творчества, но по некоторым причинам оно не выражается во многих препроцессорах. Существует ряд языков, таких как Kotlin, Scala и Clojure, которые превращены в байтовый код для JVM, но почему-то они кажутся достаточно разными, чтобы выделяться как отдельные языки. Все препроцессоры делают жизнь JavaScript-программистов более увлекательной, потому что им нравятся разные способы формулирования или акцентирования кода.

Где побеждает Java: простой процесс сборки 

Сложные инструменты сборки, такие как Ant и Maven, произвели революцию в программировании на Java. Но есть только одна проблема. Вы пишете спецификацию в XML, формате данных, который не был разработан для поддержки логики программирования. Конечно, относительно легко выразить ветвление с помощью вложенных тегов, но есть что-то неприятное в переключении с Java на XML просто для создания чего-то. С JavaScript нет переключения передач. 

У Node.js была более простая сборка. Вы просто отредактируете код и нажмете «запустить». Что было тогда. Поскольку разработчики Node «улучшили» этот процесс, они добавили препроцессоры, которые берут ваш любимый поддиалект JavaScript и превращают его во что-то работоспособное. Затем менеджер пакетов Node должен найти нужную библиотеку. В большинстве случаев это просто работает, но иногда это не так, и вы тратите время на поиск нужного номера версии какого-либо артефакта, который вы создаете самостоятельно на отдельном этапе. И если вы допустите ошибку в хранилище артефактов, ну, номер версии снят, и вам придется снова повернуть колеса одометра.

У Java также есть сложный процесс сборки, который очень похож на метод Node.js, но не кажется, что он стал более сложным. Почему-то теперь Maven и Ant кажутся частью основы Java. Многие острые углы давно исчезли, и сборки работают чаще. Если бы существовала абсолютная мера сложности сборки, эти два языка могли бы быть похожими, но быстрый рост сложности JavaScript означает, что Java побеждает.

Видео по теме: советы и хитрости Node.js

В этом обучающем видео вы узнаете несколько методов, которые могут улучшить ваш опыт разработки Node.

Где Node.js выигрывает: JSON

Когда базы данных выдают ответы, Java прилагает все усилия, чтобы превратить результаты в объекты Java. Разработчики будут часами спорить о сопоставлениях POJO, Hibernate и других инструментах. Их настройка может занять часы или даже дни. В конце концов, код Java получает объекты Java после всех преобразований. А когда дело доходит до конфигурации, мир Java по-прежнему цепляется за XML и даже предлагает два основных синтаксических анализатора, чтобы дать разработчикам больше причин для беспокойства.

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

Где побеждает Java: удаленная отладка

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

Где Node.js выигрывает: рабочий стол

Там могут быть запущены некоторые Java-апплеты, и я все еще поддерживаю некоторые файлы Java JAR, которые я могу щелкнуть, чтобы запустить, но по большей части мир рабочего стола в значительной степени свободен от Java. С другой стороны, JavaScript продолжает захватывать все больше и больше действий, поскольку браузер съедает большую часть ролей для нашего рабочего стола. Когда Microsoft переписала Office для работы в браузере, жребий был брошен. Если вам все еще интересно, есть интересные варианты, такие как Electron, которые берут ваш веб-код и превращают его в автономное настольное приложение.

Где Java побеждает: карманные компьютеры

Приложения Android часто пишутся на Java, и 90 процентов новых телефонов работают под управлением той или иной версии Android. Многие люди даже не используют настольные компьютеры, потому что телефонов хватит на все.

Конечно, есть небольшая путаница. Многие разработчики пишут веб-приложения Node.js, ориентированные на мобильные браузеры как на iPhone, так и на Android. Если это сделано хорошо, производительность часто бывает достаточно хорошей.