Estimation des coûts de temps dans l'ancienne base de code

86

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?"

JuniorDev
la source
37
Faites des estimations avec des marges larges, pas avec des valeurs uniques; par exemple 5 à 15 jours
Richard Tingle le
32
@JuniorDev: pourquoi pensez-vous que c'est "inacceptable pour un chef d'équipe non technique"? Il n’est peut-être pas satisfait de votre réponse, mais si vous ne pouvez donner une meilleure estimation, c’est souvent de dire directement à la personne, au lieu d’essayer de lui plaire maintenant par une estimation trop basse et de lui dire au bout de 5 jours, désolé, nous n’avons complété que tâche à 30%.
Doc Brown
13
"Ce qui est sensé peut sembler entrer vraiment dans le code, noter chaque branche et appeler vers d'autres fonctions, puis estimer le coût en temps. Mais il y a vraiment une différence minime entre documenter l'ancien code et écrire réellement la nouvelle version." - hahahahahahahahahahahahahahahahahahahahahah il h. Cela peut donc sembler comme cela, mais lorsque vous nettoyez un code hérité, il s'avère que les bizarreries gèrent des problèmes dont vous n'aviez jamais entendu parler dans des cas que vous n'aviez jamais envisagés. Ou corrigez des bugs ailleurs. Ou sont un bogue, mais des bogues sur lesquels d'autres parties du code reposent.
Yakk
27
Je vais vous révéler un petit secret: si votre responsable demande à un développeur junior de faire une estimation technique, une des deux choses suivantes est vraie: il sait que vous ne savez pas comment faire une estimation réelle et le fait. une opportunité d’enseignement, ou il est un manager inexpérimenté et pense qu’un développeur junior peut le faire. Je n'ai jamais vu un jeune développeur capable de le faire, y compris (surtout?) Moi-même quand j'étais jeune développeur.
CorsiKa
27
6 à 8 semaines , comme nous le savons tous.
Matthieu M.

Réponses:

111

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:

  • un meilleur scénario - en supposant que tout se passe bien (a)
  • pire scénario - en supposant que tout se passe bien (b)
  • la conjecture réelle - ce que vous pensez qu'il faudra probablement (c)

Votre estimation est alors (a + b + 2c) / 4

  • Non, ce ne sera pas précis. Il existe de meilleures méthodes d’estimation, mais cette méthode est rapide, facile à comprendre et atténue l’optimisme en vous faisant envisager le pire des cas.
  • Oui, vous devrez expliquer à votre responsable que vous ne connaissez pas bien le code et qu'il est trop imprévisible pour vous de faire des estimations fermes et précises sans consacrer beaucoup de temps à l'examen du code pour améliorer l'estimation (offre de le faire mais disons que vous avez besoin de n jours pour donner une estimation précise du nombre de jours supplémentaires nécessaires). Si vous êtes un "JuniorDev", cela devrait être acceptable pour un manager raisonnable.
  • Vous devez également expliquer à votre responsable que vos estimations sont moyennées, en fonction du meilleur des cas, du pire des cas et du cas probable, et de leur donner vos chiffres, ce qui leur donne également les barres d'erreur.
  • NE négociez PAS sur une estimation - si votre responsable essaie d'utiliser la meilleure solution possible pour chaque estimation (c'est un imbécile - mais j'en ai rencontré d'autres), puis vous incitez à / vous motiver à respecter l'échéance, eh bien, ils allez être parfois déçu. Continuez à expliquer les raisons qui sous-tendent les estimations (dans le meilleur des cas, le pire et le probable) et continuez à vous rapprocher de la moyenne pondérée la plupart du temps, et tout devrait bien se passer. Aussi, pour vos propres besoins, gardez une feuille de calcul de vos estimations et ajoutez vos données réelles lorsque vous avez terminé. Cela devrait vous donner une meilleure idée de la façon d'ajuster vos estimations.

Modifier:

Mes hypothèses quand j'ai répondu à ceci:

  1. L'OP est un développeur junior (basé sur le nom d'utilisateur choisi). Les conseils donnés ne sont donc pas du point de vue du chef de projet ou du chef d’équipe, qui pourrait être en mesure de réaliser des estimations plus sophistiquées en fonction de la maturité de l’environnement de développement.
  2. Le gestionnaire de projet a créé un plan de projet comprenant un nombre assez important de tâches dont l'exécution devrait prendre plusieurs mois.
  3. Il est demandé au PO de fournir un certain nombre d'estimations pour les tâches qui lui sont assignées par son chef de projet qui souhaite disposer d'un nombre raisonnablement précis (et non d'une courbe de probabilité :)) pour alimenter le plan de projet et l'utiliser pour suivre les progrès.
  4. OP n'a pas plusieurs semaines pour produire chaque estimation et a déjà été brûlé en donnant des estimations trop optimistes. Il souhaite une méthode plus précise que de mettre le doigt dans l'air et de dire "2 semaines, à moins que le code ne soit particulièrement arcanique, auquel cas 2 mois ou plus".

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é:

  • Le meilleur des cas, d’expérience, le plus rapide que j’ai fait, c’était une semaine du début à la fin (5 jours)
  • Pire cas, par expérience, il y avait à cette époque qu'il y avait des liens partout et cela finissait par me prendre 6 semaines (30 jours)
  • Estimation réelle, il me faudra probablement 2 semaines (10 jours)

5 + 30 + 2x10 = 55

55/4 = 13,75, c’est ce que vous dites à votre premier ministre. Peut-être que vous arrondissez à 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 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.

mcottle
la source
31
"Ils sont idiots - mais j'en ai rencontré d'autres comme ça". En effet.
Kramii Réintègre Monica le
17
Je veux passer à autre chose, mais je ne peux pas me fier à une estimation ponctuelle.
RubberDuck
6
D'accord. +1 pour votre dernier point.
RubberDuck
5
+1, une estimation n'est pas une heure exacte et ne peut donc pas être un nombre unique. Cela vaut également la peine d’ajouter qu’il s’agit d’une estimation et non d’un engagement, le responsable ne doit donc pas s’attendre à ce que vous ayez fini. Il incombe à un ingénieur en logiciel de faire clairement comprendre la différence à son responsable.
Kat
10
@mcottle FYI ceci n'est pas une estimation de Monte Carlo. Vous avez simplement calculé la valeur attendue (qui ne fonctionnerait que 50% du temps) d'une distribution PERT. Monte Carlo fait référence à un processus dans lequel les valeurs statistiques sont dérivées essentiellement par la force brute avec un générateur de nombres aléatoires.
David Meister
30

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:

  • 0 - instantané
  • 0,5 - victoire rapide
  • 1 - changement simple
  • 2 - quelques changements simples
  • 3 - plus difficile
  • 5 - il faudra réfléchir
  • 8 - beaucoup de travail
  • 13 - un gros morceau de travail qui doit probablement être décomposé
  • 20 - une énorme quantité de travail qu'il faut absolument décomposer

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.

Amelvin
la source
Cela fonctionne mieux sur des projets de plus grande envergure (plus d'un mois). Sur des projets plus petits, cela ne pourrait fonctionner qu'après quelques projets similaires.
Emile Bergeron
1
@RobP. c'est une bizarrerie dans la progression agile des points de l'histoire: 13, 20, 40, 100 - bien que la plupart des gens ne se donnent pas la peine de fixer plus de 20 points, il est vraiment temps de les décomposer
HorusKol
1
Je ne suis pas d'accord pour dire que les points de l'histoire + les cérémonies = Agile.
Webdevduck
1
@webdevduck "pas d'accord d'accord"?
Krillgar
1
@ Krillgar D'oh! Être en désaccord!
Webdevduck
14

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.

  1. Estimation de logiciel: Démystifier l'art noir de Steve McConnell
  2. Travailler efficacement avec le code hérité de Michael Feathers

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.

Canard en caoutchouc
la source
1
+1 pour "le mettre dans un harnais de test." Lors de la refactorisation d'un ancien code, une approche test d'abord (pour vérifier que les composants critiques de l' ancien code fonctionnent exactement comme vous le pensez avant de modifier quoi que ce soit) est imbattable. Cette réponse m'a également convaincu d'acheter le livre "Software Estimation" dont je n'avais jamais entendu parler auparavant (mes estimations sont médiocres).
GlenPeterson le
7

Maintenant, mon patron me demande à juste titre une estimation du temps qu’il faudrait pour écrire la fonction X dans la nouvelle architecture. Mais j'ai du mal à faire une estimation réaliste; Souvent, je sous-estime la tâche pour des raisons que j'ai énumérées ci-dessus et je suis gêné car je ne peux pas terminer à temps.

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 :

  1. Estimation primaire - en supposant que je passe du temps à creuser mais que l'architecture permette les changements que nous souhaitons
  2. Estimation angélique - suppose que tout est transparent / facile à trouver et que je n’ai qu’à apporter des modifications mineures (c’est celui que j’écarte parfois ... surtout si je sais qu’il n’ya que des démons dans une base de code particulière)
  3. Estimation abyssale - suppose que la structure fondamentale du code hérité est incompatible avec la fonctionnalité demandée et que je devrai procéder à une refactorisation majeure pour que les choses fonctionnent correctement

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.

Jeutnarg
la source
+1 pour le dernier paragraphe - j'aurais aimé l'inclure dans ma réponse
mcottle
3

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:

  • Convaincre le patron que ces estimations sont mieux traitées comme une conversation, car vous en apprendrez plus sur la tâche en cours de travail. C'est une opportunité pour votre patron de disposer d'informations qu'ils n'auraient pas s'ils demandaient simplement une estimation.
  • Offrir des options sur la manière d’aller de l’avant à quelle vitesse de développement de code de commerce par rapport aux estimations améliorées. Donnez-leur un bouton supplémentaire, ils peuvent tourner. Parfois, les patrons savent qu’une tâche doit simplement être accomplie et qu’ils ont besoin d’une estimation approximative. D'autres fois, ils exécutent les avantages et les inconvénients d'une tâche, et la possibilité d'affiner les estimations est précieuse.
  • Si possible, je proposerai également des bonus de synergie. Souvent, des améliorations architecturales seraient bénéfiques pour de nombreuses tâches. Si j'ai 10 tâches qui prennent toutes "1 à 2 mois maintenant, mais 2 semaines avec la mise à niveau X", il est plus facile de vendre les 20 semaines nécessaires pour la mise à niveau X.

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 .

Estimez combien de temps vous pensez que la tâche devrait durer, puis quadruplez ce nombre et donnez-le comme estimation.

et

Loi de Hofstadter: "Cela prend toujours plus de temps que prévu, même en tenant compte de la loi de Hofstadter."

Cort Ammon
la source
2

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.

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.

JeffO
la source
Même si une compréhension profonde est nécessaire pour comprendre l'ancien code, il existe une grande différence entre documenter l'ancien code et obtenir du code nouvellement écrit au point qu'il ne présente plus aucun bogue.
Thorbjørn Ravn Andersen
1

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.

Loren Pechtel
la source
-1

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.

perruque
la source
-3

Je pense que vous devriez vous asseoir avec votre patron, le regarder directement dans les yeux et dire:

'Écoute patron! Nous ne faisons que refactoriser ici. Il n'y a pas de nouvelle fonctionnalité à fournir et aucun client n'attend cette fonctionnalité; donc il ne devrait pas y avoir de délais. Cela va prendre aussi longtemps que cela prend, vous devez décider si nous devons le faire ou non.

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.

Ewan
la source
3
-1 pour recommander ce qui est potentiellement un suicide professionnel. En outre, OP indique qu'il estime le travail des fonctionnalités, pas seulement la refactorisation du code existant.
RubberDuck
suicide de carrière OU passage au grand jeu
Ewan
Eh bien, c'est un bon point @Ewan. Je ne peux pas dire que je n'ai pas fait quelques choses qui semblaient être un suicide de carrière dans l'instant présent.
RubberDuck
Certaines choses ne peuvent être estimées. Communiquer peut être frustrant. Cela dit, j’ai rejeté cette question parce qu’elle se lit comme si vous suggériez que le PO essaie d’intimider son patron en le faisant croire. Je sais que cela se produit et que cela est peut-être même nécessaire dans une situation isolée et désespérée. Mais je ne veux pas travailler n'importe où, c'est la norme. Nous avons des désaccords au travail et nous nous énervons. Mais nous y parvenons en essayant de nous convaincre avec des données, des études et des récits. Une entreprise a plus de chances de réussir avec une culture de "la meilleure idée gagne" que "la personne la plus intimidante gagne".
GlenPeterson
1
c'est une réponse dans la langue. mais je le pense sérieusement. pourquoi le patron demande-t-il une estimation? aidez-vous la situation en estimant? son très bien ce 'read oncle bob' 'utilise les réponses de style séquence de Fibonacci'. mais ils ne vont pas à la racine du problème. le patron craint que cette refactorisation ne soit une perte de temps et veut que ce soit bientôt terminé
Ewan