В этом году случилось уникальное событие — для большинства школьников России школьный этап всероссийской олимпиады школьников по информатике проводился по едиными правилам, общим комплектам задач (всего было 4 варианта заданий на всю страну), с использованием тестирующей системы.
Организация
Организационной стороной занимался образовательный центр "Сириус", который взялся провести школьный этап всероссийской олимпиады по шести предметам — математике, информатике, физике, химии, биологии, астрономии. В прошлом году уже была апробация для шести регионов, в этом году всем желающим регионам было предложено принять участие. Согласились почти все — проще перечислить регионы, которые не участвовали (по убыванию численности населения): Московская область, Красноярский край, Вологодская область, Алтайский край, Омская область, Республика Крым, Пермский край, Пензенская область, Тверская область, Забайкальский край, Амурская область, Республика Марий Эл, Республика Карелия, Новгородская область, Республика Хакасия, Республика Ингушетия, Республика Алтай, Чукотский автономный округ, Ненецкий автономный округ. Я не включил в этот список Москву — хотя она и не участвовала в школьном этапе, проводимом Сириусом, но всё равно школьный этап для Москвы проводился по тем же заданиями и тем же правилам. На самом деле наоборот — правила и принципы составления задания были взяты московские, и московский формат проведения школьного этапа олимпиады был применён на всю страну.
Всего вместе с Москвой участвовало свыше 80% регионов России (если считать по численности населения).
Все регионы были разбиты на четыре группы, примерно равной по численности населения, расположенные примерно в одних часовых поясах. Первая и вторая группа — это московский часовой пояс, третья группа — это MSK+1 и MSK+2, четвёртая группа — от MSK+4 до MSK+9. Тут я (и многие коллеги) впервые узнали, что в зоне MSK+3 находится всего лишь один регион — Омская область, которая не участвовала в проекте. Для каждой группы был установлен свой день проведения — с 26 по 29 октября.
Авторы заданий
Задания разрабатывал большой коллектив авторов, разбитый на четыре рабочие группы. Огромная благодарность всем авторам за то, что они сделали четыре хороших комплекта заданий. Также отдельное спасибо MikeMirzayanov за систему полигон, которая использовалась для подготовки всех заданий.
Логины для участия в олимпиаде распространялись по школам через ФИС ОКО (федеральная информационная система оценки качества образования), доступ к которой есть у всех школ. Школам выдавались логины по числу учащихся +10% запаса. Регламент проведения олимпиады предусматривал возможность участия с 8 до 20 часов по местному времени, реально же возможность участия была от 8 утра в самом раннем регионе до 20 часов в самом позднем.
Содержание заданий
Олимпиада проводилась для 5-11 классов по формату заданий, принятому в Москве в последние годы.
Для 9-11 классов предлагалось 5 задач по программированию на двухчасовой тур. Примерный план варианта — формула (целочисленная арифметика), задача на использование if, задача на цикл, задача на массив, идейная задача. Система оценивания — потестовая, все тесты независимые, хотя в условия и выделяются подзадачи по ограничениям или частным случаям, но групп тестов и зависимостей между тестами нет. Задачи доступны в тренировках: первая группа, вторая группа, третья группа, четвёртая группа.
Для 7-8 классов предлагается смешанный вариант. Статистика показывает, что лишь небольшая часть школьников 7-8 классов, участвующих в олимпиаде умеет программировать (например, статистика этого школьного этапа — около 10% участников сдавало задачи по программированию), поэтому участникам предлагается 4 задачи с вводом ответа и 3 задачи по программированию. Задачи с вводом ответа — это по-сути output-only задачи, которые, скорее всего, можно решить без использования компьютера. Ответ на них нужно записать в поле ввода ответа. Это похоже на формат олимпиад по математике в дистанционной форме, но благодаря чекеру можно выставляють произвольные баллы за решения, например, оценивать алгоритм для исполнителя по числу использованных команд. Об этом формате проведения олимпиады было опубликовано несколько статей. При этом считает, что 7 задач много для тура, а школьники могут выбирать понравившиеся задачи, поэтому оцениваются только 5 задач из 7 с наилучшим результатом. Продолжительность тура — 2 часа.
При этом сильные программирующие школьники 7-8 классов могли писать олимпиаду за 9 класс.
Для 5-6 классов предлагается вариант без программирования, только из 5 output-only задач. Продолжительность тура — 45 минут.
Условия задач, решения, архивы и видеоразборы опубликованы: группа 1, группа 2, группа 3, группа 4.
Тестирующая система
Тестирующая система должна удовлетворять ряду требований: держать несколько десятков тысяч пользователей одновременно, справляться с проверкой задач по программированию (тут в пиковые моменты нужно было порядка 40 инвокеров, благо при составлении задач было требование не делать большое число тестов по задачам), поддерживать output-only задачи. И выполнить все эти требования одновременно вместе оказалось довольно сложно.
Для проведения дистанционных олимпиад по другим предметам Сириус использует собственную тестируюущую систему. Она специально была разработана для проведения подобных мероприятий, поэтому там довольно просто реализован механизм входа и регистрации (вместо пары логин-пароль используется один "ключ", затем нужно ввести фамилию-имя, затем можно переходить к олимпиаде) и умеет держать нужную нагрузку. В ней уже есть поддержка задач по программированию и проведены соревнования на несколько сотен участников, однако, на соревнованиях по программированию на тысячах участников система ещё не использовалась. Кроме того, поддержка output-only задач в настоящий момент не достигла нужного нам уровня, например, нет возможности выставлять в качестве оценки за решение произвольное число от 0 до 100.
Codeforces хоть и умеет держать нужное количество пользователей (если считать число участников Div.3 раундов, которое превышает 20.000, что примерно нам и нужно), но совсем не поддерживает output-only задачи.
Яндекс-контест мы пробовали использовать в прошлом году в ходе пилотного проведения школьного этапа для нескольких регионов, с его помощью можно добиться желаемого формата проведения олимпиады, однако, это довольно сложно сделать. Например, ввод фамилии-имени участника при регистрации осуществлялся при помощи добавления в контест "нулевой" задачи, без сдачи которой нельзя перейти к следующим задачам, а это усложняет подведение результатов (нужно отдельно выгружать архив сабмитов, считывать его программно и сливать с таблицей результатов). Задачи вида output-only приходится проверять повторно после окончания тура с подменой чекера. Все массовые операции вида "создать пользователей", "выгрузить архив решений", "провести перетестирование" требуют привлечения поддержки и занимают очень много времени. Наконец, у Яндекс-контеста при переходе его на новый уровень нагрузки могут вылезить проблемы в неизвестных ранее местах, так, например, год назад 20 тысяч одновременно пытавшихся открыть страницу Яндекс.контеста пользователей полностью положили его. Допустить что-то подобное на мероприятии такого уровне не хотелось бы.
Поэтому использовался ejudge, который много лет использовался для проведения олимпиад в Москве.
ejudge, разумеется, имеет большое число недостатков, связанных прежде всего с тем, что система разрабатывается более 20 лет и её архитектура соответствует взглядам 20-летней давности. При разработке ejudge просто не закладывалась идея, что в контесте могут быть десятки тысяч одновременных пользователей и сотни тысяч пользователей всего. Все пользовательские запросы, например, обрабатываются процессом ej-contests, который работает в один поток и никак не распараллеливается. Поэтому, кажется, предел возможностей ejudge — это около 4000 одновременных пользователей на мощном компьютере, при большем числе пользователей ej-contests уже не успевает обрабатывать запросы пользователей.
В ejudge плохо организована работа с базой пользователей, например, запуск контеста (и выполнение действия reload config files) влечёт считывание всей базы пользователей в память, что занимает ощутимое время и требует оперативной памяти для хранения ненужной базы пользователей.
Год назад в результате возникших проблем с добавлением пользователей в коде ejudge мною были найдены вшитые ограничения:
#define EJ_MAX_USER_ID 999999
#define MAX_USER_ID_32DIGITS 4
Последняя строчка ограничивает размер поля для хранения USER_ID 20 битами. При этом для проведения школьного этапа в этом году было сгенерировано порядка 10 миллионов логинов в систему. При этом сразу же после проведения тура все "неиспользованные" логины
Но при этом ejudge проверена и предсказуема. Известно, что один сервер ejudge может держать 3000 одновременных пользователей, и дальше можно распределить нагрузку можно созданием отдельных серверов так, чтобы на каждый из них приходилось не более 3.000 одновременных пользователей (и около 15.000 пользователей за день проведения тура).
Поэтому для проведения олимпиады использовалось несколько фронт-енд серверов.