outcoldman
outcoldman Denis Gladkikh

Прохождение интервью в Microsoft. Часть 1.

outcoldman, Microsoft, Interview, and USA

Недавно прошел интервью на позицию разработчика в компанию Microsoft в США, в Редмонд. Хочу поделиться тем, как это все происходило, ну и что нужно сделать для удачного прохождения интервью по моему скромному мнению и т.п. Ну и конечно же поделюсь техническими задачками, которые у меня спрашивали. Все это вылилось в очень много букв, потому если нет времени, оставьте на потом почитать (еще и вторая часть будет).

Этап 0. Резюме.

Тут я просто хочу дать немного рекомендации относительно резюме. Видел много ужасных резюме за свой очень маленький опыт просмотра резюме. Самая распространенная ошибка – это, конечно же, куча ненужной информации. А давайте я сначала порекомендую свою резюме, как верное, с ним можно ознакомиться на страничке Обо мне, а так же как шаблон скачать отсюда Denis Gladkikh.doc (Удален, вы можете посмотреть в разделе "Обо Мне/CV").

В общем, делайте ваше резюме на столько кратким, на сколько это возможно, но в то же время на столько же подробным, на сколько это нужно (как завернул, а?). Если вы подаете документы на разработчика БД, то не пишите о том, что сначала вашей карьеры вы целый год писали на C++, а потом следом у вас пойдет 10 лет опыта с БД. Подумайте, что мисс Мурпл при прочтении вашего CV (ага, так его называют за бугром, Сurriculum Vitae, видимо) увидит первой строкой C++, и выкинет ваш CV, так как первая мысль, что человек подал документы не туда (ну сами представьте ей нужно прочитать 100 резюме в день, а еще поболтать по телефону и посмотреть сериальчик, она хочется добиться большей производительности). Впишите этот скилл где-нибудь, но не уделяйте ему много значения. Еще лучше для каждой отправки CV вставить секцию “Goal”, прямо перед Skills, где в двух предложениях объясните, почему вы подходите для данной позиции.

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

Так же не забудьте в письме указать на какую позицию вы претендуете, не думайте, что у мисс Мурпл в голове держатся все вакантные места, и она помнит, где и какие объявления она оставляла. Так же лучше честно писать, сколько денег вы хотите зарабатывать (не будьте наглыми, всегда можно подыскать среднюю цену, и прибавить чуть-чуть). Лучше сразу написать сколько вы хотите, чтобы не терять ни ваше, ни чужое время (вопрос о зарплате – это просто дело времени, редко вам предложат определенную сумму, правда, большие компании, вроде Microsoft, конечно же предлагают деньги, а не спрашивают).

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

Этап 1. Выбор позиции.

Идем на careers.microsoft.com, ищем подходящие для вас позиции, загружаем на сайт свое резюме. Скажу честно, что специально я не мониторил позиции, и предложили мне совсем другую позицию, в отличие от той, на которую я подавал. Просто прислал рекрутер (за все время было столько разного народа, что я так и не понял кто из них кто, это первый кто со мной связался, назовем его Боб1) письмо, что вот у меня есть похожая позиция на ту, что ты подал, не хочешь попробовать на нее. Ну и я и попробовал. А подал я свое резюме просто ради интереса на позицию разработчика, толи в команду Silverlight, толи в Windows Phone, уже и не помню (было это, наверное, в начале января). В твиттере проскочила как-то ссылка, что команда ищет новых людей, вот я и попробовал.

Я немного прокачался в знаниях позиций, пока общался с людьми, кто уже работает в штатах на Microsoft, а так же с людьми, у кого я собеседовался. В общем, у Microsoft есть 3 основных направления – разработчики (SDE – Software Developer Engineer), тестеры (STE – Software Test Engineer) и менеджеры проектов. Нужно учитывать, что STE – это не наши QA, а люди, которые так же должны хорошо разбираться в коде, и в основу их деятельности входит написание юнит тестов (если я правильно все понимаю). У каждого направления есть еще разные уровни, например, у разработчиков – SDE, SDE II, Senior SDE. Я проходил интервью на Senior SDE. Прошел, но, как я понял, рекрутер (или кто там решает эти вопросы) решил, что уровень моего опыта пока не дотягивает до Senior, и мне предложили SDE II (меньше ответственности в чужой стране и новой компании с этой стороны тоже хорошо). Как мне еще намекнули люди, кто уже работает в Редмонде, что получить позицию Senior из вне достаточно сложно (нужно иметь действительно хороший опыт), у меня же, согласен, опыт больше тянет на SDE II, хотя в России это уже считается и Senior, в принципе. Не гордые мы.

Когда писал эти изложения, смотрел переписку, и оказывается это я прошляпил. Показали то мне позицию Senior, а когда я подал на нее документы, то мне сделали вызов на SDE II, просто никто на этом не акцентировал внимание, а везде фигурировало SDE II вместо Senior, а я просто не заметил тогда.

Этап 2. Первые вопросы от рекрутера

Итак, Боб1 прислал мне ссылку на позицию (на которую я должен был откликнуться на сайте чисто для формальности), а так же вордовский документ с кучей вопросов.

Administrative Questions
Name:
Date completed:
Best method and time to contact you:
Best phone number(s) to reach you for your phone interview:
Have you ever been contacted by or spoken with a Microsoft recruiter?  If yes, who and when?
Do you know anyone at Microsoft who could act as a reference for you?  If yes, who?
Have you previously worked for Microsoft (as a full-time employee or contractor/vendor)?  If so, please list your most recent managers.
Have you interviewed for positions with Microsoft?  If so, when and what were the results?
Are you open to relocation to the Puget Sound area?  If you accepted an offer from Microsoft, how long would you anticipate it would take to make the move to this area?
Are you a US citizen, permanent resident; applicant for legalization or amnesty, asylee or refugee?  If no, what is your visa status and country of citizenship?
Have you signed a non-compete or non-disclosure agreement which may prevent you from taking a position or pursuing opportunities at Microsoft? 

Current Status
Do you currently have interviews with other companies in progress or offers you are considering?
Why are you considering new career opportunities at this time? 
As you look ahead to potential career opportunities, what are the “must have” criteria that you will be using to determine which opportunity is the right one for you?
What is your current or Expected Base Salary?
What are your longer-term goals?  What is the next role you see yourself in?  What will you have to work on or learn in order to reach this objective?
Describe your current or most recent company/what is the line of business/who are the customers?
What is your current position?

General/Skills-Related Questions
What are your 3 strongest technical skills? (Please rank your ability on a scale of 1-10 (novice to guru) and years of experience in listed skills.
How many products have you taken through the product life cycle?
Define your expertise as it relates to product development. Do you enjoy working on GUI, platform, mid tier?
How much experience in cross group collaboration do you have? Please describe a specific example of when you had to exercise these skills.
What are your areas of improvement?
What have you done in the past year to develop your skills and abilities?  Do you have any industry certifications?

Software Design Engineer Questions
What is your strongest programming language (C, C++, C#, VB, Java, ASP, HTML, etc…)?
When was the last time you wrote C/C++ code?
What percentage of your time do you spend writing code?
Do you have experience with Multithreaded programming? If so please explain.
How much experience do you have performing code and design reviews?
Do you have software testing experience? If so how much?  Do you test the code that you write?  How?
What do you find gratifying about developing software?
What is the largest piece of code you’ve written in terms of lines of code?  How many lines was it?  What language did you use?  What did it do?
What percentage of code have you written was kernel mode and what percentage was user mode?
What difficult technical problem have you been able to overcome that you are most proud of? Please provide specifics outlining the problem and how you resolved it.

Please respond to the below as it relates to your current project/product:
What percentage of your current project did you own?
What percentage was of your design?  How much was new code and how much was enhancements?
Were you responsible for writing technical or functional specs?
How many people did you lead or manage?  What were their roles?
What layer are you working on?  (kernel, middleware, UI)
What percent of coding was yours on the project? 
What percent of your time did you spend coding?
What language was it written in?
How long were you working on this project?  Was it full life cycle?
How did you debug it?

Coding Question
Write a function that would: return the 5th element from the end in a singly linked list of integers, in one pass, and then provide a set of test cases against that function.

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

Why are you considering new career opportunities at this time?
1.
Interesting work.
2.
Want try to leave outside of Russia (maybe in other countries is better life, who knows).
3. Money and promotion track.

Буду давать умные советы по поводу кода (последний вопрос). Если не знаете что такое linked list (я не знал, не помнил, потому погуглил) – просто пройдитесь по интернету, найдите реализации, схемы, но напишите обязательно его сами. Ну и приступайте к реализации функции. Вот как это выглядело у меня:

/// <summary>
/// Single linked list structure
/// </summary>
/// <typeparam name="T"></typeparam>
public class SingleLinkedList<T>
{    #region Internal Structure
     private sealed class ListItem<T>
    {        public ListItem(T value)
        {            Value = value;
        }
         public ListItem<T> Next { get; set; }
         public T Value { get; set; }
    }
     #endregion
     private ListItem<T> Head { get; set; }
     private ListItem<T> Tear { get; set; }
     /// <summary>
    /// Add new item to the list (Add Last)
    /// </summary>
    /// <param name="value"></param>
    public void AddItem(T value)
    {        var item = new ListItem<T>(value);
         if (Head == null)
        {
            Head = item;
            Tear = item;
        }        else
        {            if (Tear == null)
                throw new NullReferenceException("SingleLinkedList structure broken: Tear can't be null if Head is not null.");
 
            Tear.Next = item;
            Tear = item;
        }
    }
     #region Additional Functions
     public T GetFifthElementFromEnd()
    {        return GetElementFromEndByPlace(5);
    }
     private T GetElementFromEndByPlace(int place)
    {        ListItem<T> lookingItem = null;
         if (Tear != null)
        {
            ListItem<T> currentItem = Head;            int elementFromBegginer = 1;
            do
            {                if ((elementFromBegginer + 1) >= place)
                {                    if (lookingItem == null)
                        lookingItem = Head;                    else
                        lookingItem = lookingItem.Next;
                }
                currentItem = currentItem.Next;
                elementFromBegginer++;            } while (currentItem.Next != null);
        }
         if (lookingItem == null)
            throw new ArgumentOutOfRangeException(string.Format("Can't find {0} element from end.", place));
         return lookingItem.Value;
    }
     #endregion
 
}/// <summary>
/// Structure linked list with Int32 type as value
/// </summary>
public sealed class IntegerStructureLinkedList : SingleLinkedList<int>
{
}

Ну и тесты:

[TestFixture]public class IntegerStructureLinkedListGetFifthFromEndElementTests
{
    [Test]    public void GetFifthElementFromEnd_SimpleCollection_ReturnExpectedResult()
    {        var list = GetIntegerStructureLinkedListWithCount(6);
         Assert.AreEqual(2, list.GetFifthElementFromEnd()); // 2 is 5th element from end
    }
 
    [Test]    public void GetFifthElementFromEnd_CollectionWith5Elements_ReturnExpectedResult()
    {        var list = GetIntegerStructureLinkedListWithCount(5);
         Assert.AreEqual(1, list.GetFifthElementFromEnd()); // 2 is 5th element from end
    }
 
    [Test]    public void GetFifthElementFromEnd_BigCollection_ReturnExpectedResult()
    {        var list = GetIntegerStructureLinkedListWithCount(10000);
         Assert.AreEqual(9996, list.GetFifthElementFromEnd()); //9996 is 5th element from end
    }
 
    [Test]    [ExpectedException(typeof(ArgumentOutOfRangeException))]
    public void GetFifthElementFromEnd_EmptyCollection_ReturnExpectedResult()
    {        var list = GetIntegerStructureLinkedListWithCount(0);
        int fifthElementFromEnd = list.GetFifthElementFromEnd(); // exception will be there
    }
 
    [Test]    [ExpectedException(typeof(ArgumentOutOfRangeException))]
    public void GetFifthElementFromEnd_CollectionWith4Elements_ReturnExpectedResult()
    {        var list = GetIntegerStructureLinkedListWithCount(4);
        int fifthElementFromEnd = list.GetFifthElementFromEnd(); // exception will be there
    }
     private IntegerStructureLinkedList GetIntegerStructureLinkedListWithCount(int count)
    {        var list = new IntegerStructureLinkedList();
        for (int i = 1; i <= count; i++)
        {
            list.AddItem(i);
        }        return list;
    }
}

Заметьте, что тут нет студенческого халявного подхода (собственно, ведь никто же не пишет код по студенчески?). Если попросили LinkedList c целыми, то я не обломался написать сначала абстракцию для любых типов. Если просят вернуть 5-й элемент, то опять меня не ломает написать сначала метод, который бы возвращал для заданного числа n, даже больше скажу, мне так проще написать, чем именно для 5-го. Перед своим кодом я, конечно же, дал комментарии о том, что я выбрал язык C#, так как в последнее время пишу на нем, а так же что я выбрал NUnit, так как чаще всего использую этот фреймворк, чтобы читающему этот код не пришлось ломать голову. Так же я написал и уточнил, что реализовал только базовый функционал LinkedList, который мне был нужен, только потому, чтобы не мозолить глаза ненужным и не используемым кодом. Написал, что считаю необходимым дополнить эту реализацию по крайней мере методом Remove, и если бы я писал этот код для нашего проекта, то так бы и сделал, даже если бы мне это не было необходимо в текущем коде. Так же упомянул, что тесты я написал только для требуемого метода, как это просилось, хотя, конечно же, просится на тестирование и остальной код.

Этап 3. Телефонное интервью.

На самом деле это и можно назвать первым этапом, если вы вменяемы, то без проблем дойдете до этой стадии. После того как вы отправили заполненную анкету Бобу1 с вами свяжется Боб2, в моем случае, как я понял это был мой будущий team lead (SDE Team Lead наверное, чисто для уточнения). Он мне сообщил, что ему передали все документы и он хотел бы поговорить со мной по телефону в течении 40 минут, максимум час. Ну и спросил, когда мне было бы удобно. Я подобрал время, с расчетом на рабочее время Боба2 (не сложно же посчитать), и указал, во сколько времени моего это будет и во сколько его (с точным указанием временных поясов). Так же дал все телефоны и визуальные/голосовые средства связи, которые у меня были: skype, msn, gtalk и телефон. Ну и уточнил, что мне намного приятнее было бы провести интервью через тот же skype, так как не люблю держать телефон у уха долго. Мое предложенное время подошло (точнее я предложил конечно же несколько временных промежутков) и мне назначили время интервью (наш вечер, их утро, не самый лучший вариант, но других, видимо, и быть не может). И Боб2 согласился поставить себе skype только для того, чтобы провести интервью со мной.

Боб2 мне поведал немного о себе, рассказал о работе, о том чем они занимаются, что их команда делает (не в данный момент, конечно же, ибо NDA, а в целом). Я постарался своевременно познакомиться с их продуктом/детищем, чтобы иметь более четкую информацию об этом, потому я уже был немного в курсе, и даже с умным видом поддакивал. Дальше пошли вопросы ко мне, часть из них была из списка, что я отправлял Бобу1, вроде, чем занимаюсь сейчас, какие курсы слушал в университете (американцы то не имеют представление, что у нас за образование, и лучше им не рассказывать), какие курсы мне помогают программировать (это единственный вопрос, на который я не смог ответить, хотя вроде кажется, что все курсы: дискретная алгебра, языки программирования и т.п., а вот четко ответить и не знаешь чего). Еще могу похвастаться тем, что английский у меня явно на “пятерку”, и со стороны я даже и не думаю что Боб2 понял, что я ему там втираю. Я только мямлил и бубнил. Дальше Боб2 поставил мне конкретную задачу, предложил мне представить, что я разрабатываю программу-переводчик (словарик), как бы я его делал и т.п. Я задал несколько наводящих вопросов, для кого будет переводчик, какие языки, и т.п. Начал думать как делать, подумал про БД локальные, про то, что было бы хорошо сразу подумать о том, что можно поставлять наш переводчик с разными наборами направлений переводов. Боб2 меня остановил, и попросил представить, что у меня нет БД, что я пишу такой переводчик, который бы хранил все в памяти, и какие структуры я бы выбрал. Ну я там начал на моем английском “на пятерочку” рассказывать, как бы я хранил слова, чтобы проще до них было добраться, что разложил бы их так, что есть структура, по которой находим первые буквы, каждый из узелков структуры – это опять структура со вторыми буквами и т.п. Предположил эту структуру как простой список сначала, подумал о том, что тут может быть загвоздка, что слово zzz будет намного дольше искаться, чем aaa. Боб2 сразу же меня начал спрашивать про оценки сложности (все помнят про o-оценку? вот и я вспомнил тогда же), я дал ее, и сказал что тут бы нам нужно списки заменить b-деревом (надеюсь я его правильно назвал), что это позволит нам сократить время поиска слов zzz. Боб2 меня спросил сразу же про оценку поиска по b-дереву. А я не помнил, но мне не составило труда ее подсчитать. Я прям при нем, произнося в слух, что делал, начал прикидывать оценку и дал верный ответ log(n). Все это сопровождалось моей писаниной на листочках и пиханием их в веб-камеру, и нужно было еще чтобы руки не дрожали, ибо камера должна сфокусироваться. Но руки у меня не дрожали, так как я относился до сих пор посредственно ко всему этому. В общем, Боб2 поблагодарил меня и сказал, что мне позвонят.

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

Продолжение следует…. upd: Часть 2

P.S. 0. Как видите, никто меня не спрашивал про то, почему люки круглые, а я читал книгу “Как сдвинуть гору Фудзи?”, и был готов ответить на этот вопрос. Могу вас расстроить, меня и на устных собеседованиях никто не спросил об этом.

P.S. 1. Можете не спрашивать меня еду я или не еду, и в какую команду. Я пока не решил окончательно. Буду рад советам, рекомендациям - стоит или не стоит. Может кто-то уже живет в Редмонде и будет рад знакомству, кто-то может тоже собирается (зная что соплеменники будут там, будет проще принять решение).

P.S. 2. Это относится к этой части моего изложения, и следующего: скорее всего вы умнее меня, и, может быть, знаете более правильные ответы - это разумеется, но меня учить уже не нужно. А рекомендации и советы остальным, кто прочтет - это пожалуйста.

Have feedback or questions? Looking for consultation?

My expertise: MongoDB, ElasticSearch, Splunk, and other databases. Docker, Kubernetes. Logging, Metrics. Performance, memory leaks.

Send me an email to public@denis.gladkikh.email.

The content on this site represents my own personal opinions and thoughts at the time of posting.

Content licensed under the Creative Commons CC BY 4.0.