С программированием я впервые столкнулся в школе, на уроках информатики. Это были какие-то нудные объяснения принципов n-ричных систем счисления. Ну а в качестве зачёта нужно было написать свой сайт. Тогда мне казалось, что нет более скучного занятия на свете. Как же я ошибался! К сожалению, школьная программа информатики не дает полной картины о работе IT, и как выбрать язык программирования — непонятно.
Прежде, чем задаваться вопросом «Какой язык программирования выбрать для изучения», новичку следует ознакомиться с тем, какие языки существуют и в чём их различия.

Порог вхождения: высокий, низкий, средний

Среди программистов часто можно услышать о «пороге вхождения» — понятии, отражающем количество усилий, необходимое для освоения языка программирования отдельно взятым «джуном» в достаточном уровне, чтобы написать свою первую серьезную программу и найти работу. «Порог вхождения» складывается из знания:
  • особенностей синтаксиса и нюансов языка;
  • библиотек;
  • алгоритмов и структур данных.
На самом деле даже работу в Excel можно назвать своего рода программированием. Кстати, эта знакомая всем офисная программа не так проста, как кажется. Для одного порогом вхождения будет умение построить таблицу, для другого — знание сложных формул и макросов. В любом случае, этот порог невелик. Дальше идут квази-языки: например, -программирование. Затем — наиболее простые в освоении языки: например, PHP. Далее — языки с нативным (обычно, образованным от английского языка) синтаксисом, не требующие ручного взаимодействия с памятью: например, Java, JS. Затем — языки, требующие крайне внимательного обращения с памятью, структурами данных и алгоритмами: например, C, C++. Молодые мультипарадигменные языки имеют, пожалуй, самый высокий порог вхождения, потому что для их освоения нужно не одну собаку съесть в других языках программирования: например, Scala. Но в первую очередь при выборе языка стоит определиться, чем ты хочешь заниматься дальше: разрабатывать web, enterprise, desktop или мобильные приложения.

Web или не Web?

Web

Web-программистов можно разделить на Frontend- и Backend-разработчиков. Стоит разобраться, что означают эти термины. «Фронтенд» разработчики занимаются так называемой клиентской стороной — тем, что увидит пользователь. «Бэкенд» — это программно-аппаратная часть сервиса — то, что работает на сервере. Для Frontend-разработчика, решающего какой язык программирования выбрать, must-have это JavaScript и его фреймоврки: Angular JS, React и другие. Диалекты JS не так популярны, как их родитель, но тоже могут быть полезны: CoffeeScript, TypeScript. Есть ещё flash AS, раньше были JScript и VBScript, но это помнят только динозавры =) Кроме того, необходимо разобраться в HTML и CSS.
Многие новички думают, что JavaScript и Java — это почти одно и то же, не следует путать эти языки. JS раньше назывался «LiveScript» и получил свое сегодняшнее имя именно благодаря популярности слова «Java». Для web backend’a подойдут PHP, Python, Ruby, Pearl, Java. Здесь хочу обратить внимание на PHP — о других языках мы поговорим далее — один из самых простых в освоении ЯП, имеющий низкий порог вхождения. Ruby, судя по опросу знакомых web разработчиков, медленно, но верно набирает популярность: его любят за лаконичность и красоту.

Не Web (Enterprise, Desktop, Mobile)

Я специально объединил эти языки программирования в категорию с таким странным названием. На большинстве из них можно писать и enterprise, и desktop, и даже мобильные приложения. Python — простой в понимании ООЯП, стал невероятно популярным в последнее время в связи с развитием Machine Learning: его адепты широко используют Python. ML — достаточно молодое направление в IT, и хотя первые плоды уже получены, я бы не стал спешить с погружением в эту отрасль при выборе языка программирования. Во-первых, нужно ОЧЕНЬ хорошо разбираться в математике. Во-вторых, волна популярности может пройти так же, как и с «блокчейном» или «нанотехнологиями». Кроме того, как ты помнишь, Python используется в web разработке. C++: классика, на основе «плюсов» строится всё и вся. Этот язык был прародителем всех популярных ООЯП, и новичку безусловно стоит обратить на него внимание. На его основе написано множество популярных приложений. Но большая вероятность «выстрелить себе в ногу» и сложный для восприятия синтаксис сводят на нет вероятность освоения новичком этого мастодонта программирования. Kotlin — Java для хипстеров — безумный микс ООП и функционального программирования. В последнее время популярен благодаря тому, что опытный разработчик, перешедший с Java на Kotlin, серьезно повышает свою производительность. Опытный девелопер быстро освоится в этом ЯП. Кстати, то же относится к Scala, но Kotlin популярен именно в Android. Java — прост для освоения новичком. В том числе, благодаря JavaRush: именно здесь я понял как выбрать язык программирования =) Синтаксис Java понятен, вероятность «выстрелить себе в ногу» имеется, но не критична.

ООП или ПОП?

Процедурный подход

Процедурно-ориентированный подход предполагает написание программы, состоящей из последовательных операторов, которые можно собрать в единое целое для эффективного решения конкретного круга задач. К таким языкам можно отнести: C, PureBasic и Pascal. Те самые, что навевают уныние на старшеклассников и студентов младших курсов. Также существует относительно молодой GO. Тем не менее, знакомство с процедурными языками очень полезно для потенциального разработчика. Для меня погружение в процедурные языки связано с системой Mathematica (Wolfram) и университетской научной деятельностью. Благодаря правильным алгоритмическим подходам и простым процедурам, линейно двигаясь от начала программы до ее конца, мне удавалось вычислять значения, актуальные для современной теоретической физики. Именно благодаря этим «последовательным» ЯП, начинаешь понимать, что иногда проще написать код, чем считать самостоятельно. Изучение ПОП дает неплохую алгоритмическую подготовку, которую работодатель почти всегда хочет видеть у кандидата при приеме на работу. Основы всего и вся в ИТ строятся именно на процедурных языках, так что не стоит их недооценивать. Кстати, новички, решающие какой язык программирования выбрать для изучения, часто думают о том, что многопоточность — прерогатива исключительно ООП. Это не так. Процедурные ЯП тоже позволяют выполнять параллельные вычисления.

Объектно-ориентированный подход

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

Пример

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

Представим программу, описывающую автосалон, который продает легковые и грузовые автомобили, как новые, так и подержанные. В процедурном языке для каждого объекта нужно описать функции, обрабатывающие ввод или вывод данных для нового легкового, нового грузового, б/у легкового и б/у грузового автомобилей. А что предлагает ООП? При объектно-ориентированном подходе нужно просто описать базовый класс ТРАНСПОРТ, который будет хранить в себе характеристики, присущие и тому, и другому типу автомобилей:

  • Марка
  • Объем двигателя
  • Мощность
  • Год выпуска
  • Новый или б/у
  • Цена

И методы для ввода-вывода информации. Затем создадим объекты, наследующие характеристики класса ТРАНСПОРТ: ЛЕГКОВУШКА и ГРУЗОВИК. Они содержат уточнённую информацию, присущую именно таким видам транспорта, а также методы ввода-вывода.

Внезапно руководство салона решило расширить ассортимент и продавать еще и мотоциклы. Процедурный подход предложит переписать всю логику для новых и б/у мотоциклов с самого начала, в то время как ООП-язык позволит просто создать новый объект МОТОЦИКЛ, наследующий все характеристики суперкласса ТРАНСПОРТ и содержащий уточнения.

А что будет, если добавлять разные транспортные средства? Процедурная реализация будет требовать больших трудозатрат, чем ООП. Причем чем больше ассортимент, тем меньше нужно будет делать манипуляций с объектами.

Итак, ООП — это стиль программирования, позволяющий объединять данные и методы одной сущности и работать с ними как с цельным объектом. Сущности могут выстраиваться в иерархии и взаимодействовать между собой, не вдаваясь в подробности внутренней реализации друг друга. Для себя я выделяю три причины, по которым ООП — более прогрессивный подход:
  1. ООП предполагает независимую разработку отдельных модулей, предоставляя программисту или команде выбирать способ и границы соприкосновений и обмена информацией.

  2. Разбиение на небольшие модули намного проще для восприятия, чем монолитные процедуры. Благодаря этому сторонний разработчик быстро разберется в твоем коде, а ты при необходимости войдешь в новый проект.

  3. Изменение одного объекта может никак не отразиться на взаимодействии с другим, но способно повлиять на иерархию дочерних объектов. Освоив такой подход, расширение и доработка программы становится тривиальной задачей.
Нужно помнить о том, что один подход не противоречит другому, но иерархически ООП всё же находится выше. Собственно, почему я рекомендую именно Java? Я бы выделил следующие причины:
  1. Кроссплатформенность.

    Java работает везде благодаря JVM —виртуальной машине Java. Один из главных плюсов этого языка — кроссплатформенность: не нужно думать о том, какую библиотеку подключить, какова архитектура у конкретного процессора. «Написано однажды —работает всегда».

  2. Документация.

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

  3. Популярность.

    Java — самый популярный язык программирования в мире: кроме вышеупомянутых Android и web разработчиков, на Java пишет почти каждый первый энтерпрайз разработчик. Enterprise — внутрикорпоративная разработка, необходимая для нужд больших корпораций.

    Ежегодно хейтеры предсказывают «смерть Java», дескать: «Oracle перестанет его поддерживать, и вообще вы ерундой занимаетесь». Это не так! Новые версии Java обещают выпускать раз в полгода. Наиболее важные нововведения и фичи последней версии можно прочитать здесь.

    Для меня переворотом и открытием были лямбды в Java 8, что уж говорить о новых версиях! Сейчас я работаю на «ретроградском» проекте, поэтому не вникаю в нововведения, но то, что Java живет — факт.

  4. Android.

    Android уверенно занимает более 80% рынка мобильных телефонов последние 4 года, под этой операционной системой работают телевизоры, медиаплееры и даже медиасистемы в автомобилях. А разработка под эту ОС ведется преимущественно на Java. Только представь какие перспективы открываются. Когда я устроился на работу в качестве Android-разработчика, мне стало интересно: а сколько стоит продукт, разработкой которого я занимаюсь? Оказалось, что цена за год составляет примерно 5$. Возник резонный вопрос: откуда средства на этот офис, на зарплаты, печеньки, теннисный стол, роботов и прочие «ништяки»? Дело в количестве: у нашего приложения — 20 млн пользователей.

  5. Зарплаты.

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

Популярность языка программирования

При выборе языка программирования нужно думать о конечной цели обучения — получении первой работы. Чтобы оценить популярность разных ЯП, я зашел на популярный рекрутинговый портал и стал смотреть на количество вакансий по разным запросам для Москвы. Результаты вы можете увидеть ниже.
Java: 277
python: 227
php: 188
c#: 147
c++: 131
ruby: 40
scala: 24
kotlin: 20
Даже популярный в последнее время Python не смог опередить Java. Но это субъективные данные: конкретный город, конкретный день. Есть официальные источники, к ним и обратимся. На октябрь 2018 по данным TIOBE Java занимает первое место. В рейтинге PYPL Java занимает второе место, далеко оторвавшись от JS и соперничая с «модным» Python.

ИТОГИ

Вот на что стоит обратить внимание новичку при выборе языка программирования:
  • Популярность (Java стабильно занимает лидирующие позиции);
  • Порог вхождения (Для Java — средний: разброс компетенций, которые требует работодатель, достаточно широк);
  • Доступные материалы (на русском языке порталов, аналогичных JavaRush нет, следовательно, пальма первенства уходит угадайте кому =));
  • Области применения: чем больше отраслей, в которых можно применять язык программирования, тем больше специалистов требуется на рынке. Про кросс-платформенность я уже говорил, но не устану это повторять.
Конечно, везде есть подводные камни, но дорогу осилит идущий: только ты сам можешь решить, какой язык программирования выбрать. Успехов в обучении!
Что ещё почитать:

Почему многие разработчики сдаются, даже толком не начав

Почему нужно учить именно Java?

С чего начать изучение Java