О чем эта статья
Это продолжение моих похождений по ФААНГ. Предыдущая статья была о моем опыте собеседования в Амазоне: https://habr.com/ru/post/646319/.
Здесь я тоже поделюсь всем процессом: как я попал на собеседование, все этапы, вопросы на интервью, как я готовился, некоторые детали офера, и общее впечатление от интервью. Также будут всякие сравнения опыта собеседования в Майкрософте и в Амазоне.
К слову, все собеседования тоже сейчас проходят онлайн, и никаких онсайт интервью нет.
Предложение в Линкедине
4 ноября - мне поступило такое сообщение в Линкедине. На тот момент, я активно готовился к последнему раунду интервью на Амазоне, и конечно же я согласился, пока еще “теплый” и подготовленный.
За этим сообщением последовал созвон с рекрутером, где мне сказали общую информацию, уточнили, что это будет собеседование в саму компанию (не на проект) на множество локаций (с возможностью выбора), вкратце описали интервью процесс. Запомните пока что “собеседование в компанию” и “множество локаций”.
Первый этап - опять задачи
Затем, спустя некоторое время - мне пришло приглашение на Коддилити, это что-то по типу Литкода, с 3-мя задачами, которые нужно было решить за время. В отличие от Амазона, объяснять свои решения не надо было.
Все они были уровня изи и медиум.
Первая:
Вторая:
Третья:
Если честно не помню, как я их решал, но я успел решить все.
Спустя некоторое время, меня сразу пригласили на финальный раунд, который состоял из 4-ех интервью.
Второй этап - интервью луп
Как я уже говорил, на этом этапе - было 4 интервью. Все интервью сессии шли подряд, по 45 минут каждая + 15 минут отдыха. Весь процесс занял 4 часа.
Первое интервью (ООП)
Нужно было задизайнить систему, которая умела бы переключатся между элементами в каком-то клиенте. У меня не было никогда таких задач, и я к ним не готовился, поэтому вышло такое. Мое решение было в следующем:
-
Я сделал абстракцию IItem, у которой могли быть следующие, внутренние, боковые элементы, на которых она держала ссылку.
-
Была энамка экшенов, которые приходили из абстрактного инпута.
Решение таково - из энамки через фактори мы доставали команду, выполняли ее (переход к какому-то элементу) и сетили это в нашем классе Navigator. В конце, еще нужно было добавить возвращение этого элемента с главного метода Navigator, чтобы внешнее приложение знало, что отдал навигатор и что отрисовать, как новый выбранный элемент.
В процессе интервью, меня наводили на более правильные мысли, например, использовать паттерн команду вместо стратегии, и т.д. Интервьюер был в хорошем расположении духа, и мне понравилось.
К слову, в этом интервью не было поведенческих вопросов вообще.
Второе интервью
Я даже сейчас не очень понимаю, о чем было второе интервью, если честно. В один момент, я писал, что говорили, и объяснял, что не так с тем кодом. Потом я объяснял, как я бы это тестировал.
Потом, были вопросы на СОЛИД, по типу: есть интерфейс и там 10 методов:IInt {
M1,
M2,
…
M10
}
Его реализуют два класса
Class A : IInt {
M1{<behavior>} ,
M2{<behavior>} ,
…
M10() {<behavior>}
}
Class A : IInt {M1{<behavior>} ,
M2{<behavior>} ,
…
M9() {}
M10 () {}
}
Второй класс не нуждается в девятом и десятом методе, что здесь не так и как это исправить?
По поведенческих вопросах, спрашивали довольно детально про опыт, и стандартный вопрос “почему я хочу на Майкрософты”.
Мне тоже понравилось интервью, не было прессинга, и мы управились на 15 минут раньше запланированного, и была возможность поболтать еще полчаса.
Третье интервью (алгоритмы)
На самом деле мне тут повезло, мне дали такую же задачку из Литкода, которую я давно уже решал, даже инпут не изменили.
Для интерактива, оставлю вам возможность найти эту задачу и оставить ссылку в комментариях. Если лень - спрашивайте в любой соц. сети, я вам её скину.
Это задача на анаграммы, нужно было сгруппировать анаграммы. Анаграммы - это слова, которые при сортировке будут равны.
И да - я сделал нечестно, после негативного опыта на алгоритмах в Амазоне, я не говорил, что я её уже видел. Но честно признаться, решение я не вспомнил. Начал было писать, и понял, что это не сработает. Пришлось заново для себя ее решать.
Решил я двумя способами, через O(n * m logm) и O(n * m).
ВНИМАНИЕ ДВА СЛЕДУЮЩИХ СКРИНА СПОЙЛЕР РЕШЕНИЯ, СКИПНИТЕ, ЕСЛИ ХОТИТЕ РЕШИТЬ САМИ ПОТОМ!!!
И пару поведенческих вопросов:
-
Наиболее сложная задачу, которую я делал
-
Как решал ситуацию, когда мнения в команде на счет чего-либо расходятся
-
И вот это я не рассказал, потому что так и не понял, что конкретно надо было говорить, дословно: “situation when someone was mistreated at the workplace”
Интервью мне понравилось, но были какие-то странные поведенческие вопросы. Интервьюер, как будто бы боялся меня, нервничал, и все было как-то не очень натурально в том плане, но он был в хорошем расположении духа при этом.
Четвертое интервью (систем дизайн)
В этот раз, у нас есть какая-то система, которая шлет события про файлы (created, updated, deleted) в этих событиях (это я уже под конец уточнил) есть сразу контент апдейта, или криейта (очевидно, для делейта не надо).
Вот требования, которые я себе выписал при вопросах
На самом деле, стронг консистент - как потом стало понятно - не нужно, это я неправильно понял интервьюера.
Решение:
Стандартный master replication + partition with consistent hashing (могли быть спайки) + cache (чтобы держать, последнюю айдиху события для конкретного файла). Мы предположили, что будет идти ивент айди и он будет работать как logical clock, то есть, сравнив два - однозначно понятно, который был раньше. И мы просто дискардим все предыдущие ивент айди.
По поведенческих вопросах - нужно было рассказать про таску и скоуп работы, за которую горжусь.
Результаты
Спустя полторы недели, мне прислали офер
Как я готовился
Всю подготовку можно разделить на два потока - архитектура / систем дизайн и задачки. На поведенческие вопросы я почти не тратил времени.
Задачки
Это наиболее сложная для меня штука. И суть тут в том, что я определяю ум как относительное время решения уникальных для себя задач. То есть, если есть 4 человека, они все в первый раз видят задачу и похожих не решали - то умнее тот, кто быстрее решит (с кучей поправками само собой). Это то, что отличает умных людей от не очень (ИМХО, но немного основанное на книгах).
И я как раз попал в категорию не очень умных, далеко не всегда решения приходят в голову в принципе, я уже не говорю о том, чтобы пришло первому, поэтому единственный выход для меня - это заучить паттерны задач и решений к ним.
И для этого, еще от начала подготовки на Амазон я сел за задачки на Литкоде.
В процессе решения, на 3-4 задачи попадалась как минимум одна, решение которой просто не приходил в голову, хоть ударься о стену.
И в этот момент в голове борются два желания:
-
Продолжать думать, и в случае решения - получить очень много дофамина/эндорфина + самооценки и как следствие огромное удовольствие (мол, это же я и я это решил, я молодец).
-
Посмотреть решение, не получить почти никакого удовольствия, очень часто даже разочарование и злость от того, что решение не нативное и к нему невозможно было бы додуматься. Но все же попробовать уловить паттерн и научиться чему-то из этой задачи.
Полтора года назад, я тоже пробовал решать задачки на Литкоде, и с первым подходом я за полгода решил 80 задач где-то. Для сравнения со вторым подходом я решил почти 150 задач за 3-4 месяца. И по ощущениям, намного больше понимания и уверенности именно дал второй подход. Но нужно хорошо разобрать решение задачи, решить потом ее как можно более разными способами, почувствовать эту задачу, прожить ее.
Даст ли это гарантии, что следующую похожую задачу вы сможете решить? Нет, просто не надейтесь, не даст. Но после 2-4 затупов на похожей задаче и просмотра похожих решений, уже можно говорить о какой-то уверенности.
Также очень важный момент - это найти нормальное объяснение решения. Мне очень нравится, как это делает человек на ютюбе с ником NeetCode.
Если разбор плохой - то это может закончиться бомбежкой с брошенным о стену блокнотом.
Какие задачи с Литкода я решал?
Я брал топ 100 лайкнутых, и решал все медиум и изи, и еще моментами что-то рандомное брал для себя. Потом, просто продолжил с топов брать те, у которых больше лайков, чем дизлайков.
В процессе подготовки, я делал мини майлстоуны и заметки в своей инсте: https://www.instagram.com/stories/highlights/17939340292663489/
Как вы можете видеть, я решил 147 задач перед интервью.
Также я время от времени читал Кормана немного по алгоритмах, в основном на графы.
Архитектура / систем дизайн
Я прочел книгу “System Design Interview”
На самом деле она мне не понравилась, я бы ее использовал для понимания, что нужно учить, а учил бы это из других ресурсов.
К примеру, мне плохо зашло объяснения за Consistent Hashing. Погуглив, я пришел к удовлетворительному пониманию за 5 минут, с книги я пытался понять это минут 20 и так и не понял. Возможно это только у меня так, без вопросов.
Но как путеводитель она дает ответы на вопросы: как спрашивать на интервью, как говорить на интервью, какие техники архитектурные использовать и т.д.
Также я полностью перечитал Мартина Клеппманна. Я его в принципе перед всеми своими интервью перечитываю, потому что эта книга - топ.
Параллельно с этим, я еще смотрел лекции Клеппманна, и несколько статеек про архитектурные штуки по типу: logical time, CAP, сonsistency guarantees, high availability techniques, и т.д.
Выводы
Мне намного больше понравился интервью опыт на Майкрософтах чем на Амазоне.
Не было 50 поведенческих вопросов, интервьюеры были намного дружелюбнее, были моменты, когда они очень хорошо наводили на нужный ход мысли. В то время как на Амазоне, было ощущение, что чувак делает таску, параллельно отвечая на мои вопросы.
Единственный момент, хоть фидбек и был позитивный - но он не был детальным как на Амазоне. Там он тоже не был детальный, но мне сказали, что было окей, что было плохо. Так же, меня немного напрягло, что не дали возможности выбирать проект и страну для релока, перед этим пообещав такую возможность.
Кому лень читать статейку - я все то же самое уже записал в своем видео.
Если есть какие-то вопросы - прошу, задавайте в комментариях, или где-то в моих соц. сетях (инста, телега, фейсбук, ютюб). Спасибо за внимание!
Автор: Andrii Bui