Новички любят спорить о том, какой язык программирования лучше. Компилируется или интерпретируется? Точки с запятой или символы новой строки? Статическая или динамическая типизация? Объектно-ориентированный или функциональный?

Ну ладно, неважно. Языки не имеют значения. Почему? Потому что все они делают одно и то же, по крайней мере, все популярные. Откуда я это знаю? Потому что иначе они не стали бы популярными.

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

Самые большие различия между современными языками можно свести к трем вопросам:

  1. Нужно ли его компилировать?
  2. Работает ли он с хост-ОС напрямую или через виртуальную машину?
  3. Позволяет ли он напрямую управлять памятью?

Первые два имели значение 10 лет назад, но не так сильно сегодня. Необходимость компиляции удовлетворяется наблюдателями за файлами и IDE, что делает ее тривиальной. Более того, некоторые языки, которые раньше традиционно не компилировались, теперь рассматриваются как компилируемые языки. Посмотрите на Javascript, все используют Babel, и Typescript, и Webpack, и минификаторы, и углифаторы, так что он больше не похож на интерпретируемый язык.

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

Задачи имеют значение

Наличие или отсутствие тонкого контроля над памятью и сборкой мусора — это единственное наиболее очевидное различие между языками, которое все еще существует. Но действительно ли речь идет о языках? Нет, речь идет о задачах. Вы можете написать движок блога на C++, даже не задумываясь о памяти, и код не будет сильно отличаться от Java или C#, которые не имеют такого же уровня контроля над памятью.

Да, задачи имеют значение. Задачи всегда будут иметь значение. Если я знаю, как писать Javascript для традиционного веб-приложения, это знание мало поможет при написании Javascript для современной одностраничной среды приложений, в которой возникает множество проблем, связанных с параллелизмом. И ничто из этого не поможет мне написать серверный Javascript для Node.js. С другой стороны, серверный код Node.js не так сложно перевести на PHP или Python. Использовать знакомый язык для незнакомой задачи сложнее, чем выучить новый язык, чтобы делать то, что вы уже делали годами.

А теперь попробуйте объяснить это своему боссу…

Большинство опытных кодеров прекрасно понимают то, что я только что написал. Дело в том, что другие люди в отрасли этого не делают. На рынке труда большинство вакансий имеют «жестко запрограммированный» язык, т.е. «Старший разработчик Ruby». Некоторые люди идут еще дальше и включают название фреймворка («Senior Rails Developer»).

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

Если бы вакансии писали кодеры, а не менеджеры, язык стал бы рекомендуемым навыком, а не обязательным, и акцент был бы переключен на конкретные задачи, которые должен будет выполнить потенциальный кандидат. Если вы менеджер, то должны понимать, что любой разработчик с достаточным опытом способен «свободно» освоить новый язык программирования за два месяца полноценной работы.

Экосистема важна

Есть одна веская причина для выбора одного языка над другим, и эта причина — экосистема. Сколько людей используют этот язык? Часто ли он используется для конкретной задачи, которую вы пытаетесь решить? Совместима ли философия сообщества с вашими предпочтениями в кодировании? Есть ли большая корпоративная поддержка или большая часть поддержки исходит от сообщества открытого исходного кода? Это важные вопросы, которые могут сильно повлиять на ваш опыт.

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

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

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