Моя карьера началась с написания программ для мобильных устройств. Я изучал 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, получая лучшее из обоих миров.

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

Комментарии (27)


  1. serf
    29.01.2018 21:06

    JavaScript вполне можно любить если код написан на TypeScript, особенно если флаг компиляции изначально установлен в «strict: true» и линтинг изначально включен и хорошо настроен.


    1. sanchezzzhak
      30.01.2018 10:58

      Можно и без type script, если есть тесты


      1. serf
        30.01.2018 11:00

        Тесты не отменяются и в случае использования TypeScript, хотя многие почему-то путают понятия и считают что тесты уже не нужны.


  1. Kioju
    30.01.2018 00:17

    Мне на эту тему ещё всегда Node-RED вспоминается — штука в принципе для драйверов умного дома, но при этом веб-приложения на ней собираются вообще непринужденно. А всё потому, что в основе Node js


    1. auine
      30.01.2018 14:51

      Ага, а в основе Node js — c++, где та картинка — ВОТ ЭТО ПОВОРОТ


  1. alex6636
    30.01.2018 00:53

    Лол, получается, посыл всей статьи в том, что js хорош, потому что в нем не нужно вручную управлять памятью? Ну так это не только в js


  1. DexterHD
    30.01.2018 01:25
    +1

    > Это было удивительно, и в этом была исключительно заслуга NodeJS

    Это исключительно ваша заслуга. Потому что вы потратили уйму времени чтобы понять азы, работая на языках типа Си. Вы просто грамотный разработчик имеющий хороший фундаментальный бэкграунд. Да, в грамотных руках JS дает именно те преимущества которые вы описали.

    Проблема же заключается с том, что 70% разработчиков node и js, даже не знают как он выполняется. О памяти они вообще ни чего не знают, для них весь мир сплошная магия. На вопрос что такое v8 и из каких компонентов он состоит они могут ответить только одним словом: движок. И все что они могут это из чужих пакетов, по мануалам собирать приложения как конструктор.

    Вот где раковая опухоль этой технологии.


    1. F0iL
      30.01.2018 09:12
      +1

      Вот где раковая опухоль этой технологии.

      Это раковая опухоль любой технологии. В том же C#, например, многие пишут LINQ-запросы, совершенно не представляя, как именно они транслируются в SQL (в итоге там может сгенериться какой-нибудь адовый селект на адовом селекте и кривым джойном погонять, попутно еще производя тонны ненужных аллокаций памяти),
      а про то что творят низкоквалифицированные PHP-разработчики вообще говорить страшно :)


      1. mayorovp
        30.01.2018 09:57

        Справедливости ради, совершенно не нужно знать SQL чтобы писать нормальные LINQ-запросы. Достаточно общего понимания и SQL профайлера. А вот в планах выполнения запроса разбираться придется.

        Вот в тех случаях когда LINQ уже не справляется — тут и правда без SQL обойтись не получится.


        1. jehy Автор
          30.01.2018 10:19

          Специально не добавлял в статью собственное мнение, чтобы посмотреть, сколько минусов получит перевод без неё. Было интересно, правда ли работает описанный комплекс автомобилиста. Таки работает!


          Но вы здесь привели отличный пример с SQL, и я не могу удержаться.


          Дело в том, что, когда вошли в обиход всякие ORM и query builders, я был сертифицированным Oracle DBA, и уже несколько лет всё писал исключительно при помощи прямых запросов в РСУБД. И я до сих пор порой ловлю себя на мысли "какого чёрта они говорят, что умеют работать с РСУБД, если в их приложении не написано ни одного запроса? Их запросы неоптимальны, у них куча лишних обёрток, и они не понимают, как это работает!". А когда в обиход стал входить NoSQL, то я вообще порой исходил на пену.


          Но ничего. Сейчас использую РСУБД, NoSQL, пишу на Java, C#, C++, Node.js — и мне хорошо и радостно использовать каждую технологию там, где это уместно. Наверное, именно в этом и есть отличие сениора с многолетним опытом работы.


          1. jehy Автор
            30.01.2018 10:59

            На текущий момент у статьи 18 плюсов и 7 минусов. За перевод без какого либо личного мнения. Что говорит только о том, насколько прав автор в своей статье.


      1. DexterHD
        30.01.2018 11:07

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


    1. bro-dev
      30.01.2018 10:44

      Это не раковая опухоль, а развитие путем наращивания уровней абстракций.


      1. Neikist
        30.01.2018 10:52

        А, это скайп новый десктопный и мобильный просто уровней абстракции нарастил. А я то думал…


      1. DexterHD
        30.01.2018 11:06

        развитие путем наращивания уровней абстракций

        Без понимания основных абстракций лежащих в основе всей технологии? Странное развитие…


    1. justboris
      30.01.2018 12:01

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

      Я с фреймворками на других языках разве не так? Что Django, что Rails не требуют глубоких знаний Ruby или Python, все тоже собирается из готовых блоков или плагинов.


  1. erty
    30.01.2018 03:50

    Кто-то портировал C# приложения на Mac и Linux, и это ужасно выглядело и плохо работало


    Эх. Немного не дождался он .Net Core (Прям как я с долларами...)
    и UWP конечно страшненький, но не страшнее электрона и уж точно не жрёт по пол гига памяти для рисования окошка с чатом.


  1. Amareis
    30.01.2018 06:28

    Ой вей, он мог бы с таким же успехом поставить джангу и за тот же один вечер собрать это самое


    полностью рабочее приложение с авторизацией и контролем доступа.


    1. LionZXY
      30.01.2018 16:54

      Или спринг ?_(?)_/?


  1. sticks
    30.01.2018 07:49

    Какая-то разновидность Стокгольмского синдрома, видимо.


  1. dkukushkin
    30.01.2018 13:58

    Хоть люби хоть ненавидь — альтернативы в Web нет и не предвидется. А Web — это наиболее развивающийся сектор, можно сравнить разве что с мобильными приложениями.


  1. potan
    30.01.2018 13:58

    Главное достоинство js — в него много компиляторов с языков высокого уровня.


  1. hexploy
    30.01.2018 18:36
    +1

    Да-да…

    1. Отрицание
    2. Гнев
    3. Торг
    4. Депрессия
    5. Принятие


  1. Tiendil
    31.01.2018 10:48
    -2

    Стокгольмский синдром :-D


  1. koldoon
    31.01.2018 11:30

    Простите, я наверное старею, но… Кто и зачем придумал это слово — «транспайлер» (transpiler) или, что еще хуже, когда его называют «транспИллер», прям из разряда «андройдов», «плугинов» и «бровзеров». Это не к автору поста претензия, конечно же, просто накипело. Есть же «трансляция», зачем еще что-то придумывать? Компиляция — в машинный код, трансляция — из одного языка в другой, пусть даже и очень похожий…


    1. jehy Автор
      31.01.2018 11:33

      Сначала это слово вошло в обиход в английском, потом приползло в русский. Гораздо более узкое значение, чем у "трансляции", видимо поэтому и прижилось.


  1. m0Ray
    02.02.2018 02:59

    Не ненавидел JS и не люблю его теперь. Просто приходится мириться: ничего иного для построения мало-мальски интерактивной вебморды не было и нет.
    Думаю, это уникальная ситуация в технологиях, когда альтернативы настолько хуже монополиста на протяжении не одного уже десятилетия.