Обложка статьи «Гид по спортивному программированию: обзор соревнований и советы по участию в них»

Гид по спортивному программированию: обзор соревнований и советы по участию в них

Алексей Малеев

Алексей Малеев, проректор МФТИ по международным программам и цифровым инновациям и основатель Moscow Workshops

Спортивное программирование — отличная стартовая площадка для карьеры. Кто-то после побед становится наставником и готовит других чемпионов, а кто-то устраивается в крупные IT-компании. Призёры олимпиад также работают в Google, Facebook, Mail.ru Group, ВКонтакте и Яндексе. По некоторым оценкам, 5–10% общего числа сотрудников в крупных IT-компаниях — это бывшие участники крупнейших студенческих чемпионатов по программированию ICPC.

По словам участников, контесты учат работать быстро и эффективно, писать чистый код, а также тренировать иностранный язык, поскольку решать задачи и общаться с организаторами приходится на английском. В то же время прокачиваются гибкие навыки (soft skills): стрессоустойчивость, тайм-менеджмент и умение работать в команде. Ещё один плюс — знакомство с коммьюнити и возможность объективно оценить своё мастерство. Причём не обязательно доходить до финала — извлечь пользу можно ещё на стадии подготовки или во время сборов.

Каждый год в мире проходят сотни чемпионатов по спортивному программированию — от локальных турниров для новичков до масштабных фестивалей с тысячами участников со всего мира. Вместе с МФТИ и проектом Moscow Workshops разбираемся, какие соревнования существуют, зачем в них участвовать, а главное, как извлечь из контестов максимальную пользу. Заодно определим 10 универсальных советов, которые пригодятся на соревновании любого уровня.

Для всех

Google Code Jam

Что: ежегодное международное соревнование по программированию от Google.

Среднее число участников: почти 60 000.

Условия: возраст старше 13 лет, но для участия в финальном очном турнире нужно быть старше 18.

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

Зачем участвовать: для Google соревнование — это инструмент хантинга лучших молодых специалистов. За победителями действительно охотятся работодатели, поэтому Code Jam — отличная возможность попасть на международный рынок труда ещё будучи студентом. Денежные вознаграждения от Google тоже радуют — первой тройке победителей выплачивают от $1000 до $15000.

Интересный факт: с 2014 года первое место на соревнованиях ежегодно занимает аспирант ИТМО Геннадий Короткевич. Он также получал первые награды на соревнованиях ICPC, Russian Code Cup, Facebook Hacker Cup и Topcoder Open.

Аналогичный проект от другого IT-гиганта — Facebook Hacker Cup.

Hash Code

Что: ежегодный международный контест по программированию от Google.

Среднее число участников: более 37 000 на первом этапе.

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

Задачи: главное отличие Hash Code от Code Jam — это отсутствие абстрактных задач. Участникам предлагают реальный челлендж, с которым столкнулись разработчики Google. Контест больше похож на хакатон, поскольку одного правильного ответа не существует — нужно изобрести самое эффективное решение.

Зачем участвовать: чтобы прожить один день из жизни разработчика Google, посетить штаб-квартиру крупнейшей IT-компании и примерно понять, что ждёт программиста, который достиг такого уровня.

Интересный факт: на квалификационном раунде в 2020 году разработчикам нужно было помочь проекту Google Books: найти самый быстрый способ отсканировать как можно больше книг в библиотеках по всему миру. Google действительно работает над этой задачей и, возможно, использует лучшее предложенное решение на практике.

Topcoder Open

Что: ежегодный профессиональный турнир по программированию.

Среднее число участников: 4 000.

Условия: возраст старше 18 лет, аккаунт на платформе Topcoder и успешное прохождение отборочных соревнований.

Задачи: турнир проводится по нескольким номинациям. В 2019 году это были Algorithm, UI Design, Development, Marathon Matches, QA и First2Finish. К спортивному программированию относятся Algorithm и Marathon Matches.

Зачем участвовать: бывшие участники турнира называют Topcoder Open «Диснейлендом возможностей». Турнир открывает доступ к сообществу лучших разработчиков со всего мира. Можно не только найти единомышленников и познакомиться с IT-легендами, но и получить предложение о работе.

Интересный факт: Китай, Польша и Россия стабильно лидируют по числу победителей в разных номинациях Topcoder One. Участники соревнования могут применять тактику взломов и челленджей, то есть можно получать баллы за нахождение ошибок в чужом коде.

VK CUP

Что: индивидуальный чемпионат по программированию, организованный

ВКонтакте совместно с платформой Codeforces и ML Bootcamp.

Среднее число участников: более 3000 команд.

Условия: возраст старше 14 лет. Но для участия в финале нужно быть старше 16.

Задачи: конкурс включает четыре трека: ML, Engine, Mobile и Design. Каждый состоит из трех последовательных раундов: квалификационного, отборочного и финального. На каждом из этапов участникам нужно решить одну или несколько задач.

Зачем участвовать: как и большинство крупных IT-компаний, VK использует чемпионат для хантинга специалистов. Но параллельно с этим ВКонтакте выполняет просветительскую миссию: помогает разбирать задания отборочных туров, публикует лекции, выкладывает библиотеки компонентов и полезную документацию.

Интересный факт: До этого в течение ряда лет VK Cup разыгрывался для команд из двух человек, причём участвовать могли только участники не старше 23 лет. Финал VK Cup 2019-2020 должен был состояться в апреле, но его перенесли на лето из-за эпидемии коронавируса. Точные даты пока не определили.

Сodeforces

Что: соцсеть и платформа для соревнований по алгоритмике, на которой регулярно проводят турниры и образовательные раунды.

Среднее число участников: по данным Codeforces, с 2013 года платформа опережает Topcoder по количеству активных пользователей. В 2018 на ней было зарегистрировано 600 тыс. аккаунтов.

Условия: ограничения устанавливают организаторы соревнований, а Codeforces лишь предоставляет им платформу.

Задачи: всегда разные. Обычно участникам предлагают решить 5 задач за два-три часа. Тоже работает тактика взломов и челленджей: можно получать баллы за нахождение ошибок в чужом коде.

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

Интересный факт: Telegram и лично Павел Дуров уже много лет поддерживают деятельность Codeforces. Кроме того, платформа сотрудничает с другими компаниями, в том числе с Microsoft, Mail.Ru, JetBrains и Huawei.

Другие онлайн-площадки для индивидуальных соревнований:

  • AtCoder: здесь собраны более сложные задачи, созданные в традициях японской школы спортивного программирования. Контесты делятся на три категории: ABC предназначена для новичков, ARC — для опытных специалистов, AGC — для экспертов. 
  • CodeChef: некоммерческая образовательная инициатива индийской компании Directi. Ежемесячно на платформе проводятся онлайн-контесты, а раз в год площадка организует очный чемпионат SnackDown.

Rucode Festival

Что: всероссийская программа интенсивной подготовки по спортивному программированию и искусственному интеллекту, созданная МФТИ в партнёрстве с Фондом развития Физтех-школ и при поддержке Фонда президентских грантов.

Условия: онлайн-курс «Быстрый старт в спортивное программирование» доступен всем бесплатно. Он знакомит с базовыми линейными алгоритмами, теорией чисел, динамическим программированием. Дальше, до 2 апреля, можно попасть на отборочное тестирование для участия в трёхдневных интенсивах по спортивному программированию. В конце апреля проект Rucode завершится онлайн-чемпионатом для участников из России и студентов других стран.

Задачи: занятия проводятся для специалистов с базовыми знаниями С/С++, Java, Pascal/Delphi и Python.

Зачем участвовать: Rucode позволяет бесплатно изучить основы спортивного программирования и познакомиться с инструментами на базе машинного обучения. Это поможет новичку понять, в каком направлении двигаться дальше. Ещё один плюс — возможность поработать в команде и выйти на сообщество разработчиков со всей России. Кроме того, на чемпионате можно попрактиковаться на реальных датасетах ведущих IT-компаний — трек по искусственному интеллекту подготовлен совместно со Сбербанком — и познакомиться с передовыми разработками в области искусственного интеллекта.

Интересный факт: RuCode станет первой ступенью масштабного проекта «Сеть интенсивов по подготовке IT-талантов», который до 2024 года позволит в онлайне обучить спортивному программированию более 100 тысяч человек в России.

Для студентов

ICPC

Что: ежегодный студенческий командный чемпионат мира по программированию. Проводится с 1977 года.

Среднее число участников: более 52 тысяч студентов из 3 тысяч учебных заведений.

Условия: возраст не старше 24 лет, статус студента и аспиранта, сформированная команда под руководством тренера.

Задачи: чемпионат состоит из нескольких этапов: в некоторых регионах — ⅛ (квалификационный тур региона), региональный финал (четвертьфинал), суперфинал региона (полуфинал) и международный финал. На каждом этапе проводят пятичасовой контест, который состоит из 8–14 задач. Соревнование командное, команде из трёх студентов выдаётся один компьютер. Разрешено использовать языки программирования C/C++, Java, Python и Kotlin.

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

Интересный факт: в июне 2020 ICPC впервые пройдет в Москве — его организует МФТИ. Ещё один интересный факт — в 2000 и 2001 году победителем ICPC стал Николай Дуров, брат Павла Дурова, он отвечал за техническую разработку VK и Telegram. Во время финала работает специальная студия ICPC Live, освещающая на нескольких языках (в том числе и на русском) ход финала.

В преддверии финала ICPC обычно проводится двухдневный чемпионат по спортивному программированию Moscode Festival, организованный Центром развития IT-образования МФТИ. На фестивале за 5 часов нужно решить 12 алгоритмических задач по стандартам ICPC. Участие в фестивале бесплатное, а обучение и соревновательная часть проходят на английском, так что это отличная возможность попрактиковать язык накануне международных соревнований.

Студентам, а также выпускникам сообщества, также можно поучаствовать в OpenCup — открытом кубке им. Е.В. Панкратьева по программированию. Соревнования проводятся по трём категориям: SCHOOL для школьников, ACM для студентов и OPEN для всех остальных. За победу в этом сезоне борются команды из медалистов ICPC прошлых лет из Польши, США и России. Сезон OpenCup состоит из нескольких этапов, которые проводятся в двух дивизионах — основном и учебном, поэтому первенство подойдёт для программистов разного уровня. Соревнование проходит по секторной схеме с более чем 200 зарегистрированных площадок, а в связи с ограничениями из-за борьбы с коронавирусом командам рекомендовано участвовать в соревнованиях, не собираясь физически в одном месте, но общаясь между собой через средства коммуникации.

Для школьников

IOI

Что: ежегодная международная олимпиада по информатике среди школьников.

Среднее число участников: более 300 школьников из 87 стран.

Условия: возраст не старше 20 лет и отсутствие высшего образования. На момент участия в конкурсе программист не должен числиться в вузе. Тренировочные сборы перед IOI проходят дважды в год, с 2018 — на базе МФТИ. В качестве подготовки школьники участвуют в международных соревнованиях, например, ездят на турниры в другие страны.

Задачи: в течение двух дней нужно решить и запрограммировать несколько алгоритмических задач, составленных опытными разработчиками. Основные языки — C++ и Java. В отличие от соревнований ICPC, возможны частичные баллы — если задача проходит некоторый набор тестов, удовлетворяющий более слабым ограничениям, участник получает частичный балл.

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

Интересный факт: обычно не более 50% участников получают медали, а золото достается лишь 1/12 части школьников. В среднем соотношение золота, серебра, бронзы и отсутствия медалей составляет примерно 1:2:3:6

ВКОШП

Что: всероссийская командная олимпиада школьников по программированию.

Среднее число участников: более 300 команд по три человека в каждой.

Условия: участвовать могут только школьники, которые предварительно прошли отборочный тур. В остальном это командное соревнование по тем же правилам, что и ICPC.

Задачи: в течение одного пятичасового компьютерного тура нужно решить несколько задач. Используются языки программирования Pascal, C++14, C#, Java, Python, D и Kotlin.

Зачем участвовать: участие в ВКОШП — это первый опыт сопоставления своих навыков с навыками других начинающих программистов. При этом даже не придётся выезжать из страны.

Интересный факт: в 2019 году отборочный тур на ВКОШП в Москве школьники писали одновременно и на тех же задачах, что и столичные студенты. Тогда как раз проходила первая ступень отбора на ICPC — соревнование Moscow Programming Contest. Всего в нём поучаствовали 2284 человека, мероприятие зафиксировали в Реестре рекордов России как самое массовое соревнование по программированию в стране.

Технокубок

Что: ежегодная олимпиада по программированию для учащихся 8–11 классов, организованная МФТИ, МГТУ им. Н.Э. Баумана и компанией Mail.ru Group.

Среднее число участников: 7 500 человек, из которых более 550 доходят до финала.

Условия: допускаются только школьники. Для попадания в очный финал нужно пройти отборочный тур онлайн. Тур проходит по правилам раундов Codeforces.

Задачи: участникам нужно решить несколько алгоритмических задач. Основные языки программирования — Pascal, C#, C++, Haskell, Go, Java, Python, D, Kotlin, PHP, Perl, Ruby и Scala.

Зачем участвовать: олимпиада входит в перечень РСОШ и относится к соревнованиям первого уровня. Это позволяет победителям и призерам поступать в российские вузы без экзаменов. Участники «Технокубка» также получают привилегии при поступлении на образовательные проекты Mail.ru Group. А ещё можно выиграть iPad или AirPods.

Интересный факт: организаторы «Технокубка» креативно подходят к написанию задач. Например предлагают подсчитать разбросанные по комнате носки или помочь клонам выбраться из подземной лаборатории.

Как готовиться к контесту: 10 советов от МФТИ

  1. Определите, достаточно ли у вас базовых знаний для участия в соревнованиях. На раннем этапе необходимо:
    • Знать хотя бы один язык программирования. Лучше всего подойдут С, С++ или Java. В некоторых случаях можно обойтись и Python, но этот язык медленнее других. Также обязателен опыт алгоритмического программирования.
    • Обладать математической подготовкой: уметь решать нестандартные задачи и строить математические модели.
    • Знать английский достаточно, чтобы понимать лекции и задачи.
  1. Организуйте индивидуальные тренировки. Даже если вы будете выступать на командных соревнованиях, уделите время самостоятельной прокачке навыков — как практических, так и теоретических.
  2. Изучите теорию. Почитайте справочник «Олимпиадное программирование», разберите материалы на бесплатном портале E–maxx — там собраны алгоритмы, электронные пособия и новости спортивного программирования.
  3. Решайте задачи — как можно больше и чаще. Ищите задания с прошлых чемпионатов и олимпиад. Их публикуют на Timus Online Judge, Codeforces, TopCoder, Spoj, CodeChef, Codingame и C Puzzles (для языка C). На русском языке доступен Сервис дистанционной подготовки к информатике.
  4. Для начала решайте задачи без учёта времени. Потом уже ставьте таймер. Не останавливайтесь на самых лёгких вариантах — постепенно двигайтесь от простого к более сложному.
  5. Организуйте командные тренировки. Это поможет наладить отношения в коллективе и определить сильные и слабые стороны каждого. Для этой цели подойдут как локальные тренировки, так и сборы по спортивному программированию. В России регулярно проводятся кэмпы для подготовки к крупным соревнованиям. География обширная: Москва, Петрозаводск, Ижевск, Иркутск, Уфа, Владивосток. Есть и международная программа Moscow Workshops, которая зародилась на кампусе Физтеха, а сейчас проводит сборы по всему миру — в Пекине, Сингапуре, Максате, Риге и других городах. В рамках проекта есть и лагерь для учеников 9–11 классов — Moscow Workshops Juniors. Он подойдет для уже прокачанных школьников. Участники каждый день тренируются, посещают лекции, но также занимаются спортом и участвуют в интеллектуальных играх, чтобы поддерживать баланс.
  6. Не забывайте про техническую подготовку компьютера. ICPC предоставляет устройства с установленным программным обеспечением. На региональных чемпионатах могут потребоваться свои ноутбуки — заранее уточните, какие требования к настройкам предъявляют организаторы.
  7. Не пренебрегайте пробным туром перед соревнованием. Это поможет протестировать систему, проверить базовую функциональность и оценить дополнительные возможности.
  8. Помните о гибких навыках. Вы можете идеально знать язык программирования и великолепно решать задачи, но при этом не уметь планировать время или управлять процессами. Эти навыки нужно прокачивать точно так же, как навыки работы с Java. Изучите принципы тайм-менеджмента и командообразования. Тренируйте креативность, когнитивную гибкость и критическое мышление. Учитесь вести переговоры и решать конфликты, а также грамотно распределять ресурсы.
  9. Не геройствуйте — отсутствие сна и отказ от еды ещё никому не помогал победить.