Время от времени мне задают по e-mail, казалось бы, простые вопросы, но на которые почему-то очень сложно ответить. И вот мне в голову пришла странная мысль. А что, если взять один из таких вопросов, задать его десяти широчайше известным в узких кругах людям, и объединить ответы в один пост? Собственно, с результатами такого эксперимента вы можете ознакомиться под катом. Вопрос, который был задан: «Какой язык программирования вы бы посоветовали учить первым, и почему именно его?»

Евгений Охотников , автор блога Размышлизмы eao197 .

Для ответа на этот вопрос нужно сперва ответить еще на один: а для чего нужно учить язык программирования? Если для того, чтобы начать сразу зарабатывать программированием, то здесь нужно идти от конъюнктуры: посмотреть по сторонам, определить куда проще всего устроиться junior-программистом и взяться за изучение именно этого языка (выбор тут будет из чего-то вроде Java, PHP, JavaScript и т.д.).

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

Сначала был Бейсик. Старый, в котором еще нужно было расставлять номера строк. Но в котором все было просто и понятно. Бейсик стал крючком, который зацепил и заинтересовал, хотя и научил лишь самым азам.

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

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

Потом язык C. Это тот самый мостик, который позволяет связать высокий уровень Паскаля с низким уровнем ассемблера. Кроме того, именно в C нужно разбираться с такими вещами, как указатель, указатель на указатель, указатель на указатель на указатель и т.д.

Это работало 25 лет назад. Надеюсь, если найти адекватную замену для Бейсика (например, Python или Ruby, но без погружения в ООП), то эта же цепочка будет работать и сейчас. Она должным образом отформатирует мозги новичка и станет хорошим тестом на профпригодность. После чего можно будет изучать все, что захочется — хоть Java, хоть JavaScript, хоть C++, хоть Prolog, хоть Haskell.

Никита Прокопов , tonsky.livejournal.com .

JavaScript:

  • Минималистичный — самое необходимое можно изучить очень быстро;
  • Почти не парит мозг инфраструктурой. IDE и среда исполнения это браузер, компиляции и сборки нет, зависимости можно подключить напрямую из сети;
  • Динамический, позволяет интерактивную разработку. Когда не знаешь как правильно писать, важно как можно быстрее попробовать возможные варианты;
  • Сразу можно делать все интересные вещи: графику, UI, видео, аудио, анимации, сеть;
  • С прицелом под любое возможное устройство;
  • Бесконечное количество справочных ресурсов;

Reangd , автор блога Программист — это звучит гордо .

Начинать нужно с чего-то такого, что не отобьет на первых парах желание. Язык должен быть таким, чтобы сел — перепечатал из книги строчку и она уже что-то делает. Чтобы все было понятно, без магических заклинаний вроде public static void main , когда для понимания каждого слова приходиться читать по паре глав. Чтобы установка, компиляция и запуск были простые, без необходимости изучать для этого новый язык вроде make-а. Чтобы писать на нем можно было везде, вплоть до телефонов, а не иметь прибитый гвоздями к одной платформе язык. Чтобы было большое комьюнити и куча учебных материалов на всех языках. Чтобы можно было и ООП пописать и функциональщину потрогать. Чтобы учить было легко и при написании не приходилось сильно задумываться как ту или иную вещь сделать, но при этом достаточно строгий, не позволяющий строки в числа неявно конвертировать. Пожалуй все, хочется только добавить, что задерживаться на нем не нужно, как только поняли, что программирование нравится обязательно должен последовать 2, 3, 4 языки.

Ах да, про сам язык то забыл сказать — конечно же Python .

Анастасия Казакова ( @anastasiak2512 ), C/C++ разработчик, менеджер по продуктовому маркетингу CLion, кросс-платформенной среды для разработки на C и C++ от компании JetBrains .

Хотя для меня первым языком программирования был C, я бы не советовала начинать с него. Мне сейчас кажется, что самый правильный вариант, это какой-нибудь функциональный язык. Возьмите Lisp , Scala , OCaml , Haskell . Почему? Чтобы ответить, сначала скажу, что программирование — это алгоритмы, и начинать надо с них. Но чтобы изучать алгоритмы и их практическое применение, нужен инструмент для работы с ними, язык. Почему же именно функциональный?

Во-первых, отсутствие лишнего. Программа на функциональном языке будет содержать только то, что нужно для выражения идеи/алгоритма. Это краткость чрезвычайно важна, так как позволяет отделить мух от котлет. Язык — это инструмент для выражения алгоритма в терминах, понятных машине. Чем больше «машинных» деталей, тем поначалу хуже. Конечно, со временем, станет интересно копаться в деталях реализации того или иного объекта, структуры данных, организации той или иной области памяти. Тут всегда можно будет открыть C и начать изучать адресную арифметику. Но начинать с этого, это все равно что изучать инструмент вперед цели, для которой он служит.

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

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

Сергей Зефиров , thesz.livejournal.com .

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

Поэтому это какой-либо Лисп или какой-либо типизированый ФП (Хаскель, Агда, Скала).

Андрей Карпов , технический директор ООО «СиПроВер», один из создателей анализатора PVS-Studio ( публикации на Хабрахабр).

Если говорить о самом первом языке программирования, тогда, по всей видимости, речь идет о ребенке. Здесь на первый план выходит задача заинтересовать и больше ничего. Правильный или неправильный язык — не имеет значения. Раньше для этой цели идеально подходил QuickBASIC. Сейчас это, пожалуй, SmallBASIC или различные конструкторы с возможностью запрограммировать робота, собранного своими руками.

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

Я бы рекомендовал дальше изучать ассемблер. Пусть недолго. Это очень важный этап. После него в голове у человека складывается четкая картина того, как и что работает. В дальнейшем такой человек при необходимости не побоится запустить отладчик и понять причины магического поведения программы, изучить ассемблерный листинг, чтобы понять, где ошибается компилятор, и так далее. То есть, он может решить задачи, перед которым отступают коллеги, изучавшие только высокоуровневые языки. Я серьезно. Знание низкоуровневых основ помогает редко, но иногда очень сильно.

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

Роман Душкин , автор множества книг и организатор конкурсов по функциональному программированию .

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

Я бы начал с электронных таблиц. MS Excel или Google Spreadsheet — это то, что требуется. Как сказал кто-то из корифеев ФП, MS Excel — это наиболее широко используемая система функционального программирования. Действительно, если поднатореть в формулах, то можно делать много забавных и очень нетривиальных вещей, даже не влезая в дебри VBA (а вот этого точно не нужно, я категорически против VBA). Современные электронные таблицы предлагают вполне серьезный инструментарий по обработке данных, их поиску, выборке и другим операциям. Учитывая то, что ячейки и формулы в электронных таблицах составляют взаимосвязанные цепочки чистых вычислений без побочных эффектов — это то, что надо для первичного вхождения в парадигму чистого ФП. При помощи функций электронных таблиц можно эмулировать практически все чистые (не монадические) функции первого порядка модуля Prelude языка Хаскелл. Можно, при умении и расторопности, эмулировать и функции высших порядков.

В общем, электронные таблицы с функциями для обработки данных — это то, что нужно. Единственный минус, который мне видится, заключается в смешении уровней M и V в схеме MVC. Но, думаю, что это совсем не критично при первом изучении языков программирования.

Антон Лебедевич , автор блога о мониторинге и статистике mabrek.github.io .

Мне кажется, все равно, с чего начинать. Главное, в конечном итоге набрать по одному из разных подходов.

Alex Ott , alexott.net .

Это достаточно сложный вопрос, поскольку не ясна целевая аудитория, и какова цель обучения программированию, поэтому не может быть одного самого правильного языка. Я постараюсь описать возможные аудитории/причины с которыми я встречаюсь по работе, и укажу какие бы языки я бы выбрал. Обычно программирование не изучается ради самого себя, а чтобы решить конкретную задачу(-и). Я бы разделил изучение программирования на несколько этапов:

  • Обучение алгоритмическому мышлению и организации программ. Для многих людей, не являющихся программистами, это часто сложная проблема. В этой части необходимо показать, как создаются программы, и из каких кусочков они создаются (циклы, ветвление, присваивание). Это самое правильное место, где можно заложить правильный стиль написания программ, например, объяснить опасность присваиваний глобальным переменным в многопоточных программах и т.д. Для этой части необходим очень простой язык, не перегруженный синтаксисом и машинно-зависимыми вещами. Тут хорошо подходит SICP + Schema, поскольку синтаксис максимально прост, и не зависит от компьютера (например, можно работать с любыми числами, не опасаясь переполнений и т.п.).
  • Обучение основам компьютерной архитектуры и т.п. Это обзорная часть для всех — как представляются числа, как устроена память, функции операционной системы, и т.п., так что люди смогут рассуждать о времени выполнении, и почему, например, не стоит каждый раз читать данные из файла в цикле. Тут уже можно взять Python или что-то подобное…
  • Обзор алгоритмов и т.п. Объяснение сложности алгоритмов в применении к конкретному языку, например, когда стоит использовать список vs array, какая сложность стандартных функций и т.п.
  • Обучение решению класса задач. Тут уже сложнее, поскольку у каждого своя специфика, зависящая от требований — наличия библиотек, необходимости итеративной разработки и т.п.. Для «ученых» это может быть Python/R, для big data — Java 8 или Scala, для около-железячников, особого выбора кроме C нет, и т.д.

Андрей Листочкин ( @listochkin ), программирует на JavaScript, Rust, Ruby, Java и многих других языках. В институте учил Pascal, Delphi, SQL, Prolog, Lisp, ассемблер, из всего этого больше всего понравился Prolog. Помогает вести одно из крупнейших чат-сообществ разработчиков в Украине и Восточной Европе Dev-UA , организует Rust и JS митапы, выступает на конференциях и иногда помогает вести подкаст DevZen .

У меня два ответа на этот вопрос.

1. Тот, какой нужен. Скажем, вам 12 лет, вы любите Майнкрафт и хотите написать для него мод. Моды под Майнкрафт пишутся на Java, поэтому учите Java. Или, например, вам 35 и вы хотите что-то такое особенное посчитать в Google Spreadsheets, а там сложные формулы пишутся на JavaScript, поэтому учите JavaScript.

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

2. А вот если у вас нет ничего сиюминутно важного или вы просто захотели в будущем стать программистом, и при этом ваша цель — не просто стать им, а стать одним из лучших, то учите Haskell. Он научит вас хорошему и не научит плохому, и после него вам гораздо проще будет писать хороший код на JavaScript, Ruby и других языках.

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

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

В то же время для Haskell есть изумительная книга Learn You a Haskell for Great Good! , а для Мака — прекрасный комбайн, чтобы поставить и начать писать код: Haskell for Mac . Это редактор с подсветкой синтаксиса, подсказками, визуализацией данных и REPL. То, что доктор прописал, и стоит совсем недорого.

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

Дополнение: Десять мнений: что отпугивает от работодателя на интервью

EnglishRussianUkrainian