164372951__782705b

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

Одной из наиболее сложных тем для инженеров является проектирование систем (system design). В очередном материале интервьюеры Palantir дали три совета по прохождению таких интервью, а мы подготовили его адаптированный перевод.

Важен процесс, а не решение

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

Другими словами на данном этапе крайне важна коммуникация.

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

В Palantir интервьюеры обычно просят соискателя спроектировать систему, которая выполняет определенное задание. Все кажется не таким уж и сложным, но это впечатление обманчиво — предлагаемые к решению проблемы могут быть крайне широкими и иметь не одно возможное решение. Цель подобных задач — понять, как далеко может продвинуться соискатель за отведенное время (обычно не более 45 минут).

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

Каким темам уделить внимание при подготовке

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

  • Параллелизм в программировании (понимание потоков, блокировок, умение «запараллелить» алгоритмы, понимание последовательности);
  • Сети (знание особенностей сетевых протоколов IPC и TCP / IP, разницы между пропускной способностью сети и ее задержкой);
  • Абстракции (понимание того, как работает операционная система, файловая система и Базы данных. Понимание различных уровней кеширования в современных ОС);
  • Реальная производительность (оценка скорости выполнения поставленной задачи на компьютере, производительности жесткого диска, SSD, оперативной памяти или сети);
  • Предварительный расчет (умение оперативно производить небольшие расчеты на бумаге поможет сузить круг возможных решений и набросать прототипы до написания кода);
  • Отказоустойчивость (видит ли кандидат возможные недочеты в функционировании системы, понимает ли он, как она поведет себя в случае проблем с сетью).

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

Наиболее эффективные методы подготовки

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

  • Постоянное решение рабочих задач. Полезно попросить знакомого разработчика поделиться несколькими рабочими кейсами или вспомнить пару стандартных проблем проектирования, чтобы потренироваться в поиске лучшего решения возможных проблем.
  • Работа над реальной системой. Успеха можно добиться и воспринимая тренировочные задания как нечто более важное, чем часть академического опыта. Важно анализировать архитектуру каждой системы, над которой предстоит работать, и изучать чужие «реальные» проекты.
  • Проверка найденных решений. Если записать на бумаге все приблизительные  расчеты, произведенные во время работы, а потом проверить их с помощью небольших тестов, можно отследить типичные ошибки в ходе своих рассуждений.
  • Изучение эксплуатационных характеристик систем с открытым исходным кодом. Наблюдение за реализацией чужого кода поможет понять, как эффективней хранить и уплотнять данные.  Специалисты Palantir рекомендуют обратить свое внимание на хорошо документированную и чисто прописанную LevelDB.
  • Анализ принципов работы баз данных и операционных систем. Это не только «рабочий» инструмент, но и источник нестандартных профессиональных решений для наблюдательного разработчика. Понимание функционирования баз данных и ОС существенно упростит работу инженера, ведь те же самые принципы функционирования могут стать основой для многих других сложных систем.

Во время интервью: спокойствие и креативность

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

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

Другие интересные статьи в блоге GMS: