Всем привет! Меня зовут Илья, и я провожу собеседования *хлоп-хлоп-хлоп*. Сейчас работаю на позиции Principal iOS Engineer в inDriver, мой фокус смещен в сторону технических собеседований. До этого руководил мобильной разработкой в «Альфа-Банке» и был кем-то вроде нанимающего менеджера. Это тот человек, который говорит финальное слово по кандидату и определяет, какую циферку написать в оффере. Помимо «рабочих» собеседований, иногда провожу интервью на аутсорсе, а также помогаю разработчикам к ним готовиться.

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

Содержание
Дисклеймер

Статья — расшифровка моего доклада на CocoaHeads. Если вы предпочитаете видеоформат — переходите по ссылке.

Все, о чем пойдет речь ниже — исключительно мой опыт и взгляд на мир без привязки к какой-либо компании. Здесь мы не будем обсуждать плюсы и минусы форматов проведения технических собеседований и поработаем с тем, что сейчас есть на рынке.

Статья будет полезна Junior- и Middle-разработчикам. Если вы Senior с огромным количеством лет опыта и десятком компаний за спиной, скорее всего, вы уже прошли этот путь самостоятельно. Но все равно напишите в комментариях, что думаете по поводу статьи — будет любопытно почитать. Итак, к теме. 

Как понять, что пора менять работу?

Любой процесс смены работы начинается гораздо раньше, чем первое интервью с HR. Начинается он с мысли, что пора что-то менять. Вот небольшой список причин, которые могли к этому вопросу подтолкнуть:

  • Хочу больше денег. 

  • Не знаю, куда расти. 

  • Неинтересные задачи. 

  • Хочу в более крупную компанию. 

  • Не нравятся процессы. 

  • Не нравится продукт. 

  • Слабая команда.

  • Хочу другой стек. 

  • И много чего еще. 

В этом вопросе прячется много нюансов. Буду ли я счастлив, если получу +20% к окладу? Что я получу, если буду работать в крупной компании? Что потеряю, если уйду с текущего места? Это те вопросы, которые надо задать самому себе, как только вы ощутили потребность в смене работы.

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

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

Я рекомендую потратить время на рефлексию и определить для себя, что важно, а что не очень. Это поможет не ошибиться в выборе и принять правильное решение. Самый простой способ отделить причину от следствия — попробовать исправить проблему, хотя бы в воображении. Останетесь ли вы на текущем месте, если получите +20% к окладу или к вам в команду выйдет сеньор, который всему научит? Будет ли этого достаточно или нужно что-то еще? Можно попробовать составить список, в каком случае я не буду уходить из компании. Например:

  • Мне повысят ЗП на 20%.

  • Сеньоры будут меня учить. 

  • Печеньки будут вкуснее, а трава зеленее.

Когда с самим собой мы определились, следующий шаг — встреча 1 на 1 с вашим лидом. Обговорите основные переживания — возможно, у компании есть возможность закрыть ваши потребности. В таком случае выигрывают все: компания не теряет вас, а вы получаете желаемое. 

Расскажу маленький инсайт. Любой опытный тимлид понимает, что для компании удержать сотрудника выгоднее, чем искать нового. Так что он постарается сделать все возможное, чтобы вас удержать (если, конечно, захочет).  

Вопросы для саморефлексии

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

Заранее подумайте над ответом на вопрос: «Почему вы сейчас рассматриваете предложения о работе?». Этот вопрос вас, скорее всего, сначала спросит HR, а потом будущий руководитель. Пожалуйста, не отвечайте на него из серии: «Я просто пособеситься пришел» или «Да я вообще не особо работу ищу». Есть вероятность поставить крест на всех ваших собеседованиях и потерять интерес со стороны работодателя. Зачем тратить время и ресурсы на кандидата, который не заинтересован к нему устраиваться?

Часто на этот вопрос отвечают сразу про деньги, например: «Я пришел за деньгами». Такой ответ может повесить на вас маркер «Только финансовая мотивация», что не всегда хорошо. Зачем работодателю сотрудник, которого через 3 месяца перекупят и он уйдет? Если вы зарекомендуете себя как проактивного и вовлеченного разработчика, ту же самую зарплату вам дадут гораздо охотнее, а вполне возможно большую сумму. Чем больше работодатель хочет вас нанять, тем охотнее он идет вам на встречу.

Мой любимый вопрос на финальном собеседовании: «Расскажи, что для тебя компания мечты?». Тут нет правильного или неправильного ответа, но через него я могу понять, что для кандидата важно на самом деле. Часто на этот вопрос отвечают в материальной плоскости: спортзал в офисе, кофе с печеньками, удобное кресло и так далее. Я бы рекомендовал размышлять более возвышенно, например: команда, культура, продукт, процессы и все в таком духе. Этот вопрос полезен всем: вы понимаете, что важно вам, интервьюер понимает, как более выгодно преподнести вакансию, чтобы вас заинтересовать.

Вот еще пара вопросов, о которых точно стоит подумать перед выходом на рынок: 

  • Какие мои сильные и слабые качества как разработчика? Ответ на этот вопрос поможет вам понять, какую часть себя можно продать наиболее выгодно, а какой лучше не поворачиваться. 

  • О каких фичах я могу рассказать? Если вам задали этот вопрос, а вы к нему хорошо подготовились, это возможность пустить разговор по выгодному руслу. Советую подготовить 2-3 фичи, которые вы делали и которыми гордитесь. Неважно, что это — подняли CI, внедрили архитектуру или сделали классную табличку в 120 fps (ну вдруг). Если считаете, что здесь вы молодец, рассказывайте об этом обязательно. Однако нужно быть готовым пойти в технические тонкости реализации. Например, рассказать, что конкретно вы делали, как работает UITableView, констрейнты, как верстать фреймами и так далее. 

С чего начать поиск работы?

Любой поиск работы на рынке начинается с резюме. Возникает вопрос: нужно ли писать классное резюме? Коротко: если хотите — пишите. Если нет, то нет. Приведу пример.

На одном из моих мест работы этапом подбора был просмотр подходящих резюме командой собеседующих. В Slack закидывались резюме и происходило голосование. 3 плюса набрали — зовем кандидата собеседоваться. Но корреляции качества резюме и классности разработчика мы не заметили. Возникали случаи, когда кандидат с тремя страницами резюме, 10-летним опытом, кучей проектов, проходит собеседование сильно хуже, чем кандидат, у которого написаны пара строчек о компании и немного про стек. В итоге мы отказались от идеи обсуждения резюме и вообще оптимизировали пайплайн подбора, не просев при этом в качестве кандидатов.

Но совсем забивать на резюме я бы тоже не рекомендовал. Можно просто описать основной стек технологий, с которым вы работаете, опыт в годах, список компаний и ваши основные обязанности. Это поможет собеседующему понять, о чем с вами беседовать. Только, пожалуйста, без фраз «проактивный, целеустремленный, уверенный пользователь ПК».

Резюме подготовили, теперь пришла пора его опубликовать. Каждый раз, когда вы выходите на рынок в открытую, помните о двух вещах. Первая, достаточно капитанская: если вы выкладываете ваше резюме на HeadHunter, скорее всего, на нем сидят рекрутеры из вашей компании. Это их работа — мониторить новые резюме. А тут ваше резюме вдруг стало новым. Так что, если вы решили идти этим путем, будьте готовы к тому, что скоро к вам прибежит тимлид. И скажет, что ему HR передали, что вы выложили свое резюме на HH, и что вообще за фигня тут происходит.

Вторая вещь — если ваш тимлид не обходит стороной различные лидовские комьюнити, будьте готовы, что ему может написать лид или HR компании, куда вы собираетесь. Что-то вроде: «Тут твой разраб к нам на собес пришел. Что о нем скажешь?». Комьюнити разработчиков само по себе маленькое, а комьюнити лидов еще меньше. Это надо понимать и держать в голове.

Техническое собеседование

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

Немного про алгоритмы. На собеседовании не всегда просят перевернуть дерево. Но знать базовые алгоритмы все равно полезно. Вас могут спросить про строки и операции над ними, связанные списки, бинарный поиск, жадные алгоритмы, динамическое программирование, DFS/BFS, sliding window и так далее. Список достаточно большой и если вы планируете собеседоваться в крупные зарубежные компании, вам точно придется потратить пару десятков часов на LeetCode.

Если дела обстоят проще, есть минимум, который желательно знать всем: алгоритмическая сложность, бинарный поиск, операции с массивами и словарями, хеш-таблицы. Вне зависимости от того, как часто вы вращаете деревья, с массивами и словарями вы работаете часто. Нужно хорошо понимать, чем отличается вставка в начало и в конец массива, что такое коллизии хеш-таблиц, hash-flooding, hashable в Swift и так далее.

Чем лучше мы знаем те инструменты, которые используем ежедневно, тем меньше проблем в будущем. Даже если в компании не подразумевается алгоритмическая секция, что-нибудь из этого с большой вероятностью спросят. А начать погружаться в этот вопрос можно с книги «Структуры данных и алгоритмы в Swift». Туда можно заходить с нулевым знанием, она подробно все описывает. После нее можно пробежаться по «Грокаем алгоритмы», там неплохо разбираются жадные алгоритмы и динамическое программирование.

В целом, этого будет достаточно. Но если у вас проснулся аппетит — покупаем подписку на LeetCode (160 долларов — хорошая мотивация не забросить все это через неделю) и начинаем решать задачки. Если вы раньше никогда этого не делали, фильтруем задачи с уровнем easy и сортируем их по полю acceptance. Так вы гарантированно начнете с легких задач, которые решаются буквально в лоб. Если же вы понимаете, что даже на них застреваете, не спешите ставить на себе крест. На помощь придет YouTube и куча индусов, которые фанатеют от записи разбора задач с LeetCode на видео. Объясняют на плохом английском, зато с рисунками.

Итак, перейдем к части про платформу. Расскажу про некоторые часто задаваемые вопросы по Swift и iOS из моей практики.

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

Value и reference типы 

  • В чем разница?

  • Что такое вообще «передача по значению», копирование и указатель? 

  • Какие еще типы данных передаются по значению?

  • Что такое inout, когда его надо использовать и как работает?

  • Что такое ключевое слово mutating, и самое важное как оно работает внутри? Создает новую структуру? Меняет текущую? 

Алокация в памяти

  • Где хранятся value типы, а где — reference?

  • Что такое стек и куча, в чем особенности каждой из них и как они работают?

  • Всегда ли структуры и value типы хранятся в стеке? Сколько вмещает в себя стек?

Диспетчеризация

  • Что это вообще такое? Какие виды бывают? 

  • Как связаны диспетчеризация и наследование? 

  • Как работает статическая и динамическая диспетчеризация?

  • Чем отличается Table dispatch от message dispatch?

  • Кто обрабатывает message dispatch? 

  • Зачем нужен final и как он работает? 

  • Что такое Whole module optimization?

Казалось бы, простой вопрос «Чем отличаются классы от структур», а рассказывать можно очень долго.

2. Следующее поле для дискуссий — управление памятью.

Начнем с простого — с MRR. Говорим стандартную фразу: «когда мой дед под iOS писал, тогда использовали MRR, но я не помню, маленький был» и рассказываем про ручное управление памятью, что помним. Retain увеличивает счетчик ссылок, Release уменьшает, Autorelease уменьшит, но попозже. Далее можно и про Autorelease pool поговорить: что такое, зачем нужен, когда нужно использовать в Swift.

На ARC начинается самое интересное. Strong, weak, unowned — что такое, когда использовали, для чего, с какими проблемами сталкивались. Дальше можно углубляться, рассказывать, как слабые ссылки реализованы, что такое side таблицы, зачем они нужны, какую проблему решают. Почему unowned ссылки работают быстрее, чем weak ссылки. Из-за чего падает unowned, а unowned_safe отличается от unowned_unsafe. Эффектно завершить ответ на вопрос про управление памятью поможет понимание того, как ARC работает внутри. Здесь надо будет залезать в исходники Swift, например, сюда. Там и про реализацию счетчика ссылок, и про Heap object, и про state машину у объектов. 

3. Hit Testing и Responder Chain. Тут не очень много подводных камней. Стандартной документации и немного практики будет достаточно. Начинать советую издалека — с UITouch и UIGestureRecognizer: что это такое, как работает, какие виды бывают.

Потом можно переходить к первой части процесса обработки нажатий, то есть к Hit Testing. Он работает достаточно просто: методы sendEvent, hitTest, pointInside. Читаем, запоминаем документацию и переходим к практическим вопросам. Они, как правило, касаются области нажатий.

За Hit Testing следует Responder Chain, как бы обратный процесс. Поиск того, кто наше нажатие будет обрабатывать. Также открываем документацию и разбираем методы: next, target(forAction), canPerformAction, fordwardInvocation, forwardingTarget.

После этого переходим к UIControl и паттерну Target Action. Важно понимать, как Target Action дружит с Responder Chain и в чем их отличия. Вишенкой на торте станет понимание того, как взаимодействуют Responder Chain и UIGestureRecognizer.

Финальное собеседование

Основная задача финального собеседования — познакомиться с руководителем. Плюс замер софт скиллов, сопоставление ожиданий и возможностей. Этап не требует какой-то жесткой подготовки, так как речь пойдет про вас и ваш опыт. Но если вы подготовите ответы на следующие вопросы, это может помочь вам и собеседующему провести встречу более эффективно:

  1. Почему вы пришли в разработку? Этот вопрос проверяет вашу мотивацию. Он помогает лучше понять, что именно вас привлекает в разработке, и может ли компания вам это предложить.

  2. Куда хотите развиваться? Это история про ваше развитие. Если вы настойчиво через год хотите перейти в лиды или продакты, работодателю важно это понимать и сопоставлять свои возможности. 

  3. Расскажите о самой интересной фиче, которую приходилось делать? Из ответа на этот вопрос можно многое понять о человеке и его взглядах на мир. Собеседующий может обращать внимание на то, какие слова вы используете, говорите ли вы только о себе или прячете свои успехи за спиной командного «мы». В общем, большое поля для построения разного рода гипотез. 

  4. Почему вы сейчас рассматриваете предложения о работе? Этот вопрос позволяет понять мотивацию вашего ухода, и может ли будущий работодатель сделать так, чтобы этого не повторилось с вами. В общем, хороший ответ на этот вопрос поможет не ошибиться при выборе новой работы и правильно скорректировать ваши ожидания и ожидания работодателя. 

  5. Есть ли у вас вопросы к нам? Может показаться, что этот вопрос больше из вежливости. Но это не всегда так. То, что вы будете спрашивать о компании может говорить о том, что вам действительно важно и интересно. Лично я всегда обращаю внимание на то, что и как кандидат спрашивает. Так что советую подготовиться, выписать 5-10 вопросов, о которых хотели бы поговорить.

Оффер в кармане. Что дальше?

Все собеседования позади. Оффер у вас на руках, до выхода на новую работу осталось совсем чуть-чуть. Осталось только принять оффер и сообщить своему руководителю об уходе. 2 основных пункта, которые стоит держать в голове:

Контроффер. С одной стороны, ситуация, когда вы хотите зарплату побольше, безуспешно обсуждали это на текущем месте, получили оффер и тут вам вдруг пошли на встречу — выглядит странно. Сразу напрашивается вопрос «А где вы раньше были». Не самая однозначная история. Где гарантии того, что это не повторится? 

С другой стороны, если вы уходите не из-за денег, и уже пытались что-то пофиксить перед выходом на рынок — плюс N денег проблему не исправят, вы также будете продолжать страдать, просто за чуть большие деньги. Так что, решать вам, лично я не фанат контрофферов, ни как сотрудник, ни как менеджер.

Расставайтесь на хорошей ноте. Бывшая работа — это как бывшая девушка или парень. Никогда не знаешь, кому захочется позвонить, когда будешь ехать в 3 часа ночи из бара.

На этом все. Задавайте любые вопросы или комментарии, с радостью отвечу на них.

Комментарии (13)


  1. Sm1le291
    02.09.2021 14:46
    +1

    Список достаточно большой и если вы планируете собеседоваться в крупные зарубежные компании, вам точно придется потратить пару десятков часов на LeetCode.

    Пару сотен часов вы хотели сказать? А точнее 3-4 как подсказывает опыт моих коллег, минимум)


    1. imJustik Автор
      02.09.2021 15:30

      Зависит от многих факторов, в том числе бэкграунда. Но в целом да, приключение может затянуться.


      1. spiceginger
        03.09.2021 17:34
        +1

        Я обычно в таких случаях заканчиваю интервью и говорю: "спасибо большое, но мы видимо не сработаемся, я не пришел сюда красно-черные деревья разворачивать". Я там еще понимаю когда FAANGи могут гнать что хотят, хотя я знаю людей которых они наняли которым было не лень год на LeetCode сидеть и хихикаю. Но когда какой то невнятный стартап или какой нить оффлайн бизнес монстр что то подобное начинает выдавать — это конечно полнейшая глупость. В общем, стоит видеть лица собеседующих в этот момент.


        ЗЫ: Самое забавное что один из FAANGов мне звонит с периодичностью в 2 года и мы заканчиваем разговор одинаково "Я к вам в Лондон летал? Летал. Мы 7 часов искали наибольший общий палиндром и тд? Искали. Нашли? Нашли. Вас все равно что то не устроило? Не устроило. Я снова делать тоже самое не хочу и время на алгоритмы не тратил с тех пор, у меня есть более интересные дела. — Ну может вы попробуете, мы пришлем вам материалы как готовиться. — Нет спасибо. Тем более у вас там очередь со всего шарика стоит, что вы мучаете бедного узбекского мальчика.". И так переодически повторяется. А благодаря вышеупомянутым людям я еще и прекрасно понимаю что я и не очень хочу там работать. Вот так и развлекаем друг друга :)


        ЗЗЫ: Вообще я не понимаю рекрутеров. Если у человека есть опенсорные проекты — там можно все сказать про то как он кодит и как архитектурно подходит к делу. А по тому как он закрывает ишью — можно понять какой он в общении. Можно сразу пропускать все стадии и если все устраивает сразу обсуждать деньги, а не ускорять энтропию вселенной бессмысленным бредом.


        1. imJustik Автор
          06.09.2021 11:06

          Но когда какой то невнятный стартап или какой нить оффлайн бизнес монстр что то подобное начинает выдавать — это конечно полнейшая глупость.

          Я с вами согласен. К сожалению, во многих компаниях собеседования построены по шаблону, и далеко не все понимают зачем они спрашивают то, что спрашивают. Требовать идеального понимая каких-нибудь RBT от рядового мобильного разработчика мне тоже кажется излишним. Однако я допускаю ситуации, когда знание алгоритмов действительно является необходимым для компании и используются в продакшене регулярно.

          Впрочем, все это тема для отдельной статьи на тему "Как проводить технические собеседования" :)


          1. spiceginger
            06.09.2021 14:31

            Приятно что вы со мной соглашаетесь, но давай-те таки не путать твердое с длинным. Одно дело понимание массивов, хэш-таблиц и структур данных это одно, а навык разворачивания RTB дерева не выходя за границы L1 кэша микропроцессора — это другое. И этот навык требуется лучшем случае 0.1 проценте компаний и обычно это отражено в спецификации работы. Этот навык можно отточить. Но он будет абсолютно бесполезен в остальных случаях. А вот насколько грамотно человек будет подходить к архитектуре, читаемости, расширяемости и майнтейнабилити кода это никак не скажет. Понятно, что в дверь FAANGов стучится весь мир — они могут творить что угодно со своими собеседованиями. Но как я уже отметил этот фильтр работает для них не всегда, а теперь мы еще и имеем целую саб-индустрию которая ориентирована помочь людям пройти в FAANG. Прям как оптимизация сайта под поисковую выдачу гугла. Что в целом не плохо. Но оставим FAANGи в покое, работает для них и ладно, они и правда в уникальной ситуации.
            Что подобный фильтр дает остальным компаниям мне не ясно. Особенно учитывая что они зачастую сидят по уши в легаси коде написанном вот такими вот LeetCode девелоперами (прошу прощениям за оценочный термин) и не знают что с ним делать. И прямым текстом тебе говорят "У нас много проблем и нам надо с этим взлететь".


            ЗЫ: Я тут должен отметить что у нас тут с вами лирическое отступление не связанное непосредственно с Вашей статьей, а с топиком в комментарии.


  1. galimovrussia
    03.09.2021 11:57

    Полезная статья, спасибо!


    1. imJustik Автор
      03.09.2021 13:56

      Спасибо за фидбек :)


  1. ARfan
    03.09.2021 16:30
    +1

    Благодарю за очень интересную статью. Вопросы про «компанию вашей мечты» и «какая ваша самая интересная фича» взял на заметку.


  1. Gargo
    03.09.2021 20:58

    >Эффектно завершить ответ на вопрос про управление памятью поможет понимание того, как ARC работает внутри. Здесь надо будет залезать в исходники Swift, например, сюда.

    "Пример" мягко говоря неудачный - вырванные из контекста куски кода и пояснения к ним - я уже имею некоторый опыт работы со swift, но даже я не могу разобрать те каракули, что там накалякали. В интернете полно нормальных статей и даже на русском на хабре


    1. imJustik Автор
      06.09.2021 10:46

      >В интернете полно нормальных статей и даже на русском на хабре

      Статьи, так или иначе, пишутся на основе все тех же исходников. Но вы правы, действительно на тему ARC очень много хорошей статей. Одна из них, которая мне понравилась – статья Майка Эша, хоть она и немного устарела т.к. рассматривается swift 2.2


  1. Cattivole
    05.09.2021 10:34

    Спасибо, хорошая статья. Год назад сидел за книжками и готовился к подобного рода вопросам, сейчас понимаю что большую часть информации не вспомню так-как по факту никаких деревьев не переворачиваю и даже в hitTest что-то писать приходится не часто.


    1. imJustik Автор
      06.09.2021 10:56

      На самом деле, это отдельная "проблема". Прохождение собеседований – отдельный навык, который далеко не всегда связан с самой работой. Мы в inDriver давно ушли от "собеседований по листочку" и на собеседованиях стараемся общаться вокруг практических задач. Тот же самый hitTest можно обсудить на примере создания контейнера, который пропускает нажатия сквозь себя. Например – карта и элементы управления.


  1. ThePyzhov
    06.09.2021 10:48
    +1

    О как в тему, как раз сейчас постигаю мастерство iOS разработки)
    Спасибо за полезную инфу в статье!