Ясно-понятно. Кто такой спортивный программист и как им стать?
Разработчики стабильно пользуются спросом, без них не обходится ни одна крупная компания, а труд IT-специалистов ценится высоко. Спортивные программисты ценятся вдвойне — на рынке труда их мало, а решать задачи они умеют быстро и эффективно. Разбираемся, что такое спортивное программирование и как построить карьеру «спортсмена».
Рассказывают проректор по международным программам и цифровым инновациям МФТИ, основатель Moscow Workshops Алексей Малеев и руководитель Олимпиадного центра Университета Иннополис Владимир Сметанин.
Что это вообще такое?
Спортивное программирование — это одна из разновидностей интеллектуальных игр, которая стоит в одном ряду с шахматами или сборкой кубика Рубика на скорость. Цель «спортсмена» — быстро и безошибочно найти решение проблемы, обойдя конкурентов. Обычно программисты работают в команде по три человека, но бывают и одиночные турниры.
Чем спортивный программист отличается от обычного?
Лучше всего различия между «спортсменами» и остальными разработчиками объясняют сами олимпиадники. Есть отличная метафора от Энтони Мо, software-инженера Microsoft.
Вы находитесь где-то в джунглях. В руках перочинный нож. И тут вам предстоит сразиться с пумой. Вы заточите ножом палку, возможно, найдете нужное растение, чтобы сделать ядовитое копье. Методы сработают не сразу — и копье, и яд придется дорабатывать, чтобы победить пуму.
Примерно так работает обычный программист. Он изобретает инструменты, проводит итерации, а еще постоянно переучивается, потому что новые инструменты и технологии появляются чуть ли не каждый день. «Спортсмен» делает все то же самое и с теми же ресурсами, только быстрее. Пока классический программист будет последовательно подбирать решения в течение нескольких месяцев, спортивный программист проделает все то же за несколько часов и быстрее справится с пумой. Как раз поэтому олимпиадники считаются мастерами быстрого принятия решений, а еще отличными «дебаггерами» — они заранее прогнозируют ошибки и знают, как их избежать.
Есть еще и другая метафора:
- Программист-любитель — это обычный водитель. Он иногда исследует что-то новое и ради интереса помогает другим любителям. Стартовая позиция, с которой все начинают.
- Промышленный программист, который работает в компании, — это дальнобойщик. Он часто выполняет рутинные задачи и действует по отработанному сценарию. Он не может рисковать, зато обладает полезными компетенциями.
- Спортивный программист — это гонщик. Он начинает с дворовых гонок и доходит до «Формулы 1». Если, конечно, прилагает усилия и развивает необходимые для таких гонок навыки.
Перейти из одной категории в другую можно, но во всех случаях придется обучаться новому. «Спортсмены», кстати, часто устраиваются в крупные IT-компании, но многие предпочитают работать на себя или становятся тренерами.
Чем занят спортивный программист?
Промышленный программист работает в рамках ТЗ и дедлайнов. Спортивный программист живет немного в другой системе координат. Три ключевых события в его жизни — это сборы, контесты и «дорешка».
На сборах он отрабатывает мастерство и знакомится с будущими конкурентами. Сборы проходят по всему миру — например, Moscow Workshops организует их в городах от Сингапура до Барселоны, а также проводит в Москве четвертьфинал и квалификационный тур студенческого чемпионата для «спортсменов» — ICPC.
На контестах программисты обычно работают в команде из трех человек за одним компьютером. Действовать приходится быстро — в среднем на 10 задач дают не больше пяти часов. Задачи бывают разные. Обычно это гипотетические кейсы, которые нужно решить с помощью алгоритмического моделирования. Например, требуется создать программу, которая рассчитает выручку для парковки. Исходные данные: тарифы, вес автомобилей и порядок, в котором они прибывают и отбывают с парковки. Другой пример: нужно рассчитать, можно ли за один день сфотографировать все достопримечательности в парке, поймав хорошее освещение. Звучит просто, но без глубоких познаний в математике и информатике точный ответ найти не получится.
И, наконец, третий этап — «дорешка», время для анализа и рефлексии. Конкурсанты разбирают задачи, которые не смогли решить на соревнованиях (дорешивают, поэтому такое название), и учатся на ошибках.
А зачем заниматься спортивным программированием?
Спортивные программисты встречаются редко — их примерно 4,5% от общего числа разработчиков в мире, а призеров и того меньше. Поэтому работодатели в них заинтересованы — прямо с чемпионатов участников зовут на собеседования в крупные компании. И большинство ценит навыки независимо от побед: умение быстро решать комплексные задачи, находить нестандартные ответы, работать в команде и пользоваться сложными инструментами. Например, теорией графов, методами динамического программирования и тернарного поиска.
«Именно в ходе таких соревнований нередко обнаруживаются скрытые таланты, настоящие самородки и фанаты своего дела. Спортивное программирование держит голову в тонусе, а победители таких соревнований зачастую могут рассчитывать на внимание и предложения от крутых IT-игроков», — говорит HR-директор Центра цифровой трансформации Татарстана Константин Черников.
Преимущество спортсменов, кстати, не в языках программирования, потому что в основном это стандартные C/C++, Kotlin, Java и Python, а в мощном математическом бэкграунде. Поэтому обычно они занимаются кодовой базой, комплексными системами и алгоритмами. Условно, в e-commerce компании «спортсмен» вряд ли будет разрабатывать личный кабинет покупателя или систему проставления тегов. Скорее всего, он будет создавать алгоритмы для работы карт, поисковиков, мессенджеров.
Если опираться на теорию Атиллы Ваго о различиях между программированием и кодингом, то олимпиадник — это именно программист, но не кодер. Он занимается «хардкорной» разработкой, но зато обладает фундаментальным набором навыков, который со временем может дополнить более прикладными умениями.
Не стоит забывать и о наградах. На крупных чемпионатах, например на Google Code Jam, призер может заработать до 15 тысяч долларов. На зарплате успехи тоже сказываются. Спортивные программисты востребованы, им проще предъявлять требования к работодателю, в том числе и зарплатные.
Как построить карьеру в этой области?
Спортивная карьера разработчика часто начинается со школьных олимпиад, следующий этап — студенческие чемпионаты и открытые первенства для программистов всех возрастов. Расти можно бесконечно. Пример тому — звезда спортивного программирования Геннадий Короткевич, аспирант ИТМО, который к 26 годам выиграл все крупнейшие соревнования, начиная со студенческого чемпионата мира ICPC и заканчивая кубками Google и Facebook. Он до сих пор иногда участвует в турнирах и стабильно удерживает место в тройке рейтинга Codeforces — это примерно то же, что список Forbes, только при оценке учитывают не капитал, а победы программиста.
Первые турниры по спортивному программированию начали проводить еще в 1970-е годы, но по-настоящему массовым олимпиадное направление стало в 1990-е, благодаря распространению интернета. Появилась возможность проводить контесты одновременно по всему миру. И сейчас турниры исчисляются сотнями: это и школьные олимпиады — от международной IOI до всероссийской олимпиады школьников и ВКОШП, и студенческий чемпионат мира ICPC, а еще Topcoder Open, Google Code Jam, Hash Code и VK Cup для всех возрастов. В 2020 году в России впервые прошел фестиваль Rucode — это одновременно чемпионат и образовательный проект, в который входит бесплатный онлайн-курс по спортивному программированию.
Окей, вы меня убедили, хочу этим заниматься. С чего начать?
«В Татарстане хорошо развито олимпиадное программирование: в школах действуют кружки, а в вузах — специализированные курсы. Например, в Университете Иннополис работает школа довузовской подготовки InnoStar, где работают тренеры по спортивному программированию, проводится олимпиада Innopolis Open по информатике, школа олимпиадной подготовки по информатике, учебно-тренировочные сборы для подготовки участников к международным соревнованиям (IATI, eJOI) и Всероссийской олимпиаде школьников по информатике», — говорит Владимир Сметанин, руководитель Олимпиадного центра Университета Иннополис.
Университет ориентирован на выстраивание целой экосистемы вокруг спортивных программистов и создает для них условия, начиная со средней школы. От школьных олимпиад они переходят к студенческим турнирам. Студентов поддерживают максимально: от расходов на учебно-тренировочные сборы и соревнования, организации университетских турниров до выплаты надбавок к стипендии за достижения на чемпионатах. Как результат системной работы, команда студентов Университета Иннополис прошла в финал ICPC 2020 в Москве.
Кроме того, занятия по спортпрограммированию проводят в КФУ, также работает Олимпиадный центр на базе института вычислительной математики и информационных технологий. Недавно команда лицея им. Н.И. Лобачевского при КФУ получила бронзу на фестивале Rucode, хотя в чемпионате участвовали тысячи конкурсантов со всей России и из других стран.
Школьникам и студентам лучше начинать осваивать программирование с тренерами — это поможет быстрее понять, какие требования предъявляют к олимпиадникам, и скорее выступить на контесте.
Если вы уже закончили учебу, постепенно начинайте решать простые задачи. За помощью можно обратиться к коллегам на Codeforces — это самое крупное русскоязычное (и не только) сообщество спортивных программистов. Можно присоединиться к бесплатным образовательным инициативам вроде Rucode. Как только научитесь решать задачи, начинайте участвовать в контестах. Даже если трудности возникнут еще на отборочном туре, вы поймете, какие требования предъявляют к «спортсменам», и быстрее адаптируетесь.
Универсальных правил нет, за исключением двух: постоянно практикуйтесь и находите радость в самом процессе. Большинству спортивных программистов по-настоящему нравится решать задачи — и именно эта искренность помогает им добиваться успехов.
Полезные ресурсы для спортивных программистов
Книги:
- «Программирование — это так просто, программирование — это так сложно». Елена Андреева
- «Олимпиадное программирование». Антти Лааксонен
- «Спортивное программирование». Стивен и Феликс Халимы (на английском)
Платформы для решения задач:
Курс на русском языке «Быстрый старт в спортивное программирование» от команды фестиваля Rucode
Образовательный проект Moscow Workshops
База ресурсов Codeforces
Гид по соревнованиям от МФТИ
Материалы для подготовки к олимпиадам от Университета Иннополис