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

Рекрутер резюмировал пакет:

  • Годовая зарплата 150 тысяч евро (зарплатная часть составляет 100 тысяч евро. Однако в ЕС работодатель также заботится о медицинском страховании. Этот обещал его для всей моей семьи. Затем идут месячные каникулы в сочетании с праздничными бонусами)
  • Опционы на акции на сумму 170 000 евро на 4 года

Если я применю эти цифры за 4 года и оценю, что акции превысят даже 3-кратную текущую стоимость, общая сумма составит около 1,1 миллиона евро. Обратите внимание, что 3x является наиболее консервативным показателем, поскольку он коснулся 1,5x только за последние 4 месяца мировой экономики, пораженной COVID.

Разделив на 4, получим примерно 277 000 евро (314 000 долларов США).

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

Важно понять закономерность, по которой они идут.

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

Звонок рекрутера:

Это был короткий и по существу разговор.

Рекрутер проинформировал меня о возможности. Потом он спросил меня о моем опыте. Я резюмировал его со всеми техническими терминами, с которыми я работал, которые имели отношение к этой роли.

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

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

Звонок от менеджера по найму:

Менеджер по найму был парнем с опытом работы с данными. У меня не было опыта в этом, но, к счастью, у меня была неделя, чтобы прикоснуться к некоторым вещам. Наем должен был осуществляться в команду по привлечению пользователей. Я читал о некоторых концепциях UX, тесно связанных с привлечением пользователей. Я также читал о том, как мобильные платформы обрабатывают НЛП и другие вещи, связанные с ИИ.

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

Пришел самый главный вопрос: Почему именно эта компания? Расскажи мне о своей мотивации.

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

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

Упражнение по кодированию:

Это был этап, которого я боялся больше всего. И это тоже оказалось не просто.

Задача включала 3 упражнения Codility. Было заявлено, что кандидат не должен пытаться попробовать их все. Скорее, было целесообразно предоставить полные решения без ошибок для 2 из них.

№1: Найти, есть ли в массиве хотя бы один раз все числа от 1 до K

Эта проблема не нуждалась в кодировании. Мне нужно было только найти ошибку. Однако, поскольку это сложная задача, я сомневался в ее относительной простоте. Из 90 минут мне потребовалось более 35 минут, чтобы исправить неустойчивую линию.

#2: Обрезать строку до K символов, не разрывая (разбивая) слово и не заканчивая пробелом.

Например, если ввод = «Я хочу съесть яблоко» и k = 10, вывод должен быть «Я хочу». Если k=13, вывод будет «Я хочу есть».

Это заняло немного времени, но я следовал этому довольно гладко. Это оставило мне очень мало времени для самой сложной задачи.

№3. Учитывая два месяца в качестве входных данных, найдите максимальное количество дней отпуска, которые можно взять за эти 2 месяца. Рейсы туда и обратно выполняются только по воскресеньям, а обратно — только по субботам.

Например, если входными данными являются апрель и май 2021 года, выход будет (4 апреля — 29 мая) = 27 + 29 = 56 дней.

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

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

Через 10 дней, когда ответа не последовало, я лишь наполовину надеялся, что справлюсь.

На 11 день пришел ответ от рекрутера:

«У меня есть отличные новости — как, возможно, упомянул ‹другой мой коллега-рекрутер›, мы хотели бы перевести вас на следующий этап и организовать для вас видеозвонок с ‹Разработчиком A› и ‹Разработчиком B›!»

Я испустил победный клич.

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

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

Меня очень порадовала прозрачность на столь раннем этапе найма. Я собирался присоединиться к компании, в которой была такая открытая культура даже для соискателей! Это была, конечно, редкая порода.

У меня была ровно 1 неделя на подготовку перед встречей с разработчиками A и B, и это интервью определило мое будущее.

Финальная подготовка:

Худшее в собеседованиях с старшими разработчиками — это то, что их невозможно предсказать.

Чтобы ответить на сложные вопросы (алгоритм, API и т. д.), вы должны войти в поток. Чтобы попасть в поток, вы должны программировать.

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

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

Однако в самый последний момент я обнаружил, что читаю о самых приземленных темах разработки программного обеспечения (Agile, TDD и так далее). Я понятия не имел, придут ли они вообще, но я не хотел оставлять камня на камне.

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

День интервью:

Когда начался звонок в Zoom, я очень нервничал. Оба разработчика приветствовали меня. Ведущий разработчик принял мантию и задал мне несколько вопросов для разогрева. Мне стало немного легче, но не так сильно, как я себе представлял.

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

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

За этим последовал вопрос о дизайне программного обеспечения:

If you were to design software that downloaded some data from the back end, how would you design it for a mobile client?

Мой ответ резюмировал некоторые классы, которые использовались для загрузки HTTP, за которыми следовал подход сериализации с использованием XML/JSON. Я также упомянул о разделении кода загрузки и сериализации. Это заставило его спросить:

What is code segregation? Why is it even necessary?

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

Это вызвало более теплую улыбку на его лице. Он похвалил меня за знание ООП и архитектуры.

К моему ужасу, другой разработчик был по-прежнему невозмутим. После предыдущих представлений он не произнес ни слова.

Именно в этот момент все начало разваливаться.

Вопрос о троянском коне:

Троян определяется как Невинность, скрывающая смертоносное намерение.

«Если один из членов вашей команды не делится с вами достаточной информацией, что вы будете делать?»

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

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

Вместо этого я выбрал настоящую:

It happened with me when I was working for a Fortune 500 client through my servicing company. The other servicing company had developed the core components. I took the problematic guy into a coffee-table conversation.”

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

You see, when two people aren’t working in unison, one has to start asking: What is it that I can do to change it? That’s what I did. I asked that guy why aren’t you trusting me? Tell me what is my shortcoming and I would be happy to improve.
If he still doesn’t share things with me, I would probably go to my team lead. But I would be very cautious going through the escalation route. You see, trust is very important, and it is better people solve trust problems in amicable ways rather than organizational escalations.

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

Троянский конь открывается:

Именно в этот момент немой парень впервые решил вступить в разговор.

If a bug comes along, what do you do to fix it?

Это был довольно открытый вопрос. У меня за плечами был 20-летний опыт. Каждая компания, в которой я работал, следовала различным процессам, и эти процессы также сильно развивались. Как один ответ может обернуть все это? Это было возможно, только если бы я подготовился к этому заранее, но не сейчас.

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

Our software was deployed very wide range of clients and platforms. So we had dedicated teams to triage the bugs. Once triaged, bug repro environments will be ready for developers to work on. I was sometimes part of the triage preparation, too. 
Once this is done, I would analyze the problem. Having found the solution, I would create a private branch. Then I would raise review request (Merge requests weren’t the term used in that organization, so I missed to mention the word "merge request".) 
Once approved, I would merge the code into master.

Это снова не изменило выражения их лиц. Как всегда, я был выше точки замешательства. Вот я и решил спросить:

If this is not answering your question, feel free to ask me more specifically!

Это был самый громкий крик от меня о том, чтобы быть конкретным. Но они отказались обращать на это внимание.

You see, no answers are right or wrong! Whatever you say, we gotta hear it out.

Я подумал про себя:

Что это за разговор?

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

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

Когда до срока оставалось всего 2 минуты, он спросил (поставив галочку, как будто это было необходимо, но недостаточно)

When would you consider a product is production ready?

Когда-то я был руководителем службы доставки. На тот момент я сделал максимальное количество релизов. Но времени на расширение этой роли уже не оставалось. Я просто резюмировал точку принятия решения:

100% passing tests, and near 100% code coverage.

Как обычно, без какой-либо обратной связи они обменялись любезностями и завершили интервью.

Результат:

Прошло две недели, прежде чем я получил самое страшное электронное письмо, которое гласило:

Мы решили не продвигать вашу заявку.

По мере того, как я читал подробные отзывы, мой гнев накапливался:

The thing that left us scratching our heads was around ownership of solutions and proactivity to get things done and drive delivery. This was based on some answers to more open-ended questions which were somewhat theoretical and high level, rather than expressing a structured view based on your own experiences.

Как, черт возьми, я мог знать, что они спрашивают о получении права собственности? Кроме того, все, что я описал, было моим собственным опытом. Я привел наглядные примеры. Что, черт возьми, происходит?

Затем меня осенило: это был «структурированный вид» (его отсутствие), который выбросил меня из окна. Это был ответ, который я дал по поводу «борьбы с парнем, который не предоставляет информацию».

Там я болтал слишком долго, и они молча наслаждались моим падением, не подавая никаких сигналов.

Единственный способ, которым я мог структурировать это, состоял в том, чтобы:

  • Классифицируйте информацию, которая была скрыта от проблемного парня.
  • Добровольно похвалите его усилия по обмену информацией, например. создать систему обмена знаниями
  • При необходимости эскалируйте.

Но если бы у меня было время привести структуру, говорил бы я правду? Разве такая структура не требовала знания вопросов заранее и оптимизации ваших ответов?

Ваши отрепетированные поведенческие ответы не совпадают с вашим реальным поведением чаще, чем ваш отрепетированный код с вашими реальными результатами.

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

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

Я ответил на письмо рекрутера, сославшись на то, что не получаю никаких сигналов. Я также описал все вещи, которые я сделал за свою 20-летнюю карьеру, о которых я не мог рассказать во время короткого интервью:

  • Разнообразие развертываний (CI, Jenkins), потоков разработки (PR, MR, Git, SVN, ветвление) и управления проектами (Agile, JIRA).
  • Разнообразие культур и команд, с которыми я работал

Рекрутер поблагодарил меня за дополнительную информацию, но заявил о своей неспособности сделать что-либо дальше момента принятия решения. Он призвал меня снова подать заявку через 6 месяцев, по сути, подтолкнув меня снова пройти все 3 изнурительных раунда, чтобы встретиться с теми же интервьюерами, которые знали, что у меня недостаточно денег, чтобы стать парнем из продуктовой компании (несмотря на то, что я работал с Fortune 500). продуктовая компания раньше. Все это было в резюме, которое они отказались смотреть).

Я был отвергнут.

К моему крайнему отчаянию, все это было кончено:

  • Двухмесячный процесс, включающий 3 раунда с перерывами на 2–3 недели.
  • Чтение концептов (+просмотр видео), которые я уже реализовал в живых проектах
  • Мечта получить работу за 314 тысяч долларов.

Заключение:

Интервью с старшими разработчиками печально известны неприятными сюрпризами.

Однако среди многих из них этот был самым горьким опытом, который у меня был.

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

Это было потому, что моя подготовка имела самое непосредственное отношение к работе. Я знал их компоненты репозитория с открытым исходным кодом наизусть, и они тоже это знали! Тем не менее, у них были серьезные вопросы о моей активности и собственнических качествах.

Помимо этого, я специально переключил свое внимание на поведенческую сторону отлично выглядеть. Я изучил множество имитационных сессий вопросов и ответов на Youtube и других источниках. Мне постепенно стало лучше.

Я также успешно получил предложение о работе от крупной компании, которое не соответствовало этому пакету, но было намного лучше по сравнению с моими прошлыми неудачными попытками пройти собеседование.

Меня до сих пор мучает один вопрос:

Если поведенческие ответы можно высмеивать, кого они на самом деле нанимают?