Код
#статьи

Спортивное программирование: зло или хорошая школа

Какие чемпионаты по программированию существуют и помогут ли они стать крутым разработчиком, сделать карьеру и устроиться в топовые компании?

OlyaSnow для Skillbox

Спортивное программирование — разновидность интеллектуального киберспорта. Участники пишут программы для решения логических и математических задач. Соревнования обычно проходят онлайн, а количество задач может быть разным — от пары десятков до нескольких тысяч. Судьи учитывают, сколько задач и с каким качеством решил каждый участник за определённое время. Соревнования по программированию начали проводить ещё в семидесятых годах XX века.

Мы поговорили с разработчиками и тимлидами и узнали, кому пригодится опыт олимпиадного программирования и в какие компании он открывает доступ. А ещё составили подборку из шести лучших чемпионатов по программированию — в ней есть соревнования и для учащихся, и для состоявшихся практиков.

Зачем участвовать в соревнованиях?

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

Некоторые юные участники надеются уехать в Кремниевую долину, даже не поучившись в университете. Например, один из победителей IOI, Скотт Ву, уже в 17 лет получил предложения о работе от ряда известных компаний. В итоге он отложил учёбу в Гарварде на год и устроился в Addepar. По словам работодателя, Скотт за три месяца вошел в 10% лучших инженеров компании — да и другие победители соревнований зарекомендовали себя отлично, трудясь в Addepar.

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

«Есть места, где нужно заниматься глубокой оптимизацией и решать сложные алгоритмические задачи, но это не массовая история. В основном такие люди нужны крупным компаниям. Например, в том же Яндексе или Google. И, конечно, конкурсы программирования могут стать неплохой развивалкой для разработчиков, если не превращать их в самоцель».

Михаил Корнеев,
тимлид в BestDoctor и автор YouTube-канала «Хитрый питон»

В целом практика спортивного программирования полезна для ума и развивает насмотренность. А вот попытки выдать олимпиадные достижения за показатель профессионализма — свидетельство незрелого отношения к разработке.

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

Lead Software Engineer,
автор Telegram-канала @topizza

А по мнению Алексея Некрасова, лидера направления Python в МТС и программного директора направления Python в Skillbox, спортивное программирование — отличный навык, который при грамотном подходе принесёт пользу.

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

Критика спортивного программирования

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

По словам Михаила Корнеева, тимлида в BestDoctor и автора YouTube-канала «Хитрый питон», в спортивном программировании много специфики и ограничений, которых в реальной разработке нет.

«Реальная разработка и спортивное программирование различаются так же сильно, как работа в такси и участие в „Формуле-1“. И там и там нужно проходить повороты, но вы бы, наверное, не хотели, чтобы таксист, который вас везёт, делал это в стиле Шумахера.

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

С ним согласен и lead software engineer, автор Telegram-канала @topizza. По его мнению, ключевое отличие в том, что олимпиадные задачи заканчиваются вместе с олимпиадой, а рабочие — нет.

«Специфика олимпиадных решений отличается от специфики продакшн-приложений. Условно, для олимпиады тебе нужно решить задачу в сжатые сроки и после соревнований можно не вспоминать про неё. То есть не думать, как её поддерживать, улучшать, следить за ней. А в продакшне важно всё это: как обновлять, как фиксить баги, как онбордить новых людей в команду. Вести документацию, делать код читаемым и так далее».

Некоторые разработчики и вовсе считают опыт спортивного программирования в продуктовой разработке скорее злом, чем добром. Например, Фил Ранжин, ведущий подкаста «Мы обречены», руководитель разработки в Lingvotronic.

«Спортивное программирование делает упор на скорость работы, знание математики и прочей науки, в то время как продуктовая разработка делает упор на качество кода и соблюдение процессов».

Что в итоге

Программистов-олимпиадников любят хантить крупные компании вроде Google или Яндекса. Поэтому для студентов и школьников олимпиады запросто могут стать классной возможностью сделать карьеру в юном возрасте и даже без университетского образования попасть в Кремниевую долину на хорошую зарплату.

А вот в массовом продакшне подходы спортивного программирования могут даже мешать:

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

Но даже если вы работаете в обычной компании и не грезите о различных гуглах, спортивное программирование принесёт пользу и поможет натренировать мозг в решении сложных алгоритмических задач. Главное — использовать этот инструмент осознанно и понимать его ограничения. Кстати, если вам просто нравится участвовать в соревнованиях по программированию — это круто! Просто продолжайте и забудьте о рациональной критике соревнований. Ведь счастье важнее этой скучной и нудной рациональности :)

Самые известные турниры

Соревнований по программированию проводится много — на уровне города, области, страны, континента. Мы расскажем о самых популярных международных ивентах, которые помогут прорубить окно в Google, Facebook* и другие интересные компании.

ICPC

The International Collegiate Programming Contest — одно из первых соревнований для программистов. На ICPC соревнуются студенты из университетов всего мира. В 2018 году свои силы пробовали 52 709 студентов из 3233 университетов 110 стран. ICPC спонсируют крупные IT-компании — например, с 1997 по 2017 год деньги давала IBM.

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

Командам даётся пять часов и от 8 до 15 задач по программированию в зависимости от этапа. Для решения используют C, C ++, Java, Ada, Python или Kotlin. Корректность итоговых программ проверяют на тестовых данных: побеждает та команда, которая за пять часов решит больше всех задач. Фишка ICPC в том, что у каждой команды есть только один компьютер. Это усложняет решение задач: для победы необходимо не только уметь программировать, но и работать в команде.

Победителей ICPC охотно нанимают в технологические компании и стартапы на позиции разработчиков или инженеров-программистов. Среди финалистов этой олимпиады — бывший технический директор Facebook* и основатель Quora Адам Д’Анджело, соучредитель Telegram Николай Дуров, создатель Apache Spark Матей Захария.

Интересно, что с 2000 года на мировом этапе первое место занимали только команды из России, Китая и Польши.

Таблица победителей ICPC по годам. Изображение: wikipedia.org

IOI

The International Olympiad in Informatics, или Международная олимпиада по информатике, — ежегодные соревнования по программированию для школьников, проводятся с 1989 года. IOI считается одним из самых престижных соревнований по информатике в мире. Олимпиада проходит при поддержке ЮНЕСКО и IFIP. В 2017 году на олимпиаду выставили своих «спортсменов» 83 страны.

От одной страны может участвовать до четырёх человек — их отбирают на национальных этапах. Сама олимпиада длится два дня: каждый день даётся по три алгоритмические задачи — на их решение отводят пять часов. Решения пишут исключительно на С++. По условиям IOI, нельзя пользоваться литературой и консультироваться с другими участниками.

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

И в этой олимпиаде лидируют команды из Китая и России — за всё время они взяли больше всего наград.

Таблица победителей IOI. Изображение: wikipedia.org

В 2021 году олимпиада пройдёт онлайн.

ICFP Programming Contest

Международные соревнования по программированию ICFP проводятся ежегодно с 1998 года, а результаты объявляют на Международной конференции по функциональному программированию.

Команды могут быть любого размера и использовать любые языки программирования. Победители прошлых лет писали код на Haskell, OCaml, C++, Cilk, Java, F# и Rust. Вступительного взноса нет. На решение заданий отводится 72 часа, и обычно на конкурс подают около 300 работ. Участвовать могут и взрослые, и школьники.

Соревнования от ТорСoder

Эти соревнования по спортивному программированию проходят с 2001 года. Бороться можно в нескольких категориях: алгоритмы, проектирование и разработка, марафоны.

Участники могут использовать пробные тесты и полные тесты. При пробном тестировании участник отправляет свою программу и её тестируют на 10 заранее известных наборах данных. При полном тестировании программу проверяют на 100 секретных, случайно сгенерированных до начала соревнования наборах данных (они одинаковы для всех участников). По итогам участнику сообщают лишь суммарные баллы — без всяких подробностей.

Самые крупные из турниров Topcoder — Topcoder Open (неофициальный чемпионат мира по программированию среди профессионалов) и Google Code Jam, который до 2007 года компания проводила в партнёрстве с Google. А с 2006 года есть и отдельные турниры для школьников — TopCoder High School. За всё время победителям выплатили почти 72 миллиона долларов.

Соревнования от Codeforces

Платформа Codeforces проводит соревнования при поддержке санкт-петербургского Университета ИТМО. В 2018 году на платформе было уже больше 600 000 зарегистрированных участников.

Соревнования курируют титулованные спортивные программисты — белорус Геннадий Короткевич и россиянин Пётр Митричев. Оба не раз побеждали на международных и всероссийских чемпионатах, проводившихся в том числе Google, IBM, Facebook*, «ВКонтакте», Яндексом, Mail.ru Group и другими компаниями.

Платформу Codeforces обычно используют при подготовке к другим соревнованиям по программированию. Еженедельно там проходят короткие двухчасовые «Раунды Codeforces».

Facebook* Hacker Cup

Facebook* Hacker Cup — ежегодные международные соревнования по программированию от Facebook* (что не странно, исходя из названия). Впервые они прошли в 2011 году. Цель простая — находить талантливых разработчиков и хантить их в корпорацию. Участникам предлагают решить набор алгоритмических задач за фиксированный промежуток времени. Можно использовать любой язык программирования и среду разработки. Чаще всего в Facebook* Hacker Cup побеждали россияне и белорусы.

Таблица победителей Facebook* Hacker Cup. Изображение: wikipedia.org

Google Code Jam

Как несложно догадаться, это соревнования по программированию от Google. Конкурс проводят с 2003 года. Как и в других чемпионатах, участники должны решить набор алгоритмических задач за ограниченное время. Можно использовать любой язык программирования и среду разработки. С 2003 по 2007 год Google Code Jam работал на платформе Topcoder. С 2008 года Google разработал для конкурса свою систему.

Соревнование проходит онлайн в несколько раундов. Для участия нужен аккаунт в Google. Решение проверяют с помощью нескольких наборов тестовых данных. Приз — 15 тысяч долларов США.

В период с 2015 по 2018 год параллельно с классическим Code Jam Google проводил Distributed Code Jam — соревнования с упором на распределённые алгоритмы. Цель — та же, что и у Facebook*, схантить талантливых специалистов.

Даже если вы не были олимпиадником, стать программистом никогда не поздно. Начните путь в разработку с курсов от Skillbox. А олимпиадные задачи можно решать и параллельно — для удовольствия и прокачки ума.


* Решением суда запрещена «деятельность компании Meta Platforms Inc. по реализации продуктов — социальных сетей Facebook* и Instagram* на территории Российской Федерации по основаниям осуществления экстремистской деятельности».

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

Участвовать
Школа дронов для всех
Учим программировать беспилотники и управлять ими.
Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована