Соревнования по программированию на платформе All Cups
Привет, мир! Сегодня мы поговорим про спортивное программирование с Дмитрием Санниковым (@sannikovdmitry), CTO образовательных проектов Mail.ru Group и руководителем платформы All Cups. Это интервью написано по мотивам выпуска подкаста «Пятиминутка PHP».
Дмитрий, что такое All Cups?
Это большая международная платформа для IT-специалистов, на которой мы в онлайне проводим крупные IT-соревнования, конференции и образовательные курсы. То есть всё то, что помогает развиваться IT-специалистам.
На вашем сайте для некоторых чемпионатов указаны ссылки на внешние сайты. То есть All Cups — это что-то вроде «Кинопоиска» для внешних мероприятий, или вы и на самой платформе их проводите?
Мы проводим всё на платформе. Просто раньше у нас было больше 10 отдельных порталов для разных чемпионатов с разными механиками. А год назад мы решили создать единую площадку с общим инструментарием. Мы ещё в процессе переноса всех данных, и упомянутые тобой ссылки на старые порталы мы скором уберём, а порталы отключим. Наши посетители смогут решать старые и новые задачи уже на All Cups.
Вы сами придумываете и организуете чемпионаты, или вы лишь предоставляете платформу, а мероприятия организуют другие инициативные группы?
Мы можем как просто предоставить платформу, так и взять на себя организацию под ключ, от создания лендинга до придумывания крутых задач. Вообще визитная карточка платформы — это интересные задачи. Мы считаем, что мы одни из лучших организаторов таких мероприятий. У нас в команде есть инициативные группы по придумыванию задач для самых разных специалистов из России и других стран. К тому же много задач придумывают и сами участники соревнований, мы это с удовольствием поддерживаем.
Допустим, я хочу провести чемпионат по PHP, сам придумал классные задачи и хочу воспользоваться вами как платформой. Как мне это сделать?
Просто напишите мне или кому-нибудь из нашей команды. Мы обсудим твои идеи по привлечению участников, предложим что-то ещё. От этого будут зависеть условия сотрудничества.
Соревнования проводятся только в онлайне, или до карантина вы проводили и традиционные очные чемпионаты или хакатоны?
Я не слишком верю в хакатоны. Они хорошо объединяют людей, но у них есть большой недостаток: в них обычно участвуют жители тех городов, где проводятся хакатоны. И в основном это москвичи. А мы хотим делать соревнования, в которых можно принять участие из любой точки мира, поэтому ориентированы на онлайн. Хотя и офлайн-мероприятия тоже поддерживаем, такие, на которых поощряется общение, нетворкинг.
Во многих чемпионатах на вашей платформе есть призовые фонды. Откуда они берутся? Вы ищете спонсоров, или спонсирует Mail.ru Group?
На платформе All Cups проводятся соревнования как от Mail.ru Group, — и тогда компания предоставляет призовой фонд, — так и от других компаний, и тогда они берут задачу награждения на себя. Спонсоров мы не ищем.
Поговорим немного про технологии. У тебя есть какая-то статистика, на каких языках обычно пишут участники чемпионатов? Например, я слышал, что С++ наиболее популярный язык для спортивного программирования. Но у вас есть разные категории: машинное обучение, искусственный интеллект и другие.
Мы стараемся придумывать задачи, которые требуют высокой производительности. Не быстрого написания кода, а обработки огромного количества данных. При этом соревнования длятся в среднем месяц. Поэтому участники выбирают те языки, которые лучше помогают решать поставленные задачи, те же С и С++. Кто-то пишет на Python, хотя его сложно отнести к высокопроизводительным языкам, но он удобен с точки зрения построения логики. Очень популярен Java, часто используется Rust и Go. Некоторые участники пишут на PHP, Perl и даже на ассемблере. У нас были программисты, которые на соревновании писали велосипед, но этот велосипед показывал очень хорошие результаты. Конечно, выбор языка отражает популярность какого-то стека технологий, но многое зависит от крутизны специалиста.
То есть вы готовите интеграционные библиотеки, а-ля SDK, чтобы можно было запустить на платформе решение участника на одном из языков, который вы поддерживаете?
Всё верно. По сути, мы пишем local runner на разных языках. Это виртуальная среда, которую даже устанавливать не нужно, просто запускаешь и пишешь программу на поддерживаемом языке, который подключается по API к этой виртуальной среде. Таким образом ты отлаживаешь свой код, свои алгоритмы.
Мы считаем, что такая реализация очень хороша с точки зрения методологии. Иногда люди даже пишут свой local runner на наших исходниках, когда кому-то не хватает возможностей нашей версии. Кто-то даже полностью переписывает наш local runner, и справляется с этим за считанные дни.
Я локально запустил код, отладил свой алгоритм, а потом отправляю своё решение в облако? И там мое решение запускается на ваших серверах, начисляются баллы за правильность и скорость? В облаке у вас такой же local runner или что-то похитрее?
В облаке такой же, чтобы виртуальная среда была одинаковой. Участники могут загружать как исходный код, так и Docker-контейнеры. Например, на Russian AIl Cups сама среда — это контейнер, в игровой сессии участвуют 4 игрока — это ещё 4 контейнера, и взаимодействие между ними берёт на себя виртуальная среда. Игровой сервер обрабатывает все запросы игроков и начисляет каждому баллы.
Ты говоришь про многопользовательское соревнование, а как мне быть при локальной разработке? Ведь у меня должны быть какие-то соперники, боты. Вы их тоже пишете?
Да, мы пишем простые боты. Также ты можешь написать несколько стратегий самостоятельно, подключить их к local runner и они будут играть.
Как вы запускаете Docker-контейнеры, у вас развёрнут Kubernetes?
Удивительно, но «кубик» мы не используем. Хотя, конечно, подумываем об этом. Также мы не используем Docker Swarm. Мы написали свои оркестраторы на Django и Tornado. Они получают задачи по запуски таких-то игр в таких-то игровых сессиях. Django отправляет запрос на запуск контейнера в системе CodeRunner, которая делает это изолированно и безопасно. Мы далеко не всегда запускаем решения пользователей в облаке. Везде важна производительность, поэтому иногда лучше выделить отдельную машину на запуск какого-то решения, чем делать это в облаке, в котором производительность падает. CodeRunner, которая берет задачу от оркестратора, запускает контейнер с нужными параметрами, запускает другие необходимые контейнеры, например, игровой виртуальный мир, и соединяет их в единую сеть. Внутри неё контейнеры работают с игровым миром. Система получилась очень отказоустойчивая.
Недавно у нас проходило соревнование Gold Rush по высоконагруженным проектам. Было поле 3500×3500 в 10 этажей, на котором нужно было искать клады. Мы дали API и попросили разработчиков написать клиент, который ходит в игровой виртуальный мир, делает запросы по раскопке кладов, вытаскиванию их наверх и обналичиванию. Контейнерам мы выделяли определенные ресурсы и ограниченное время. То есть нужно было сделать высоконагруженный клиент, который умеет быстро работать с этой системой.
У нас была задача, при которой каждый загруженные в нашу систему контейнер мы запускали на целых 10 минут. А нам загрузили всего 10 тыс. контейнеров. Добавьте к этому контейнеры с виртуальной средой, и получаем 140 тыс. контейнеров по 10 минут. Мы их прогнали в течение месяца без Kubernetes.
Как у вас обстоит дело с безопасностью? Вас пытались взломать?
Нас много раз пытались взломать. Сам по себе контейнер не панацея, можно сделать такой контейнер, который зависнет в системе, или отключит хостовую машину. Кажется, вроде бы, оно изолировано, но на самом деле оно не изолировано. Поэтому у нас на CodeRunner настроено очень много обвязок и эвристик, которые не позволяют контейнеру выйти за пределы разрешённого оборудования. Мы очень много сил вложили в систему защиты, и сегодня нас пока никто не может взломать.
Чемпионат прошёл, победителей определили. Если это соревнование от Mail.ru Group, то что дальше? Вы приглашаете таланты на работу?
Задачи соревнований бывают разные: поиск талантов для найма, или поиск идей, которые можно использовать в продуктах компании. Либо с помощью соревнования мы стараемся создать образовательную среду для популяризации каких-нибудь технологий, того же Docker, например, с которым умеют работать не все и это до сих пор является порогом для участия в чемпионатах. Мы стараемся в своих соревнованиях находить баланс между задачами найма и популяризации. Последнее особенно важно, ведь без популяризации индустрия не будет развиваться.
Как Mail.ru Group оценивает работу команды All Cups? Какие перед вами ставят задачи, KPI?
Как у коммерческого направления у нас есть финансовые и продуктовые KPI, чтобы у платформы росло количество пользователей, чтобы было больше клиентов, чтобы у нас был определенный MAU. При проведении соревнований от Mail.ru Group мы должны добиваться релевантных откликов, это очень важно для компании. А как площадке для соревнований нам сложно обеспечить найм, потому что здесь очень много факторов.
Зачем обычному программисту участвовать в соревнованиях?
Всем надо участвовать в соревнованиях, начиная со школьных олимпиад. Даже если не получится занять какое-то место, всё равно это очень сильно расширит кругозор. Просто нужно находить интересные для себя соревнования. Мы стараемся проводить чемпионаты по разным специализациям и на разные темы, приближенные к реальной жизни.
Чтокасается обычных программистов, то каждому хочется расти в своём мастерстве. И чемпионаты очень в этом помогают, позволяя отойти от привычных рабочих задач и попробовать себя в новом направлении. Это уже не работа, а интересное хобби, общение с людьми из разных городов и стран. Ты можешь обменяться опытом, прокачать знания и навыки, найти новых друзей. У нас много примеров, когда на чемпионатах знакомятся и становятся хорошими коллегами. Ещё участие в чемпионате помогает о себе как-то заявить, улучшить свой имидж, написать статью или выступить на конференции. Какие-то знакомства на соревновании помогают найти себе работу. То есть причин для участия очень много. Нужно просто попробовать. Если не получилось в первый раз, оказалось сложно, то получится во второй, в третий раз. Главное, проникнуться.
Ещё на вашем сайте есть раздел «Курсы All Cups». Там пока одна ссылка, обучение программированию на С и С++. Ты кратко упомянул, что вы хотите вложить в этот проект образовательную часть. Расскажи подробнее.
All Cups — это бесплатная площадка для IT-специалистов. И мы хотим развивать учебные курсы по мотивам чемпионатов. Причём некоторые участники смогут в рамках этих курсов рассказывать, как они участвовали и как решали разные задачи. Мы сейчас записываем несколько курсов, которые потом разместим на платформе. Они помогут всем, кто ещё не участвовал в таких соревнованиях, разобраться в том, как у нас всё устроено. Конечно, будем рассказывать и о разных технологиях. Будет не только теория, но и практика, платформа позволяет это делать.
Это как бесплатный информационно-образовательный ресурс.
Да, всё верно.
Какие интересные мероприятия планируются у вас в ближайшее время?
Отслеживать можно на сайте или в нашем Telegram-канале. Скоро запустим VK Cup, проведём «Цифровой прорыв», онлайн-чемпионат по машинному обучению. Где-то в июле-августе пройдёт HighLoad. Ещё проведём соревнование, аналогичное paper-io, а также мини-чемпионат по искусственному интеллекту, на котором нужно будет программировать ботов. К концу года соревнований будет ещё больше, приходите и записывайтесь в любой момент.