В прошлом материале нашей серии «Карьера в IT» мы рассказывали, как пройти собеседование на софт-скилы. В этом перейдем к более конкретным и техническим пунктам собеседования — алгоритмическим задачам, платформенной секции и проектированию систем. Расскажем об этих секциях в общем, не сосредотачиваясь на одной технологии, дадим полезные практические советы и ссылки, которые помогут в подготовке.
Алгоритмические задачи
Если вы всю жизнь ходили на олимпиады по программированию, этот пункт можно пропустить — вы и так все знаете. Для остальных эта секция часто становится самой сложной в подготовке.
Вам нужно:
Освоить основные структуры данных.
Уметь быстро оценить асимптотическую сложность алгоритма.
Быстро улавливать тип задачи и переходить от простого решения к сложному.
Для подготовки с нуля можно действовать по следующей схеме:
Посмотреть на ютубе видео HackerRank `Cracking the Coding Interview` Series или Tushar Roy.
Решать задачи на LeetCode.
Разбирать решенные задачи на GeeksforGeeks.
Еще можно купить фундаментальную книгу по алгоритмам и ее прочитать. Но это вариант не для всех — по YouTube будет быстрее.
На Leetcode можно купить платный тариф и выбирать задачки от конкретной компании, например, Amazon. Это поможет, если собеседуетесь в известную зарубежную фирму. Кстати, у нас в боте много вакансий, в том числе в такие компании, с удаленкой и релокейтом.
Чем больше задач вы прорешаете, тем лучше. Есть даже исследование на эту тему, хотя и старое, но все еще актуальное:
От числа прорешанных алгоритмических задач сильно зависит процент успеха на алгоритмической секции.
Писать лучше всего на том языке, который вы хорошо знаете. Но пусть он будет достаточно популярным — например, лучше выбрать не Kotlin или Scala, а их прародителя Java. Стандартом считается C++, Python, Java и C# — лучше тренировать алгоритмическое собеседование именно на них.
Начинайте обязательно с легких задачек, а потом постепенно набирайте сложность. Причем если опыта нет никакого, не идите сразу на LeetCode и не пытайтесь решать все подряд. Лучше используйте подход «как в университете» — берите какую-то тему, изучайте ее и потом решайте задачи под нее.
На подготовку с нуля у вас, в зависимости от личного уровня, уйдет в среднем три месяца. Через полтора-два уже можно ходить на собеседования и набивать руку там.
Платформенная секция
Язык и среда. Нужно знать основные особенности языка, под который вы разрабатываете. Говорить про ООП и ФРП, управлять переменными, работать со структурами данных, потоками и распределенными вычислениями, управлять памятью. И знать тонкости — чем их больше, тем легче на стартапных собеседованиях, где любят спрашивать странные вещи. Например, могут спросить — «есть переменные а и b, мы переменной a присвоили значение b, потом b поменяли — что будет?». Нужно знать, как ответить в зависимости от языка.
Платформа. Фреймворк, на котором мы разрабатываем: Android, Java-машина в целом, все что угодно. Frontend, библиотеки вокруг него, умение работать с UI и расширениями. Фишки последних версий ОС, окружение библиотек — все, что пригодится в работе. Допустим, если вы Android-разработчик, но застряли в старом Android из-за работы с кассовыми терминалами, неплохо заглянуть в новости и послушать подкасты о том, что в новом Android происходит.
Здорово будет знать модные фреймворки и библиотеки. Понимать, как работать с потоками и реактивностью, зависимостями, хранением данных. Как происходит deploy и взаимодействие с БД. Например, у мобильного разработчика могут спросить, в каком случае имеет смысл внедрять Realm NewSQL — базу данных с возможностью кеширования в сеть, а не только на девайс. И вы должны иметь четкий ответ.
Архитектура приложения. Как задизайнить API и продемонстрировать работу той или иной фичи, обеспечить надежность, масштабируемость и тестируемость. Часто просят задизайнить какой-нибудь модуль чата, и обязательно спросят про общение с бэкендом. Или могут дать задачу смоделировать модуль аналитики: нарисовать блоки и показать навыки проектирования.
Тестирование. Про тестирование нужно говорить много: UI, качество, покрытие, тестируемая архитектура. Карандаш, как на собеседовании для тестировщика, вам тестировать не дадут, но будут ждать, что вы умеете писать юнит- и интеграционные тесты, и знаете, какие фреймворки применимы для вашего языка. Полезно будет разобраться с пирамидой тестирования, но тут есть нюансы — у каждой компании она своя, границы между разными видами тестов провести бывает сложно.
Как лучше готовиться
Перечитывать официальную документацию по платформам, фреймворкам и прочему.
Читать статьи и GitHub по вашей теме. Например, вот большая подборка материалов на GitHub с вопросами по Android. Подписаться на Medium, можно поглядывать на Habr.
Посмотреть публичные собеседования в компании, чтобы узнать, как это вообще происходит и чего ждать.
Проектирование систем
Рядовые разработчики часто с этим вообще не сталкиваются, а на собеседовании такая секция будет. Лучше всего пообщаться с вашим нынешним СТО, техлидом или главным архитектором и расспросить, как устроена ваша система и почему.
Вас попросят задизайнить систему от клиента до сервера, от БД до кнопочки на сайте. Вам нужно понимать, как это все в общем происходит. Если уже знаете — освежите технологии в памяти. Если не знаете — спросите с нуля.
Помните, что закапываться в детали здесь не нужно. Важно рассказать подробно про вашу область знаний и продемонстрировать общее понимание принципов вокруг.
Из интересного нужно знать:
Как построить масштабируемую архитектуру мобильного приложения.
Как организовать взаимодействие между клиентом и сервером для высоконагруженных систем.
Как работают модные трюки вроде Server-Driven UI, если мы говорим про клиент, как сделать так, чтобы все рендерилось на сервере и деплоилось в одно мгновение.
Как, если вы мобильный разработчик, организовать Serverless-архитектуру.
Как минимизировать бизнес-логику на клиенте и вынести ее в кроссплатформенное решение.
Вот еще парочка полезных ссылок по этой секции интервью:
Как облегчить подготовку
Теперь еще несколько простых советов, которые кажутся очевидными, но могут помочь:
Найдите единомышленников и учитесь с ними вместе: решайте задачки, обменивайтесь ссылками, общайтесь по теме, делитесь результатами собеседований.
Сформируйте план изучения материалов и поставьте самому себе дедлайны — они очень мотивируют. Можно завести трекер прогресса, с ним вы будете наглядно видеть свои достижения.
Награждайте себя за старания. Не забывайте, что возможность устроиться на работу мечты — абстрактная мотивация, а мозг хочет чего-то более конкретного.
Непосредственно перед собеседованием не нагружайте себя — отдохните, перезагрузитесь и идите туда со свежей головой.
Выписывайте вопросы из прошлых интервью и используйте их во время подготовки.
Помните, что не все советы работают. Экспериментируйте, и если вам что-то не подходит — не делайте этого.
Полезные ссылки
Бот getmatch с вакансиями для практики ваших навыков в прохождении интервью
XaBoK
Может статью стоило назвать "готовимся к каждому этапу технического собеседования на мобильного разработчика" ? Вы же понимаете, что в разных компаниях свои требования даже на одну и ту же позицию. Так что в идеале надо писать подобные статьи узкозаточено: "этап технического собеседования на мобильного под айфон разработчика в Яндекс:Такси во втором квартале 2022 года"...