Особенности использования автоматической системы тестирования решений в обучении программированию

Саратовский государственный университет имени Н.Г. Чернышевского

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

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

Если контестер стал практически основным средством обучения, важно помнить, чему он «не учит», и, исходя из этого, уделить большее внимание некоторым вещам с помощью формулирования дополнительных задач (не похожих на задачи контестера по формулировке или цели) и добавления дополнительных критериев оценивания (помимо контестерского «решение принято»). Рассмотрим основные особенности обучения программированию с приоритетным использованием контестера:

  1. Одно из основных отличий олимпиадного программирования от промышленного связано с проверкой корректности введённых данных и устойчивостью программы в этом плане. Точнее, с отсутствием необходимости такого рода проверок в олимпиадном программировании, тогда как в промышленном программировании их роль чрезвычайно высока. Контестер гарантирует корректность тестов, обучающиеся быстро привыкают, что входные данные проверять не надо (написано в условии, что N меньше 100, значит N действительно меньше 100 во всех тестах). Это не минус контестера, скорее даже плюс, т. к. отсутствие некорректных условий позволяет сконцентрироваться на решении алгоритмической задачи. Но это особенность, которую нельзя не учитывать. Научить проверке входных данных и обработке связанных с ними исключений можно с помощью дополнительных задач, причём часть таких задач вполне можно сформулировать в подходящем для контестера формате (указав в условии, что формат данных во входном файле может быть неверным и что в этом случае выводить в качестве ответа).
  2. Другая особенность олимпиадного программирования, а следовательно и контестера,  тесно связана с первой, практически является её зеркальным отражением, и заключается в отсутствии у олимпиадных решений дружественного интерфейса, да и какого-либо интерфейса пользователя вообще. Опять же это нельзя назвать минусом использования олимпиадной системы в обучении, так как разработка интерфейса – отдельная, по-своему трудоёмкая задача, отвлекающая от реализации изучаемого на данный момент алгоритма и затрудняющая его понимание, хотя не менее важная и, несомненно, очень полезная. К сожалению, задачи на программирование удобного и безопасного (в особенности графического) интерфейса пользователя практически невозможно сформулировать в терминах контестера, однако достаточно легко проверить вручную или предложить обучающимся протестировать и найти ошибки друг у друга.
  3. Следующая особенность обучения программированию с приоритетным использованием контестера противоречит олимпиадной природе контестера и связана именно с обучением: при постоянном интенсивном использовании автоматической проверки обучающиеся перестают самостоятельно тестировать программу перед отправкой на проверку. Более того, проблемы с нежеланием или неумением тестировать возникают и на других этапах. Первый случай звучит приблизительно следующим образом: «Преподаватель засчитает программу, когда она пройдёт все тесты. Выходит, нет разницы, с какой попытки это произойдёт. Тогда зачем мне самому тратить время на тестирование программы, если есть контестер? Отправлю как есть, если не пройдёт, буду думать как исправить». Олимпиадная система снижения максимального балла при каждой отсылке в случае обучения помогает только отчасти. Другой случай возникает, если обучающийся знает, что преподаватель имеет доступ к тестам, и вместо поиска ошибки концентрируется на том, чтобы заполучить тест. Ситуация усугубляется, если по каким-то причинам преподаватель не имеет возможности найти ошибку в коде обучающегося и дать ему подсказку. Если же всё-таки обучающийся получит свой тест, кроме всего прочего, вполне вероятно, что ошибку он не исправит. Если ошибка глобальная, где-то в логике программы, но проявляется на 1-2 тестах, обучающийся может просто, изменить поведение программы в случае получения конкретного теста, но не найти и не исправить причину неправильного поведения программы. С другой стороны, если обучающийся совсем отчаялся сдать задачу, знание некорректного теста может мотивировать дорешать её. Следовательно, несмотря на то, что тестирование и отладка программ кажутся неотъемлемой частью работы с контестером из-за его олимпиадного происхождения, при обучении имеет смысл дополнительно акцентировать внимание обучающихся на этих вещах.
  4. Ещё один пункт можно озаглавить так: «Формулирование и конкретизация задачи, определение собственных возможностей». Когда все задачи даются в олимпиадной  или учебной формулировке, ориентированной на контестер, задача обучающегося сводится к формализации задания и определению алгоритма. В традиционном обучении (и промышленном программировании) напротив, часто задача формулируется в общих чертах. Прежде чем приступить не только к решению, но даже к разработке алгоритма, нужно составить некое подобие технического задания. Переформулировать условие, уточнить у преподавателя или выбрать самому ограничения, выбрать, что из функционала будет реализовано в первую очередь. Работа с контестером в контексте этого пункта помогает привыкнуть к тому, как должно выглядеть формальное условие задачи, какие должны накладываться ограничения, понять, что от размера входных данных, например, зависит выбор алгоритма. Однако в контестере практически нет места определению собственных возможностей. Задача контестера должна быть решена (и может быть решена) на 100%, иначе решённой она не считается. Олимпиадная система сурова: не в состоянии решить задачу целиком, для всех случаев, для всех входных данных – можешь не браться за неё. (Кстати, даже в олимпиадах есть исключения из этого правила: на школьных олимпиадах часто даётся задача, имеющая достаточно простое решение на небольших наборах входных данных и нетривиальное в случае превышения некоторого предела, при этом в условии указывается, что большинство тестов маленькие и задача наберёт приличное количество баллов, если будет работать только на них.) Таким образом, хотя в задачах контестера есть место формализации условия, разбиению на отдельные подзадачи, решению упрощённого варианта перед тем как приступить к более сложному, для обучения всему этому они подходят не наилучшим образом, слишком многое в них заранее оговорено и конкретизировано.
  5. Способность писать программу «на листочке» или на доске часто кажется обучающимся, привыкшим к программированию в среде, лишней. Чем дружественнее среда, тем больше соблазн, прочитав задание, немедленно приступить к «построчному программированию», не утруждая себя продумыванием всего хода решения. Результат в тяжёлом случае – бесконечные исправления и переписывания кода и невозможность решить даже простую задачу без помощи среды и отладчика. Хотя контестер к этой проблеме имеет весьма косвенное отношение, полагаю, об этом стоило упомянуть.
  6. «Стиль программирования» - больной вопрос, сложно навязать стиль, если обучающийся не понимает его пользы или понимает, но не хочет привыкать, так как на первых порах, пока не войдёт в привычку, соблюдение стиля отнимает время. Применение контестера в обучении усугубляет проблему стиля сразу по двум причинам. Первая связана с тем, что контест – это соревнование, хочется быстрее написать и отправить решение. Если задача простая, жалко времени на её оформление, если сложная – не хочется отвлекаться на соблюдение стиля. И вторая: даже если обучающийся знает, что преподаватель обязательно будет смотреть текст его решения, нет стимула совершенствовать, дорабатывать и оформлять его, если пройдены все тесты. Решение здесь одно – последовательно убеждать обучающихся, что качество решения не менее важно, чем скорость и правильность, и что написать красивое решение и найти в нём ошибку обычно быстрее и эффективнее, чем мучительно искать ту же ошибку в нечитабельном коде или три раза его переписать из-за невозможности разобрать даже какие операторные скобки к чему относятся.
  7. И, пожалуй, последний по номеру, но не последний по значимости вопрос – авторство. Как и большинство других форм контроля знаний, контестер не лишён проблемы списывания. Опять же, это связано не с его «олимпиадным прошлым», а с использованием в обучении. Кто писал, не копия ли, чья идея, понял или скопировал не вникая? Особенно это актуально в том случае, когда решения могут отсылаться на проверку удалённо. Решение проблемы стандартное: написал – объясни, расскажи, «покажи, что было бы, если изменились какие-либо параметры условия» и т. д.

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

Тип выступления  Устное выступление и публикация
Уровень образования  Основное общее
Среднее (полное) общее
Начальное профессиональное
Среднее профессиональное
Высшее профессиональное