Я давно хотел написать статью о поиске мною «серебряной пули» и «перпетумобиле» в одном лице, а именно наиболее универсального языка программирования, причём такого, чтобы написанное на нём можно было использовать не ближайшие года 2, а хотя бы 10-20, а лучше всегда. И я выбрал JavaScript, ахахаха. Почему?
Опишу небольшую историю. Как-то раз, сидя за монитором в родном конструкторском отделе, я подумал, что неплохо бы зарабатывать побольше. "И тогда я понял, что я программист". Тогда я, задаваясь вопросом какой язык наиболее универсальный, и на чём я смогу найти хорошую работу, прошерстил интернет. Подписался на какое-то ужасное количество блогов, рассылок, узнал, что такое хабр. И в итоге выбрал Java. Нет, не JavaScript, с ним я к тому моменту уже давно сталкивался, когда пробовал писать странички на каникулах, и воспринимал его не очень серьёзно. Начал изучать какой-то серьёзный курс, и в процессе прокрастинации после изучения системы типов в Java, набрёл на сайт сodecademy.com. Там были задания по JavaScript, которые можно было выполнять прямо тут, в браузере — здесь пишешь, здесь же видишь результат. И у сайта был офигенный по тем временам интерфейс. Красиво, удобно. И что-то я постепенно так увлёкся, что забросил тот курс по Java окончательно. Я подумал — а зачем мне изучать всю эту дичь, если в итоге всё равно не сделать таких же красивых штук, как в браузере? Т.е. путь будет долгим, а возможный результат меня всё равно не впечатляет. Я к тому моменту уже успел насмотреться на интерфейсы онлайн-банков, сделанные на Java-апплетах. Это, конечно, моё личное восприятие, но мне всегда приятнее видеть красивый результат, может поэтому я и не пошёл в бэкенд. Но это же ещё и о быстром подкреплении, которое очень важно в любом обучении на начальном этапе. Я увидел, что за годы, проведённые в разлуке, JavaScript окреп, оброс сообществом, фреймворками, паттернами, книжками и, главное, стандартами, и люди, пишущие на нём больше не называются «веб-мастерами». И этот фактически просто текст, которым является программа, может исполняться вообще на любом компьютере (даже у твоей бабушки), на любой операционке, без всяких дополнительных установок (NET Framework, Java Runtime, etc), при этом выигрывая у них в возможностях построения интерфейса. В-общем, дальше был путь изучения длиной почти в 5 лет (я потом буду оправдываться, почему так долго, сейчас не об этом), куча собеседований (мой личный спорт) и, наконец, первая серьёзная работа в IT-компании.
Что я хочу сказать — в мире много языков, хороших и разных. И каждый из них кому-то нравится, и на каждом можно, как правило, делать не только что-то одно, а разные вещи. Но всё же у большинства языков есть какая-то определённая ниша, специализация, в которой он проявляет себя лучше других, или же это даже не из-за особенностей языка, а просто из-за исторически сложившейся экосистемы. ВОТ, ГЛАВНОЕ — поэтому я бы вообще не рассматривал языки программирования сами по себе. Я бы сравнивал экосистемы. Потому что языки по сути не очень сильно и отличаются (молчим про Хаскель). И в плане самого языка (удобство, красота, выразительные возможности, и беря во внимание такие вещи, как типизация и "компилируемость") JavaScript проигрывает многим. Но у него ни с чем не сравнимая экосистема. Пожалуй, только Си мог бы с ним в этом посоревноваться, но они играют в разных областях и вообще не конкуренты, поэтому сравнивать бессмысленно. Потому что есть, например, идеальный и офигенный язык Crystal (он и правда существует и его очень хвалят), но экосистема у него отсутствует. Это такой сферический язык в вакууме. Давайте я перечислю области применения JavaScript, чтобы было понятнее:
1) Клиентская сторона сайта — здесь у него нет конкурентов просто потому, что по историческим причинам браузеры понимают только JavaScript. Правда, появилась технология WebAssembly, так что теперь клиент в принципе можно писать на любом компилируемом языке, есть даже фреймворки на Rust (Yew). Это не будет так же просто, как JS, но если очень хочется, то можно, есть даже некоторые преимущества. К тому же это может работать быстрее, чем нативный JS, поэтому критически важные в плане производительности куски целесообразно писать, например, на Си. Это, я считаю, идёт даже в плюс JS-у, т.к. можно писать основной код на JS и не париться, а если хочешь AutoCAD в браузере (такой уже есть), то встраивай функции на Wasm.
2) Серверная часть сайта — можно писать на NodeJS, при этом производительность для большинства нужд достаточная. Не нужно забывать и о том, что любые serverless провайдеры поддерживают NodeJS. Это, кстати, удобно, держать в папке shared общие для фронта и бэка модели, попробуйте. Т.е. серверное применение JS - это не не игрушки, это вполне серьёзная и большая вторая область применения языка.
3) Десктопные программы — ElectronJS, а также в последнее время PWA. Электрон — очень спорная вещь, но позволяет легко делать реально кросплатформенные красивые программы за счёт некоторой избыточности в весе программы и в потреблении оперативки. При этом возможности построения интерфейсов — как в браузере, т.е. впечатляют, и по-моему легко оставляют позади С# и Java, а ведь они неплохи. Есть несколько примеров очень популярных коммерчеcких приложений на Electron. Ещё есть приложения PWA, за ними будущее (но это не точно). Поддержку десктопных PWA уже добавили в винду, на днях подъедет поддержка на Маке (или уже есть?).
4) Мобильные программы — лучший вариант на JS, наверное, ReactNative, а вообще много вариантов. Конкуренты — Flutter, Xamarin, нативные как бы тоже, но нативщики не любят, когда их (небожителей) сравнивают с какой-то там кросплатформой. Тоже есть примеры больших коммерческих приложений на этой технологии. PWA можно записать и сюда, а за ними, как известно, будущее (но это не точно, я уже говорил).
5) Программы для командной строки — да, это не принято. Но ничто не мешает. К тому же большая часть всмомогательного софта для веб-разработки уже написана на nodeJS - такие вещи, как webpack и т.д.
6) Игрушки. WebGL и WebGPU приложения. Игрушек на JS реально много. Обычно это что-то не очень сложное, но уже есть и посерьёзнее.
Все 6 пунктов выше - серьёзные и полноценные коммерческие применения одного языка. Ниже перечислю ещё экзотические варианты.
7) Скрипты (быстро что-нибудь распарсить) — тоже с помощью NodeJS. Но традиционно больше применяется Питон или (ещё более традиционно, если традиционность измерять в годах) даже Perl.
8) Научные вычисления. Здесь правит бал Питон (у старичков — Фортран и Си). Но на JS стремительно переписываются многие питоновские математические библиотеки. Уже есть, например, TensorFlow для машинного обучения. Потому что это удобно — машинное обучение в браузере. На самом деле вряд ли JS займёт здесь сколько-нибудь заметную нишу, но сам факт, что если нужно, то можно это делать и на JS.
9) Прошивки, драйвера. Говорят, можно, но я считаю, что это игрушки. Максимум, что можно сделать на JS в этой области — написать прогу для Arduino, но ничего серьёзного. Тем более для промышленных приборов — мимо. JS реально не для этого.
Т.е. по факту почти всё, что нужно ненизкоуровневое, можно писать на JS, а низкоуровневое можно теперь легко встраивать в JS с помощью WASM и WASI. JS не идеален для всего, на на сегодняшний день это — наиболее универсальное и простое решение. И порог входа очень низкий. Именно то, что я написал текст в блокноте и сразу у меня что-то запрыгало на экране, в браузере, который я и так до этого устанавливал и пользовался. Это быстрое положительное подкрепление даёт, знаете ли, свой результат. Позволяет не зассать (извините) в самом начале пути.
И да, это всё о серебряной пуле. Я забыл о перпетумобиле. Вечным ничего не бывает, но у JS есть комитет по стандартизации. Все его API (аудио, видео, видеосвязь, геолокация, доступ к файловой системе) — это не какие-то левые библиотеки, которые неизвестно кто написал и поддерживает (ой, уже не поддерживает), а стандарт. По факту благодаря этим апи можно написать простой аналог скайпа за полчаса (если ты талантливый). Широчайшие возможности из коробки. Новые возможности добавляются, но старые будут поддерживаться ещё очень долго. Сообщество JS огромно и что-то изменить по чьей-то прихоти не так-то просто. Всё выполняется в виртуальной машине, поэтому если появится новая ОС, то для неё напишут свою виртуальную машину и JS продолжит выполняться, не нужно ничего перекомпилировать. В этом смысле он так же хорош, как Java, ну и в принципе как любые интерпретируемые языки.
К чему я это всё. Вам может не нравиться JS как язык, никто и не заставляет его любить. Но если вам нужна простота и универсальность, то лучшего варианта на сегодняшний день не найти.