Зачем мобильным разработчикам алгоритмы

Почему iOS- и Android-разработчики тоже проходят алгоритмические секции

https://avatars.mds.yandex.net/get-media-platform/3578204/484bdc5a-29b2-4eb7-bbe3-125d49c202a7/1240x1240

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

Зачем нужны алгоритмические секции

Мобильные разработчики живут в мире, где языков программирования и фреймворков уже очень много и становится только больше. Иногда разработчик использует четыре-пять языков в течение одного дня, но скромно говорит, что в основном пишет на Java. Это похоже на ситуацию после разрушения Вавилонской башни: мы разошлись по разным направлениям и каждый говорит на своём языке. В философском смысле алгоритмы и дискретная математика — это некий универсальный язык, который нас объединяет.

Алгоритмическая задача — это квинтэссенция сложной рабочей ситуации.

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

Алгоритмические задачи — просто средство, при помощи которого мы можем быстро попробовать оценить навыки человека. Иначе пришлось бы давать какие-то большие развернутые задания, рискуя не рассмотреть нужные нам качества и навыки даже на них.

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

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

Почему алгоритмические секции — не только про hard skills

Раньше писать решение нужно было на листе бумаги, а теперь секции проходят в текстовом редакторе без автокомплита. Скажем честно: по удобству и функциональности он недалеко ушел от бумаги. У кандидата обычно возникает закономерный вопрос: «Зачем я это делаю, к тому же в неудобной мне среде?» Ни у кого в голове нет встроенных компилятора и автокомплита. Поэтому мы проверяем не погрешности в синтаксисе, а смысловые ошибки. Часто бывает так: вроде бы всё реализовано, но возникает множество граничных или сложных случаев, в которых код работает не так или не работает вовсе. 

Нужно замечать возможные грабли и пытаться их обойти. Иначе в работе будет возникать одна и та же ситуация: гигантский pull request, который код-ревьюеры не могут посмотреть целиком. Все допускают ошибки, поэтому уметь анализировать свой код и находить в нем такие ошибки — это невероятно важно. Это мы и проверяем на алгоритмической секции. Поэтому всегда следуйте классической инструкции: писать код с учетом корнер-кейсов, искать ошибки, ревьюить, проверять и перепроверять. Например: если работаете с массивом, то обязательно проверьте, что будет, если массив окажется пустым.

Ещё один важный навык — cпособность находить решения для нетривиальных задач. У алгоритмических задач короткие, понятные условия, но для их реализации нужно придумать не совсем тривиальные шаги. Нам интересно посмотреть, как кандидат думает о решении, генерирует идеи и реагирует на подсказки. Если у него что-то не получается, то моя задача — дать ему направление и понять, сможет ли он ему последовать.

Не понять с первого раза не беда. Беда — решать задачу, которую ты не понимаешь. 

Никогда не стесняйтесь в любых жизненных ситуациях сказать: «Я не понимаю. Попробуйте объяснить мне по-другому». Здорово, если человек сел и что-то быстро изобрёл или решил с нуля. Но не менее здорово показать, что в работе над реальными проектами вы будете смело взаимодействовать с командой и уточнять то, что не поняли.

О чём важно помнить на алгоритмической секции

  1. Проверяйте граничные условия. Условно, если машина доехала до стены, то ей нужно остановиться, а не продолжать движение до тех пор, пока в баке есть бензин.
  2. Если вы меняете в коде то, что может нарушить ваши инварианты – проверьте, чтобы инвариант сохранился и после этого. В коде есть постоянные правила, которые должны выполняться. Например, если мы говорим о массиве, то нельзя выходить за границы массива. 
  3. Если код меняет не только логику работы, но и инвариант, проверяйте его на новом инварианте.
  4. Избегайте копипаста: он может привести к рассинхрону, ошибкам в названиях переменных и так далее.

Перед прохождением секций обязательно подготовьтесь: повторите основные алгоритмы, о которых спрашивают на собеседованиях (например, сортировки), и порешайте задачи на Leetcode.

Стоит ли того усиленная подготовка?

Я ответил себе на этот вопрос в тот момент, когда только выходил на работу, — и ответ остаётся актуальным до сих пор. Во-первых, Яндекс — это масштабные задачи. У нас постоянно запускают что-то новое и необычное: беспилотники, «Балабобу» и так далее. Всё это чаще всего крутится вокруг мобильной разработки. Второй фактор — интересные и приятные в общении люди, комфортная атмосфера, в которой легко работать и развиваться.

алгоритмы