Первый язык программирования - каким он должен быть?
Позавчера мы запустили проект @studychain и под первым же постом возникла весьма интересная дискуссия. Мы со @chicagoist обсуждали, какой язык лучше всего подходит для того, чтобы научиться программировать.
Классикой жанра при обучении новичков являются Basic и Pascal. С этих языков начинали многие из моих коллег, кто впервые столкнулся с компьютерами в школе или университете в девяностые годы. В то время была очень популярна идея специального языка, предназначенного для изучения программирования. И это было вполне оправдано, ведь альтернативой для Basic и Pascal был главным образом язык C, который достаточно сложен в освоении и предоставляет новичку кучу возможностей выстрелить себе в ногу.
Учебник Столярова
Уже не помню почему так получилось, но в последние годы у меня было убеждение, что учебные языки уже давно канули в Лету. Ведь зачем нужен Basic, когда есть тот же Python или JavaScript? Но оказалось все не так-то просто. Вот на этом сайте преподаватель МГУ А.В. Столяров недавно выложил третий том учебника программирования, над которым он работает уже несколько лет. По мнению автора, начинающему программисту следует сначала изучить Pascal, затем Assembler, после чего следует язык С, а уже за ним C++, который и предполагается использовать для решения прикладных задач.
Что интересно деньги на работу над учебником и его публикацию собираются путем краудфандинга. На сегодняшний день проектом получено пожертвований на общую сумму чуть меньше 800 тысяч рублей. То есть желающие изучать и преподавать программирование, начиная с языка Pascal определенно есть и их немало.
Но действительно ли это лучший путь? Все зависит от обстоятельств. Если вы только-только поступили в университет и впереди еще 5 лет учебы, это вполне годный метод. Вы получите очень хорошее понимание работы компьютера и операционной системы, не будете бояться использовать assembler, в тех редких случаях, когда это необходимо. Но есть и проблемы. Путь предлагаемый Столяровым уж очень длинный, пройти его в одиночку вне стен учебного заведения будет достаточно трудно. Что поделать, за качество, в том числе и образования, всегда приходится платить.
А что там у них, за бугром?
Есть ли другие варианты? Разумеется. Например, на Западе уже давненько используют Python, JavaScript и другие популярные языки программирования для курса Computer Science 101 - так на английском обычно называется курс "Введение в программирование (компьютерные науки)". В этом подходе есть определенные преимущества:
- Язык можно будет использовать не только для обучения, но и в дальнейшей работе, вы просто изучаете нужные библиотеки и вперед.
- Можно найти кучу дополнительной информации, начиная от подробной документации по языку, заканчивая множеством качественных книг и учебных курсов.
- Есть возможность получить помощь в сложных вопросах на ресурсах вроде StackOverflow.
Основной недостаток этого подхода - вы будете знать на один язык меньше. Для начинающего программиста очень важно как можно быстрее побороть привязанность к первому языку и страх перед переходом с языка на язык, ведь их в любом случае прийдется осваивать много и разных.
Парадигмы языков программирования - с чего начать?
Является ли популярность языка достаточным условием для его выбора? Нет. Есть еще несколько критериев, которые позволяют сильно уменьшить число вариантов.
На мой взгляд, очень важно, чтобы первый язык поддерживал различные парадигмы программирования.
О чем это вообще? Есть разные способы написания программ: можно говорить компьютеру что делать, а можно объяснять, как именно это надо сделать. Первый подход называется декларативным программирование, а второй - императивным. В декларативном подходе выделяется функциональное программирование (ФП), а в императивном - процедурное программирование. Также отдельной парадигмой считается Объектно Ориентированное Программирование (ООП). Если опустить детали, то единственное, что важно понимать - это то, что в практике программирования важны все парадигмы. Для решения одних задач не обойтись без ООП, для других лучше всего подойдет функциональное программирование. А процедурный стиль хоть и считается устаревшим, но все равно используется достаточно часто в самых различных областях.
Большинство будущих разработчиков осваивает парадигмы программирования последовательно. Начинают обычно с процедурного программирования, например, на языке Pascal, затем, как правило, идет ООП, а функциональное программирование считается уже своего рода высшим пилотажем. Альтернативный подход, который набирает популярность в последнее время, состоит в прохождении этого пути в обратном направлении. Обучение начинается с ФП, так как оно считается проще в освоении именно для новичков, которые еще не привыкли к чисто императивному подходу.
Оба пути имеют свои недостатки. Если начинать с процедурного программирования, у учащихся складывается ложное представление, что ООП и ФП - это нечто сложное и непонятное. Также у многих возникают проблемы с освоением важного в практической работе языка SQL, который по своей сути является декларативным. С другой стороны, если начать обучение с функционального программирования, то будет достаточно сложно перейти к решению практических задач. Когда вы захотите создать, например, свое первое веб-приложение, выяснится, что наиболее популярные и качественные фреймворки требуют написания кода в императивном стиле.
На самом деле, если не лезть слишком глубоко в дебри, все парадигмы программирования достаточно просты и вполне могут быть освоены новичками параллельно, особенно если обучение происходит под руководством инструктора. Но для этого лучше всего выбрать язык, который одновременно поддерживает классическое процедурное программирование, ФП и ООП. Этот язык должен быть довольно популярным, стабильным и доступным на различных платформах.
При таком подходе старые "учебные" языки, такие как Pascal и Basic нам уже не подходят, так как они поддерживают только процедурное программирование. Аналогично отбрасываются также "чистые" функциональные языки, как Haskell и Clojure. Также стоит оставить за бортом Java и C#, так как они рассчитаны в основном на программирование в стиле ООП.
Лучшие кандидаты
*
Еще несколько лет назад практически не было конкурентов языку Python. Он очень дружественный по отношению к новичкам и в то же время отлично подходит для профессионального программирования. Язык поддерживает как процедурную, так и функциональную парадигмы и с помощью него можно освоить практически все необходимые концепции языков программирования, от самых простых до таких достаточно продвинутых, как итераторы и декораторы.
*
В последнее время у Python появился сильный конкурент, которым, как это ни странно звучит, является язык JavaScript. Во-первых, благодаря Node.js, JavaScript вышел за пределы браузеров и превратится в универсальный язык программирования. Во-вторых, с принятием стандарта EcmaScript 2015, он, наконец, избавился от детских болезней и превратился в полноценный язык программирования, достаточно хорошо поддерживающий все известные парадигмы.
Кроме того, велика вероятность, что с JavaScript вам так или иначе придется сталкиваться, какой бы язык вы ни выбрали в качестве основного, особенно если вы собираетесь делать что-то, связанное с работой в сети.
А еще для начала работы с JavaScript нет необходимости устанавливать что-либо на компьютер, все необходимое у вас уже есть, так как интерпретатор JavaScript встроен в любой современный браузер. Вы можете начать учиться прямо сейчас, просто перейдя по ссылке в одну из "песочниц": jsFiddle или Plunker.
В общем, если бы мой путь в мир программирования начинался сейчас, в 2017 году, в качестве первого языка я выбрал бы JavaScript.
Благодарю за внимание,
@wealthycat