Миссия Coinbase — повысить экономическую свободу в мире. Чтобы выполнить эту миссию, нам нужно создать высокопроизводительную команду. Наш главный приоритет — привлечение и удержание талантливых людей. и мы принимаем исключительные меры, чтобы на каждом месте были исключительные люди. Этот пост предназначен для того, чтобы дать кандидатам возможность предварительно узнать, что мы ищем в процессе технического собеседования.
В этом посте мы сосредоточимся на том, что мы ищем в кандидате в инженеры. Некоторые из этих советов применимы и к другим должностям, но они наиболее полезны, если вы хотите присоединиться к нам в качестве инженера.
Присоединяясь к процессу собеседования, вы пройдете через ряд этапов. На каждом этапе мы будем оценивать вас по-разному, чтобы убедиться, что роль, на которую вы собираетесь пройти собеседование, подходит вам обоим. Хотя упражнения и вопросы, с которыми вы сталкиваетесь, могут быть разными, мы всегда следим за культурными принципами Coinbase:
- Четкое общение
- Эффективное выполнение
- Действуйте как владелец
- Лучшие таланты
- Команда чемпионов
- Ориентация на клиента
- Повторяющиеся инновации
- Позитивная энергия
- Непрерывное обучение
Узнайте больше об этих принципах здесь. Возможно, у вас не будет возможности продемонстрировать все эти качества на каждом этапе собеседования, но это даст вам хорошее представление о том, что мы ищем. Когда мы оцениваем вашу работу, мы делаем это почти исключительно через призму этих принципов.
Этапы собеседования (обычно, но не всегда):
- начальный разговор с кто-то из отдела кадров о роли
- одно 60-минутное парное программирование.
- одно или два 60-минутных собеседования с менеджером по проектированию.
- одно или два 60- или 90-минутное парное программирование собеседования
- одно или два 60-минутных собеседования по проектированию системы
Чтобы получить предложение, вам нужно хорошо работать на всех этапах, поэтому важно готовиться к каждому этапу собеседования . Тем не менее, большинство людей, которым не удалось пройти цикл собеседований на Coinbase, терпят неудачу на этапах парного программирования. Начнем с этого.
Парное программирование
На собеседовании (ах) по парному программированию вы обсудите проблему с одним из наших инженеров. Для начала ваш интервьюер кратко расскажет о проблеме. Теперь вам нужно написать код решения проблемы.
Для того, чтобы пройти этот этап, недостаточно решить проблему. Мы не ищем минимального оптимального решения в стиле Leetcode. Мы ищем доказательства того, что вы можете создавать код производственного уровня. В результате мы оцениваем как конечный результат, так и то, как вы его достигли, отдавая должное обоим компонентам. Если вы застряли на ошибке, как ее преодолеть? Вы хорошо знаете свой инструмент? Вы используете отладчик с точкой останова или меняете случайные строки кода, пока он не заработает? Есть ли способ подойти к проблеме кодирования?
Мы будем смотреть не только на полноту и правильность вашего решения. Мы также оценим качество и ремонтопригодность вашего кода. Ваш код идиоматичен для выбранного вами языка? Легко ли читать и понимать? А как насчет именования переменных? Используете ли вы инструменты, доступные в вашей IDE и терминале? Как мы можем быть уверены в правильности вашего кода? Вы это проверили?
Насколько хорошо вы понимаете проблему? Вы задаете соответствующие уточняющие вопросы? Насколько хорошо вы принимаете отзывы интервьюера?
Не расстраивайтесь, если вы не дойдете до самого конца проблемы. Мы разрабатываем задачи на собеседование так, чтобы заполнить больше, чем отведенное время. Интервьюер остановит интервью либо по прошествии 90 минут, либо когда он будет уверен в своей оценке. Преждевременное завершение собеседования — не всегда плохой знак.
Большинство кандидатов, которые не проходят собеседование, делают это из-за того, что их код или процесс недостаточно хорош. Обычно мы не подводим вас из-за неполного решения.
Давайте посмотрим на практический пример. Предположим, проблема заключается в следующем:
Дан список, содержащий все целые числа от 1 до n — 1. Список не отсортирован. Одно целое число встречается в этом списке дважды. Напишите функцию, которая определяет, какая именно.
Вот первый пример решения (есть ошибки!):
def duplicates (integer):
& quot; & quot; & quot; duplicates принимает список целых чисел и возвращает первое повторяющееся значение или None, если все значения уникальны & quot; & quot; & quot;
, если не isinstance (целые числа, список):
поднять ArgumentError («ожидаемый список как входной»)
sorted_integers = integers.sort ()
previous_value = nil
для x в sorted_integers:
if x == previous_value:
return x
previous_value = x
return None
def test_duplicates ( ):
assert duplicates ([]) == None, "пустой массив считается уникальным"
assert duplicates ([1, 2]) == None, & quot; array уникальных значений возвращает None & quot;
assert duplicates ([1, 2, 2]) == 2, & quot; duplicate возвращает повторяющееся целое число & quot;
assert duplicates ([1, 2 , 2, 1]) == 2, & quot; несколько дубликатов ates возвращает первый дубликат & quot;
И второе решение (здесь тоже есть ошибки!):
def dupilcateIntegers (l):
n = len (l)
return sum (l) - ((len (l) +1) * len (l)) / 2
Первое решение фактически не решает проблему . Но автор, похоже, подумал об обработке ошибок и проверке ввода. Кандидат подумал о проблеме и ее крайних случаях. Кроме того, решение пытается решить более крупный и общий класс той же проблемы. Они добавили короткую строку документации, а код, как правило, хорошо отформатирован и идиоматичен на Python. Мы были бы склонны считать первое решение удачным. В реализации есть ошибка, и алгоритм не оптимален, но код удобен в обслуживании и в целом хорошо структурирован (с тестами!). Это хорошее решение.
Второе решение правильное и оптимальное, но этот кандидат не пройдет собеседование. Неаккуратное форматирование, орфографические ошибки и неиспользуемые переменные. Сам код краток и труден для понимания. Этот кандидат, вероятно, будет отклонен.
Наконец, имейте в виду, что у вас есть только 90 минут, чтобы решить задачу. В наших проблемах нет никаких уловок, и обычно достаточно наивного решения. Мы не просим вас инвертировать двоичное дерево, но мы попросим вас решить упрощенную версию реальной жизненной проблемы. Мы ищем производственный код, а не хакерские решения.
Так как бы вы лучше всего подготовились к собеседованию с нами по парному программированию? Не зацикливайтесь на шлифовке Leetcode. Лучше сосредоточиться на основах. Изучите свой редактор, отладчик и свой язык. Практикуйтесь в написании хорошо отформатированного и структурированного кода с соответствующими именами методов и переменных, хорошим управлением состоянием и обработкой ошибок.
Дизайн системы
На нашем собеседовании по проектированию системы вас попросят разработать общая архитектура реального сервиса. Например: Как бы вы спроектировали ленту Twitter?
Краткое описание обычно короткое, и вы можете попросить интервьюера дать разъяснения относительно требований.
Не погружайтесь слишком глубоко в какой-либо конкретный аспект дизайна (если интервьюер не об этом попросит). Лучше сохранить общий характер и привести конкретный пример хорошо известной вам технологии, которая подойдет для конкретного случая использования. Пример: «Для этой услуги база данных RDBM была бы хорошим выбором, потому что мы не знаем заранее, как будут выглядеть запросы. Я бы выбрал MariaDB ».
Обязательно рассмотрите всю проблему, и если вы не уверены, все ли вы охватили, попросите интервьюера уточнить, или есть что-то, что они хотели бы, чтобы вы расширили на.
Если вы не уверены в специфике конкретного компонента в вашем дизайне, лучше попытаться сообщить интервьюеру и рассказать ему, как вы будете искать ответ. Не критикуйте: ошибаться в уверенности — это негативный сигнал, а смирение — положительный. Хорошим ответом может быть: «Я не знаю, подходят ли шаблон запроса и другие требования к базе данных SQL здесь, но у меня больше всего опыта работы с MariaDB, поэтому я выберу этот вариант по умолчанию. Однако, прежде чем принять решение, мне нужно было бы изучить, как его производительность может выглядеть в этом конкретном случае. Я бы также исследовал некоторые альтернативы NoSQL, такие как MongoDB, и, возможно, также хранилище шириной в столбцы, такое как Cassandra ».
Вы будете оценены по вашей способности исследовать требования и насколько хорошо ваш дизайн может работать в реальном жизнь. Вы учитываете масштабируемость? Как насчет обработки ошибок и восстановления? Вы планируете перемены? Вы думали о наблюдаемости? Вы также получите оценку того, насколько хорошо вы доносите до интервьюера свой план и мысли.
Общие советы
В процессе собеседования мы ищем сигналы, которые помогают нам понять, есть ли это соответствие навыкам, но, что более важно, культурное соответствие. Некоторые из сигналов, которые мы ищем:
Спасибо, что нашли время, чтобы узнать немного больше о нашем процессе собеседования. Если вы заинтересованы в построении будущего финансов, ознакомьтесь с нашими открытыми ролями здесь. Удачи!
Как интервью Coinbase для инженеров было изначально опубликовано в блоге Coinbase на Medium, где люди продолжают разговор, выделяя эту историю и отвечая на нее.




