Недавно я составил учебный план, чтобы подготовиться к шести циклам собеседований по iOS на месте в таких компаниях, как Facebook и Apple. Вот что я изучил, чтобы получить все шесть предложений.

Вступление

Несмотря на то, что в Интернете есть масса ресурсов, если вы хотите изучить «типичную бэкэнд-работу» (которая определяется здесь как «не то, к чему я стремился в то время»), я считаю, что существует нехватка Учебные материалы по iOS доступны в Интернете. Это простирается от проблем алгоритмов (в частности, идиоматических решений к ним в Objective-C) и проблем проектирования системы до общих вопросов знания iOS.

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

Алгоритмы

Ниже я покажу некоторые решения, которые я реализовал в Objective-C, пока практиковался. Имейте в виду, что я загрузил эти решения перед собеседованием, поэтому они могут включать или не включать фактические вопросы собеседования. Вам также следует потратить как минимум по крайней мере 15 минут на их решение, прежде чем вы увидите мои, возможно, неоптимальные решения. Я потратил намного больше времени на многие из них, и большая часть фактического обучения я получил в тот период, когда я пытался во всем разобраться.

Я включу только те проблемы со ссылками, которые имеют соответствующую проблему Leetcode для простоты, хотя они почти всегда были взяты из другого ресурса, кроме Leetcode (CtCI / EPI). Более сложные задачи я решал на досках, поэтому их нет в списке.

Хотя приведенное выше является хорошей отправной точкой, ваша цель должна состоять в том, чтобы самостоятельно составить список, подобный приведенному выше. Найдите похожие проблемы. Закодируйте их на Objective-C (или на другом языке). Подумайте о своих собственных тестовых примерах. Попробуйте их. Практика Leetcode с использованием Java (при условии, что вы готовитесь к собеседованию с iOS) и рассылка спама «Run Code» не так эффективны, как методичное построение решения на языке, с которым вы собираетесь проводить собеседование.

Для большей ясности в том, как я выбирал и какие задачи решать, см. Мой предыдущий пост, но то, что я написал выше, подготовило меня довольно хорошо.

Системный дизайн

Вопросы системного дизайна в iOS - это, по сути, все варианты спроектируйте это приложение на доске. В них нет никакого трюка; у всех разный уровень дизайнерских навыков, и он обычно зависит от опыта. В результате, практика для собеседований по системному дизайну, на мой взгляд, включает в себя сидение с другим разработчиком, который может неоднократно просить вас обосновать детали вашего дизайна / добавить новые функции / подвергнуть сомнению определенные дизайнерские решения. Возможно, я смогу выделить время, чтобы помочь людям попрактиковаться - посетите сообщество CS Career Hackers на Discord, так как я иногда бываю там. Если меня не будет, будут другие. :)

Просто просматривая свой телефон, вот несколько вещей, которые я бы спросил, если бы я давал интервью, а также последующие действия, которые я бы спросил; имейте в виду, что мне не задавали конкретно ни одного из этих вопросов:

  • Создайте приложение "Сообщения" на iPhone. Как вы будете обновлять сообщения? Как выглядят ваши модели? Как вы их удерживаете (если вообще сохраняете)? Как бы вы изложили пользовательский интерфейс с точки зрения UIKit?
  • Создайте приложение Gmail на iPhone. Как вы обновите свой список адресов электронной почты? Какие API вам нужны от бэкэнда? Будете ли вы разбивать на страницы? Почему? Как вы сохраните данные? Вам это нужно? Какие у вас модели? Как выглядит ваша инфраструктура пользовательского интерфейса?
  • Создайте приложение Spotify на iPhone. Как выглядят ваши модели? Какие API вам нужны? Как выглядит ваша клиентская инфраструктура / диаграмма классов для всех необходимых вам частей? Будете ли вы сохранять данные? Почему или почему нет?
  • Создайте приложение Instagram для iPhone. Как бы вы настроили пользовательский интерфейс? Будете ли вы кэшировать изображения? Как? Будете ли вы сохранять изображения? Как? Какие API вам нужны? Как вы можете убедиться, что ваше приложение работает?
  • Создайте приложение Pinterest для iPhone. Как бы вы создали пользовательский интерфейс для торговой марки? Какое упорство вы бы проявили? Где уместна настойчивость? Какие API-интерфейсы будут иметь смысл?

Я придумал все это на лету, глядя на свой домашний экран и размышляя над первыми вопросами, которые приходили мне в голову. Не стесняйтесь выбирать любое случайное приложение и делать то же самое, но я бы поупражнялся с другом, если это возможно. Если вы практикуете самостоятельно, вы (по определению) не узнаете те области, о которых обычно не думаете.

Знание iOS

Во-первых, я думаю, что всем сторонам было бы полезно, если бы вы изучили основы хотя бы одного из Swift / Objective-C и много знали о другом. Это более точно моделирует работу, которую вы будете выполнять в одной из этих компаний; вы можете сильно предпочитать и знать один язык, но вы обязательно увидите другой. Об этом можно много просить, но это сделает вас более трудоспособным и в целом лучшим разработчиком.

Ниже я перечислил ряд вещей, которые, как я ожидаю, кто-то узнает, если я брал у них интервью. Вы должны суметь ответить на все эти вопросы несколькими предложениями, если вас заставят вдаваться в подробности. Если вы не знаете одного из них, убедитесь, что знаете. Это не обязательно те вопросы, которые мне задавали на собеседовании, но это базовые вопросы, которые, как я ожидаю, все собеседники iOS должны знать достаточно подробно. В значительной степени они были взяты из книги Мэтта Гэллоуэя Эффективная цель-C 2.0.

  • Атрибуты свойства: что означает сильный? Что означает слабый? Когда бы вы использовали одно вместо другого? Где обычно используется weak? Что означает неатомный? А как насчет атомарного? Когда бы вы использовали одно вместо другого?
  • КВО: что такое КВО? Когда бы вы его использовали? Когда бы вы не использовали его? Как сделать что-то KVO-совместимое? Какие подводные камни связаны с KVO?
  • Разделение классов: как можно разделить блоки кода? Какие преимущества у каждого? Какие недостатки у каждого?
  • Время выполнения: в чем особенность вызова методов в Objective-C по сравнению с C? Если подкласс не переопределяет метод в Objective-C, как вызывается реализация суперкласса? Что произойдет, если вы вызовете метод для чего-то, что не реализует этот метод? Что, если вы вызовете метод с нулевым значением?
  • UIKit: каковы методы жизненного цикла UIViewController? Как добавить представление в качестве подпредставления и как сделать его адаптивным к изменениям размера?
  • Управление памятью: как управление памятью работает в iOS? Убедитесь, что вы это полностью понимаете, а не просто заучиваете предложение!
  • Параллелизм: каковы различные способы обработки параллелизма в iOS? Каковы общие варианты использования? Какие проблемы?
  • Блоки: каковы недостатки блоков в Objective-C? Где они обычно используются? Как можно избежать циклов сохранения?
  • Категории / расширения: что это такое? Когда вы их используете? Какие ограничения с ними связаны? Что такое категория продолжения класса? Какие у него особые правила?

Критические ресурсы

Все, что я хотел бы сказать ниже, является важной частью знаний, когда речь идет об собеседовании по iOS. Я хотел бы убедиться, что вы знаете каждую ссылку ниже. Если что-то было полезным, я исключил это из этого списка. Необязательно запоминать все, что есть в каждой ссылке, но вы обязательно должны понять суть. Я изучил все нижеприведенное перед собеседованием, и я рад, что сделал это.

Я также рекомендовал бы проверить Архитектура приложений: шаблоны проектирования приложений iOS в Swift на objc.io, но это необязательно. Это просто интересно и может помочь вам настроиться на правильное мышление.

Заворачивать

В моем руководстве постоянно повторяется тема собеседования: практикуйтесь с другом и практикуйтесь последовательно. Я буду продолжать подчеркивать это везде, где это уместно, потому что преимущества, которые вы получаете от моделирования среды собеседования, невозможно переоценить. Я настоятельно рекомендую использовать все вышеперечисленные вопросы и взять интервью у друга (который может заранее найти ответ, если не уверен).

Всем удачной учебы!

Эта история опубликована в The Startup, крупнейшем предпринимательском издании Medium, за которым следят +419 678 человек.

Подпишитесь, чтобы получать наши главные новости здесь.