Всем привет! Меня зовут Антон Артиков, я бэкенд-разработчик в «Авито» и выпускник курса «Middle Python-разработчик». Программирую на Python и Go, читаю и перевожу со словарем PHP, а ещё веду личный блог в Телеграме.
Если раньше я только ходил по собеседованиям, то сейчас активно провожу интервью в своей компании. В этой статье расскажу, из каких секций состоит процесс найма, как подготовиться и важны ли софтскилы.
Хочу сразу оговорить, что делюсь своим личным опытом. На работе я провожу только часть секций, поэтому не могу рассказать всё-всё-всё по теме, но всё равно надеюсь, что статья будет полезна.
В рамках статьи я буду говорить конкретно о собеседованиях в Big Tech. Сначала поясню, что я под этим имею в виду.
Я бы разделил нанимающие компании на две условные категории:
Big Tech. Это могут быть финтех-компании, маркетплейсы, телеком, крупные государственные организации и подобные.
Все остальные.
У Big Tech обычно есть устоявшаяся методика проведения интервью. Сейчас процесс найма делится на несколько секций:
Общение с HR;
Технический скрининг;
Алгоритмическая секция;
Платформенная секция (так она называется в «Авито»);
Системный дизайн;
Собеседование с нанимающей командой.
Пайплайны могут немного отличаться, но общий принцип примерно такой. Также процесс может зависеть от команды, которая ищет себе новых сотрудников (могут появиться какие-то специфичные секции).
В других компаниях собеседования могут быть абсолютно любого формата. Единственное, что точно есть, — это созвон с HR. Дальше может быть как несколько секций, так и одно большое техническое интервью, где нанимающая команда будет сама спрашивать весь пласт вопросов, которые её интересуют.
Секции интервью
Общение с HR. На этом этапе проверяется общая адекватность кандидата. Его спрашивают про опыт, стремления, ожидания от нового рабочего места. Например, почему он решил сменить место работы и какими проектами хотел бы заниматься.
Технический скрининг. Это серия коротких вопросов по предметной области (базы данных, сеть, конкретный язык программирования), на которые можно дать однозначные ответы. Скрининг может быть совмещён со звонком от HR-специалиста.
Алгоритмическая секция. Обычно это whiteboarding, написание кода «на доске», например, в Yandex Code. В зависимости от компании могут быть различные задачи на знания алгоритмов, чаще всего уровень сложности easy или medium на LeetCode, но и hard встречается.
Платформа. Тут уже будут вопросы, непосредственно связанные с языком программирования, и решение реальных задачек в live-формате на той же самой whiteboard.
Системный дизайн. Эта секция целиком и полностью посвящена проектированию. Кандидата могут спрашивать о различных технологиях, архитектурных подходах, шардировании, реплицировании, graceful degradation и так далее. Готовьтесь рисовать схемы и много говорить.
Общение с нанимающей командой. В разных компаниях по-разному: где-то это просто неформальное общение об опыте работы, где-то — очередная техническая секция, где может быть всё что угодно. От лайвкодинга до сложных теоретических вопросов, специфичных для нанимающего коллектива.
Дальше я расскажу более подробно о секциях, которые в большей мере связаны с хардскилами разработчика: алгоритмическая, платформенная и секция системного дизайна. Про софтскилы читайте сразу после них.
Алгоритмы
Эта секция помогает понять, что кандидат умеет рассуждать, видеть краевые случаи, грамотно излагать свои мысли не только через код, но и словами. Сразу становится видно, умеет ли человек оперировать теми структурами данных, которые ему предоставляет язык, может ли он на их основе создать что-то большее.
Нейминг переменных, организация кода, наработка паттернов мышления — всё это важные параметры, которые помогает оценить алгоритмическая секция. Согласитесь, общаясь с коллегой, вы ожидаете, что он сможет чётко и уверенно излагать свою позицию. Это разом закрывает кучу проблем.
Для подготовки нет ничего лучше, чем практика. Вот небольшой список ресурсов, который поможет оттачивать навыки:
Blind 75 LeetCode Questions — 75 задачек, которые помогут потрогать почти все самые важные алгоритмы;
Алгоритмы: теория и практика. Методы — бесплатный курс, где отлично описана теоретическая часть с практическим применением;
Книга «Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих», Бхаргава Адитья;
Книга «Алгоритмы. С примерами на Python», Хайнеман Джордж.
Если хочется фундаментальных знаний (они нужны далеко не везде), то курсы и литература вам в помощь.
План действий для подготовки к собеседованиям:
Взять задачку, пробовать её решить в течение 20–30 минут.
Если не получается, посмотреть решение.
Попробовать осознать и повторить алгоритм, запомнить паттерн.
Взять подобную задачку, пробовать её решить…
Повторить 100 раз. Вы великолепны!
На самом собеседовании рекомендую следующую схему действий:
Внимательно прочитать условия задачи, можно и вслух,
Постараться выделить краевые условия, уточнить все моменты по входным данным.
Перед написанием кода озвучить вслух свой план действий. Зачастую уже на этом этапе можно понять, верный вектор выбран или нет.
Написать код.
Прежде чем сказать «готово», нужно прогнать код на каком-нибудь примере, желательно с краевыми условиями. Также вслух. Если всё хорошо, тогда уже говорить, что закончили с задачей.
Последний пункт помогает отследить ошибки, допущенные по невнимательности. Бывает всякое: например, кандидат говорил, что нужно идти с конца массива, перед решением, а в ходе реализации пошёл с начала. Или говорил, что нужно перевернуть итоговый результат, но забывал это сделать. Классно, если ошибки всё же заметите вы, а не интервьюер.
Платформа
Эта секция позволяет проверить глубину знаний конкретного языка программирования. Независимо от позиции, на которую ищут инженера, вопросы в этой секции одинаковы.
Интервьюер постепенно проводит кандидата от верхнего уровня к более глубокому — так становятся очевидны границы его компетенций. Кто-то отваливается почти сразу, кто-то доходит до конца, а кто-то демонстрирует уровень выше интервьюера — такое бывает, и это нормально.
Рассмотрим вопросы на примере декораторов в Python. Сверху вниз от простого к сложному:
Что такое декоратор?
Напишите свой декоратор для заданной функции.
Если хотим применять этот декоратор к любой функции, как быть с их параметрами?
Как применить декоратор к функции?
А без синтаксического сахара?
Что такое объект первого порядка? Являются ли функции в Python объектами первого порядка?
Когда может пригодиться применение декоратора без синтаксического сахара?
Давайте напишем параметризованный декоратор.
А без синтаксического сахара?
Что будет, если у декорированной функции вывести func.__doc__?
В модуле module.py реализована функция, которая задекорирована, и сам декоратор. В модуле main.py импортируется foo из module.py без вызова функции foo. Что будет выведено в консоль?
def amazing_decorator(n: int): print("1") def decorator(func): print("2") def wrapper(*args, **kwargs): print("3") return func(*args, **kwargs) return wrapper return decorator@amazing_decorator(10)def foo(*args, **kwargs): print("5")
Как сделать декоратор для асинхронной функции?
Как сделать сделать декоратор и для асинхронной, и для обычной функции одновременно?
Кандидаты разного уровня ответят на разное количества вопросов. Некоторые могут испытать сложности уже на 5-м вопросе. Некоторые доходят до 7-го, но не могут ответить на 8-й и 9-й вопросы, хотя верно ответили на 5-й. То есть люди просто заучивают общий вид того, как декораторы выглядят, но вообще не понимают, как они работают.
На собеседовании могут пройтись по всем темам: асинхронность, переменные, метаклассы, работа со строками, устройство структур данных, GC, GIL, и многим другим. Также могут спрашивать вещи, специфичные для компании. Например, если компания ищет кандидата, который хорошо пишет на FastAPI, готовьтесь к вопросам и по конкретному фреймворку.
Нельзя забывать и про базы данных. Тут тоже стоит отметить, что уровень погружения в эту тему для разных нанимающих команд отличается: кому-то достаточно, что вы работаете только с реляционными БД, знаете базовые join, умеете написать простой select, понимаете про индексы. Аббревиатура ACID не вводит вас в ступор.
Кто-то ждёт от вас умения читать explain, писать рекурсивные запросы, оконные функции, умения делать выбор между реляционными и нереляционными БД в той или иной ситуации. Знать разницу между шардированием и реплицированием.
Кажется, для подготовки лучше книг пока ничего не придумали:
«Python. К вершинам мастерства», Рамальо Лучано — одна из лучших книг для углублённого изучения Python;
«Asyncio и конкурентное программирование на Python», Фаулер Мэттью — закроет большинство ваших вопросов по асинхронности;
«Оптимизация запросов в PostgreSQL», Домбровская Г., Новиков Б., Бейликова А. — позволит погрузиться в оптимизацию запросов изнутри;
«PostgreSQL изнутри», Рогов Егор — если хотите лучше познакомиться с инструментом, с которым предстоит много работать, то тут можно найти ответы на многие вопросы;
«Apache Kafka. Потоковая обработка и анализ данных», Шапира Г., Палино Т. — ну тут название говорит само за себя :)
Книги можно отлично дополнить различными роликами на YouTube — cейчас очень много информации в открытом доступе. Главное — мотивация разобраться.
Системный дизайн
Сам я эту секцию не провожу, но в общих чертах постараюсь рассказать основную суть. Если среди читателей найдутся люди, которые знакомы с ней на практике, было бы здорово почитать их комментарии!
На этом этапе кандидату предлагают спроектировать некое приложение. От него нужен общий дизайн системы, знание паттернов микросервисной или монолитной архитектуры. Необходимо подумать о масштабируемости и отказоустойчивости. О том, как будет осуществляться мониторинг и чем он нам поможет при анализе жизненного цикла приложения.
Как я уже говорил, уровень погружения может отличаться. Эта секция не исключение. Кто-то проектирует приложение поверхностно, кто-то может расписать большинство из необходимых требований, продемонстрировав глубокие познания по всем вопросам, которых можно коснуться на интервью.
Для подготовки можно почитать следующую литературу:
«Высоконагруженные приложения. Программирование, масштабирование, поддержка», Клеппман Мартин — ключевые принципы, алгоритмы и компромиссы, без которых не обойтись при разработке высоконагруженных систем;
«Создание микросервисов», Ньюмен Сэм — решения для моделирования, интеграции, тестирования, развёртывания и мониторинга собственных автономных сервисов;
«System design. Подготовка к сложному интервью», Сюй Алекс — инсайдерская информация: что на самом деле нужно интервьюерам.
Важность софтскилов
Кандидат выгодно отличается на фоне остальных, если у него чётко поставлена речь, он умеет находить причинно-следственные связи, аргументирует свою позицию и может внятно рассказать, что и для чего он делает.
Вопреки расхожему мнению, работа программиста — это не только написание кода и копание в различных технологиях. Нужно общаться. Много общаться. С бизнесом, с коллегами, с другими командами. Защищать и отстаивать свои интересы, продвигать идеи. Учить менее опытных коллег.
Без софтов всего этого добиться очень трудно. Если вы хотите расти, то развиваться нужно во всех направлениях. Повышение исключительно технической экспертизы не даст того эффекта, которого хотелось бы достичь.
Мне очень понравился доклад Василия Романова. Он не совсем про софтскилы, но он очень хорошо описывает то, чем нужно заниматься на серьёзном уровне и к чему можно стремиться, если вы выберете эту ветку развития. Рекомендую с ним ознакомиться.
Обратная связь
Если вам важна обратная связь, обычно её можно запросить у HR. Я бы в целом сказал, что на этапе найма HR — это ваш друг и товарищ. У него можно узнавать информацию по собеседованиям, про команды, чем они занимаются, какие ожидания у них от кандидатов. Снова возвращаемся к вопросу о софтскилах — дружелюбное общение всегда играет в плюс.
К сожалению, бывают ситуации, когда обратной связи нет, а если есть, то она на уровне: «Спасибо, мы вам перезвоним». К этому надо быть готовым и не зацикливаться на подобных моментах.
Когда я провожу интервью, то, если кандидат не знает ответа на вопрос, интересуюсь, хочет ли он услышать ответ? Иногда отвечают, что самостоятельно найдут информацию после интервью, иногда соглашаются на предложение. В таких случаях рассказываю, какой ответ ожидал услышать.
Собеседования подразумевают итеративный подход. Сходили на одно собеседование, поняли, что плаваете тут, тут и тут. К следующему подтянули эти моменты и выявили другие слабые места.
Таким образом шаг за шагом вы пополняете копилку знаний и спустя время уже без проблем справляетесь и с волнением, и с каверзными вопросами.
Во многом по этой причине рекомендую оставлять собеседования с компаниями, куда вы действительно хотите попасть, напоследок. В начале стоит потренироваться на вакансиях, которые не так интересны.