Подготовил письмо.

Уважаемые коллеги, учителя информатики!

Обращаемся к вам с информационным письмом, особенно актуальным в преддверии нового учебного года. Оно касается выбора языка программирования и среды для изучения в школьном курсе информатики.

В настоящий момент стандартом де-факто для обучения программированию в школе является среда Turbo Pascal. Заслужив некогда всеобщее признание за ряд замечательных качеств, на сегодняшний день она безнадежно устарела и объективно нуждается в замене. Уже не первый год в некоторых школах используются и современные среды разработки, такие как Delphi или Visual Basic. Таким образом, перед учителем информатики сегодня встает проблема: какой же инструмент выбрать для использования в учебном процессе? Зачастую, решая для себя этот вопрос, учитель делает выбор по второстепенным признакам: например, мультимедийным возможностям среды, популярности ее "бренда" и т.п. К сожалению, придается мало внимания основному критерию - языку программирования и концепциям программирования, заложенным в среде.

Мы знаем, что российское образование всегда строилось на системном подходе и серьезном математическом фундаменте. И неслучайно выбром среднего и высшего образования для обучения программированию долгие годы являлись различные модификации языка Паскаль, созданного в 1970 году Никлаусом Виртом - одним из пионеров мировой информатики, лауреатом высшей в этой области награды - премии Тьюринга. Российские студенческие команды, много лет подряд завоевывающие золотые медали на международных олимпиадах по программированию, используют для подготовки и участия в них исключительно Паскаль. Название "Паскаль" стало синонимом грамотного, аккуратного стиля программирования. Независимо от того, какой инструментарий будет использовать в дальнейшей работе школьник или студент, невозможно найти лучший язык для обучения азам и не только азам программирования, нежели язык семейства Паскаля.

Среди авторов этого текста есть преподаватели ВУЗа, в котором на специальности "Прикладная математика и информатика" было отменено изучение на первом курсе Паскаля и введен С++ как первый язык. Результаты года обучения удручающие - все время студентов ушло на борьбу с компилятором, опечатками, с устаревшими и неудачными аспектами языка (такими, как отсутствие строгой типизации, идентичностью указателей и массивов, механическим импортом #include вместо полноценной модульности и т.п.). В то же время использование Паскаля как основного языка обучения позволяло показать все необходимые аспекты как построения алгоритмов ("программирование в малом"), так и построения программных систем на принципах структурного, модульного и объектно-ориентированного программирования ("программирование в большом").

Однако в школьном образовании наблюдается обратный уклон - не к сложным профессиональным языкам, а к такому печальному явлению информатики, как Бейсик, в реализации Visual Basic от Microsoft. Конечно, за десятилетия развития Бейсик претерпел значительные изменения, впитал в себя достижения других языков и в современной реализации включает в себя все необходимые возможности для разработки приложений. Однако, кроме наличия или отсутствия в языке некоторых возможностей, есть еще такое понятие, как методология и стиль программирования. На протяжении всего периода своего существования Бейсик признавался крайне неудачным языком, непригодным для обучения программированию. Прекрасно известно, что те, кто первым языком изучают Бейсик, приобретают дурной стиль программирования, и переучить их потом крайне сложно. Некогда основной проблемой являлось постоянное использование неструктурного оператора GOTO (исключенного из всех современных языков программирования). Сегодня в язык включены процедурные и объектно-ориентированные конструкции, но общая идеология языка и среды Visual Basic осталась прежней - они поощряют разработку программ "методом тыка", быстрое "клепание" неправильного кода и последующее исправление ошибок методом "заплаток", вместо доказательного, системного подхода к составлению правильного кода. Поэтому труд по обучению школьников Visual Basic абсолютно бессмысленен, и в первую очередь это касается классов физико-математического и естественнонаучного профиля - этих школьников, поступивших в ВУЗ на программистские, математические или инженерные специальности, все равно придется переучивать, и преподавателям придется тратить время на исправление порочного стиля программирования. Поэтому, обращаясь от имени преподавателей университетов, просим школьных учителей информатики: не тратьте зря свое время и время ваших учеников, изучая то, что через два-три года придется искоренять нам, преподавателям, говоря первокурсникам: "Если хотите научиться программировать, забудьте тот язык и те подходы, которым вас учили в школе". Кроме того, нужно учитывать тот фактор, что Visual Basic является коммерческим продуктом зарубежной корпорации и продвигается ей в образование в рамках огромной пиар-компании. В то же время Государственной думой РФ был принят законопроект об отказе от использования продукции зарубежных корпораций в стратегически важных отраслях национальной экономики. Пропагандируется использование альтернативного программного обеспечения, которое не является коммерческим и имеет открытые исходные коды. Без сомнения, вопрос о том, какое программное обеспечение использовать в образовании, также является стратегическим и непосредственно связан с национальными интересами России.

В последнем аспекте то же самое можно было бы сказать и про популярную среду Borland Delphi (дополнительным минусом здесь является то, что эта среда компанией Borland более развиваться не будет и поэтому перспектив не имеет). Хотя в целом эта среда является достойным представителем Паскаль-систем, но для использования в школе является громоздкой и чрезмерно сложной. При правильном порядке обучения программированию необходимо начинать с консольных, текстовых приложений - и в этом смысле никаких преимуществ перед Turbo Pascal среда Delphi не дает. Использовать графику так же легко, как это позволял старый модуль Graph, в Delphi не удастся. Для создания графических приложений школьникам требуется иметь представление об объектно-ориентированном и событийном программировании. Хотя ввиду большой модности этих подходов многие авторы учебных курсов пытаются представить их чуть ли не как "интуитивно понятные", на самом деле для их понимания и правильного использования требуется иметь достаточный практический опыт создания приложений в классической структурно-модульной парадигме, которого у большинства школьников нет и быть не может. В сильных классах можно проводить знакомство с объектно-ориентированной парадигмой в конце 11 класса, но не ранее того. Попытка же начинать осваивать программирование с "прыжка" в ООП и разработку графических интерфейсов в принятом в Delphi и Visual Basic стиле не приводит ни к чему хорошему, кроме как к тому же самому "клепанию" кусков кода в обработчиках событий элементов управления и т.п., о чем уже было сказано. Это также одна из проблем, с которой в дальнейшем сталкивается университетский преподаватель, которому приходится переучивать самоучек-первокурсников правильно структурировать код, разделяя логику и интерфейс программы по независимым модулям. Но, как известно, единожды приобретенную вредную привычку очень трудно потом искоренить. Здесь мы поставим актуальный вопрос: существуют ли среды программирования, позволяющие легко создавать несложные графические интерфейсы без знакомства с ООП и поощрения у новичков плохого стиля программирования? Ответ на этот вопрос утвердительный, но об этом скажем позднее.

Многого ли можно ожидать от учебных пособий, в которых большинство места отведено репликами, подобным следующей: "Бросьте на форму компонент TButton, дважды щелкните по нему и впишите в обработчик OnButton1Click такие строчки...". Нам надо, наконец, решить, для чего использовать уроки информатики в школе: чтобы готовить "чайников", умеющих кидать кнопки и картинки на форму, или прививать ученикам азы технического, конструкторского мышления, способность проектировать и создавать пусть небольшие, но качественные программы. К сожалению, в обществе распространился миф, что "программирование - это очень просто, не сложнее, чем двигать мышкой и набирать тексты". Следствием этого мифа явилась лавина некачественного, ненадежного, медленного, говоря простым языком - корявого программного обеспечения, которое каждый день приносит множество проблем своим пользователям. Стоит на мгновение представить себе, что автомобили или самолеты делались бы так же, как пишутся сегодня прогаммы, чтобы понять ненормальность сложившейся ситуации. Если учесть ту роль, которую сегодня играют информационные системы в жизнедеятельности общества, качество подготовки ИТ-специалистов становится первостепенной проблемой. И к обучению программированию в школе как первому этапу такой подготовки мы должны подойти со всей возможной тщательностью.

Мы сформулировали только часть проблем, встающих при обучении школьников программированию, однако этого достаточно, чтобы понять, что инструментарий, т.е. язык и среда программирования, в образовании приобретают первостепенное значение. Есть ли достойный претендент, способный стать заменой устаревшему Turbo Pascal и предоставить основу для быстрой и системной постановки у начинающих программистов правильного стиля мышления и составления кода? Собственно, целью настоящего письма является рассказ о существовании такового инструмента и уже накопленном обширном опыте его использования в образовании.

К сожалению, в России долгое время было мало известно о языках, которыми Никлаус Вирт продолжил линейку Паскаля. Использовались различные усовершенствованные модификации классического Паскаля, в то время как сам автор языка дважды - в 1980 и в 1989 годах - перерабатывал его с учетом всех недостатков исходного языка и дал начало целому семейству передовых сред программирования. В 1980 году Никлаус Вирт создал язык Модула-2, в который, кроме переработанного и отточенного синтаксиса, были добавлены модули и средства инкапсуляции данных в модулях. Язык Модула-2 долгие годы использовался профессионалами для решения задач системного программирования и позволял создавать гораздо лучшие по архитектуре и надежности системы, чем Си. Можно было бы ожидать, что более мощный язык будет иметь более сложный синтаксис - однако произошло обратное. Талант Вирта позволил ему пойти по пути упрощения синтаксиса с одновременным увеличением возможностей языка. Мы столь часто видим обратное, когда с каждой новой версией программы не становятся лучше, но загромождаются ненужными, излишними, второстепенными возможностям, что для многих из нас сложно представить, как такое стало возможным. Однако Никлаус Вирт в совершенствовании Паскаля пошел еще дальше. В 1989 году был создан язык Оберон. Он был спроектирован самым тщательным образом - все ненужные и неудачные средства были из него исключены, а необходимый минимум добавленных сделал язык объектно-ориентированным и позволил реализовать на нем передовую операционную систему Oberon OS, идеи которой легли в основу такой известной сегодня технологии, как Java. Язык Оберон очень компактен и строен - его описание занимает всего 16 страниц. Первоначально Вирт не включил в язык даже цикл FOR - правда, впоследствии он был возвращен. Однако учителям информатики стоит обратить внимание на этот момент - действительно, при обучению программированию следует избегать цикла FOR, приучая школьников явно формулировать условие окончания цикла в конструкциях WHILE и REPEAT, так очень распространенной ошибкой начинающих программистов является поспешное использование цикла FOR, а затем "доклепывание" внутри него операторов выхода GOTO или BREAK. Само собой разумеется, что GOTO, BREAK и CONTINUE в Оберон включены не были, поскольку их использование противоречит принципам структурного программирования. Поэтому начинающему программисту волей-неволей придется составлять код в терминах строгих структурных операторов языка.

Ниже показано, как выглядят базовые управляющие конструкции Оберона. Любопытно сравнить их с формой записи, принятой в алгоритмическом языке Ершова, который широко применяется в школе - получим полную аналогию, за исключением английских ключевых слов.

Условный оператор
## Код:
```
IF условное_выражение THEN
   последовательность_операторов
ELSE
   последовательность_операторов
END

если условное_выражение то
   последовательность_операторов
иначе
   последовательность_операторов
все
```

Цикл с условием
## Код:
```
WHILE условное_выражение DO
   последовательность_операторов
END

нц пока  условное_выражение
   последовательность_операторов
кц
```

Как видим, в Обероне нет излишнего и громоздкого ключевого слова BEGIN в управляющих операторах. И условие, и цикл всегда должны заканчиваться ключевым словом END. Это исключает ряд ошибок-опечаток - потерянный BEGIN, "повисшее" ELSE и т.п., делает код легко читаемым и лаконичным. Кроме того, ключевые слова в Обероне пишутся заглавными буквами. Это также повышает читаемость кода. В средах программирования не используется подсветка синтаксиса. Вместо этого программист может выделять по своему усмотрению жирным шрифтом/курсивом/цветом те места кода, на которые он хочет обратить внимание, поставить смысловой акцент. Также идентификаторы регистрозависимы, т.е. Х и x - это два разных идентификатора.

Утверждение
Важную роль в Обероне играет оператор утверждения ASSERT, который проверяет истинность некоторого условия и в противном случае прерывает выполнение программы с сообщением о нарушении утверждения. Утверждения записываются в начале каждой процедуры и других ключевых местах кода. Программист должен привыкнуть перед написанием кода продумать все условия, которые должны быть соблюдены до начала выполнения кода, во время его выполнения и после окончания. В Обероне пропагандируется надежный стиль программирования, при котором правильность программы проверяется на всех этапах - написания кода, компиляции и выполнения. Формулировка утверждений в коде позволяет легко и быстро обнаруживать логические ошибки без использования отладчика (который из Оберон-систем намеренно исключен, поскольку поощряет неряшливое программирование методом проб и ошибок).
Любопытно, что в алгоритмическом языке оператор утверждения также присутствует - авторы языка оценили его важное значение для грамотного программирования.

ASSERT(условное_выражение, номер_ошибки)

утв условное_выражение

Из остальных базовых операторов Оберона назовем CASE, REPEAT-UNTIL и FOR-TO-BY-DO.

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

Указатели и динамическая память.
Работать с указателями и динамической памятью в Обероне очень просто, поскольку не нужно явно освобождать память - это делает автоматически сборщик мусора, как только на объект не остается больше ссылок. В Обероне просто невозможны ошибки "повисших" указателей и утечки памяти. Такое упрощение работы с памятью позволяет использовать динамические структуры в самом начале курса, что позволяет поработать с интересными и наглядными алгоритмами, например, вставкой/поиском/удалением элементов списков, которое можно легко показать на графических схемах на доске.
Вот как выглядит в Обероне работа со списками:
## Код:
```
TYPE
   List = POINTER TO RECORD
      next: List
      value: INTEGER
   END;
VAR
   list: List;

PROCEDURE Insert (value: INTEGER);
   VAR it: List;
BEGIN
   IF list # NIL THEN
      it := list;
      WHILE it.next # NIL DO
         it := it.next
      END;
      NEW(it.next);
      it.next.value := value
   ELSE
      NEW(list);
      list.value := value
   END
END Insert;

PROCEDURE Delete (item: List);
   VAR it: List;
BEGIN
   IF list # item THEN
      it := list;
      WHILE (it # NIL) & (it.next # item) DO
         it := it.next
      END;
      ASSERT(it # NIL); (* Элемент присутствует в списке. it - предыдущий *)
      it.next := item.next
   ELSE
      list := list.next
   END
END Delete;
```

Основным принципом Оберон-систем является простота и стройность, отсутствие излишеств, можно даже сказать - аскетизм. Именно такой стиль мышления следует формировать у начинающего программиста - любовь к красивым, изящным, компактным решениям задач; любовь к минимализму, лаконизму как при создании своих программ, так и использовании готового ПО. Следствием такого стиля мышления становится высокое качество, надежность программного обеспечения. Уместно вспомнить цитату известнейшего ученого-информатика Ч.-А. Хоара: "Существует одно качество, которое нельзя купить, - это надежность. Цена надежности - погоня за крайней простотой. Это цена, которую очень богатому труднее всего заплатить". Аналогичные идеи выссказывал Э. Дейкстра во многих своих публикациях, например, "Смиренный программист". Принцип "надежность достигается стремлением к простоте" давно известен в технике. Такой подход, в частности, соответствует традициям российской военной техники. Именно поэтому лучшее стрелковое оружие в мире - автомат Калашникова, лучший истребитель - Су, а обслуживают МКС российские комические корабли, а не Шаттлы, уязвимость которых оказалась именно в конструктивной сложности. Здесь уместно отметить, что бортовое ПО для российских спутников разрабатывается на языках Модула-2 и Оберон (НПО Прикладной механики им. Решетнева), бортовое ПО российских беспилотных самолетов-разведчиков - также на Обероне (НПКЦ "Новик - XXI век"). Самая точная характеристика Оберона - это автомат Калашникова для программирования.

До сих пор мы говорили об Обероне как о языке программирования, но не коснулись среды разработки. Наиболее доступной и подходящей реализацией Оберона под Windows является среда BlackBox. В ней используется немного расширенный вариант Оберона, который получил название Компонентный Паскаль. В целом BlackBox является профессиональной промышленной средой разработки, по концепциям более современной, чем та же Delphi. BlackBox и Компонентный Паскаль относятся к одному поколению с Java и .NET, поддерживая концепции так называемого компонентного программирования. Однако BlackBox верен традициям Оберона - соблюдать крайнюю простоту, и поэтому для новичка оказывается даже более простым и удобным, нежели Turbo Pascal. Среда бесплатна, распространяется с исходными кодами, что отвечает названным выше требованиям.

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

Очень важно то, что в BlackBox можно работать с графическими формами и элементами управления без знания ООП. Используется очень простой подход, при котором каждый элемент управления связывается с так называемым интерактором - обычной переменной или процедурой в программе. Например, мы можем связать поле ввода с глобальной строковой, целой, дробной переменной - при вводе значения пользователем оно будет помещаться в эту перменную, и наоборот - при изменении значения переменной из программы будет обновляться элемент управления. Кнопки же связываются с любыми процедурами, которые вызываются при их нажатии. Поэтому использовать графические формы в программах можно с самых первых занятий. Графические формы сохраняются как обычный документ BlackBox во внешнем файле и могут редактироваться произвольным образом без перекомпиляции кода. Очень важно, что графический интерфейс полностью отделен от программного кода. При написании программы внимание акцентируется на ее логике, входных, выходных данных и их обработке. Графическая форма создается в последний момент и просто подключается к заготовленным в коде интеракторам.

Естественно, что для более сложных задач, например, создания своих графических компонентов, потребуется знание ООП. Однако ООП в Обероне реализовано также очень компактно. Никлаус Вирт всегда был противником введения в язык дополнительных понятий объекта и класса. Ведь в структурных языках программирования Паскале и Модуле для этого уже есть подходящие понятия - запись и тип данных. Инкапсуляция в этих языках осуществляется на основе модулей. Для полноценной поддержки ООП в Обероне потребовалось ввести единственное средство - расширение записей.
Вот пример работы с ООП в Компонентном Паскале:
## Код:
```
TYPE
   Фигура = EXTENSIBLE RECORD (* расширяемая запись *)
      цвет: INTEGER
   END;
   Треугольник = EXTENSIBLE RECORD (Фигура)
      x0, y0, x1, y1, x2, y2: REAL
   END;
   Окружность = EXTENSIBLE RECORD (Фигура)
      x, y, r: REAL
   END;
   
   PROCEDURE Площадь (IN f: Фигура): REAL; (* Слова FUNCTION в Обероне больше нет *)
      (* параметр передается по ссылке. IN - аналог VAR "только для чтения" *)
      VAR a, b, c, p: REAL;
   BEGIN
      WITH f: Треугольник DO (* проверяем фактический тип параметра f и выполняем приведение типа *)
         a := Math.Sqrt(Math.Sqr(f.x0 - f.x1) + Math.Sqr(f.y0 - f.y1));
         b := Math.Sqrt(Math.Sqr(f.x1 - f.x2) + Math.Sqr(f.y1 - f.y2));
         c := Math.Sqrt(Math.Sqr(f.x0 - f.x2) + Math.Sqr(f.y0 - f.y2));
         p := (a + b + c) / 2;
         RETURN Math.Sqrt(p*(p-a)*(p-b)*(p-c)) (* так выполняется возврат значения из процедуры *)
      | f: Окружность DO
         RETURN Math.Pi() * f.r * f.r
      END   
   END Площадь;
```

Это простейший пример, мы не будем здесь показывать объявление методов и т.п. Обратите внимание, что мы использовали в коде русские идентификаторы. Действительно, русская версия BlackBox допускает их использование. Для школьников, только начинающих знакомство с программированием, преимущество использования имен на родном языке неоспоримо. В России используется специальная школьная версия BlackBox -  с упрощенным меню на русском языке и некоторыми дополнениями. Впрочем, редактировать меню среды очень легко - это может делать любой пользователь. Кроме того, имеется русский перевод документации к среде.

Где можно взять среду и учебные материалы по ней? В России поддержка BlackBox осуществляется сайтом blackbox.metasystems.ru. Там размещены все дистрибутивы среды, в том числе школьная версия, русская документация, статьи и другая информация. По любым вопросам всегда можно получить компетентную консультацию на форуме.

И последнее, что мы хотим осветить здесь, - это российский опыт использования среды в образовании. С 2001 года начал свое существование проект Информатика-21 (его сайт -http://www.inr.ac.ru/~info21), целью которого является "координация усилий реальных специалистов науки, образования, аэрокосмической промышленности и ИТ-индустрии на постсоветском пространстве по созданию единой современной системы преподавания фундаментальных основ программирования, опирающейся на наши уникальные образовательные и математические традиции". Координатором проекта является старший научный сотрудник Института ядерной физики РАН Ф.В. Ткачев. Институт ядерной физики совместно со крупнейшей в мире швейцарской физической лабораторией CERN уже много лет используют Оберон и конкретно BlackBox в своих проектах. Исходя из необходимости подготовки компетентных кадров BlackBox был опробован на физическом факультете МГУ и оказался очень удачным выбором. С этого момента начинается распространение среды в российском образовании. В настоящий момент официальными учатниками проекта Информатика-21 являются следующие ВУЗы и школы:

- физический ф-т МГУ, спецкурс "Введение в современное программирование" (Ф.В. Ткачев);
- лицей Научного центра РАН в г. Троицк, эксперимент по преподаванию программирования в формате обычного школьного курса информатики (Н.П. Кучер);
- межшкольная группа ?Лидер? для одаренных детей при ГорУО г. Стрежевого Томской области (А.И. Попков);
- лицей ?1 им. М.В. Ломоносова г. Орла, спецкурс ?Программирование и дискретная математика?;
- широкомасштабный эксперимент по внедрению Компонентного Паскаля в средних школах Витебской области (Республика Беларусь). Руководитель проекта  А.Б. Кондратович, нач. отдела Витебского областного института повышения квалификации учителей.
- Ошский технологический университет (г. Ош, Кыргызская Республика), новаторская программа систематического обучения программированию на основе ETH Oberon под ОС Linux с использованием проектов open source (Кубанычбек Тажмамат уулу);
- Орловский государственный университет, экспериментальный курс "Элементы абстрактной и компьютерной алгебры" (Б.В Рюмшин);
- Московский авиационный институт (МАИ), факультет прикладной математики и физики. В рамках курса "Системное и прикладное обеспечение", в теме "Методы комплиляции" изучаются Оберон, Компонентный Паскаль и среда BlackBox как образец системы программирования.

Кроме того, ряд школ Москвы и Сибири начали переход на среду BlackBox, не регистрируясь в качестве официальных участников проекта, но участвуя в тематических обсуждениях на форумах.

Важным событием стал недавний выход электронного сборника задач на Компонентном Паскале, подготовленного А.И Попковым. Сборник включает в себя 360 задач с решениями в виде модулей для BlackBox. Сборник можно скачать на сайте blackbox.metasystems.ru, в разделе Образование - Учебные материалы.

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

Можно смело говорить о том, что BlackBox является наиболее достойным претендентом на роль стандартной среды для обучения программированию в школах и ВУЗах России.

Ссылки
1. Центр поддержки BlackBox в России -http://blackbox.metasystems.ru
2. Сайт проекта Информатика-21 -http://www.inr.ac.ru/~info21
3. Форум пользователей BlackBox и официальный форум Информатики-21 -http://bbforum.metasystems.ru