Единые цели — разные бэклоги: практический подход к синхронизации команд

от автора

Введение

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

Что произойдёт, если команды в конце цепочки не знают о планах владельца core-продукта? Что будет, если инициативный Product Manager сможет быстро провести свой бэклог через смежные команды, но локальная оптимизация приведёт к общим потерям и замедлению time to market? Кто отвечает за задачи, которые годами накапливаются между командами?

Такие проблемы часто возникают в организациях, которые выросли быстрее, чем их процессы. При этом Agile-принципы начинают трактоваться как разрешение игнорировать долгосрочные интересы бизнеса и соседних команд.

Я не предлагаю выбирать между «чистым» Waterfall и «чистым» Agile. Методология — это набор инструментов, а не предмет веры. В каждой ситуации нужно искать подходящее сочетание практик. Ниже приведён пример того, как выстроить целеполагание и связи между задачами в Jira, если бэклог уже живёт собственной жизнью, а ресурсов на полномасштабную перестройку системы нет.


Анализ исходной ситуации

Не буду перегружать статью подробностями интервью со всеми стейкхолдерами. Сразу перейду к ключевым наблюдениям.

Приоритизация целей

  • В компании была утверждена методология формирования приоритетов на кросс-командном уровне.

  • На практике она полноценно применялась только во время годового планирования. Процесса квартального уточнения приоритетов при изменении целей не было.

  • Методология позволяла определить приоритет цели для команды-владельца, но не давала понятного механизма для зависимых команд.

Структура Jira

  • Все продуктовые команды работали в одном общем проекте.

  • Администраторов Jira было много. Это были не только специалисты поддержки, но и сотрудники, способные изменять конфигурацию всей системы.

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

  • В стандартной конфигурации использовались три уровня: Epic, Task и Sub-task.

  • Каждая команда требовала настроить процесс под себя. В результате в проекте появились десятки типов задач, workflow и полей, хотя большинство из них практически не использовалось.

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

«Контракты» между командами

В компании использовалось понятие «постановка контрактов». При детальном анализе выяснилось, что под ним скрывались любые кросс-командные активности:

  • Change Request — запросы на изменение;

  • доработки API;

  • изменения схем данных;

  • инфраструктурные доработки;

  • другие работы, необходимые соседней команде.

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

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


Компромиссный подход

Что делать, если формальные процессы существуют, но не соблюдаются, а команды перекладывают ответственность друг на друга? В такой ситуации нужен не очередной регламент, а простая модель с понятными правилами и автоматическим контролем.

Основные решения были такими:

  • Имя цели в Fix Version → отдельная задача-цель. Цель перестаёт быть только значением поля и становится полноценным объектом Jira.

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

  • Нет связи задачи с целью → автоматические проверки. Задачи без необходимой связи выявляются на дашбордах и не должны оставаться незаметными в бэклоге.

  • Нет регулярного grooming → ответственность команды за качество собственного бэклога.

  • Свободная постановка задач смежникам → стандартизированная связь. Для кросс-командной работы используется единый тип запроса — Change Request (CR, или ЗНИ — запрос на изменение).

  • Приоритеты выставляются вручную и нерегулярно → автоматическая актуализация. Скрипты и автоматизации Jira распространяют приоритет по цепочке связанных задач.

Главный принцип: каждая задача должна быть связана с целью, а каждая зависимость — явно отражена в Jira.

Далее в работу вступают автоматизации и скрипты ScriptRunner, настроенные на события и изменения задач. Они актуализируют приоритеты, сроки и связи по всей цепочке.

Схематичное состояние Jira до и после изменений

Схематичное состояние Jira до и после изменений

На схеме показаны два состояния:

  1. До изменений: задачи находятся внутри эпиков, а эпики могут объединяться только общим значением Fix Version (релизом). Часть задач не связана ни с какой целью.

  2. После изменений: в отдельном проекте появляется задача-цель. Она связана с эпиком команды, который декомпозируется на истории и задачи. Вся цепочка дополнительно объединена связями parent of / child of. Такая струткура позволяет использовать глубокие автоматизации и скрипты для обновления задач.

Три стадии миграции бэклога

1/3. Исходное состояние

  1. Все команды работают в одном проекте.

  2. Каждая команда создаёт собственные эпики — крупные вехи или этапы.

  3. Часть задач существует отдельно и не входит ни в одну группу.

  4. Команда создаёт «контракт» на другую команду внутри своего эпика, но связь необязательна. Поэтому команда-исполнитель не всегда знает, что от неё требуется работа.

2/3. Промежуточное состояние: отдельные проекты команд

  1. Для каждой команды создаётся собственный проект.

  2. Задачи могут находиться в разных проектах, но связываются линками parent of / child of.

  3. Старые «контракты» всё ещё могут создаваться в произвольном месте и теряться.

Этот этап снижает конфликтность администрирования, но сам по себе ещё не обеспечивает сквозного отслеживания целей.

3/3. Целевое состояние

  1. Выделяется отдельный проект для общих целей команд.

  2. Если требуется работа соседней команды, создаётся подцель или CR/ЗНИ — запрос на изменение. Он связывается с исходной целью.

  3. Команды декомпозируют цели и запросы в собственных проектах так, как им удобно. Общее правило одно: все значимые задачи связаны с целью.

Как это выглядит в Jira

Иерархия и связи задач

Иерархия и связи задач
Связь блокеров и заблокированных задач. Позволяет подсвечивать проблемы бэклогов в структурах

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

Проект «Цели»

  1. Epic — цель команды A.

  2. Change Request — запрос на изменение для команды B.

  3. Цели и запросы связываются с помощью parent of / child of. Автоматизация дополнительно объединяет их в единую иерархию и транслирует общий приоритет.

  4. При изменении цели — например, её приоритета, срока, команды или ответственного — изменения автоматически распространяются на связанные задачи по цепочке.

Проект команды A

  1. Команда создаёт столько эпиков, сколько нужно для удобной декомпозиции цели. Эти эпики связываются с эпиком-целью.

  2. Автоматизация актуализирует приоритет эпиков и всех дочерних задач.

  3. Задачи внутри эпика объединяются в иерархию на основе стандартной структуры Jira. При необходимости используются дополнительные связи: например, одна история может быть родительской для другой. Это не разрушает общую модель, если правила связей формализованы.

Проект команды B

Принцип тот же, но между целью и задачами команды появляется дополнительный уровень — Change Request. Важно, что команда B не обязана владеть исходной целью: её ответственность начинается в выполнении согласованного запроса.


Граничные случаи

Задачи сервисной команде

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

Решение. Задача связывается с целью инициатора через parent of / child of. Благодаря этому она включается в общую иерархию и получает приоритет цели. Сервисная команда при этом продолжает самостоятельно управлять собственным бэклогом — никто не вмешивается в её внутренний workflow.

Сервисная команда агрегирует входящие запросы

Ситуация. Сервисная команда объединяет множество запросов других команд в одну собственную задачу.

Решение. Здесь требуется более тщательный grooming:

  1. Команда-инициатор создаёт задачу по общим правилам и связывает её с целью.

  2. Сервисная команда регулярно разбирает входящий поток и консолидирует однотипные запросы в одну задачу.

  3. Исходные запросы связываются с итоговой задачей отношением blocked by / blocks.

  4. Автоматизация выбирает максимальный приоритет из связанной цепочки и передаёт его агрегирующей задаче.

Подход с двумя «родителями» мне не кажется идеальным: он нарушает принцип однозначной иерархии. Однако в данном случае это был практический компромисс, который позволил не ломать внутренний процесс сервисной команды и сохранить предсказуемость приоритизации.


Скрипты миграции

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

  1. Формирование первичных связей. Существующие задачи связываются с эпиками и целями, чтобы не выпасть из поля зрения.

  2. Построение агрегатов. Связанные задачи объединяются в единую иерархию, по которой можно передавать приоритеты и отслеживать зависимости.

  3. Упрощение структуры. Убираются лишние элементы и связи, чтобы итоговая модель была понятна не только её авторам, но и внешним участникам процесса.

Автоматизация работает только при наличии минимально качественных исходных данных. Stand-alone-задачу без эпика, цели или релиза невозможно надёжно включить в общую цепочку. Поэтому миграция — это не только написание скрипта, но и договорённость о правилах заполнения задач.


Результаты

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

  • быстрее находить блокеры и устранять задержки;

  • самостоятельно управлять внутренними процессами, не вмешиваясь в процессы соседей;

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

  • обсуждать сроки и ограничения на основе общедоступных артефактов, а не только устных договорённостей;

  • сохранять разные модели реализации: Waterfall, итерационную или смешанную.

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

Почему мы не стали делать ставку на Sub-task

На протяжении всего описанного процесса я почти не упоминал изменение подходов к Sub-task. Причина проста: когда у организации уже возникают проблемы с управлением общим бэклогом, продвинутые, но узкоспециализированные инструменты могут не помочь, а усложнить ситуацию.

Теоретически структуру можно было сделать проще, обязав команды использовать Sub-task. Но для этого потребовалось бы сначала вырастить устойчивую культуру декомпозиции и регулярного обслуживания бэклога.

Кроме того, у Sub-task есть техническое ограничение Jira: она существует только в контексте родительской задачи и должна следовать за ней по спринту. Это становится проблемой, когда команда помещает в один эпик набор работ на несколько месяцев, а затем пытается закрыть очередной спринт, с завершенными и открытыми Sub-task’ами в одной задаче.


Заключение

Приход к сквозной приоритизации не требует все начинать с нуля. В большинстве случаев достаточно выделить цели в отдельные объекты, разделить ответственность за проекты, стандартизировать кросс-командные запросы и автоматизировать передачу приоритетов по связям. В реальной работе команд данные изменения составили очень малую толику операционного времени, но значительно повысили качество и скорость кросс-командных взаимодействий.

А Jira при этом осталась очень эффективным инструментом для управления работами и бэклогом команд без полной переработки и оказания влияния на соседние команды.

Иногда лучший результат даёт не самая элегантная модель управления, а та, которую организация действительно способна поддерживать. В данном случае минимальное изменение Jira, ясные правила связей и автоматическая передача приоритетов оказались практичнее полной перестройки процессов.

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

Если в данной статье вы встретили знакомые боли, то вам требуются межкомандные изменения, которые зачастую недоступны отдельному продакту или проджекту — нужен комплекс работ согласованный и самое главное — активно поддерживаемый C-менеджерами компании. Я видел множество хороших линейных руководителей с отличными видением процессов готовых активно продвигать улучшения своими руками, но которые просто выгорели в поисках “спонсоров изменений” — их не нашлось в руководстве компаний.

ссылка на оригинал статьи https://habr.com/ru/articles/1066454/