«Самое главное – ты видишь результаты своей работы и ими пользуются миллионы»


Дмитрий Вихарев
, выпускник магистратуры 2011 года отделения программной инженерии по направлению «Разработка программного обеспечения». В настоящее время работает в компании Mail.Ru на позиции разработчика в отделе поиска. Дмитрий рассказывает, какие навыки он приобрел, участвуя в соревнованиях ACM ICPC и Imagine Cup, кто такой разработчик полного стэка и что скрывается за поисковой строкой.
- Дмитрий, расскажи, как ты оказался в ВШЭ?

Первое образование я получил в Дальневосточном федеральном университете по направлению «Компьютерная безопасность». Я всегда думал, что пойду работать в банк, «защищать информацию», но первым на мое резюме отреагировал «Мегафон»  мне перезвонили, спросили, знаю ли я базы данных и могу ли работать с Oracle. Так началась моя первая работа, которая продлилась около года. Параллельно я вел свой проект по электронным деньгам: как-то мне попалась статья, в которой исследователи описывали некоторую модель работы с электронными деньгами, но не предлагали ее реализацию. Мы с друзьями разобрались в этой модели и решили ее реализовать. В итоге получился работающий проект, который не стыдно было показать. Мы стали подаваться на всевозможные конкурсы и олимпиады. Победили на соревнованиях во Владивостоке, а затем подали заявку на Microsoft Imagine Cup и вначале заняли 1 место на полуфинале в Томске, а затем – 2 место по России на финале. За основу взяли статью «Compact E-Cash», точнее даже – «Practical Compact E-Cash», в статье описан только сам алгоритм и протокол, но никто его до нас не реализовывал на практике. Мы же его реализовали с использованием открытой библиотеки MIRACL и даже поделились результатами работы с авторами статьи.

Примерно через месяц со мной связался Сергей Михайлович Авдошин, рассказал про магистерскую программу на отделении программной инженерии и предложил попробовать на нее поступить. Когда я посоветовался с родителями, папа спросил: «И что, ты еще думаешь?» Я быстро собрал все документы, сдал IELTS для конкурса портфолио и поступил.
- В одной из твоих статей на Хабре ты говоришь: «Написать статью меня побудило желание напомнить студентам про одну из самых известных олимпиад по программированию – ACM ICPC». Ты участвовал в этих олимпиадах?

Я собрал команду, когда был на втором курсе. Мы пошли в библиотеку, купили книжек – сейчас помню Кормена и Лейзерсона – и собирались по субботам в аудиториях программировать. Ментора у нас не было, учились сами, какой-то опыт переняли от старшекурсников. В итоге мы нарешали задач по 400-500 и стали выходить на соревнования. Во Владивостоке побеждали, но на России – на полуфинале ACM ICPC в Барнауле  высоко подняться не удалось, самым удачным было примерно 40 место из 250. Обычно на этих соревнованиях побеждают те, кто занимается ими со школы, а мы фактически только на втором курсе узнали только, что такое C++.

- Получается, ты участвовал в Imagine Сup и ACM ICPC. Это совсем разные соревнования по духу и навыкам. Что дает участие в них?

Imagine Cup – это опыт публичных выступлений, хороших презентаций, создания «вау-эффекта» и общения с аудиторией. Программный продукт может быть без какой-либо изюминки, но главное, чтобы выглядел хорошо. И в презентации нужно удивить публику, доказать всем, что продукт интересный или перспективный. Это позволяет «прокачать», так называемые, soft skills. Для участия в ACM можно быть совсем не общительным и при это успешно выступать, если знать алгоритмы и обладать математической базой, хорошо писать код и много тренироваться. Участие в этих соревнования скорее позволяет развить hard skills. Мне нравилось развивать и то и другое.
- Как протекала жизнь во время обучения магистратуре?

Ритм жизни был бешеный. Общежитие находилось в Одинцово, и получалось, что каждый день уходило 20 минут, чтобы дойти пешком до электрички, 40 минут – доехать до Москвы, дальше метро. Итого, дорога в одну сторону занимала 2 часа. В будние дни нужно было ездить на работу к 9 утра, там трудиться до 5-6 часов вечера и после этого ехать на занятия в магистратуру. Во время обучения в магистратуре я работал в компании «Киберплат», занимался развитием платёжного протокола. Дома я оказывался к полуночи и в моем распоряжении для занятий была ночь, до 7 утра. Но если честно, это время вспоминается как очень классное, большинство друзей у меня появились именно благодаря общаге и университету.
Магистерскую диссертацию я писал у Сергея Михайловича. Мне пришла в голову идея, что было бы здорово подойти, например, к какому-то объявлению, сфотографировать его и распознать весь текст. Я поискал информацию в Интернете и выяснил, что у Hewlett Packard был разработан продукт, основанный на технологии optical character recognition, который потом перекупил Google и назвал его Tesseract. Это открытый движок на C++, он решал именно ту задачу, которую я хотел. Взяв его за основу, я делал для него мобильную версию под Android.
- Расскажи, как развивался твой карьерный путь.

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

В Яндексе я занимался поиском по картинкам. Задача была примерно в следующем. Пользователь вводит запрос, например, «фотография пейзажа». И на основании пользовательских логов можно сделать вывод, что больше всего (то есть чаще всего) пользователю нравится фотографии гор, на втором месте море и т.д. Нужно расставлять эти картинки в правильной последовательности – наиболее популярные должны оказываться в выдаче выше. В Яндексе еще есть специальные элементы поисковой выдачи, они называются «колдунщики». Работают колдунщики так: например, если пользователь пишет запрос «как выглядит камчатский краб», то система должна определить, что этот запрос картиночный и тогда включается картиночный колдунщик, который в основную выдачу подмешивает картинки. Если правильная картинка краба оказывается вначале на четвертом месте, то люди кликают именно на нее и постепенно она должна подниматься в выдаче все выше. Если запрос картиночный, но это не очевидно из текста запроса, при этом из дальнейшего поведения пользователя оказывается, что ищется именно картинка, то рано или поздно появляется картиночный колдунщик, который предлагает перейти в картинки и дальше искать там.
После года работы в Яндексе мне хотелось какого-то развития и я перешел разработчиком в Mail.Ru. Там я начал заниматься непосредственно поиском, и когда я пришел в команду, в ней работало порядка 30 человек, сейчас нас уже около сотни.

- А как работает сам поиск? Что делает разработчик в этой области?

Поясню, в чем заключается «поиск». Когда пользователь вводит в браузере запрос, браузер устанавливает соединение с фронтендом – сервером, за которым стоят рабочие машины – бэкенды, они осуществляют поиск, иногда этот процесс эшелонирован. Осуществлять поиск нужно очень быстро: если от момента запроса до выдачи уходит времени больше 200 миллисекунд, пользователю уже некомфортно пользоваться поиском. За это время происходит следующее: для начала из всех страниц Интернета надо поднять те, которые нужны на выдаче, они распределяются по серверам, получается порядка тысячи результатов на каждом сервере. Из них нужно быстро отобрать порядка сотни лучших, зачем отобрать со всех серверов сотню самых лучших, и на заключительном этапе отсортировать их так, чтобы первая десятка результатов была наиболее релевантна запросу. Получается, фронтенд должен общаться с бэкендерами где-то за 50 мс, миллиарды страниц должны быть «перелопачены» за 50 мс и остается до 100 мс на взаимодействие с другими серверами (вертикалями, сниппетами, картинками, статистикой и т.п.). Ясно, что при таких больших нагрузках серьезные требования предъявляются к производительности.

Специалист, который понимает, как устроены сетевые соединения, как обрабатывать большие объемы данных, как писать быстрый производительный код – это разработчик полного стэка, и именно работая в Mail.Ru мне довелось пощупать все это самому и набраться много опыта, изучив весь процесс. Мне довелось участвовать во всей цепочке поиска: от момента поступления данных, затем их индексирования, самого поиска и итогового ранжирования результатов перед выдачей.

Получается, начинал я работать как теоретик, начитавшийся книжек, потом написал много маленьких программ, тренируясь на ACM – задачи на этих соревнованиях можно сравнить с бэкендом, где требуется знание алгоритмов, скорость решения, его правильность, самотестирование и т.д. А уже в Mail.Ru собрал всю картину разработки воедино.

- Еще один вопрос, который часто возникает у тех, кто далек от разработки: Яндекс или Mail.Ru – это же просто «сайты», зачем там работают тысячи сотрудников?

За этим «сайтом» скрыто колоссальное количество задач. Например, каждый день к нам приходит огромный поток пользователей – несколько миллионов в день. Мы можем выделять 5-10% из них и ставить какие-то эксперименты: допустим, эти выделенные пользователи будут на протяжении недели видеть какую-то новинку в дизайне или функциональности. Если мы хотим запустить новые алгоритмы, сначала их нужно померить, проверив определенные метрики – условно говоря, удовлетворенность пользователей. И вот мы ставим эксперименты – пользователь видит только окно для ввода запроса и кнопку «искать», а за этим могут стоять пять разных команд, которые ставят разные эксперименты. Аналитики собирают статистику, анализируют ее, выясняют, становится ли работа системы лучше. Если становится, то нужно посчитать статистическую разницу, доказать, что она действительно улучшает работу. Помимо этого, новая «фишка» может создавать утечку памяти или снижать производительность системы. Вычисления проходят на разных кластерах параллельно, и если где-то произошел сбой, то остальным кластерам нужно выдерживать увеличенную нагрузку. Поэтому помимо аналитики эксперимента с ним еще проводится нагрузочное тестирование. И только после этого, если явно видно, что эксперимент положительный, он выкатывается в продакшн. Я описал только техническую часть, а есть еще отделы, которые работают с пользователями, с соц. сетями, занимаются маркетингом и т.д. Так что работа кипит даже там, где ее не видно.
- Что ты можешь пожелать ребятам, которые только решают, связывать ли свою жизнь с программированием и разработкой?

Лично я совершенно убежден, что сделал осознанный и правильный выбор, связав свою жизнь с программированием. Работа в этой сфере хорошо оплачивается, и кроме того, приносит моральное удовлетворение: постоянно требуется узнавать что-то новое, расти и развивать, как soft, так и hard skills, и самое главное – ты видишь результаты своей работы и ими пользуются миллионы. Ребятам я хотел бы пожелать счастья, громких успехов и удачного выбора своего жизненного пути!

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