Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
В конце мая начнётся наш чемпионат по программированию. Он будет проходить в онлайне и позволит проверить себя в одной из четырёх сфер: бэкенд- или фронтенд-разработке, машинном обучении или аналитике данных. Задачи для секций разработали в управлении машинного интеллекта и исследований, Поиске и геосервисах.
Всем участникам сначала предстоит преодолеть квалификационный раунд. После подачи заявки вы сами выберете, когда его проходить. Квалификация 4-часовая и включает в себя от 4 до 6 задач. Самых лучших мы пригласим к участию в финале, который пройдёт 1 июня, тоже в онлайне. Результаты станут известны 5 июня. Победители в каждом направлении получат по 300 тысяч рублей, второе место — 150 тысяч рублей, третье — 100 тысяч. Регистрация открыта и продлится до последнего дня квалификационного раунда — 26 мая, но лучше отправить заявку пораньше.
В этом посте мы поделимся опытом проведения подобных конкурсов — в части аудитории и составления сложных алгоритмических задач.
* * *
Чемпионат является развитием идеи, которую мы реализовали в 2017–2018 годах в серии Яндекс.Блиц. Отличие в том, что Блиц был именно серией из отдельных конкурсов по разным направлениям. Их объединял только формат, а проходили они в совершенно разное время. Обязательно почитайте хабрастатьи с разборами задач к каждому конкурсу: по машинному обучению, бэкенду, фронтенду и мобильной разработке.
При подготовке чемпионата и этого поста мы много общались с теми, кто занял высокое место в Блице и затем устроился в Яндекс. Было важно учесть реальный опыт ребят, взгляд со стороны участника, чтобы сделать соревнование ещё более прозрачным и интересным.
Чемпионат, как и прошедший Блиц, — это короткий путь в компанию: участники из топа смогут выйти к нам на работу по упрощённой схеме собеседований. Но мы ждём далеко не только тех, кто ищет работу и рассматривает Яндекс. Мы рассчитываем, что к конкурсам присоединятся представители ещё двух категорий разработчиков. Первая категория — те, кто интересуется алгоритмами, занимается спортивным программированием, а также много участвует (или участвовал) в олимпиадах и других конкурсах. Таким людям мы предложим достойные их уровня задачи и интересный опыт в копилку.
Вторая категория — опытные программисты и аналитики. У них будет возможность продемонстрировать свой опыт и бэкграунд. Дело в том, что мы составили очень разноплановые задачи. Это отличает чемпионат от конкурсов на Kaggle — не в лучшую и не в худшую сторону, просто Kaggle предоставляет несколько иные возможности. Там составители обычно дают такие условия и данные, которые позволяют вам испытать себя в конкретной области (при желании участники успевают её изучить). Раунды нашего чемпионата проходят за считанные часы и фиксируют текущие знания. Можно не разбираться, например, в голосовых технологиях или компьютерном зрении, но показать такое мышление, которое в перспективе позволит вам быстро окунуться в любую тему. Конечно, сравнение с Kaggle актуально только для ML-трека чемпионата.
Итак, главная идея остаётся неизменной: предложить участникам задачи, приближенные к боевым — тем, с которыми действительно сталкиваются разработчики и аналитики Яндекса. Так вы можете понять уровень и специфику этих задач, посмотреть, с какими вопросами вам придётся столкнуться в работе, если вы устроитесь в компанию. Кроме того, задачи, которые мы составили для конкурса, помогут участникам оценить, насколько они хорошо прокачались в конкретных сферах, есть ли у них идеи, которые действительно можно конвертировать в улучшение сервисов и приложений.
Те, кто принял участие в Блице 2017 и 2018 годов, видели, что задачи отчасти продиктованы их исходниками из боевых проектов. Но боевой подтекст разработки в корпорации часто заключается в необходимости понимать алгоритмы — даже в таких, на первый взгляд, далёких от алгоритмов сферах, как фронтенд и мобильная разработка. Так что конкурсы, посвящённые этим двум темам, участники и сами часто оценивали как близкие к боевым. А вот два других конкурса — по алгоритмическому программированию и машинному обучению — требовали бы понимания алгоритмов, даже без всякого «боевого» подтекста. Такой подтекст в них тоже был, но разглядеть его по условиям задач удавалось не всегда. Впрочем, участникам это не мешало соревноваться, а нам — реализовывать главную идею Блица.
Когда задачи для конкурса по спортивному программированию составляются не сами по себе, а на основе задач, реально возникающих в сервисах, то процесс их составления совсем другой. Причина в том, что в сервисах руководитель или коллега приносит разработчику задачу в иной формулировке, в ином контексте, чем когда условие поступает от организаторов конкурса к их участникам. Штатный программист или даже стажёр, особенно если он проработал в компании какое-то время, гораздо глубже погружён в процессы своего отдела, чем внешний (даже очень талантливый) разработчик. Нельзя формулировать им проблему одинаково, тем более что от участника конкурса требуется придумать решение за гораздо меньшее время. Среда разработки у него тоже другая: есть только входной и выходной файл, а сотрудник работает в репозитории, во внутреннем интерфейсе, со всеми инструментами и т. п.
Так что задачи мы брали из боевого окружения, но затем всегда спрашивали себя — поймут ли их участники? Иногда выяснялось: чтобы для широкой аудитории разработчиков сделать условие понятным, нужно написать к нему большую преамбулу, ввести терминологию, с которой специалист в компании давно знаком, и т. п. Такой подход сработал бы не всегда: в конкурсе важно, чтобы условие было ёмким, чтобы его можно было быстро прочесть и перейти к самому главному — к разработке решения. Поэтому в случаях, когда вместе с преамбулой условие стало бы слишком громоздким, мы старались переформулировать его и снять необходимость в преамбуле. Другая формулировка часто требовалась ещё и потому, что исходная задача содержала внутреннюю информацию Яндекса, которую нельзя разглашать за пределами компании. В результате задача могла стать более абстрактной, уже не такой похожей на аналоги в боевом продакшене.
Интересно, что обратная ситуация — когда условие сходу удавалось сформулировать ёмко и не потерять близость к продакшену — часто приводила к тому, что задача получалась сложной. Например, это было видно в финале Блица по машинному обучению, в задачах, связанных с распознаванием изображений. Чемпионат этого года не станет исключением. Участников, среди прочего, ждут задачи про машинный перевод — ёмко сформулированные, сложные в реализации и действительно взятые из боевого проекта (Яндекс.Переводчика).
Возникает вопрос — делая задачу абстрактной по сравнению с продакшеном, не упрощаем ли мы её? В некотором роде да, упрощаем — для её решения уже не требуется опыт работы с внутренней инфраструктурой Яндекса, как и предварительное общение с коллегами. Не нужно быть знакомым с процессом код-ревью, не нужно делать код красивым и т. д. Но самую содержательную часть каждой задачи, требующую алгоритмического мышления, мы сохраняем. И если вы её решите, пусть даже в несколько упрощённом виде, это всё равно будет означать, что вы отличный программист. А отличный программист быстро познакомится с внутренней инфраструктурой, вникнет в процесс код-ревью и перестроится со спортивного режима написания кода на промышленный. Это как в баскетболе: главное для игрока — габариты и хорошее понимание игры, а броску можно научить.
Мы упомянули алгоритмическое мышление — в том смысле, что нужно уметь реализовывать нужный алгоритм средствами выбранного вами языка: без дополнительных библиотек. Скорее всего, в реальной работе (и до, и после конкурса) вы будете пользоваться различными дополнительными библиотеками, которые просто вызывают нужные алгоритмы и сильно уменьшают объём кода. Умение их подключать — как раз из разряда того, чему «можно научить». Нам интереснее убедиться, что вы, вызывая какую-то библиотеку, понимаете, что и как она делает. Зная алгоритмы изнутри, вы будете более эффективно их применять — уже без необходимости реализовывать их самостоятельно.
Рассказывая про задачи чемпионата в этом посте, мы часто вспоминаем Яндекс.Блиц. Но теперь участники могут выбрать направление аналитики данных, по которому мы Блиц не проводили. Это новый трек со своей спецификой. Если вы его выберете, то знание алгоритмов тоже будет плюсом, но в меньшей степени, чем в треках по машинному обучению или бэкенд-разработке.
Общая идея здесь такая же, как в других направлениях: проверить умения, которые используются специалистами в Яндексе. Поэтому вопрос — а какие навыки могут пригодиться?
Ключевые навыки хорошего аналитика в Яндексе — это способность генерировать гипотезы, извлекать полезный сигнал из нечётких условий задачи, неоднозначных или шумных данных. Наши аналитики пишут, как правило, на Python и работают с большими потоками данных, например с логами от Яндекс.Метрики, пользовательскими сессиями, техническими логами серверов и т. п.
Для решения аналитических задач в рамках чемпионата, равно как и для дальнейшей работы в Яндексе, очень полезно знать основы математической статистики и теории вероятности. Это базовые знания, которые помогают делать корректные, основанные на данных выводы о процессах.
Всем участникам сначала предстоит преодолеть квалификационный раунд. После подачи заявки вы сами выберете, когда его проходить. Квалификация 4-часовая и включает в себя от 4 до 6 задач. Самых лучших мы пригласим к участию в финале, который пройдёт 1 июня, тоже в онлайне. Результаты станут известны 5 июня. Победители в каждом направлении получат по 300 тысяч рублей, второе место — 150 тысяч рублей, третье — 100 тысяч. Регистрация открыта и продлится до последнего дня квалификационного раунда — 26 мая, но лучше отправить заявку пораньше.
В этом посте мы поделимся опытом проведения подобных конкурсов — в части аудитории и составления сложных алгоритмических задач.
* * *
Чемпионат является развитием идеи, которую мы реализовали в 2017–2018 годах в серии Яндекс.Блиц. Отличие в том, что Блиц был именно серией из отдельных конкурсов по разным направлениям. Их объединял только формат, а проходили они в совершенно разное время. Обязательно почитайте хабрастатьи с разборами задач к каждому конкурсу: по машинному обучению, бэкенду, фронтенду и мобильной разработке.
При подготовке чемпионата и этого поста мы много общались с теми, кто занял высокое место в Блице и затем устроился в Яндекс. Было важно учесть реальный опыт ребят, взгляд со стороны участника, чтобы сделать соревнование ещё более прозрачным и интересным.
Почему стоит участвовать
Чемпионат, как и прошедший Блиц, — это короткий путь в компанию: участники из топа смогут выйти к нам на работу по упрощённой схеме собеседований. Но мы ждём далеко не только тех, кто ищет работу и рассматривает Яндекс. Мы рассчитываем, что к конкурсам присоединятся представители ещё двух категорий разработчиков. Первая категория — те, кто интересуется алгоритмами, занимается спортивным программированием, а также много участвует (или участвовал) в олимпиадах и других конкурсах. Таким людям мы предложим достойные их уровня задачи и интересный опыт в копилку.
Вторая категория — опытные программисты и аналитики. У них будет возможность продемонстрировать свой опыт и бэкграунд. Дело в том, что мы составили очень разноплановые задачи. Это отличает чемпионат от конкурсов на Kaggle — не в лучшую и не в худшую сторону, просто Kaggle предоставляет несколько иные возможности. Там составители обычно дают такие условия и данные, которые позволяют вам испытать себя в конкретной области (при желании участники успевают её изучить). Раунды нашего чемпионата проходят за считанные часы и фиксируют текущие знания. Можно не разбираться, например, в голосовых технологиях или компьютерном зрении, но показать такое мышление, которое в перспективе позволит вам быстро окунуться в любую тему. Конечно, сравнение с Kaggle актуально только для ML-трека чемпионата.
Production-like
Итак, главная идея остаётся неизменной: предложить участникам задачи, приближенные к боевым — тем, с которыми действительно сталкиваются разработчики и аналитики Яндекса. Так вы можете понять уровень и специфику этих задач, посмотреть, с какими вопросами вам придётся столкнуться в работе, если вы устроитесь в компанию. Кроме того, задачи, которые мы составили для конкурса, помогут участникам оценить, насколько они хорошо прокачались в конкретных сферах, есть ли у них идеи, которые действительно можно конвертировать в улучшение сервисов и приложений.
Те, кто принял участие в Блице 2017 и 2018 годов, видели, что задачи отчасти продиктованы их исходниками из боевых проектов. Но боевой подтекст разработки в корпорации часто заключается в необходимости понимать алгоритмы — даже в таких, на первый взгляд, далёких от алгоритмов сферах, как фронтенд и мобильная разработка. Так что конкурсы, посвящённые этим двум темам, участники и сами часто оценивали как близкие к боевым. А вот два других конкурса — по алгоритмическому программированию и машинному обучению — требовали бы понимания алгоритмов, даже без всякого «боевого» подтекста. Такой подтекст в них тоже был, но разглядеть его по условиям задач удавалось не всегда. Впрочем, участникам это не мешало соревноваться, а нам — реализовывать главную идею Блица.
Идеи задач
Когда задачи для конкурса по спортивному программированию составляются не сами по себе, а на основе задач, реально возникающих в сервисах, то процесс их составления совсем другой. Причина в том, что в сервисах руководитель или коллега приносит разработчику задачу в иной формулировке, в ином контексте, чем когда условие поступает от организаторов конкурса к их участникам. Штатный программист или даже стажёр, особенно если он проработал в компании какое-то время, гораздо глубже погружён в процессы своего отдела, чем внешний (даже очень талантливый) разработчик. Нельзя формулировать им проблему одинаково, тем более что от участника конкурса требуется придумать решение за гораздо меньшее время. Среда разработки у него тоже другая: есть только входной и выходной файл, а сотрудник работает в репозитории, во внутреннем интерфейсе, со всеми инструментами и т. п.
«Чистка» условий
Так что задачи мы брали из боевого окружения, но затем всегда спрашивали себя — поймут ли их участники? Иногда выяснялось: чтобы для широкой аудитории разработчиков сделать условие понятным, нужно написать к нему большую преамбулу, ввести терминологию, с которой специалист в компании давно знаком, и т. п. Такой подход сработал бы не всегда: в конкурсе важно, чтобы условие было ёмким, чтобы его можно было быстро прочесть и перейти к самому главному — к разработке решения. Поэтому в случаях, когда вместе с преамбулой условие стало бы слишком громоздким, мы старались переформулировать его и снять необходимость в преамбуле. Другая формулировка часто требовалась ещё и потому, что исходная задача содержала внутреннюю информацию Яндекса, которую нельзя разглашать за пределами компании. В результате задача могла стать более абстрактной, уже не такой похожей на аналоги в боевом продакшене.
Интересно, что обратная ситуация — когда условие сходу удавалось сформулировать ёмко и не потерять близость к продакшену — часто приводила к тому, что задача получалась сложной. Например, это было видно в финале Блица по машинному обучению, в задачах, связанных с распознаванием изображений. Чемпионат этого года не станет исключением. Участников, среди прочего, ждут задачи про машинный перевод — ёмко сформулированные, сложные в реализации и действительно взятые из боевого проекта (Яндекс.Переводчика).
Что мы проверяем
Возникает вопрос — делая задачу абстрактной по сравнению с продакшеном, не упрощаем ли мы её? В некотором роде да, упрощаем — для её решения уже не требуется опыт работы с внутренней инфраструктурой Яндекса, как и предварительное общение с коллегами. Не нужно быть знакомым с процессом код-ревью, не нужно делать код красивым и т. д. Но самую содержательную часть каждой задачи, требующую алгоритмического мышления, мы сохраняем. И если вы её решите, пусть даже в несколько упрощённом виде, это всё равно будет означать, что вы отличный программист. А отличный программист быстро познакомится с внутренней инфраструктурой, вникнет в процесс код-ревью и перестроится со спортивного режима написания кода на промышленный. Это как в баскетболе: главное для игрока — габариты и хорошее понимание игры, а броску можно научить.
Мы упомянули алгоритмическое мышление — в том смысле, что нужно уметь реализовывать нужный алгоритм средствами выбранного вами языка: без дополнительных библиотек. Скорее всего, в реальной работе (и до, и после конкурса) вы будете пользоваться различными дополнительными библиотеками, которые просто вызывают нужные алгоритмы и сильно уменьшают объём кода. Умение их подключать — как раз из разряда того, чему «можно научить». Нам интереснее убедиться, что вы, вызывая какую-то библиотеку, понимаете, что и как она делает. Зная алгоритмы изнутри, вы будете более эффективно их применять — уже без необходимости реализовывать их самостоятельно.
Соревнования по аналитике
Рассказывая про задачи чемпионата в этом посте, мы часто вспоминаем Яндекс.Блиц. Но теперь участники могут выбрать направление аналитики данных, по которому мы Блиц не проводили. Это новый трек со своей спецификой. Если вы его выберете, то знание алгоритмов тоже будет плюсом, но в меньшей степени, чем в треках по машинному обучению или бэкенд-разработке.
Общая идея здесь такая же, как в других направлениях: проверить умения, которые используются специалистами в Яндексе. Поэтому вопрос — а какие навыки могут пригодиться?
Ключевые навыки хорошего аналитика в Яндексе — это способность генерировать гипотезы, извлекать полезный сигнал из нечётких условий задачи, неоднозначных или шумных данных. Наши аналитики пишут, как правило, на Python и работают с большими потоками данных, например с логами от Яндекс.Метрики, пользовательскими сессиями, техническими логами серверов и т. п.
Для решения аналитических задач в рамках чемпионата, равно как и для дальнейшей работы в Яндексе, очень полезно знать основы математической статистики и теории вероятности. Это базовые знания, которые помогают делать корректные, основанные на данных выводы о процессах.