Как выбрать язык программирования

По разным оценкам, количество готовых к продакшену языков программирования в мире колеблется от 400 до 600. И как минимум на два порядка больше экспериментальных проектов. Как сделать правильный выбор, имея такое количество вариантов? Как выбрать язык, который не только окажется коммерчески востребованным, но и будет приносить радость в повседневной практике? Как этот выбор проявит себя в долгосрочной перспективе?

Критерии выбора первого и N-го языка кардинально отличаются. В этой статье описывается процесс выбора первого языка. Что подразумевается под «первым» языком? Тот, на котором вы можете выполнять коммерческие заказы! То есть, если вы прочитали что-то о десятке языков, но не можете дойти до джуниора на каждом из них, — эта статья может быть вам полезна.

Иллюзия выбора

Первое, что вы должны понять, — это то, что у вас нет особого выбора. Нетрудно выбрать ТОП-10 лидеров из всего многообразия языков. 80% всего, что происходит, происходит именно там. Точно по Парето. ТОП-20 «известных» языков определяет границы разумного выбора (первого языка). Еще одна десятка «мелочей» — для искателей приключений. «Страх и ненависть в Лас-Вегасе» — следующий в списке.

В алфавитном порядке:

ТОП-10

  • C
  • C++
  • C#
  • Java
  • JavaScript / TypeScript
  • Objective-C
  • PHP
  • Python
  • Ruby
  • Scala

TOP-20

  • Ассемблеры
  • Clojure
  • Delphi / Pascal
  • F#
  • Go
  • Haskell
  • Lua
  • Perl
  • Swift
  • Visual Basic

Также существует отдельная группа специализированных названий, не связанных с языками программирования общего назначения:

  • CSS
  • HTML
  • MATLAB
  • R
  • Shell(s)
  • SQL
  • XML
  • Verilog
  • VHDL

«Родственные» языки, такие как JavaScript / TypeScript, Delphi / Pascal и все виды ассемблеров, сгруппированы для простоты. Статистика, на которой основан этот (и подобные ему) списки, будет рассмотрена позже. Сейчас наша цель — проиллюстрировать идею.

Разница в актуальности, количестве доступной информации, возможности сменить компанию и т.д. огромна для ведущих языков и отстающих. Достаточно сказать, что для сравнения количественных показателей TOP-40 языков (таких как количество репозиториев) всегда используются логарифмические шкалы.

Вывод: если вы не знаете, какой язык выбрать — выбирайте один из популярных. Инертность индустрии огромна. Радикальные изменения происходят крайне редко (и еще реже — со временем), но лидеры в списке стабильно удерживают свои позиции. Смена лидера (-ов) в той или иной области, почти всегда, происходит через смену самой платформы, а не через проигрыш в «честной» конкуренции. Perl, Cobol, Pascal — редкие контрпримеры. Хотите новый язык? Дождитесь смены платформы (или парадигмы).

Что мы выбираем?

Еще одна неприятная правда — мы не выбираем язык. Мы выбираем нишу, которая сопровождается одним, двумя или тремя языками. Они уже «выбраны» за нас. Кем? Индустрией, рынком, исторической случайностью, в конце концов.

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

  1. Среда (и способ) выполнения: Компилятор / Виртуальная машина.
  2. Вендоры и платформа.
  3. Экосистема и сообщество.
  4. Спрос и тенденции развития отрасли.
  5. Связь с другими языками и экосистемами.
  6. Видение языка.
  • Какой язык лучше? — является примером неправильной постановки вопроса.
  • Какой язык больше всего подходит для … — стоит теоретический вопрос.
  • Какие языки используются для … — ближе к сути.

1. Среда и способ выполнения

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

Работают ли эти аргументы до сих пор? Нет. Большинство практик Java VM «поставлены на уши». Кроссплатформенность, как оказалось, еще лучше достигается через Web-приложения. Поэтому сейчас Java держится благодаря инерции. И отсутствию сильных прямых конкурентов. Инерция в индустрии — очень мощная сила.

Go вначале позиционировался как «плохой», примитивный и простой язык. А результат? Он достиг TOP-20 за несколько лет — уникальный случай. Может ли то же самое повториться снова? Это очень маловероятно. Было место — место занято. Ждите другой возможности.

Возвращаясь к основному вопросу — подумайте о следующем:

  • Как вы собираетесь «выбрать язык» для разработки на iPhone, если их всего два?
  • Как вы собираетесь «выбрать язык» для разработки на Android, если их всего «один»?

В веб-разработке еще есть какой-то выбор: Java, JS, PHP, Ruby, Python, Perl. Но и он постепенно исчезает: все, кроме JS, выбывают из «игры».

  • Почему? Аудитория Perl перешла на Ruby как более новый и удобный язык. Ruby и Python поглощаются JS.
  • Почему? GIL, используемый в «канонических» версиях Ruby и Python, лишает их настоящей многопоточности. А многопоточность на уровне IO проигрывает в конкуренции архитектурам, основанным на асинхронном поведении.

IT-корпорации давно это поняли и вкладывают сумасшедшие деньги в JS (в V8). Сравнивать игрушечный CPython с последним как-то стыдно.

  • Java?

Не имеет значения. Mozilla ликвидирует поддержку Java в браузерах. А что такое современная Web-разработка без фуллстека?

Вывод: начинайте думать в терминах платформы, а не языка.

2. Вендоры и платформа

Экосистема и сообщество

Языки делятся на «корпоративные» и «независимые». Почти все известные вам IT-корпорации продвигают свои собственные языки. И, так сказать, антипродвигают языки конкурентов (если не достигнуто корпоративное соглашение).

  1. Apple — Swift и Objective C.
  2. Google: Golang, Dart, JS (V8), Java (Android).
  3. Microsoft: C#, F#, TypeScript
  4. Mozilla: JS, Rust
  5. Oracle: Java
  6. Facebook: JS, PHP

«Независимые» языки создаются либо недокорпорациями (Python, Clojure), либо группами ученых (Haskell). В первом случае всевозможные FooBar Foundation служат прикрытием авторитарной реальности. Во втором — интеллектуальный барьер является единственным фильтром «от дураков». Дело в том, что не существует языков, которые не принадлежат никому.

Какая категория лучше? Абсолютного ответа нет. Поддержка языка крупной корпорацией означает значительное финансовое влияние. Golang, созданный вами, не будет интересен никому, кроме ваших знакомых. Golang, созданный и продвигаемый Google, — это совсем другая история. Тем не менее, именно эта поддержка означает связь с успехом корпорации:

Вывод: поинтересуйтесь — кто владеет языком и как у них идут дела (в последнее время).

3. Экосистема и сообщество

Просто посмотрите на статистику и сделайте выводы.

Спрос и тенденции отрасли

Рейтинг RedMonk

Отличный график, основанный на четких и однозначных данных из StackOverflow и GitHub.

Лидеры находятся в правом верхнем углу. Не забывайте, что обе шкалы логарифмические. Не забывайте, что экосистема Java поддерживается «миньонами» в лице Scala, Clojure, Groovy и т.д. А JavaScript — «миньонами» в лице TypeScript, CoffeeScript и т.д. Эти два языка значительно опережают друг друга внутри TOP-10.

GitHut

Отличный график, основанный на семи значениях данных с GitHub. Немного устаревший (2014 год!), но все еще актуальный. Стоит отметить, что активность open-source между веб-разработчиками гораздо выше, чем между предприятиями. Поэтому лидерство между Java и JavaScript определяется по критерию диапазона.

Индекс PyPL

Еще один странный, но надежный рейтинг, основанный на количестве поисковых запросов на учебник.

CodeEval Stats

Эксклюзивная статистика от платформы соревновательного программирования. В топе: Python, Java, C#, C++, C, JS, Ruby.

Опрос StackOverflow

Что думают сами программисты о предпочтительных языках, технологиях, специализациях, поиске работы? На этой странице собраны ответы на эти вопросы. TLDR: Web, JavaScript, FullStack.

Как видим, лидерство того или иного языка определяется методом ранжирования. Названия везде одинаковые — разве что порядок разный. Стоит также отметить, что популярность самого GitHub продолжает стремительно расти, что повышает значимость рейтингов на основе этой платформы.

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

4. Спрос и тенденции отрасли

Видение языка

И снова посмотрите на статистику.

Google Trends

Довольно хороший инструмент, имеющий ряд ограничений. Для некоторых языков (PHP) вы можете выбрать категорию «Язык программирования». Для других (Python) — нельзя. Однако он дает некоторую дополнительную информацию (в основном, о динамике времени), поэтому мы его и упоминаем.

Индекс Tiobe

Очень странный рейтинг, основанный на запросах к поисковым системам. Описание. По Tiobe, EcmaScript и JavaScript — это два разных языка, Pascal так же популярен, как и JS, а «C стремительно теряет свою популярность с 2015 года». После таких «фактов» хочется только закрыть лицо руками и плакать. Не обращайте внимания.

New Relic

Эксклюзивная статистика, представляющая в основном принятие технологии предприятием. Java предсказуемо лидирует. NodeJS и Go растут. PHP проигрывает.

Дополнительная информация: по статистике вышеупомянутого RedMonk, наибольшие темпы роста демонстрируют: Go, PowerShell, Rust, Swift, TypeScript.

Вывод: если график количества библиотек интересующего вас языка не устремлен в светлое будущее (правый верхний угол) — его будущее будет темным и печальным. Как у Perl. Количество вакансий и спрос на ту или иную технологию лучше смотреть самому, в контексте своей страны/города. Не полагайтесь ни на какие «сводки», смотрите на факты. Локальная ситуация может сильно отличаться от глобальной.

5. Связи с другими языками и экосистемами

Для нового языка одним из рабочих способов разорвать цикл «Никто его не использует, потому что никто его не использует!» является присоединение его к существующей экосистеме. Clojure и Scala — «паразитируют» на Java. TypeScript и ClojureScript — JS. Elixir — Erlang. Однако случаев уничтожения хозяина таким «паразитом» не было.

Какой в этом интерес? Нет смысла изучать язык-паразит до изучения хозяина. Последователи Clojure скажут вам, что вам «не нужно» знать Java. Но потом вы увидите, что значительный процент их документации ссылается прямо на Java. Ложь?! Маркетинг! Когда вы загоняете их в угол, угрожая физической расправой, они начинают оправдываться:

— Мы имели в виду, что уровень Hello World вам не нужен!

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

6. Видение языка

Возможность самосовершенствования

Некоторые языки принято ругать. Даже если в следующей версии PHP появится неизменяемость, имена будут убраны, ООП уйдет в сторону… он по инерции будет продолжать считаться очень плохим языком. Почему? Люди не любят менять свои мнения и приколотые ярлыки.

Некоторые языки не принято ругать. Загляните в исходники Python, или в те же исходники Clojure. Здесь вы найдете только адскую ругань (по сравнению с конкурентами). Тем не менее, все считают эти языки волшебными единорогами, а случайные контраргументы встречают лишь недоумение. Чтобы сформировать адекватное видение, этих людей нужно воспитывать и перевоспитывать. А кто это будет делать?

Вывод: формируйте собственное мнение. Допустим, что вы не можете оценить технические характеристики из-за отсутствия опыта. Хорошо. Но что мешает вам посмотреть выступления разработчика (-ов) языка? Они не выступают публично? Это плохой признак. Очень плохой. Выступают? Тогда просто слушайте. Как они себя ведут? Что они говорят? Что они критикуют? Что они пропагандируют? Знакомо ли вам это? Есть ли резонанс?

Критерии выбора

Когда делается выбор, что правильнее выбирать Платформу, а не Язык, возникают, казалось бы, те же вопросы. Разница в том, что теперь мы можем ответить на них объективно.

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

Спрос на рынке

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

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

Общее количество вакансий

Конкуренция на рынке определяет сложность получения работы. Однако нужно учитывать и сложность потенциальной смены компании. Вы получили редкую и высокооплачиваемую работу консультанта по программированию роботов-барсуков. Что произойдет, если ваша компания решит сократить штат? Рынок очень маленький — у вашей бывшей компании всего один конкурент. Который в данный момент не нуждается в новых консультантах. Будете ли вы ждать подходящую вакансию несколько лет? Смените профессию? А ведь вы вложили в эту тему лучшие годы своей жизни…

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

Формат работы

Вы решили, что хотите работать в Enterprise. Удаленно. Удачи вам, потому что такой комбинации в мире не существует. Ну, то есть, вы можете зачитать потенциальному работодателю мотивационную статью. Показать «статистику» из газеты. Поклясться в верности. Вопрос в том — поможет ли это?

Реальность такова, что предприятия не любят удаленную работу.

  • Удаленный дизайнер? — До свидания, пожалуйста.
  • Java Remote? — Стоп. Кто вы, черт возьми, такой?

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

  • Java Part-Time? — Нет, не слышал.

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

Возраст рынка

Чем старше рынок, тем меньше он заинтересован в новичках. Все темы по рекрутингу полны новичков, которые выучили Java Junior pro forma и обнаружили, что не могут найти работу. Чтобы получить работу, нужно иметь опыт. А чтобы получить опыт, нужно получить работу. Бесконечный круг.

Пока талантливые Junior JS продаются как горячие пирожки. Но это не будет продолжаться вечно…

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

  • Ваш отец — Java-программист готов подсказать вам? — Пожалуйста. Идите.
  • Прочитали в газете(!), что требуются Java-программисты? — У меня для вас плохие новости.

Как узнать возраст рынка? И для чего нужна Википедия? Для ИТ сценарий примерно такой:

  • Менее 5 лет — развивающийся рынок
  • От 5 до 10 — формирующийся рынок
  • Более 10 лет — устоявшийся рынок

Тогда подумайте сами.

Зарплата

Разница между сферами не так уж велика. Да — потолок зарплаты в одних областях ниже, чем в других. Но всегда есть возможность перепозиционирования. Верстальщик → Специалист по анимации. И потолок увеличился еще на 100%…

Вывод: Я бы не стал останавливаться на этом факторе. Всем новичкам платят мало. Всем профессионалам платят много. Это все, что вам нужно знать на данный момент.

Возможность самосовершенствования

Возможность самосовершенствования

Для первого языка все это не имеет значения. «Слепо следовать общественному мнению» было бы самым правильным решением. Однако, если судьба благоволит вам, и вы подошли к этому вопросу…

Почти все основные языки имеют свои недостатки. Сообщество просто вырабатывает свои собственные ответы на них. С опытом факторы оценки неизбежно меняются. Сам язык значит все меньше и меньше. Экосистема — все больше и больше. Стыдно признаться, но было время, когда я считал Python хорошим языком…

Мой текущий (актуальный) рейтинг качества языков:

  1. хорошие: Haskell
  2. неплохие: F#, Lua, Rust, Swift
  3. средние: C#, Clojure, Go, JS, Erlang, Ruby, Scala
  4. плохие: C, Java, Objective-C, Python
  5. ужасно: PHP, Markdown (последний — для смеха, но в нужном месте)
  6. особый круг ада: Bash, C++
  7. вне классификации: ассемблеры

Конечно, возможность самосовершенствования не стоит связывать с качеством языка. Но все же они связаны. Плохой язык отупляет «оратора». Хороший — делает умнее, заставляет развиваться или уходить из профессии. Оба варианта хороши для человечества.

Качество языка в долгосрочной перспективе определяется его гибкостью. Следите за руками:

В JavaScript

  1. Отсутствие стандартной библиотеки
  2. Приводит к появлению множества альтернатив
  3. Которые конкурируют друг с другом
  4. Не связаны с обновлениями языка
  5. Более адаптированные (а не «первые») решения выживают по Дарвину

В Python

  1. Большая стандартная библиотека («Батарейки в комплекте!»)
  2. Включает исторически первые (и потому — плохие) решения
  3. Приводит к отсутствию постоянной конкуренции (никому не нужен второй логгер)
  4. Обновления библиотеки связаны с релизами языка
  5. Приводит к деградации всей экосистемы

В результате JavaScript оттесняет Python не только в Web, но и в области научного программирования. Конкуренция и «есть много способов сделать это» порождают качество. Медленно, болезненно, неизбежно. В то время как авторитаризм и игра в BDFL приводят к катастрофе. Тоже медленно, безболезненно, неизбежно.

Вывод: если, на ваш взгляд, есть выбор, — выбирайте языки с живым, разнообразным сообществом, где нет: * «стандартная основа» (одобренная и запечатанная Google) * «пожизненные диктаторы» * список «правильных решений» * и прочий мусор.

Краткое руководство по выбору

Определитесь с важными критериями и выбирайте.

  • Я хочу работать удаленно!

JS, Ruby

  • Я хочу создавать настольные приложения!

Java, C#

  • Я хочу создавать веб-приложения!

JS, PHP, Ruby

  • Я хочу поддерживать Legacy^_^!

PHP

  • Я хочу работать в Enterprise (крупный бизнес)!

Java, Scala, F#

  • Я хочу много денег!

Смотри выше

  • Я хочу использовать язык в собственном бизнесе!

JS, Haskell, PureScript

  • Я хочу много свободы!

Смотрите выше.

  • Я хочу работать в финансовой сфере!

Scala, Haskell, F#

  • Я хочу быть в науке!

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

  • Я хочу заниматься машинным обучением!

Смотрите выше.

  • Я хочу быть сисадмином!

Ruby, Bash

  • Я хочу заниматься системным программированием!

C, Go, Rust

  • Я хочу создавать распределенные системы!

Java, Scala, Erlang, JS

  • Я хочу создавать интерфейсы!

JS, Java, C#

  • Я хочу создавать ААА-игры!

C++, C#

  • Я хочу создавать инди-игры!

C#, JS, PureScript 1.0 ^_^

  • Я хочу создавать мобильные приложения!

Swift, Java, JS (в Objective-C уже нет смысла)

  • Хочу работать с данными!

SQL

  • Я хочу работать с большими данными!

Java, Python, R, Scala

  • Я хочу работать!

ТОП-10 выше.