
Привет, Хабр! Меня зовут Антон Батищев, я бэкенд-разработчик в продуктовой команде Циан. В этой статье поделюсь опытом: как устроена наша работа, какие плюсы мы видим в таком подходе и с какими проблемами сталкиваемся на практике.
Продуктовая команда — это небольшая кросс-функциональная группа специалистов, которая работает над продуктом, обладая высокой степенью автономии.
Главная задача такой команды — достижение целевого бизнес-результата. Руководство задаёт стратегию и видение, но не вмешивается в операционные процессы. Благодаря этому продуктовая команда становится самостоятельной единицей, где решения принимаются быстро, а структура остаётся гибкой к изменениям.
Ключевое отличие от работы в функциональной структуре — отсутствие жёсткого плана действий, спущенного сверху. Вместо списка фич команда получает задачу по улучшению метрик. Например, вместо требования «сделать красную кнопку», команда получает цель «увеличить конверсию в покупку на X%"». Это даёт свободу в выборе инструментов и гипотез для достижения цели: они сами решают, как именно растить аудиторию.
В классической функциональной модели похожая задача решалась бы иначе. Сначала заказчик ставит задачу аналитикам, затем макеты рисует дизайн-отдел, и только потом ТЗ уходит в разработку. Коммуникация между отделами в такой схеме часто затруднена: чтобы изменить концепцию, нужно пройти длинный цикл согласований через руководителей каждого департамента. Это долго и неэффективно, особенно если отделы загружены другими приоритетами. Главное преимущество компактной продуктовой команды — минимальное время на согласование и ускорение доставки ценности пользователю.
Продуктовая |
Функциональная |
|
Состав |
В одной команде разные роли (аналитика, разработка, QA, дизайн). |
В команде только одна специализация. |
Фокус |
Продукт/фича. |
Технология или функция. |
Автономия и гибкость |
Высокая. Команда сама принимает решение о способах достижения цели. |
Низкая. Решения распределяются между отделами, контекст фрагментарный. |
Коммуникация |
Высокая, происходит внутри команды. |
Ниже. Т.к. нужно наладить связь между отделами. |
Зависимости |
Минимальные, т.к. все участники сфокусированы на одном общем продукте. |
Сильная зависимость от других команд. |
Приоритезация |
Внутри команды. Чаще через продакта. |
Извне. От менеджмента или других команд. |
Время релиза |
Частые, небольшими итерациями. |
Реже и медленнее, крупными блоками. |
Ответственность |
За результат продукта. |
За выполнение задач. |
Состав продуктовой команды в Циан
Поскольку продуктовая команда — это кросс-функциональная единица, в её составе должны быть все специалисты, необходимые для самостоятельного достижения поставленных целей.
Продукт-менеджер (PM)
В первую очередь нужен человек, отвечающий за продукт перед бизнесом — продукт-менеджер. Он строит стратегию развития продукта, приносит в команду бизнес-требования, которые команда преобразует в технические задачи
Исследователь
Для достижения результата команде важен исследователь. Это специалист, который напрямую общается с пользователями, проверяет их реакцию на изменения и выявляет неудовлетворённые потребности. По сути, он является проводником между бизнесом и пользователями, обеспечивая команду данными для принятия решений.
Дизайнер
Когда исследователь определяет потребности пользователей, в дело вступает дизайнер. Он визуализирует идеи продукт-менеджера, учитывая инсайты от исследования. На выходе мы получаем готовый прототип или макет функциональности, который можно передавать в разработку.
Продуктовый аналитик
Специалист, который анализирует бизнес-метрики и оценивает эффективность новых функций после релиза. Также он отслеживает поведение пользователей через аналитические события, предоставляя данные для формирования гипотез.
Команда разработки
Включает всех необходимых технических специалистов: фронтенд, бэкенд, мобильную разработку (iOS/Android). За качество кода и релизов отвечает QA-инженер.
От идеи до реализации
Циан — это сервис, который работает на Android, iOS, а также в десктопе и в мобильном вебе. Поэтому в команду входят: фронтенд-разработчики, разработчики под Android, разработчики под iOS, бэкенд-разработчики. За качество всех релизов отвечает QA-инженер, который интегрирован в команду и участвует в процессе на всех этапах. Все эти специалисты работают в одном ритме (спринте) и имеют общую цель. Ниже наглядная схема проработки фичи, от идеи до выкатки на пользователей:

Адекватная работа невозможна без выстроенной коммуникации между участниками, тут нам на помощь приходит планирование (груминг). Возьмем пример из схемы выше – реализация фичи. Как происходит груминг?
Когда макет готов, проводится встреча по уточнению бэклога. На ней продукт-менеджер и дизайнер объясняют разработке, что нужно реализовать и, главное, зачем. Понимание цели («зачем») является ключевым. На этапе реализации часто возникают технические нюансы. Если разработчик понимает контекст и цель задачи, он может самостоятельно принимать решения по незначительным изменениям, не дергая продукт-менеджера по каждому вопросу.
Нередко на таких встречах разработчики сразу подсвечивают потенциальные сложности и предлагают технические решения, сокращающие время реализации. Иногда проект может кардинально измениться прямо на встрече и тут же быть согласован. В функциональной структуре такой сценарий сложно представить: там проект проходил бы множество этапов согласования в разных отделах, что заняло бы недели.
Сегодня в Циан больше 20 продуктовых команд, которые работают по похожей структуре. Каждая из них отвечает за один или несколько компонентов и развивается параллельно с другими. По сути, это более двух десятков групп, которые каждый день делают Циан лучше, удобнее и ценнее для пользователей.
Режимы разработки новых фичей
Технический груминг
Перед началом разработки нам очень помогают технические встречи для обсуждения новых фичей. Это встреча, на которой вся техническая часть команды собирается вместе и обсуждает детали реализации.
Она необходима, так как в каждой платформе есть свои нюансы. То, что не является проблемой для десктопа, может стать серьезным препятствием для Android или iOS. На таких встречах мы заранее подсвечиваем и находим решения для сложностей, которые могут возникнуть в процессе разработки.
Процесс разработки новых функций в команде может идти в двух режимах:
А) Параллельная разработка
Бэкенд, фронтенд и мобильные разработчики начинают работу одновременно. Процесс выглядит так:
Обсуждаем новую фичу.
Согласовываем API-контракты.
Параллельно реализуем функциональность.
Если что-то не учли — оперативно вносим изменения в контракты.
Передаем фичу QA.
Выкатываем обновление на пользователей
Б) Бэкенд первым (Backend-First)
Бэкенд-разработчики реализуют новую функциональность заранее. Остальные участники команды получают уже готовый стабильный контракт и могут вести разработку на реальных данных (или на стабильном dev-сервере). Процесс построен немного иначе:
Обсуждаем новую фичу всеми разработчиками.
Обсуждаем контракты на уровне необходимых полей (часто без согласования точной структуры на старте).
Бэкенд реализует API и разворачивает его на сервере (например, в среде интеграции).
Клиентские разработчики получают готовые Swagger-спецификации: могут вызывать API и видеть ответы в разных сценариях.
Разработчики клиентов включаются в работу.
После завершения разработки фича целиком приходит к QA.
Выкатываем обновление на пользователей.
Сравнение подходов
Параллельная разработка несет небольшие риски: малейшие изменения в API-контракте на бэкенде могут повлечь доработки на фронтенде и в мобильных приложениях. Однако благодаря гибкости продуктовой команды -- это воспринимается скорее как небольшая трудность, чем как реальная проблема. Все вопросы решаются быстро и эффективно благодаря прямой коммуникации.
Backend-First тоже имеет свои риски. Например, если контракт не был должным образом согласован, может потеряться важное поле, о котором знали только клиентские разработчики. В таком случае бэкенду придется вернуться к этой задаче, чтобы добавить поле. Иногда это происходит спустя значительное время, когда контекст уже утерян. А значит, на исправление недочёта уйдёт больше времени, чем при параллельной разработке функций.
В наших командах используются оба подхода — и параллельная разработка, и Backend-First. Выбор зависит от контекста задач и текущей загрузки команды:
Если все разработчики более-менее свободны, мы ведём работу параллельно.
Если клиентские разработчики (фронтенд и мобайл) отстают от бэкенда, мы сначала реализуем бэкенд, фиксируем контракт и передаём его в работу.
Такой гибкий подход позволяет балансировать между скоростью и стабильностью, не жертвуя качеством.
Недостатки продуктовых команд
1. Дублирование функциональности
Из-за высокой самостоятельности команд иногда возникает ситуация, когда разные группы реализуют один и тот же функционал независимо друг от друга. Например, в нашей практике был случай, когда две разные команды практически одновременно начали делать обращение в Росреестр за одними и теми же данными. В итоге на карточке объекта появились две функции, связанные с Росреестром, но никак не интегрированные между собой. Это создало риски для данных: если в одном из сервисов возникала проблема, пользователь мог видеть статус «Проверено в Росреестре», но сами данные не отображались. Это подрывало доверие к продукту.
Решение: Чтобы избежать дублирования, мы внедрили архитектурный комитет и процесс ADR (Architecture Decision Record). Это позволяет фиксировать ключевые технические решения и делать их видимыми для всех команд. Тема обширная, поэтому про детали внедрения ADR расскажем как-нибудь в отдельной статье.
2. Сложность кросс-командной координации
Когда команды сильно сфокусированы на своих продуктах, становится сложно получить ресурсы других команд на изменения, которые необходимы вам. Например, если требуется доработка в сервисе на другом стеке, которого нет в вашей команде.
Так или иначе, вы работаете в большом коллективе и сталкиваетесь с интересами других команд. Обычно это приводит к увеличению сроков разработки. Все команды заинтересованы в первую очередь закрывать задачи своего бэклога, поэтому запросы со стороны часто уходят в очередь.
Решение: В таких случаях мы договариваемся о взаимной помощи. Принцип простой: сегодня команда выделяет ресурс и помогает нам, а завтра мы делаем то же самое для их проектов. Это создает культуру сотрудничества и снижает конкуренцию за ресурсы.
Например, у нас был проект, который не укладывался в сроки, потому что один из компонентов был написан на C#, а C#-разработчиков в нашей команде не было. Мы могли реализовать функционал самостоятельно, но это заняло бы значительно больше времени, чем если бы задачу взяли разработчики, сопровождающие этот сервис.
В итоге мы договорились, что коллеги из другой команды включат эту задачу в свой спринт, а мы поможем им с их проектами, когда им понадобится поддержка. В выигрыше остались все: задача закрыта в срок, а отношения между командами укрепились.
3. Дефицит узких специалистов
Если команда укомплектована не полностью, отсутствие ключевого специалиста становится критической проблемой. Так, например, у нас долгое время не было iOS-разработчика, хотя функциональность на устройствах Apple была необходима для роста метрик.
Решение: Здесь работают WIN-WIN решения. Мы договариваемся о взаимовыгодном обмене ресурсами. Например, когда у нас долгое время не было iOS-разработчика, мы договорились с соседней командой: они выделили нам своего специалиста на время проекта, а мы взамен предоставили дополнительный ресурс бэкенд-разработки для их задач. Таким образом, цели обеих команд были достигнуты.
Также есть возможность запросить ресурс через Гильдию разработки. Иногда между проектами у разработчиков появляется «окно», и они выходят в гильдию, чтобы помочь всему сообществу. Что такое гильдии разработки, зачем они нужны и как они устроены в Циан — можно почитать в отдельной статье.
Продуктовая команда — это мощный инструмент, но не «серебряная пуля»
Как мы видели на примере, переход к такой структуре дает очевидные преимущества: скорость доставки ценности, более вовлеченных сотрудников в продукт и гибкость. Однако взамен вы получаете новые вызовы: риск дублирования функциональности, сложности кросс-командной координации и зависимость от наличия узких специалистов внутри команды.
Наш опыт в Циан показывает, что успех зависит не столько от названия структуры, сколько от зрелости процессов и культуры доверия. Нельзя просто пересадить разработчиков, дизайнеров и аналитиков в один чат и назвать это продуктовой командой. Важно дать им реальную автономность, право на ошибку и единую цель, измеряемую в метриках, а не в закрытых задачах.
Если вы только планируете переход на продуктовые команды, начните с пилотного проекта. Попробуйте собрать одну кросс-функциональную группу на конкретную задачу и посмотрите, как изменится динамика работы. Будьте готовы к тому, что первые месяцы уйдут на притирку и решение организационных проблем, вроде той ситуации с iOS-разработчиками, о которой я рассказывал.
В любом случае, идеальной структуры не существует. Есть та, которая подходит вашему бизнесу, продукту и людям здесь и сейчас.
Коллеги, а какой опыт работы в продуктовых командах у вас? Сталкивались ли вы с проблемой дублирования функционала или нехватки ресурсов внутри команды? Делитесь историями в комментариях — будет интересно обсудить!
Diaboliko
1) что вы противопоставляете продуктовой команде? В моих глазах не бывает команды без продукта. Разве что в целях мошенничества. :)
2) я не спорю что экспертиза может быть без выделенного архитектора, но решать архитектурные вопросы логичнее человеку который варится в этом нон стоп и общается с другими архитекторами. Паттерны построения архитектуры и все такое. Не ошибаться всё-таки дешевле чем откладывать полировку на потом.
Сталкивались ли вы с нехваткой экспертизы?
3) я понимаю что упор статьи на то что при желании можно быстро запилить минимальную версию продукта. Но жизненный цикл ПО не заканчивается на релизе. Кто потом сопровождает эту поделку (фронтенд часть, бэкенд часть) и как решаются проблемы клиентов (схема поддержки)? Чем гарантируется качество релизов (не увидел есть ли различные тестовые среды (в т.ч. нагрузочные если SLA жесткий) и девопс пайплайны; зато увидел что QA инженер у вас в единственном числе согласно текста статьи)? Еще и уязвимости опенсурсных библиотек (хотя бы) патчевать было бы не плохо(если на фронтенд часть пофиг - хотя бы на бэке), что тоже отжирает ресурсы разработки/тестирования.
Возможно это все и так есть, но формально не является частью вашего кластера, именующего себя продуктовой командой? :)
Я не настаиваю что вот это вот все реально нужно, но мой разум искажен бигтехом и я вижу в таких вещах ценность для бизнеса, хоть и понимаю что это все приколы тех у кого есть баблище на свои ITSM процессы, безопасность, и прочие средства контроля.
antonbat125a Автор
Спасибо за развёрнутый комментарий, отвечу по пунктам.
1) Что противопоставляем продуктовой команде?
Функциональную команду — в статье как раз про это сравнение, и есть схема, которая наглядно показывает разницу. Продукт, само собой, есть и там, и там — вопрос в способе организации работы и взаимодействии людей внутри команды, а не в наличии/отсутствии продукта как такового.
2) Про экспертизу и архитектурные решения
Полностью согласен, что «Не ошибаться всё-таки дешевле чем откладывать полировку на потом». Но, честно говоря, я не встречал ни одного разработчика или архитектора, который вообще не ошибается — вопрос в том, как быстро ошибки ловятся и исправляются.
С нехваткой экспертизы сталкивались — один такой кейс как раз описан в статье. Мы его признали, исправили и сделали так, чтобы он не повторился: в том числе через обязательный ADR. Архитектурная экспертиза у нас есть, просто она распределена и подкреплена процессами синхронизации между командами, а не сконцентрирована в одной роли.
3) Про жизненный цикл после релиза
Тут, кажется, статья оставила впечатление, что мы выкатываем прототип и забываем про него — это не так. После релиза продукт целиком остаётся в зоне ответственности команды.
По конкретным вещам, которые вы перечислили:
Поддержка клиентов — часть задач делегируется команде по работе с клиентами, но основная поддержка остаётся на команде, которая разрабатывала продукт.
Тестовые среды, нагрузочное тестирование, CI/CD — всё это есть и активно используется, просто эта статья была про другое. Иначе она превратилась бы в лонгрид на полдня чтения.
Один QA в команде — да, но это не значит, что качество держится только на нём. У нас есть dev-testing (разработчики сами прогоняют код по чек-листам), обязательное покрытие юнит- и функциональными тестами на фронте и бэке, интеграционные тесты на критические бизнес-сценарии, ручное тестирование. Про фронтовые тесты у нас, кстати, есть отдельная статья — там подробнее.
Уязвимости в опенсорсных зависимостях — патчим и на бэке, и на фронте, это обязательный процесс.
Так что да — всё перечисленное вами действительно есть и формально является частью работы продуктовой команды. Просто каждая из этих тем тянет на отдельную статью, и мы постарались не пытаться впихнуть всё в одну.
Ещё раз спасибо за комментарий — такие вопросы хорошо подсвечивают, про что имеет смысл написать следующий текст.