Александр Суханов

Московская государственная Пятьдесят седьмая школа известна как "инкубатор выдающихся математиков" с середины 1970-х гг. Практически все ее выпускники получают высшее образование, что предопределяет особый характер "компьютерной науки" в школе. Каков он (в зависимости от специализации учащихся) - вы узнаете из нашей статьи.

Наши инструменты
Компьютерные классы в школе № 57 существуют практически с момента зарождения истории персонального компьютера (ПК) в нашей стране. Восьмибитовые БК-0010 и "Ямахи" сменились "Мультитехами" на процессоре i8088 и бездисковыми IBM PS/2. А сейчас мы работаем на машинах с процессором Pentium и Pentium MMX, связанных в локальную сеть с выделенным сервером, работающим под управлением ОС Linux. Кроме этого, у нас есть еще класс довольно-таки стареньких "Макинтошей".
Выход в Интернет осуществляется по выделенной двухпроводной линии со скоростью 64 Кбод. Доступ к ресурсам Интернет возможен со всех рабочих мест двух классов (всего 25 машин); кроме того, у нас установлены серверы служб Интернет (Web-сервер, FTP-сервер и прочее). Конфигурация локальной сети, способ ее связи с Интернет и настройка почтовой системы представляют собой нашу собственную оригинальную разработку, описанную в статье А. Суханова и В. Хименко "Linux и Windows 95: эффективность совместной работы", ("Мир ПК" № 5, 1998, с. 44).
Стоит заметить, что описанная техника -- вовсе не запредельная роскошь. Большая часть компьютеров собрана из запасных частей и деталей собственными силами. Отметим добрым словом Префектуру Центрального округа Москвы, подарившую школе (в числе примерно 30 других) одиннадцать ПК на основе процессора Pentium. Доступ в Интернет осуществляется при финансовой и организационной помощи Института "Открытое Общество" (организация Фонда Дж. Сороса).

Кого мы учим? И чему?
Традиционно компьютеры используются у нас в процессе обучения дисциплине, именуемой в школьной программе "информатикой" (у нас в ряде классов и специализаций она называется "программированием"). В нашей школе можно выделить несколько сравнительно автономных направлений в изучении этой дисциплины:
* Начальная и средняя школа (с 3 по 6-7 класс включительно). Этот, наиболее изолированный от остальных блок, представляет собой экспериментальную площадку для педагогов, ведущих исследования в сфере проектной деятельности учащихся, он зачастую уже отделен от остальных тем, что использует класс "Макинтошей". Описание этой работы выходит за рамки одной статьи, поскольку изложение материала может занять объемистый сборник статей.
* Старшие классы средней школы (8-9), 10 и 11 общеобразовательные классы (эти классы можно считать неспециализированными). В этих классах преподается курс, наиболее близкий к модели государственной программы -- общие знания об информации, методах ее хранения и обработки, навыки пользования ПК и основы программирования. Стоит отметить очень высокий (для неспециализированного класса) уровень программирования в этом блоке. Фактически это достигается за счет предельного сокращения "разговорных" разделов курса информатики (следует добавить, что необходимые познания из области символьной логики и недесятичных систем счисления учащиеся этих классов приобретают на уроках математики) и интенсификации раздела "Деловые приложения ЭВМ" (тут большую пользу приносит богатая практика учащихся – многие преподаватели-предметники приветствуют подготовку домашних заданий, сочинений, рефератов и т. п. на компьютере). В методике преподавания программирования в этих классах имеется своя "изюминка" - язык программирования Лого, дающий очень хорошие результаты на начальной стадии обучения программированию.
* Гуманитарные классы (9-11). Здесь упор делается на деловые приложения ЭВМ, прежде всего – совершенное владение текстовыми процессорами, дается представление об издательском процессе (подготовке рукописи и верстке). Школьники активно используют средства сетевых коммуникаций для общения с носителями иностранных языков, что служит для них отличной практикой. Вместе с тем некоторое (по необходимости ограниченное) внимание уделяется другим аспектам информатики, в том числе и основам программирования (на Лого).
* Математические классы (9-11). На эти классы направлены основные усилия педагогического коллектива, и как следствие - максимальную отдачу мы видим именно в этих классах (подавляющее большинство выпускников этих классов ежегодно поступает в престижные вузы, от МГУ и МФТИ до Гарварда). Курс, предлагаемый в этих классах, называется не информатикой, а программированием, каковым соответственно он и является. Никаких "разговорных" тем, вроде "места ЭВМ в народном хозяйстве", никакой двоичной системы счисления и символьной логики (те, кому надо это отдельно объяснять, явно попали в математический класс по недоразумению), никаких "деловых приложений ЭВМ" -- на это просто нет времени, а необходимые инструменты прекрасно осваиваются в ходе напряженной работы, которой загружен ученик. Зато вместо "основ программирования" - курс, который правильней было бы назвать "теория и практика программирования". О его содержании мы расскажем в отдельном разделе.

Программирование -- слуга математики
Вынесенные в подзаголовок раздела слова означают, что мы не ставим себе целью подготовку профессиональных программистов (знатоков современных языков программирования, библиотек и пакетов) – хотя многие из выпускников ими становятся. Наша цель – развить дисциплину ума, составляющую часть математических способностей, дисциплину, родственную математической логике, а именно навык к описанию алгоритмических процессов.
Другой важный аспект курса состоит в том, что стандартные задачи программирования (представление множеств, сортировки, грамматический разбор текстов на алгоритмических языках) сами по себе являются математическими проблемами, порождая интересные теоремы теории алгоритмов, теории сложности вычислений и теории вероятностей. Их изучение -- необходимая и полезная часть образования математика.
Вместе с тем мы не считаем полезным тратить время наших учеников на освоение таких технических основ программирования, которые все равно устареют к моменту окончания вуза, а также и на подготовку их к олимпиадам по программированию (последние являются довольно точным индикатором навыка, а также запоминания стандартных задач, что полезно для практического программиста -- но мы их, как было сказано, сознательно не готовим).

Программирование: теоремы и задачи
Название этого раздела совпадает с названием книги (автор - А. Шень), которая используется в качестве основного учебника по программированию в наших математических классах, и наиболее точно отражает характер курса. В каком-то смысле для многих наших учеников, приходящих в школу с некоторыми навыками программирования (математические классы формируются по конкурсу из учащихся 7-8 классов московских и подмосковных школ), начальная часть курса становится своего рода "антипрограммированием" -- избавлением от подхода типа "зачем думать, надо писать программу".
Почти весь 9 класс школьники решают задачи, используя три весьма специализированных языка программирования, абсолютно не похожих на то, с чем им приходилось встречаться на страницах самоучителей программирования на Бэйсике.
Первый из них -- язык управления Роботом (исполнителем, перемещающимся по состоящему из клеток полю, разделенному кое-где стенами). Исполнитель может выполнять команды перемещения на одно поле вверх-вниз и в стороны, закрашивать поле и определять, нет ли перед ним стены. Язык программирования содержит полный набор управляющих конструкций (последовательность команд, выбор, цикл "пока"), но не имеет никаких переменных, то есть состояние программы зависит только от положения Робота на поле и выполняемой команды (в другой версии языка Робот "умеет" определять закрашенность клетки, а язык содержит еще одну управляющую конструкцию - рекурсию). Такое простое устройство множества состояний программы позволяет легко сформулировать и освоить ключевое понятие курса - математически строгое (по индукции) доказательство правильности работы программы. Задача считается решенной, если ученик умеет не только заставить программу работать на некоторых входных данных, но и строго формально доказать, что она будет правильно работать на любых входных данных (а это множество даже для Робота бесконечно).
Другой язык, RL, - диалект знаменитого языка исследований в области искусственного интеллекта, LISP. Тут, наоборот, мы имеем дело с очень сложными (определяемыми рекурсивно) списочными структурами данных; в то же время управляющие конструкции очень просты -- выбор и рекурсия (нет ни цикла, ни последовательности команд). И опять никаких переменных.
Наконец, школьники знакомятся с языком описания схем (подобных электрическим), составленных из логических элементов (например, элемент ИЛИ имеет два входа и один выход; на выходе естьнапряжение, если напряжение подано хотя бы на один из входов). Как собрать из таких элементов, например, сумматор (схему, складывающую два двоичных числа)? Язык, на котором решаются эти задачи, вообще не содержит "команд", то есть действий – только отношения. Таким образом ученики осваивают самые различные, предельно не похожие друг на друга языки описания математических моделей.
Отметим, что три описанных языка снабжены трансляторами и средами программирования, разработанными в нашей школе, – ее преподавателями и самими учащимися.
Наконец, школьники уже без особого труда переходят к решению задач, относящихся к традиционной "компьютерной науке": как перечислить все перестановки n чисел (не повторяясь, не тратя лишних машинных действий), как отсортировать множество из n элементов за время порядка n log n (и доказать, что нельзя добиться этого быстрее), как обойти граф, не заблудившись...
После 10 класса традиционно следует "производственная практика". У наших учеников это практика по программированию, то есть решение достаточно сложной и объемной задачи, оформленное в виде письменного отчета о проделанной работе. Именно тогда рождаются многие программы, используемые в дальнейшем в учебном процессе и для других школьных нужд (впрочем, как правило, это только первые версии программ, окончательно ученики их "доводят" в 11 классе). С некоторыми из этих работ (как связанных с практикой, так и нет) мы познакомим вас в следующем разделе.

Полезные ссылки

Официальная страница школы в Интернет: http://www.sch57.msk.ru
Электронная версия статьи А. Суханова и В. Хименко: http://www.osp.ru/pcworld/1998/05/44.htm
Дополнения к этой статье на нашем сервере: http://www.sch57.msk.ru/lansetup
Учебники по программированию, используемые в школе: http://www.sch57.msk.ru/prog.htm
ИПС "Задачи": http://zadachi.mccme.ru

Наши достижения, или практика -- критерий...
Все нижеописанные программы, если не указано иное, разработаны для операционной системы MS-DOS и, как правило, написаны на Паскале.
Рассмотрим для начала совсем простую, почти стандартную работу. Тема - "построение проекций многогранника". Многогранник задается перечнем вершин и ребер, плоскость проекции -- уравнением. Никаких серьезных программистских трудностей в ней нет, математика требует только аккуратности в применении стереометрических соотношений. Тем не менее работа, хотя и не выявляет больших программистских способностей автора, весьма полезна для школы, так как позволяет проводить наглядные демонстрации стереометрических примеров на экране компьютера для учащихся нематематических классов. Разумеется, существуют универсальные математические пакеты, имеющие подобные возможности, но они достаточно громоздки. Кроме того, гораздо приятнее и "патриотичнее" воспользоваться программой, сработанной почти что твоими руками -- во всяком случае, руками однокашника.
Другой пример почти в том же духе (заказ тоже исходил от преподавателей математики, работающих в гуманитарных и общеобразовательных классах), но существенно более сложный - пакет для построения графиков аналитических функций и их производных. Основная сложность этой задачи (помимо решения стандартных интерфейсных проблем, таких как язык для ввода аналитических выражений или преодоление разрывности графика при поточечном построении) - необходимость компиляции аналитического выражения перед вычислением, так как в противном случае (если пытаться анализировать выражение, записанное в строковом формате, в цикле для каждой из почти десятка тысяч точек) скорость работы оказывается неприемлемой (при сложных выражениях) даже на "Пентиуме".
Описанный пакет используется для обучения и тестирования знаний учащихся по теме "Производные аналитических функций". Учащийся вводит выражение и видит на экране график соответствующей функции (на выбранном им участке оси абсцисс и в выбранном масштабе). После этого он самостоятельно вычисляет производную и вводит соответствующее выражение. Программа отображает график введенной им функции и (другим цветом) график истинной производной.
Наконец, трансляторы для языков программирования, используемых в учебном процессе (Робот, RL и Язык схем) были первоначально написаны старшеклассниками математических классов в период практики.
Вне рамок практики, в порядке выполнения текущих заданий преподавателей, созданы многие полезные утилиты, такие как конвертер текстов с математическими формулами из формата устаревшего пакета ChiWriter в формат издательского пакета TeX. Другой пример -- радикальная переработка важнейшей программы для доступа в Интернет, клиента telnet для DOS, позволившая, в числе прочего, пользоваться из DOS русскоязычными ресурсами Интернет (в том числе полноценно работать с системой электронной почты в среде UNIX).
Есть свои достижения и у учащихся общеобразовательных классов - стоит отметить разработанную одним из них программу тестирования знаний по английскому языку (программа была в кратчайшие сроки написана на языке Лого и отлажена, что позволило провести срочное внеплановое тестирование гуманитарных классов с целью оптимального разделения их на учебные группы).
Наконец, вне всякого сомнения, вершиной программистского творчества наших учащихся (и недавних выпускников) является работа многих из них над масштабным Интернет-проектом -- сетевой версией информационно-поисковой системы "Задачи", огромного и эффективно организованного хранилища знаний по элементарной геометрии (разработка ведется на машинно-независимой платформе Java). Работа эта продолжается, и пока можно познакомиться в Интернете с далеко не последней версией.

Компьютер не только для учебы.
Разумеется, компьютеры в нашей школе используются не только для обучения информатике или программированию, и не только в учебном процессе вообще.
Стоит отметить, что большинство учителей школы не боятся, а скорее наоборот, любят пользоваться компьютером в повседневной жизни - например, для подготовки различных текстов, от раздаточных материалов до научных статей. У многих из них накоплены сотни килобайт ценнейших авторских материалов, все это богатство постепенно (хотя, к сожалению, и медленно) переводится на Web-сервер (медленно потому, что творческие люди предпочитают написать новую статью, а не тратить время на перевод старой в формат HTML).
Фактически в школе и "бумажные" издания выпускаются на профессиональном уровне. Математики используют для этого издательский пакет TeX, берущий на себя значительную часть труда верстальщика, другие коллеги осваивают более традиционные для малого издательства и более трудоемкие пакеты. В большинстве случаев дело ограничивается изданием учебных тетрадей в самой школе, малым тиражом, но уже были случаи, когда подготовленные нами оригинал-макеты принимались без изменений издательствами.
Многие сотрудники школы используют средства доступа в Интернет, прежде всего электронную почту, практически ежедневно (вообще зарегистированными пользователями ресурсов Интернет и электронной почты автоматически являются все сотрудники и учащиеся старших классов, а также многие выпускники школы).
Разумеется, администрация школы ведет на компьютерах все делопроизводство, компьютеры (от современных до совсем простеньких 386-х) установлены на столах директора и всех его заместителей, бухгалтера и секретаря школы. И никакого консерватизма и страха перед техникой!
Вот только трудно бывает отыскать в школе пишущую машинку, когда она вдруг потребуется...