Даниил!

Мы не используем ничего готового, потому что не нашли решений, подходящих к нашей задаче. Во‑первых, школьные тесты не показывают правильные и неправильные ответы, но красят в красный вопросы, в которых студент допустил ошибку. Во‑вторых, тесты обновляются и изменяются, не ломая предыдущие сдачи: если студент сдал предыдущую версию теста, то её и нужно оценивать и показывать. В‑третьих, под капотом тесты используют тот же движок, что и сайт: было бы мучительно использовать для тестов не Джейд (Паг), а XML или JSON.

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

Авторы помечают правильные ответы модификатором correct

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

  • ревизию теста,

  • текст и идентификаторы вопросов,

  • идентификаторы правильных и неправильных ответов.

Соответственно, сдача — это:

  • набор идентификаторов ответов, которые выбрал студент,

  • тест,

  • студент,

  • поток (например, «1 ступень 13 набора»),

  • дата сдачи,

  • дедлайн,

  • итоговый балл.

Когда студент открывает тест, бэкенд ищет подходящую ревизию: если студент уже сдавал тест, берём эту версию; если ещё нет — последнюю опубликованную. Когда ревизия найдена, бэкенд компилирует тест в ХТМЛ с ограничениями: вырезает комментарии автора, в которых могут быть намёки или пояснения, и информацию о правильных ответах.

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

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

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

P. P. S. Это был совет о веб‑разработке. Хотите знать всё о коде, тестах, фронтенд‑разработке, цеэсэсе, яваскрипте, рельсах и джейде? Присылайте вопросы.

Веб‑разработка
Отправить
Поделиться
Запинить

Рекомендуем другие советы