JavaScript — лучший язык программирования для начинающих. Так это или нет?

Автор оригинала: Matthew MacDonald
  • Перевод
JavaScript, несмотря на его многочисленные недостатки, возможно, является самым лучшим языком программирования для начинающих разработчиков, и лучшим языком, с которым могут повозиться дети.

image

Шёл 2007 год. Отличное издательство технических книг O’Reilly Media обратилось ко мне, предложив одну идею. Они спросили меня о том, хотел бы я написать книгу о JavaScript, которая предназначалась бы для абсолютных новичков в программировании. «С какой стати?», — тут же задал я встречный вопрос.

Нельзя было сказать, что JavaScript в те времена был совершенно бесполезным языком. Но он представлял собой лишь один, далеко не самый важный ингредиент из тщательно отобранного набора технологий, необходимых для разработки веб-сайтов. Да, небольшие кусочки JS-кода могли использоваться для проверки форм, или для того, чтобы подсвечивать кнопки, на которые наводят указатель мыши. Но JavaScript представлял собой лишь необязательное дополнение к функционалу сайта. Если убрать его со страницы, то всё продолжало работать практически так же, как и с его использованием.

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


Самым очевидным способом использования JavaScript, как мне, по наивности, тогда казалось, было примерно следующее: большой серверный фреймворк должен сформировать весь необходимый JS-код и встроить его в страницу, предназначенную специально для вашего браузера. JavaScript-код, формируемый сервером, мог бы оказаться слишком громоздким, но он был бы предназначен для конкретной версии браузера. А учитывая то, что JS играл лишь роль вспомогательного механизма, при этом всё работало бы как надо даже в том случае, если бы посетитель сайта полностью отключил бы JavaScript.

Нет нужды говорить, что тогда я книгу о JavaScript не написал. Я продолжал заниматься серверным программированием и писать о моих любимых технологиях (как правило, о языке С# и о .NET Framework). Прошло много лет.

Затем произошло нечто странное.

JavaScript буквально «взлетел».

Я всё ещё не думаю, что JavaScript заслуживает чести называться лучшим в мире языком программирования. Я даже, если уж совсем честно, не считаю его очень хорошим языком. Но кое-в чём я своё мнение поменял. Теперь я считаю, что JavaScript, вероятно, является лучшим первым языком для детей и начинающих программистов. Всё дело в том, что у JavaScript есть одно серьёзнейшее преимущество перед всеми остальным языками программирования.

Потрясающая распространённость JavaScript — его главное преимущество


Одним из уникальных преимуществ JavaScript является его распространённость.

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

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

Похожие механизмы работают и тогда, когда речь заходит об изучении программирования. Поначалу проблема распространённости языка не кажется особенно важной для того, чья цель заключается в том, чтобы изучить проверенные временем практические приёмы разработки программ. Но множество тех же самых проблем актуальны, как и для профессионального программирования, в обучении программированию. Если вы хотите, чтобы тем, что вы создали, мог бы воспользоваться кто угодно, то JavaScript — это единственная альтернатива.

Предположим, вы разрабатываете замечательное приложение, которое, задавая пользователю вопросы, определяет его личностный профиль. Настроить среду разработки довольно просто. Но что произойдёт, когда вы захотите отправить свою программу товарищу? Понадобится ли ему устанавливать у себя среду времени выполнения или воссоздавать ту же среду разработки, что и у вас? Нужно ли будет «подкрутить» настройки безопасности его компьютера прежде чем он сможет загрузить и установить вашу программу? Может быть, ваш товарищ использует операционную систему, которая попросту не поддерживает вашу программу, или мобильную платформу, на которую, если не вдаваться в детали, можно устанавливать только профессиональные приложения, распространяемые через iTunes или Google Play? Если же вы, для разработки программы, используете JavaScript, а для её распространения — простой веб-сайт (например, GitHub позволяет бесплатно создавать подобные сайты), то все эти проблемы попросту исчезнут.

А если наш будущий программист — ребёнок, то вот вам неопровержимый факт: дети и браузеры очень сильно связаны. Если вы наблюдали за ребёнком, который работает на компьютере (не на мобильном устройстве), то вы, возможно, заметили, что он как минимум 98% времени тратит на работу с браузером. Дети играют в браузерные игры, используют социальные сети, занимаются школьными делами в Google Classroom и Google Docs. И если код, который пишут дети, будет работать в родном для них браузерном мире, это будет совершенно естественно.

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

Недостатки JavaScript


Как насчёт проблем JavaScript? У этого языка есть серьёзные недостатки, его причуды, противоречия и ограничения могут быть крайне неприятными для того, кто только начинает изучать программирование. К счастью, существуют современные решения, которые могут сгладить большинство недостатков JavaScript.

Разберём четыре основные претензии, предъявляемые к этому языку.

▍1. Проблема работы с типами данных в JavaScript


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

Вот пример кода, который обречён на провал:

var myNumber = 100;
myNumber = myNumbr + 1;

Увидели ошибку? Во второй строке, на самом деле, используются две переменных: переменная myNumber, которая была объявлена в первой строке, и некая фиктивная переменная myNumbr. Мы знаем о том, что вторая переменная — это результат опечатки, но JavaScript сообщит нам об этом только во время выполнения программы, выдав сообщение об ошибке, которое выглядит как ReferenceError: myNumbr is not defined. То же самое происходит и в том случае, если при записи имени переменной перепутали большие и маленькие буквы (например, переменная из myNumber случайно превратилась в MyNumber). Проблема, но уже другого характера, может возникнуть и в том случае, если вы, считая, что некая переменная хранит число, прибавляете к ней другое число, а эта переменная, на самом деле, содержала строку или что-нибудь другое. JavaScript в таком случае не сообщит об ошибке, но результат вычислений будет совсем не таким, какого можно ожидать от сложения двух чисел. Каждый JavaScript-разработчик может вспомнить неприятную историю такого рода, когда путаница с типами вызывала странные ошибки в программах.

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

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

// @ts-check

Вот пример, в котором имеются две ошибки, ни одна из которых, с точки зрения JavaScript, ошибкой не является.


Проблемы, которые JavaScript не считает ошибками

Если добавить в начало этого файла комментарий // @ts-check, то VS Code выделит строки кода, которые содержат потенциальные ошибки.


Выделенные строки кода

Если навести указатель мыши на выделенную строку, появится всплывающее окно, содержащее объяснение проблемы.


Объяснение проблемы

Какие из этого можно сделать выводы? Хотя JavaScript толерантно относится ко многим нехорошим вещам, если скомбинировать JavaScript с качественным редактором кода и с правильными дополнительными инструментами, можно создать среду разработки, похожую на те, которыми обладают другие современные языки программирования. В результате разработка на JavaScript оказывается такой же удобной, как и на других языках, и, естественно, другие его преимущества никуда не деваются.

▍2. JavaScript не поддерживает ООП


Объектно-ориентированное программирование (ООП) — это подход к моделированию и организации кода. Если методики ООП применяются правильно, они помогают программисту создавать простой и хорошо организованный код. Кроме того, ООП упрощает повторное использование важных функциональных возможностей программ.

JavaScript печально известен отсутствием поддержки объектно-ориентированного программирования. На самом деле, JavaScript-разработчики традиционно обходят этот недостаток, используя всяческие странные конструкции. Эти конструкции могут что-то значить для того, кто уже изучал ООП (и даже для того, кто не изучал, а просто скопировал в свой код некий шаблон и привык с ним работать). Но если вы — совершенно новый человек в программировании, использование подобных сомнительных конструкций, реализующих базовые концепции программирования — это совершенно неправильно.

К счастью, существуют красивые решения, обеспечивающие поддержку ООП в JavaScript. Моё любимое решение такого рода — это TypeScript — опенсорсный проект, запущенный Microsoft в 2012 году. TypeScript представляет собой нечто вроде улучшенной разновидности JavaScript, которая поддерживает ООП (а также многие другие полезные возможности вроде строгой проверки типов).

Кто-то может сказать, что мы говорим о JavaScript, и что TypeScript — это, всё же, не JavaScript. И, на самом деле, это так. Но вот одна интересная деталь. Код пишут на TypeScript, а затем конвертируют его в JavaScript перед тем, как он будет выполняться. Это позволяет пользоваться всем лучшим из миров TypeScript и JavaScript. Если вы выберете TypeScript, то у вас будет современный язык программирования, на котором вы сможете писать свой код, и та широчайшая поддержка, которой пользуется обычный JavaScript.

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

Не верите? Тогда подумайте о том, что некоторые из самых современных инновационных настольных приложений используют комбинацию из TypeScript и Electron — фреймворка, который позволяет выполнять JavaScript-код за пределами традиционного браузера (хотя надо отметить, что Electron пользуется браузерными возможностями). Один из наиболее впечатляющих примеров подобного приложения — это редактор VS Code. Получается, что тот самый инструмент, с помощью которого очень удобно писать JavaScript-код, сам написан на JavaScript. Правда, если говорить точнее, то VS Code написан на TypeScript, но код, написанный на этом языке, всё равно, преобразуется в JavaScript-код.

Конечно, изучая программирование вовсе необязательно использовать TypeScript, и новые JavaScript-программисты, если решат так поступить, смогут сделать очень многое, не изучая принципы ООП. Это, на самом деле, вопрос выбора. В любом случае, можно отметить, что JavaScript — язык динамично развивающийся, и в него постепенно добавляются возможности, сближающие его со всем тем ценным, что есть в TypeScript.

▍3. Вокруг полно некачественного JavaScript-кода


Что тут сказать. Некачественный код можно написать на любом языке программирования. Слышали когда-нибудь про Visual Basic?

▍4. Для JavaScript-разработки нужны дополнительные библиотеки и фреймворки


Для того чтобы получить доступ к более широкому, чем есть в языке, набору функциональных возможностей (и не изобретать велосипеды), JavaScript-программистам нужно использовать библиотеки и фреймворки сторонних разработчиков. Выбор правильных ингредиентов, используемых при создании некоего проекта — это не так просто, как может показаться на первый взгляд. Речь идёт, в частности, о том, что выбранные дополнительные инструменты должны правильно решать поставленные перед ними задачи, нужно, чтобы у программиста была бы уверенность в том, что они ещё долго будут пользоваться поддержкой своих разработчиков, нужно, чтобы они не конфликтовали друг с другом.

С некоей разновидностью этой проблемы сталкиваются и разработчики, использующие другие языки. Однако надо отметить, что немногие языки страдают от этой проблемы так же сильно, как JavaScript. Для того чтобы стать серьёзным программистом в открытом для всех JavaScript-мире, нужно собрать собственный набор инструментов разработки. При этом каждый из возможных вариантов выбора настолько сложен и многогранен, что понять, подходит ли вам, скажем, какая-то библиотека, можно только очень хорошо её изучив (а когда вы её изучите, может оказаться так, что она уже потеряет актуальность и на её место придёт что-то новое, притягивающее, возможно — на короткое время, всеобщий интерес).

Каким бы печальным всё это ни было, эти проблемы, на самом деле, не влияют на новичков. Если некто изучает программирование с использованием JavaScript, то ему лучше всего держаться в стороне от фреймворков и библиотек, идёт ли речь о чём-то широко известном, вроде jQuery, Angular, React или Vue, или о чём-то изобретённом в тот момент, когда было написано это предложение, или в ту секунду, когда была опубликована эта статья. Конечно, новичок, хорошо освоив фундаментальные вещи, вероятно, захочет ознакомиться, как минимум, с одним из популярных дополнительных инструментов. Но это — уже совсем другая история.

Итоги


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

Уважаемые читатели! Согласны ли вы с тем, что JavaScript — это, в современных условиях, самый лучший язык для обучения программированию? Если не согласны — тогда, может быть, вы знаете какой-нибудь язык, который лучше подойдёт для этой цели?

RUVDS.com
946,44
RUVDS – хостинг VDS/VPS серверов
Поделиться публикацией

Похожие публикации

Комментарии 100

    +4
    Хороший обзор, только вот JS уже давно поддерживает ООП, не так ли? Классы работают во всех современных браузерах.

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

    Для тех, кто хочет возразить, сначала посмотрите на статистику вашего веб приложения / сайта и убедитесь, что просмотры с IE не равны 0.
      +1
      И? Это не полноценный ООП, ненастоящий и вообще сахар. Публичные поля доступны лишь в предыдущем 72 хроме, приватные вообще нигде.
        +9
        Вы хотели сказать «это не такое ООП, к которому я привык»?
          +5
          я-то как раз привык к такому, но это не меняет сути
          +1
          В проектах, где нужны public, private, protected, код пишут на TypeScript, который автоматически компилится в JS.

          yarn add typescript

          Проблема решается за 10 секунд
            –4
            ага, который работает только в девелопе. Оно, конечно, сильно помогает, но очередной костыль который приходится ставить. Ещё и приходится выбирать (а от места работы и адаптироваться), к PropTypes\Flow\TS\еще_какая_ересь
              0
              Все пишут: «нет типизации в JS? просто используй TypeScript». А почему в браузерах просто не создать еще один строго типизированный язык?
              +1

              https://ru.m.wikipedia.org/wiki/Объектно-ориентированный_язык_программирования


              Можете внести правку в Википедию если сможете конечно аргументировать

                +2
                Сложное ООП(условные приватные поля) это в 95% случаев просто меньшее зло энтерпрайза.

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

                Для сравнения смежная по назначению концепция API хороша именно обьективно — это четкий вход-выход из изолированного мирка кода решающего конкретную задачу для всех желающих
                  0
                  Слушайте, ну можно же приватные поля создать через замыкание. Автор напирает на то, что хитрые конструкции и всё это сложно для начинающих… Так может это им (начинающим) и не нужно вовсе.
            +1
            2. JavaScript не поддерживает ООП
            Похоже, автор так и не узнал ничего нового о javascript с 2007 года. Хотя даже тогда это утверждение не было истинным, как выяснили в том числе в холиворах на Хабре. Впрочем, в источнике автор честно пишет о себе, что он писатель и кодер.

            Непонятно, по каким критериям была выбрана статья для перевода. Никаких откровений тут нет.
              +1
              Где-то в тот момент, когда заканчивается первый пункт про типизацию, начинается ад и ересь. JS поддерживает ООП. Некачественного кода полно на любом языке. Фреймворки нужны в любом языке.
                –2
                В оригинале: «JavaScript doesn’t do OOP»

                И это правда. ДжаваСкрипт не годен для ООП разработки. Как-то сахарно может и чем-то костыльно поддерживает, но не является ООП-языком. Как и Си, например.

                ДжаваСкрипт умеет прикидываться функциональным языком. При должном старании программиста можно. Да только смеются функциональщики над такой сладкой поддержкой))
                  +7
                  Смотря какой смысл вкладывать в понятие ООП. И в понятие «функциональный». Короче, в итоге всё сводится к тому, что JS не оправдывает ожиданий конкретных людей. Возможно, проблема всё же в ожиданиях?
                    –3
                    Точно сказано!
                    Вывод: JS не оправдал ожиданий. Детей к нему не допускать.
                      +1
                      Я как-то пытался ответить на вопрос — чем JS классы — не классы.
                      Так и не смог.
                      Если применить широкоизвестный метод утиной типизации для сравнения JS и C++ — то таблица виртуальных методов в C++ крякает как прототипы в JS.
                  +9

                  Недостатки Javascript. Позволяет, нет, скорее провоцирует, писать нечитаемый код. На Javascript можно писать читаемый код. Но с большой вероятностью будет написан нечитаемый, потому что в первом случае надо прилагать значительные усилия, а во втором — нет.


                  В языке отсутствует стандартная библиотека. Отсюда эти кошмарные npm, сотни зависимостей даже для "Hello world", тысячи и десятки тысяч для любого нетривиального. Все это обновляется по нескольку раз в день. С изменениями в API. С конфликтами версий. С необходимостью регулярно вникать что там поломалось и почему.


                  Недавно я с обеда пришел и за время проведенное на обеде (1 час), какая-то зависимость сменила две версии. Я не шучу… Надо было сделать скриншот.


                  На мой взгляд, это кошмар.


                  Но вообще эту тему можно долго продолжать. Просто и так уже на несколько минусов наговорил и использовал единственную возможность что-то сказать за день.

                    +3
                    Мне кажется, что JS, как большая и самостоятельная экосистема, только-только начинает становиться. Появляются новые сферы применения языка, новые современные плюшки вроде классов тех же самых, воркеры, которые и есть, можно сказать, настоящая многопоточность. В общем, язык устаканивается. А то, что какая-то зависимость сменила 2 версии за час, так это же не JSa проблема, а разраба либы. Молодец, что быстро пофиксил глюки.
                      +3
                      современные плюшки вроде классов тех же самых

                      Вот уж современная плюшка, так современная.
                      +3
                      Что плохого, если либа сменила минорные версии. Значит над ней интенсивно работают. А работать могут сразу несколько человек. Но это конечно неверный флоу. Исправления надо тестировать и даже минорные исправления должны быть накопительными.
                        0
                        А почему в браузерах просто не создать еще один строго типизированный язык?
                          0
                          Потому что это ни разу не «просто» Спросите у Дарта
                            0
                            Ну да, но альтернативы как бы нет. В Бэкенде столько языков, а во фронтЕнде только 1
                              0
                              На самом деле на фронте альтернативы тоже есть. TypeScript, coffee, Elm, тот же Дарт…
                                0
                                Я бы не назвал это полноценной альтернативой языку JS ибо всё это суперсеты js. Немного разный синтаксис и фишки, но язык то тот же.
                                  0
                                  Ну почему же? У всех этих языков разные парадигмы, js тут выступает в роли «jvm» по сути.
                                    0
                                    Парадигмы разные, но движок один и тот же. Посему и не совсем. Это не одно и тоже, но и не совсем разное )
                                      0

                                      Вы ещё скажите, что Java, Scala, Kotlin и Clojure – не совсем разные, потому что у них один движок – JVM. Да и у нативно компилируемых движок один – машкод, поэтому C++, Haskell и Common Lisp тоже не совсем разные.

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

                                Никто так делать не будет.
                                TOR же устанавливают для захода на сайты .onion

                                Его устанавливают исходя из других целей, таких как анонимность и заход на сайты, которые никто в здравом уме не разместит в открытом интернете.
                                  0
                                  И что, все просто будут ныть, устанавливать node модули, которые весят больше самого сайта с картинками, по три дня настраивать сайт, чтобы его только запустить, и это будет считаться современным программированием?
                                    0
                                    Можете писать сайт руками на чистом JS, который будет весить в сумме как самая маленькая картинка и запускать сайт через 3 месяца. Можете вообще не использовать JS, и запускать сайт в продакшн через 3 дня.
                                    Что поделать, груз обратной совместимости с технологиями, которые разрабатывались совершенно для других целей.
                                      0
                                      Можете писать сайт руками на чистом JS, который будет весить в сумме как самая маленькая картинка и запускать сайт через 3 месяца.
                                      Шта? Не так уж и давно, поголовно и массово запускали сайты на чистом js все кому не лень. Примерно за неделю, максимум две. Ага, так и было. Всего то лет с десять назад. А может быть «те» люди, которые запускали все это дело на js — понимали что они делают? Ну а как иначе вы объясните сей «феномен»?)
                                        0
                                        ХЗ, сайты стали тяжелее наверное. Сплошные SPA и куча ненужного функционала.
                            0
                            Все это обновляется по нескольку раз в день. С изменениями в API. С конфликтами версий. С необходимостью регулярно вникать что там поломалось и почему.

                            npm конечно не без проблем, но вы явно перегнули. К тому же уже давно есть package-lock
                            +2
                            Сам исследую использование ES для обучения детей, но фокус в статье настораживает:
                            1. Незнание «use strict»?
                            2. Классическое ООП от родоначальника Smalltalk. Гораздо шире в возможностях (динамическое наследование, множественное наследование и т.п.).
                            3,4. Имхо, JavaScript оказался в тени проблем npm.
                              0
                              JavaScript, насколько я понимаю, поддерживал и поддерживает полноценное ООП, только оно сделано в прототипном стиле.
                                0
                                Да, JS поддерживает все парадигмы программирования так или иначе. И это одна из важнейших причин, почему к нему не стоит подпускать новичков.

                                Язык для вхождения в программирование должен быть кристально прост и непробиваем. Как Паскаль или Лисп в древности.

                                Единственный бонус от JS — он есть везде и всегда. В персоналках и мобильниках, на планшетах и вообще любых устройствах и платформах с браузером. То есть, когда незрелый юниор окрепнет умом и овладеет правильными привычками, он сам найдет этот JS-ящик Пандоры.
                                +4

                                А я бы добавил к недостаткам/сложностям/вызовам для новичков ещё асинхронность языка. Это усложняет понимание кода. Можно конечно писать для начала и без асинхронности, но это важная часть языка.

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

                                    Просто для тех задач, где он используется (UI, обработка веб-запросов в Node.js) асинхронность — это необходимость.
                                      0

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

                                    +5
                                    По названию я подумал, что это будет самая короткая статья на хабре:
                                    Нет. <Конец>
                                      –2
                                      JavaScript — лучший язык программирования для начинающих. Так это или нет?

                                      Короткий ответ — «нет», длинный — тоже «нет».
                                        –3
                                        Помимо того, что перечислил автор, нужно еще добавить тот факт, что в JS все меняется настолько быстро и это все заставляет новичка просто рыдать. Вчера люди использовали коллбэки, сегодня промисы, а завтра уже все на fetch. Про фреймворки и говорить не стоит. Но плюсы при изучении все же есть. Ютуб просто завален видео про JS, полно статей и прочие вещи, которые помогут на начальном этапе обучения.
                                          +1
                                          Каша у вас какая-то. При чем тут fetch. И хватит уже промисами всех пугать, они уже лет 5 как не «новая фишка».
                                          –2
                                          Новичку js не подходит. По одной причине. Js позволяет вообще не думать…
                                          И даже думающий человек связавшись с js — 99.9% времени потратит на «покеты». И всего лишь 0.01 на js. В этом пока главный недостаток js в целом.
                                          Порог вхождения минимален. Любой дебил может «писать» на js, замешивая «покеты вкучу». Вот только обычно у таких «писак», коих 99.9% — исключительно и только — одно говно получается. Что собственно и видно повсеместно, даже невооруженным взглядом.

                                          Новичку единственное что нужно — это универ. Сильно, очень сильно сократит обучение ремеслу. Это кажется, что 5 лет для js не нужно. Однако, любой дебил без универа самостоятельно и внятно не поймет js и за 200 лет…
                                            0
                                            Я как новичок, не считаю что JS хорош для новичков, во первых мало знать один лишь JS, вообще мало знать синтаксис, надо уметь что то делать на этом языке, а вот тут то и всплывает факт, что сейчас чистый JS мало где используется, сейчас нужно знать фреймворки например React, Vue или Angular, неплохо бы знать ещё Nodejs, в итоге чтобы найти работу или что то сделать надо учить дополнительно много чего. Я считаю что в этом плане лучше Python, он позволяет очень быстро буквально в пару строк сделать что то полезное, например почистить файлы или сделать парсер курса валют или телеграмм бота и при этом все очень быстро и код получается понятный и короткий. Опять на Nodejs нет нечего подобного по типу Django, поверьте я изучал сперва JS + AngularJS +Express+ Nodejs, могу без проблем написать CRUD, но только это никому не нужно. поэтому для себя решил освоить React для фронтенда и Django для бекенда.
                                              0
                                              Я как новичок, не считаю что JS хорош для новичков

                                              В статье все-таки речь идет о детях. Не думаю что у них цель — получить работу по завершению курса.
                                              –6
                                              javascript ну нафиг, лучше уж python.
                                              ps: как на этом прекрасном языке записать данные в файл на диск, получить список bluetooth устройств по близости или найти все собственные вектора матрицы.
                                              Например такой:
                                              |  3 -4  4 |
                                              |  2  3  2 |
                                              |  2  0  5 |
                                              
                                                0
                                                1)
                                                require('fs').writeFile(...)


                                                2)
                                                const bluetooth = require('node-bluetooth');
                                                const device = new bluetooth.DeviceINQ();
                                                device.listPairedDevices(console.log);


                                                3) Точно так же как нa питоне.
                                                  0
                                                  3) Точно так же
                                                  import numpy as np
                                                  m=np.mat([[3,-4,4],[2,3,2],[2,0,5]])
                                                  w,v=np.linalg.eig(m)
                                                  

                                                  python не способен найти все собственные вектора этой матрицы
                                                    0
                                                    nympy это не python, а библиотека. Напишите на чистом python, и сравните с реализацией на js. Алгоритмически выйдет одно и то же.
                                                    Ну и вообще, 100% есть какая-нибудь либа на js для этого)
                                                  0
                                                  Ещё нехватало, чтоб рандомные скрипты из интернета мне что-то на диск писали.
                                                  0
                                                  Для начала добавьте
                                                    0
                                                    … подддержку (script language=%good_language%) (скобки треугольные) в firefox. И добавляйте понемногу.
                                                    Какой язык подойдет для этого?
                                                    +2
                                                    Лучшее в JS то что он «a lisp». Скриптовый язык с очень маленьким количеством ограничений.
                                                    Пресловутые лисповские функции которые возвращают функции в js это обыденность в лице коллбеков которые делают даже джуны.

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

                                                    Ну и интеграция с html/css хорошая «из коробки», особенно если добавить jQuery.
                                                    С тем-же jQuery ещё и всякий парсинг и вообще работа с нетом в целом становится простой.
                                                      0
                                                      Лучшее в JS то что он «a lisp».
                                                      Никогда не понимал этой фразы. Лямбда-функции были ив других языках, они не становятся из-за этого «a lisp». Чтобы быть «a lisp», нужна как минимум гомоиконность.
                                                      0
                                                      Оригинал: «JavaScript is the only candidate.»
                                                      Перевод: «JavaScript — это единственная альтернатива.»
                                                      Вывод: оказывается, переводчикам статей о языке JavaScript не обязательно уметь в язык русский.
                                                      Альтернатива не бывает единственной, она бывает только чему-то ещё.
                                                        +2
                                                        Альтернатива не бывает единственной
                                                        Безотносительно точности перевода: альтернатива вполне бывает единственной.
                                                        +3

                                                        Как тут не вспомнить:
                                                        image

                                                          0
                                                          JS хорош тем, что им можно обмазать язык Lua, и вот там, в песочнице, уже можно спокойно резвиться детям.
                                                            –1
                                                            JavaScript не поддерживает ООП

                                                            Странное утверждение для языка, где все переменные априори являются экземплярами тех или иных классов.
                                                              +2
                                                              Технически это неверно. Значения примитивных типов не являются экземплярами классов.
                                                                0
                                                                но так же являются объектами со свойствами и методами.
                                                                  +2
                                                                  Не являются. Просто в определённых обстоятельствах для них создаются объектные обёртки. Это легко проверить:

                                                                  let a = 1;
                                                                  a.b = 2;
                                                                  console.log(a.b); //undefined
                                                                  
                                                                    0
                                                                    Вы уверены? Есть ссылка на соответствующую доку. Я туда не копал и утверждать не могу, но могу написать класс аналогичный намберу «а» и пропустить его через проксю, в которой буду перехватывать операции присвоения и игнорировать их. И это получится объект, но ему нельзя будет присвоить свойство. Так же объекту можно поставить свойство writable: false. И это тоже больше похоже на наш пример.
                                                                    В питоне такой пример вообще не пройдёт. Будет ошибка во торой строчке.
                                                                      +1
                                                                      Погуглите «javascript boxing unboxing».
                                                                        +1
                                                                        Согласен, спасибо ) День прошёл не зря )
                                                                          0
                                                                          Кстати, если так задуматься, это аргумент против того, чтобы js давать новичкам. Весьма неочевидный способ выстрелить себе в ногу.
                                                                            0
                                                                            Я начинал с питона и щас с удовольствием сижу на typescript. Но так для себя думаю, что питон для начала более выгодный язык. У js достаточно много подводных и не всегда очевидных вещейю А на гарвардском курсе SC50 вообще начинают с С. Что тоже есть весьма неплохо ибо понимаешь как оно всё устроено.
                                                                              0
                                                                              Понимать как всё устроено лучше после того, как понимаешь, что именно устроено) Я учился на паскале, и мне кажется, это неплохой выбор. Минимум неочевидностей.
                                                                                0
                                                                                Это да ) Мне на CS50 после питона и js было проще, чем тем, кто с нуля пришёл.
                                                                  +1
                                                                  Спасибо! Теперь буду знать.

                                                                0
                                                                Чёт я не думал, что модификаторы доступа являются определяющим фатором ООП… В JS всё — объекты. Способы организации кода — это другой вопрос. Нужны модификаторы — typescript. JS прекрасен хорошей поддержкой одновременно разных парадигм. Если нужна какая-то одна парадигма — есть куча надстроек, которые улучшают как функциональный стиль так и ООП. Я уже не говорю про поддерживаемые платформы.
                                                                  0
                                                                  Я бы начал обучение с блок-схем и понятий алгоритм. А уже потом суровый BASIC.
                                                                    0
                                                                    На самом деле, для меня загадка, почему уже практикующие разработчики до сих пор ставят вопрос об обучении новичков с выбора первого языка программирования.
                                                                    Все же это программирование это не просто кодинг, но алгоритмизация и понимание происходящих «под капотом» процессов.
                                                                    Я бы рекомендовал странную, но довольно эффективную связку:
                                                                    1) Начать с Python. Это язык, который менее всего отвлекает от осмысления самих алгоритмов, не сбивая новичка сложностями реализации. У него есть крупное коммьюнити, отличные мануалы и более-менее однозначный стиль написания кода. Человек научится искать ответы на вопросы (потому что будет их находить), больше времени посвящать разбору алгоритмов, перенося навык их построения на кончики пальцев и видеть результат, который легко изменять, не переписывая весь костяк своего кода.
                                                                    2) Потенциальный начинающий уже не впадает в ступор перед простыми алгоритмами: он с ними экспериментировал, пробовал, ошибался, менял и «лечил» свой код. Самое время посмотреть под капот. Это C++. ООП, не прощающий ошибок. Ссылки, указатели, понимание работы с памятью на низком уровне. Типы данных и почему так важно их знать.
                                                                    И на этом этапе надо взять и переписать все то, что уже писал на питоне. Это даст мощный пинок к пониманию самых азов.
                                                                    А дальше — свободное плавание. Человек выходит после двухступенчатой пытки уже навыками отладки, чтения документаций и слезных просьб коммьюнити о помощи.
                                                                      0
                                                                      В который раз уже совершается попытка прикопаться к JS приводя пример, в котром складывается число и строка. Смущает неявное приведение типов — делай это явно.

                                                                      Почему некоторые индивиды так негодуют из-за отсутствия строгой типизации в JS? Я не понимаю что она дает такого. Кому не сложно приведите пример.

                                                                      Если очень хочется иметь проверку типов, или нет возможности писать понятный код, на помощь спешит JSDoc, без всякого TypeScript и Flow, позволят описать тип переменной, и любой более-менее адекватный редактор подсветит код противоречащий этому описанию.

                                                                      Столько слов сказано о том что классы в JS это лишь синтаксический сахар, а что в конечном итоге не синтаксический сахар?
                                                                        –1
                                                                        Помимо сложения разных объектов. Еще не консистентные операции сравнения, eще this. области видимости переменных и многое другое, что делает язык ущербным.
                                                                        nodejs конечно решает очень много проблем, но это не заслуга языка.
                                                                        Сам js как был с «особенностями» так и остался.
                                                                        Короче — для обучения людей худшего языка программирования придумать трудно.
                                                                          +1
                                                                          Ого, как субъективно.
                                                                            +1
                                                                            Легко. PHP, VBA, C++.
                                                                              0
                                                                              Согласен VBA — это еще один пример жуткой жути. Видимо именно поэтому microsoft его выбрал в качеств основы для VBScript. VBS и javascript — встроенные скриптовые языки в винду что бы нормальный человек туда не совался.
                                                                              Для обучения программированию PHP также не пригоден как и VBA.
                                                                              Но несмотря на ужасы и кошмары PHP, C++, VBA и js они являются полными языками и при желании можно писать можно всё что угодно. Но количество усилий для выполнения одинаковых задач могут отличатся на порядки. Для своих ниш это практически монополисты. А по наличию противоречий все языки хороши.
                                                                                0
                                                                                Вижуал бейсик — это вообще самое страшное, что я видел в из языков программирования. Видел более сложные, но более дурацких не встречал. Всё-таки вы очень пристрастны, если всерьёз сравниваете JS и VBA.
                                                                                  –1
                                                                                  Язык программирования это всего лишь инструмент. Если все превозносят кривой инструмент и пихают его во все щели не обращая внимания на явные косяки, он от этого лучше не станет.
                                                                                  Mocha (javascript) это тупиковая ветвь, ничего революционного в нем нет. Более того в него изначально заложены противоречия которые обязательно всплывут. А строить что-то на плавающем фундаменте можно только, очень не надолго.
                                                                                    0
                                                                                    А вы таки знаете инструмент без косяков?
                                                                                      0
                                                                                      Вот тут прям очень несогласен.
                                                                                      Mocha вместе с sinon/chai/nock(не всегда нужен конечно), плюс nyc для проверки покрытия юнит тестами и будет счастье
                                                                                0
                                                                                А чем вам this не угодил? У него есть правила, как в русском языке. Знаешь правила — знаешь куда this ссылается.
                                                                                  +1

                                                                                  И правила эти достаточно простые.

                                                                                    0
                                                                                    Именно. Их не много и они не сложные. Один раз понял — всю жизнь катаешься )
                                                                              +3
                                                                              — Итак, дети, сегодня мы пойдем по другому пути и не будем использовать эти богомерзкие языки с их динамической типизацией, потому что это сложно для понимания.
                                                                              * через полчаса *
                                                                              — Нет, Витя, ты не можешь результат 1,5 умножить на 2 записать в эту переменную, потому что результат не целочисленный. Ну и что, что результат равен 3, это уже не целое все равно. Это же очевидно!
                                                                                +2

                                                                                Отличный пример.
                                                                                думаю при обучении играет немаловажную роль еще такая вещь как доступность.
                                                                                Какие действия необходимо совершить, что бы начать изучать js? python?
                                                                                Какие действия неоходимо совершить что бы начать изучать C#? C++?
                                                                                И в целом, если подумать, цель в изучении принципов программирования, а не конкретных подходов, на конкретном ЯП, для решения конкретных задач.

                                                                                  0
                                                                                  Препод тупой и не может внятно объяснить. Бывает и такое наверно. Сам не встречал.
                                                                                    0
                                                                                    Языки с явными типами проще для понимания начинающими, чем языки с неявными (и закулисными их преобразованиями по неочевидным правилам). Тип у переменной в рантайме есть всегда.

                                                                                    Иногда, чтобы понять где и какие углы можно безболезненно срезать, нужно разобраться в сущности и причинах расположения данных углов. После этого можно будет выбирать, когда резать, когда — нет.
                                                                                      +1
                                                                                      Достаточно субъективно. На мой взгляд, начинающие программисты далеко не всегда знают заранее и наперед, какой тип данных им понадобится через N строчек. И динамическая типизация более щадящая для них в этом плане — позволяет больше думать о решении задачи, а не о том сколько байт выделить для числа, что в рамках конкретной задачи может быть абсолютно неважно. Человек может абсолютно верно решить задачу в логическом плане, но его программа не соберется. Значит ли это, что он не понял решение конкретно этой задачи? Опять таки, мы говорим о начинающих программистах и не будем принимать в расчет аргументы, когда статическая типизация хороша, потому что она статическая.
                                                                                        0
                                                                                        начинающие программисты далеко не всегда знают заранее и наперед, какой тип данных им понадобится через N строчек.

                                                                                        Этому они и должны учиться, если хотят стать инженерами, а не ремесленниками.

                                                                                        Разумеется, это очень субъективно.
                                                                                        Как человек, начавший с бэйсика, и перешедший к C через ассемблер, могу сказать, что прекрасно помню, как изучение С вызывало только положительные эмоции. Потому что было абсолютно понятно, какого ускорения и упрощения люди добились с его помощью.

                                                                                        Я считаю, что понимая низкоуровненвые вещи, значительно проще понять абстракции, выстроенные поверх них. Здесь есть принципиальная разница между «понять» и «использовать». Использовать — уровень технаря ПТУ (при всём уважении к золоторуким мастерам), понять — инженера конструктора.

                                                                                        У меня есть небольшой опыт обучения ребёнка (1шт.) программированию. Так вот, бэйсик и ассемблер мы, по очевидным причинам, пропустили а начали с основ устройства процессора и памяти компьютера, и С99. Не сказать, что начало было лёгким и простым. Зато, хорошенько поднатаскавшись кодить операции с основными структурами данных вручную, человек с радостью воспринял С++/ООП и его немалые удобства, затем поглядел на Java до уровня понимания, чем она отличается, чем уникальна и в чем основные подвохи, по моему совету углубился в JavaScript/Node.js (как основу сегодняшнего бизнес-веба), что-то там покрутил на Python (но в отсутствии реальных больших задач, я полагаю, не сильно больше поверхностного представления о нём получил).

                                                                                        Так вот теперь он стоит на распутье, полезно ли будет ему потратить 5 лет жизни на усиленный матан, дифуры, дискретку и не первой свежести знания по практическому программированию в университете, или же развиваться самостоятельно в интересных ему направлениях и достойных командах.
                                                                                        Вот этот выбор между реальными немалыми деньгами сегодня и 5ти-летними инвестициями не понятно во что, я Вам скажу, похлеще того, с какого же именно языка нужно было начинать.
                                                                                      –1
                                                                                      И что же это за задача такая, в которой заранее известно, что результат будет 1.5 * 2? Почему бы тогда сразу не написать 3? Ваш пример просто высосан из пальца: в реальной задаче будет вполне очевидно, почему произведение дроби на целое число нельзя без округления записать в целочисленную переменную…
                                                                                        –1
                                                                                        Естественно не целое)
                                                                                        Там будет 3.000000000000001 «как обычно».
                                                                                        И смысл в том, что получите вы три, или не три — большоооой вопрос…
                                                                                        А что делать, если оно не три?
                                                                                        Слушайте, тут только искренне лютого извращенца такое устроит...
                                                                                        Это же очевидно!

                                                                                        пс: При этом, математических либ никто никогда не будет юзать. А встроенных дробей нету.
                                                                                        Должен быть тип рационального числа вообще-то. И проблем с умножением тогда и не будет. 2 * 3/2 = 3 — ШЕДЕВРАЛЬНО!!! НЕ ТАК ЛИ?))) Слушайте, ну если вам не нужны скорости, а важна логика — то почему дробей-то нет в этом вашем js из коробка?
                                                                                        ппс: Уже даже в калькуляторах дроби есть, причем давно уже. А в езыках программирования нету. Замичательно живем, не правда ли?
                                                                                        0
                                                                                        Разве от таких вещей как опечатки и подобные минорные ошибки не спасает хорошо настроенный линтер?

                                                                                        Про ООП — и да и нет, но как видно js в эту сторону вроде как развивается.

                                                                                        Плохой код, как мне кажется, последствия развития и внесения новшеств в язык, хотя может я и не прав.

                                                                                        А громоздкость фреймворков и библиотек это не только проблема js — не буду тыкать пальцем на все похожие примеры, но для начала можно вспомнить php-шный zend

                                                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                        Самое читаемое