Récemment, j'ai commencé à travailler sur un projet où une très ancienne application monolithique est en cours de migration vers une architecture basée sur des microservices.
La base de code héritée est très désordonnée ('code spaghetti') et souvent une fonction apparemment simple (par exemple nommée "multiplyValueByTen") se révèle plus tard comme "des milliers de lignes de code de validation impliquant 10 tables sur 3 différents schémas ".
Maintenant, mon patron me demande (à juste titre) d'estimer combien de temps cela prendrait pour écrire la fonctionnalité X dans la nouvelle architecture. Mais j'ai du mal à arriver à une estimation réaliste; souvent, je sous-estime énormément la tâche pour les raisons que j'ai mentionnées ci-dessus et je m'embarrasse parce que je ne peux pas terminer à temps.
La chose sensée peut sembler vraiment entrer dans le code, noter chaque branche et appels à d'autres fonctions, puis estimer le coût en temps. Mais il y a vraiment une minuscule différence entre documenter l'ancien code et écrire réellement la nouvelle version.
Comment dois-je aborder un scénario comme celui-ci?
Bien que je comprenne parfaitement comment fonctionne le refactoring de code hérité, ma question n'est pas de savoir "comment refactoriser/réécrire?" mais de donner une réponse réaliste à "combien de temps faudrait-il pour refactoriser/réécrire la partie X?"
Lisez "Clean Coder" de Bob Martin (et "Clean Code" pendant que vous y êtes). Ce qui suit est de mémoire mais je fortement vous suggère d'acheter votre propre copie.
Ce que vous devez faire est une moyenne pondérée de trois points. Vous faites trois estimations pour chaque travail:
Votre estimation est alors (a + b + 2c)/4
Modifier:
Mes hypothèses quand j'ai répondu à ceci:
La moyenne pondérée sur trois points fonctionne bien dans ce cas. Il est rapide, compréhensible pour les non-techniciens et sur plusieurs estimations, il devrait faire la moyenne de quelque chose qui s'approche de la précision. Surtout si OP prend mon avis sur la tenue des registres des estimations et des chiffres réels. Lorsque vous savez à quoi ressemblent un "pire cas" et un "meilleur cas" du monde réel, vous pouvez introduire les chiffres réels dans vos estimations futures et même ajuster les estimations pour votre chef de projet si le pire des cas est pire que vous ne le pensiez.
Faisons un exemple concret:
- Dans le meilleur des cas, par expérience, le plus rapide dont j'ai fait un vraiment simple était une semaine du début à la fin (5 jours)
- Le pire des cas, par expérience, il y a eu ce temps où il y avait des liens partout et ça a fini par me prendre 6 semaines (30 jours)
- Estimation réelle, cela me prendra probablement 2 semaines (10 jours)
5 + 30 + 2x10 = 55
55/4 = 13,75, c'est ce que vous dites à votre PM. Vous arrondissez peut-être jusqu'à 14 jours. Au fil du temps (par exemple, dix tâches), il devrait être moyen.
N'ayez pas peur d'ajuster la formule. Peut-être que la moitié des tâches finissent par des cauchemars et seulement dix pour cent sont faciles; vous faites donc l'estmate a/10 + b/2 + 2c/5. Apprenez de votre expérience.
Remarque, je ne fais aucune hypothèse sur la qualité du PM. Un mauvais PM donnera une courte estimation au comité de projet pour obtenir l'approbation, puis intimidera l'équipe de projet pour essayer d'atteindre le délai irréaliste auquel ils se sont engagés. La seule défense est de garder un enregistrer afin que vous puissiez être vu donnant vos estimations et se rapprocher d'eux.
Ce pourrait être le bon moment pour introduire une approche quasi-agile. Si, au lieu d'estimer en termes d'heures/jours, vous avez attribué une échelle de type fibonacci et donné à chaque tâche une valeur basée sur sa taille:
Ensuite, une fois que vous avez estimé un tas de tâches comme celle-ci, vous y travaillez. Dans un environnement agile, vous développez la "vitesse" qui est une mesure du nombre de points que vous atteignez, disons, une semaine. Une fois que vous avez fait quelques semaines de test et d'apprentissage (vous pouvez le vendre à votre manager dans le cadre du processus - "J'aurai besoin de quelques semaines de test et apprendre à comprendre le processus d'estimation"), vous serez plus confiant dans le nombre de points que vous pouvez transmettre chaque semaine et vous pouvez donc traduire votre estimation de points plus rapidement en temps.
https://stackoverflow.com/questions/9362286/why-is-the-fibonacci-series-used-in-agile-planning-poker
Ce n'est pas vraiment agile car cela n'impliquerait pas les cérémonies, mais j'ai eu l'idée du PO qu'il était seul. Espérons que cette approche pourrait donner des estimations plus confiantes.
La première chose que vous faites est de commencer à collecter des données sur le temps qu'il vous faut pour faire quoi que ce soit maintenant. Plus vous avez de données sur les performances de votre équipe, mieux c'est. Ça va être partout, mais ne vous inquiétez pas pour le moment. C'est la vérité et vous devez montrer à votre patron la réalité.
Ensuite, vous allez acheter quelques livres.
Le livre de McConnell va vous dire de commencer à collecter des données, puis d'expliquer comment les utiliser pour obtenir des estimations plus précises. Donnez toujours une estimation de 3 points! Toujours. Assurez-vous de mettre en évidence les parties du livre qui parlent de la qualité médiocre du code qui fera exploser vos estimations. Montrez-les à votre patron.
Expliquez que si des estimations précises sont importantes pour l'entreprise, vous devrez commencer à appliquer les choses que vous apprenez du livre de Feather. Si vous voulez aller rapidement, en douceur et de manière prévisible, vous devrez commencer à refactoriser le code et à l'intégrer dans un faisceau de test. J'ai été là où tu es. Le temps de développement est complètement imprévisible car vous n'avez aucune idée de ce que vous pourriez éventuellement casser, non? ... Ouais. Mettez-le dans un harnais de test. Un serveur CI pour exécuter ces tests ne pouvait pas faire de mal non plus.
Enfin, expliquez à votre patron que les choses vont encore être un peu imprévisibles pendant un certain temps. Probablement quelques années, mais ce développement deviendra plus facile au quotidien et les estimations deviendront plus précises à mesure que vous aurez plus de données et que le code s'améliorera. Il s'agit d'un investissement à long terme pour l'entreprise. J'ai vécu cela récemment, il a fallu près de 2 ans pour devenir principalement prévisible.
Je sais que j'ai parlé davantage d'améliorer le code que d'estimer, mais la dure vérité est que vos estimations seront moche jusqu'à ce que vous puissiez apprivoiser la base de code héritée. En attendant, utilisez les performances historiques pour évaluer le temps que cela prendra. Au fil du temps, vous devrez prendre en compte si vous avez déjà mis le code en conformité avec vos spécifications.
Maintenant, mon patron me demande à juste titre une estimation du temps qu'il faudrait pour écrire la fonctionnalité X dans la nouvelle architecture. Mais j'ai du mal à arriver à une estimation réaliste; souvent, je sous-estime la tâche pour les raisons que j'ai mentionnées ci-dessus et je m'embarrasse parce que je ne peux pas terminer à temps.
Vous pensez peut-être dans la case de soumettre une estimation. Je dois travailler en code hérité, et lorsque je fais une estimation plus formelle, j'en fais généralement deux ou trois :
Les trois estimations tiennent compte de la solidité de la fonctionnalité en elle-même, de toute expérience que j'ai eue avec cette base de code générale et de mon intuition sur le changement (que j'ai trouvé peut être assez précis)
Après la publication de ces estimations, je tiens à jour mon gestionnaire à laquelle il semble que nous ayons affaire. S'il s'avère que nous examinons une caractéristique abyssale, nous devrons peut-être la sacrifier - c'est arrivé. Si votre patron ne peut pas accepter qu'il existe des caractéristiques abyssales pour un morceau donné de code hérité, alors je leur souhaite bonne chance, car ils auront une vie très difficile et frustrante.
Lorsque j'ai été confronté à ce genre de problème, je me suis appuyé sur la fourchette de mes estimations. Je me suis contenté de dire à mes patrons "il est difficile de faire de bonnes estimations spontanées sur cette base de code. Si vous en demandez une, ce sera une estimation très large." J'ai donné "3 jours à 3 ans" comme estimation une fois. Inutile de dire que ce n'était pas une estimation populaire, mais c'est ce que j'ai donné.
La clé de tout cela est un accord selon lequel je mettrai à jour mes estimations au fur et à mesure de l'avancement des travaux. Donc, si on me dit "Mettre en œuvre XYZ, combien de temps cela prendra-t-il?" ma réponse pourrait être "quelque part entre un jour et 4 mois. Cependant, si vous me laissez réellement regarder le code pendant quelques heures, je peux réduire l'incertitude dans cette fenêtre." Je vais ensuite regarder le code et revenir avec "2 à 4 semaines". Ce n'est toujours pas une fenêtre idéale, mais au moins c'est quelque chose qui peut être géré.
Il y a quelques clés à cela:
Si j'ai un patron qui n'est pas à l'aise de recevoir une gamme qui est mise à jour au fur et à mesure, je vais lui donner un numéro unique et ma méthodologie. Ma méthodologie est une combinaison d'une règle de base, m'a-t-on dit en tant que jeune développeur, et loi de Hofstader .
Estimez combien de temps vous pensez que la tâche devrait prendre, puis quadruplez ce nombre et donnez-le comme estimation.
et
La loi de Hofstadter: "Cela prend toujours plus de temps que prévu, même si vous tenez compte de la loi de Hofstadter."
La chose sensée peut sembler vraiment entrer dans le code, noter chaque branche et appels à d'autres fonctions, puis estimer le coût en temps. Mais il y a vraiment une minuscule différence entre documenter l'ancien code et écrire réellement la nouvelle version.
Ceci est la solution à votre problème. Vous ne pouvez pas estimer si vous n'avez aucune exigence. Dites à votre patron que vous devrez le faire avant de pouvoir commencer à coder. Après quelques fonctions et modules, vous découvrirez peut-être qu'ils ont tous été codés de manière cohérente (dans ce cas, mal), vous avez donc une base de référence pour déterminer les estimations futures. Assurez-vous simplement d'ajuster votre estimation si vous découvrez que le codage empire.
Je sais que votre patron veut une estimation, mais sans savoir comment ces informations sont utilisées, nous ne savons pas à quel point vos estimations doivent être exactes. Ayez une conversation avec lui et découvrez-le. S'il a juste besoin d'un nombre pour donner à son patron, vous pouvez gonfler légèrement les estimations et fournir un nombre. Pour les clients qui attendent de payer pour votre code jusqu'à ce que cela soit fait, assurez-vous de savoir si les dates d'échéance des lignes fixes vont générer des revenus importants.
Dans une situation comme celle-ci, je ne pense pas qu'il soit possible de donner de bonnes estimations. Le problème de base est que souvent une grande partie de cette tâche consiste à déterminer exactement ce qui doit être fait.
Je gère des cas comme celui-ci en donnant une estimation basée sur ce que cela semble impliquer mais avec le cavet que des surprises sont probables. Bien que je n'aie pas eu à faire face à beaucoup de code hérité, j'ai eu de très mauvaises surprises concernant la saisie - j'ai vu quelques heures se transformer en quelques semaines et une fois en c'est impossible (après fouilles considérables, j'ai compris que je n'avais pas assez de données dans un certain cas, retour à la planche à dessin.) Heureusement, mon patron comprend quand je donne de telles estimations.