Уточню, что речь идет о тренажере, а не системе тестирования. Различие между ними я бы обозначила так: система тестирования получает на вход набор тестов и набор ответов к ним, а в ходе работы выдает студенту тест и проверяет совпадение с ответом. Напротив, в тренажер заложены алгоритмы решения каждой задачи, поэтому каждый раз генерируется уникальное задание и осуществляется его решение, а затем ответ студента сверяется с ответом системы. Преимущество этого варианта в том, что нельзя обойти систему путем составления базы вопросов-ответов. Каждую вновь сгенерированную задачу приходится решать с нуля.
Вопрос о выборе языка и технологии разработки тренажера не стоял. Надо обеспечить заочникам и отстающим возможность сдавать работы, не выходя из дома. Поэтому только веб-приложение, а следовательно, PHP как самый удобный для меня язык. СУБД — MySQL.
Дисциплина, по которой мне потребовалось проверить практические работы, называется «Информационный поиск». Задачи — из книги Кристофер Д. Маннинг, Прабхакар Рагхаван, Хайнрих Шютце. Введение в информационный поиск. Необходимость обработки естественного языка усложнила дело.
Прежде всего надо было составить коллекцию документов, из которой будут генерироваться задания. Начала со словаря русских пословиц, но пришлось отказаться от этой идеи из-за сложности морфологического анализа русского языка и взять такой же англоязычный словарь, оговорив при этом в задании, что различные морфологические формы слова считаются разными словами, и указав регулярное выражение, в соответствии с которым проверяющий скрипт будет разбивать предложения на слова.
Для многих задач непростым делом оказалась и генерация исходных данных. К примеру, построение инвертированного индекса коллекции документов требует, чтобы пословицы, использующиеся в качестве таких «документов», имели по нескольку общих слов между собой. Иначе задачу будет неинтересно решать. Поэтому пришлось придумать целый алгоритм: выбрать случайное слово, найти все пословицы, в которых оно употребляется, попарно сравнить их, посчитать для каждой пары количество общих слов и записать в результат те пословицы, где это количество превышает заданный порог. Если в получившемся списке элементов меньше, чем другой заданный порог, то начать все сначала. Понятно, что на лету такие вещи генерировать сложно, поэтому пришлось заодно проиндексировать все пословицы, разбив их по словам и записав результат в базу данных. Сложно? И такой алгоритм пришлось придумать едва ли не для каждого задания!
Форма записи ответа — тоже не всегда тривиальный вопрос. Порой для ответа достаточно записать число или строку, но эти число или строка легко просчитываются на глаз и не требуют применения каких-либо формул. А проверить-то нужно именно знание формул! Поэтому форма записи ответа варьировалась. Где-то обычный textbox, где-то textarea. А вот для задачи вычисления расстояния Левенштейна между двумя словами пришлось вывести целую матрицу, поскольку важно проверить, что студент понял алгоритм расчета.
Что касается порядка работы с тренажером, то для получения доступа к заданиям требуется регистрация. Залогинившийся пользователь видит список всех работ и всех задач, причем те задачи, которые он сдал, даже отображаются без гиперссылки — к ним доступ запрещен.
Исправления ошибок не предусматривается — при каждом обращении к заданию скрипт генерирует его заново.
Расскажу теперь о том, как студенты восприняли такую систему контроля их знаний. На первых порах много нервов вызвала необходимость перерешивать задачу заново при малейшей ошибке. Вскоре были найдены два способа обойти это обстоятельство. Первый — использовать браузер Opera, в котором при нажатии кнопки «Назад» восстанавливалась вся страница целиком вместе со старым заданием. Второй — подменять post-запрос, в котором отправлялся на проверку не только ответ студента, но и задание, в скрытых элементах html-формы. Через пару занятий студентов озарило, что можно использовать подмену post-запроса для отправки не своего старого задания, а чужого. Таким образом научились списывать даже тут.
Впрочем, списывали не все, да и в любом случае одно-то решение точно надо сделать, хоть и на несколько человек. Поэтому вид компьютерного класса на наших практиках представлял собой замечательную картину напряженного умственного труда всех учащихся.
Для просмотра успеваемости я сделала скрипт, который выводил список сданных задач, отсортированный либо по убыванию даты-времени, либо по студентам.
Теперь можно было открыть этот список в воскресный день и увидеть, что пока ты отдыхаешь, твои студенты продолжают сдавать задачи.
Какие выводы можно сделать из этого опыта? Конечно, тренажер нуждается в совершенствовании. Нужно ограничить число попыток сдачи задания и предотвратить возможность подмены исходных данных. Я решила, что в этом семестре буду только наблюдать за процессом сдачи/обхода/взлома (мало ли) системы и ничего не буду исправлять. В дальнейшем думаю приспособить этот тренажер и для других дисциплин — везде, где есть задачи.
К сожалению, проверять таким же способом программный код, написанный студентами на лабораторных работах, едва ли получится. Тут мог бы использоваться разве что метод черного ящика, как на олимпиадах по программированию ACM/ICPC. Но тогда надо искать способы проверки работ на плагиат. Кроме того, никакая программа не заменит преподавателя-человека.
Вот, собственно, и все. Спасибо тем, кто прочел статью до конца. Жду комментариев, замечаний и советов.
Потестировать тренажер можно здесь: science-search.ru/ir_students Логин: test, пароль: test.
Комментарии (11)
GlebkaF
07.10.2015 08:59Очень советую добавить стилей, работы на час, зато как преобразится ваш тренажер. Из курсового проекта, в боевой продукт. И студенты сразу обрадуются, что им тесты современно оформленные дают, а не голый html 1995 года выпуска.
Кстати, все вопросы можно генерировать перед началом теста, что бы к вопросам всегда можно было вернуться, и исправить ошибку.Ioanna
07.10.2015 09:12Да, недостает дизайна и меню.
Что касается вопросов, то я подумываю сохранять задание, случайным образом сгенерированное для конкретного студента, в базу данных, тогда вернуться будет можно, а вот подменить — нельзя.ColorPrint
07.10.2015 16:03Чем не угодили готовые решения, тот же Moodle например? )
Ioanna
07.10.2015 16:12А там можно запрограммировать свои формы ввода ответа и алгоритмы его проверки?
ColorPrint
07.10.2015 16:14Да. Активно используем его в учебном процессе, и даже собственные модули для тестирования допиливали.
Проверка ответа на регулярных выражениях.
Stas911
07.10.2015 15:50В бытность мою студентом, нужно было сдавать зачет по одному из предметов на компьютерном тренажере (в конце 90х это еще редко было). Так вот этот тренажер, несмотря на все предосторожности, был в итоге успешно слит с одной из кафедральных машин по сети, найдет алгоритм кодирования в его недрах правильных ответов и т.д. Однако в процессе взлома пришлось СТОЛЬКО с этим тренажером повозиться, что безо всяких шпаргалок, предмет был выучен и сдан в итоге :)
stavinsky
К моему стыду ни разу не слышал про расстояние Левенштейна. Было приятно узнать что-то новое. А Вам — успехов в нелегком труде. И советую использовать какой-нибудь framework, возможно развитие пойдет легче, а у студентов будет чуть меньше шансов на нечестную работу с приложением.
Ioanna
Спасибо за совет!