Время от времени мне задают по 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. То, что доктор прописал, и стоит совсем недорого.

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

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

admin

Share
Published by
admin

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

2 месяца ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

2 месяца ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

2 месяца ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

2 месяца ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

2 месяца ago

Как управлять журналами событий из командной строки

В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…

2 месяца ago