История о том, я как проходил череду собеседований, но не взяли.

Несколько месяцев назад я подался в американскую фирму. Делают продукт на Кложе, компетенция в разработке есть. Начали не вчера, пилят уже девять лет. Не “молодая, динамично развивающая” компания, а нормальная.

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

Компания из Калифорнии и косит под FAANG. Обычный собес — не их метод. Сперва хотел отказаться, но подумал — что я теряю? Я ни разу не собеседовался в FAANG, только разговаривал с рекрутерами. Почему бы не попробовать новый формат? Согласился, назначили звонки.

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

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

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

Это ломает весь алгоритм, и получается задача “два в одном”. Я затупил и стал думать, что проще: воткнуть костыль или писать другой алгоритм на перебор или с общими множителями. Пока я думал, собеседник сказал, что ему пора на другой звонок, а я могу выслать решение позже. И отключился.

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

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

Итак, первый часовой звонок, собеседник из Венгрии. Приветствие, интродакшен. Задача: написать суперсет множества. Это когда для элементов {1, 2, 3} возвращаешь {1, 2 , 3}, {1, 2}, {2, 3}, {1, 3}, {1}, {2}, {3}, {}. Очевидно, это решается рекурсией и очередью, но первые пять минут я тупил, не понимая, что передавать между итерациями.

Потом меня осенило и я выдал решение на tree-seq. Не все знают про эту штуку, это встроенная фишка Кложи. Позволяет разложить любую структуру на последовательность. Собеседник сказал, что ни разу с ней не работал и удивлен решением. По реакции я понял, что он колеблется, но вроде бы склоняется в мою сторону.

Я импортировал модуль тестов и написал тесты на все случаи из задачи — они проходили.

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

Проходит полчаса, новый звонок. Собеседник из Штатов. Какие были ваши главные челенджи? Открываю драйвер для Постгреса, там каждая строчка — челендж. Чтение и парсинг байтов, стейт-машина для воркфлоу, проброс состояния в дальние концы кода. Он смотрит, кивает.

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

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

Третий часовой звонок, два собеседника из Европы. Как обычно, привествие, интродакшен и задача: написать интерпретатор Кложи. Это функция ev, которая может выполнять код, определять переменные, делать ветвление if/else, лексические переменные, функциии, замыкания на функциях, и многое другие. Pdf с описанием был на четыре страницы.

Кому-то это покажется сложным, но для меня это было самой простой задачей. Интерпретатор подробно рассмотрен в SICP, и та глава врезалась в самую подкорку. Я сделал вычисление форм, арифметику, сравнение, а также две особые формы: глобальные переменные и let. Единственное место, где я втупил, было разделение контекста. Ясно, что должен быть глобальный контекст, чтобы объявление переменной в одном ev действовало на второй. Кроме этого нужен локальный контекст для let, который пробрасывается как мапа. В процессе резолва оба контекса мерджатся.

Собеседники постоянно кивали на мои высказывания. Показывали большой палец. В конце обсудили потенциальные улучшения кода, что я написал. Разошлись довольные.

Я стал ждать финального босса, и вдруг приходит письмо от рекрутера. Иван, мы тут подумали и решили, что продолжать нет смысла. Очень коротко, буквально два предложения. Я вежливо поинтересовался подробностями, но понятно, что никто не ответил.

Ну и что это было? До сих пор не могу понять. Какой-то цирк. Не знаю, как справились другие, но вряд ли сильно лучше меня. Хоть я и тупил, но в итоге все задачи выполнил. Может, параллельно со мной собеседовались маньяки из Advent of Code? Почему тогда не сказать прямо: другой кандидат справился лучше и мы выбрали его?

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

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

Что можно вынести из этой истории? Собеседование — это по-прежнему лотерея. Я готовился к system design интервью, а был кодинг. Можно готовить графы, а попадутся деревья. Спросят про главный челендж — а ты забыл про удачный случай и говоришь про неудачный.

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

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

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

Все это в чужих головах, куда нет доступа. А потому — написал в бложик, отпустило, забылось. Едем дальше!