Должны ли мы организовать несколько agile-подгрупп по группам клиентов или по программным компонентам?

Контекст вопроса: компания, которая создает программный продукт, состоящий из нескольких функциональных компонентов (их также можно назвать субпродуктами), и продает продукт довольно небольшому количеству клиентов (~10 основных клиентов, всего <100). Эти клиенты платят лицензионный сбор за новые вещи и ежегодную плату за обслуживание. Около 20 разработчиков работают по гибкому процессу несколько лет. Мы рассматриваем возможность перехода от проектных команд к фиксированным командам. Мы обсуждаем два основных принципа организации команд: (1) каждая команда отвечает за набор функциональных компонентов или (2) каждая команда отвечает за группу клиентов.

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

Несколько вопросов; вы используете микросервисы? В идеале вы хотите уменьшить идею дублирования работы и зависимостей.
Мы не используем микросервисы, но наши зависимости в значительной степени находятся под контролем (т. е. никаких циклов пакетов и пакетов приличного размера в кодовой базе; попытки иметь определенные интерфейсы; разумный уровень повторного использования). Мы используем единый репозиторий с разработкой на основе магистрали и однородными методами разработки.
Я думаю, что все ответы на данный момент содержат ценный вклад. Мы обсудили эту тему дальше, и, похоже, мы собираемся попробовать сочетание: каждая команда является основным контактным лицом для группы клиентов и делает как можно больше историй для этих клиентов автономно. Группы клиентов также относятся к определенным функциональным группам, чтобы в команде были специалисты по этим функциональным областям. Если есть более сложная история, для которой команде заказчика не хватает знаний, она делегирует эту историю команде с соответствующими специалистами.
Также см. эту статью об отказе от проектов: martinfowler.com/articles/products-over-projects.html.

Ответы (3)

Эксперимент.

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

Имея это в виду, мы можем рассмотреть некоторые ключевые моменты, которые следует учитывать при экспериментировании:

  • Почему меняется? Уточните проблемы, которые команда намеревается решить, применив эти изменения. Изменение ради изменения «чтобы стать более гибким» не является реальной целью. Ваша настоящая цель — приносить пользу чаще и предсказуемее. Agile — это инструмент, который может помочь вам в этом.

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

  • Поймите свой текущий фон знаний . Если у вас есть один человек, который занимается пользовательским интерфейсом, и это является ключевым для всех поставок, наличие разных команд, зависящих от этого одного человека, в конечном итоге создаст узкое место.

Фон знаний — одно из самых сложных изменений для полнофункциональных agile-команд. Если ваша команда опирается на знания конкретных людей, перед изменением структуры команды я бы посоветовал:

  1. просмотреть текущий фон знаний членов команды
  2. где пробелы или потенциальные узкие места, если кто-то заболеет, а затем
  3. обсудить с командой, которая хотела бы расширить свои знания в этих областях

Помните, что не обязательно быть экспертом во всех областях (в большинстве случаев я по-прежнему считаю, что «разработчик с полным стеком» — это заблуждение). Вместо этого нужно иметь Т-образный набор навыков , позволяющий каждой подгруппе выполнять задачи с минимальной зависимостью от других команд.

Спасибо за ответ. Я согласен с тем, что распространение знаний, вероятно, является одним из ключевых вопросов, которые нам необходимо решить. И, возможно, мы должны просто попробовать это.

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

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

Спасибо за ответ. Мне нравится думать о том, какой вариант приводит к более ценным функциям. Мы обсудили взаимозаменяемые команды, но пока отклонили эти идеи, потому что хотим, чтобы команды были более сфокусированными (при условии, что это приведет к большей эффективности).

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

Если сделать наоборот: несколько команд работают над одним и тем же компонентом с разными клиентскими входными данными, может возникнуть вероятность наступить друг другу на пятки.

Вам необходимо принять во внимание следующее:

  • Как вы измеряете успех? Как вы думаете, что будет после замены?
  • Не могли бы вы сделать постепенные «пилоты» и посмотреть, действительно ли они приносят пользу? (пример: начните перемещать команду, работающую над одним программным компонентом, и посмотрите, улучшит ли это каким-либо образом производительность)
Привет, Роберто. Наше приложение было построено именно так два года назад. У нас была часть команды, создававшая много необходимых + приятно иметь функции, которые так и не были запущены, потому что другой компонент едва предоставлял обязательные функции. Был там, никогда больше не вернулся.