¿Deberíamos organizar múltiples subequipos ágiles a lo largo de grupos de clientes o a lo largo de componentes de software?

El contexto de la pregunta es una empresa que crea un producto de software que consta de varios componentes funcionales (también podría llamarlos subproductos) y vende el producto a un número bastante pequeño de clientes (~10 clientes principales, <100 en total). Esos clientes pagan una tarifa de licencia por cosas nuevas y una tarifa anual por mantenimiento. Hay alrededor de 20 desarrolladores, trabajando con un proceso ágil durante varios años. Consideramos pasar de equipos de proyecto a equipos fijos. Estamos discutiendo dos principios primarios sobre cómo organizar los equipos: (1) Cada equipo es responsable de un conjunto de componentes funcionales, o (2) cada equipo es responsable de un grupo de clientes.

¿Tiene experiencias positivas o negativas con cualquiera de las opciones en un contexto similar? ¿Cuál de las opciones es mejor para el contexto dado?

Unas cuantas preguntas; ¿Estás haciendo uso de microservicios? Idealmente, desea reducir la idea de trabajo duplicado y dependencias.
No usamos microservicios, pero nuestras dependencias están bastante bajo control (es decir, no hay ciclos de paquetes y paquetes de tamaño decente en todo el código base; tratando de tener interfaces definidas; nivel saludable de reutilización). Utilizamos un repositorio único con desarrollo basado en troncos y prácticas de desarrollo homogéneas.
Creo que todas las respuestas hasta ahora contienen información valiosa. Hablamos más sobre el tema y parece que vamos a probar una combinación: cada equipo es el contacto principal para un conjunto de clientes y elabora tantas historias como sea posible para estos clientes de forma autónoma. Los grupos de clientes también se relacionan con ciertos grupos de funciones, por lo que el equipo cuenta con especialistas para estas áreas de funciones. Si hay una historia más compleja para la cual el equipo del cliente carece de conocimientos previos, delega esta historia al equipo con los respectivos especialistas.
Consulte también este artículo sobre alejarse de los proyectos: martinfowler.com/articles/products-over-projects.html

Respuestas (3)

Experimento.

Ninguna respuesta presentada aquí se ajustará a su producto, equipo o cliente específico. Agile promueve la mejora continua, así que adelante.

Con eso en mente, podemos revisar algunos elementos clave a tener en cuenta al experimentar:

  • ¿Por qué cambiar? Tenga claros los problemas que el equipo pretende abordar al aplicar estos cambios. Cambiar por cambiar "para volverse más ágil" no es un propósito real. Su propósito real es entregar valor con más frecuencia y con previsibilidad. Agile es una herramienta que puede ayudarte en eso.

  • Los equipos deben poder entregar un producto completo . Si organiza equipos por componentes funcionales, tendrá más experiencia en este componente específico, pero puede terminar con un gran equipo en la interfaz de usuario que ofrece muchos cambios que no se pueden activar porque el equipo de back-end no tiene tanta experiencia.

  • Entienda su fondo actual del conocimiento . Si tiene una sola persona que realiza la interfaz de usuario y esto es clave para todas las entregas, tener diferentes equipos que dependan de esta única persona eventualmente creará un cuello de botella.

La base de conocimientos es uno de los cambios más complejos para los equipos ágiles totalmente funcionales. Si su equipo se basa en el conocimiento de personas específicas, antes de cambiar la estructura del equipo, le sugiero:

  1. revisar los antecedentes de conocimientos actuales que tienen los miembros del equipo
  2. ¿dónde están las lagunas o los cuellos de botella potenciales si alguien se enferma y luego
  3. hable con el equipo que desee ampliar sus conocimientos en estas áreas

Recuerde, uno no necesita ser experto en todas y cada una de las áreas (todavía considero que un "desarrollador de pila completa" es una falacia en la mayoría de los casos). En cambio, uno debe tener un conjunto de habilidades en forma de T que permita a cada subequipo poder entregar con una dependencia mínima de otros equipos.

Gracias por la respuesta. Estoy de acuerdo en que la distribución del conocimiento es probablemente una de las cuestiones clave que debemos resolver. Y tal vez deberíamos probarlo.

Esta es una pregunta difícil de responder porque depende de su empresa. La directriz general es optimizar el equipo hacia la creación de valor. Por lo general, una pregunta como esta se plantea como: ¿deberíamos organizar equipos en torno a los componentes del sistema y las áreas funcionales? La respuesta a esa pregunta es más fácil porque con los componentes del sistema, ningún equipo puede ofrecer una característica valiosa a los usuarios por sí solo. Sin embargo, en su caso, parece que ambos pueden ofrecer una función valiosa completa por sí mismos, por lo que la pregunta puede ser, ¿cuál puede ofrecer mejor o más a menudo una función valiosa por sí solo?

Otro modelo a considerar con un número tan pequeño de desarrolladores son los equipos completamente intercambiables. Si todos los equipos pueden hacer todo el trabajo, siempre obtendrá las funciones más importantes más rápido.

Gracias por la respuesta. Me gusta la idea de pensar qué opción conduce a características más valiosas. Hablamos de equipos intercambiables, pero hasta ahora descartamos las ideas porque queremos que los equipos estén más enfocados (asumiendo que esto conducirá a una mayor efectividad).

Me parece que hacerlo en torno a los componentes de software es más inteligente porque parece que los equipos podrán controlar mejor las decisiones, ya que recibirán la información de varios clientes en una sola función.

Si lo hace al revés: tener varios equipos trabajando en el mismo componente con diferentes aportes del cliente, parece que podría haber una posibilidad de pisar los dedos de los demás.

Es necesario tener en cuenta lo siguiente:

  • ¿Cómo estás midiendo el éxito? ¿Qué crees que pasará después del cambio?
  • ¿Podría hacer "pilotos" graduales y ver si realmente tienen un beneficio? (ejemplo: comience a mover un equipo que trabaja en un solo componente de software y vea si mejora el rendimiento de alguna manera)
Hola Roberto, nuestra aplicación se estructuró exactamente así, hace dos años. Tuvimos parte del equipo entregando muchas características imprescindibles y agradables que nunca se pusieron en marcha porque otro componente apenas ofrecía características imprescindibles. Estuve allí, nunca más volví.