Олимпиады по программированию

olympiads.ru

Литература
Фундаментальная литература
Учебники и задачники
Литература по методике преподавания информатики
Публикации по тематике проекта
Разбор задач
Публикации по тематике проекта
Список публикаций

Автоматизация проверки решений школьников при изучении программирования.

Доклад В. Матюхина на конференции "Образовательная информатика: региональный аспект"
Киров, 3 ноября 2001 года
Опубликовано в Вестнике Втяского государственного педагогического университета, выпуск "Информатика", Киров, 2002

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

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

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

Процесс проверки решения становится гораздо более качественным: если в ручную мы можем прогнать программу лишь на 2-3-х тестах, то при использовании автоматической проверки число тестов может быть на порядок больше. Как правило, 10-15 тестов хватает, чтобы "покрыть" практически все варианты работы программы, и, особенно, частные случаи. При этом прогон такого количества тестов автоматической системой занимает обычно не более 1-2 минут.

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

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

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

Научить школьников пользоваться отладчиком - это очень важно. Отладчик для школьника играет своего рода роль "зеркала". Можно сказать, что программа - это изложение мыслей школьника о том, как должна решаться задача. Отладчик позволяет сравнить, что школьник хотел сказать, что он реально сказал, и к чему это все приводит. То есть в некотором смысле позволяет увидеть слабые места и ошибки в решении. Устраняя ошибки в программе (а еще раз подчеркнем, что программа - это изложение мыслей), школьник наводит порядок и в своих мыслях. Таким образом, достигается одна из важнейших целей изучения программирования: школьник учится мыслить строго логически, четко излагать свои мысли.

Второй вариант: неправильный тест школьнику не сообщается. Искать ошибку в этом случае гораздо сложнее. Прежде, чем устранять ошибку, школьнику надо найти тест, на котором его программа работает неправильно. Ему приходится анализировать условие задачи на предмет того, не осталось ли неучтенных случаев. Ему приходится придумывать самые разнообразные тесты, запускать свою программу, анализировать выданные ей результаты. В некотором роде происходит перемена ролей: если до этого от школьника требовалось, чтобы его программа заработала правильно, то теперь перед ним стоит задача "подловить" эту программу, так как пока такой случай неправильной работы не найден, говорить об устранении ошибки невозможно.

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

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

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

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

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

Таким образом, использование системы автоматической проверки существенно изменяет весь учебный процесс. Фактически, в учебном процессе помимо учителя и ученика появляется третий субъект - "проверяющая система".

Использование систем автоматической проверки при проведении учебно-тренировочных сборов по информатике, при проведении занятий в Кировской летней компьютерной школе и в СУНЦ МГУ дало однозначно положительные результаты. Можно сказать, что при использовании такой системы, преподавание идет на качественно ином уровне.

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

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

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

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

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

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

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

К сожалению, ни одна из существующих на сегодняшний день систем не удовлетворяет всем этим требованиям одновременно.

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