Разработка системы проверки домашних заданий (ручная/автоматическая) для LMS
Проверка домашних заданий — узкое место любой LMS при росте числа студентов. Преподаватель физически не успевает проверить 500 работ за 24 часа. Решение: автоматическая проверка там, где это возможно, и оптимизированный интерфейс для ручной проверки там, где автоматизация невозможна.
Ручная проверка: интерфейс преподавателя
Интерфейс проверки должен минимизировать переключение контекста. На одном экране: работа студента слева, форма оценки справа.
Компоненты интерфейса:
- Список непроверенных работ с фильтрами (по заданию, группе, дате)
- Просмотр ответа студента (текст, файл inline или ссылка)
- Рубрика оценивания с чекбоксами (если заданы критерии)
- Поле оценки и текстовый комментарий с поддержкой Markdown
- Кнопки: «Принять», «Вернуть на доработку», «Следующая работа»
- Inline-аннотации на PDF (если работа в формате PDF)
Пакетная проверка — для quiz-типа заданий с правильным ответом: преподаватель видит список всех работ с ответами в таблице и может проставить оценки пачкой.
Автоматическая проверка
Quiz / тесты с закрытыми вопросами:
async function autoGradeQuizSubmission(submissionId) {
const submission = await db.submissions.findOne(submissionId, {
include: ['assignment.questions']
});
let totalPoints = 0;
let earnedPoints = 0;
const results = [];
for (const question of submission.assignment.questions) {
totalPoints += question.points;
const studentAnswer = submission.answers[question.id];
const isCorrect = checkAnswer(question, studentAnswer);
if (isCorrect) earnedPoints += question.points;
results.push({
questionId: question.id,
correct: isCorrect,
studentAnswer,
correctAnswer: question.correctAnswer,
});
}
const score = Math.round((earnedPoints / totalPoints) * submission.assignment.maxScore);
await db.submissions.update(submissionId, {
status: 'graded',
score,
autoGradeResults: results,
gradedAt: new Date(),
});
await notifyStudent(submission.studentId, submissionId, score);
}
Проверка кода через тесты:
Для курсов программирования — sandbox-выполнение кода студента против набора тестов. Используем изолированные контейнеры:
async function runCodeTests(submissionId, code, language, testCases) {
const result = await dockerRunner.run({
image: `lms-runner-${language}:latest`, // python:3.11, node:20, etc.
code,
tests: testCases,
timeout: 10000, // 10 секунд
memoryLimit: '256m',
networkDisabled: true, // Нет сети в sandbox
});
return {
passed: result.passedTests,
total: testCases.length,
output: result.stdout,
errors: result.stderr,
executionTime: result.durationMs,
};
}
Проверка на плагиат:
Для текстовых работ — интеграция с Unicheck или MOSS (для кода). Собственная реализация: TF-IDF векторизация + cosine similarity между всеми работами в группе.
Workflow статусов
submitted
↓ (auto-grade или manual)
reviewing
↓ преподаватель открыл работу
graded → уведомление студенту
returned → студент получает уведомление, может доработать
↓ повторная отправка
resubmitted → снова в reviewing
Уведомления
| Событие | Кому | Канал |
|---|---|---|
| Работа отправлена | Преподаватель | Email + in-app |
| Дедлайн через 24ч | Студенты без сдачи | |
| Работа проверена | Студент | Email + in-app |
| Работа возвращена | Студент | Email + in-app |
| Очередь > 20 работ | Преподаватель | Email (digest) |
Метрики проверки
Для администратора: среднее время проверки одной работы, бэклог непроверенных работ по преподавателям, процент автоматически проверенных.
Сроки
Интерфейс ручной проверки с рубриками и аннотациями — 5–7 дней. Автоматическая проверка quiz и тестов — 3–4 дня. Code sandbox с Docker-runner — 5–7 дней. Антиплагиат — 3–5 дней.







