Автопроверка, крепкий «Эрл Грей» и 120 скриптов на Python

f616a56dc84e99a01ea1be4477f7226d.jpg

Знакомьтесь, это господин Вопросов. Он носит очки-половинки, как Дамблдор из книг о Гарри Поттере. Каждый день ровно в пять вечера пьёт крепкий чай — предпочитает «Эрл Грей». А ещё читает эссе Бродского в оригинале.

Господин Вопросов узнал, как в видеокурсе Слёрма «CI/CD на примере Gitlab CI» работает автопроверка, и собирается нам об этом рассказать. Зачем нам это знать? Ну во-первых, господину Вопросову не терпится рассказать — у него уже загорелись глаза и вспотели ладони. Он очень хочет поделиться этими невероятными знаниями. Во-вторых, там довольно интересная история, в которой замешаны 120 скриптов на Python и парочка функциональностей на Ruby. В-третьих, всегда приятно послушать умного человека и узнать что-то новое.

Так что просим вас, досточтимый господин Вопросов. Расскажите нам, пожалуйста, всё об автопроверке в мельчайших подробностях.

Была ли жизнь до автопроверки

Кхе-кхе. Автопроверка — это механизм, который автоматически проверяет практические задания студентов. До него учащиеся курса по CI/CD тоже могли автоматически проверить домашку, но проверка была более лайтовая и менее информативная. Студент делал практику на учебном стенде, затем на учебной платформе Слёрма вносил результат в поле для ответа. Дальше нажимал кнопку «Проверить» и получал короткий вердикт «Верно» или «Неверно».

Хорошо, что такая возможность вообще была. Но всё же у неё имелись существенные недостатки:

  1. Если ответ на задание был неверным, студенту приходилось самому разбираться, на каком этапе решения он ошибся. Эх как представлю: сидишь такой и каждый шаг задания перепроверяешь по пять раз, ищешь ошибку. А таких шагов 10. Время бежит, а ты всё ищешь и ищешь. Уже весна наступила. Светка из соседнего подъезда, которую на свидание хотел позвать, замуж вышла. А ты всё проверяешь. Аж слеза скупая навернулась. В общем, такая проверка была долгой и непродуктивной.

  2. Если ответ получался верным, но в самом решении имелись недочёты, студент об этом не знал и никак не мог узнать. Может, оно и хорошо. Говорят, меньше знаешь, крепче спишь. Но я считаю наоборот. Правильный ответ можно получить совершенно по-разному. Например, четыре — это и два плюс два, и пять минус один, и много ещё как. С точки зрения математики — это ок. При настройке пайплайнов тоже возможны разные варианты, но некоторые из них могут всё сломать на продакшене. Лучше о неверных решениях знать заранее и не использовать их в практике, чтобы потом из умнички не превратиться «в чудика криворукого, из-за которого компания 100500 тыщ потеряла».

Разработчики учебной платформы Слёрма знали об этих минусах автоматической проверки и хотели её доработать.

Автопроверка заданияАвтопроверка задания

Как придумали автопроверку

Менделееву его периодическая система элементов приснилась. Ньютон открыл свой знаменитый закон всемирного тяготения, увидев, как падает яблоко.

Когда придумывалась автопроверка, особого экшена не было. Собралась команда из нескольких разработчиков. Взяли практическое задание из курса по CI/CD. Каждый разработчик написал для него свой вариант решения. Потом из отдельных вариантов сложили общий алгоритм проверки для этого задания. И так сделали для каждой домашки.

Для реализации механизма автопроверок выбрали Python. Буквально за 4 дня написали 120 проверочных скриптов и приложение, которое их запускает.

Дальше оставались пустяки — «подружить» автопроверки на Python с учебной платформой Слёрма на Ruby. Кажется, я слышу вопрос из зала: «А почему проверочный механизм писали не на Ruby?» Хороший вопрос, незнакомец! Реализовать автопроверки на Ruby — сложно и долго: пришлось бы тянуть множество разных зависимостей. Гораздо легче было сделать на Python, а потом придумать, как это всё соединить.

Мир, дружба, Ruby и Python

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

На учебной платформе Слёрма уже была функциональность на Ruby, которая выводила консоль. На этой консоли кодом показывалось, что происходило на сервере, когда студент решал задание на учебном стенде. Ребята-разработчики решили использовать этот механизм для вывода результатов автопроверки и немного переписали её код.

В общем, теперь этапы автопроверки выглядят так:

  • Выполнив задание, студент нажимает внизу страницы на кнопку «Отправить». Данные отправляются в приложение на Ruby.

  • Оно принимает сигнал и ищет в базе данных скрипт на Python, ассоциированный с заданием, в котором нажали на кнопку. Скрипт для каждого задания предварительно в админке указала техподдержка Слёрма.

  • Приложение на Ruby по протоколу SSH запускает нужный скрипт на Python и передаёт ему решение студента.

  • Скрипт проверяет решение. В скрипте содержится обращения к разным системам (GitLab, Kubernetes), с которыми студент должен взаимодействовать, выполняя определённое задание. Скрипт последовательно опрашивает все эти сервисы, что в них происходило, пока студент выполнял задание. Создал ли учащийся пайплайн? Закоммитил ли его в нужную ветку?

  • Результат проверки каждого шага скрипт передаёт другому приложению на Ruby, а оно выводит итог в отдельном окне: «пройдено», «не пройдено», «в целом да, но лучше было бы сделать по-другому». Насчёт последнего вариант ответа — разработчики научили автопроверку иногда давать рекомендации. Но эта возможность ограничена.

  • Кроме каждого шага скрипт проверяет конечный результат, то есть оценивает, получил ли студент тот итог, который требовался в задании. Например, если учащийся должен поднять приложение в Кубе, то крипт смотрит: приложение поднялось или нет? Да — красава, нет — тоже красава, но почитай документацию или пересмотри урок.

Как выглядит автопроверка практического заданияКак выглядит автопроверка практического задания

Веселье и эксперименты

С автопроверкой на видеокурсе по CI/CD стало сильно веселее. Студентам больше не нужно самим себя проверять. Они выполняют задание, нажимают на кнопку «Отправить» и меньше, чем через 10 секунд, видят результат. Если всё сделано верно — радуются и идут дальше. Если в решении есть недочёты — пересматривают конкретные места урока и лучше разбираются в теме.

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

***

За сим господин Вопросов прощается с вами. Как раз 5 o«clock — время вечернего чая. Несите «Эрл Грей».

© Habrahabr.ru