Для большинства мобильных инженеров собеседования в крупных технологических компаниях вызывают смесь волнения и страха. Все слышали эти истории — головоломки на доске, быстрые вопросы, бесконечные циклы. Это может звучать как испытание на выносливость, призванное сломить вас.
Но как только вы отбросите мистику, процесс станет предсказуемым. Он вознаграждает структуру, общение и спокойный подход к решению проблем. Вам не нужно быть гением — вам нужно готовиться целенаправленно.
Это практическое руководство для iOS-инженеров, которые хотят знать, чего ожидать и как подготовиться, не теряя рассудка.
Цикл: во что вы входите
Большинство компаний делят свой процесс на два этапа.
Сначала вы получаете проверочный звонок — обычно это одна проблема с кодированием, которая служит воротами «да» или «нет». Пройди его, и ты попадешь. Не сдашь, и ты вылетишь.
Затем следует весь цикл (локальный или виртуальный). Для iOS ожидайте примерно:
- Два собеседования по программированию с разными людьми
- Одно собеседование по проектированию системы
- Одно поведенческое/культурное интервью
Каждый из них тестирует разные части вашего мозга. Хорошие новости? Вы можете подготовиться ко всем из них.
Кодирование: дело не в скорости
У вас будет 45 минут и обычно две задачи, примерно по 15–20 минут каждая. Интервьюеров не волнует, можете ли вы печатать так, как будто у вас горят пальцы. Их волнует, как вы думаете и можете ли вы это ясно объяснить.
Вот что важно:
Прежде чем что-либо писать, задавайте уточняющие вопросы. Я знаю, это звучит очевидно, но многие люди сразу начинают программировать и в конечном итоге решают не ту проблему. Потратьте две минуты на то, чтобы понять, о чем вас спрашивают. Каковы ограничения? Каков размер ввода? Есть ли крайние случаи, о которых мне следует беспокоиться, например, пустые массивы или пустые строки?
Все время говорите вслух. Серьезно. Объясните, почему вы выбираете хэш-карту вместо массива, почему вы считаете, что рекурсия имеет здесь смысл и какие компромиссы вы рассматриваете. Интервьюер не проверяет, умны ли вы — они и так это предполагают. Они проверяют, смогут ли они понять ваши доводы. Если вы замолчите на 30 секунд, им станет не по себе. Если вы рассказываете о своем процессе, вы молодец.
И вот что люди забывают: Слушайте своего интервьюера. Если вы застрянете, они обычно дадут подсказки. Пожалуйста, обратите внимание на то, что они говорят. «Ты не думал о том, чтобы сначала это разобрать?» это не светская беседа; это толчок в правильном направлении.
Необходимые знания
Структура данных
Алгоритмы
Концепции
Списки массивов Сортировка слиянием Большой O-время Хеш-таблицы Быстрая сортировка Большой O-пространство Деревья (Попытки) Поиск в ширину Рекурсивные графики Поиск в глубину Запоминание/Динамическая программа. Стеки/очереди Кучи двоичного поиска
Когда вы решите, что закончили, проверьте это. Пройдитесь по примеру. Ткни в это. Найдите ошибки прежде, чем они это сделают. Проверьте крайние случаи. Что происходит с пустым массивом? Один элемент? Если ваше решение — O(n²), владейте им. Скажите это вслух и объясните, что может быть лучше. Но также подумайте о пространственной сложности. Решение за время O(n), использующее пространство O(n), может быть не лучше, чем время O(n log n) с пространством O(1), в зависимости от проблемы.
Если можете, мысленно скомпилируйте свой код. Пройдитесь по нему, как если бы вы были компьютером. Это работает? Выдаст ли это ошибку? Неполное «оптимальное» решение проигрывает полному, работающему решению, которое вы четко понимаете.
Сами проблемы не пытаются вас обмануть. Вы увидите классические вещи:
Структуры данных: Массивы, хеш-таблицы, связанные списки, деревья, графы, стеки, очереди, кучи. Может быть, попробуйте, если вам не повезет.
Алгоритмы: Сортировка (сортировка слиянием, быстрая сортировка), двоичный поиск, поиск в ширину, поиск в глубину и рекурсия. Иногда это динамическое программирование или мемоизация, но для мобильных ролей это встречается реже.
Знай свое Большое О. И время, и пространство. Если вы используете рекурсию, помните, что часто это O(2^n), если вы не кэшируете результаты, тогда оно может упасть до O(n). Возможность уверенно говорить о сложности – это очень важно.
Задачи среднего уровня LeetCode — лучшее место для подготовки. Сложные проблемы являются излишними для мобильных ролей. Легкие упражнения не помогут развить необходимую вам выносливость. Сосредоточьтесь на понимании закономерностей, а не на запоминании решений.
Проектирование системы: покажите свое мышление
Именно здесь многие мобильные инженеры склонны застревать. Звучит абстрактно и пугающе. Но на должность iOS они не просят вас спроектировать серверную часть Uber. Они хотят узнать, что вы думаете о компромиссах, масштабируемости и архитектурных решениях.
Вы можете получить что-то вроде: «Как бы вы создали функцию обмена фотографиями?» или «Создайте ленту как в Instagram» или «Как отслеживание местоположения работает в приложении?»
Помните: вы ведете этот разговор. Вы задаете вопросы. Вы намечаете подходы. Вы выбираете один и копаете.
Начните с вопроса о том, чего вы не знаете:
- Сколько пользователей?
- Какова схема использования?
- Какие устройства?
- Каков бюджет?
Затем подумайте вслух. Нарисуйте несколько подходов. Взвесьте все за и против. Выберите один и углубитесь в него.
Поговорите о конкретных компонентах: как хранятся данные, как работает кэширование, что происходит, когда сеть работает медленно, как вы будете обрабатывать изображения, уведомления, фоновую синхронизацию. Используйте цифры. «Мы рассматриваем около 50 тысяч активных пользователей в день» или «Этот процесс выполняется каждые 15 минут». Цифры делают это реальным.
В частности, что касается iOS, знайте, как на самом деле работает операционная система. Многопоточность. Сеть. Обработка фоновых задач. Разряд батареи. Жизненный цикл приложения. Это не абстрактные концепции — это ограничения, которые действительно имеют значение для телефона. Если вы покажете, что вы понимаете эти детали, вы покажете, что вы не просто инженер общего профиля. Вы понимаете мобильный телефон.
И, пожалуйста, оставайтесь на связи. Не сидите молча, пока думаете. Обсуждайте свои идеи. Вслух. Звучит просто, но это имеет огромное значение.
Поведенческий: часть, которая решает все
Это то, что большинство людей недооценивают. Вы можете отказаться от кодирования и проектирования систем, но если работа с вами кажется кошмаром, то все готово.
Типичные вопросы, которые вы получите
- «Расскажите мне о случае, когда вы с кем-то не согласились».
- «Опишите ошибку, которую вы допустили».
- «Когда вы взялись за дело и сделали что-то, выходящее за рамки вашей должностной инструкции?»
Что они слушают
- Вы рефлексивны?
- Вы признаете, когда ошибаетесь?
- Можете ли вы сотрудничать?
- Учишься ли ты на ошибках?
- Захочу ли я просидеть рядом с этим человеком восемь часов?
Как подготовиться
Не запоминайте ответы. Это очевидно, и это ясно. Подготовьте примеры из реальной жизни — четыре или пять, которые демонстрируют разные стороны вашей личности. Используйте простую структуру:
- Вот ситуация.
- Вот в чем проблема.
- Вот что я сделал.
- Вот что произошло.
- Вот что я узнал.
Держите это по-настоящему. Признать, что вы облажались, но затем объяснить, как вы это исправили, гораздо сильнее, чем притворяться, что вы никогда не терпите неудач.
Когда вас спросят, почему вы хотите присоединиться, не говорите: «Я всегда мечтал работать в Big Tech Company». Это пусто.
Скажите что-нибудь конкретное и честное: «Я хочу работать над системами такого масштаба, с людьми, которые заботятся о том, чтобы детали были правильными» или «Я достиг потолка того, чему я могу научиться там, где я нахожусь, и я хочу, чтобы меня подталкивали». Настоящие биты репетировались каждый раз.
Как подготовиться, не теряя рассудка
Многие люди используют разделение 50/25/25:
- 50% практики кодирования
- 25% практика системного проектирования
- 25 % поведенческая подготовка (составление историй и освоение их)
Но дело в том, чтобы сделать это настоящей рутиной. Не зубрите выходные накануне. Выбирайте время каждый день — даже 30–45 минут — и приходите к нему. Отслеживайте, что для вас сложно. Обратите внимание на закономерности. Если деревья всегда сбивают вас с толку, решайте больше задач с деревьями. Если вы нервничаете при обсуждении решений, проводите больше ложных интервью с реальными людьми (не только с LeetCode).
Это похоже на тренировку. Вы бы не пробежали марафон, пробежав спринт один раз в день. Это тот же принцип.
Используйте время для вопросов
В конце каждого интервью у вас есть возможность задать вопросы. Пожалуйста, не тратьте его зря. На собеседованиях по кодированию это, по сути, формальность. Но в раундах проектирования и поведения? Ваши вопросы могут изменить атмосферу. Они показывают, что вас волнует. Они заставляют вас выглядеть равным, а не просто еще одним кандидатом.
Пропустите общие вещи. «Какова культура?» или «Как выглядит типичный день?» Скучный. Все об этом спрашивают. Спросите что-нибудь реальное: «Какой самый большой технический долг имеет команда?» или «Как вы выбираете между рефакторингом и переписыванием?» или «Как на самом деле выглядит наставничество для новых инженеров?» Эти вопросы демонстрируют, что вы думаете как человек, который будет частью команды, а не просто пройдет собеседование при приеме на работу.
Большая картина
Вот что я заметил, наблюдая, как люди проходят через это: те, кто добивается успеха, не самые умные в комнате. Именно они относятся к этому как к проекту. Они систематичны. Они получают обратную связь. Они повторяют. Они не запоминают — они понимают.
Настоящий навык не в том, чтобы знать ответ; это знание того, как его найти. Он остается методичным и точным, когда вы находитесь под давлением. Это передача того, что у вас в голове, таким образом, чтобы это имело смысл для кого-то другого.
Последняя мысль
Вероятно, вы не запомните каждый алгоритм или каждый принцип проектирования системы. Это нормально. Важно то, что вы можете ясно мыслить, хорошо объяснять себя и показывать, что люди действительно хотят работать с вами.
Подготовка иногда отстой. Но вот что самое странное: к концу вы действительно станете лучшим инженером. Вы пишете более чистый код. Прежде чем писать код, вы думаете о компромиссах. Вы проектируете намеренно, а не просто создаете то, что приходит в голову в первую очередь.
Независимо от того, получите вы работу или нет, это настоящая победа.
ТЕНДЕНЦИОННЫЕ ИСТОРИИ YOUTUBE.COM/THENEWSTACK Технологии развиваются быстро, не пропустите ни одной серии. Подпишитесь на наш канал YouTube, чтобы смотреть все наши подкасты, интервью, демонстрации и многое другое. ПОДПИСАТЬСЯ Группа, созданная в Sketch.