Зачем мобильным разработчикам алгоритмы
Не секрет, что попасть на работу или стажировку в Яндекс не очень просто. В процессе отбора все разработчики проходят алгоритмические секции — собеседования, на которых они решают нетривиальные задачи. Илья Богин, руководитель мобильной разработки приложений Яндекс и Яндекс.Браузер, рассказывает о том, зачем они нужны и что на них проверяют.
Зачем нужны алгоритмические секции
Мобильные разработчики живут в мире, где языков программирования и фреймворков уже очень много и становится только больше. Иногда разработчик использует четыре-пять языков в течение одного дня, но скромно говорит, что в основном пишет на Java. Это похоже на ситуацию после разрушения Вавилонской башни: мы разошлись по разным направлениям и каждый говорит на своём языке. В философском смысле алгоритмы и дискретная математика — это некий универсальный язык, который нас объединяет.
Алгоритмическая задача — это квинтэссенция сложной рабочей ситуации.
Решение задач не самоцель, а повод поговорить с кандидатом и понять, насколько он владеет навыками, которые ему пригодятся в любом проекте на любом языке.
Алгоритмические задачи — просто средство, при помощи которого мы можем быстро попробовать оценить навыки человека. Иначе пришлось бы давать какие-то большие развернутые задания, рискуя не рассмотреть нужные нам качества и навыки даже на них.
Ещё подготовка к секции с алгоритмическими задачами показывает мотивацию. Скажем честно, алгоритмические задачки, которые я задаю, в обычной практике встречаются нечасто и не у каждого разработчика. Но если человек готов отдельно поработать над знанием алгоритмов — это знак, что он мотивирован, а значит, будет показывать классные результаты в будущей работе и получать от неё удовольствие.
Я сам очень хотел попасть в Яндекс и серьёзно готовился к секциям. Когда мне было тяжело — обрушился миллион новой информации, появились новые коллеги, с которыми нужно было знакомиться, новые фреймворки, которые — я вспоминал, что именно к этому и стремился. Это поддерживает и мотивирует справляться со сложностями.
Почему алгоритмические секции — не только про hard skills
Раньше писать решение нужно было на листе бумаги, а теперь секции проходят в текстовом редакторе без автокомплита. Скажем честно: по удобству и функциональности он недалеко ушел от бумаги. У кандидата обычно возникает закономерный вопрос: «Зачем я это делаю, к тому же в неудобной мне среде?» Ни у кого в голове нет встроенных компилятора и автокомплита. Поэтому мы проверяем не погрешности в синтаксисе, а смысловые ошибки. Часто бывает так: вроде бы всё реализовано, но возникает множество граничных или сложных случаев, в которых код работает не так или не работает вовсе.
Нужно замечать возможные грабли и пытаться их обойти. Иначе в работе будет возникать одна и та же ситуация: гигантский pull request, который код-ревьюеры не могут посмотреть целиком. Все допускают ошибки, поэтому уметь анализировать свой код и находить в нем такие ошибки — это невероятно важно. Это мы и проверяем на алгоритмической секции. Поэтому всегда следуйте классической инструкции: писать код с учетом корнер-кейсов, искать ошибки, ревьюить, проверять и перепроверять. Например: если работаете с массивом, то обязательно проверьте, что будет, если массив окажется пустым.
Ещё один важный навык — cпособность находить решения для нетривиальных задач. У алгоритмических задач короткие, понятные условия, но для их реализации нужно придумать не совсем тривиальные шаги. Нам интересно посмотреть, как кандидат думает о решении, генерирует идеи и реагирует на подсказки. Если у него что-то не получается, то моя задача — дать ему направление и понять, сможет ли он ему последовать.
Не понять с первого раза не беда. Беда — решать задачу, которую ты не понимаешь.
Никогда не стесняйтесь в любых жизненных ситуациях сказать: «Я не понимаю. Попробуйте объяснить мне по-другому». Здорово, если человек сел и что-то быстро изобрёл или решил с нуля. Но не менее здорово показать, что в работе над реальными проектами вы будете смело взаимодействовать с командой и уточнять то, что не поняли.
О чём важно помнить на алгоритмической секции
1. Проверяйте граничные условия. Условно, если машина доехала до стены, то ей нужно остановиться, а не продолжать движение до тех пор, пока в баке есть бензин.
2. Если вы меняете в коде то, что может нарушить ваши инварианты – проверьте, чтобы инвариант сохранился и после этого. В коде есть постоянные правила, которые должны выполняться. Например, если мы говорим о массиве, то нельзя выходить за границы массива.
3. Если код меняет не только логику работы, но и инвариант, проверяйте его на новом инварианте.
4. Избегайте копипаста: он может привести к рассинхрону, ошибкам в названиях переменных и так далее.
Перед прохождением секций обязательно подготовьтесь: повторите основные алгоритмы, о которых спрашивают на собеседованиях (например, сортировки), и порешайте задачи на Leetcode.
Стоит ли того усиленная подготовка?
Я ответил себе на этот вопрос в тот момент, когда только выходил на работу, — и ответ остаётся актуальным до сих пор. Во-первых, Яндекс — это масштабные задачи. У нас постоянно запускают что-то новое и необычное: беспилотники, «Балабобу» и так далее. Всё это чаще всего крутится вокруг мобильной разработки. Второй фактор — интересные и приятные в общении люди, комфортная атмосфера, в которой легко работать и развиваться.