Михаил Мирзаянов, разработавший платформу Codeforces и участвующий в жизни Университета ИТМО в роли ассистента факультета информационных технологий и программирования, делится историей проекта и рассуждает о некоторых особенностях спортивного программирования.

Послушать беседу: Apple Podcasts · Яндекс.Музыка · Google Podcasts · PodFM · YouTube

Михаил Мирзаянов, основатель Codeforces
Михаил Мирзаянов, основатель Codeforces

Знакомство со спортивным программированием

Таймкод — 00:48

@dmitrykabanov: Хотел бы поговорить с вами о том, как вы пришли к спортивному программированию. Какие увидели для себя перспективы в этой области? Совпали ли ваши ожидания в начале пути с прогрессом в настоящий момент?

@MikeMirzayanov: Если грубо говорить, то да. Все отлично совпало. Я такой человек — склонен делать то, что нравится. В школе мне было интересно на уроках математики, информатики и программирования, но олимпиады позволяли еще и себе самому доказать, что ты можешь что-то решать и соревноваться с одноклассниками. Плюс — в этом была здоровая любознательность, хотелось больше понимать, как и что устроено. Этот процесс непрерывно продолжался. Постепенно появлялись знакомства с людьми, которые лучше ориентировались. С них можно было брать пример. Такие знакомые были и в школьные годы, и в Cаратовском университете их много — есть те, с кем я все еще общаюсь, дружу и сотрудничаю. Это очень интересные люди.

Однако помимо того что мне просто нравилось заниматься этой темой, я увидел практическую пользу. Незаметно для себя научился программировать, потом освоил не только задачки, но и «промышленный код», где, безусловно, пригодился и опыт спортивного программирования. Техника, работа без ошибок — все это помогает, а понимание специфики и в какой-то степени недооцененности спортивного программирования обществом — мотивирует меня и сегодня.

Дмитрий: Какой вы видите потенциал с точки зрения недооцененности этой темы?

Михаил: Просто сама идея competitive programming и «автоматизированного» обучения с помощью задач еще не так развита, как хотелось бы. Такой подход можно внедрять чаще. Он годится и для классических учебных процессов. Конечно, сейчас и мы в Codeforces знакомим достаточно большое количество людей с этой темой. Однако профессионализм в какой-то степени угас. Раньше соревнования были одним из немногих социальных лифтов: позавчера ты еще был школьником из заводского района непонятного города, а потом начинал заниматься и через несколько лет попадал в топовые компании к лучшим работодателям мира. Сейчас количество таких лифтов увеличилось — появились стажировки и хакатоны, но фокус оказался несколько размыт. Но это жизнь, и хорошо, что сейчас у людей есть множество альтернатив.

Зачем понадобился такой проект как Codeforces

Таймкод — 05:31

Дмитрий: Как внедрялись в процесс подготовки и проведения соревнований такие системы и ресурсы как Codeforces? Как вы поняли, что нужно делать такой продукт?

Михаил: Понял я это, когда закончил участвовать в ICPC и открыл для себя Topcoder еще в 2003–2004 году. По мере накопления опыта в ИТ я замечал, что какие-то вещи на подобных площадках можно было бы улучшить. Мое видение процесса часто не совпадало с тем, как все это было реализовано у других. Плюс — у Topcoder не было ряда «пластов» программирования, не было все это развито в формате экосистемы. В 2007-м году я решил заняться таким проектом, когда почувствовал, что мое видение того, что можно сделать, было достаточно целостным.

Дмитрий: Какие возможности она предлагала на старте? Что есть сейчас?

Михаил: Codeforces была запущена с достаточной функциональностью — сразу была возможность что-то комментировать, отвечать, ставить плюсы и минусы. Тогда не было соцсети для интересующихся программированием, да и сейчас сильных конкурентов нет.

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

Постепенно появлялась поддержка всевозможных форматов соревнований по программированию. Сейчас есть большое количество кружков, проводятся учебные занятия и официальные соревнования. Есть интеграция с системой Polygon, где авторы готовят задачи.

Ход развития сферы спортивного программирования

Таймкод — 10:30

Дмитрий: За десять с лишним лет пристального внимания к этой индустрии вы точно можете оценить прогресс по количеству соревнований в России и количеству участников, которые выезжают на зарубежные мероприятия от нашей страны.

Михаил: Все-таки то, что я сейчас скажу, будет моим внутренним ощущением. Оно может сильно отличаться от статистики. За десять лет «оффлайновых» соревнований стало больше, но рост этого направления уже позади. Был такой период, когда крупнейшие компании вкладывались в поддержку ряда состязаний, проводили свои мероприятия. Сейчас взгляд на этот формат эволюционирует, но количество участников от России — остается в общем тренде. В контексте десяти лет с точки зрения их численности произошел заметный рывок. Однако последние пять лет прошли гораздо спокойнее и без качественных изменений.

Дмитрий: Если смотреть с точки зрения сложности входа в эту сферу новичков, которые только-только подступаются к теме, появилось ли больше соревнований начального уровня? Или ступеней, которые позволяют плавнее подтягиваться к уровню топовых состязаний?

Михаил: Да, сейчас на это делают чуть больший акцент. Поэтому и количество людей, которые, так или иначе, знакомятся со спортивным программированием, выросло. В линейке ICPC появились дополнительные квалификационные этапы, рассчитанные на начальный уровень подготовки. Их проводят перед четвертьфиналами, чтобы увеличивать охват аудитории и демонстрировать задачи тем ребятам, которые по разным причинам не принимают участие в дальнейших этапах. На Codeforces мы несколько лет проводим соревнования третьего дивизиона, которые традиционно пользуются большой популярностью. Тут задачи достаточно доступные, и регистрируется существенное количество участников.

Личный опыт и работа с учениками

Таймкод — 14:58

Дмитрий: Как вы присоединились к сообществу ICPC? Каким был путь от участника соревнований до роли организатора?

Михаил: Когда я поступил в Саратовский университет, у нас были регулярные тренировки. Присоединился к ним с большим удовольствием на первом курсе и стал вникать. Мне сложно все это давалось — динамическое программирование, графы — не могу сказать, что сразу получалось и было легко. Но терпение и труд позволили дважды поучаствовать в финалах чемпионата мира. Потом стал помогать проводить соревнования, готовить участников. Еще получилось так, что Наталья Львовна Андреева, которая вложила душу в развитие этого направления в Саратовском университете, ушла из жизни. Не хотелось, чтобы ее усилия пропадали — было сделано очень много к тому моменту. Но и мой интерес к этой деятельности не менялся со временем. На первом курсе я участвовал в работе жюри школьных олимпиад, преподавал, вел кружки, потом уже участвовал в подготовке и проведении соревнований.

Сейчас я заинтересован в том, чтобы на платформе Codeforces все двигалось вперед, а в ICPC я вовлечен по двум направлениям. С одной стороны, я являюсь председателем жюри четвертьфинала в Саратовском университете, занимаюсь там организационными вопросами, участвую в жюри полуфинала и четвертьфинала в Санкт-Петербурге. С другой, постепенно обсуждаю возможное сотрудничество Codeforces и ICPC. Кстати, здесь еще есть место для развития сообщества «выпускников» и участников соревнований.

Дмитрий: Ваш пример прекрасно иллюстрирует то, как сообщество обеспечивает себя инструментами и сервисами для развития.

Михаил: В российском сообществе идея alumni пока не совсем работает. Мне кажется, что помощь и участие в жизни сообщества могли бы быть шире среди тех, кто прошел через это все. Для безусловного большинства речь идет о теплых воспоминаниях и благодарном отношении — все очень позитивно оценивают роль ICPC в своей студенческой жизни.

Коротко об устройстве проекта

Таймкод — 19:40

Дмитрий: Можете ли вы рассказать о технологическом стеке Codeforces? Хотя бы в двух словах.

Михаил: Больше всего я пишу на Java. Люблю этот язык и экосистему. Но когда я только начинал разработку, я долгое время писал код на PHP — быстро видел изменения, а цикл разработки выходил коротким. Так, обладая хорошей техникой программирования, можно было создать объемную функциональность за небольшой промежуток времени. На тот момент в экосистеме Java не было чего-то похожего, что раздражало. Для меня этот факт стал интересным технологическим вызовом, и я начал с того, что разработал свой веб-фреймворк для Java. Его киллер-фичей стала возможность перезагружать классы на лету, чтобы не нужно было «редеплоить» приложение — изменения отображались по нажатию горячей клавиши.

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

Мне кажется, что эволюция Codeforces — понятный процесс, с которым сталкивались более крупные игроки и системы. Сперва код пишут исходя из наивных предположений о нагрузке, потом пользовательская база увеличивается — приходится подумать о кешировании, переписывать отдельные компоненты. В какой-то момент мы написали предметно-ориентированную базу. Она индексирует и хранит в памяти много данных.

За десять лет было написано большое количество кода — значительная его часть имеет отношение к экосистеме Java. Но есть и другие вещи, например, песочница, где запускаются пользовательские программы. Для нее важно понимать, как с процессами под Windows правильно работать — чтобы все хорошо тестировалось и было довольно безопасно.

Дмитрий: Какие ли у вашего проекта ограничения, которые вы бы хотели снять и доработать?

Михаил: Это сложный вопрос. Понятно, что есть много болезненных моментов с точки зрения организации. Проведение регулярных соревнований — это своего рода подвиг. Это и кропотливая работа с авторами, и кропотливая работа координаторов, часто явникаю в эти задачи. Если эти процессы стандартизировать, то станет только лучше. Но не все готовы тратить кучу времени на подготовку раундов. При этом не всегда есть возможность подержать авторов задач материально, поэтому приходится жить и работать с тем, что есть.

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

Как часто проходят соревнования

Таймкод — 25:10

Дмитрий: Каждое мероприятие требует существенных временных затрат на подготовку. В связи с этим как часто проходят соревнования на вашей площадке?

Михаил: В месяц проходит от восьми до одиннадцати. Сюда входят соревнования, которые мы называем Div.1 + Div.2 раундами — открытые двухчасовые эвенты, где состязаются как опытные, так и начинающие участники. Есть соревнования Div.2 Only с задачами средней сложности, а есть образовательные раунды, которые мы организуем совместно с университетом Harbour.Space.

Есть раунды третьего дивизиона для начинающих, но там тоже нужно уметь решать задачи. Суммарно получается примерно десять раундов в месяц и каждые три дня что-то проходит. Подготовку задач третьего дивизиона сложно сравнивать с «хардовыми» задачами для чемпионов. Но если оценивать грубо, то для проведения раунда нужны десятки человеко-часов.

Дмитрий: Команда, обслуживающая конкретное мероприятие, это люди из комьюнити или сотрудники и участники проекта?

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

Дмитрий: Насколько накладны непрофильные задачи вроде маркетингового продвижения, или они решаются силами комьюнити?

Михаил: Какой-то «правильный» маркетинг у нас отсутствует. Мне кажется, что сарафанное радио и качественный продукт здесь важнее. Разумеется, мы публикуем анонсы в соцсетях и делаем рассылки, но усилий для рекламы мы не прикладываем — люди и так приходят.

Дмитрий: Расскажите о планах, которые вы перед собой ставите на ближайшие годы.

Михаил: Платформа достаточно сложна, и сделать так, чтобы все оставалось на прежнем уровне, уже будет достижением. Находить новые задачи всегда сложно. Эта работа всегда была на острие возможностей. В ближайшие пять лет я бы хотел научиться делегировать свои обязанности единомышленникам, которые разделяют видение. Что касается различных идей, то их довольно много. Сейчас Codeforces это площадка для участия в соревнованиях. Но хочется добавить туда образовательный контент — уже работаем в этом направлении. Экосистема должна расширяться, становиться богаче и интереснее — ищем выходы на новую аудиторию.

Дмитрий: Образовательный контент — это контент для подготовки к соревнованиям?

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

Дмитрий: Можно ли говорить об этом как об одной из главных проблем в сфере спортивного программирования?

Михаил: Какой-то проблемы здесь нет. Есть сильные учебные наработки — например, сайт e-maxx.ru, который запустил мой бывший студент. Там собраны лекционные материалы на широкий спектр тем. Если участник хочет разобраться в каком-то вопросе, то он найдет возможность.

Что сейчас интересует компании

Таймкод — 32:35

Дмитрий: Как вы можете оценить интерес к спортивному программированию со стороны компаний? Во что они сейчас вкладываются?

Михаил: Много топовых участников соревнований уходят работать в крупные компании вроде Google и Yandex и показывают там хороший карьерный рост. Кандидат с опытом в спортивном программировании имеет приоритет при приеме на работу — это правда. Компании хотят, чтобы кандидаты понимали фундаментальные основы — как работают программы, как устроены алгоритмы. Конкретный технологический стек в компаниях свой, он динамичный. Редко кто требует от человека разбираться в стеке, который сегодня есть, а завтра изменится.

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

Кстати, интервью в Google в большей степени (чем в других организациях) напоминают соревнования по программированию. Так, участники и победители олимпиад имеют большие шансы на успех. Если интервью проходят не олимпиадники, то это совсем талантливые и яркие люди. Нормально, что в будущем они показывают лучшие результаты. В то же время не совсем понятно, кого именно следует считать олимпиадниками. Если человек два раза проходил на городские соревнования и полгода ходил в кружок — есть ли у него олимпиадный опыт?

Мне кажется, было бы интересно провести качественное социологическое исследование о среднестатистическом портрете участников полуфинала чемпионата мира по программированию десятилетней давности. Я думаю, оно отлично покажет, что у этих ребят все хорошо и с карьерой, и с денежными вопросами, а весь скепсис яйца выеденного не стоит.

Нужно ли строить карьеру в этой области

Таймкод — 37:08

Дмитрий: Существует ли тренд среди спортивных программистов на продолжение карьеры исключительно в этой сфере?

Михаил: Скорее нет, люди вовлекаются в это движение в школьные и студенческие годы. На старших курсах интерес по той или иной причине угасает — это нормально и естественно. Далее, человек заканчивает университет, перед ним открывается новая рабочая жизнь, и он находит себя в индустрии. Я отношусь к спортивному программированию как к физкультуре. Думаю, никто не будет спорить, что она положительно влияет на здоровье. Участие в соревнованиях по программированию — это физкультура для мозга, тренировка в понимании алгоритмов. Людей, которые хотят заниматься исключительно этим мало, и больше их не становится.

Дмитрий: Должны ли они появляться, или в этом нет смысла?

Михаил: Рост числа людей, желающих не просто участвовать в соревнованиях, а привносить что-то свое, безусловно, пойдет на пользу движению. Так, я сфокусировался на разработке платформы Codeforces — для сообщества это хорошо. Но таких людей немного, и винить никого в этом нельзя — таково естественное развитие жизни. Работать в этой области — не только задачи решать, но и уходить в организацию. Реализовывать это — готов лишь небольшой процент людей.


Другие выпуски нашего подкаста на Хабре: