Проф., к.т.н.  Бондарев В.М., Черепанова Ю.Ю.

Харьковский национальный университет радиоэлектроники

Программная система автоматической проверки задач по программированию

Цель разработки

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

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

Справиться с проблемой может автоматическая проверка студенческих решений, чему и посвящено это сообщение.

Задачи по программированию

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

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

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

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

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

Реализация системы

В основе системы лежит веб-служба (TSS - Task Set Service), которая предоставляет условия задач и сервис для проверки их решений.

Рис. 1 Схема системы

Вокруг этой службы строятся сетевые приложения: для самостоятельной работы над задачами (Judge), для проведения контрольных работ (Exam), для ведения задачника (Admin), для проведения соревнований и другие.

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

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

Приложение для ведения задачника (Admin) позволяет аутентифицированным преподавателям добавлять, удалять и изменять задания. Задача определяет язык, на котором следует писать решение. Сейчас есть возможность создавать задачи на языках C #, C ++, Python, Haskell и JavaScript. Перечень языков является открытым и легко может быть расширен, если это потребуется.

Выводы

Описанная система используется на кафедре программной инженерии ХНУРЭ при преподавании дисциплин "Основы программирования", "Объектно-ориентированное программирование" и "Функциональное программирование". С внедрением системы практические занятия по программированию качественно изменились, если раньше работала от силы половина группы, слабые студенты не понимали, сильные скучали, то теперь в них вовлечены все студенты.

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

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

Ценность предложенной системы пропорциональна количеству задач в ее базе. Время подготовки одной задачи колеблется от 10 минут до часа, в зависимости от ее сложности.

Развитие системе мы видим в распространении базы задач и список доступных языков программирования.