• A
  • A
  • A
  • АБB
  • АБB
  • АБB
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта

От успешного олимпиадного программиста требуются разносторонние знания

В сентябре 2014 года на факультете компьютерных наук открылся Центр студенческих олимпиад, воспитанники которого, студенты первого курса бакалавриата, прошли в финал чемпионата мира по программированию ACM ICPC в Марокко. Команды Вышки на этом соревновании уже добивались значительных успехов: в 2014 году студенты магистратуры НИУ ВШЭ завоевали бронзовые медали на чемпионате мира.

От успешного олимпиадного программиста требуются разносторонние знания

Вячеслав  Алипов, выпускник образовательной программы «Науки о данных» и один из участников команды 2014 года, рассказал зачем заниматься олимпиадным программированием, как попасть в финал ACM ICPC и какие возможности это открывает в будущем. Сейчас Вячеслав работает в Яндексе на позиции старшего исследователя-разработчика в направлении рекламных технологий.

Другие участники команды Миша Колупаев и Александр Куприн работают в крупнейших мировых социальных сетях Facebook и Вконтакте.

С 17 сентября в Вышке  начнает свою работу факультатив Центра студенческих олимпиад «Подготовка к студенческим олимпиадам по программированию». Занятия будут проходить по четвергам на факультете компьютерных наук и по субботам в Яндексе.


Начало пути

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

Что мотивирует тренироваться

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

Так вначале меня мотивировали сильные соперники, хотелось скорее выйти на уровень, когда получается хоть что-то, потом все лучше и лучше. Но олимпиадное программирование – это довольно низкодисперсионный вид спорта, то есть обогнать фаворитов очень сложно, результаты выступлений обычно стабильны. У нашей команды были достижения. Мы стабильно брали дипломы на полуфинале. На одной из Открытых Всесибирских олимпиад по программированию им. И.В. Потосина мы стали чемпионами Сибири, впервые для команд не из НГУ. Но медали чемпионата мира по программированию ACM ICPC по-прежнему казались далеко. К концу бакалавриата на меня стало давить то, что времени на тренировки я тратил очень много, но ничего значительного достичь не получалось. И все тяжелее было заставлять себя вкладывать свое время в деятельность, которая не приносила желаемого результата.

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

Дорога к финалу

В 2012 году я поступил на совместную магистерскую программу Вышки и ШАДа. С Мишей Колупаевым, мы уже были знакомы: он учился в Томском государственном университете, и в бакалавриате команды наших вузов были соперниками. Саша Куприным заканчивал специалитет в Орле. Уже поступая в Вышку, Миша и Саша рассчитывали на выход команды в финал от нашего университета . Увидев меня в числе поступивших, они позвали меня в команду. Я не мог упустить еще один шанс побороться за финал. Наша команда тренировалась самостоятельно, без тренера. Миша был нашим капитаном, и во многом достижения нашей команды – это результат именно его усилий и нечеловеческой самоотдачи. Так много, как Миша, не тренировался никто.

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

У Миши и Саши оставалось по одной попытке выйти на финал, а учиться в магистратуре нам предстояло два года. Поэтому мы решили ехать только на второй год, а первый год посвятить тренировкам. На все вопросы мы отшучивались, что в первый год на финал не поедем, потому что он будет проходить в Санкт-Петербурге. Обычно финал ACM ICPC проходит за границей, и для студентов это всегда хорошая возможность съездить посмотреть какую-то страну. Так вот финал следующего года должен был проходить на Гавайях...  Позже правда выяснилось, что тот финал, в котором мы будем участвовать, пройдет в Екатеринбурге, и все наши шутки нам припомнили.

Мы почти выиграли полуфинал: 7 команд решили одинаковое количество задач, и любая команда, которая сдала бы еще одну задачу, становилась победителем и чемпионом России (полуфинал был совмещен с чемпионатом). Но мы не поверили в решение еще одной задачи, решив, что оно не может быть таким простым. А на разборе оказалось, что именно таким и было правильное решение. Итак, мы получили диплом первой степени полуфинала чемпионата мира по программированию, заняв 7-ое место по всему Северо-Восточному региону.

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

Самый яркий момент на ACM ICPC

Очень напряженным был момент оглашения результатов. За час до конца соревнования мы были на третьем или четвертом месте. Согласно правилам, в этот момент таблицу результатов заморозили, чтобы сохранить интригу. Так как на замороженном экране мы были почти в самом верху, а на церемонии награждения результаты оглашаются с самого низа таблицы, то мы имели удовольствие наблюдать, как более 100 команд «летят» по таблице вверх. С некоторого момента отдельные команды стали перелетать и через нас, сдвигая нас все ниже. Мы пытались вычислять, у кого еще есть шанс обогнать нас. И, конечно, мы были вне себя от счастья, когда увидели, что мы уже точно не опускаемся ниже 12 места, т.е. точно получаем медали. Наконец-то, мы добились весомого достижения.

В итоге, на финале ACM ICPC 2014 мы заняли 10 место, получив бронзовые медали.

Работа, учеба и соревнования 

Я и Миша начали работать в Яндексе стажерами-разработчиками незадолго до поступления в магистратуру. Два года мы совмещали все три «должности»: работу в Яндексе, изучение 4-5 курсов в ШАД и курсов в Вышке, а также подготовку к соревнованиям.

При этом мы старались нигде не лениться. В Вышке мне удавалось быть на первом месте в рейтинге отделения ПМИ по результатам всех восьми сессий. В ШАД мы тоже сдавали все на «отлично». Да и в Яндексе мы не халтурили, и довольно быстро нас перевели в штат, потом мы стали младшими разработчиками, а через год после начала работы - просто разработчиками. Вскоре после выпуска из ШАД, меня повысили до старшего разработчика.

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

Самым сложным было «переключение контекстов». Когда ты встаешь с утра, идешь на работу, ты погружен в одну задачу. Через 4-5 часов нужно ехать на пары в Вышке. Вечером – идешь в ШАД. После трех часов интенсивных занятий в ШАД, приезжаешь домой, где уже пора делать домашние задания. И, пожалуй, именно это переключение было самым выматывающим: ты не мог погрузиться в одно или хотя бы два дела. Выходные мы посвящали тренировкам или домашним заданиям. Но жить в таком ритме даже было здорово: я всегда был занят, всегда делал что-то важное и полезное и практически никогда не страдал от прокрастинации.

Почему стоит заниматься олимпиадным программированием

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

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

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

Во-вторых, олимпиадная деятельность - это отличный способ получить не только широкие, но и глубокие знания в Computer Science. Ты не просто запоминаешь алгоритмы, чтобы сдать экзамен. Но ты досконально разбираешься с каждым алгоритмом: как можно было бы его вывести и доказать корректность, как его модифицировать, как заставить работать лучше на разных входных данных.  

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

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

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

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

Полную версию интервью Вячеслава Алипова читайте на странице «Выпускники» факультета компьютерных наук.

Интервью подготовила Ольга Подольская.