Программирование как вид спорта: что делать, чтобы побеждать на соревнованиях +16




Привет, Хабр! Сегодня я хочу познакомить вас с Андреем Чумаченко, руководителем сообщества по спортивному программированию в Иркутске и титулованным участником соревнований по программированию, в том числе ICPC и Всесибирской олимпиады имени И.В. Поттосина.

Мы поговорили с Андреем про спортивное программирование, подготовку к соревнованиям и про его работу тренером. Под катом — полезные и вредные советы участникам соревнований, вопросы мотивации, истории с соревнований, отношение к ЕГЭ и школе спортивного программирования в Иркутске.


Финал студенческого командного соревнования по программированию ICPC, 2016 год (источник: ICPC Live)

Андрей Чумаченко — основатель и руководитель сообщества по программированию в Иркутске, студент магистратуры ИГУ по фундаментальной информатике, призер полуфинала студенческого чемпионата мира по программированию ICPC — 2018, 2019 (среди стран СНГ), призер Всесибирской олимпиады имени И.В. Поттосина — 2018, 2019 (среди стран СНГ), победитель четвертьфинала студенческого чемпионата мира по программированию (среди студентов Восточной Сибири) — 2018, 2019, победитель Универсиады Алтая по программированию — 2019 (среди студентов и школьников России), финалист чемпионата БГУИР по программированию — 2018, 2019.

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


С чем его едят


— Что такое «спортивное программирование» и какие задачи там сейчас решают?

— Для меня это в первую очередь соревнования, подготовка к ним и, конечно, особенное сообщество людей.

Ведь программирование для кого-то — это как биатлон для Шипулина: реальный спорт, азарт, огонь.

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


2016 год, студенты УрФУ только что выиграли международный чемпионат по программированию Challenge 24 в Будапеште. Тогда в десятку лидеров вошли семь команд из России (источник: codeforces.com)

— Какой язык сегодня самый популярный в спортивном программировании? Моя подруга в московском Политехе на прикладной информатике (janka2330) изучала спортивное программирование как предмет и сдавала зачет. Говорит, было круто. Они соревновались с однокурсниками и сдавали задачи на spoj.pl (spoj.com), а писали на Ruby on Rails.

— Язык сильно зависит от соревнований. Чаще всего я встречаю С++, также популярны Java, Python. Еще «новичок» Kotlin в последнее время набирает обороты. Ruby on Rails, да и просто Ruby, редко используют, но на некоторых соревнованиях они были в списке поддерживаемых языков. Я сам всегда пишу на C++, и мои ученики тоже. Мне он кажется наиболее удобным, когда надо быстро что-то закодить.


Языки, которые чаще других используют на соревнованиях


Как готовиться, чтобы победить


— Расскажите про подготовку к соревнованиям. У вас наверняка есть свои секреты.

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

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

Затем мы отслеживаем прогресс, сравниваем результаты и устраиваем разбор задач, чтобы в следующем раунде быть более успешными.


Архив олимпиадных задач codeforces.com

Еще заглядываем на acm.timus.ru — крупнейший в России архив задач по программированию с автоматической проверяющей системой. На YouTube сейчас много чего появилось, но на постоянной основе мы его пока не используем. Если интересно, могу посоветовать оттуда крутого польского программиста под ником Errichto, у него свой канал, там можно накопать кучу полезностей.


Второй канал польского программиста под ником Errichto на YouTube

Ну и книги, конечно, как без них: «Искусство программирования» Дональда Кнута, например. Или «Олимпиадные задачи по программированию. Руководство по подготовке к соревнованиям» Стивена Скиены и Мигеля Ревиллы.

Лайфхаки для участника


— Ок, а что может помешать выиграть на олимпиаде по спортивному программированию?

— Наверное, враг всех студентов — лень (шучу). А если серьезно, то нужно быть сосредоточенным на задачах и ненадолго отключить ту часть мозга, которая отвечает за всякие насущные дела.

Еще очень вредно тренироваться в ночь перед соревнованиями, тем более если не готовился в течение года.

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

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

— А чтобы победить, что нужно делать?

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

Когда идти в программисты


— Расскажите про свой путь в спортивном программировании.

— Я считаю, что довольно поздно стал погружаться в эту тему: только в старших классах школы я серьезно начал изучать C++ и участвовать в олимпиадах, которые проводили университеты Иркутска. Затем, уже поступив в ИГУ, я встретил преподавателя, который поддерживал движение по спортивному программированию, и начал заниматься с ним. Так, потихоньку, спортивное программирование для меня перестало быть просто хобби, я занялся этим серьезно, стал активно участвовать в соревнованиях и дорос до тренера.


Андрей разбирает одну из олимпиадных задач на августовских сборах в Иркутске

— Вы считаете, что в старших классах поздно начинать? Неужели программирование и вправду можно сравнить с профессиональным видом спорта, в который детей отдают чуть ли не с трех лет?

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

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

Поэтому — чем раньше, тем лучше.

ЕГЭ — больная тема


— Раз мы заговорили о школьниках, как вы относитесь к ЕГЭ и подобным стандартам, по которым измеряют знания? Все-таки программирование — это творческая специальность, хотя и сугубо техническая.

— Я безусловно за то, чтобы предметы в школах, и особенно в университетах, были факультативными, и человек мог выбирать из всего множества то, что ему по душе. Так и учиться гораздо приятнее, и результат налицо — не сравнить, когда из-под палки все делаешь.

Что же касается ЕГЭ, то это больная тема. Тут я могу наговорить материала на еще одну статью.

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

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

Сейчас в вузы можно поступать и по результатам олимпиад. И это круто для топовых школьников, для 10%. А что делать с остальными? Только ЕГЭ.

Да, есть простые олимпиады третьего уровня из перечня, но они часто еще более несуразны или содержат задачи из ЕГЭ.

Другое дело — это отношение и подача ЕГЭ. Вся та истерия, которая нагоняется родителями, обществом, учителями прежде всего. Это лишнее. Те же самые учителя часто абсолютно некомпетентны в подготовке школьников к ЕГЭ. Дело не в сложности экзамена — ничего сверхъестественного в нем нет. Дело в слабом уровне учителей, их зарплате, отношении государства к ним. По цепочке страдают и школьники.

О стандартах в целом — конечно же, образование должно двигаться в сторону гибкости. Как я уже сказал, хорошо бы школьникам самим выбирать интересующие предметы. ЕГЭ в этом плане неплох: можно сдавать его по любому количеству предметов. Но в идеале надо научится смотреть на школьника как на индивидуальность.

— А вы не видите аналогичную шаблонность в оценивании знаний на олимпиадах по программированию? Или там все по-другому?

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

Почему школьники учат спортивное программирование


— В чем мотивация студентов и школьников вливаться в сообщества по спортивному программированию и участвовать в олимпиадах? Чему их может научить спортивное программирование, какие навыки помогает развить?

— Мотивация совершенно разная: кто-то пришел, чтобы выучить язык программирования и получить больше практики и алгоритмических знаний, кто-то таким образом захотел попробовать себя и свои силы (участие в олимпиадах — та еще проверка). Некоторые собирают портфолио для поступления в вуз или для будущей работы, хотят, чтобы их заметили IT-компании во время соревнований. Есть те, кто приходит ради общения, чтобы поддерживать и развивать комьюнити.

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

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

— Что вы делаете в рамках своего сообщества спортивного программирования?

— Сегодня я тренирую студентов, и мы ездим на олимпиады и соревнования по спортивному программированию. Среди моих учеников — призеры четвертьфинала студенческого чемпионата мира по программированию (среди студентов Восточной Сибири) 2019 года, призеры сибирской площадки полуфинала студенческого чемпионата мира по программированию ICPC 2019 года, призеры Универсиады Алтая по программированию — 2019, финалисты олимпиады имени Поттосина 2018 и 2019 годов.

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

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

Плюс мы организуем соревнования по программированию, а не так давно провели интенсив, который длился 11 дней. Почти каждый день были пятичасовые соревнования, за которыми следовал разбор задач — так называемая работа над ошибками, и лекции (немного теории про алгоритмы). В качестве тренеров выступали я и мой товарищ из МИФИ. Участниками интенсива были школьники из центра олимпиадной подготовки ENTER из Улан-Удэ (Республика Бурятия) и студенты из Иркутска, которые регулярно участвуют в олимпиадах по спортивному программированию.


Августовский интенсив по спортивному программированию в иркутской Точке

Был у меня такой случай


— Давайте разберем один кейс. Предположим, я тестировщик, и у меня в команде два программиста. Одного из них назовем плохим: делает все быстро, но отдает на тестирование нерабочий код, и я несколько раз в спринте отправляю ему одну и ту же задачу на доработку. Другой — назовем его хорошим — делает задачи дольше первого программиста, но сдает код, который не требует правок. Вопрос: спортивное программирование учит быть плохим или хорошим программистом? Ведь на соревнованиях время на решение задач ограничено — наверное, и код страдает, и решения тоже…

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

Чистота кода иногда страдает, ведь цикл поддержки — всего пять часов, но чем больше опыта у участника, тем тщательнее он следит за кодом.

— Поделитесь интересными историями с соревнований.

— Все наши забавные истории обычно связаны с задачами. Например, я однажды долго мучился над решением, потому что не заметил, что фразу no solution нужно было вывести с переставленными в одном месте буквами — no soluiton.

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



Минутка рекламы про наш акселератор AI-проектов

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

Отбор и программа преакселерационной подготовки — бесплатные. А если вы пишете о своем проекте на Хабре — вам плюс в отборочный рейтинг! О самых интересных проектах расскажем в нашем блоге.




Комментарии (4):

  1. DistortNeo
    /#22077868 / +2

    А мне нравилось участвовать в олимпидах, потому что:


    1. Программировать — это интересно.
    2. За победы дарили подарки.
    3. Можно было объездить кучу разных мест.

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


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

    • sovaz1997
      /#22078342

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

  2. somurzakov
    /#22080792

    олимпиадное програмимрование дает три основных навыка: декомпозиция задачи, умение строить свои структуры данных, и создавать свои алгоритмы/применять известные алгоритмы к прикладным задачам. И все в рамках нескольких часов.
    Именно эти навыки и тестируют крупные западные компании во время технического интервью (знаменитый hackerrank). Интернет полон людей которые не знают ничего про олимпиадное программирование и плачут про то, какие сложные задачки задает треклятый фейсбук/гугл на интервью

    • DistortNeo
      /#22080856 / +1

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

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


      А всё дело в том, что нет настолько высокой потребности в алгоритмистах. Ядро того же Вконтакте было создано усилиями пары человек, затем к ним присоединилось ещё несколько олимпиадников. Для всей остальной обвязки оказалось достаточно обычных программистов.