«Выпускники получают знание о том, что способны на большее, чем им может казаться»

 

Вячеслав Алипов. Выпускник 2014 года магистратуры Базовой кафедры Яндекса отделения прикладной математики и информатики, работает в Яндексе на позиции старшего исследователя-разработчика в направлении рекламных технологий.

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

Вячеслав рассказывает о том, зачем заниматься олимпиадным программированием, как попасть в финал ACM ICPC и какие возможности это открывает в будущем, а также об учебе в магистратуре Вышки и ШАД.

 

- Ты закончил бакалавриат по прикладной математике и информатике в Томском политехническом университете. Как пришло решение поступать в совместную магистратуру Вышки с ШАД?

Я понимал, что хочу заниматься чем-то, связанным с информационными технологиями, искусственным интеллектом. Когда я выбирал магистерскую программу, то узнал про совместную программу Вышки с Яндексом, это звучало многообещающе. Список курсов и преподавательский состав в ШАД меня сразу подкупили. Я написал олимпиаду для выпускников вузов, выиграл ее и так поступил.

- Оправдались твои ожидания от магистерской программы?

Да, полностью. Я был жаден до знаний, поэтому сразу записался на много дополнительных курсов, которые предлагались в Вышке. Например, я посещал курс В.А. Гордина по дополнительным главам дифференциальных уравнений. На этот курс ходили только я и мой коллега по команде Миша Колупаев. По словам Гордина, мы были очень хорошей аудиторией – все слушали и во всем разбирались, поэтому он успел дать нам очень много материала. Еще запомнился факультатив по математической статистике И.И. Цитовича. Мне импонировал его подход: формализовать понятия из обыденной жизни с помощью мат. статистики, попытаться понять, что происходит в экономике или политике, проводя аналогии с многомерными пространствами и многомерными распределениями. Но основные мои воспоминания о магистратуре, конечно же, связаны с ШАД. По-моему, самые полезные знания я получил именно там.

- Чем тебе запомнилась Школа анализа данных?

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

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

Домашние задания в ШАД разрушают в голове «шумовой барьер». Поясню, что я имею в виду: скорее всего до поступления в ШАД ты вообще не думал, что студентам могут такое поручить. Ты не представлял, что за такую задачу можно взяться и реализовать ее за обозримое время. А тут тебе ее задают, тем самым намекая, что решить ее возможно. И это априорное знание помогает взяться за задачу и, в конечном счете, ее сделать.

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

- Когда ты начал заниматься олимпиадным программированием?

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

- Что мотивировало тебя на тренировки?

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

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

- Как в итоге получилось, что ты попал в команду, с которой получил медали на финале чемпионата мира?

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

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

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

- Как вы вышли в финал?

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

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

- Чем запомнился финал?

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

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

- Чем твои коллеги по команде занимаются сейчас?

Миша Колупаев работает в лондонском офисе Facebook. Саша Куприн работает во Вконтакте в Санкт-Петербурге.

- Как началась твоя карьера?

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

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

- Трудно было совмещать работу с учебой в магистратуре?

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

- Какими задачами ты занимался в Яндексе?

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

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

- С чем связаны задачи этой группы?

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

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

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

- Тебе интересно работать в этом проекте?

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

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

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

- Что можешь сказать об атмосфере в Яндексе?

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

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

- Как выбрать свой путь после окончания вуза?

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

Но во всем океане возможностей ШАД – это абсолютно точно правильный выбор, и то решение, о котором не пожалеешь.

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

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

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

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

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


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


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

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

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

 

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