Предисловие Джеффри Элкнера

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

Мы думаем, что эта книга — доказательство преимуществ и больших перспектив такого сотрудничества, основание которому заложено Ричардом Столлменом (Richard Stallman) и Фондом свободного программного обеспечения (Free Software Foundation).

Как и почему я пришел к использованию Python

В 1999 году впервые экзамен по информатике (Computer Science) в старших школах США был проведен с использованием языка C++. Как и во многих старших школах по всей стране, решение об изменении языка программирования оказало прямое влияние на учебный курс в йорктаунской старшей школе в Арлингтоне, Вирджиния, для я преподаю. До этого момента языком программирования, на котором велось обучение на первом году и продолжалось на втором, был язык Pascal. Придерживаясь сложившейся практики в течение двух лет давать ученикам один и тот же язык программирования, мы в 1997-98 учебном году перешли на преподавание C++ (так, чтобы ученики смогли сдать экзамен на C++ в 1999).

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

Мне нужен был язык, который можно было использовать на компьютерах с Linux в нашей лаборатории, а также и на платформах Windows и Macintosh, которые были дома у большинства учеников. Я хотел, чтобы это был бесплатно распространяемый язык, чтобы все ученики смогли использовать его дома, независимо от дохода их семей. Мне нужен был язык, которым пользуются профессиональные программисты, и вокруг которого сформировалось активное сообщество разработчиков. И, что наиболее важно, этот язык должен быть легким в изучении и преподавании. Когда я рассмотрел имеющиеся варианты в свете моих соображений, лучшим кандидатом оказался Python.

Я попросил одного из талантливых учеников нашей школы, Мэта Аренса, попробовать Python в деле. За два месяца он не только освоил язык, но и написал приложение pyTicket, которое позволило персоналу школы сообщать о технических проблемах через Интернет. Я знал, что Мэт не смог бы в такой короткий срок написать подобное приложение на C++, и это достижение, вместе с положительным отзывом Мэта, подтвердило, что Python — именно то, что я искал.

В поисках учебника

Решив в следующем учебном году использовать Python в двух моих курсах по введению в программирование, я столкнулся с проблемой отсутствия доступного учебника.

Мне пришла на помощь свободно распространяемая документация. В том же году, несколько раньше, Ричард Столлмен представил меня Аллену Дауни. Мы оба, Аллен и я, написали Ричарду письма, в которых проявили интерес к разработке свободно распространяемых учебных материалов. Аллен к тому времени уже написал учебник для первого года обучения программированию, “Мыслить как программист”. Как только я прочел эту книгу, я немедленно понял, что хочу использовать ее в моем учебном курсе. Это был в высшей степени ясный и полезный текст о программировании. Он подчеркивал мыслительные процессы, задействованные в программировании, а не свойства конкретного языка программирования. Чтение этого учебника сразу же сделало меня лучшим учителем, чем я был до знакомства с ним.

Книга “Мыслить как программист” была не просто отлично написана; она была выпущена на условиях публичной лицензии GNU (GNU public license), что позволяло пользоваться ей бесплатно, и, при необходимости, вносить в нее любые изменения. Поскольку я решил использовать Python, мне пришло в голову, что я мог бы “перевести” книгу Аллена, использующую язык программирования Java, на другой язык программирования. Я не смог бы написать собственный учебник с нуля, но, взяв книгу Аллена за основу, я мог бы справиться с созданием учебника. Это также продемонстрировало бы, что модель совместной разработки, эффективно работающая в области программного обеспечения, может работать и в области создания учебных материалов.

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

Что касается второй половины книги, где речь идет об объектно-ориентированном программировании, то я знал, что нужен кто-то с большим практическим опытом программирования, нежели был у меня, чтобы справиться с этой задачей. Книга оставалась в незавершенном состоянии большую часть учебного года, до тех пор, пока сообщество открытого кода (open source community) не предоставило возможность для ее завершения.

Я получил письмо от Криса Мейерса (Chris Meyers), в котором он выразил интерес к книге. Крис — профессиональный программист, начавший преподавать курс программирования на базе языка Python в общественном колледже Лейн (Lane Community College) в Юджине, Орегон. Преподавание привело Криса к этой книге, и он сразу же начал помогать в работе над ней. К концу учебного года он создал на нашем сайте http://openbookproject.net сопутствующий проект *Python for Fun* и работал с несколькими из моих лучших учеников как наставник, руководя ими в тех областях, где я не мог оказать им поддержку.

Введение в программирование с помощью Python

Работа над книгой “Мыслить как программист” и ее использование в течение двух лет в качестве учебника подтвердили, что Python является отличным языком для обучения программированию. Python существенно упрощает примеры программ и позволяет лучше доносить важнейшие понятия программирования.

Первый же пример из книги иллюстрирует это. Это традиционная программа Hello World, которая в версии книги, использующей C++, выглядит так:

#include

void main()
{
   cout << "Hello, world." << endl;
}

Версия на Python выглядит так:

print "Hello, World!"

Хотя это и несерьезный пример, преимущества Python явно видны. Курс программирования в йорктаунской старшей школе, который я веду, не требует никаких предварительных знаний, так что большинство студентов, встречающих этот пример, видят первую программу в своей жизни. Некоторые из них, без сомнения, слегка напряжены, так как слышали, что изучение программирования – дело непростое. Версия на C++ всегда заставляла меня выбирать из двух зол: либо объяснять значение #include, void main(), { и }, рискуя запутать или напугать часть учеников с самого начала, либо сказать им “Пока не обращайте внимания на все эти вещи; мы поговорим об этом позже.” — и добиться того же эффекта. Цель обучения на данном этапе состоит в том, чтобы познакомить учеников с предложением языка программирования и дать им написать свою первую программу, попутно дав им понятие о среде программирования. В программе на Python есть все, что для этого необходимо, и нет ничего лишнего.

Сравнивая пояснительный текст к программе Hello World в разных версиях книги (использующих языки C++ и Python) можно еще раз осознать, что это значит для начинающего обучение. Программа на C++ объясняется тринадцатью абзацами текста, тогда как программа на Python — только двумя. И, что более важно, недостающие одиннадцать абзацев не содержат важных идей программирования, а имеют дело только с синтаксисом языка C++. И подобное происходит на протяжении всей книги. Целые абзацы исчезают в Python-версии книги благодаря тому, что ясный синтаксис Python делает их ненужными.

Использование языка очень высокого уровня, такого, как Python, позволяет преподавателю отложить обсуждение низкоуровневых вопросов, связанных с устройством компьютера, до тех пор, пока ученик не приобретет знания и опыт, необходимый для лучшего понимания таких вопросов. Таким образом, Python дает возможность вначале говорить о наиболее важных вещах. Один из лучших примеров этого - работа Python с переменными. В C++ переменная — это имя места, где хранится некое значение. Переменные должны быть объявлены вместе с их типом, поскольку размер места, которому они дают имя, должен быть определен заранее. Так понятие переменной оказывается связано с устройством конкретного компьютера. Понятие переменной и без того сложно для восприятия начинающими обучение (и в компьютерной науке, и в алгебре). Байты и адреса не помогают понять его лучше. В Python переменная — это имя для значения. Такую переменную интуитивно легче воспринять и это лучше согласуется с тем, что ученикам известно из курса математики. В этом году мне было гораздо проще, чем раньше, объяснять ученикам понятие переменной, и потребовалось меньше времени на помощь тем из них, у кого возникли вопросы в связи с этой темой.

Другой пример того, как Python помогает в преподавании и изучении программирования — его синтаксис для работы с функциями. У моих учеников всегда возникали сложности с пониманием функций. В основном, проблемы были связаны с разницей между определением функции и ее вызовом, а также между параметрами и аргументами. Здесь приходит на помощь синтаксис Python. Определения функций начинаются с ключевого слова def, так что я просто говорю студентам: “Когда вы определяете (англ.: define) функцию, начните с def и имени функции, которую вы определяете, а когда вызываете — просто назовите (напечатайте) имя функции.” Параметры идут вместе с определением, а аргументы — вместе с вызовом. Не требуется определять типы возвращаемых значений, типы параметров, параметры, передаваемые по ссылке или по значению; вот почему я теперь могу обучить работе с функциями за половину того времени, что мне требовалось раньше, и с лучшими результатами.

Использование Python повысило эффективность нашего учебного курса по информатике для всех учеников. Я вижу более высокий общий уровень успеваемости и меньше разочарований от неудач, чем я наблюдал в течение двух лет преподавания C++. Мы с учениками движемся быстрее и с лучшими результатами. Все больше учащихся завершают курс, приобретя навыки создания полезных программ и положительное отношение к программированию вообще.

Создание сообщества

Я получил письма со всего мира от людей, использующих эту книгу для изучения или преподавания программирования. Сообщество пользователей начало увеличиваться, и многие люди вносят свой вклад в проект, присылая материалы для веб-сайта http://openbookproject.net/pybiblio.

С продолжением развития и ростом популярности Python, я ожидаю, что рост сообщества пользователей книги будет продолжаться и ускоряться. Возникновение этого сообщества и те возможности, которые оно открывает для сотрудничества между работниками образования, для меня является самой впечатляющей частью работы над этим проектом. Работая вместе, мы можем улучшить качество материалов, доступных для всех нас, и сэкономить много времени. Я приглашаю вас присоединяться к нашему сообществу и надеюсь получить письма от вас. Пишите мне, пожалуйста, на адрес jeff@elkner.net.

Джеффри Элкнер
Governor’s Career and Technical Academy in Arlington
Арлингтон, Вирджиния