Позавчера мы запустили проект @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
Я уже несколько лет работают над концепцией "базовых познавательных навыков" (уже хорошо гуглится, кому интересно) и пришел к мысли, что программирование относится к сложным познавательным компетенциям, уровня проектирования, исследования и рефлексии.
Можно сказать, что программирование - это проектирование на формальном языке.
То есть, прежде чем учить язык программирования, надо хотя бы освоить проектирование как познавательную практику.
Второе, - надо также понимать, что программирование это не вещь в себе, а раздел дискретной математики и прежде чем садиться писать код хорошо бы понять операции надо множествами (АКА Булева алгебра) и теорию графов, на которой строятся все алгоритмы.
И это только про процедурное программирование, а есть еще функциональное, не говоря о нейронном и квантовом.
То есть, если мы говорим о программировании, как о разработке, а не о правке ХТМЛ кода вебстраничек, то начинать с любимого Питончика или б-гомерзкого Яваскрипта одинаково глупо. Надо начинать с дискмата - с Булевой алгебры и рисования блок-схем, как учили в советской школе.
Полностью согласен. По моему мнению, обучение программированию лучше всего начинать с обучения моделированию. В курсе "Программирование для новичков" от @studychain в первые 2-3 месяца вся практика будет построена именно на рисовании диаграмм и схем, никакого написания кода не будет вообще.
Закрепить навык моделирования можно, изучая устройство машины и основные концепции языков программирования.
Считаю, что проще сначала показать базовые вещи на бумажке, а потом "развернуть спираль" и повторить пройденное уже с использованием реального ЯП, ну или нескольких, по желанию и возможностям обучающегося. Так должно быть проще, чем мешать в кашу общие принципы и синтаксис и приколы отдельного языка, правда, обучение займет больше времени.
Знание математики однозначно важно. Если идет речь об учебе в университете, то начинать надо именно с этого. Но если человек хочет освоить программирование, например, в качестве хобби или просто попробовать себя в этом деле - начинать с математики не лучший вариант. Не каждая птица долетит до середины реки :)
К тому же достаточно широкий круг интересных задач вполне можно решать имея очень базовые, практически школьные знания математики.
Хм... благодарю за упоминание меня в качестве оппонента. ;-) Немного неожиданно для меня.
От души желаю развития проекту и буду следить за развитием (помогать, чем смогу).
Вопрос к автору, а почему Си не стоит в ряду с Python и JS? Именно от отсутствия ООП?
В C нет ООП и ФП, С++ попадает в ту же категорию, что и Java c С#.
Тут еще такой момент, в статье языки отбирались под определенные критерии, поэтому на выходе остались только Python и JS. Но эти критерии вещь достаточно произвольная, может быть множество вариантов - это в любом случае никак не истина в последней инстанции. В моем случае я еще думал о языках, которые лучше подходят именно для дистанционного обучения.
Большое спасибо! Поддержка очень важна для нас :)
Кстати, опять оффтоп, но нельзя его не вспомнить , что вы скажите о качестве и полезности курса «CS50. Основы программирования." ? Он даже на русском есть.
Однозначно можно сказать, что курс очень распиаренный :) Надо будет выбрать время, посмотреть его, сейчас сложно составить мнение.
Меня лично смущает использование Scratch, но, возможно, это мои персональные тараканы, я не особый поклонник визуальных языков, считаю это дело разновидностью извращения :)
Очень любопытная и интересная статья. JS довольно любопытен, как и Python. И несмотря на то что Python мне ближе, я не собираюсь оспаривать вашу точку зрения. JS мне тоже очень нравится. И он действительно есть в каждом браузере. ))
JS как первый язык? За что вы ненавидите детей?
А почему именно детей?
Я читал много статей на эту тему и почти все они заканчивались одинаково, что начинать программирование нужно либо с Python в большинстве случаев, либо с JavaScript.
Для себя я сейчас изучаю параллельно Python и C++. Возможно это выглядит несколько странным, но это так :)
Это должен быть scratch
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
t3ran13, xroni, damm, chiliec, gildar, mir, dreamer, vasyl73, tristamoff, forbon21, chika25, romapush, gromozeka, karusel1, sharps, zivchakh, asuleymanov, maxiandr, on1x, sva-lana, borisss, lenutsa, kondratij, myhardmoney, hellen-g, nerengot, lokkie, bag, vealis, student61, mirumir, abloud, wedge, ksantoprotein, chugoi, nerossoul, ajita, gbot
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
@wealthycat Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за Количество комментариев
Награда за Количество полученных комментариев
Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
почти что каждую осень, желая порепетиторствовать, ищу какой бы язык выбрать, так как Винды в моё время ещё не было....печаль...
Вот только в JS очень
коряваясвоеобразная модель ООП и при переходе на более традиционные языки эту парадигму придется изучать с нуляСкажем так, была корявая.
Сейчас с этим получше - http://learn.javascript.ru/es-class. Нюансы, конечно, есть, как и везде, но насчет "изучать с нуля" - это пожалуй уже не правда.
Собираюсь как-нибудь тряхнуть стариной, начать учить JS и что-нибудь изваять на нем. Заодно и проверю на себе, насколько это легко )
Сейчас уже вполне нормально :) Я начинал в 2008 году, было тяжелее, народ с меня ржал - как это js после дотнета :)
Вот посоветую - http://learn.javascript.ru/, если еще не видели.
У меня была похожая история. Когда в начале 2х тысячных я делал "безбраузерное" приложение на js после паскаля, тоже косо смотрели, не смотря на то, что даже ms видела перспективу в этом языке, рекламируя всякие hta приложения. Я за JS в качестве первого языка.
Спасибо! Ушел смотреть!
как вы думаете, юристу 37 лет от роду доступно обучение программированию?))
Вполне! Особенно, есть интерес этим заниматься. Возраст вообще значения не имеет, может быть будет идти чуть медленней, да и то не факт. В общем, если есть желание, то думаю стоит попробовать.
видать, пора))