Про управляемый бардак и внутреннюю конкуренцию, или как сделать счастливыми 90 человек

Беседу с Сергеем Куксом, руководителем отдела .NET-разработок, ведет Анастасия Казакова, менеджер по маркетингу инструментов для C++ в компании JetBrains.

Anastasia

Привет, Сережа! Ты возглавляешь .NET Department в компании JetBrains. Расскажи, пожалуйста, какие продукты входят в этот отдел и насколько он велик?

Согласно последней переписи у нас 90 человек: ReSharper — плагин к Visual Studio для разработки на .NET, второй по старшинству продукт в компании, Rider — кросс-платформенная среда разработки на .NET, профилировщики (dotTrace, dotMemory), dotCover — инструмент для измерения покрытия кода (coverage), dotPeek — декомпилятор для .NET, и ReSharper C++ — плагин для разработки на C++. Пока все.

Coox-550

Как много! А в чем заключаются твои обязанности как Department Lead?

Делать так, чтобы всё это работало! Нужно, чтобы разные люди успешно договаривались между собой. Я им в этом помогаю. А в целом хочется, чтобы система работала самостоятельно.

Получается?

Более или менее.

Недавно в Москве на JetBrains Open Day ты выступал с докладом “Минимум процессов — тоже процесс”. Считаешь ли ты это спецификой JetBrains или именно .NET-отдела?

Это такой специфичный стиль управления, который мне больше всего нравится и наиболее мне подходит. Если говорить о всей JetBrains, то процессы тут бывают совершенно разные. Некоторые команды выбирают agile-практики и играют в них всерьез и по правилам, кто-то предпочитает тотальный контроль, а где-то такой управляемый бардак, как у нас в .NET.

То есть правильно ли я тебя поняла, что тебе кажется, что правильный процесс — это тот, который максимально устраивает команду?

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

Ты сказал про “управляемый бардак”. А как вообще управлять бардаком?

Нужно создать атмосферу, в которой людям интересно то, что они делают. Дальше, если люди получают от работы удовольствие, тебе как руководителю надо просто направлять, чтобы все это двигалось туда, куда надо. Плюс сильная команда инженеров по качеству (QA), которая не даст всему разболтаться. Плюс какие-то технические решения, типа нашего merge-робота (прямые коммиты в мастер запрещены, вся разработка ведется в ветках, а на CI сервере робот мерджит мастер в ветку разработчика, прогоняет тесты и заливает изменения в мастер, если все хорошо), которые не позволяют раздолбать совсем уж все.

Для такой команды надо, наверное, как-то очень вдумчиво людей подбирать?

Да. Подходит, конечно, не любой человек.

Ты тут, наверное, держишь руку на пульсе, как начальник отдела?

Наймом в ReSharper я занимаюсь уже очень много лет. Команда ReSharper C++ в этом плане организуется как-то сама. Команда Rider выросла из ReSharper,  поэтому с наймом как таковым проблем нет. Команды профилировщиков сейчас сильно не растут. Ну, разве что ищем одного-двух человек в dotCover и в ядро профилировщика.

А как тебя кажется, достаточно ли быть просто хорошим и уважаемым разработчиком, чтобы возглавлять отдел в JetBrains, или нужны какие-то дополнительные качества?

Надо разговаривать с людьми, понимать, кто и что делает, какие у людей в командах настроения. Я вот в офисе много разговариваю с людьми (каждый день в целом с кем-то общаюсь из команды, чтобы быть в курсе), а с удаленными офисами получается, к сожалению, не так часто. Но я работаю над тем, чтобы и удаленные офисы не чувствовали себя покинутыми.

Будучи руководителем, тебе удается самому писать код?

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

В последнее время я стараюсь делать так, чтобы в трекере было меньше назначенных на меня критичных для релиза задач. Потому что нет гарантий, что в обозримом будущем я смогу выделить на это должное количество времени. Поэтому я стараюсь писать что-то скорее в начале релизного цикла. Вот, например, сделал большой кусок рефакторинга кода для подготовки к ReSharper out-of-process (вынос функциональности ReSharper в отдельный процесс из 32-разрядного процесса Visual Studio для улучшения производительности плагина).

Немного окунемся в историю. Чем ты занимался до прихода в JetBrains?

Я закончил матмех (Математико-механический факультет СПбГУ – прим.), как и многие в JetBrains. Как и многие на матмехе, я работал в Теркоме (компания, базирующаяся на факультете, в которой, как правило, активно стажируются студенты факультета – прим.). Начинал в проекте кросс-транслятора с Cobol, PL и чего-то еще в C++, Java и Visual Basic.

Как тебя в .NET в итоге занесло?

Я перешел на работу в Memory Corporation, откуда коллеги перешли в JetBrains и меня позвали. А там сказали, мы пишем на C#. Поэтому C# я начал изучать уже в JetBrains. Так что в JetBrains я пришел ради интересных задач, а язык разработки был вторичен.

 Когда это было?

Я пришел в команду ReSharper в 2004 году, почти 14 лет назад. Тогда релизили то ли ReSharper v1.5, то ли v1.65. Продукт с тех пор, конечно, сильно изменился.

Столько лет существует продукт (ReSharper)! Как тебе кажется, все основное по функциональности вы уже сделали или еще есть много того, что хочется и нужно сделать в продукте?

Самое большое нововведение, которое нас ждет и которое нужно сделать, — это ReSharper out-of-process для улучшения производительности ReSharper.

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

Как вообще в ReSharper появляется новая функциональность? Вы смотрите на то, что делает Visual Studio, что привносят другие плагины для VS, или что-то сами скорее придумываете?

Чаще всего новые возможности придумываются, когда нам самим чего-то не хватает (мы же и сами разрабатываем в ReSharper). Мое любимое — это когда в понедельник на стендап кто-то приходит и говорит, что на выходных ему пришла идея и он запилил новую фичу. И дальше это выстреливает. Бывает еще сначала разработческая поделка допиливается некоторое время, чтобы в итоге получилась конфетка.

А какой процент таких улучшений? По сравнению с теми возможностями, которые, например, ваши пользователи видят в Visual Studio и просят сделать также, но получше.

Мы не копируем Visual Studio, мы смотрим на то, что и как они делают, и стараемся сделать это лучше. Да, в случае с Rider мы действительно реализуем те фичи, к которым пользователи привыкли в других инструментах, например, в Visual Studio. Если кто-то использует Visual Studio c ReSharper, они по-прежнему могут  переключиться на изначальные фичи Visual Studio, но если они переходят на Rider, т.е. на отдельный от VS продукт, они не могут так сделать, поэтому мы стараемся реализовать в Rider то, что для них привычнее.

Ну вот например, CodeLens — это такие циферки на методе, сколько у него есть реальных использований в проекте. Я не очень понимаю, зачем это нужно, но пользователи просят. Наверное, там скорее важно не конкретное значение количества использований, а понимание 0, мало или много. В Rider мы такое скоро сделаем.

Если говорить про Rider, как у вас обстоят дела с копированием возможностей Visual Studio? Ведь это в каком-то смысле прямой конкурент, но люди все время сравнивают, и, наверняка, просят реализовать аналогичные функции.

Мы, конечно, смотрим на то, что и как сделано в Visual Studio. Но при этом пытаемся не скопировать функциональность, а сделать лучше, учесть какой-то опыт.

Ну давай тогда непростой вопрос — какой процесс функций Rider так вот переработан по мотивам функций в Visual Studio, а какой процент — это такой полет мыслей команды и уникальные возможности продукта?

Сложно сказать. Rider пока очень молодой продукт. И в нем большая часть функциональности — от ReSharper, который туда все еще постепенно доезжает. Вот сейчас в Rider, наконец, доедут все рефакторинги из ReSharper (там для этого интересная задачка была по переписыванию рефакторингов на новый кросс-платформенный движок). Ну, и плюс в Rider мы делаем то, чего людям не хватает — CodeLens, поддержка Roslyn-анализаторов и так далее.

Вообще получается довольно интересная задача у разработчиков Rider. Надо ведь реализовать и новые функции, и те, которые люди привыкли использовать в Visual Studio, хотя в ReSharper (как в плагине к VS) можно было этого не делать.

Это правда. И команду от этого прёт. Там вообще довольно просто происходит — сначала надо покрыть базовую функциональность. Например, отладчик. Ведь среда разработки без отладчика не бывает, она такая никому не нужна. Значит, надо делать отладчик. Дальше поверх этого отладчика мы делаем всякие плюшки прикольные и улучшения. Например, в Visual Studio есть очень полезное окно Exceptions Dialog Box. Но выглядит оно плохо. А в Rider мы сделали удобно.

Про Rider — а как вообще появилась идея сделать отдельностоящую среду разработки? Много лет делали плагин к Visual Studio и вроде не было таких планов.

Ты не поверишь! Но в 2004 году я пришел в JetBrains делать именно отдельностоящую среду разработки для C#. Но в тот момент, если честно, я в нее не верил совершенно.

А что поменялось с тех пор?

Появилась технологическая база. И рынок для такого продукта. Было странно делать C# IDE, которая  запускается только на Windows, является прямым конкурентом Visual Studio и вполне не обладает аналогичными возможностями. Да и UI приличный мы в далеком 2004 делать почти не умели. В общем, шансов тогда не было никаких. А вот уже в 2014-2015 году можно было начинать.

А что тебя заставило поверить в продукт?

Просто стало получаться. Я увидел продукт, которым можно пользоваться, который прикольный с точки зрения разработчика.

А под рынком ты имеешь в виду рынок кросс-платформенной .NET разработки?

Да, его попросту не было. Он появился после того, как Microsoft начал делать кросс-платформенный .NET Core. И теперь те C#-разработчики, которые, скажем, любят свой мак, но вынуждены были раньше ставить Parallels или поднимать BootCamp, избавлены от этого.

Как вообще себя чувствует продукт, появившийся на рынке, порожденным его конкурентом — Microsoft?

Тут еще забавнее — Rider ведь в каком-то смысле конкурирует с ReSharper, который его же и породил.

Конкуренция с Microsoft — это интересный вызов. Microsoft, очевидно, сейчас на этом рынке доминирует, но у нас зато есть возможность сделать что-то лучше и по-новому, тем более в молодом и активно развивающемся продукте.

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

В начале было очень трудно. Была конкуренция за ресурсы. Люди увлекались новеньким и говорили, что вот у меня 100500 задач в Rider, мне не до вашего очередного релиза ReSharper. Это было большой проблемой. И мы даже много ругались на эту тему. А потом смогли все устаканить, договориться о взвешенном разделении ресурсов. Сейчас такой конкуренции и нет. У нас одно общее дело на всех. И мне, в известной степени, все равно — пользователь купит ReSharper или Rider. А лучше, чтобы Rider + ReSharper Ultimate :)

У вас же вообще наверное есть общая кодовая база?

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

Помимо .NET-продуктов, участвуешь ли ты еще в каких-то разработках в компании?

Прямо сейчас нет. Но я принимал участие в переписывании нашего CRM-решения в 2014 году. Мне тогда было немного скучно. Пришел Макс (Максим Шафиров, CEO JetBrains – прим.) со словами «А давай вот это сделаем на Kotlin!». На Java я бы наверное отказался, а так это было что-то совсем новое. Новая задача, новый язык, новая парадигма. Я до этого вообще никогда не писал веб-приложения. Опыт был интересный. Front-end я писать не хочу, а back-end было писать прикольно.

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

Я не умею придумывать, я умею делать. К тому же, я никогда раньше не рулил таким большим отделом, и мне интересно попробовать. Вроде пока получается. Посмотрим, чем закончится.

Удачи тебе с этим! И спасибо за интервью!