Кирилл Сафонов: «Это как участвовать в гонках через океан на небольших яхтах»
Представляем первый выпуск подкаста о технологиях, процессах, инфраструктуре и людях в IT-компаниях (нулевой выпуск можно послушать и почитать здесь). Сегодня в гостях у «CTOcast» — Кирилл Сафонов, технический директор компании RuTarget.Слушать подкаст
1-я часть текстовой версии подкаста
Текстовая версия подкаста (2-ая часть) Александр Астапенко: Сейчас предлагаю отойти от обсуждения технологий и поговорить немного о людях. На главной странице вашего сайта можно найти информацию о том, что в компании работают программисты из рекламных систем Google и Яндекс. Что побуждает лучших специалистов в индустрии приходить в набирающий обороты, но все-таки стартап? Кирилл Сафонов: Возражу вам. Не совсем стартап. Все-таки компании уже несколько лет, хотя с точки зрения духа это, конечно же, стартап. У нас достаточно маленькая команда, бодрый высокий темп, интересные задачи и люди в команде. Я думаю, что, в основном, сложность задач и отсутствие каких-то бюрократических тормозов или высокого контроля и нравятся людям.
Александр Астапенко: Абсолютно верно. Но найти таких людей — это нетривиальная задача. Я понимаю и, после прочтения интервью с вами, убедился, что при поиске вы действительно столкнулись с трудностями и даже пришлось привлекать внешнего HR, который бы делал скрининг, первоначальную фильтрацию кандидатов. Где еще можно искать таких необычных специалистов, связанных с RTB-технологиями, кроме как в Google и Яндекс?
Кирилл Сафонов: Пожалуй, что даже Google и Яндекс не являются на 100% подходящими компаниями, где можно искать людей. На самом деле на российском рынке работает достаточно много других рекламных компаний, которые так или иначе связаны с RTB: компании, показывающие баннеры, предоставляющие рекламные места и так далее. И разумно искать людей в этих компаниях. У нас в Петербурге и Москве, я думаю, достаточно много людей, и неплохие шансы кого-нибудь там найти.
Александр Астапенко: Хочу уточнить по data sсience-специалистам, которые образуют еще более узкую нишу. Есть ли готовые специалисты на рынке или приходится обучать людей, приходящих из науки, например, математики? Или из high-frequency trading или каких-то других вещей, где много алгоритмов?
Кирилл Сафонов: На мой взгляд, с data science сложнее, потому что это более экзотическая область. Но, тем не менее, примерно такой же ответ: компании, которые занимаются рекламой, обработкой данных или какими-то социальными вещами — там тоже можно найти специалистов. Те ребята, которые к нам попали, они попали уже давно и, возможно, в какой-то степени случайно, но я очень рад, что так получилось. Вот, например, что касается Java-разработчиков: у нас открыты вакансии, и мы их ищем постоянно, проводим собеседования, но новые люди к нам приходят очень медленно. С большинством мы не готовы продолжать работать. С data science получилось так, что у нас ребята есть, отлично себя зарекомендовали. В этом плане отдел укомплектован, и очень приятно, что, несмотря на более сложную нишу, работает и проблем не доставляет.
Павел Павлов: Ты упомянул про интервью и процесс отбора людей. Есть ли какие-то особенности, связанные с собеседованием при приеме на работу в компанию RuTarget? Как вы выбираете действительно квалифицированных специалистов среди кандидатов? На какие качества обращаете внимание?
Кирилл Сафонов: Сначала мы устраиваем обычное интервью по Скайпу, в частности, кандидатам из других городов. Мы знакомимся с человеком, просим рассказать про его опыт работы и задаем какие-то вопросы по ходу дела. Понимаем, чем он занимался, какие у него были успехи или, наоборот, падения, и что вообще человек из себя представляет. Потом приглашаем его на техническое интервью, в ходе которого спрашиваем непосредственно про Java. Я сейчас говорю о собеседовании на позицию Java-разработчика. Задаем вопросы по Java и при этом не требуем каких-то супер глубоких знаний, экзотических вещей. Что нам нужно — это очень хорошее знание J2SE, threading, concurrency. И, в принципе, все. Дальше мы просим его написать небольшую программу, смотрим насколько качественный код он пишет, насколько хорошо знаком с дизайном. После этого общаемся по результатам написания данной программы и принимаем решение — да или нет.
Павел Павлов: И еще один небольшой вопрос. Например, во многих американских компаниях классическое стандартное правило — хотя бы одно интервью глубоко связано с computer science, алгоритмизацией, сортировкой связанных списков. Уделяете ли этому внимание или вам важно именно серьезное знание практического контекста — Java, технология?
Кирилл Сафонов: При написании тестовой программы в любом случае будет всплывать вопрос про алгоритмы. Тут никуда не уйти.
Павел Павлов: Ты упомянул, что вы проводите интервью по Скайпу с людьми, которые находятся в других городах. Приглашаете их к себе в Питер или работаете удаленно?
Кирилл Сафонов: Мы можем работать с человеком удаленно, если хорошо его знаем, и он хорошо знает нас. В том смысле, что сотрудник поработал on-site вместе со своими коллегами, пообщался, все поняли, что разговаривают на одном языке, все одинаково понимают, как работает система. И вот после этого мы в принципе разрешаем человеку уйти на какое-то время, поехать в свой родной город или уехать за границу, например, и работать оттуда. То есть, после некой стадии начального знакомства и притирки, которая, по-нашему, должна длиться один-два месяца, человек может уехать обратно и работать, где он хочет. Единственное, конечно, чтобы тайм-зона более-менее совпадала с питерской.
Александр Астапенко: Может есть best practice для работы с удаленной командой? Как же их всех держать, чтобы все были, как говорится, на одной странице?
Кирилл Сафонов: Я бы сказал, что best practice — это брать правильных людей. Как раз вот сложно находить людей, которые не только хорошо знают программирование и Java, но и с кем ты также близок по духу, которым интересно с тобой, с которыми интересно тебе. Как раз с учетом того, что мы набрали очень хорошую команду, у нас нет проблем оставаться на одной странице, на одной волне. Мы все думаем одинаково, достаточно близко, скажем так. Конечно, спорим по каким-то архитектурным вопросам или по коду, бывает. Но общий тренд, вектор очень хороший, он совпадает. Это дает нам возможность отпускать людей, давать им работать не в офисе, а где-то еще, потому что мы уверены, что они будут работать так же, как и мы здесь.
Александр Астапенко: А сколько человек сейчас работает у вас? Какие подразделения есть в компании? Как она устроена структурно?
Кирилл Сафонов: В отделе разработки у нас несколько человек пишут ядро, есть небольшой отдел data mining, и еще есть люди на разные задачи — сейчас всего около десяти человек в отделе разработки. Это, что касается RuTarget. Дальше — компания Segmento, в которой есть продажники, сейлзы и есть продакт-менеджер, там на самом деле даже два человека, находящихся между Segmento и RuTarget, некий мостик, который доносит бизнес-требования и выносит фидбэк от отдела разработки обратно.
Александр Астапенко: Ясно. Кирилл, какие задачи ты как CTO выполняешь в RuTarget? И как распределяется твое время в течение недели по разным видам активности?
Кирилл Сафонов: Так как компания маленькая, задач много, то приходится совмещать много ролей. Во-первых, это, конечно, непосредственное участие в разработке продукта, написание кода, обсуждение архитектуры, проведение код-ревью и тестирование. То есть CTO в компании RuTarget является по факту одним из core-девелоперов. Дальше некая координация активности разработки, координация между членами команды, чтобы все шло как нужно и все понимали кто и что делает, выполняли сроки. Дальше еще одна важная задача — это координация интеграции с техническими партнерами, сетями, поставщиками данных, то есть всеми теми техническими людьми, которые общаются непосредственно с компанией RuTarget «снаружи». Там всплывает очень много организационных и технических моментов: выдерживание сроков ответов, нагрузки, высокая доступность и так далее. И еще одна ключевая задача — поддержание системы в «боевом» состоянии — сейчас тоже на мне, то есть мониторинг и решение каких-то оперативных проблем, которые возникают.
Павел Павлов: Получается, что первая линия огня приходится на тебя и не делегируется на других людей?
Кирилл Сафонов: По факту, да. Так происходит.
Павел Павлов: Это то, чего ты хотел или есть смысл попробовать поменять что-то, переключиться на какие-то другие активности? Или ты считаешь, что это оптимальное решение, учитывая твою экспертизу, способность быстро решать проблемы?
Кирилл Сафонов: Я думаю, что с текущим размером компании — это оптимальный вариант, оптимальное распределение. С ростом компании, конечно, часть функций нужно будет делегировать другим людям. Ну, и тем интереснее текущая работа для меня самого, потому что приходится решать очень много задач: как связанных с программированием, так и не совсем, которые тебя держат в тонусе, и всегда есть, о чем подумать.
Александр Астапенко: Кирилл, а ты себя сейчас больше чувствуешь как технический специалист или уже больше как управленец, который бегает и решает проблемы там, где горит?
Кирилл Сафонов: Технический специалист, который решает проблемы. Я бы так сказал.
Павел Павлов: У тебя уже был опыт работы CTO в другой компании. Похожие функции или все-таки что-то поменялось в RuTarget?
Кирилл Сафонов: Разница в том, что здесь более высокий темп и более реальные, разнообразные задачи, которые приходится решать.
Павел Павлов: А в JetBrains была больше девелоперская работа?
Кирилл Сафонов: Да, хотя приходилось очень много решать вопросов, связанных с отзывами пользователей, с баг-репортами, отвечать на фидбэк, но темп там, конечно, был ниже. Все происходило в неком таком операционном цикле, более-менее понятном. Здесь темп выше и вопросы разнообразнее.
Павел Павлов: То есть, в принципе, классическая ситуация для небольших компаний, скажем так, стартапов по духу.
Кирилл Сафонов: По духу стартапов, да. Это как участвовать в гонках через океан на небольших яхтах вместо того, чтобы переплыть его на большом пароме с бассейном и концертным залом, как-то так. Конечно, есть риск, высокая скорость, дует ветер, высокие волны, но это значительно интересней, и в конечном итоге достижения больше.
Павел Павлов: Хорошо. Смотри, ты говорил о команде очень квалифицированных и ответственных специалистов, но также упомянул о том, что приходится делать код-ревью. То есть получается, что нужен какой-то контроль даже над самыми-самыми высокими специалистами? И насколько жестко построен у вас этот процесс?
Кирилл Сафонов: Мы делаем код-ревью всего кода, который попадает в продакшн. Во-первых, чтобы члены команды знали чужой код, очевидно, что это важно. Во-вторых, несмотря на то, что все люди талантливые, ответственные и пишут хороший код, это очень важно, чтобы код был без ошибок, работал быстро и надежно. Поэтому в данном случае трата времени на код-ревью не является бессмысленной. Мы считаем код-ревью очень важным, и уже не раз и не два доказано, что это действительно по делу и действительно нужно. Потому что вылезали какие-то вещи, которые стоило сделать по-другому и которые нам сэкономили много головной боли и много потраченного времени.
Павел Павлов: Понятно, есть ли best practices, связанные с этим? Какие решения используются?
Кирилл Сафонов: Мы делаем код-ревью при перекладывании коммитов из главной ветки в ветку релиза. У нас сейчас есть проблема с инструментом, потому что хороших инструментов для код-ревью я пока не видел. Надеюсь, что скоро такие инструменты появятся, не буду говорить откуда…
Павел Павлов: JetBrains?
Кирилл Сафонов: Заметьте, не я это сказал. Вот, пожалуй, что best practices все очевидны — код-ревью и тесты. Очень важно писать эти тесты, сейчас, мне кажется, все их пишут. Поэтому тут популяризация не требуется. Тесты — это единственное, что дает спать спокойно, на самом деле.
Павел Павлов: Должен ли быть высокий уровень покрытия кода?
Кирилл Сафонов: Какого-то формального требования нет, но вся команда понимает, что тестами должна быть покрыта вся базовая функциональность, которая есть. Поэтому у нас проблем с этим или каких-то споров нет. Подразумевается, что вместе с кодом идут тесты на этот код.
Павел Павлов: Получается, что методологически используется test driven-разработка: сначала пишется тест, потом патч?
Кирилл Сафонов: Пожалуй, нет, скорее это все пишется вместе. Сначала код, потом тест, сначала тест, потом код, как угодно. Мы стараемся каких-то жестких требований не выставлять и стараться максимально уменьшить количество бюрократии, которая требует каких-то рутинных действий. Очень рассчитываем на ответственность всех членов команды. И не зря.
Павел Павлов: Хотелось бы все-таки закрыть тему код-ревью. Ты сказал, что нет хороших решений, но мы уже знаем, у кого оно будет. Можешь навскидку два-три решения назвать, которые ты бы строго не рекомендовал другим людям?
Кирилл Сафонов: Я бы не сказал, что нужно что-то строго не рекомендовать. Мне показалось, что некоторые решения чересчур бюрократичные, и код-ревью вытесняется процессом открытия-закрытия тикетов, кликания мышкой и продиранием через бесконечные окна.
Павел Павлов: Можешь примеры привести таких решений?
Кирилл Сафонов: Мы в JetBrains пользовались Crucible, коммерческим продуктом. И я бы не хотел использовать его у себя.Есть хостинг-решения на GitHub, но так как у нас репозиторий лежит локально и баг-трекер свой, то нам такие решения не подходят.
Павел Павлов: Если какой-то QA в команде, люди тестирования, которые не связаны непосредственно с разработкой?
Кирилл Сафонов: Нет, сейчас у нас нет выделенных QA. Фактически мы частично тестируем сами, частично смотрят продакт-менеджеры, как система работает. И в конечном итоге смотрю я, смотрят другие члены команды на систему мониторинга, которая настроена так, чтобы о каких-то странностях поведения системы сразу же докладывать. Есть достаточное количество бизнес-метрик, бизнес-чеков, которые анализируют поведение системы, и если что-то не так, мы об этом очень быстро узнаем, это все видим. И соответственно можем анализировать эти метрики, локализовать проблему и дальше уже смотреть или в код, или куда-то еще, пытаться понимать, что происходит. К сожалению, так как мы… Не к сожалению, на самом деле это особенность такая просто… Так как мы зависим, интегрированы с большим количеством рекламных сетей и поставщиков данных, достаточно часто что-то идет не так не у нас, а у них. И это влияет на нашу систему. Но мы об этом достаточно быстро узнаем, понимаем, пишем письмо или другим образом связываемся и задаем вопрос: «Ребята, как у вас дела, когда вы вернетесь в строй?» или «Когда вы будете давать нам качественные данные снова?».
Александр Астапенко: Кирилл, в этом ключе я хотел бы уточнить организован ли каким-то образом процесс поддержки ваших контр-агентов, допустим, поставщиков данных, компаний вроде Segmento, которые продают услуги RTB конечным клиентам?
Кирилл Сафонов: У компании Segmento есть отдел аккаунтов, суппорта, который общается с бизнес-клиентами и решает их вопросы. Между Segmento и окружающим миром есть отдел. Между компанией RuTarget и окружающим миром есть я и настроенная система мониторинга и чеков, которая очень мне помогает.
Павел Павлов: Получается, что если есть система оповещения о проблемах, то необходимости в каких-то системных администраторах или людях, которые бы поддерживали, скажем так, систему, по большому счету нет?
Кирилл Сафонов: Если все идет хорошо, то да, проблем нет. Но мы все время развиваемся, систему улучшаем, поэтому оперативная деятельность как по разработке, так и по администрированию, конечно, идет. Системные администраторы нужны, и они есть.
Павел Павлов: Они занимаются больше пожаротушением или изменением системы? В момент, когда происходит что-то плохое, ты исправляешь это или помогают люди?
Кирилл Сафонов: Пожаротушение как таковое никогда не требуется, потому что система настроена так, что если отказывает какой-то блок, то она переходит в аварийный режим, а снаружи ведет себя так, как будто все хорошо. Просто мы не делаем ставки и отвечаем заглушками. Каких-то срочных действий не требуется. Дальше мы выясняем, в чем проблема. Иногда это часть техническая, иногда часть администраторов.