Je vais essayer d’illustrer certains aspects qui n’ont pas été traités dans d’autres réponses et qui, à notre avis, sont importants.
Le problème de base est le suivant: certains développeurs sont principalement motivés par la joie de prendre un morceau de travail difficile, de réfléchir à un design, de réfléchir aux problèmes potentiels, puis de résoudre le problème pièce par pièce, avec seulement une interaction minimale avec les autres, sur une longue période. période de temps. Ils achèvent généralement leurs travaux à un niveau de qualité élevé et dans les délais impartis; leur travail est maintenable et correspond à l'architecture globale.
Ce type de développeurs peut avoir du mal à s’adapter à un environnement agile et leur attitude est souvent qualifiée de "réticence à changer", éventuellement liée à l’ego ou à l’ancienne.
Ce que l’on ignore souvent, c’est que pour résoudre des problèmes complexes, il faut gérer beaucoup d’informations, ce qui peut nécessiter beaucoup d’analyses, de réflexions, de tentatives, d’esquisser une solution, de la jeter à la poubelle, d’en essayer une autre. Un problème aussi complexe peut nécessiter de quelques heures à quelques semaines de travail ciblé jusqu'à ce que vous obteniez une solution finale.
Une approche est qu'un développeur prend la spécification du problème, se rend dans sa chambre et revient deux ou trois semaines plus tard avec une solution. À tout moment (lorsque cela est nécessaire), le développeur peut initier des interactions avec d'autres membres de l'équipe ou avec les parties prenantes (en posant des questions sur des problèmes spécifiques), mais la majeure partie du travail est effectuée par le développeur à qui est confiée la tâche.
Que se passe-t-il dans un scénario agile? L’équipe décompose le problème en petits morceaux (user stories) après une analyse rapide (nettoyage). L'espoir est que les user stories soient indépendantes les unes des autres, mais ce n'est souvent pas le cas: pour diviser un problème complexe en plusieurs morceaux vraiment indépendants, il vous faut une connaissance que vous n'obtenez normalement qu'après l'avoir travaillé pendant plusieurs jours. En d’autres termes, si vous êtes en mesure de scinder un problème complexe en petites parties indépendantes, cela signifie que vous l’avez déjà résolu en principe et qu’il ne vous reste plus qu’un travail de diligence. Pour un problème qui nécessite, par exemple, trois semaines de travail, ce sera probablement le cas lors de la deuxième semaine, et non après quelques heures de toilettage effectuées au tout début du sprint.
Ainsi, après la planification d’un sprint, l’équipe travaille sur différents morceaux d’un problème qui ont probablement des dépendances entre eux. Cela génère beaucoup de temps de communication en essayant d’intégrer différentes solutions qui peuvent être aussi bonnes mais qui sont différentes les unes des autres. Fondamentalement, le travail d’essai et d’erreur est réparti sur tous les membres de l’équipe impliqués, avec une surcharge de communication supplémentaire (augmentant de façon quadratique). Je pense que certains de ces problèmes sont très bien illustrés dans cet article de Paul Graham, en particulier le point 7.
Bien entendu, le partage du travail entre les membres de l’équipe réduit les risques liés au départ d’un membre de l’équipe. D'autre part, les connaissances sur le code peuvent être communiquées de différentes manières, par exemple en utilisant des révisions de code ou des présentations techniques aux collègues. À cet égard, je ne pense pas qu'il existe une solution miracle valable dans toutes les situations: la propriété partagée du code et la programmation par paires ne sont pas la seule option.
En outre, "la fourniture de la fonctionnalité de travail dans des intervalles plus courts" entraîne une interruption du flux de travail. Cela peut être correct si la fonctionnalité est "Ajouter un bouton d'annulation dans la page de connexion" qui peut être complétée à la fin d'un sprint, mais lorsque vous travaillez sur une tâche complexe, vous ne souhaitez pas de telles interruptions: c'est comme essayez de conduire une voiture 100 km aussi vite que vous le pouvez et arrêtez-vous toutes les 5 minutes pour vérifier votre distance. Cela ne fera que vous ralentir.
Bien sûr, avoir des points de contrôle fréquents est censé rendre un projet plus prévisible, mais dans certains cas, l'interruption peut être très frustrante: on peut à peine gagner de la vitesse qu'il est déjà temps d'arrêter et de présenter quelque chose.
Je ne pense donc pas que l'attitude décrite dans la question concerne uniquement l'ego ou la résistance au changement. Il se peut également que certains développeurs considèrent que l’approche de résolution de problèmes décrite ci-dessus soit plus efficace, car elle leur permet de mieux comprendre les problèmes qu’ils résolvent et le code qu’ils écrivent. Forcer ces développeurs à travailler de manière différente peut réduire leur productivité.
De plus, je ne pense pas que le fait de faire travailler certains membres de l'équipe de manière isolée sur des problèmes spécifiques et difficiles soit contraire aux valeurs agiles. Après tout, les équipes devraient s'auto-organiser et utiliser le processus qu'elles ont jugé le plus efficace au fil des ans.
Juste mes 2 cents.
There’s a great story of a manager of a Coca-Cola plant whose numbers were far better than his peers. When asked what his “secret” was, he said simply that rather than take a best practice and modify it to meet what the plant did, he instead modified the plant to match the best practice.
Vous ne faites pas agile jusqu'à ce que vous compreniez pourquoi vous le faites.