В IT тема спортивного (соревновательного, олимпиадного) программирования очень спорная. Я это замечал и здесь на Хабре, и в работе. Не раз я слышал о том, что навыки, полученные на соревнованиях или при подготовке, никак не помогают в работе, а в худшем случае, даже мешают и создают проблемы другим.

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

Что это такое

Давайте немного напомню, как выглядят соревнования (контесты) по программированию. В самом классическом виде вы участвуете командой из 3-х человек за одним компьютером без интернета. Вам даётся 5 часов времени и 10-12 алгоритмических задач. Да-да, тех самых, что так любят спрашивать на собеседованиях или LeetCode. Решения проверяются автоматически на основе набора тестов, которые участникам неизвестны. Кто больше задач решил, тот и победил. А при равенстве учитывается количество попыток решения.

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

Пример такой задачи
Пример такой задачи

Как я туда попал

На первом курсе университета (СибГУТИ) у нас организовали олимпиаду по программированию и я решил поучаствовать. До этого я никогда не сталкивался с этим, даже не знал, как это происходит. Но нам обещали какие-то плюшки, что было очень значимо в то время, поэтому я решил поучаствовать.

За 5 часов я умудрился решить 2 задачи. Одна из них — утешительная. Такая всегда есть в наборе, чтобы никто не ушёл с нулём. А вот вторая — была вполне себе нормальная. И я без знаний каких-то алгоритмов, попытки с 20-й смог её решить. Счастливый случай, который сильно изменил мою жизнь.

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

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

Программирование — это спорт

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

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

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

  • Командная работа. Вы втроём решаете общие задачи, учитесь распределять нагрузку, помогать друг другу искать ошибки, дополнять решения.

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

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

  • Умение работать в условиях ограничений, давления. 5 часов на 10-12 задач — это очень мало, на самом деле. Часто приходится выбирать, в какие задачи вкладывать усилия в первую очередь, а какие отбросить.

Это же ровно те качества, которые нужны нам в работе. Я на себе ощущал, насколько проще мне справляться с некоторыми задачами. А навык написания кода можно подтянуть. Тем более, что от команды к команде они отличаются.

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

Спорт и работа

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

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

Часть моей презентации для руководства компании
Часть моей презентации для руководства компании

Делаю своё

Для проведения внутренних контестов нужна была площадка. Какой-то аналог LeetCode или Codeforces, но попроще, чтобы можно было легко развернуть локально и не тратить дни на настройку. Я перепробовал, наверное, десяток вариантов, включая классические PCMS2 и Ejudge, а также ряд безымянных опенсорсных решений. Но всё было не то: часть поставлялась без исходного кода и возможности развития, а часть была слишком сложной и громоздкой в администрировании для моих локальных задач. Идеалом на тот момент была система нашего университета — на ней я тоже проводил пару соревнований. Она была достаточно простой и надёжной, но, увы, тоже без исходников.

После долгих колебаний на очередных новогодних каникулах я решил, что стоит попробовать сделать самому. Так родился мой проект judge.net — система для проведения контестов по программированию!

Я взял привычные для себя на тот момент (2015-2016 года) технологии: .net 4.5, MSSQL, EF,  ASP.NET Web Forms, jQuery. Сердце системы, компонент, который должен запускать решения участников, ограничивать их по времени и памяти, мне долгое время не давался — не хватало знаний по WinAPI. Поэтому я взял готовое приложение, которое запускает другие приложения с нужными мне опциями. Но этого было достаточно, система работала.

Со временем проект переехал на современные технологии (.NET 8, React TypeScript), но привязка к Windows осталась. Думаю, для небольшого проекта это допустимо.

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

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

Соревнование или развлечение

Можно точно утверждать, что если вы ни разу не решали «олимпиадные» задачи, то типичные соревнования вам не понравятся — порог входа всё-таки высоковат. Высок шанс решить всего 1-2 задачи, расстроиться и больше никогда к этому не притрагиваться. Это можно также сравнить со спортом — есть профессионалы, а есть те, кто просто хочет иногда поиграть с коллегами в волейбол после работы. Интересно играть, когда все примерно одного уровня.

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

Так, например, родился формат, в котором нужно проявить свою «мультиязычность» — один язык программирования можно использовать только для одной задачи, поэтому не получится использовать только привычные инструменты, придется вспомнить что-то экзотическое — perl или даже 1С.

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

Здесь полный контроль над системой так же даёт преимущество — всегда можно немного подхачить и сделать контест ещё интереснее.

Когда я пришёл работать в Контур, то продолжил создавать контесты уже для новых коллег

Кстати, о Контуре я узнал когда-то из-за олимпиад — он был спонсором. Уже тогда у меня сложилось какое-то положительное впечатление о компании и инженерной культуре.

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

Немного про Контур и спортивное программирование

Контур всегда в том или ином виде организовывал тренировки для олимпиадников: для этого использовались площади компании, а тренерами были сами контуровцы. Например, уже в июне 1996 прошёл первый чемпионат УрГУ, а организатором и тренером был один из сотрудников.

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

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

Давайте вернёмся к началу. Спортивное программирование — это не универсальная таблетка и не обязательное условие для успешной карьеры. Вы вполне можете стать отличным сеньором, ни разу не открыв LeetCode.

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

Немного статистики по соревнованиям, которые я уже провёл (не только в Контуре, а суммарно):

- Больше всего успешных решений сделали на C# 9.0 (.net 4.8) — 442 решения.

- Самый редкий язык — это Rust 1.72.0. Всего 22 успешных решения.


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

Комментарии (8)


  1. APXEOLOG
    15.07.2026 09:00

    Намного важнее то, какие положительные качества и навыки вырабатывает в себе такой спортсмен:

    • Командная работа. Вы втроём решаете общие задачи, учитесь распределять нагрузку, помогать друг другу искать ошибки, дополнять решения.

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

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

    • Умение работать в условиях ограничений, давления. 5 часов на 10-12 задач — это очень мало, на самом деле. Часто приходится выбирать, в какие задачи вкладывать усилия в первую очередь, а какие отбросить.

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

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

    У спортивного и "бизнес" программирования разные задачи и ограничивающие условия.

    В спортивном программировании: ограничения по памяти, производительности, времени на решение задачи.

    В "бизнес" программировании: трех ограничений выше в 99% случаев нет. Но твой код должен быть поддерживаемым и расширяемым.

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


  1. SpiderEkb
    15.07.2026 09:00

    В спортивном программировании: ограничения по памяти, производительности, времени на решение задачи.

    В "бизнес" программировании: трех ограничений выше в 99% случаев нет. Но твой код должен быть поддерживаемым и расширяемым.

    Не соглашусь. В бизнесе очень часто эффективность не менее важна чем поддерживаемость. И тут приходится искать баланс и решения где одно не вступает в противоречие с другим.


  1. domix32
    15.07.2026 09:00

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

    Спортивное программирование это скорее индикатор, чтобы показать человеку чего тот не знает и каким подходам можно научиться.


    1. wataru
      15.07.2026 09:00

      Сразу видно, человек с олимпиадным програмимрованием не знаком.

      с использованием нечитаемых техник вместо вызова каких-нибудь simd интрисиков,

      На олимпиадах их обычно нельзя использовать. Самый адский хак - это битовая магия какая-нибудь. И даже если ее потом использовать в индустриальном коде, ее запросто можно написать очень даже читаемой.

      Ну и командная работа в спортивном программировании - это скорее исключение.

      Самое пристижное и популярное соревнование - ICPC - командное. Трем людям дается один компьютер и они должны: разделять задачи, объяснять свое решение, писать его так, чтобы двое других поняли.

      Даже без этого в олимпиадной среде надо уметь объяснять свое решение и понимать чужие. Потому что огромный пласт знаний передается живыми людьми друг-другу. Это очень ценный навык для коммандной работы.

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


      1. domix32
        15.07.2026 09:00

        Сразу видно, человек с олимпиадным програмимрованием не знаком.

        ну, так-то участник как офлайн так и онлайн соревнований. в одной региональной даже в своё время даже второе место занял.

        На олимпиадах их обычно нельзя использовать.

        поэтому и написал "вместо". обычно явных запретов на это нет, но проблема всплывает чаще всего из-за необходимости знать архитектуру машины, которая проверяет решения и необходимости добавить что-нибудь к флагам сборки. в С++ 26 simd появился в стандартной библиотеке и если этот язык будет разрешен в конкретных контестах, то по каким религиозным соображением это стоит запрещать? Та же история с asm вставками.

        Самое пристижное и популярное соревнование - ICPC - командное.

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

        объяснять свое решение и понимать чужие

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

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

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


  1. iii1iii1
    15.07.2026 09:00

    Хотел бы повидать этот знаменитый "неподдерживаемый" код, которым корпораты так шеймят спортсменов и противопоставляют ему свою SOLID'ную писанину...

    Сам участвовал в олимпиадах, и вполне себе понимаю зависть к победителям, а заодно и желание обесценить их достижения в стиле "ну и что, что он выжал лежа 200 кг, в жизни это не пригождается, главное какой ты человек!"
    Ну и вот, в итоге карьера в нашей айтишечке удалась, ты за счет удачи, дружеских/родственных связей сидишь такой на должности, прости Госсподи, сеньора-лида, и нанимаешь себе людей (а я собеседовал и не только себе, но и еще для кучи смежников собеседовал, потому что некому было).
    Рядом, как водится, сидит HRочка из анекдота "я отсекаю всех кто читал Танненбаума, у них слабые софты", и дает мудрые советы, хотя еще вчера ей доверяли только кофе приносить.
    И приходит к тебе такой вот выскочка спортсмен-олимпиадник (который в алгоритмах уделает тебя как Бог черепаху), и от тебя зависит, возьмут ли его! Вот и наступило время расплаты за унижения на той олимпиаде 20 лет назад!
    Вот поэтому у вас вместо тестовых заданий устная проверка зубрения того самого заплесневелого SOLID, и прочие отвлеченные разговоры, по результатам которых будет максимально субъективная оценка "кандидат проявил низкие командные качества", "не впишется в копр. культуру" и т.п.


    1. SpiderEkb
      15.07.2026 09:00

      Спортивное и промышленное программирование родственны ровно так же, как родственны спринт и марафон.

      10 задач на 5 часов - это короткие задачи. А в бизнесе часто приходится решать задачи длинные, от недели и до месяца. Совершенно иной объем кода, сущностей и взаимосвязей между ними, которые нужно удержать в голове. Да и объем бизнес-логики и разных условий там может быть несравнимо больше.

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

      Ну и не забывать что потом кому-то (может вам а может и нет) через год-два-три (а то и более) придется это все дорабатывать потому что что-то где-то поменяется в бизнес-процессах (например). И этот кто-то (а может и вы через три года) должен ваш код легко понять и быстро понять где и что надо поменять в соответствии с новыми требованиями.

      Я далек от того, чтобы считать "олимпиадников" непригодными к бизнес-разработке (хотя был случай именно такого - блестящий олимпиадник, но бизнес не тянул - ему просто становилось скучно и наступало "временное выгорание"), но это, все-таки, "две большие разницы...


  1. wataru
    15.07.2026 09:00

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

    Но от этой привычки можно избавиться буквально за пару недель при наличии код-ревью в процессе разработки.

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