Как проходит телефонное собеседование в Google: рассказ из первых рук от кандидата на должность технического директора

Рассказывает Пьер Готьер, разработчик G-WAN.


Не так давно я проходил собеседование по телефону. Было это весьма неожиданно, и тест я завалил. Перечислю все вопросы, которые мне задавали — вдруг и вам в один прекрасный день позвонит Google?

Сначала небольшое отступление обо мне: я программирую 37 лет (начиная с 11-летнего возраста), в 24 года был назначен R&D директором и участвовал в создании самых ответственных частей следующих проектов:

  • Global-Wan (распределенный VPN, работающий на уровне ядра и использующий наше собственное пост-квантовое шифрование);
  • G-Wan (весящий 200 КБ сервер приложений, поддерживающий 17 языков программирования — C/C++, C#, Objective-C, Java, Go, PHP и другие);
  • Remote-Anything (патентованное решение для управления сетью предприятия, было продано 280 миллионов копий).

Представитель Google заявил, что от претендента требуются навыки и кодинга, и управления (редкое сочетание). Но опыта в 40 и 20 лет соответственно оказалось недостаточно — ведь я не сумел дать «правильные ответы». Может, Google слишком задирает планку? Или их HR не обладают навыками, необходимыми для грамотной оценки способностей претендентов? Сейчас увидите сами.

Собеседование

В основном технические вопросы с ответами — еще до того, как тест прервался, было очевидно, что я не очень устраиваю рекрутера.

Какая функция в С противоположна функции malloc()?

Мой ответ:
free().
Рекрутер:
Верно.


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


Какая функция в Unix позволяет сокету принимать соединения?

Мой ответ:
listen().
Рекрутер:
Верно.


Теперь я уже могу считаться гуру сетей, да?


Как много байт требуется для хранения MAC-адреса?

Мой ответ:
6.
Рекрутер:
Верно.


У меня уже есть медаль в номинации «Ethernet»?


Отсортируйте по требуемому времени: чтение регистра CPU, обращение к диску, переключение контекста, чтение системной памяти.

Мой ответ:
Чтение регистра CPU, чтение системной памяти, переключение контекста, обращение к диску.
Рекрутер:
Верно.


Типичная университетская лекция по Computer Science за 1 курс.


Что такое индексный дескриптор в Linux?

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


«Метаданные» — это ведь куда информативнее, чем «атрибуты», правда?


Какая функция в Linux принимает путь и возвращает файловый идентификатор?

Мой ответ:
Я написал свой LIBC для нашего сервера приложений, но не помню ни одного системного вызова, который бы возвращал файловый идентификатор.
Рекрутер:
stat().
Я:
stat(), fstat(), lstat(), fstatat() — все они возвращают код ошибки, но не файловый идентификатор. Эти функции заполняют статическую структуру, содержащую обсужденные ранее атрибуты файла, а не только файловый индентификатор.
Рекрутер:
Это не ответ. Файловый идентификатор содержит все метаданные.


В Google что, тайно лицензировали мерзкого бота Tay от Microsoft?


Какое имя имеет сигнал KILL?

Мой ответ:
SIGKILL, значение его #define9.
Рекрутер:
Нет, это TERMINATE.
Я: SIGTERM (15) и KILL (9) — это разные понятия.
Рекрутер:
У меня в бумагах записан не такой ответ.


Вот что бывает, когда боты с искусственным интеллектом открывают для себя мир рекреационных наркотиков.


Почему быстрая сортировка — лучший метод сортировки?

Мой ответ:
Это не всегда так, иногда он вообще не подходит.
Рекрутер:
У быстрой сортировки лучшее время исполнения (временная сложность, или коэффициент O).
Я:
Временная сложность игнорирует латентность хранения данных, топологию, объем доступной памяти и даже вычислительные затраты процессора на каждую команду — она просто подсчитывает число алгоритмических операций! Этот коэффициент — полезный показатель при разработке алгоритма, но все равно эффективность и масштабируемость решения сильно зависит от конкретных ограничений конкретной проблемы и окружающей среды.
Рекрутер:
Неверно, нужно было просто сказать, какой коэффициент O у быстрой сортировки.


Когда медицинская страховка начнет покрывать ущерб, причиненный психическому здоровью? Ядро Linux (к которому так трепетно относится Google) предпочло пирамидальную сортировку быстрой ради меньшнего потребления памяти и меньшего времени на выполнение.


Дан массив из 10000 16-битных значений, каков наиболее эффективный способ подсчитать биты?

Мой ответ:
Сдвинуть биты вправо по 64-битным словам — все по заветам Кернигана.
Рекрутер:
Нет.
Я:
Есть и более быстрые способы обработки 64-битных слов с применением масок, но по телефону я объяснить их не смогу, нужно писать код.
Рекрутер:
Верный ответ — использовать таблицу соответствий и просуммировать результаты.
Я:
Это на каком виде CPU? А давайте проведем бенчмарки вашего и моего кода?
Рекрутер:
Это не входит в задачи теста.
Я:
А что в них входит?
Рекрутер:
Проверить, насколько хорошо вы знаете правильные ответы.


Долго еще будет продолжаться этот бред? Поиск по 8-битной таблице соответствий будет обрабатывать байты один за другим, а вот метод 64-битных масок будет обрабатывать 8-байтовые слова одновременно (а современные процессоры даже смогут обрабатывать 128-битные слова с десятикратным приростом скорости). Поиск по 64-битной таблице соответствий пока что находится за гранью способностей современных компьютеров — так что сразу понятно, что будет быстрее.


Какой тип пакетов требуется для установления TCP-соединения?

Я:
В шестнадцатиричном виде — 0x02, 0x12, 0x10, а словами — «синхронизация» («synchronize») и «подтверждение» («acknowledge»).
Рекрутер:
Неверно, это SYN, SYN-ACK и ACK. Если Google вдруг упадет, вам потребуется это знание, чтобы понять, в чем проблема. На этом мы можем закончить — очевидно, что вы не обладаете достаточными умениями, чтобы писать и поддерживать приложения для работы с сетями. Если вы хотите позже пройти собеседование еще раз — вам стоит почитать о функциях Linux, о принципах работы TCP/IP и о том, что означает коэффициент О. Всего хорошего, до свидания.


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


Я набрал целых 4 балла из 10, это мой лучший результат у Google, вуху!

Источник: блог Gwan