Как подготовиться к чемпионату по программированию?
С 20 мая начинается большой чемпионат по фронтенд- и бэкенд-разработке, аналитике данных и машинному обучению. Каждый, кто решит принять участие, может выбрать свое направление и столкнуться с задачами, составленными разработчиками сервисов компании. На кону крупные денежные призы, а также победителей ждут специальные призы от Яндекса. Также, чемпионат — отличная возможность попасть на радары рекрутеров компании, которые внимательно следят за ходом соревнования. Составители задач по всем четырем направлениям рассказали, кому стоит попробовать свои силы, какие задачи ждут участников, и на что обратить внимание во время подготовки.
Бэкенд
Алексей Шаграев, руководитель службы разработки из Яндекс.Поиска
— Кому стоит принять участие
Мы специально старались, чтобы соревнование понравилось как можно более широкому кругу разработчиков. Для того чтобы успешно выступить, не обязательно обладать глубокими познаниями в машинном обучении, алгоритмах и структурах данных, мобильной разработке, низкоуровневых оптимизациях; не нужно блестяще владеть вашим любимым языком программирования. Достаточно хорошо владеть базовыми средствами какого-либо языка (циклами, условиями, встроенными структурами данных и так далее) и уметь программировать достаточно быстро и без ошибок.
На чемпионате мы разрешаем использовать все языки программирования, какие только сумели поддержать. Мы считаем, что знание конкретного языка никогда не является проблемой или ограничением: выучить основы можно достаточно быстро, а основной сложностью при выходе нового сотрудника всё равно будет знакомство с внутренней кухней компании, инфраструктурой, инструментами и так далее.
Мы не накладываем никаких ограничений на использование конкретных языков программирования на алгоритмических секциях, не делаем мы этого и на чемпионате.
— Как устроены задачи
Мы очень хотели сделать испытания интересными и попытались взять идеи из реальной жизни. Каждая задача чемпионата похожа на что-то, с чем автор сталкивался в своей рабочей деятельности. Так что, участвуя в нашем чемпионате, вы ещё и в некоторой степени прикоснетесь к тому, чем мы занимаемся в Яндексе.
Чемпионат состоит из двух раундов: квалификации и финала. Задачи квалификационного раунда будут посильны всем разработчикам с опытом промышленной разработки, которые могут писать код без ошибок достаточно быстро и умеют пользоваться базовыми средствами выбранного языка программирования. Набор задач для финала более разнообразный и опирается на опыт многих различных сервисов: поиска, рекламы, технологий разработки, инфраструктурных сервисов и т. д. Поэтому задачи финальной части более интересны, но среди них могут встретиться и задачи, требующие некоторых специфических навыков.
— Советы для участников
Задачи оцениваются по бинарной шкале. Любая из них предполагает возможность написать программу, которая в точности будет соответствовать нашему набору тестов.
Сложность заданий различается. Есть смысл сразу прочитать условия всех задач и начать решать с тех, что являются более простыми именно для вас. При этом в процессе соревнования обращайте внимание на текущие результаты и присмотритесь к тем задачам, которые решаются большим количеством участников.
Если вы будете готовиться, то обратите внимание на свои базовые навыки: скорость печати, проверку граничных условий. Мы уже проводили подобные соревнования в прошлом, и поэтому вы можете подготовиться, изучив наши материалы или порешав задачи прошлого года:
1. Два примера задач, похожих на те, что мы даем на чемпионате, вместе с объяснением, как они связаны с продакшен-разработкой.
2. Разбор задач квалификационного раунда Яндекс.Блица 2017 года.
3. Виртуальный турнир — финал прошлого Яндекс.Блица.
4. Советы для тех, кто хочет стать разработчиком в Яндексе.
Можно потренироваться на сайтах для спортивного программирования: например, на https://www.hackerrank.com, http://codeforces.com или https://leetcode.com. Оптимально для подготовки будет решить большое количество задач низкой и средней сложности.
Фронтенд
Андрей Морозов, руководитель группы разработки интерфейсов Карт
— Кому стоит принять участие
В чемпионате мы ориентируемся на разработчиков с опытом. Это совершенно не про основы, нужно иметь опыт продакшена, те самые условные 3–5 лет.
Если признаться, в какой-то момент, составляя задачи мы поняли, что даже наши ребята тратят на некоторые из них все четыре часа отведенного времени. Пришлось упрощать и оптимизировать. В наших задачах мы постарались не завязываться на всякие малоизвестные особенности, а опираться на знания и инструменты, которые нужны фронтендерам в ежедневной работе. Но в каких-то задачах их придется применить не совсем стандартным способом.
Наша цель — привлечь на чемпионат талантливых ребят, дать им возможность показать себя и выиграть хорошие призы. В прошлом году приз за первое место составлял 100 тысяч рублей, в этом уже 300 тысяч. Весьма неплохо за восемь часов работы. Мы рассчитываем, что к нам придет много людей, которые, увидев какие интересные задачки мы решаем, захотят еще и пройти у нас собеседование.
— Как устроены задачи
Задачи оцениваются по системе баллов достаточно гибко, чтобы избежать ситуаций, когда разрыв среди участников мог быть максимально возможным. Хочется, чтобы никто не мог оспорить, что тот или иной человек занял призовое место.
Мы остановились на трех типах испытаний. Есть специфические задачи про JavaScript, где мы проверяем, насколько хорошо человек владеет языком и понимает тонкости его работы. Второй тип — про верстку, хотя в Картах верстки относительно мало, но тем не менее мы делаем фронтенд, и такие задачи нужно уметь решать хорошо. Третий тип — это производительность и алгоритмы. Нам важно, чтобы человек не просто умел писать какой-то фронтенд, а такой фронтенд, который будет быстро и хорошо работать.
Принципиальной разницы между квалификацией и финалом нет. Но на заключительном этапе мы постарались дать больше задач, приближенных к контексту геоинформационных сервисов, таких как «Карты» и «Народная карта».
— Советы на чемпионате
Потренироваться решать простые задачи поможет Codeforces и аналогичные ресурсы. Но это будут самые «дешевые» задачи, которые приносят меньше всего очков. Для решения же сложных задач вам уже будет желательно иметь богатый опыт и уверенные знания языка.
Также следует крайне внимательно читать условия задач. Иначе ваш код не пройдет все тесты, так как вы не предусмотрите все условия.
Еще, обратите внимание, на пост на «Хабре» с разбором наших задач прошлого года.
И помните, что лучшая подготовка — ежедневный опыт разработки фронтенда!
Машинное обучение
Михаил Ройзнер, руководитель группы ML десанта и Элеонора Погостина, руководитель группы подбора персонала
— Кому стоит принять участие
Большая часть аудитории, которая интересуется машинным обучением, это датасаентисты, которые, чаще всего, не умеют писать алгоритмический код. Одна из целей чемпионата, найти людей с двумя компетенциями — тех кто умеет кодить, знакомым с обычными алгоритмами, и при этом они либо знают, либо хотят знать машин лернинг. Такие люди любят задачи, где нет просто четкой постановки, решил, не решил, а нужно получить как можно лучшее качество, и никто не говорит, как именно это сделать.
У них может не быть изначально целей устроиться в Яндекс. Но им интересно поучаствовать, а нам хочется посмотреть на таких людей. Чемпионат, это не только дополнительный источник для привлечения кандидатов, но и интересные задачи с хорошими призами.
— Как устроены задачи
Мы старались сделать задачки, которые могут встречаться в работе. Там нет каких-то подводных камней, хотя это интересные задачи, основанные на примерах из реальной жизни. В целом это испытания примерно двух типов, или какая-то смесь между ними: алгоритмы и machine learning.
В квалификационном этапе в основном алгоритмы, но все равно нужны или навыки, или талант машин лернера. Формулировки таковы, что нужно понять, и надо просто проявить какую-то смекалку, как можно добиться хорошего качества. В финале будет одна задача на ML, на которую дается 24 часа.
— Советы на чемпионате
В квалификации все задачи устроены по принципу решил — не решил. При условии, если несколько людей выполнят одинаковое количество задач, то берется во внимание скорость — чем быстрее, тем лучше. Так что на этом этапе помогут стандартные стратегии: просмотреть задачи от начала до конца и начать с простых. Если где-то задача вроде бы простая, но ты в тупике — просто переключаешься на другую.
В финале одна задача, и стратегия другая. Эту задачу нужно решать как можно лучше, там не на что переключаться. Важно как можно раньше получить какой-то бейслайн, чтобы был какой-нибудь алгоритм, который дает неплохое качество и его можно просто инкрементально улучшать.
Такая стратегия часто и хорошо работает, но она не единственно возможная. Иногда нужно понять, что твоя парадигма все-таки ограничивает тебя. И если ты не переделаешь все совсем, то не прыгнешь выше какого-то порога.
Не стоит слишком увлекаться какой-то одной сложной идеей. Существует стратегия поискать или вспомнить самый сложный алгоритм и до конца пытаться его реализовать. По нашему мнению, это плохая стратегия. Кому-то повезет, и он реализует сложный алгоритм, но чаще всего сыграют роль или баги, или окажется, что этот алгоритм просто плохо себя проявит в конкретной задаче.
Поэтому лучше набрать себе какое-то количество идей, которые хочется попробовать. Не получилось, — ладно, может быть, проверить, почему не получилось, сколько-то времени на этом провести, и переходить к другой гипотезе. Я бы делал так.
Есть еще один совет, который работает, правда не всегда. Чем больше данных, тем дольше обучается модель, и тем больше занимает времени проверка идеи. Поэтому иногда бывает хорошей идеей взять себе подмножество данных, посэмплить их как-нибудь и на небольшом наборе данных проверять гипотезы. Тогда каждая попытка будет занимать, не знаю, не десятки минут, а десятки секунд. И тогда можно будет больше идей проверить.
Также можно почитать то, что мы публиковали на «Хабре» про прошлогодние соревнования. Попробовать порешать аналогичные задачи и вспомнить алгоритмы. Не стоит забывать и популярные площадки для тренировки, такие как — Codeforces, Google Code Jam, Facebook Hacker Cup, ACM ICPC.
Аналитика данных
Екатерина Гладких, служба безопасного поиска
— Кому стоит принять участие
Наша часть чемпионата в первую очередь ориентирована на молодых ребят, которым интересно попробовать свои силы в аналитических задачах, близким к продакшен-аналитике Яндекса. Все задачи мы тестировали на действующих аналитиках Яндекса разного уровня опытности. Как ни парадоксально, но опытным ребятам было труднее искать решение. Опытный специалист уже заточен на конкретную область и может не помнить некоторых базовых вещей из теории вероятности и матстата, которые, например, мы проверяем.
— Как устроены задачи на чемпионате?
В квалификации пять задач. Среди них задача на азы криптографии, которую можно решить даже будучи незнакомым с теорией, просто, как мы говорим, силой мозга. Будет задача проверяющая то, как участники работают с данными, как они умеют их парсить. Пригодится теория вероятности и матстат, и понимание того как устроены базовые метрики.
В финале четыре разнообразных задания. Это поиск роботов в логах, работа с метриками и абстрактные задачи, для решения которых нужно реализовать некоторый алгоритм. Мы проверяем прежде всего аналитические навыки: умение сориентироваться в условиях неопределенности, извлечь нужный сигнал из сырых данных. Это то, с чем сталкивается в работе большинство аналитиков.
— Советы на чемпионате
Для нашей части чемпионата сейчас не приходит в голову аналогичных конкурсов, аналогичных мероприятий. Будет голый Python без специальных библиотек. Нам важно, чтобы человек знал язык и умел его использовать. Нужно самому реализовать алгоритм для решения задачи.
Также рекомендуется освежить в памяти основные принципы математической статистики и теории вероятностей, особенно, если со времен университета прошло достаточно много времени.
Но в чемпионате будут вещи, к которым подготовиться невозможно. Нельзя же сказать: «Поучись генерировать гипотезы, дружок».