Как проводить собеседование на позицию DevOps Engineer. И как готовиться к нему

Всем привет! Меня зовут Антон, я DevOps-инженер в MacPaw, экс-сотрудник Swiftype (an Elastic company), Grammarly, Bigmir.net. За 10 лет в ИТ я успел побывать в мире VoIP-хаоса, FreeBSD-сект, тимлидства, MacOS-разработки (со стороны DevOps), стандартного веба. Минимум половину своей карьеры мне приходилось собеседовать людей, поэтому с опытом я выработал для себя некие правила и чекпоинты, которыми и хотел бы сегодня с вами поделиться.

Статья будет полезна техническим специалистам, которые проводят интервью в стиле «как карта ляжет» или понадеявшись на импровизацию. Особенно для тех, кто проводит интервью на роли DevOps/SRE Engineer, преимущественно для уровней middle, senior, TL.

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

Сломанный процесс

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

Что такое inode? Разница между Apache и Nginx? Что произойдет, если я нажму Tab-Tab? Как часто, будучи в роли кандидата, вы слышали подобные вопросы? И как часто вы делали мысленный фейспалм на них? Высока вероятность, что ваш собеседник просто загуглил список вопросов «Linux System Administrator/DevOps Interview Questions», который вы даже когда-то скролили, попивая пивко вечером, но вряд ли запомнили все ответы. В итоге проверили вашу память, и, в лучшем случае, немного знаний.

Что делать, если вы собеседующий

Готовиться к интервью! Да, с вашей стороны это не менее важно, чем со стороны кандидата. У вас должен быть список вопросов, ответы на которые помогут вам понять, насколько ценным будет опыт человека для текущей компании.

Не надо так

Это очень важный блок! Перечитайте его дважды, даже, если вы не относитесь к DevOps. Не нужно спрашивать:

  • Как бы кандидат разруливал сложности «прогонки» 10 Tbit/s на FreeBSD, потому что это прикольная история, которую рассказал сосед по общаге в 2005.
  • Про межпланетный интернет. Да-да, такой проект существует, и правда интересно обсудить, как он работает. Но прочтите ниже блок «Поведенческие моменты» и поговорите об этом с будущим коллегой в пабе ;)
  • О чем сами узнали только вчера. То, что кандидат ничего не знает из недавних changelogs, ни о чем не говорит. Не все мы ноулайферы.
  • О том, чего у вас нет в компании. Вы планируете когда-то использовать Kafka? Нет? Вот и не нужно спрашивать!
  • Специфический опыт, который доступен тем, кто строил какой-то левый хостинг, но денег у вас не было, и вы извращались как могли, и познали дзен! Туда же VoIP, CI/CD on MacOS/Windows и подобное! Само собой, только если это не требуется от позиции.
  • Что делает вот тот ресурс в Chef и почему DSL там сработает так, а не иначе? Впрочем, если у вас колбаса самописного шефа и самописные LWRP, которые надо будет редактировать, то вопрос может быть и правильным.
  • Не задавайте вопросы, на которые можно ответить первой строкой из описания в «Википедии». Такие вопросы не помогают понять, сможет ли человек делать конкретную работу. Один мой друг жаловался, что не может проходить собеседования, так как не знает все о HAProxy, о Postgres, да еще и про MongoDB. Я посоветовал заучивать первые предложения из описаний, и количество пройденных интервью возросло.
    • Вы знаете, что такое риак?
    • Ну, это распределенный KV датастор, как Динамодб.
    • А, ну ок!

Let’s talk about real systems

Задавайте открытые вопросы, в которые можно углубляться. Если вы не знаете таких вопросов, то возьмите вопросы, которые вам близки, и умножайте нагрузку, пользователей, rps в X2-X5-X1000 раз.

Пример открытого вопроса:

Опиши шаги, необходимые для построения приложения с автоскейлингом в AWS. Далее это позволит вам развивать тему максимально глубоко, в зависимости от вашего опыта и опыта вашего собеседника:
  • А если мы хотим использовать Spot Instances, что изменится?
  • ALB или NLB?
  • Мы же уже на Spot? Zero downtime shutdown, как?
  • MySQL master-master, master-slave, автоматическое переключение, как?
  • Зашивать код в AMI? Идет в разрез с системой деплоймента? Как можно по-другому? Или триггерить билд на конкретный инстанс? А чтобы не деплоить на всех в группе при этом?
  • Куда будем класть сикреты?
  • А если у нас часть инфраструктуры в другом облаке или до сих пор на bare-metal? VPN? Хм...

Пример вопроса с «умножением»:

У нас есть Data Pipeline: ALB-Nginx-Python-RabbitMQ-Some_Workers-S3-Hadoop-Whatever. Система хорошо работает при количестве запросов X1, но при X2 начинает скапливаться очередь, где может быть проблема, что делать?
  • При X5 nginx начинает выдавать 502, что не так и куда смотреть? Трейсинг, интересно?
  • При X20 опять очередь, и наш реалтайм процессинг уже совсем не похож на реалтайм.
  • У нас прилетело Х100, реббит упал, и потерял все данные? План по High Availability, как это будет выглядеть, сколько чего добавляем, а если опять чертов Spot? А как быть с остальными частями системы?
  • Kubernetes? Отлично, давай поговорим, как будет выглядеть вся система?
  • Мы же не забываем все это замониторить и читать логи, CI/CD? А как, откуда кто куда пишет и т.д.

Troubleshooting + hands-on

Это все отлично, скажете вы, но как же мне работать с человеком, который не знает, что такое LA или всех флагов lsof на память?

Нет, конечно, никто вам не запретит опять скатиться в «Apache vs Nginx». Но лучше сами немного подготовьтесь, сделайте виртуалку, сломайте в ней что-нибудь и дайте своему собеседнику. Эта часть займет у вас минут 5-7, но закроет очень много скучных вопросов. Заодно можно узнать что-то новое.

Deep dive

Если вам интересно узнать, например, как работает GTID в MySQL, то воспользуйтесь советами из блока «Let’s talk about real systems» и подведите к этому в обсуждении про увеличение нагрузки. То же самое с сетями, конфиг-менеджментами и т. д. Не стоит спрашивать подобные вопросы, ни к чему не привязываясь. Человек не в контексте, а вы такие бац! А как ElasticSearch делает flush-commit под капотом? И тут судорожно приходится вспоминать что-то про Lucene, что приведет к неловким попыткам выдать хоть что-нибудь.

Программирование и тестирование

Программирование, как английский, должно быть by default. А вот на каком уровне — это очень холиварный вопрос. Имхо, чем чаще вы пишете код для повседневных задач, тем лучше.

Здесь нужно учитывать нюанс, что инфраструктурные вещи, как правило, отличаются от CRUD, например. Поэтому, самое худшее, что можно придумать — это позвать проверить эту часть программиста. Я даже помню (но не буду вслух) одну украинскую компанию, которая просила от DevOps-инженера алгоритмы, структуры данных и вот это вот все.

Понимая под какие задачи вы пишете код, можно подготовить правильные вопросы или тестовое. Например, вам по задачам достаточно только bash и прочий sh. Даем вот такой кусок лога Nginx:

host=setapp.com remote_addr=134.21.127.86 request="GET /v4/customer?access_token=lol HTTP/1.1" status=200 bytes_sent=813 user_agent="Setapp/1.18.2 CFNetwork/974.1 Darwin/18.0.0 (x86_64)" request_length=385 request_time=0.078 upstream_time=0.078 request_id=47f01df614e6c777d88270417c9ac871
host=setapp.com remote_addr=134.21.127.86 request="POST /v4/apns_token HTTP/1.1" status=204 bytes_sent=454 user_agent="Setapp/1.18.5 CFNetwork/974.1 Darwin/18.0.0 (x86_64)" request_length=655 request_time=0.081 upstream_time=0.074 request_id=9174d3b3712c4fd1e93696457f255439
host=setapp.com remote_addr=99.59.88.166 request="GET /v5/token/lol HTTP/1.1" status=200 bytes_sent=910 user_agent="Setapp/1.18.5 CFNetwork/975.0.3 Darwin/18.2.0 (x86_64)" request_length=371 request_time=0.011 upstream_time=0.011 request_id=d51d8230b753f5c9ac5fe31f4d1279a3

И просим вывести только IP-адреса, затем убрать из вывода remote_addr=, а после отсортировать, вывести топ повторяющихся IP, удалить дубликаты и т. д. Набросать подобных и более сложных задачек из жизни по bash совсем не сложно.

Идем дальше. Кандидат знает Python, Ruby, Go? Попросите сделать такой же парсинг лога, только на любимом ЯП. Хочу отметить, что во время интервью, под стрессом, скорее всего, мало кто справится со следующими просьбами, и для их выполнения может понадобиться несколько часов или больше. Скажу честно, что сам довольно редко просил делать тестовое, однако вы можете всегда иметь заготовки под рукой. Адекватно оценивайте количество времени, которое кандидат будет готов потратить на тестовое задание ради вашей компании на данном этапе.

Еще примеры:

  • Написать CLI программу, которая будет парсить JMX и высчитывать процент или частоту запуска GC.
  • Программу, которая сможет принять вебхук, распарсить json и, используя готовые библиотеки, отправить ключевые значения в Slack или в Jenkins API.
  • Написать какой-то «кукбук» для Chef/Puppet — тоже вариант. Ansible? Скажи что-нибудь по YAMLовски :)

К сожалению или к счастью, 99% задач по написанию кода в этой профессии сводятся к подобному.

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

Тестирование тоже желательно должно быть. Не буду долго тут расписывать, но, если кандидат когда-то имел опыт с inspec или подобным, то это уже хорошо! Умеет и писал тесты к своему коду — отлично!

Поведенческие моменты

Я не предлагаю спрашивать о том, кем вы себя видите через 5 лет! Скорее, о чем-то, что может быть важным для вашей команды или компании. Очень простой и банальный пример, когда вы решили внедрить, ну я не знаю, blameless postmortems, а перед вами типичный злой сисадмин хейтер всего и всех. Также можно расспросить, работал ли человек в команде, как принимали решения о внедрении чего-то нового. Это покажет, работал ли он с другими людьми и есть ли вообще опыт принятия решений с кем-то вместе.

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

Часто в нашей работе приходится сталкиваться с tradeoff между быстрым «подставлю костыль» и сделаю правильно. Как решить, когда выбирать первое, а когда второе? Иногда аргументация очень интересная для обоих вариантов и базируется на прошлом опыте.

Один из моих любимых вопросов: если бы мы с тобой поменялись местами, то что бы ты у меня спрашивал? Как по технической части, так и в целом? Чтобы тебе было важно выяснить обо мне?

Доводилось ли тебе быть «евангелистом»? Как ты доносил (бы) людям идею изменений какого-либо процесса или технической части в продукте, команде?

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

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

London is the capital of Great Britain

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

Фидбэк после интервью

Для HR

В 100% случаев HR будет просить у вас фидбэк. За варианты «норм» или «не катит» HR заносят вас в список на аннигиляцию в случае восстания машин. Поэтому старайтесь, не откладывая, сразу после интервью написать свои мысли о кандидате. Если вам это сложно, то попробуйте делать пометки в процессе общения, только обязательно предупредите об этом собеседника. Фидбэк HR нужен не из вредности, а потому, что HR в идеале хочет хорошо делать свою работу и поддерживать как свою репутацию, так и компании.

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

Для кандидата напрямую

Тут нужно быть осторожным, так как ненамеренно можно и обидеть человека, и оставить плохую ассоциацию с компанией! У меня был случай, когда я выдал человеку аккуратное «слабенько с AWS», а он оказался каким-то там трижды сертифицированным по AWS. Было неудобно. C тех пор я стараюсь показать свой отзыв кому-то из коллег и конкретизировать: «Не хватило знаний с такой-то и такой-то штукой в AWS».

В большинстве случаев человек сам способен провести ретроспективу и понять, где он плавал, а где был силен. Но, если речь явном запросе «что бы почитать?», то вам же несложно накидать список хороших книг, WebOps/DevOps/SRE Weekly и дать ссылочку на UkrOps Slack, правда?

Послесловие

В конце хотелось бы обобщить важное:

  • Готовьтесь к интервью независимо от того, на какой вы будете стороне.
  • Не превращайте интервью в сценку «Я здесь самый крутой чувак!».
  • Не делайте из интервью экзамен, их, вроде, и в универе должно было хватить :)
  • Выбирайте себе коллегу, а не набор чекпоинтов напротив нужных скиллов.
LinkedIn

29 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

На вскидку:
> awk ’{print $2}’ nginx.log | cut -d= -f2 | sort | uniq -c
если лог-файл большой, я бы сохранял промежуточные результаты куда-нибудь в файлы, иначе никаких мозгов у железа не хватит

Хорошая статья, даешь больше конкретики и меньше букв 😅

нечего было делать:

> log.split(’\n’).map(line => line.split(’ ’).map(exp => exp.split(’=’)).filter(([key]) => key === ’remote_addr’)).map(el => el[0][1])
[ ’134.21.127.86′, ’134.21.127.86′, ’99.59.88.166′ ]

Ви прийняті!

ура! з різдвом нас!

и сколько времени, озу надо будет ноде, что бы распарсить вашим образом, такой дамп на 100 мб?

если сделать на стримах, то памяти на длинну строки надо будет ±

разбиение иммутабельных строк в Java не внезапно перестало аллоцировать память ? :) Если по теме — то за такой вариант решения задачи думаю, что на девопс интервью вы себе сделаете только хуже(банально грепнуть логи не можете)

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

а при чем тут жава к ноде

Не про те Стримы подумал. Так как нода сможет выделять ± столько же памяти как размер строки если вы аллоцируете строки все равно хоть чанками хоть целиком, если вы их разбиваете на подстроки(небуферизирующее чтение не поможет — так как в ноде нет апи для memory pooling и неалоцирующего string api)? подсказываю — что бы было совсем не банально и оптимально, парсить логи на ноде, лучше всего написать внешний модуль на с++ и там попробовать парсить через stackallock какой-нибудь и написать библиотеку аналог regexp даже с упором на парсинг дампов с небольшой длинной до переноса строки. Это уже next level будет реально, девопсы так не смогут :)

Годный текст. Можно брать за основу для интервьюверов.

убийственный вопрос — как выйти из vi

Подумаешь, бином Ньютона:
:q

А из emacs?

зачем мне это знать, для этого девопс есть :-)))))

накой туда вообще заходить ¯ \ _ (ツ) _ / ¯

делаешь crontab -e
и потом «Нафаня, спасите-помогите» )

Ого, и даже модели OSI нету в списке. Круто

Интересно что это за канал Ukrops, можно как-нибудь присоединится почитать?

Попросил редакторов поправить ссылку в статье на ukrops.club

И просим вывести только IP-адреса, затем убрать из вывода remote_addr=, а после отсортировать, вывести топ повторяющихся IP, удалить дубликаты и т. д. Набросать подобных и более сложных задачек из жизни по bash совсем не сложно.

Без гугла на співбесіді за півгодини анріал якщо ти кожного дня не пишеш такі скріпти. Максимум можна сказати що тут треба tr, тут cut, тут регексп, тут uniq, але зібрати то все докупи?

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

От я робив десяток раз але для мене проблему составить. Без мана і без стековерфлоу я не пам’ятаю всіх опцій та ключів.
Як я вище писав можна написати щось типу tr | cut | sort | unique але я хочу подивитися на светр того бородача, який знає всі ключі для конкретної OS і напише рішення сходу.

На самом деле сразу можно понять знает ли кандидат хотя бы базово grep, sed, awk и два основных ключа для sort и uniq.
Либо проблем у него не возникнет, либо будет городить огород.

Это ведь основные утилиты для быстрого и удобного парсинга и поиска в консоли.
Их надо знать.

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

В статті не написано що можна man читати.

Может у них там по условиям задания вообще мы сидим в бункере на оторваном от мира серваке в сингл юзер моде? Если честно таким умникам сразу можно махать ручкой и не тратить на них время

Очень хорошее послесловие, желаю всем интервьюверам!

Интересная и познавательная статья, спасибо.

Подписаться на комментарии