Thursday, January 20, 2011

На чем учиться программированию?

Статья из моего блога в livejournal.

Недавно меня спросили о книгах по программированию для ребят в возрасте 13-14 лет. Надо сказать, что это вопрос весьма спорный: сколько программистов, столько и мнений. Но я в этой заметке старался учесть опыт лучших университетов мира и довольно скромный — свой.

В свое время я писал о том, что, я считаю, желательно знать профессиональному программисту, но что предложить школьникам я внятно ответить не мог. Единственное, что пришло в тот момент на ум — это SICP — вводный курс для программистов и электронщиков Массачусетского технологического института. Но он имеет один большой недостаток — он рассчитан на студентов, т.е. старший и более целеустремленный контингент. Требовалось что-то типа «Занимательной физики» Перельмана, «Электроника шаг за шагом» Свореня или книг Воронцова-Вельяминова по астрономии. Поэтому я постарался определиться с требованиями к подобной книге:
1)книга должна быть покороче и написана живым языком, желательно на на русском;
2)в книге должен быть описан, по возможности, простой практичный язык, что бы как можно скорее они сделали свое первое окошко, в котором бы делалось что-то интересное;
3)язык должен содержать какую-никакую среду разработки, чтобы «не отходя от кассы» попробовать: никто не будет, в момент первоначального знакомства «затачивать» инструменты под себя;
4)полученные знания должны быть практичными или, для начала, просто впечатляющими. Например, помочь при подготовке курсовой или домашнего задания, начертить графики по математике/физике и т.д.
5)материалы — как учебные, так и сами инструменты, с помощью которых должно происходить программирование, должны быть свободно доступны и просто работать.
Оговорюсь сразу, что варианта, удовлетворяющего всех по пунктам я не нашел, но тем не менее хорошие варианты нашлись.
Книги
Во-первых — это SICP (Структура и интерпретация компьютерных программ). Состоит из книги и видеоуроков [перевод книги, субтитры]. На данный момент на русский переведена сама книга и сделаны русские субтитры к первым 3-м сериям.О SICP можно говорить много хорошего, но я ограничусь только тем, что это один из лучших учебников по программированию от одного из лучших университетов мира Massachusetts Institute of Technology (MIT). Надо сказать, что этот курс читается и в других знаменитых университетах — Oxford, Berkley, CMU. Несмотря на сложность (курс рассчитан на ни разу не программировавших людей, однако по ходу учебы им придется создать ни много ни мало язык программирования!), как минимум, первую главу, пусть не полностью, они уже смогут освоить. А она даст почувствовать вкус к программированию.
Я не удержусь от цитирования:
Мы собираемся изучать понятие вычислительного процесса (computational process). Вычислительные процессы — это абстрактные существа, которые живут в компьютерах. Развиваясь, процессы манипулируют абстракциями другого типа, которые называются данными. Эволюция процесса направляется набором правил, называемым программой. В сущности, мы заколдовываем духов компьютера с помощью своих чар. Вычислительные процессы и вправду вполне соответствуют представлениям колдуна о духах. Их нельзя увидеть или потрогать. Они вообще сделаны не из вещества. В то же время они совершенно реальны. Они могут выполнять умственную работу, могут отвечать на вопросы. Они способны воздействовать на внешний мир, оплачивая счета в банке или управляя рукой робота на заводе. Программы, которыми мы пользуемся для заклинания процессов, похожи на чары колдуна. Они тщательно составляются из символических выражений на сложных и немногим известных языках программирования, описывающих задачи, которые мы хотим поручить процессам.
На исправно работающем компьютере вычислительный процесс выполняет программы точно и безошибочно. Таким образом, подобно ученику чародея, программисты-новички должны научиться понимать и предсказывать последствия своих заклинаний. Даже мелкие ошибки, могут привести к сложным и непредсказуемым последствиям
.
Второй книгой, неожиданно меня порадовавшей, оказался учебник по «C# для школьников» от Microsoft . Она специально писалась для детей и получилась, как по мне, очень хорошей. Там нет занудства школьных учебников и заумности некоторых профессиональных книг, многое объясняется «на пальцах». Кроме того книга очень компактная — в ней всего 128 страниц с кучей картинок. Существенных минусов там 2 — многословность C# и то, что придется качать .Net и Visual Studio Express. Тем не менее это компенсируется тем, что это популярный и хороший язык.
Третья книга — это книга А. Чаплыгина «Учимся программировать вместе с Питоном», написанная по мотивам книги «How to Think Like a Computer Scientist. Learning with Python». Ранее книга лежала в открытом доступе, но теперь этого сайта нет и по сети бродит последняя, 226-я, редакция книги. Книга предназначена для старшеклассников, тоже является, как по мне, нормальным введением в программирование. Недостатком книги является то, что она не дописана (правда то, что не дописано, существенным не является, главное — объяснены основы), и что все же лучше читать оригинал.
Журналы
В журнале Linux Format, который можно бесплатно скачать отсюда, есть учебные материалы по C# (номера 87-99), Python (номера 74-84) и Java (номера 84-99). Введение в эти языки сделано (примерно как в книге «C# для школьников») на примерах каких-то полезных программ в максимально живом изложении.
Кроме учебников в журнале можно найти много сведений о куче полезных и интересных программ, а также о операционной системе Linux, вполне популярной в профессиональной и корпоративной среде, но малораспространенной среди домашних пользователей. Знакомство с этой системой и ее идеологией крайне полезно для профессионального программиста.
Инструментарий.
Инструментарий состоит из двух основных компонент — языка программирования и редактора, в котором надо набирать текст программ. В поставку Windows не входит ни то, ни другое. В Linux ситуация гораздо лучше — многое там есть прямо в поставке, а остальное доставляется из списка доступных приложений в 1 клик мыши. Здесь я дам краткую характеристику языка программирования и инструментов для него:
Python — язык применяется очень широкого — начиная от мелкой рутинной автоматизации до научных вычислений и нагруженных сайтов. Отличительными особенностями являются компактный синтаксис (как правило программа на Python короче аналогичной программы на С++, Java или C# в 2-3 раза) и относительная простота базовых принципов. Благодаря этому упомянутый выше MIT использует его для обучения, например на факультете робототехники (курс 6.01). Кстати, там же можно скачать курс лекций по курсу (на английском языке), в котором излагается Python, а список рассматриваемых вопросов вызывает сожаление, что такого не было, когда я учился.
На данный момент лучше всего качать версию 2.7. Вместе с Python поставляется и простенькая среда для разработки IDLE. Для того, чтобы начать работать рекомендуется выбрать File/New Window откроется окно, в котором набирается текст, сохраняется (в диалоге сохранения при вводе файла надо обязательно указать расширение py, сама IDLE этого делать не умеет) и запустить программу клавишей F5. В дальнейшем, после внесенных изменений в код обязательно сохраниться и только потом запускать программу.
Scheme — один из представителей семейства языков Lisp. Используется в курсе SICP. Сам язык очень прост: нем почти отсутствует синтаксис и мало базовых понятий. Поэтому он идеален для обучения. В промышленности его используют мало, а жаль. Впрочем, в предисловии к SICP даны очень впечатляющие примеры его использования.
Реализаций языка — множество. Из них я рекомендую Racket — это технически очень хорошая реализация, включающая среду разработки DrRacket. Аналогично IDLE, создаем новый файл, сохраняем (но вручную указывать расширение не надо) и запускаем.
C# — популярный промышленный язык Microsoft. При проектировании был списан с Java и во многом остался похожим на него и по сей день. Такой же большой, тяжелый и многословный. Тем не менее в указанных учебниках он подан довольно легко. Под Windows надо скачать сам .Net, а потом среду разработки Visual Studio или SharpDeveloper. Но тут есть нюансы: если .Net 4 отказался ставиться (ему надо минимум Windows XP Service Pack 3), то надо качать .Net 3.5 и ставить SharpDeveloper. В случае Linux только поставить MonoDeveloper из «Центра установки приложений». Скачать Sharp Developer можно тут, а по ссылкам качается .Net.
Кроме того, .Net довольно тяжелая и медленная штука — на слабой машине будет долго компилироваться и запускаться и требует минимум Windows XP. Этих недостатков лишены Python и Scheme.
В принципе, лучше поставить .Net 3.5 и поставить Visual Studio Express или SharpDeveloper. Или, как вариант, скачать LiveCD с MonoDeveloper-ом, заодно и посмотрите на один из лучших дистрибутивов Linux. Он не нуждается в установке, а просто грузится с CD или DVD (для этого надо не забыть установить загрузку с CD в BIOS вашего компьютера). Только учтите, что результаты работы в этом случае надо сохранять на флешку или подключать жесткий диск.
Что выбрать?
Я специально дал несколько вариантов, какой из них будет наиболее целесообразным выбором — зависит от ситуации на компьютере школьника. Я бы рекомендовал прочитать введения всех 3-х книг и решить, что больше по душе.
Что бы я не советовал.

Это, наверное, самый спорный раздел, так как любителей этих языков хватает, но все-таки я считаю, что начинать обучение программированию не следует с:
C или, еще хуже, с C++. Как вторые языки они вполне хороши, но для первых лучше не использовать, несмотря на то, что есть книги, где их позиционируют, как первые языки. C достаточно специализированный инструмент, но имеет много нюансов позволяющих «прострелить себе ногу». С++, унаследовав все недостатки C, добавил еще и своих и представляет из себя один из самых монстрообразных языков программирования на сегодняшний день.
Pascal-я. Несмотря на то, что его широко используют для обучению программированию, особенно на просторах СНГ, несмотря на то, что по нему масса учебной литературы, у него есть большая проблема с реализациями. В обучении используется древний, как говно мамонта, Borland Pascal, который никто, кроме школ, не использует. Использовать можно живые реализации: Delphi и FreePascal. Но неокрепшим мозгам лучше с них не начинать — Delphi прививает плохую практику программирования, сам через это прошел, а FreePascal без Delphi-подобной оболочки Lazarus использовать с самого начала будет напряжно. Хотя против самого Pascal-я я ничего против не имею: он и создавался для обучения. Но использование самых популярных его реализаций, на этапе первого знакомства, я считаю на данный момент неоправданным.
Basic. О тех, которые начали с Бейсика сказано: «Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации»
Несколько полезных ссылок:
http://python.su/ - ресурс python-программистов.
http://lisp.ru/ - ресурс lisp-программистов. Надо сказать народ на этих форумах дружелюбный и не жадный на советы и знания.
http://forum.vingrad.ru/forum/act-idx.ht
ml — форум по разным языкам, включая все тут упомянутые.