Использование языка программирования Python в качестве базового при обучении специалистов
Язык программирования Python обладает рядом уникальных или просто полезных достоинств, позволяющих использовать его в качестве базового ЯП при обучении специалистов весьма широкого диапазона — от профессиональных программистов и инженеров до научных работников в области естественных и гуманитарных наук. Достоинства эти отчасти вполне объективного, а отчасти и весьма субъективного толка. Как следствие, наш обзор не будет претендовать на сугубую объективность, опираясь, с одной стороны на личный опыт преподавания в различной аудитории, а с другой — на знания о возможностях самого языка. Цель обзора — показать поразительную универсальность среды Python в качестве возможной базы для программистской части ИТ-образования. Не является рекламой. Имеются противопоказания, проконсультируйтесь со специалистом.
Общие слова
Python до сих пор принято считать «молодым» языком программирования, хотя он слегка старше Java (официальный «год рождения» — 1989). Дело в том, что Python — очень динамично развивающийся язык, в котором непрерывно идёт процесс обновления и расширения как самого ЯП, так и инструментальной среды, входящей в стандартную поставку1.
Это, кстати, сразу обращает наше внимание на первые три достоинства Python в качестве именно языка обучения.
(1) Всегда впереди. Во-первых, разработчики стараются удержаться на «переднем крае науки», видоизменять язык в соответствие с новшествами в области программирования (разумеется, дозированно и после тщательного обсуждения)2. Следовательно, в какой-то мере решён вопрос «устаревания инструмента», довольно остро стоящий в отношении, например, учебных программ, основанных на ЯП Pascal. Правда, возникает вопрос устаревания самой учебной программы… Впрочем, если по какой-то причине изменения программы надо подтормозить, в нынешней ситуации можно остановиться на Python2, развитие которого заморожено в пользу Python3.
(2) Батарейки внутри. Во-вторых, Python — это не только язык программирования, но и довольно полная инструментальная среда общего назначения, насчитывающая более полутора сотен модулей на все случаи жизни (связь с ОС, шаблоны и алгоритмы программирования, эффективные и сложные типы данных, работа с различными форматами данных, сеть, вычислительная математика и т. д.)3. Список не входящих в поставку, но зарегистрированных на сайте «Python Package Index» и доступных к использованию модулей в полтораста раз больше4. Это позволяет расширить круг учебных задач за счёт предметных областей, затрагиваемых в модулях, и не привлекать при этом сторонние, не совместимые с базовым, инструментарии.
(3) С ним не пропадёшь. В-третьих, Python — очень востребованный язык программирования. Некоторые организации (RedHat5, NASA6. Google7) прямо заявляют, что ведут разработку или часть разработки на Python, а количество написанного на Python прикладного программного обеспечения любой сложности вообще вряд ли поддаётся исчислению. Стало быть, на одном только Python ученик без куска хлеба не останется. Хотя о том, чтобы был не один только Python, да и масло на хлебе, стоит тоже позаботиться.
Python как первый язык программирования
Гвидо ван Россум, автор языка программирования и «бессменный великодушный диктатор» сообщества Python, в своём «Пособии к Python» замечает, что пособие это — для тех, кто уже умеет программировать8. В самом деле, изложение в нём плотное, с постоянной отсылкой на различные программистские реалии. Но структура «Пособия» довольно прозрачно намекает на то, каким может быть вариант учебной программы «с нуля».
(4) Плавно въезжать. Пользуясь тем, что Python — это интерпретатор со встроенной системой помощи, «Пособие» предлагает неожиданно традиционалистский подход к обучению программированию. Поначалу можно использовать Python как калькулятор всевозможных математических (а также и строковых) выражений. При решении, скажем, квадратного уравнения естественно возникает вопрос о промежуточном хранении вычисленных объектов — так возникает идея имён (переменных в строгом смысле в языке нет), а заодно возникает идея условного выполнения действий. Сами объекты обладают массой полезных свойства — методами. Полезную последовательность действий можно записать в функцию. Для прохода по последовательностям предусмотрены циклы… Клубочек можно ещё глубоко разматывать, добраться до исключений, классов, множественного наследования, функциональных элементов и многого другого. Не забыть только научиться записывать программу в файл.
(5) Легко читать. Из опыта работы со школьниками (и не только) известно, что для эффективности обучения очень важно соблюсти баланс между размером контекста и его плотностью. Говоря проще, реализация алгоритма должна умещаться на одном экране, но всё, что на этом экране находится, должно быть — при известном умственном усилии — понятно до конца. Одну и ту же программу на Python можно написать и «под Pascal» (длинно), и «под Lisp» (в две-три немыслимые строки), и «под Python» (с использованием подходящих высокоуровневых конструкций и модулей). Отсутствие описаний и операторных скобок, множественное присваивание, выражения-конструкторы, лаконичные составные типы данных и операции над ними и многое другое позволяют писать программы коротко, но разборчиво9. И — да, отступы как обязательный элемент синтаксиса здесь тоже к месту.
(6) Понятно даже психологу. Не менее успешен был опыт «блиц-обучения» нескольких студентов факультета Психологии МГУ — не с целью подготовки программистов, а с целью дать в руки инструмент, достаточный для ввода-вывода и обработки данных. Здесь помогает то, что для многих простых подзадач в Python имеется готовая реализация в виде конструкции ЯП или модуля. Так, подавляющее большинство структур экспериментальных данных вписываются в питоновские списки или словари, интерфейс организуется из готовых интерфейсных блоков, а собственно анализ данных программировать и не надо, для этого есть специализированные инструменты. Кроссплатформенность инструментальной среды освобождает человека-непрограммиста от необходимости осваивать их несколько.
В «удобстве» Python кроется часто обсуждаемый недостаток. Считают, что, изучив «удобный» Python, человек не захочет переходить на «неудобный» низкоуровневый Си или многословный Java. Вот так же и автора этих строк учили сначала программировать на Фортране, а затем уже — на Си именно из соображений «не захочет потом Фортран учить, а надо».
Python как «продвинутый» язык программирования
Сказанное выше не означает, что Python остаётся в первую очередь учебным языком программирования, каким задумывался его прототип — язык ABC — более двадцати лет назад. Напротив, по истечении периода становления, язык быстро набрал популярность и в области высокотехнологичного, и в области промышленного программирования.
(7) Сахар и сливки. Первое, чем завлекает Python опытного программиста — это обилие «синтаксического сахара» и вообще всяческих конструкций, сводящих синтаксический шум к минимуму и повышающих плотность программного текста. Большую роль играет и принцип «сведения к простому»: например, в Python нет отдельной перегрузки операций, потому что операции — это и есть соответствующие методы объекта. Ещё более показательный пример — использование «утиной типизации» (суть которой в следующем: если для работы с уткой используется всего два метода — .крякать() и .плавать(), то любой объект с такими методами — это утка, независимо от того, что ещё может объект (например, .летать() или .тарахтеть()). Отдельное удовольствие доставляют доведённые до логического завершения идеи языка Си о неполном вычислении и интерпретации логических выражений10.
(8) Мультипарадигмальность. Традиционный императивный язык программирования (как, собственно, и любой другой) не может претендовать на полный охват различных парадигм программирования в рамках единого синтаксиса. К тому же философия Python требует, чтобы всякое расширение процедурной по сути парадигмы Python естественно следовало из имеющихся возможностей языка. Это не мешает «выводить» из свойств объектов весьма современную и гибкую объектную модель (см. п. (4)). Не менее естественно выглядят элементы функционального программирования11, особенно в сочетании со списками, генераторами, функционалами и прочими стандартными средствами языка. Декларативная парадигма подразумевает несколько иную организацию данных и диалога с пользователем, и здесь на помощь приходит Python-интерпретатор командной строки. Реализация логического программирования упаковывается при этом в модуль, а диалог ведётся стандартными средствами (таких модулей в сети немало, но нам не доводилось анализировать их на предмет пригодности для учебного процесса). Наконец, событийное программирование явной поддержки в языке не имеет, зато, в силу специфики области применения (моделирование систем, сеть, GUI), представлено весьма мощными и многочисленными модулями в традиционном стиле «объекты + обратные вызовы + главный цикл + параллельность» с упором на эту самую специфику.
Нелишне заметить: когда учебная программа требует глубокого знакомства с парадигмами программирования и располагает соответствующим временем в сетке, разумнее изучать различные среды программирования, ориентированные на ту или иную парадигму. Но и здесь современное пространство языков программирования предлагает известную свободу манёвра. Например, весьма примечательным представляется функциональный язык программирования Pure (многими полезными свойствами он похож на Python).
(9) По-взрослому. Будучи не только языком, но и средой программирования, Python обладает всеми признаками инструмента разработки сложных систем. Многоуровневая модульность, динамическое документирование кода (это когда строка документации является частью объекта), поддержка модульного тестирования и технического документирования (как обычно, сразу несколькими модулями), собственная система пакетирования и развёртывания программных компонентов — всё это позволяет использовать Python в качестве базы для изучения синтетических дисциплин, наподобие технологии программирования, систем быстрого проектирования приложений, организации совместной разработки и т. п. Если область интересов ограничивается только технологическими вопросами, Python тоже вполне привлекателен, ибо обеспечен полной поддержкой систем индустриального программирования (как со стороны IDE Eclipse, NetBeans и Visual Studio, так и со стороны виртуальных машин Java и .Net). Система документирования исходного кода Sphinx, написанная на Python, оказалась настолько удобной, что теперь с её помощью создаётся штатная документация и к самому Python, и к многим проектам, на нём основанным, и к множеству других проектов, не имеющих к нему отношения12.
Прикладные свойства
Рискнём повториться: универсальность и модульная структура среды Python делает её орудием не только програмиста, но и вообще всякого, в чью деятельность программирование входит только как один из инструментов решения прикладных задач. Причём задачи могут быть очень разной ширины и глубины: математика, естественные науки, моделирование процессов; и от поверхностного введения в область до профессионального инструмента.
(10) В игрушечки играете? Наглядность языка позволяет нещадно эксплуатировать его в режиме «напиши-используй-выбрось», так как появляющиеся при этом сценарии-однодневки выходят короткими и создаются со скоростью написания исходного кода практически без отладки. Самое частое применение — поспрашивать пользователя о входных данных, ввести их из какого-нибудь файла, пожевать, переварить и выплюнуть в какой-нибудь другой файл. В *NIX-стилистике для этого существует командная оболочка (ввод-вывод — текст и командная строка, обработка данных — POSIX-утилиты в составе операционной системы), однако по нынешним временам это часто неудобно (как субъективно, с непривычки, так и объективно, из-за отсутствия нужных утилит и необходимости зрительного поиска). В кроссплатформенной python-стилистике — это несколько диалоговых окон (с полдюжины строк кода на каждое, включая сюда диалог выбора файла) или чуть более сложных форм плюс передача данных на обработку прикладному модулю (в том числе и операционной системе). Другой пример: опытный преподаватель не желает отказываться в учебном процессе от использования Turbo Pascal или даже Quick Basic, потому что в них «есть учебная графика» (SCREEN 13 и CIRCLE (20, 25), 5, 1, помните?). Важно чтобы первые написанные учеником программы делали что-нибудь ощутимое. Но вот программа, рисующая окружность на Java, вряд ли пройдёт в качестве первой. Между тем, для Python имеется некоторое количество графических модулей, от простейшей «черепашьей» графики (модуль turtle) до весьма многоплановой мультимедийной подсистемы PyGame (фактически повторяющей возможности специализированной библиотеки SDL)13. PyGame оказалась куда лучшей приманкой, чем старая добрая BGI-графика: как же! написать свою игру за пару дней! А ведь под это подтягиваются вполне серьёзные приёмы программирования: обработка событий, таймеры, использование производных классов…
(11) Академический код… Отдельное внимание хочется уделить большим научным пакетам, использующим Python для обработки данных, а то и просто написанным на нём. Например, проект SciPy14 включает в себя модуль NumPy — эффективную реализацию многомерных массивов, и инструментарий к ним, а на базе NumPy реализует целое множество научных математических инструментов. Эдакий Matlab на Питоне. Главное достоинство таких проектов — научное и программистское сообщество, в котором становится нормой оформлять соответствующие результаты научной деятельности в виде программного модуля, публикуемого на специальном портале15. Сам модуль может быть примером использования SciPy, а может предоставлять и интерфейс к другим мощным инструментариям (например, к статпакету R). Введение таких инструментариев в учебную программу позволяет перекинуть довольно надёжный мостик между чистой теорией того или иного раздела математики и зубодробительными методами её программной реализации. Кроме того, опыт пакетирования различных наукоёмких программных продуктов под Linux показывает, что т. н. «академический код» на Python выглядит куда менее ужасно, чем таковой же на C или Java. «Академический код» — это исходный код программы, написанной учёным, а не то — его аспирантами, обычно для подтверждения теории или реализации некоторых её положений; нередко, увы, являет собой образец довольно низкой культуры программирования. Как следствие, аналогов такая программа обычно не имеет, и, хочешь-не хочешь, приходится регулярно с академическим кодом возиться.
(12) …и все-все-все. Сказанное о SciPy и математике относится вообще к любой деятельности, требующей обучения с практической реализацией в виде программного продукта. Собственно, вокруг всякого популярного языка программирования достаточно быстро образуется обширная прослойка прикладных библиотек и систем, и ими можно вполне успешно пользоваться в учебных целях. С другой стороны, для популярных прикладных областей часто существует некий набор уже готовых пакетов прикладных программ, и их тоже можно с немалым успехом в тех же целях использовать. Но если наша цель — формирование восприятия области профессионального знания, понимания принципов работы профессионального инструментария, и — главное — умения этот инструментарий достраивать для решения собственных задач, то без упомянутого «мостика», позволяющего самостоятельно подходить к вопросам реализации теории, обойтись сложно. И здесь количество — наглядность и компактность кода вкупе с быстротой освоения языка и разнообразием прикладных модулей — переходит в качество: удаётся втиснуть в сетку занятий не только формулы и названия ручек, за которые надо дёргать для их вычисления, но и сам процесс организации этих вычислений. Думается, эффект от такого перехода будет напоминать эффект от изобретения языка Фортран, хотя и отнюдь, отнюдь не столь революционный. В естественных науках появляется возможность не только собирать и обрабатывать экспериментальные данные, но и публиковать окружение для воспроизведения эксперимента. В областях, ориентированных на информационные технологии — возможность анализа и сравнения.
Сложим кубики
Если немного продлить оптимистический пафос предыдущего параграфа, начинает выстраиваться довольно гармоничная картина.
- Почти вне связи с содержательной стороной обучения (лишь бы требовалось программирование в нескольких различных контекстах) язык программирования Python выбирается в качестве базового. Это «язык, который знаются все, хотя бы теоретически». Обоснование: когда-то для этой цели применялся Алгол, затем настало время священной войны «сишников и паскалистов», современные же кандидаты — Java и C++ — в наглядности, но нашему мнению, Python проигрывают.
- Основные программистские дисциплины — и в расчёте на собственно программистов, и для неспециалистов — ведутся также на Python, ибо он для этого дела ничуть не хуже других языков, а по нашему мнению — так и лучше.
- Углублённое изучение как программирования, так и сопутствующих ему практик (технология программирования, совместная разработка и т. п.) практически полностью покрывается Python. Исключение — глубокое изучение различных парадигм программирования профессиональными информатиками.
- Изучение программирования в приложении к актуальным предметным областям тоже с высокой вероятностью может быть поддержано Python и пакетами к нему. Исключение — обязательное изучение какого-то инструмента, уникального для данной предметной области.
- …
- Профит!
P.S.
Убедительный пример эффективности подхода «единой базовой среды» — работы Е. Р. Алексеева с применением математического пакета и языка программирования SciLab16.
Не менее убедительный пример доверия Python роли базового ЯП — переход большинства образовательных траекторий MIT с Lisp на Python17
Свободное лицензирование самого Python и подавляющего большинства связанных с ним проектов обеспечивают лицензионно-правовую прозрачность материалов и разработок и известную свободу выбора инструментов. С другой стороны, оно сильно понижает коррупционную составляющую всего процесса.
Всё вышеизложенное имеет смысл только при условии, что ВУЗ отказывается от практики эндорсмента программных продуктов, т. е. от повсеместного внедрения в учебный процесс курсов и методматериалов, в неизменном виде получаемых от разработчика ПО, и возвращается к традиционной академической практике самостоятельной разработки учебных программ и адаптации к ним программных продуктов.
См. слайды у докладу (1)
http://www.redhat.com/magazine/012oct05/features/python/ (5)
http://google-styleguide.googlecode.com/svn/trunk/pyguide.html (7)
http://docs.python.org/3/reference/expressions.html#boolean-operations (10)
Алексеев Е. Р., Чеснокова О. В., Рудченко Е. А. Решение инженерных и математических задач в пакете Scilab. — М.: ALT Linux, 2008. — 257 с. (16)
Например, этой: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/ (17)