Как эффективно подготовиться к олимпиадам по программированию?

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

Михаил Рубинчик, менеджер Образовательные программы СКБ Контур, тренер команд УрФУ по спортивному программированию

Сейчас проводится много разных олимпиад по информатике и программированию. В России самую долгую историю имеют олимпиады по правилам ACM ICPC, а также довольно похожие на них олимпиады школьников. В целом они по подготовке очень похожи (хотя немного отличаются тактиками).

Мы будем говорить про ACM ICPC, т.к. для таких олимпиад есть множество готовых рецептов. Прежде всего, нужно научиться решать задачи. Как ни странно, чтобы научиться решать задачи, нужно решать задачи :) Поэтому самый верный путь для новичка такой: открываешь любой архив задач и решаешь по возрастанию сложности. Если вдруг какая-то задача уж очень долго не поддаётся, пропускаешь её и решаешь следующую. Если слишком много задач пропущены, то стоит посоветоваться с более опытным олимпиадником, нет ли там какого-то сакрального знания. Прорешивание архива задач — это самый важный на старте процесс. Например, можно использовать acm.timus.ru. А далее постепенно добавлять другие элементы: чтение книг и сайтов по алгоритмам (например, e-maxx.ru), участие в онлайн соревованиях (codeforces.ru, opencup.ru).

Артём Зюрюкин, генеральный директор Zartis Russia

Можно поучаствовать в семинарах при университете, проводящем олимпиаду, а также найти тех, кто уже участвовал. Если вы планируете принять участие в международной олимпиаде (например, крупнейшей в мире ACM/ICPC), то найти тестовые задания и материалы для подготовки можно и на сайте самой олимпиады. Кроме того, полезным будет обсудить сложности с участниками сообществ выбранных олимпиад в социальных сетях.

Андрей Зырянов, руководитель научно-исследовательской лаборатории Parallels Lab в МФТИ

Олимпиады бывают разные. Отсюда и требования разные. Если «классические», как ACM ICPC, то вам нужно начать решать задачи на acm.mipt.ru и judge.mipt.ru. Если по информационной безопасности (Capture The Flag) — изучать архитектуру ЭВМ, криптографию и сетевые протоколы. По разработке ПО (DevCup, ImagineCup, «Старт в науку») — изучать ООП и работать в команде над небольшими проектами. Залог эффективности — трудолюбие. Этим нужно заниматься, причем постоянно. Если нет прогресса в самостоятельном изучении, потребуется помощь преподавателей.

Роман Юферев, руководитель направления ИТ-менеджмента и мониторинга в компании VIAcode

Ходить на эти самые олимпиады. Смотреть задачи. Осознавать, что ничего не понимаешь и разбираться. Идти на следующую олимпиаду. Вот такая вот «многоходовочка».

Сергей Масягин, проректор по работе со студентами и абитуриентами Университета Иннополис

Для ответа на этот вопрос мы опросили чемпионов мира по программированию Николая Калинина, Геннадия Короткевича, Нияза Нигматуллина, Андрея Станкевича и Павла Маврина, которые сейчас тренируют новое поколение. Все они сходятся во мнении, что главное в этом вопросе — много практики. Обратите внимание на codeforces.ru, topcoder.com — периодически там бывают контесты, после которых на сайтах появляются разборы к ним. Также рекомендую к прочтению Programming Challenges, Miguel Skiena. Есть множество ресурсов, где можно найти теорию, таких как e-maxx.ru, habrahabr.ru.

Антон Пискунов, основатель и генеральный директор BeastGaming

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

Сергей Зефиров, программист с широким опытом работы, энтузиаст и евангелист языка Haskell

Не готовиться к олимпиадам по программированию. Совсем.

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

Готовясь к олимпиадам, вы наработаете себе стиль и подход к программированию, который придётся довольно долго исправлять.

Всеволод Шмыров, разработчик в команде API Яндекс.Карт

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

Олег Горшков, руководитель отдела системной интеграции ecommerce-студии Simtech Development

Здесь нет волшебных способов или специальных фокусов. Чтобы показать отличный результат на олимпиаде, прежде всего, нужно знать дисциплину. То есть тот язык, на котором вы программируете. Поставьте цель и упорно к ней идите. Набивайте руку на программировании и более глубоком изучении языка. Очень хорошо помогает прорешивание задач, которые были в прошлые годы и на других олимпиадах. Усложняйте их, придумавайте подобные и реализовывайте.

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

Александр Рожнов, Team Lead в компании Undev

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

Александр Чистяков, главный инженер в Git in Sky

Единственный известный мне способ научиться эффективно решать олимпиадные задачи — это все время тренироваться делать это.

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