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