«Диагноз — не конец, а начало дела».
Мартин Х. Фишер.
Недавно я проходил телефонное собеседование с кадровиком из Google. Поскольку я соответствовал критериям на такое (добровольное) собеседование, но не смог пройти тест, в этом посте перечислены вопросы и предполагаемые ответы на них. Этот пост может оказаться полезным тем, кому в один прекрасный день позвонят из Гугла.
Для ясности: я начал заниматься программированием 37 лет назад (мне тогда было 11 лет) и постоянно занимаюсь этим. Кроме того, 24 года назад (мне было 24) я был назначен директором по исследованиям и развитию; с тех пор среди многих других работ мною были проведены НИОКР по наиболее ответственным частям проектов TWD — все они поставляются, как коммерческие продукты:
- Глобальная WAN-сеть (распределённая C/VHDL L2 VPN, базирующаяся на кастомном kernel-bypass IP-стэке и нашем собственном методе постквантового шифрования)
- G-WAN (200-килобайтный сервер прикладных программ с 17 заложенными языками программирования C/C++, C#, Objective-C, Java, Go, PHP и т.д.)
- Remote-Anything (запатентованное решение управления сетью предприятия, 280 млн. лицензий, используемых в 138 странах)
Представитель Гугла подчеркнул, что требуется как опыт управления, так и современного программирования (редкое сочетание). Но наличие более 20 лет опыта в первом и почти 40 лет во втором оказалось недостаточным: я не смог дать «правильные ответы». Означает ли это, что Гугл слишком высоко поднимает планку или что у его кадровиков самих не хватает знаний, которые они, как предполагается, должны оценивать?
Давайте посмотрим!
Вопросы-ответы по тесту Google на позицию «Технического директора»
Здесь вопросы, требующие «высокой технической квалификации», и мои ответы на них — до тех пор, пока тест не был прерван, поскольку стало очевидно, что я не соответствую задаче:
1. Какая функция является противоположной для malloc() в C?
Я: free().
Кадровик: правильно.
Примечание: представляю себе, что в эти редкие моменты вы, можно предположить, ощутите гордость за ваши 35 лет программирования на языке С, которому больше 40 лет.
2. Какая функция Unix позволяет сокету получить соединения?
Я: listen().
Кадровик: правильно.
Примечание: это действительно квалифицирует меня как специалиста по сетям?
3. Сколько байтов требуется для сохранения MAC-адреса?
Я: шесть.
Кадровик: правильно.
Примечание: полагаю, что только что получил бейджик [Ethernet] …
4. Расположите по затратам времени: чтение регистра ЦП, поиск на диске, переключение контекста, чтение системной памяти.
Я: чтение регистра ЦП, чтение системной памяти, переключение контекста, поиск на диске.
Кадровик: правильно.
Примечание: обычные лекции по вычислительной технике на первом курсе университета.
5. Что такое индексный дескриптор Linux?
Я: уникальный идентификатор файла для любой данной файловой системы.
Кадровик: неправильно, это — метаданные файла.
Я: индексный дескриптор является индексом, однозначно идентифицирующим файл в данной файловой системе, и можно просмотреть этот индекс для извлечения атрибутов файла, таких как, например, размер, время, владелец и разрешения; вы можете даже добавить свои собственные атрибуты в такие файловые системы.
Кадровик: неправильно, не «атрибуты», это — «метаданные».
Примечание: «метаданные» — более информативный термин, чем «атрибуты файла»?
6. Какая функция Linux берёт путь и возвращает индексный дескриптор?
Я: я писал пользовательскую LIBC для G-WAN, нашего сервера приложений, но не помню какую-либо syscall, возвращающую индексный дескриптор.
Кадровик: stat().
Я: stat(), fstat(), lstat() и fstatat() — все они возвращают код ошибки, а не индексный дескриптор; они заполняют stat-структуру, содержащую атрибуты файла, названные выше, а не только индексный дескриптор файла.
Кадровик: ответ ненадлежащий: индексный дескриптор содержит все метаданные.
Примечание: может ли быть, что Гугл втайне получил лицензию на пресловутый чат-бот Tay AI от Майкрософт?
7. Как называется сигнал KILL?
Я: SIGKILL, у которого #define установлено на 9.
Кадровик: нет, это — «TERMINATE».
Я: SIGTERM (15) отличается от сигнала KILL (9).
Кадровик: ваш ответ не соответствует тому, что имеется в моём документе.
Примечание: предполагаю, наблюдаемое — то, что происходит, когда чат-боты обнаруживают существование лёгких наркотиков.
8. Почему Quicksort является наилучшим методом сортировки?
Я: это не всегда так, он даже не всегда подходит.
Кадровик: Quicksort имеет наилучшую оценку «big-O».
Я: «big-O» игнорирует задержки хранения данных, топологию, объём, доступную память и даже вычислительную сложность каждой команды ЦП, вовлекаемой в данную процедуру, — вместо этого он просто подсчитывает количество алгоритмических операций! Оценка «big-O» может быть полезным показателем при разработке алгоритмов, но наилучшее решение реализации и масштабирования зависит от конкретных ограничений каждой конкретной проблемы и окружения.
Кадровик: неправильно, вы должны были указать мне причину высокой оценки «big-O» у Quicksort.
Примечание: Для ядра Linux (на которое полагается Гугл) был выбран Heapsort, а не Quicksort… за меньший используемый объём памяти и более предсказуемое время выполнения.
9. Имеется массив из 10 000 16-битных значений; как наиболее эффективно сосчитать биты?
Я: необходимо сдвинуть биты прямо на всех 64-битных словах, используя метод Кернигана.
Кадровик: нет.
Я: имеются более быстрые способы, обрабатывающие 64-битные слова с масками, но я не могу объяснить это по телефону — нужно писать код.
Кадровик: правильный ответ — использовать таблицу перекодировки и затем просуммировать результаты.
Я: на ЦП какого типа? Почему бы не дать мне сравнить результаты работы моей программы и вашей?
Кадровик: это не входит в задачу данного теста.
Я: а что входит в задачу данного теста?
Кадровик: мне необходимо выяснить, знаете ли вы правильные ответы.
Примечание: сколько же может продолжаться это безумие? 8-битная таблица перекодировки может обрабатывать байты последовательно друг за другом, тогда как метод на базе 64-битной маски обрабатывает 8-байтные слова одновременно (более того, современные команды ЦП позволяют работать даже со 128-битными словами, получая 10-кратный выигрыш в скорости, если не рассматривать переносимость). Поскольку 64-битная таблица перекодировки недоступна современным компьютерам, то нет никаких сомнений в том, что работает быстрее.
10. Какой тип у пакетов, которыми обмениваются для установления соединения по протоколу TCP?
Я: в шестнадцатеричной системе: 0x02, 0x12, 0x10 – буквально «синхронизировать» и «подтвердить».
Кадровик: неправильно, это — SYN, SYN-ACK и ACK; если в Google появляется какая-то проблема, то вы должны знать это, чтобы диагностировать её. Мы прекращаем тестирование, поскольку очевидно, что у вас нет требуемых знаний для написания или анализа сетевых приложений. Вам необходимо изучить вызовы функций Linux, как работает стек TCP/IP и что такое оценка «big-O», чтобы, возможно, удовлетворить нашим требованиям, если вы будете проходить такое собеседование позже. Удачи вам, до свидания!
Примечание: если вы должны читать шестнадцатеричные дампы пакетов, чтобы найти причину сбоя, то 3-буквенные мнемонические коды не помогут найти её в умершем сетевом сервисе. Возможно, Google должен был заявить, что практические знания не требуются для этой работы.
С другой стороны, я набрал четыре балла из десяти, что даже выше моего наилучшего Гугл-ранга веб-страницы на сегодня!
(*) Как Гугл, так и TWD были основаны в 1998 году.
(**) Гугл-ранг веб-страницы: сверхсекретная математическая формула, показывающая, что ранг спонсируемых результатов поиска выше того, который есть в действительности.
Совет: найм людей, которые знают то, чего вы не знаете, помогает больше, чем найм людей, которые знают просто то, что знают все.
Обновление: 13 октября 2016 года ночью (почти через 7 месяцев после опубликования данного поста) мы получили сообщения, что сервер, обеспечивающий сайт gwan.ch, работал несколько часов со сбоями, и одновременно получили много писем, относившихся к дискуссии на сайте «Hacker News», в которой люди, претендовавшие на работу в Гугл, отрицали, что перечисленные выше вопросы были действительно использованы специалистами по подбору персонала в Гугле, в то время как другие утверждали, что они прошли такое же собеседование с точно такими же вопросами.
У меня не было времени читать всю дискуссию, но некоторые письма были явно не опубликованы, что помогало другим продвинуться. Прежде всего, хотел бы сказать, что моим критерием уместности в дискуссии является добрая воля. Хочу поздравить тех, кто преуспел в этом, действуя в сложных условиях.
Я не добивался у Гугла проведения этого собеседования. Однако после эпизода с «Hacker News» я получил очень интересные предложения работы, а также резюме от специалистов, желающих работать с нами в проекте TWD, что показывает понимание многими (если не большинством) того, в каком на самом деле мире мы живём. Большое спасибо всем за комментарии, за добрую поддержку, позволяющие мне надеяться на следующее поколение инженеров.
Я действительно хотел бы, чтобы у меня была возможность обучать (и принимать на работу) всех желающих учиться. Если я не найду ничего лучше, то как-нибудь напишу книгу, чтобы помочь другим творить добро лучше, чем это делал я, — и обещаю опубликовать совершенно новую информацию (открытый исходный код, материалы Academia и т.д.).
Всего наилучшего (в т.ч. Гуглу).
Обновление: журнал «Business Insider» опубликовал эту историю (25 000 прочтений на настоящий момент).
Обновление: LinkedIn отцензурировал эту историю (опубликованную тремя разными людьми), и все поддерживающие комментарии были написаны техническими специалистами (я не знаю большинства из них).
Обновление: пост в блоге сотрудника Google, успешно размещённый на LinkedIn и использующий несвязный «мусорный» лексикон (очевидно, нацеленный на ассоциации оскорбительных слов с моим именем в поисковых системах), был написан кем-то, кто выглядит как подставное лицо (оранжевым подчёркнут текст, работающий на Гугл, красным — бессвязные злобные выражения):
Профиль в LinkedIn для Марсии Пинейро показывает, что она работает в… Гугл. Если это — реальный человек (она же имеет 3 аккаунта [1] [2] [3]), то мне грустно за неё — ей приходится поливать грязью людей, чтобы зарабатывать себе на жизнь. Если Гугл действительно нанял её (или «его», спрятанного за фальшивой личностью), то это великолепный способ оставить за собой последнее слово. Гугл придерживается проповедуемого им принципа «Не делай зла»?
Обновление: LinkedIn, в конце концов, разместил мой пост, хотя и без комментариев читателей и с задержкой в 12 часов. Три других поста, написанных техническими специалистами, которые послали мне подтверждение просмотра, оказались не столь удачливыми.
Обновление: журнал «Business Insider» опубликовал (очень хорошую) статью, рассматривающую впечатляющие провалы Гугл с наймом персонала и содержащую интересное понимание проблем опытными техническими специалистами. Очень рекомендую прочитать (даже сотрудникам Гугл).
Автор: LukinB