Я ненавидел Javascript. А теперь он мне нравится

Оригинал поста на хабре

Моя карьера началась с написания программ для мобильных устройств. Я изучал C и Objective-C, чтобы работать с устройствами на iOS. У меня был чёткий контроль над программным обеспечением, я учился тому, как правильно работать с памятью, и проводил долгие часы за отладкой багов, которые возникали из-за моей небрежности (это было ещё до ARC). Я развивался с уклоном в сторону iOS, а так же так же начал изучать Java (и совсем недавно приступил к Kotlin) для перехода на Android.

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

Всё это время я оставался в своём приятном розовом мире, издеваясь над JavaScript разработчиками и насмехаясь над ужасной производительностью веб-приложений. Я отказывался даже трогать Javascript, и если мне всё же приходилось, то выбирал более привычный TypeScript. Конечно, это тот же Javascript, но хотя бы с типизацией. Мне нравится, когда у моих переменных и констант есть точный тип. Годы прямой работы с памятью поймали меня в ментальную ловушку.

Если у вас есть машина, то высока вероятность того, что вы не любите велосипедистов. Это известная психологическая проблема, и мне потребовалось довольно много времени, чтобы понять, что именно из-за неё я так не люблю Javascript. Я потратил годы обучения, усилий и боли на то, чтобы научиться правильно работать с памятью и этапами жизни приложения. И втайне я думал “Какого чёрта эти парни с Javascript называются разработчиками, при этом не разбираясь в управлении памятью? ”

Но я рос, меня интересовали совершенно разные вещи, хотелось воплощать новые идеи - и как-то мне потребовалось сделать веб приложение для нескольких простых задач, включающих управление доступом и авторизацию. Там требовалось всего несколько точек входа и ресурсов. Тогда я подумал про Node.JS, и решил - почему бы и нет? Всё выглядело достаточно просто и было бы легко это поддерживать.

За один вечер я написал нужное мне приложение. За один вечер.

Что мне потребовалось:

  • NodeJS
  • mLab (Mongo DB)
  • PugJS (язык разметки)
  • Несколько раз написать npm install --save xxx
Через несколько часов у меня было полностью рабочее приложение с авторизацией и контролем доступа.В тот момент меня ещё не заботил Redis, Docker, K8s и прочие хорошие вещи. Мой MVP был готов. Я мог его тестировать.

У меня была тестовая база без бэкапов и неслакируемый продукт на Digital Ocean. Но я уже тестировал моё приложение на живых пользователях, и я понял, что оно не такое волшебное, как мне показалось. Ну да ладно, ничего не потеряно - я просто немного поучился.

Дальше я стал дальше разбираться с Javascript и его незнакомой экосистемой. Когда ты пишешь под iOS и Android, то у тебя будет всего несколько зависимостей вроде Alamofire и Retrofit. Я ожидал увидеть что-то похожее. Как же я был неправ. Я понял, что же такое на самом деле World Wide Web. Это была огромнейшая паутина зависимостей. Это меня не на шутку испугало.

Однако, когда я разобрался с несколькими простыми практиками вроде использования полифиллов, транспилеров, стандартных зависимостей, и вообще вник в общую экосистему, мне стало несколько проще и комфортнее. Теперь я мог создать MVP чего угодно за несколько дней. Это было удивительно, и в этом была исключительно заслуга NodeJS.

Как только у меня получался MVP, я мог двигаться дальше и вкладывать время куда-то ещё. Мне нужно было думать о своих проектах, и Node.JS не оказался серебряной пулей. Ему есть очень крутые области применения, как и у любого другого языка, но не стоит писать на нём всё подряд только потому, что можешь.

Касательно самого языка, Javascript мне всегда внушал отвращение. Наверное, потому, что когда-то я писал на ActionScript 3.0. Вроде бы и JS и AS3 это ECMAScript - так какого чёрта AS3 настолько лучше, чем JavaScript? Ответ пришёл ко мне не сразу. Совместимость. Очень долго я не понимал, что для JS очень важна совместимость с браузерами. Но, когда появился Babel, Javascript начал меняться с огромной скоростью. Это было круто. Я начал наслаждаться тем, что пишу на Javascript, будучи при этом уверенным, что он прозрачно будет транспилирован для совместимости с чем угодно.

Этот пост я пишу преимущественно для людей, которые издеваются над Javascript. Мне вот до сих пор не нравится идея “нативных” JS приложений. Однако я понимаю, сколько гибкости это даёт мобильным и десктопным приложениям, и было бы лицемерно с моей стороны сидеть на своём VSCode и осуждать их. Так же мне нравится уже довольно популярная идея производительных гибридных приложений, где только компоненты ядра написаны на низкоуровневом языке.

Если вы видите разработчика, который ненавидит Javascript, то, скорее всего, он просто воспринимает вас как велосипедиста, который занял его дорожное полотно.


Из комментариев к оригиналу статьи (Tim):
Я начинал писать код на C для встраиваемых платформ. Затем я провёл 10 лет, разрабатывая на C# десктопные приложения, при этом периодически погружаясь с головой в C/C++.

Всё это время я смотрел, как маленькие компании пытаются делать кроссплатформенные приложения. Кто-то портировал C# приложения на Mac и Linux, и это ужасно выглядело и плохо работало. Кто-то пытался создать точно такое же нативное приложение… И не мог это завершить, будучи не в состояниях поддерживать развитие сразу трёх разных приложений на трёх платформах.

Когда я открыл для себя Electron, мой руководитель рассмеялся над идеей создания приложений на технологиях для веб сайтов. Я ушёл с работы, обучился TypeScript/JavaScript, нескольким фреймворкам, и написал приложение для визуализации данных, работающее с USB железом. В конце концов я неплохо заработал, продав это приложение предыдущему работодателю.

“Но Javascript гораздо медленнее, чем Х” - обязательно скажете вы. Конечно. Но вы всегда можете написать любые сложные вычисления на C++ и пользоваться этим из Javascript, получая лучшее из обоих миров.

Используйте каждый язык разработки уместно, и всё будет хорошо.