Je suis développeur dans une équipe agile et nous essayons d'utiliser Scrum.
Je vais donc mettre ici un problème hypothétique pour illustrer la situation.
Nous avons une très ancienne application, utilisant du code JQuery de maintenabilité désordonné et mauvais. Nous avons également des parties de l'application utilisant React, et ces parties sont beaucoup plus faciles à mettre à jour / à maintenir. En plus de cela, l'objectif de l'entreprise est de créer une application cliente d'une seule page, sur React, donc l'utilisation de JQuery vous éloigne davantage de cela.
Lorsque nous faisons la planification, nous optons toujours pour la solution facile en termes de temps de développement, donc par exemple si nous créons une nouvelle boîte de dialogue ou quelque chose, nous utilisons l'ancien JQuery parce que c'est plus rapide, et nous disons que nous revenons plus tard pour ranger et transformer en React, mais cela arrive rarement.
Nous obtenons les exigences de ce que nous devons faire à partir des histoires d'utilisateurs (qui sont bien faites IMO, elles sont minces mais elles expliquent ce que nous faisons et pourquoi nous le faisons).
Parfois, les exigences des nouvelles fonctionnalités sont très minces, donc pour un exemple si une exigence dit "créer une boîte de dialogue qui charge des tonnes de contenu" mais ne dit pas d'implémenter une fonctionnalité de chargement, nous, dans la plupart des cas, ne l'implémenterons pas , même si nous savons tous que ce serait mieux pour les clients, car cela pourrait compromettre notre objectif de sprint (même si je pense personnellement que ce ne serait pas le cas).
Le résultat est que notre base de code est un gros gâchis avec une très mauvaise maintenabilité, et les nouvelles fonctionnalités parfois, sont très petites et prennent un sprint complet à faire (quelque chose qui pourrait être réalisé en une seule journée dans une bonne base de code) principalement à cause de ce développement stratégie, allez vite, faites le minimum.
Dans ce cas, que faisons-nous de mal? Devrions-nous aborder les solutions de manière plus complète afin de ne pas toujours écrire de mauvais code et réécrire du code que nous venons d'écrire la semaine dernière? Ou devrions-nous continuer à le faire en nous assurant simplement que tout ce code est en cours de réécriture? Quelle serait une bonne approche agile de ce problème?
Réponses:
Cela n'a rien à voir avec Agile ou Scrum.
Le problème avec "du ruban adhésif maintenant et nous le réparerons plus tard" est que plus tard ne vient jamais et en attendant vous accumulez beaucoup de dettes techniques .
La première étape du rétablissement consiste à reconnaître le problème et à ne pas l'aggraver.
Pour chaque nouvelle user story, l'équipe doit considérer "quelle est la bonne façon de coder cela?", Et non "quelle est la manière la plus rapide de pirater cela?" et planifier les sprints en conséquence.
Pour résoudre le problème existant, consultez les excellentes réponses à J'ai hérité de 200K lignes de code spaghetti - et maintenant?
la source
Ce que vous avez là, c'est ce que Martin Fowler appelle "la mêlée flacide".
Si vous lisez correctement les 12 principes derrière le Manifeste Agile , vous découvrirez que vous échouez à la plupart d'entre eux.
Pouvez-vous dire que vous livrez un logiciel vraiment fonctionnel? Ou tout simplement un logiciel qui fonctionne à peine?
Pouvez-vous dire que votre processus est durable? Prenez-vous des décisions en tenant compte de la durabilité? Ou choisissez-vous des solutions qui résolvent le problème actuel sans tenir compte des effets à long terme?
Le principe vraiment majeur. Je crois que cela devrait être mis dans les ÉNORMES LETTRES ROUGES sur la page. C'est là que vous échouez le plus.
Et bien évidemment. Si vous découvrez que votre comportement ne mène pas aux résultats souhaités, vous devez le changer. Si votre équipe ne voit pas qu'elle a des problèmes, elle ne peut pas commencer à les résoudre.
De votre commentaire
Tout d'abord, en apprenant ce qu'est réellement l'agilité. Scrum n'est pas agile. Certains diront que Scrum est le pire des cadres agiles, car il est trop facile d'atteindre votre situation exacte. Vous devez en savoir plus sur les autres cadres agiles. Celui que je recommanderais est Extreme Programming. Ce qui résout clairement vos problèmes. Les solutions ne sont pas simples (se concentrer sur l'excellence technique grâce à des tests automatisés robustes, la programmation de paires et la livraison continue), mais très efficaces. Comme indiqué dans le rapport State of DevOps .
la source
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 :
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".
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:
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é!
la source
Du point de vue de la mêlée, il semble que ce que vous faites mal, c'est que vous ne travaillez pas avec le client. Vous devez travailler avec le client pour comprendre ce dont il a besoin et pas seulement ce qu'il veut . Ont-ils besoin d'une série de solutions rapides ou ont-ils besoin d'un système stable et maintenable qui les servira à long terme? Cela peut être difficile à déterminer, mais la qualité est autant une exigence qu'une couleur d'arrière-plan ou une référence de performance. Le client doit être conscient que la stabilité et la maintenabilité ne sont pas gratuites et doivent être intégrées au produit.
S'ils disent que c'est le premier, vous ne faites rien de mal - en supposant que vous leur expliquez dans les revues de sprint que vous coupez les coins techniques pour atteindre leurs objectifs.
S'ils disent que c'est le dernier, alors ce que vous faites mal, c'est que vous ne leur donnez pas ce qu'ils veulent.
L'une des pierres angulaires de Scrum est la transparence. Si vous faites de la mêlée, vous devriez faire des revues de sprint avec le client. Dans ces avis, dites-vous au client que vous prenez des mesures afin de fournir des logiciels plus rapidement? Sinon, vous devriez l'être. Vous devez être à 100% clair avec votre client sur les ramifications de vos choix de conception, pour lui donner une chance de prendre une décision éclairée quant à savoir si vous livrez votre logiciel avec un niveau de qualité approprié.
la source
Ewan a raison. La raison pour laquelle la direction aime Scrum, c'est parce qu'elle obtient des fonctionnalités dans un style staccato et obtient des résultats rapidement. Jusqu'à ce que le désordre qui en résulte soit le problème de quelqu'un d'autre.
Maintenant que j'ai votre attention, laissez-moi vous expliquer. Ce n'est pas Scrum en tant que tel. C'est le cadre typique d'un chef de produit solide et d'une équipe de développement faible qui n'est pas en mesure de faire des estimations raisonnables et réalistes car ils ressentent la pression. Ils arrivent donc à des estimations très optimistes et s'attaquent plus profondément aux problèmes, coupant les coins afin de livrer à temps.
Dans Scrum, vous (en tant que développeur) pouvez faire votre propre planification. Personne ne vous dit de livrer une fonctionnalité en x jours. Si quelqu'un vous dit de livrer dans x jours, vous ne faites pas Scrum.
Quel que soit le problème à résoudre, réclamez votre temps. Pensez-vous que vous avez besoin de temps pour retravailler quelque chose en premier? Incorporez-le à votre estimation. Pouvez-vous vous le permettre?
la source
Examinons ce que vous faites, en laissant de côté Agile pendant un moment.
C'est ce qu'on appelle «Prendre la dette technique». Martin Fowler a décrit le "Quadrant de la dette technique" dans un de ses articles sur les deux axes: "Reckless vs Prudent" et "Deliberate vs. Inadvertent".
Vous décidez explicitement d'utiliser l' ancienne technologie jquery connue qui vous éloigne de l'un de vos objectifs express (à savoir une application d'une seule page). Vous faites cela pour livrer "rapidement". C'est délibéré.
Ce que ce calcul de «rapidement» n'inclut pas, c'est le temps dont vous avez besoin pour implémenter la fonctionnalité pour réagir ensuite. Vous choisissez une alternative qui n'a que des inconvénients par rapport à l'alternative que vous savez être la bonne (à savoir prendre le temps de mettre en œuvre la fonctionnalité en réaction) sur la base d'une évaluation que la vitesse est essentielle. C'est téméraire.
Martin Fowler résume ce type de dette sous "Nous n'avons pas le temps de concevoir". C'est un choix approprié dans un environnement où vous ne vous attendez pas à maintenir le code ou même à coder pendant plus de quelques jours. Mais votre projet est un projet de longue durée qui implique explicitement une maintenance pour vos clients
Ce que vous faites est mal au niveau très basique. C'est une mauvaise ingénierie !
Vous avez contracté une dette technique, ignorant que cette dette doit être remboursée et qu'elle charge des intérêts. Et vous avez continué à le faire jusqu'à ce que le taux d'intérêt sur votre dette commence à se rapprocher de votre travail disponible pendant votre sprint.
Ce que vous devriez faire, c'est réduire le niveau de la dette . Parlez à votre patron, parlez à votre client. Vous devez travailler sur la maintenabilité hier.
la source
Arrêtez d'utiliser Agile ...
Ou plutôt, arrêtez d'essayer de faire quelque chose d'une certaine manière uniquement parce que c'est ce que (votre compréhension de) agile (ou scrum etc ...) dicte. Essayer d'appliquer une (mauvaise) interprétation de l'un de ces termes à un projet au mauvais stade peut rapidement devenir la pire solution. Utilisez plutôt votre raison.
La raison pour laquelle votre projet, et presque tous les autres projets dans le monde, est un gâchis de code et d'approches divergentes, est due au manque de conception architecturale centralisée et omnisciente (là, je l'ai dit).
Les raisons pour lesquelles cela pourrait faire défaut sont les suivantes:
La solution simple est de laisser tomber tous ces mots magiques et de regarder la réalité de la situation, qui peut se résumer comme suit:
Vous arriverez naturellement à vous demander pourquoi il est arrivé à cet état en premier lieu, avec le doigt du blâme qui tourne en rond. La réponse est que cela est inévitable: à mesure que votre conception mûrit, vous réalisez que vous auriez dû le faire différemment, mais vous ne pouviez pas le prévoir. De plus, ce n'est pas une réalisation unique par projet, cela se produira plusieurs fois, et vous devez le planifier.
Cela dit, les gestionnaires peuvent faire beaucoup de choses pour exacerber les choses:
En le regardant de cette façon, il est facile de voir comment certaines interprétations de l'agile et de la mêlée vous feront avancer encore plus rapidement sur cette voie!
Une approche consiste à créer des tickets pour chaque bit de refactoring. Le problème est que souvent vous ne réalisez pas que vous avez besoin d'un grand refactoriseur jusqu'à ce que vous commenciez à travailler sur un ticket plus petit, ce qui repousse les délais, et que le ticket passe par des boucles d'approbation, il ralentit tout simplement.
Une autre approche consiste à planifier des sprints pour n'utiliser que 25 à 50% de la capacité de votre équipe. Les développeurs enregistrent ensuite leur temps sur les vrais tickets (notez le temps que cela aurait dû prendre sans refactorisation) et le temps de refactoring (un gros ticket pour la semaine, pas de boucles d'approbation, uniquement des discussions entre les développeurs). S'il n'y a pas de refactoring, vous pouvez retirer les tickets du sprint de la semaine prochaine. Vous ajustez le curseur de pourcentage pour les semaines à venir à mesure que le code sous-jacent du projet s'améliore.
Donc, pour répondre "qu'est-ce que nous faisons de mal", je dirais que vous faites confiance à une méthodologie par rapport au bon sens. Vous demandez même une "approche agile de ce problème" . Je dirais de laisser tomber les mots et de réfléchir au problème réel. Si vous voulez vraiment séparer divers manifestes essayant de déchiffrer si votre approche finale de bon sens tombe bien sous le couvert de "agile" ou "scrum", allez-y certainement :-)
la source
Vous ne faites rien de mal. Ce type de méthodologie est conçu pour fournir des fonctionnalités selon les spécifications et le plus rapidement possible.
Si vous avez des objectifs secondaires vers lesquels vous travaillez, il vaut mieux les exprimer comme des «exigences non fonctionnelles» ou une «définition du fait».
par exemple, vous pourriez avoir une exigence non fonctionnelle:
"Toutes les nouvelles fonctionnalités doivent être écrites dans React"
et
"Tous les appels asynchrones doivent implémenter un spinner de chargement et une gestion des erreurs"
Il vous suffit de faire en sorte que votre Product Owner (ou équivalent) convienne que ce sont des choses qui valent la peine d'être faites, plutôt que de les dissimuler parce que les développeurs les aiment.
la source