Эта статья написана как отклик на дискуссию об олимпиадной математике, которая в последнее время развернулась в FIDO-конференции ru.golovolomka, а затем перекинулась в ЖЖ, см.
http://knop.livejournal.com/13226.htmlhttp://knop.livejournal.com/13511.html Зашла речь и об олимпиадах в смежных дисциплинах, в частности, о соревнованиях по программированию по системе ACM. Я поучаствовал в дискуссии, но по ACM-подобным олимпиадам мне хочется поговорить подробнее.
Общие тезисы:
1. Система, предложеная ACM - лучшая из известных на сегодняшний момент
2. Система, предложеная ACM не идеальна. Кое-какие соображения по исправлению
ситуации можно предложить, но пока тут больше вопросов, чем решений.
3. На сегодняшний момент используются далеко не все возможности, которые
предоставляет эта система.
На всякий случай, официальные правила изложены здесь:
http://neerc.ifmo.ru/information/contest-rules.html На практике в конкретных турнирах правила могут несущественно отличаться.
В первую очередь статья предназначена людям, интересующимися вопросами дополнительного математического образования. Если Вы не еще не передумали, то
Оговорюсь сразу. Речь идет о школьных соревнованиях по программированию.
Система проведения турниров, предложеная ACM, предназначена прежде всего для студентов,
то есть для людей, уже сделавших свой выбор в сторону профессионального программирования.
Но соревнования по новым правилам практически немедленно стали проводиться и для школьников.
Хорошо ли это? Ответ: да, но...
Чтобы выяснить, хорош ли метод, давайте сначала определим цель, для которой этот метод применяется. Действительно, а зачем мы учим школьников программированию. Для того, чтобы научить их писать программы на каком-то там языке? Ну так это в жизни нужно далеко не всем. Более того, это не нужно никому, ибо даже те, кто в последствии станет профессиональным программистом, будет писать на других языках (от восьмого класса до окончания ВУЗа сколько времени пройдет? И на сколько за это время обновятся средства программирования? То-то же!). Так зачем?
А затем, что занятия программированием развивают у детей важную способность, которая называется "алгоритмическое мышление". И нужно оно в жизни отнюдь не только программистам, а в той или иной степени всем. И, среди прочих, математикам.
Вообще-то до введения в обиход слова "информатика" (интересно, что, все-таки, это слово означает?)школьный курс математики справлялся с развитием алгоритмического мышления у учащихся самостоятельно. Кстати, об этом как-то часто забывают. Ну, про алгоритм Эвклида и алгоритм Гаусса даже и напоминать-то неловко... А основной технологией развития алгоритмического мышления следует считать геометрические задачи на построение. Ну и, конечно, не следует забывать о классических кружковых(олимпиадных?) темах "Конструкции", "Игры", "Инварианты и полуинварианты".
Вообще, сам я считаю, что никакого курса "информатики" в школах нет. Есть курс математики, который един, но если следовать традиции, то можно выделить в нем четыре составные части с размытыми границами между ними: алгебра, геометрия, информатика (ну нет другого слова!) и кружковая математика. О распределении часов между ними - это вопрос к чиновникам, к нашей теме это сейчас не относится. А вот о наличии внутренней связи между этими предметами забывать не следует. Хотя бы из элементарных соображений справедливости. А то приходит школьник в пятом классе в маткружок, руководитель кружка проведет с ним классические "олимпиадные темы", учитель в школе заставит прорешать рутинные задачи на
построения, в кружке добавят "построения одним циркулем" и "построения нестандартным набором инструментов". А пока суть да дело, глядишь, уже 10 класс на дворе, подоспел предмет информатика. И надо же, в новом предмете ребенок вдруг начинает делать успехи, вокруг масса восторгов: "Врожденный талант!". И что дальше?. Правильно. Зарывать талант ребенку не следует (всеобщий вывод), молодой человек сам начинает в это верить, поступает в ВУЗ на программистскую специальность и через некоторое время обнаруживает себя в большой комнате, уставленой компьютерами, принадлежащей какой-нибудь софтверной фирме, в третьем ряду слева. При этом никаких у него преимуществ по отношению к соседям, перспективы - максимум оказаться "старшим в своем ряду". А его математические таланты? Какие таланты! Не воспринимать же всерьез его победы на районной олимпиаде в седьмом классе.
Ну и попутно: преподавателю информатики - грамоту и более высокую категорию, за то, что открыл талант, математику - устный выговор за попытки помешать ребенку проявиться там, где у него явные способности. Ну, или снисходительное похлопывание по плечу: "Давайте, давайте, работайте. Видите, какие успехи у Вашего коллеги-информатика?".
Знакомая картина? И вообще, неужели корреляция между наличием регионе развитой системы дополнительного математического образования (назову Питер и Кировскую область, хотя это, конечно, не исчерпывающий список) и высокими результатами школьников из этих регионов на соревнованиях по программированию не бросается в глаза?
И казалось бы, при чем тут ACM?
Массовое внедрение технологии ACM в проведения соревнований среди школьников усугубляет эту ситуацию. В отличии от математических олимпиад, в которых вся процедура проведения и проверки направлена на выявление того, КАК ребенок получил результат, новая технология проверяет, собственно, только результат. И, соответственно, ничего не говорит о КАЧЕСТВЕ навыков, полученных ребенком. Собственно, технология ACM есть некоторое приближение к системе проверки знаний по тестам, а об этом последнее время написано столько, что добавить уже нечего. Тут ведь есть большая разница, для кого мы проводим соревнования. Студенты, участвующие в соревнованиях acm-овского цикла - это люди, уже сделавшие свой профессиональный выбор и попытка провести соревнования по правилам, по возможности приближенным к промышленному программированию выглядит вполне разумной. А для школьников профессиональные навыки в какой бы то ни было области - не самое главное, для этого еще будет время. В школьном возрасте гораздо важнее общее развитие личности.
А система провоцирует проведение с учащимися не тех занятий, которые наиболее полезны для него, а тех, которые будут с наибольшей вероятностью востребованы на ближайшем соревновании. То есть система ACM порождает репетиторство. И стоит ли удивляться, что такое репетиторство пышно расцвело в последнее время. Впрочем, многие для благозвучия называют это тренерством, но от замены названия суть-то не меняется. Ибо по определению репетиторство - это обучающая деятельность, направленная не на развитие ученика, а на достижение им определенных внешних результатов (поступления в ВУЗ или достижение высокого места на олимпиаде - это не так важно).
Что делать? Окончательного ответа у меня нет. В частности, я ни в коей мере не призываю отказаться от проведения для школьников соревнований по системе ACM. Поскольку наряду с минусами у системы есть и ряд несомненных плюсов. Ибо при подготовке к соревнованиям по таким правилам школьники (сами того не замечая), приобретают и полезные качества. Умение довести работу до конца, умение организовать работу в команде, умение планировать свое время и еще много других навыков, которые не являются специфически программистскими. Так что отвергать с порога ее не стоит.
Тем более, что заменить-то ее по большому счету нечем. Я с некоторым ужасом (впрочем и с некоторой ностальгией, но это не связано с качеством работы) вспоминаю разнообразные жюри, в которых мне приходилось участвовать или работу которых мне приходилось наблюдать в начале-середине девяностых. В первую голову на ум приходит слово бардак. После одного из таких заседаний жюри областной олимпиады Николай Николаевич Красовский, помнится, выдал совершенно убийственную и точную характеристику: "Работа в обстановке, максимально приближеной к сумашедшему дому". Отсутствие четких критериев приводило к тому, что члены жюри не столько проверяли работы, сколько выясняли между собой, какие критерии оценок должны применяться (обратите внимание, критерии оценок обсуждались в тот момент, когда задачи уже были составлены и выданы. Ну не бардак ли? А ведь это было!). При этом каждый член жюри искренне стремился к наилучшим результатам, но процветавшая вкусовщина сводила благие пожелания на нет. Опять же, я не сторонник однозначно плохой оценки, скорее это все следует отнести к категории болезней роста. Но чем бы ни вызвана болезнь, он все-таки должна лечиться.
Так что когда система ACM появилась на горизонте, она выглядела поначалу весьма привлекательно. Задумываться о недостатках стали много позже (да и не все). Но альтернатива-то какая? Не знаю.
Разумеется, не хочется возвращаться к системам без строгих критериев. Но почему-то думается, что систем, допускающих четкое и однозначное определение победителей существует больше, чем одна. Может быть выход в том, чтобы иметь много типов соревнований. Посмотрите на тех же математиков. Кроме олимпиадной системы есть еще турнир городов, турниры матбоев и вообще масса разных соревнований. Почему в программировании только ACM? Есть ведь турниры программ, наверняка можно придумать еще много форм. Правильное развитие должно, по-моему, идти в ширь. И самое главное, нужно, чтобы такие соревнования, которые проводятся то тут, то там, в основном на чьем-то энтузиазме, составили бы систему.
Тут, конечно, нужно сделать одну оговорку. Говоря о других формах соревнований, я не имею в виду систематически возникающие то тут, то там "соревнования по компьютерной графике", "турниры пользователей компьютера" и тому подобное. Ну, то есть пусть себе они проводятся, но в большинстве своем они рассчитаны на другую аудиторию. На тех, кто не преуспел в программировании, но все равно хочет быть чемпионом. Это их дело. Я же говорю о желательности расширения видов соревнований для тех же самых школьников, которые занимаются олимпиадным программированием.
И еще. Мы тут в начале говорили о математике, не забыли еще? Как все-таки быть ребенку, который хочет и может выступать и там и там, а это невозможно, поскольку какие-то дяди и тети в министерствах (причем, не знающие ни математики, ни программирования) решили когда-то, что это разные предметы? И как быть честному учителю (не важно, какой предмет он официально преподает), который заботится не о сиюминутных успехах ученика, а о его развитии? У ребенка есть интерес к компьютеру? Конечно есть, вон он какой красивый, с кнопками! А мы-то понимаем, что ему (ребенку), математикой бы заняться, это ему полезно, причем в первую очередь как будущему программисту. Не поставишь же, в самом деле, компьютер на соревнованиях по математике?
Почему нет?!! Пусть себе идет на соревнования по программированию. А мы встретим его там вот такой задачей (9 класс).
Несколько (больше одного) человек, каждый из которых вначале имеет K
долларов, играют в казино. Один раунд игры заключается в следующем. Все игроки
отдают по L долларов крупье, затем один из них по жребию объявляется
проигравшим. Он раздаёт все свои деньги всем остальным и выходит из
игры. В итоге оказалось, что у последнего оставшегося игрока капитал вновь
составляет K долларов. Напишите программу, которая по введенным числам целым
K и L (L и K не превосходят 1000000000, L меньше K) определяет, сколько
человек пришло в казино или выводит сообщение "impossible", если при
данных K и L описанная ситуация невозможна.
Или такой (8 класс):
На острове живёт n аборигенов, каждый из которых либо лжец (лжецы всегда
лгут), либо рыцарь (рыцари всегда говорят правду). Некоторые аборигены знакомы
друг с другом, причём каждый лжец имеет знакомого среди рыцарей, а каждый
рыцарь знакомого среди лжецов. Каждый абориген сделал заявление: "Среди моих
знакомых лжецов больше, чем рыцарей". Затем правитель острова казнил одного из
аборигенов, и после этого каждый абориген сделал заявление: "Среди моих
знакомых рыцарей больше, чем лжецов". Напишите программу, которая по введенному
n, не превосходящему 2000000000, определяла бы, сколько рыцарей было на острове
изначально. Если возможны несколько ответов, то они должны быть перечислены
все в порядке возрастания.
(Обе задачи предлагались в непрограммистской формулировке на Кубке Колмогорова в декабре 2005).
Ну и чему такие задачи противоречат? Системе соревнований по программированию по системе ACM не противоречат точно, вставьте их в любой турнир. Школьников, способных написать решение, тоже не мало, сейчас уже не те времена, когда школьника, способного выступать на математических турнирах достаточно высокого ранга, можно было напугать предложением написать программу. Или даже так: многие команды программистов, играющие в соревнования по системе ACM берут в свой состав игрока-математика. Который во время соревнований за компьютер не садится, а только решает задачи, требующие математической подготовки (есть такие! всегда есть! как бы кто ни говорил слова типа "у нас соревнования по программированию, а не по математике"). Так почему не брать в команду на матбои игрока-программиста? Пока это только потому, что задачи программирования не предполагают. Но почему бы и нет?
Автор не в кое мере не считает, что его точка зрения абсолютно верна, и будет рад возможным комментариям.