Ce que vous décrivez est - du moins d'après mon expérience - un modèle émergent assez courant d'équipes essayant «d'être agiles». Il est possible de débattre si cela fait réellement partie de l'Agile lui-même ou si une mauvaise mise en œuvre courante de celui-ci, est contraire au manifeste / aux principes agiles ou à une conséquence inhérente de celui-ci, etc. D'un point de vue empirique et sur la base de mon propre petit échantillon d'expérience (et des personnes à qui je parle), si une équipe est agile, elle semble avoir une chance supérieure à la moyenne de tomber sur ce modèle. Restons-en là et concentrons-nous sur votre exemple concret.
Ce que vous décrivez comporte deux aspects distincts :
- Manque de compréhension / vision commune et donc pas efficace
- Comment mesurer le succès / progrès et le coût total
Prendre le mauvais chemin ou tourner en rond
D'après mon expérience, la principale raison pour laquelle cela se produit est que, dans le but de produire du code rapidement, les équipes repoussent activement les cas d'utilisation ou les exigences qu'elles connaissent déjà ou pourraient facilement découvrir. Pensez-y de cette façon: il y a 10-20 ans, les gens essayaient d'écrire des spécifications géantes et pensaient à tout à l'avance et échouaient souvent. Soit ils ont pris trop de temps, soit ils ont oublié quelque chose. L'un des enseignements du passé est que, dans le développement de logiciels, il y a des choses que vous ne pouvez pas savoir et les choses changent beaucoup, d'où l'idée d'itérer rapidement et de produire rapidement des sorties sensibles. C'est un très bon principe. Mais aujourd'hui, nous sommes à l'autre extrême: "Je m'en fiche parce que ça fait partie du prochain sprint" ou "Je ne dépose pas ce bug, je m'en occupe quand il revient".
- Rassemblez tous les cas d'utilisation de haut niveau , les exigences, les dépendances et les restrictions que vous pouvez trouver. Mettez-le dans un wiki pour que toutes les parties prenantes et les développeurs puissent les voir. Ajoutez-y quand quelque chose de nouveau arrive. Parlez à vos actionnaires et utilisateurs. Utilisez-la comme liste de contrôle lors du développement pour éviter d'implémenter des choses qui ne contribuent pas au produit final ou sont des solutions de contournement / hacks qui résolvent un problème mais en provoquent trois nouveaux.
- Formuler un concept de haut niveau . Je ne parle pas de concevoir des interfaces ou des classes, mais plutôt d'esquisser grossièrement le domaine problématique. Quels sont les principaux éléments, mécanismes et interactions de la solution finale? Dans votre cas, cela devrait être évident lorsque vous utilisez l'aide jquery-workaround comme une étape intermédiaire et quand cela ne provoque qu'un travail supplémentaire.
- Validez votre concept à l'aide de la liste que vous avez réunie. Y a-t-il des problèmes évidents? Est-ce que ça fait du sens? Existe-t-il des moyens plus efficaces d'atteindre la même valeur utilisateur sans engendrer de dette technologique à long terme?
N'en faites pas trop. Vous avez juste besoin de quelque chose pour que tout le monde dans l'équipe (y compris les non-développeurs) ait une compréhension commune de la meilleure voie vers votre MVP. Tout le monde devrait convenir qu'il n'y a pas d'oubli évident et que cela pourrait réellement fonctionner. En général, cela permet d'éviter de tomber dans des impasses ou d'avoir à refaire la même chose plusieurs fois. Agile peut vous aider à mieux faire face à l'inattendu, ce n'est pas un argument pour ignorer ce qui est connu.
Soyez conscient de l' erreur de coût irrécupérable : si vous commencez avec une architecture ou un type de base de données, la plupart des gens hésitent à le changer à mi-projet. C'est donc une bonne idée d'investir un peu de temps pour avoir une «meilleure supposition éclairée» avant de commencer à mettre en œuvre des choses. Les développeurs ont tendance à vouloir écrire du code rapidement. Mais souvent, avoir quelques simulations, des prototypes en direct, des captures d'écran, des images filaires, etc. permet une itération encore plus rapide que l'écriture de code. Sachez simplement que chaque ligne de code écrite ou même les tests unitaires rendent plus difficile de modifier à nouveau votre concept global.
Mesurer le succès
Un aspect complètement différent est la façon dont vous mesurez les progrès. Disons que l'objectif de votre projet est de construire une tour de 1m de haut en utilisant des objets qui traînent. Construire un château de cartes peut être une solution totalement valable si, par exemple, le temps de mise sur le marché est plus important que la stabilité. Si votre objectif est de construire quelque chose qui dure, utiliser Lego aurait été mieux. Le point est: ce qui est considéré comme un hack et quelle solution élégante dépend entièrement de la façon dont le succès du projet est mesuré .
Votre exemple de "chargement" est assez bon. J'ai eu des choses comme ça dans le passé où tout le monde (y compris les ventes, PO, les utilisateurs) a convenu que c'était ennuyeux. Mais cela n'a eu aucun impact sur le succès du produit et n'a provoqué aucune dette à long terme. Nous l'avons donc abandonné car il y avait des choses plus précieuses à faire avec les ressources de développement.
Mon conseil ici est:
- Gardez tout, même les petits bugs, comme tickets dans votre système de tickets . Prenez une décision active ce qui est dans la portée du projet et ce qui ne l'est pas. Créez des jalons ou filtrez autrement votre backlog afin d'avoir toujours une liste "complète" de tout ce qui reste à faire.
- Avoir un ordre d'importance strict et un point de coupure clair où le projet pourrait être considéré comme un succès. De quel niveau de stabilité / qualité de code / documentation le produit final a-t-il réellement besoin? Essayez de passer chaque jour de travail le mieux possible en choisissant par le haut. Lorsque vous travaillez sur un ticket, essayez de le résoudre complètement sans introduire de nouveaux tickets (à moins qu'il ne soit logique de reporter les choses en raison d'une priorité inférieure). Chaque engagement devrait vous faire avancer vers votre objectif final, pas latéralement ou en arrière. Mais pour le souligner à nouveau: parfois un hack qui produit du travail supplémentaire plus tard peut toujours être un net positif pour le projet!
- Utilisez votre PO / utilisateurs pour déterminer la valeur utilisateur, mais demandez également à vos développeurs de calculer le coût de la technologie . Les non-développeurs ne peuvent généralement pas juger du véritable coût à long terme (pas seulement du coût de mise en œuvre!), Alors aidez-les. Soyez conscient du problème de la grenouille bouillante: beaucoup de petits problèmes non pertinents peuvent au fil du temps mettre une équipe en attente. Essayez de quantifier l'efficacité de votre équipe.
- Gardez un œil sur l'objectif / les coûts globaux. Au lieu de penser de sprint en sprint, gardez plutôt un état d'esprit "pouvons-nous en tant qu'équipe faire tout ce qui est nécessaire jusqu'à la fin du projet" . Les sprints ne sont qu'un moyen de décomposer les choses et d'avoir des points de contrôle.
- Au lieu de vouloir montrer quelque chose tôt, tracez votre cours sur le chemin le plus rapide vers un produit minimum viable qui peut être donné à l'utilisateur. Pourtant, votre stratégie globale devrait permettre des résultats vérifiables entre les deux.
Donc, lorsque quelqu'un fait quelque chose qui ne correspond pas à votre objectif de mise en œuvre final, idéalement, ne considérez pas l'histoire comme terminée. S'il est avantageux de clôturer l'histoire (par exemple pour obtenir des commentaires des clients), ouvrez immédiatement une nouvelle histoire / bogue pour remédier aux brèves lacunes. Faites en sorte que la prise de raccourcis ne réduise pas les coûts, elle les masque ou les retarde!
L'astuce ici est d'argumenter avec le coût total du projet: si par exemple un bon de commande pousse à prendre des raccourcis pour faire un délai, quantifier la quantité de travail qui doit être fait par la suite pour considérer le projet fait!
Méfiez - vous également de l' optimisation basée sur des critères : si votre équipe est mesurée par le nombre d'histoires qu'elle peut montrer lors d'une revue de sprint, la meilleure façon d'obtenir un bon «score» est de couper chaque histoire en dix minuscules. S'il est mesuré par le nombre de tests unitaires écrits, il aura tendance à écrire beaucoup de tests inutiles. Ne comptez pas les histoires, ayez plutôt une mesure de la quantité de fonctionnalités utilisateur nécessaires, de l'ampleur du coût de la dette technologique à résoudre dans le cadre du projet, etc.
Sommaire
Pour résumer: aller vite et minimal est une bonne approche. Le problème réside dans l'interprétation de «rapide» et «minimal». Il faut toujours considérer le coût à long terme (sauf si vous avez un projet où cela n'est pas pertinent). L'utilisation d'un raccourci qui ne prend qu'un jour mais génère une dette technique d'un mois après la date d'expédition coûte plus cher à votre entreprise qu'une solution qui a pris une semaine. Commencer immédiatement à écrire des tests semble rapide, mais pas si votre concept est défectueux et qu'ils cimentent une mauvaise approche.
Et gardez à l'esprit ce que signifie "à long terme" dans votre cas: je connais plus d'une entreprise qui a fait faillite en essayant d'écrire du bon code et donc expédiée trop tard. Une bonne architecture ou un code propre - du point de vue de l'entreprise - n'a de valeur que si le coût pour y parvenir est inférieur à celui de ne pas l'avoir.
J'espère que ça t'as aidé!