Работа преподавателя, кроме чтения лекций, включает довольно много рутины, например, проверку выполненных домашних заданий. И если вопросы в домашке не сводятся к простым однозначным ответам, а подразумевают выбор правильного подхода, реализацию алгоритма и написание кода, на это уходит значительное время.  Один из наших преподавателей магистерской программы "Разработка программного обеспечения" сделал инструмент для автоматизации этого процесса, чем-то напоминающий классическое юнит-тестирование. В  качестве интерфейса в этом инструменте используется бот в Telegram, а проверка выполняется скриптами на Python с учетом особенностей задачи, что сильно отличает его от большинства аналогов в open source. Под катом расскажем, что в этом инструменте особенного и как студент может получить бан. Традиционно домашние задания в большинстве курсов проверяются вручную. Как правило, домашняя работа ― это три-четыре задачи для каждого студента, так что объем работы немаленький. На курсе по ML в ИТМО работает несколько практиков, в обязанности которых входит изучать решение задачи, предложенное студентом, смотреть код, запускать его и выносить вердикт ― ставить оценку и отправлять фидбэк. Поскольку кроме этой проверки у практиков есть еще много других задач, добирались они до сданной домашней работы не сразу. Так что фидбэк зачастую приходил студентам с задержкой, а значит, и исправлять задания было сложнее ― они уже успевали забыть контекст задачи, приходилось погружаться в нее заново. Сложность заключалась в том, что оценку домашнего задания нельзя на этом курсе свести к простой проверке ответов. Каждую из задач можно решать несколькими разными способами, и преподаватель должен оценить ход мыслей студента, увидеть, что он разобрался в алгоритме. Поэтому различные инструменты, проверяющие вывод и скорость работы реализованного модуля, не подходили. Но преподаватель курса «Машинное обучение» на магистерской программе «Разработка программного обеспечения» и главный аналитик данных Ассоциации «Искусственный интеллект в промышленности», созданной при поддержке «Газпром нефти», Олег Свидченко, реализовал свой инструмент для проверки в формате телеграм-бота. Формат бота был выбран не случайно. Решение с собственным веб-интерфейсом потребовало бы регистрации домена и развертывания на отдельном сервере со стационарным IP-адресом. В рамках решаемой задачи это сложно, да и не нужно. А с ботом в Telegram удалось ограничиться персональным компьютером. Фактически бот ― это интерфейс для студентов. С помощью его команд можно сдать одну или несколько задач из домашки, посмотреть свои результаты по уже сданным задачам (с комментариями), а также узнать общие баллы за курс. Помимо непосредственно бота решение включает: систему хранения данных, где содержится информация о студентах, задачах и их решениях. тестирующую систему, в которой создается воркер, обеспечивающий непосредственно проверку сданного решения. Изначально идея автоматизации проверки заданий возникла на другом курсе ― по обучению с подкреплением в ВШЭ. Первая версия бота заработала именно там около двух лет назад. Она была написана на Python с использованием API Telegram для хостинговых ботов. Для курса по ML Олег разработал следующую более функциональную версию, которая поддерживает все особенности программы обучения: мягкие дедлайны ― в рамках курса на задачи дается, допустим, неделя - это мягкий дедлайн, в рамках которого рекомендуется все решать; если студент не уложился в этот срок, у него есть еще пара недель до жесткого дедлайна, после которого прием решений заканчивается. тестовые группы для каждого домашнего задания ― это значит, что не обязательно разом сдавать все задачи, входящие в задание (как это было раньше на курсе по обучению с подкреплением); можно отправлять боту их по одной. соревнования ― на одном из курсов у студентов есть соревновательные задачи, где баллы выставляются в зависимости от положения решения в лидерборде. Бот умеет распараллеливать проверку, используя встроенный в Python мультипроцессинг. На данный момент настроен запуск до трех параллельных потоков, и все это работает относительно быстро (задачи делать все максимально быстро не стояло ― в этом просто нет необходимости). При необходимости большее количество потоков можно обеспечить, поменяв настройки в конфигурации. Единственный способ реализовать на практике глубокую проверку именно кода студенческого решения ― писать для него полноценные unit-тесты. Что и было реализовано. Тестирующая система запускает воркер для проверки сданного решения, который создает временную директорию, копирует в нее файлы, необходимые для тестирования, а также файлы самого решения. Далее он смотрит доступные метрики решения, например ответ (если он предусмотрен) или итоговую точность, а также запускает заранее написанные тесты. Каждый такой тест ― не просто файл с набором входных и выходных данных, а отдельный скрипт на Python, который проверяет решение с учетом особенностей задания (например, проверяется размерность весов модели, качество регуляризации, работа отдельных методов). Так можно оценить решение, когда к одной и той же проблеме можно подступиться с нескольких сторон, но важно, чтобы студенты реализовали именно тот алгоритм, который нужно. Этим бот отличается от большинства опенсорсных “проверятелей” для курсов по программированию и алгоритмам, в том числе заточенных на олимпиадный формат. В среднем на тестирование одной задачи уходит 10-15 секунд. За это время успевают отработать как unit-, так и нагрузочные тесты. Если в ходе тестирования ошибок не выявлено, а метрики соответствуют ожидаемым, задача сдана. Студент получает через сообщения в Telegram общий объем баллов. В случае, когда ошибок нет, но метрики не соответствуют, задачу надо будет доделать, а из комментария студент сможет понять, что с ней не так. Если решение падает с ошибкой, сдающему, кроме комментария, отправляется анонимизированный стектрейс. Кстати, анонимизацию добавили не так давно вместе с проверкой на запрещенные импорты, поскольку студенты попытались взломать бот. До этого момента автоматизированная проверка существовала на базе “джентльменского соглашения”, что бот обеспечивает ускоренную обратную связь по задачам, но за это его никто не пытается ломать. Однако нашлись студенты, нарушившие это правило: один попытался получить исходный код тестов, чтобы подогнать под них свое решение, но не смог, а второй прокололся как раз на том, что пытался получить очень длинный стектрейс и не рассчитал его объем. Теперь в заданиях запрещено выбрасывать в коде exception и импортировать запрещенные библиотеки, а стектрейс в ответ отправляется в анонимизированном виде. Тому, кто попытается снова, грозит бан по всем домашним заданиям. Сами задачи бот проверяет в полностью автоматическом режиме. Но преподаватели все еще открывают полученный код в ручном режиме, поскольку инструмент не имеет встроенного выявления списывания. А  заимствование опытному человеку быстрее и проще выявить глазами, нежели конструировать для нее сложные правила обнаружения. При этом проверка на списывание не требует больших усилий, так что это все равно выигрыш во времени. Телеграм-бот существенно ускорил проверку домашнего задания и упростил жизнь как студентам, так и преподавателям-практикам. Это не rocket science, но намного более гибкий и легко настраиваемый инструмент, чем большинство аналогов, выложенных в open source. Сейчас инструмент используется не только на курсе "Обучение с подкреплением" в ВШЭ, но и в магистратуре ИТМО (курс "Введение в машинное обучение), а также на курсе "Прикладное обучение с подкреплением" VK MADE. Возможно, ботом заинтересуются и другие коллеги Олега из ИТМО. Не исключено также, что в будущем код бота автор выложит в открытом доступе.