Про требования к кандидатам и подготовку к интервью в Microsoft
Этот пост — завершаюшая часть моего рассказа про процесс интервью в Microsoft и подготовку к нему. Если вы пропустили предыдущие части, то настоятельно рекомендую прочитать с самого начала.
В целом, уровень знаний и опыта, необходимый на определённую позицию сильно зависит от команды, позиции, проекта и технологий, но по моим субъективным ощущениям на позицию Junior-Middle Software Engineer в Microsoft от кандидата ожидается:
Разработка и ООП на C#
Полное и уверенное владение по крайней мере одним стеком технологий, конструкциями языка и его особенностями. Ожидается, что кандидат умеет использовать этот язык, чтобы достичь решения задачи и помнит про тестирование и качество кода — читаемость, поддерживаемость, стандарты ООП, SOLID, безопасного программирования, паттерны проектирования.
Например, программисты, занимающиеся спортивным программированием (ACM), но не работавшие в энтерпрайзе, плохо проходят интервью, потому что пишут эффективный, но ужасный код.
Из тех книг, что читал я на тему реализации и качества кода по C#, я бы посоветовал:
- “Clean Code”, Robert Martin
“Чистый код”, Роберт Мартин - “Code complete”, Steve McConnell
“Совершенный код”, Стив Макконнелл - “CLR via C#”, Jeffrey Richter
“CLR via C#”, Джеффри Рихтер - “C# in Depth”, Jon Skeet
“C# для профессионалов”, Джон Скит - “MCSD Certification Toolkit 70–483 Programming in C#”
“Пособие для подготовки к экзамену MCSD 70–483 от Microsoft по программированию на C#”
Книги желательно читать в оригинале, потому что перевод терминологии в русскоязычной литературе неконсистентный.
В то же время допускается наличие пробелов в некоторых продвинутых областях знаний, например в system design, а также использование не самых эффективных, продуманных или изящных решений. На интервью можно попадать в тупики, если адекватно на них реагировать, и с помощью подсказок находить выход из них.
Алгоритмы и структуры данных
Для прохождения интервью по алгоритмам и для решения головоломок (puzzles) понадобится специальная подготовка.
Особенно важна подготовка, как мне кажется, по следующим популярным темам:
- Логические задачи и puzzles. Их не так много и они далеки от реального практического применения, поэтому найти правильное решение сразу и в стрессовой ситуации практически невозможно, независимо от опыта работы. Стоит изучить их заранее. Кстати, обычно перед тем как задать puzzle, интервьюер просит сказать, если эту задачу ты уже слышал ранее. Обманывать и делать вид, что придумал решение не стоит. Скажите, что знаете задачу и расскажите решение. Умение делать “домашнее задание”, изучать тему, готовиться к собеседованию— тоже положительные качества кандидата
- Структуры данных:
Array
,List
,LinkedList
,HashSet
,Queue
,Stack
,Dictionary
,SortedSet
,SortedList
. Важно понимать принцип работы всех этих структур данных и уметь применять их корректно во всех задачах, чтобы оптимизировать производительность кода. Также существует немало puzzles на структуры данных, например “найти цикл в односвязном списке”, “клонировать список с одной ссылкой на следующий элемент и ссылкой на случайный элемент” или “реализовать очередь на основе двух стэков” - Деревья, очень много задач на деревья. Обычные деревья, бинарные деревья поиска, кучи. Свойства, построение, восстановление, обход — префиксный, инфиксный, постфиксный.
Никаких продвинутых самобалансирующихся деревьев вроде AVL или красного-чёрного дерева вы писать не будете, но стоит знать о их существовании и предназначении, чтобы упомянуть на обсуждении граничных условий проблему разбалансировки дерева - Строки. Палиндромы, регулярные выражения, поиск подстрок. Важно также знать аспекты работ со строками в языке программирования. Например, можно получить серьезный минус за использование конкатенации строк в цикле вместо
StringBuilder
в C# - Сортировки. Вряд ли вы будете писать Quick Sort или Merge Sort с нуля, но нужно понимать свойства сортировок, их асимптотическую сложность и как их применить в вашем языке программирования
- Массивы, векторы и матрицы. Для одномерных — поиск чисел, среднего, медианы, повторяющихся, самых часто встречающихся, “лишних” и недостающих чисел. Для двумерных могут быть, например, повороты двумерных массивов, проверки симметричности
- Бинарный поиск, поиск в глубину (DFS), поиск в ширину (BFS). Базовые алгоритмы, которым применяются к самым разным структурам данных и ситуациям и позволяют решить огромный спектр задач
- Динамическое программирование. Типовых задач тоже немного, но встречаются нередко. Прийти к решению самостоятельно на интервью, не зная динамическое программирование маловероятно
Если сравнить с популярными темами на ACM-контестах, то лично не видел на интервью сложных задач на комбинаторику, графы, теорию чисел и геометрию, но они вполне могут встретиться. Дайте знать, если вы встречали такие задачи.
Так как же подготовиться к техническому интервью?
Самый полезный и первый ресурс для подготовки к интервью в любую компанию — Glassdoor.
Можно посмотреть актуальные вопросы на собеседованиях в компанию, почитать отзывы и советы от других кандидатов. На сайте можно узнать узнать диапазон зарплат по вашей позиции, компании, городу, что очень важно для этапа переговоров по зарплате.
Еще один обязательный ресурс для посещения — GeeksForGeeks с огромным количеством разделов с описанием алгоритмов, задач и вопросов. Например, для Microsoft самое интересное:
- Все темы для подготовки к интервью в Microsoft
- Полный список задач, которые обязательно нужно уметь решать для интервью в компании как Amazon, Microsoft, Adobe
- Рассказы людей о их опыте прохождения интервью в Microsoft
- Список базовых алгоритмов и типовых задач на них
- Список базовых структур данных и типовых задач на них
Настоятельно рекомендую прочитать книгу Cracking the coding interview, G. L. McDowell. Она содержит задачи и советы по подготовке к интервью в крупнейшие корпорации.
Из других ресурсов могут понадобиться:
- LeetCode — типовые задачи
- HackerRank — типовые задачи
- YouTube — примеры интервью и рассказы про реальный опыт интервью
- Множество других Интернет-ресурсов, которые можно найти в поисковике. Например, вот статья на Medium со списком всех типовых задач на бинарные деревья
Также есть платные сервисы, где за солидную плату реальные сотрудники крупных корпораций проведут вам полноценное собеседование по Skype, но отзывы о них весьма противоречивые. Кто-то говорит, что это единственный верный способ попробовать себя в роли кандидата, а кто-то говорит, что это трата денег, так как ощущения не те и нет волнения. Да и стоит это удовольствие на наши деньги недёшево — от €100 до €300 за одно интервью.
Какой уровень английского языка нужен для интервью?
Для успешного прохождения всех этапов интервью понадобится английский на достаточном уровне, чтобы выражать свои мысли и идеи, объяснять свои решения. Английский язык не является объектом исследования на собеседовании, он лишь инструмент для конструктивного диалога. По этой причине сами интервьюеры говорят достаточно медленно и чётко, используют простые слова и спокойно объясняют, если что-то не понял.
То есть, умышленно никто не будет вслушиваться или проверять ваш уровень. В то же время, если вы не сможете уверенно объяснить своё решение или раскрыть себя как личность по причине слабого знания языка, то будет обидно.
На счёт чего точно не стоит переживать — грамматика, использование сложных времён или конструкций, акцент и прочие аспекты, которые не мешают слушателю воспринять информацию. Говорите максимально просто и понятно. А вот по англоязычным техническим терминам стоит пробежаться, если вы не использовали их раньше в своей работе.
У меня с посредственными IELTS 6.0 и минимальным опытом общения с иностранцами проблем не возникло.
Я готов к интервью. Что делать дальше?
Помимо технической подготовки есть еще несколько обязательных пунктов.
Подготовьте резюме
Написание CV— вообще отдельная большая тема и заострять внимание на ней я не буду. Если вкратце, то ваша задача — разрекламировать себя и заинтересовать рекрутера. Вы должны анализировать каждую компанию и позицию, а затем редактировать резюме под каждую позицию, чтобы описывать тот опыт и знания, которые ожидаются на этой позиции.
Считается, что на беглое чтение резюме рекрутер тратит не более 20 секунд, так что это должна быть только релевантная и интересная информация. Не стоит писать очевидные вещи вроде “разрабатывал программное обеспечение” или “выполнял поставленные задачи”.
Не надо писать про обязанности на работе. Пишите про опыт и достижения, желательно с цифрами и фактами. Резюме должно звучать как история успеха:
Внедрил UI-тестирование на базе Selenium, описал и покрыл все 55 пользовательских сценариев. Внедрил в CI, сократив количество новых багов в продакшне на 85%
звучит привлекательнее, чем
Обязанности:
- написание функциональных тестов
Резюме не должно быть больше двух страниц. Еще лучше, если вы сможете уместить всё на одной странице.
Кстати, крайне нежелательно указывать возраст, дату рождения, пол, рост, вес, национальность, политические или религиозные взгляды—это считается неприличным, особенно на западе. Это не имеет отношения к работе, а также может звучать как будто вы пишете это для получения привелегии. Возможно, стоит отказаться и от фотографии в резюме, но на этот счёт мнения людей расходятся.
Подготовтесь к вопросам по soft skills
Очень важной частью работы будет общение с людьми и работа в команде, поэтому личным качествам кандидата уделяется отдельное внимание. Программисты из наших стран достаточно часто упускают подготовку к вопросам по soft skills, teamwork, collaboration, conflict resolution, leadership.
Стоит заранее подготовить на них ответы:
- Вспомните последнюю конфликтную ситуацию на своей работе и как вы её разрешили. Не стоит утверждать, что у вас никогда не было конфликтов — конфликты есть всегда, пусть даже скрытые или, если повезёт, открытые и конструктивные. В крайнем случае вспомните ситуацию, когда вы умело и профессионально убедили свою команду в правильности вашего подхода \ решения
- Вспомните человека, с которым вам было тяжело работать, почему, и как вы боролись с этим. Постарайтесь создать впечатление неконфликтного человека. Например, расскажите, что обычно вы очень хорошо ладите с людьми, но однажды пришлось работать с таким человеком извне команды, но в итоге вы нашли общий язык
- Вспомните ситуацию, когда вы помогли своей команде в сложной ситуации.
- Как вы помогаете команде организовать работу?
- Какие полезные практики вы внедрили? Code review, continuous integration, тестирование, Agile, пятничные походы в бар
- Как вы организуете свою работу?
- Как вы управляете своим временем?
- Как вы боретесь с переизбытком работы или дефицитом ресурсов?
- Какие ваши слабые стороны? На этот вопрос нельзя отвечать “у меня их нет”. Также, не стоит использовать популярный трюк и пытаться выставить очевидные плюсы за минусы, например ответив “я слишком трудолюбивый”. Вспомните один из своих реальных недостатков и то, как вы работали над ним. Конечно, не стоит раскрывать недостатки, которые вы не смогли побороть и которые могут повлиять на вашу работу
- Кем вы видите себя через 5 лет? Этот вопрос давно стал клише и вызывает у кандидатов улыбки, но это не значит, что его не спросят
Рекомендую также почитать про Growth Mindset, который так ищут в своих кандидатах крупные корпорации:
Во время интервью оставайтесь позитивным, избегайте негативных или слишком экспрессивных прилагательных вроде “обожаю” или “ненавижу”, улыбайтесь. Рассказывая про негативный опыт (например, отвечая на вопросы про конфликты) оставайтесь позитивным и дружелюбным.
Помните, все участники процесса интервью — обычные люди, которые хотят найти в этом большом мире интересного, приятного человека, имеющего успешный (но не обязательно большой) опыт работы и желающего поделиться им, чтобы принести пользу компании.
При этом этот человек должен быть приятным собеседником и хорошим другом, чтобы в будущем можно было провести вечер в баре, обсуждая новые технологии или любые отвлечённые темы.
Вам всего лишь нужно оставить именно такое впечатление :)
Спасибо за внимание!
Если вы вдруг пропустили предыдущие части рассказа, то рекомендую почитать их:
- Часть 1. Про то, как я попал на интервью в Microsoft
- Часть 2. Про техническую часть on-site интервью в Microsoft, с разбором задач
Еще есть отдельная статья с сравнением процесса интервью в СНГ и Европе:
Ссылки
- Добро пожаловать
Оглавление по всем статьям в этом блоге