Как выбрать язык программирования?
По разным оценкам, в мире насчитывается 400-600 production-ready языков программирования. И, как минимум, на два порядка больше экспериментальных проектов. Как сделать правильный выбор, имея столько вариантов? Как выбрать язык, который окажется не только коммерчески востребованным, но и будет радовать в повседневной практике? Как данный выбор проявит себя в долгосрочной перспективе?
Критерии выбора первого и N-го языка радикально отличаются. В этой статье рассматривается выбор именно первого языка. Что подразумевается под "первым" языком? То, на чём вы можете выполнять коммерческие заказы! Т.е, если вы читали что-то по десятку языков, но не дотягиваете до Junior ни по одному из них, – эта статья может быть вам полезна.
Иллюзия выбора
Первое что стоит понять – особого выбора у вас нет. Из всего множества языков, несложно выделить ТОП-10 лидеров. 80% всего происходящего – происходит там. Строго по Парето. ТОП-20 "известных" языков определяет границы рационального выбора (первого языка). Ещё десяток "по мелочи" – для авантюристов. "Страх и Ненависть в Лас-Вегасе" – далее по списку.
В алфавитном порядке:
TOП-10
- C
- C++
- C#
- Java
- JavaScript / TypeScript
- Objective-C
- PHP
- Python
- Ruby
- Scala
ТОП-20
- Assemblers
- 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 и всевозможные Ассемблеры сгруппированы для простоты. Статистические данные, лежащиеся в основе этого (и подобных) списков будут рассмотрены далее. Наша текущая цель – иллюстрация идеи.
Разница в востребованности, объёме доступной информации, возможности сменить компанию и т.п. для лидирующих и отстающих языков огромна. Достаточно сказать, что при сравнения количественных показателей TOП-40 языков (типа Числа Репозиториев) всегда используются логарифмические шкалы.
Вывод: если вы не знаете какой язык выбрать – выбирайте один из популярных. Инерция индустрии очень велика. Радикальные изменения происходят редко (и всё реже, со временем), а лидеры списка прочно занимают свои позиции. Смена лидера(-ов) в той или иной области, практически всегда, происходит через смену самой платформы, а не через проигрыш в "честной" конкуренции. Perl, Cobol, Pascal – немногочисленные контр-примеры. Хотите новый язык? Ждите смены платформы (или парадигмы).
Что мы выбираем?
Ещё одна неприятная правда – мы не выбираем язык. Мы выбираем направление, к которому прилагается 1, 2 или 3 языка. Их уже "выбрали" за нас. Кто? Индустрия, рынок, историческая случайность, наконец.
Начинающим свойственно концентрироваться на языке. Синтаксис, грамматика... – кажутся столь важными, столь незнакомыми, что поглощают всё внимание. Однако, язык это лишь вершина айсберга. Что скрывается под водой?
- Среда (и способ) выполнения: Компилятор / Виртуальная Машина.
- Вендоры и Платформа
- Экосистема и комьюнити.
- Рыночный спрос и тренды индустрии.
- Связи с другими языками и экосистемами.
- Представление о языке.
- – Какой язык самый лучший? – пример неправильной постановки вопроса.
- – Какой язык лучше всего подходит для ... – потянет на теоретический вопрос.
- – Какие языки используются для ... – ближе к делу.
1. Среда и способ выполнения
Качество языка не играет решающей роли. Java не был хорошим языком даже в момент создания. Он был всего лишь удобнее конкурентов. Однако, его виртуальная машина оказалась настоящим прорывом для своего времени. Кроме числовых показателей, эта машина давала "перк" Кроссплатформенности, которой не было у альтернатив. Поэтому, выход Java в лидеры индустрии был абсолютно обоснован (и, вероятно, неизбежен) исторически.
Продолжают ли работать эти аргументы? Нет. Большинство наработок Java VM "взяты на заметку". Кроссплатформенность, как оказалось, ещё лучше достигается через Веб-приложения. Поэтому, сейчас Java держится уже на инерции. И на отсутствии сильных прямых конкурентов. Впрочем, инерция в индустрии – мощнейшая сила.
Go изначально позиционировался как "плохой", примитивный, простой язык. Результат? Выход в ТОП-20 всего за несколько лет – уникальный случай. Может ли подобно повториться? Сомнительно. Место было – место занято. Ждите очередного opportunity.
Возвращаясь к главному вопросу – подумайте о следующем:
- Как вы планируете "выбирать язык" для разработки под IPhone, если там их всего два?
- Как вы планируете "выбирать язык" для разработки под Android, если там их "всего один"?
(Kotlin и прочее фричество ТОП-100 не в счёт).
Какой-то выбор пока остаётся в Веб-Разработке: Java, JS, PHP, Ruby, Python, Perl. Однако, и он, постепенно, исчезает: все кроме JS выбывают из "игры".
– Почему? Аудитория Perl перешла на Ruby, как на более новый и удобный язык. Ruby и Python поглощаются JS.
– Почему? GIL, используемый в "канонических" версиях Ruby и Python лишает их реальной многопоточности. А многопоточность на уровне IO проигрывает в конкуренции архитектурам, основанным на асинхронности.
IT корпорации давно поняли это и инвестируют сумасшедшие деньги в JS (в V8). Игрушечный CPython теперь даже сравнивать с последним как-то стыдно.
– Java?
Да и неважно. Mozilla окончательно удаляет поддержку Java в браузере. А что такое современная Веб-разработка без фуллстека?
Вывод: начинаем мыслить в рамках Платформы а не Языка.
А вот ментор по Ruby, Виктор Шепелев, считает что мыслить при выборе языка программирования нужно несколько иначе Читать
2. Вендоры и Платформа
Языки делятся на "корпоративные" и "независимые". Практически все известные вам IT корпорации продвигают свои языки. И, скажем так, анти-продвигают языки конкурентов (если не достигнуто корпоративное соглашение).
- Apple – Swift и Objective C.
- Google: Golang, Dart, JS (V8), Java (Android)
- Microsoft: C#, F#, TypeScript
- Mozilla: JS, Rust
- Oracle: Java
- Facebook: JS, PHP
"Независимые" языки создаются либо недо-корпорациями (Python, Clojure) либо группами учёных (Haskell). В первом случае, всяческие FooBar Foundation выступают прикрытием авторитарной реальности. Во втором случае – интеллектуальный барьер является естественным фильтром "от дураков". Пойнт в том, что никому не принадлежащих языков – не бывает.
Какая категория лучше? Однозначного ответа нет. Поддержка языка крупной корпорацией означает существенные финансовые влияния. Golang, созданный лично Вами, не был бы интересен никому, кроме знакомых. Golang, созданный и продвигаемый Google, – совсем другое дело. Однако, эта же поддержка означает завязку на успешность корпорации:
- Разоряется Apple – идут по миру разработчики Swift и Objective-C.
- Google решает что Google Plus "не нужен" – десятки тысяч SEO-шников плачут над разбитой бизнес-моделью.
Вывод: поинтересуйтесь – кому принадлежит язык и как у них идут дела (в последнее время).
3. Экосистема и комьюнити
Просто смотрим статистические данные и делаем выводы.
RedMonk Rating
Отличный график, основанный на точной и однозначной информации со StackOverflow и GitHub.
Лидеры сосредоточены в правом верхнем углу. Не забываем, что обе шкалы – логарифмические. Не забываем, что Java экосистема поддерживается "миньонами" в лице Scala, Clojure, Groovy и др. А JavaScript – миньонами в лице TypeScript, CoffeeScript и др. Эти два языка лидируют с большим отрывом уже внутри ТОП-10.
GitHut
Шикарная диаграмма, составленная на базе семи показателей с GitHub. Несколько устаревшая (2014!), но всё ещё сохраняющая актуальность. Стоит отметить, что опен-сорс активность среди веб-разработчиков гораздо выше, чем среди энтерпрайз. Поэтому, лидерство между Java и JavaScript определяется критериями ранжирования.
PyPL Index
Ещё один странный, но авторитетный рейтинг, основанный на числе поиска туториалов.
CodeEval Stats
Эксклюзивная статистика от платформы спортивного программирования. В лидерах: Python, Java, C#, C++, C, JS, Ruby.
StackOverflow Survey
Что думают сами программисты о предпочтительных языках, технологиях, специализации, поиске работы? Данная страница содержит ответы на все эти вопросы. TLDR: Web, JavaScript, FullStack.
Как мы видим, лидерство тех или иных языков определяется способом ранжирования. Титулы везде одни и те же – разве что идут в разном порядке. Cтоит отметить, что популярность самого GitHub продолжает стремительно расти, что усиливает важность рейтингов, основанных на этой платформе.
Вывод: в качестве первого языка выбираем один из популярных. Язык без видео-курсов, без статей, без примеров реальных приложений, без возможности задать вопрос комьюнити – будет изучаться медленно и мучительно.
4. Рыночный спрос и тренды индустрии
И снова смотрим статистику.
ModuleCounts.
Кликаем на all time. Выставляем все галочки. Просветляемся.
Google Trends
Неплохой инструмент, обладающий рядом ограничений. Для одних языков (PHP) в нём удаётся выбрать категорию Programming Language. Для других (Python) – нет. Однако, какую-то дополнительную информацию (в основном, о динамике во времени) он даёт, поэтому мы его упоминаем.
Tiobe Index
Очень странный рейтинг, основанный на запросах к поисковым системам. Описание. По мнению 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. Вы найдёте там лишь адское месиво (сравнительно с конкурентами). Однако, все считают эти языки Волшебными Единорогами и вскользь брошенные контр-аргументы встречают лишь недоумение. Для формирования адекватного представления, людей нужно учить и переучивать. А кто будет этим заниматься?
Вывод: составьте собственное мнение. Допустим, вы не можете оценить технические характеристики, ввиду отсутствия опыта. Ок. Но что мешает вам посмотреть выступления разработчика(-ов) языка? Они не выступают публично? Плохой признак. Очень плохой. Выступают? Тогда просто послушайте. Как они держатся? Что говорят? Что критикуют? Что продвигают? Близко ли это лично вам? Есть ли резонанс?
Критерии выбора
Решив, что правильно выбирать не Язык, а Платформу, мы, как-будто, приходим к тем же вопросам. Разница в том, что теперь мы можем дать на них объективные ответы.
Чтобы выбрать платформу (и далее язык, если выбор останется), мы должны определиться с критериями. Для большинства людей, основными критериями, оказываются следующие.
Востребованность на рынке
Определяется через общее кол-во вакансий, поделённое на общее кол-во резюме. Большой спрос порождает большое предложение. "Окна возможностей" будут держаться несколько лет. Успеваете?
Вывод: при подсчёте "числа вакансий" не забывайте смотреть конкуренцию и демпинг. Обращайте внимание на тренды. Новый "горячий" фреймворк может "остать" пока вы его выучите.
Общее число предложений
Конкуренция на рынке определяет сложность трудоустройства. Однако, стоит учесть и сложность потенциальной смены компании. Вы устроились на редкую и высокооплачиваемую работу консультанта по программированию роботов-барсуков. Что будет если ваша фирма решит сократить штат? Рынок крайне мал – у вашей бывшей фирмы есть только один конкурент. Которому, вот прямо сейчас, не нужны новые консультанты. Будете ждать подходящей вакансии несколько лет? Смените профессию? А ведь вы вложили в Тему лучшие годы жизни...
Вывод: избегайте малопопулярных направлений, если не знаете, в точности, чем хотите заниматься.
Формат работы
Вы определились, что хотите работать в Энтерпрайз. Удалённо. Пожелаем удачи, поскольку такой комбинации, в природе, не существует. Ну, то есть, вы можете прочитать мотивирующую статью своему потенциальному работодателю. Показать "статистику" из журнала. Поклясться в верности. Вопрос только в том – поможет ли?
Реальность такова, что энтерпрайз не любит удалёнку.
- – Designer Remote? – Проходите сюда пожалуйста.
- – Java Remote? – Стоп. А вы кто такой?
Почему так – можно обсуждать отдельно. Но есть ли смысл? Устоявшиеся форматы работы и управления меняются крайне медленно. Менеджер энтерпрайз разработки хочет видеть ваш затылок. Все восемь долгих рабочих часов.
- – Java Part-Time? – Нет, не слышали.
Вывод: желаемый формат работы должен соответствовать реальности. Если вы не готовы всю оставшуюся карьеру "плыть против течения" и жаловаться на форумах на "несправедливость бытия".
Возраст рынка
Чем старше рынок, тем меньше ему интересны начинающие. Все треды по трудоустройству переполнены новичками, формально освоившими Java Junior и обнаружившими, что работа не находится. Для трудоустройства требуется опыт. А для опыта требуется трудоустроство. Замкнутый круг.
Тогда как талантливых Junior JS сейчас разбирают как горячие пирожки. Впрочем, и это не будет длиться вечно...
Вывод: избегайте устоявшихся рынков, если не понимаете в точности, как будете искать работу.
- – Ваш папа – Java-программист, готовый всё подсказать? – Пожалуйста. Жгите.
- – Прочитали в газете(!), что требуются Java программисты? – У меня для вас плохие новости.
Как узнать возраст рынка? А Википедия на что?! Для IT расклад, примерно, такой:
- До 5 лет – новый рынок
- От 5 до 10 – устанавливающийся рынок
- Более 10 лет – устоявшийся рынок
Дальше думайте сами.
Заработная плата
Разница между направлениями не такая большая. Да – потолок зарплаты в одних направлениях наступает раньше, чем в других. Но всегда остаётся возможность репозиционирования. Верстальщик → Эксперт по анимации. И потолок поднялся ещё на 100%...
Вывод: я бы не зацикливался на этом факторе. Всем начинающим платят мало. Всем профи платят много. Это то, что вам сейчас достаточно знать.
Возможность саморазвития
Для первого языка – всё это неважно. "Тупо следовать общественному мнению" – будет самым правильным решением. Однако, если судьба будет к вам благосклонна и вы дойдёте до этого вопроса...
Практически все мейнстримные языки имеют свои недостатки. Комьюнити просто вырабатывает свои ответы на них. С ростом опыта, факторы оценки неизбежно меняются. Сам язык будет значить всё меньше. Экосистема – всё больше. Стыдно признаться, но когда-то я считал Python хорошим языком...
Мой текущий рейтинг качества (актуальных) языков:
- хорошие: Haskell
- неплохие: F#, Lua, Rust, Swift
- посредственные: C#, Clojure, Erlang, Go, JS, Python, Ruby, Scala
- плохие: C, Java, Objective-C
- ужасающие: PHP, Markdown (последний – ради лулзов, но на правильном месте)
- особый круг ада: Bash, C++
- вне классификации: ассемблеры
Уточню, что речь идёт о качестве по меркам сегодняшнего дня. Тот же C – важнейший исторический чекпойнт. Но, как язык, – это уже архаика. Осваивать OS (ради самих знаний) лучше через Rust. Понимаю, что подобные списки вызывают срывы у психологически слабых людей, воспринимающих альтернативные мнения как личное оскорбление. Но что поделать?
Разумеется, возможность саморазвития не стоит отождествлять с качеством языка. Однако, они связаны. Плохой язык – отупляет "носителя". Хороший – делает умнее, вынуждая развиваться или покидать профессию. Оба последних варианта хороши для человечества.
Качество языка, в долгосрочной перспективе, определяется его гибкостью. Следим за руками:
В JavaScript
- Отсутствие стандартной библиотеки
- Приводит к появлению множества альтернатив
- Которые конкурируют между собой
- Не будучи завязаны на обновления языка
- Наиболее приспособленные (а не "первые") решения выживают по Дарвину
В Python
- Большая стандартная библиотека ("Batteries included!")
- Включающая исторически первые (и уже потому – плохие) решения
- Приводит к отсутствию постоянной конкуренции (никому не нужен второй логгер)
- Завязка обновлений библиотек на релизы языка
- Приводит к деградации всей экосистемы
В итоге, JavaScript теснит Python не только в Web, но уже и в сфере Scientific Programming. Конкуренция и "there are many ways to do it" порождают качество. Медленно, болезненно, неизбежно. Тогда как авторитаризм и игры в BDFL – ведут к катастрофе. Медленно, безболезненно, столь же неизбежно.
Вывод: если по вашему направлению есть выбор, – выбирайте языки с живым, разнородным комьюнити, в которых нет: * "стандартного фреймворка" (одобренного и запечатанного Google) * "пожизненных диктаторов" * списка "правильных мнений" * и прочей дряни
Иван Клешнин может научить профессионально программировать на JavaScript Нанять
Краткий гайд по выбору
Определяемся с важными критериями и Выбираем.
Хочу работать удалённо!
JS, Ruby
Хочу создавать десктопные приложения!
Java, C#
Хочу создавать веб-приложения!
JS, PHP, Ruby
Хочу поддерживать легаси ^_^!
PHP
Хочу в Enterprise (крупный бизнес)!
Java, Scala, F#
Хочу много денег!
См. выше
Хочу использовать язык в собственном бизнесе!
JS, Haskell, PureScript
Хочу много свободы!
См. выше.
Хочу в финансовую сферу!
Scala, Haskell, F#
Хочу в научную сферу!
Учёные сами выбирают подходящий инструмент. Тот случай, когда можно выбирать.
Хочу в Machine Learning!
См. выше.
Хочу быть сисадмином!
Ruby, Bash
Хочу в системное программирование!
C, Go, Rust
Хочу создавать распределённые системы!
Java, Scala, Erlang, JS
Хочу создавать интерфейсы
JS, Java, C#
Хочу создавать AAA игры!
C++, C#
Хочу создавать инди-игры!
C#, JS, PureScript 1.0 ^_^
Хочу создавать приложения под мобильные устройства
Swift, Java, JS (Objective-C уже нет смысла)
Хочу работать с данными!
SQL
Хочу работать с БОЛЬШИМИ данными!
Java, Python, R, Scala
Хочу работать!
Список ТОП-10 приведен выше.