J'ai beaucoup réfléchi à cette question.
Je pense qu'il est important de faire la distinction entre le découpage par responsabilités individuelles et le découpage par responsabilités d'équipe. Je vais concentrer cette réponse principalement sur les équipes de découpe.
Pour certains antécédents: J'ai travaillé dans des projets avec des développeurs full-stack, des développeurs single-tier, des équipes verticales (full-stack), des équipes horizontales (single-tier) et des équipes diagonales. Par équipe diagonale, je veux dire contenant tous les niveaux nécessaires pour une histoire, mais pas nécessairement tous les niveaux du système, et éventuellement contenant plusieurs développeurs se concentrant sur les mêmes niveaux; en d'autres termes, d'esprit vertical mais peut-être quelque peu horizontal en apparence ou en détail de mise en œuvre.
Récemment, j'ai travaillé dans un groupe qui est passé d'équipes horizontales à des équipes diagonales (presque verticales). Il a été particulièrement instructif de voir le même groupe de personnes aligné de deux manières différentes. Cela rend certains avantages et inconvénients assez clairs.
Je vais arrondir mon opinion jusqu'à présent avec la comparaison récapitulative suivante:
Équipes horizontales
Avantages:
- Favorise une bonne séparation des préoccupations et des niveaux faiblement couplés
- Gestion beaucoup plus simple de la répartition de la charge de travail
- Gestion facile par un responsable technique spécialisé
- Favorise la collaboration intra-niveau, les meilleures pratiques, la fierté et une culture d'excellence
- Aligne avec les modèles de communication naturels / émergents
Désavantages:
- Peut conduire à l'isolement des niveaux et donc entraver la communication entre les niveaux
- Active la culture de «bulle» de niveau si elle n'est pas atténuée
- Difficile de profiter du leadership généraliste
- Entrave les généralistes
Équipes verticales / diagonales
Avantages:
- Toutes les parties d'une user story en une seule équipe ("one stop shop")
- Aide spécifiquement à fournir des histoires à n niveaux en un seul sprint (bien que vous en ayez vraiment besoin?)
- Favorise la collaboration entre les niveaux et la croissance des compétences généralistes
- Soutient les généralistes
Désavantages:
- Gestion de la distribution de la charge de travail beaucoup plus difficile
- Permet une mauvaise séparation des préoccupations et des niveaux étroitement couplés
- Entrave la spécialisation en réduisant la communication intra-niveau; il est difficile de voir comment une culture de l'excellence pourrait naître de cette structure sans ajouter des comportements atténuants horizontaux / spécialisés
Je ne pense pas que l'appartenance à une équipe ait une solution unique. Il semble cependant assez simple que l'équipe verticale s'aligne mieux pour les organisations nécessitant une généralisation. Si vos ingénieurs sont généralistes et aiment travailler en full stack, c'est une très bonne raison de considérer les équipes verticales. L'équipe horizontale s'aligne mieux pour les organisations nécessitant des spécialistes. Si vos ingénieurs sont des spécialistes, c'est une très bonne raison d'envisager des équipes horizontales.
Comme d'autres l'ont mentionné, les structures / comportements secondaires qui tranchent dans l'autre sens peuvent aider à atténuer les inconvénients de l'un ou l'autre système. Un facteur atténuant intéressant est la durée du sprint. Les sprints courts rendent certains des inconvénients des équipes horizontales plus tolérables. Si vous pouvez construire le backend cette semaine et le frontend la semaine prochaine, cela pourrait être assez rapide?
Pour appliquer certains de ces principes proposés à un problème réel ... Je dirai que les tranches horizontales ont très bien fonctionné pour une équipe de développement SaaS très réelle sur laquelle j'ai travaillé et qui résolvait des problèmes techniques très difficiles à tous les niveaux ( où la spécialisation était à mon avis extrêmement importante), où la fréquence de livraison (et la fiabilité à une granularité / fréquence élevée) était essentielle au succès de l'entreprise. Veuillez noter que cette conclusion est pour une équipe très particulière du monde réel, et non une déclaration générale de supériorité du découpage horizontal.
Une mise en garde: je suis probablement partisan de ne pas croire aux prétentions de capacités généralistes de toute personne dans le monde du développement logiciel moderne sans preuve significative, bien que j'aie connu quelques rares généralistes exceptionnels. Je pense que la généralité est un ordre élevé (vertical?) En effet, d'autant plus que chaque niveau croît en complexité et avec la prolifération de langages / plateformes / frameworks / déploiements alternatifs, chacun répondant à des besoins différents. De nos jours en particulier, un cric de tous les métiers peut très facilement être un maître de rien. De plus, de façon anecdotique, je trouve que la plupart des individus veulent se spécialiser un peu, encore une fois à quelques exceptions près.