Nous avons un nouveau projet en cours, et pour le moment, les développeurs ont été divisés en deux équipes, l'équipe A et l'équipe B. Ce projet comporte 2 parties qui nécessitent un développement tout au long de la pile de développement. Échantillon très simplifié de notre pile ci-dessous:
Chaque partie du projet nécessite un développement sur l'ensemble de la pile, donc je m'attends généralement à une approche de développeur de pile complète, c'est ainsi que nous avons divisé notre travail au sein de l'équipe B, conçu et élaboré les interactions entre les différentes parties.
J'ai récemment appris cependant que l'équipe A veut être en charge de certaines parties de la pile, et ils proposent une division entre les deux équipes, où la couche d'abstraction des données (et la mise en contenu dans la couche de données) est gérée par eux-mêmes sans développement de l'équipe B. Le fossé ressemblerait à quelque chose comme ça:
Pour moi, cela semble très naturel. Chaque équipe a des objectifs et des délais différents pour atteindre ces objectifs, mais l'équipe B dépendra de l'équipe A pour implémenter les fonctionnalités. La solution proposée est que les interfaces communes soient définies à l'avance (il y a probablement une échelle de temps de 2 ans sur le projet donc elles pourraient être nombreuses). L'équipe A développera ensuite les bits requis pour ces interfaces très tôt malgré ses propres objectifs, tandis que l'équipe B bloquera tous les appels pour le court terme immédiat afin de pouvoir progresser.
Je suis préoccupé par cette approche concernant:
- Les interfaces peuvent changer et l'équipe A peut ne pas avoir la bande passante ou le temps pour s'adapter à l'évolution des besoins.
- Les bogues dans le code de l'équipe A pourraient empêcher la progression de l'équipe B, et encore une fois, ils peuvent ne pas être la priorité pour les corriger car l'équipe A a une file d'attente de priorisation différente.
- Manque de connaissances réparties entre les équipes - L'équipe B peut ne pas comprendre pleinement ce qui se passe sous le capot et peut prendre de mauvaises décisions de conception à cause de cela.
Il a été suggéré que de nombreuses entreprises de l'industrie ont des sous-équipes et doivent être en mesure de gérer cela. D'après ma compréhension, les équipes sont généralement divisées comme je l'avais initialement prévu (Full Stack) ou en décomposant la pile technologique comme ci-dessous:
Je souhaite donc savoir ce que fait le reste de l'industrie. La plupart des divisions sont-elles verticales / horizontales? Une division diagonale a-t-elle un sens? Si une division diagonale devait se produire, mes préoccupations semblent-elles valables et y a-t-il autre chose dont l'équipe B devrait s'inquiéter? A noter que je vais probablement être tenu pour responsable du succès ou de l'échec de l'équipe B.
Réponses:
Vos préoccupations sont extrêmement valables. Surtout les deux premiers points à propos de l'équipe A n'ayant pas le temps d'ajouter des fonctionnalités ou de corriger des bogues qui affectent l'équipe B. J'ai vu cela se produire à plusieurs reprises dans mon propre travail.
Cela pourrait être une bonne idée si:
Il est connu que l'équipe A travaillera sur les projets qui nécessitent de nouvelles fonctionnalités dans la base de données, tandis que l'objectif de l'équipe B est essentiellement de ne faire que "des fonctionnalités frontales". Par exemple, si l'équipe B écrit la nouvelle application iPhone de votre entreprise, il est probable qu'elle n'ajoutera pas de nouveaux champs de base de données pendant un certain temps, car elle doit porter / réimplémenter toutes les fonctionnalités de la version de bureau.
La «pile complète» est devenue suffisamment complexe pour qu'aucun développeur (ou équipe de développeurs) ne puisse «s'approprier» le tout. Par «propre», je veux dire non seulement ajouter des fonctionnalités et corriger des bugs, mais comprendre et prendre soin de l'ensemble du système au point qu'ils peuvent éviter d'y ajouter plus de dettes techniques au fil du temps. Dans ce cas, la division "diagonale" est la décision judicieuse si l'équipe A possède une interface utilisateur / API Web qui est extrêmement simple ou inévitablement étroitement couplée à la mise en œuvre de la base de données / DAL (peut-être certains outils de diagnostic internes?), Tandis que l'équipe B le fait toutes les choses compliquées de l'interface utilisateur.
La direction comprend le risque que l'équipe A devienne un goulot d'étranglement et serait prête à dé-diagonaliser les choses si ou quand ce risque se transforme en véritable problème.
Je ne peux pas parler de ce qui est plus ou moins courant dans l'industrie, mais au moins là où je travaille, il est clair que tous les développeurs d'applications doivent être "full stack". Ce que nous avons, ce sont des équipes "d'infrastructure" qui développent / maintiennent notre base de données interne, notre cadre de service Web et notre cadre d'interface utilisateur (ai-je mentionné que ma société est énorme?), Afin que toutes nos centaines d'applications puissent avoir une pile complète devs alors que l'entreprise dans son ensemble peut toujours fournir des performances et une interface utilisateur cohérentes à tous nos services.
Récemment, notre société a créé un tout nouveau cadre d'interface utilisateur, il y a donc eu une période où certaines de nos nouvelles applications ont été très mal bloquées contre les bogues et les fonctionnalités manquantes dans le nouveau cadre. Ce n'est plus le cas, principalement parce que certains d'entre nous ont été autorisés à soumettre des demandes de tirage à l'équipe qui possède le framework (pas tout à fait "dé-diagonalisation", mais vous avez l'idée).
la source