Récemment, j'ai commencé à travailler sur un projet dans lequel une très ancienne application monolithique est en train de migrer vers une architecture à base de microservices.
La base de code héritée est très confuse ('code spaghetti') et constitue souvent une fonction apparemment simple (appelée par exemple "multiplyValueByTen") qui se révèle plus tard comme "des milliers de lignes de code de validation impliquant 10 tables sur 3 schémas différents".
Maintenant, mon patron me demande (à juste titre) de dire combien de temps faudrait-il pour écrire la fonctionnalité X dans la nouvelle architecture. Mais j'ai du mal à faire une estimation réaliste; souvent, je sous-estime énormément la tâche pour des raisons que j'ai énumérées ci-dessus et m'embarrasse parce que je ne peux pas terminer à temps.
Ce qui est sensé peut sembler entrer vraiment dans le code, noter chaque branche et appeler d'autres fonctions, puis estimer le coût en temps. Mais il existe une différence minime entre la documentation de l'ancien code et l'écriture de la nouvelle version.
Comment devrais-je aborder un tel scénario?
Bien que je comprenne parfaitement le fonctionnement de la refactorisation de code classique, ma question ne concerne pas "comment faire une refactorisation / réécriture?" mais pour donner une réponse réaliste à "combien de temps faudrait-il pour refactoriser / réécrire la partie X?"
la source
Réponses:
Lisez "Clean Coder" de Bob Martin (et "Clean Code" tant que vous y êtes). Ce qui suit est de mémoire, mais je vous suggère fortement d’acheter votre propre exemplaire.
Ce que vous devez faire est une moyenne pondérée à 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 à trois points fonctionne bien dans ce cas. C'est rapide, compréhensible pour le non-technique et sur plusieurs estimations devrait se situer à une précision proche de la précision. Surtout si OP suit mon conseil sur la tenue des registres des estimations et des résultats réels. Lorsque vous savez à quoi ressemblent le "pire des cas" et le "meilleur des cas" du monde réel, vous pouvez intégrer les résultats réels dans vos estimations futures et même ajuster les estimations de votre chef de projet si le pire des cas est pire que prévu.
Faisons un exemple travaillé:
N'ayez pas peur d'ajuster la formule. Peut-être que la moitié des tâches finissent par des cauchemars et que seulement dix pour cent sont faciles; donc vous faites l'estimer a / 10 + b / 2 + 2c / 5. Apprenez de votre expérience.
Notez que je ne fais aucune hypothèse sur la qualité du MP. Un mauvais PM donnera une courte estimation au conseil du projet pour obtenir son approbation, puis intimidera l'équipe du projet pour tenter de respecter le délai irréaliste auquel ils se sont engagés. La seule défense est de conserver un enregistrement afin que vous puissiez être vu en train de donner vos estimations et de vous en approcher.
la source
Cela pourrait être un bon moment pour introduire une approche quasi-agile. Si, au lieu d’estimer le nombre d’heures / de jours, vous avez attribué une échelle de type Fibonacci et attribué à chaque tâche une valeur en fonction de 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 une "vitesse" qui mesure le nombre de points obtenus en une semaine, par exemple. Une fois que vous avez effectué quelques semaines de test et d’apprentissage (vous pouvez vendre cela à votre responsable dans le cadre du processus - "j’aurai besoin de quelques semaines de test et d’apprentissage pour comprendre le processus d’estimation"). plus confiant dans le nombre de points que vous pouvez gagner chaque semaine et qui vous permet de traduire plus facilement votre estimation de points en temps.
https://pm.stackexchange.com/questions/4251/why-would-teams- use-the-fibonacci-sequence-for-story-points
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 le PO me dit qu'il est tout seul. Espérons que cette approche pourrait donner des estimations plus fiables.
la source
La première chose à faire est de commencer à rassembler des données sur le temps qu'il vous faut pour accomplir quelque chose maintenant. Plus vous disposez de données sur les performances de votre équipe, mieux c'est. Ce sera 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. Toujours donner une estimation de 3 points! Toujours. Assurez-vous de mettre en évidence les parties du livre expliquant à quel point une mauvaise qualité de code va faire sauter vos estimations. Montre-les à ton patron.
Expliquez que si des estimations précises sont importantes pour l'entreprise, vous devez commencer à appliquer les éléments que vous apprenez dans le livre de Feather. Si vous souhaitez agir rapidement, en douceur et de manière prévisible, vous devez commencer à refactoriser le code et à le transformer en un faisceau de test. J'ai été juste où tu es. Le temps de développement est complètement imprévisible parce que vous ne savez pas ce que vous pourriez briser, non? ... Ouais. Obtenez-le dans un harnais de test. Un serveur CI pour exécuter ces tests ne pouvait pas non plus faire de mal.
Enfin, expliquez à votre patron que les choses vont encore être un peu imprévisibles pendant un moment. Probablement quelques années, mais ce développement deviendra plus facile tous les jours et les estimations deviendront plus précises à mesure que vous disposerez de plus de données et que le code s'améliorera. C'est un investissement à long terme pour l'entreprise. Je suis passé par cela récemment, il a fallu près de 2 ans pour devenir principalement prévisible.
Je sais que j'ai davantage parlé d'amélioration du code que d'estimation, mais la dure vérité est que vos estimations seront décevantes jusqu'à ce que vous puissiez apprivoiser la base de code héritée. Dans le même temps, utilisez les performances historiques pour évaluer le temps nécessaire. À mesure que le temps passe, vous voudrez savoir si vous avez déjà obtenu le code conforme aux spécifications dans vos estimations.
la source
Vous envisagez peut-être de soumettre une estimation. Je dois travailler avec l'ancien code et lorsque je fais une estimation plus formelle, j'en fais habituellement deux ou trois :
Les trois estimations tiennent compte de la difficulté de la fonctionnalité en soi, de toute expérience acquise avec cette base de code générale et de mon intuition face au changement (ce que j'ai découvert peut être assez précis).
Après la publication de ces estimations, je tiens mon responsable au courant des informations sur lesquelles 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 bloc de code hérité donné, je leur souhaite bonne chance, car ils auront une vie très difficile et frustrante.
la source
Quand j'ai eu ce genre de problème, je me suis appuyé sur des fourchettes pour mes estimations. Je me suis permis de dire à mes patrons "Il est difficile de faire de bonnes estimations improvisées avec ce code-base. Si vous en demandez un, 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 ceci est un accord selon lequel je mettrai à jour mon budget 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 regarder le code pendant quelques heures, je peux réduire l'incertitude de cette fenêtre". Je vais ensuite regarder le code et reviens 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 ne souhaite pas recevoir une plage mise à jour au fur et à mesure, je lui attribuerai un numéro et sa méthodologie. Ma méthodologie est une combinaison d'une règle empirique qui m'a été dite en tant que jeune développeur et de la loi de Hofstader .
la source
C'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, de manière médiocre). Vous disposez donc d'une base de référence pour déterminer les estimations futures. Assurez-vous d’ajuster votre estimation si le code s’aggrave.
Je me rends compte 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. S'il a juste besoin d'un chiffre à donner à son patron, vous pouvez légèrement gonfler les estimations et fournir un chiffre. Pour les clients qui attendent de payer votre code jusqu'à ce que cela soit fait, assurez-vous de savoir si les échéances exactes vont générer des revenus importants.
la source
Dans une situation comme celle-ci, je ne crois pas qu'il soit possible de donner de bonnes estimations. Le problème fondamental est que souvent, une grande partie de la tâche consiste à déterminer exactement ce qui doit être fait.
Je traite de tels cas en donnant une estimation basée sur ce que cela semble impliquer, mais avec le cavet, des surprises sont probables. Bien que je n’ai pas eu à traiter beaucoup de code hérité, j’ai eu de très mauvaises surprises concernant les entrées - j’ai vu quelques heures se transformer en quelques semaines et une fois en ceci, c’est impossible (After Je me suis rendu compte que je ne disposais pas de suffisamment de données dans certains cas, je suis revenu à la planche à dessin.) Heureusement, mon patron comprend quand je donne de telles estimations.
la source
Bien, l'estimation est une compétence que certaines personnes n'apprennent jamais bien. Cela ne vous rend pas inutile en tant que développeur, même si vous ne pouvez pas faire de bonnes estimations. Peut-être que les coéquipiers ou la direction combleront les lacunes. Je suis terrible, mais la plupart des équipes ont toujours aimé travailler avec moi. Restez calme, faites équipe et poursuivez le refactoring.
La dette technique vous donne de petits défis intéressants, mais rappelez-vous qu'une entreprise / équipe qui a fini par produire de la dette continuera à produire de la dette sauf en cas de modification de l'esprit d'équipe ou de la gestion. Le code ne fait que refléter les problèmes sociaux, alors concentrez-vous sur les vrais problèmes.
Nous avons utilisé une heuristique pour estimer les fonctionnalités d'un projet de friche industrielle: Nous avons estimé le temps qu'il aurait fallu pour implémenter cette fonctionnalité dans un projet greenfield sans aucune implémentation déjà implémentée. Nous avons ensuite multiplié cette estimation par 2 pour traiter le nettoyage des débris déjà existants.
Ce facteur dépend de la quantité de couplage et de la taille globale du code, mais si vous utilisez certaines fonctionnalités de cette façon, vous pouvez interpoler ce facteur en fonction de preuves réelles.
la source
Je pense que vous devriez vous asseoir avec votre patron, le regarder directement dans les yeux et dire:
Utilisez une gesticulation ferme et ferme, comme pointer du doigt, et asseyez-vous dans votre fauteuil.
Sinon, vous pouvez inventer des chiffres pour le rendre heureux. Mais avouons-le, jusqu'à la moitié du travail, vos estimations seront assez imprécises.
la source