Инструкция: как стать "мастером спорта" по программированию

В карьере разработчика нет высшей финальной точки – осваивать новое приходится постоянно. Зато можно быстро прокачать навыки и перепрыгнуть сразу несколько ступенек карьерной лестницы. Лучший способ это сделать – освоить спортивное программирование.

Школу олимпиадного кодинга прошли сотни тысяч айтишников, в том числе топ-менеджеры Google, Facebook и VK. Команда Moscow Workshops составила подробную инструкцию для начинающего "спортсмена".

Что такое спортивное программирование?

Спортивное программирование, как понятно из названия, – это разновидность интеллектуального спорта. Разработчики решают сложные алгоритмические задачи на скорость, используя популярные языки программирования – в основном C/C++, Kotlin, Java и Python.

Существуют как локальные конкурсы, например, мини-турниры на платформах Codeforces, TopCoder или Codechef, так и крупные международные чемпионаты и олимпиады, в которых участвуют десятки тысяч программистов.

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

А зачем это нужно?

Во-первых, это сильно затягивает. На платформе Codeforces зарегистрировано больше 750 тыс. человек и из них 60 тыс. участвует в рейтинговых раундах. Большинство решает задачи в свободное от работы время, чтобы получить красный статус гроссмейстера.

Интервью со спортивными программистами и видео с лайфхаками собирают миллионы просмотров на YouTube. Например, ролик, в котором Геннадий Короткевич завершает финальный раунд чемпионата Google Code Jam, посмотрели почти полмиллиона раз. Геннадий Короткевич – легенда спортивного программирования, двукратный чемпион мира, который победил практически во всех существующих соревнованиях.

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

Из спортивного программирования выходят успешные предприниматели и топ-менеджеры. Например, бывший CTO Facebook и основатель Quora Адам Д'анджело или сооснователь стартапа AI Factory Александр Машрабов, который продал свою компанию гиганту Snap. Ну а о том, какую роль спортивные программисты сыграли в истории "ВКонтакте" и Telegram, можно не упоминать.

Кстати, именно в России базируются лучшие спортивные программисты. Россия стабильно занимает верхние строчки рейтингов Google Code Jam, Facebook Hacker Cup и TopCoder Open, а на студенческих турнирах МГУ, ИТМО, МФТИ и НИУ ВШЭ обходят MIT, Гарвард, Оксфорд, Кембридж и Университет Цинхуа.

С чего начать?

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

Главное для начинающего "спортсмена" – это знание хотя бы одного языка программирования. Лучше всего подойдут С, С++ и Java, но популярный сейчас Python тоже неплохой вариант для начала. Раньше в ходу был и Pascal, но на современных турнирах этот язык уже давно не практикуется.

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

Также обязательно пригодится базовая математическая подготовка, знание векторной геометрии и тригонометрии. Делимость, ее свойства, представление целых чисел, теория графов, алгоритм Евклида – это точно нужно знать. Без опыта алгоритмического программирования и базовых знаний информатики тоже не обойтись. Увы, но школьных знаний в этих сферах недостаточно – на уроках и задачи не те, и инструменты другие.

Если планируете выступать на чемпионатах в высших дивизионах, потребуется более серьезная прокачка. Теория графов, остовные деревья, алгоритм Флойда – Уоршелла, преобразование Фурье, выпуклые оболочки, базовая теория игр, основы динамического программирования – все это вы должны знать так, чтобы, проснувшись посреди ночи, применить знания на практике.

Подтяните теорию. Чтобы лучше разбираться в алгоритмах, подтяните теорию. Начните с онлайн-курсов.

Начните решать задачи. Practice makes perfect – это правило работает и для спортивного программирования. Чтобы понять специфику заданий на соревнованиях, зарегистрируйтесь на популярных платформах, например, Timus Online Judge, SPOJ, Codechef, тех же TopCoder и Codeforces, Codingame и C Puzzles. На русском есть отличный ресурс informatics.mccme.ru.

Начинайте с задач, у которых самый большой процент решаемости – они самые простые. А потом понемногу повышайте уровень сложности.

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

Посмотрите мастер-классы на YouTube – там часто пошагово показывают решения сложных кейсов. Еще стоит заглянуть в тред вопросов на Quora: там программисты делятся своими тревогами, а новички советуются с мастерами. Например, можно узнать, был ли Цукерберг хорошим кодером и как олимпиадное программирование помогает в карьере.

А что потом?

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

Регистрируйтесь на сборы, буткэмпы и интенсивы – сейчас большинство проходит в онлайн-режиме. Начинать можно еще в старших классах – например, на кампуспе МФТИ проходит лагерь Moscow Workshops Juniors. Занятия в них ведут преподаватели российских и зарубежных вузов.

Приготовьтесь к жесткому графику – например, студенческие сборы Moscow Workshops длятся 8 дней, причем тренировки проходят ежедневно. Мастер-классы организуют в Европе, Азии, на Ближнем Востоке, в Южной Америке – география широкая. Это не только отличный способ быстро прокачать навыки, но и возможность познакомиться с новыми людьми – в том числе с будущими конкурентами из разных стран. Многие, кстати, заводят друзей на сборах, а потом вместе открывают бизнес.

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

Начинайте участвовать в контестах. Большинство крупных чемпионатов проводят онлайн-раунды, в которые попасть может любой желающий. В редких случаях в чемпионате можно участвовать без предварительного отборочного турнира – например, международный фестиваль RuCode, который запустили МФТИ, Яндекс и МегаФон при поддержке Фонда президентских грантов, открыт для программистов всех возрастов разного уровня. Чемпионат пройдет в это воскресенье и поучаствовать в нем сможет любой, кто прошел регистрацию на сайте. HashCode, Google Code Jam, TopCoder Open и VK Cup устанавливают минимальные требования для прохождения отборочных туров – можно попытать удачу и, если повезет, пройти в финал.

Студентам стоит попробовать свои силы на крупнейшем чемпионате ICPC, а школьникам – на Всероссийской олимпиаде школьников по информатике, а затем и международной IOI, Открытой олимпиаде школьников по программированию, ВКОШП и Технокубке.

Продумайте стратегию заранее и почитайте об особенностях начисления баллов. На школьных олимпиадах часто очки можно набрать даже за частичное решение – в этом случае важно набросать хотя бы какие-то варианты, чтобы получить частичный зачет. В приоритет ставьте самые простые задачи, потому что все задачи стоят одинаково. Но не забывайте переключаться – тренеры советуют не зацикливаться на одной задаче долгое время, потому что фокус "замыливается". Лучше вернуться к ней попозже, чтобы посмотреть свежим взглядом. На студенческих соревнованиях баллы начисляют только за полное решение: каждая задача либо решена полностью, либо не решена. Очки на Сodeforces вообще имеют принципиально другой смысл.

На забывайте про тайм-менеджмент – сколько раз олимпиадники страдали из-за того, что им не хватило буквально пары секунд на завершение работы. Попробуйте еще на стадии подготовки включать таймер и отслеживать, сколько времени уходит на задачи разного типа.

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

0
4 комментария
Григорий Николаенко

Хорошая статья, спамибо очень полезно!

Ответить
Развернуть ветку
Лапук Мария

Мастер спорта)

Ответить
Развернуть ветку
Paul Mayer

Ща Бадюк подъедет

Ответить
Развернуть ветку
Заитов Роберт

Это что новый вид спорта такой?))

Ответить
Развернуть ветку
1 комментарий
Раскрывать всегда