Quantité de travail de routine dans le développement de logiciels et son effet sur l'estimation

11

Je suis convaincu que la quantité de travail de routine dans le développement de logiciels est - et devrait être - relativement faible, sinon négligeable, et que c'est le problème fondamental de l'estimation des logiciels.

Permettez-moi de décrire comment j'arrive à cette conclusion et de me dire si l'argumentation présente de sérieux défauts:

  1. Tout ce qui peut être estimé avec une grande précision est un travail de routine, c'est-à-dire des choses qui ont été faites auparavant. Tous les autres types de travaux impliquant la recherche et la créativité ne peuvent pas vraiment être estimés, du moins pas avec une précision de, disons, +/- 20%.

  2. Le développement logiciel consiste à éviter les tâches répétitives. L'un de ses principes de base est SEC (ne vous répétez pas). Chaque fois qu'un programmeur se retrouve à faire des choses répétitives, il est temps de trouver une abstraction qui évite cette répétition. Ces abstractions peuvent être des choses simples comme extraire le code répété dans une fonction ou le mettre en boucle. Ils peuvent également être plus complexes, comme la création d'un langage spécifique à un domaine. Dans tous les cas, leur mise en œuvre impliquera de la recherche (quelqu'un l'a-t-il déjà fait?) Ou de la créativité.

De ces deux points, je tire la conclusion ci-dessus.

En fait, je me demande depuis longtemps pourquoi cette relation n'est pas mentionnée dans toutes les autres discussions, articles de blog ou articles sur l'estimation de logiciels. Est-ce trop théorique? Mes hypothèses sont-elles fausses? Ou est-ce trop trivial - mais alors, pourquoi la plupart des développeurs que je connais croient-ils pouvoir faire des estimations avec une précision de +/- 20% ou mieux?

Frank Puffer
la source
7
99% de tous les développements de logiciels en dehors des zones comme les noyaux ont été effectués des milliers de fois auparavant. Beaucoup trop de développeurs veulent juste tout faire d'une nouvelle façon, réinventant les mêmes anciens problèmes encore et encore.
Bent
@Bent: Vous dites donc que le développement de logiciels se fait principalement par copier-coller? Je sais que de nombreux développeurs fonctionnent de cette façon et ont souvent constaté que cela conduisait à du code non maintenable. Mais c'est une autre histoire. Même si quelqu'un travaille de cette façon, il doit trouver quoi copier et d'où. C'est quelque chose que je considérerais également comme un travail de recherche.
Frank Puffer
1
@rwong: Bien sûr, il est logique d'utiliser des bibliothèques. Mais trouver la bonne fonction dans une bibliothèque et la bonne façon de l'utiliser est soit un travail de recherche (si la lib est complaex et / ou si vous ne la connaissez pas bien) ou trivial (si vous connaissez déjà cette fonction). Ce que vous appelez le «code de colle» est, selon mon expérience, souvent complexe. Sa mise en œuvre n'est pas un travail de routine nécessaire.
Frank Puffer
1
@ JohnR.Strohm: Je n'ai pas lu ces livres spécifiques mais je connais les bases de COCOMO - je ne l'ai cependant jamais utilisé dans la pratique. J'ai aussi lu deux ou trois autres livres de DeMarco. Pourriez-vous donner un indice sur le contenu spécifique lié à ma question?
Frank Puffer
2
@FrankPuffer, "Software Engineering Economics" de Boehm est une lecture obligatoire pour l'estimation de logiciels. Le livre de Demarco n'est pas loin derrière. La réponse COURTE est la suivante: si vous êtes assez familier avec ce que le logiciel doit faire pour l'estimer, vous le savez assez pour le considérer comme relativement routinier.
John R. Strohm

Réponses:

11

Pour tout projet donné, cela peut être vrai. Cependant, si vous travaillez sur plusieurs projets similaires pour différentes entreprises au fil des ans, vous pouvez vous retrouver à résoudre plusieurs fois le même problème avec de légères variations.

Par exemple, j'ai écrit des couches d'accès aux données tant de fois que je préfère maintenant le faire à la main plutôt que d'utiliser l'ORM populaire du mois. Il est plus rapide et plus facile pour moi de traiter les «problèmes de routine» avec des solutions connues que de trouver et de résoudre de nouvelles bizarreries dans les composants tiers.

Évidemment, je pouvais écrire mon propre ORM pour simplifier le code répétitif sans ajouter les bizarreries inconnues dans le système de quelqu'un d'autre, mais ce code appartiendrait à la société pour laquelle je travaillais à l'époque, et d'autres développeurs le trouveraient aussi bizarre que tout autre ORM tiers.

De même, d'après mon expérience, la plupart des programmes sont l'automatisation des processus métier et bien que chaque entreprise aime à penser que ses processus lui sont uniques; En réalité, ils ne le sont pas.

Pour ne pas dire que l'estimation est facile! C'est plus facile, mais je trouve que de nos jours le problème d'estimation est dû à l'insuffisance des exigences plutôt qu'au temps passé à coder.

Les exigences se répartissent généralement en trois catégories:

  1. Vague, détails laissés au développeur.

"Faites-moi un site web, ça doit être cool et vendre mes widgets"

Celles-ci ont tendance à être les plus faciles à estimer, car lorsqu'un problème grave et inattendu se produit, vous pouvez simplement changer les exigences en quelque chose d'équivalent fonctionnel et éviter le problème.

  1. Très spécifique

"Rendre la couleur d'arrière-plan de l'en-tête # ff1100"

Super rapide à faire et, encore une fois, facile à estimer. Mais! l'exigence est appelée à changer. "Hmm non à y réfléchir, essayez cet autre rouge" ou "Attendez! Je voulais dire seulement sur cette seule page!" donc la durée réelle de "combien de temps jusqu'à ce que je sois satisfait de la couleur de l'en-tête" n'a rien à voir avec les estimations de codage

  1. Vague, détails supposés

"Faites-moi un site Web, (tout comme Facebook)"

Ici, la multitude d'hypothèses non énoncées, "bien sûr, vous voudrez un logo différent", "il devrait avoir un défilement infini", "doit être évolutif pour 1 milliard d'utilisateurs!" contrôler efficacement l'estimation. Soit le développeur pense à tout et pousse l'estimation au-delà des attentes "1 meeelion d'heures de travail", soit il pense / suppose que seules les fonctionnalités de base sont nécessaires et donnent une estimation trop basse. "oh une semaine ou deux, je suppose que tu veux juste mettre facebook dans un iframe non?"

Avec l'expérience, le codage est très rapide, mais la conception des exigences est (généralement) difficile, et cela est de plus en plus repoussé aux non-codeurs. Les méthodologies agiles augmentent la vitesse de codage en déplaçant cette responsabilité vers «l'entreprise» plutôt que vers les développeurs.

Ewan
la source
Je suis absolument d'accord avec ce que vous avez écrit sur les exigences inadéquates, mais c'est une autre histoire. Dans la première partie de votre réponse, vous dites que vous continuez souvent à utiliser des techniques bien connues afin qu'une plus grande partie de votre travail devienne routinière. Vous le faites délibérément sans abstractions supplémentaires. Cela fonctionne probablement bien pendant une courte période, peut-être 2 à 5 ans, selon les technologies que vous utilisez. Mais vous remarquerez peut-être que vous n'avez pas amélioré votre processus autant que certains de vos concurrents. De plus, d'autres développeurs qui conserveront votre code plus tard pourraient avoir un problème.
Frank Puffer
Évidemment, ce n'est pas comme si je n'utilisais jamais de trucs tiers. Le fait est que si vous savez déjà faire quelque chose avec l'outil X, l'estimation est facile
Ewan
Non seulement l'estimation mais aussi la mise en œuvre devient facile dans ce cas. Si tout votre projet est comme ça, vous avez de la chance. Mais d'après mon expérience, cela ne se produit que dans les petits projets. Tous les projets plus importants (> 10 jours) auxquels j'ai participé nécessitaient de nouveaux concepts ou technologies et c'est ce qui a causé la plupart du travail, ce qui rend l'effort pour les choses standard négligeable.
Frank Puffer
Permet de ne pas entrer dans une guerre de flamme «qui est le meilleur programmeur». Tout ce que je dis, c'est que plus vous avez fait de choses avant moins de nouvelles choses. Si tous vos projets exigent l'utilisation de nouvelles technologies pour la plupart des fonctionnalités ... Cela semble étrange
Ewan
@Ewan "concepts ou technologies". Pour moi, la première a tendance à se rapporter aux règles métier et / ou à ce que veut le designer. Il ne s'agit pas seulement des nouvelles technologies.
Izkata
6

Pourquoi la plupart des développeurs que je connais croient-ils pouvoir faire des estimations avec une précision de +/- 20% ou mieux?

Parce que nous estimons notre patience avec le problème beaucoup plus que le problème réel.

Si je vais animer une balle qui rebondit, je pourrais y passer une journée, une semaine, un mois ou un an et avoir toujours une animation d'une balle qui rebondit. J'espère que ça ira mieux avec le temps que j'y consacre, mais à un certain point, je suis ridicule.

L'effort que je déploie pour faire rebondir la balle est fonction du temps qu'il est raisonnable d'y consacrer. Si mon niveau de compétence ne le coupe pas, je peux me retrouver avec une balle qui reste là. Mais lorsque la date limite arrive, dois-je la laisser glisser ou au moins avoir une balle sur l'écran? Waterfall a insisté pour que le ballon rebondisse et le calendrier a donc glissé. Agile dit qu'il suffit de sortir le ballon. Au moins, nous découvrirons à quel point les gens se soucient du rebond. La qualité a donc chuté.

J'essaie d'être sûr que mes balles rebondissent mais quand la date limite arrive, il vaut mieux produire une balle statique que rien du tout. J'évalue donc le temps en fonction de ce qui semble être un temps raisonnable à consacrer à un problème avant de parler d'alternatives. Parfois, la balle ne va tout simplement pas rebondir. Parfois, ça va. Disparaître pendant un mois n'est pas OK.

candied_orange
la source
Bon point, donc fondamentalement, vous dites que l'estimation doit être basée sur la valeur d'une certaine fonctionnalité pour le client (ou le propriétaire du produit). Personnellement, j'aime cette approche, mais d'après mon expérience, ce n'est pas ainsi que l'estimation du logiciel est généralement comprise, même dans un environnement agile. Un inconvénient est que, souvent, vous ne disposez pas de ces informations sur la valeur client d'une fonctionnalité. Un autre inconvénient est qu'il ne peut pas gérer les lots de travaux qui ne donnent pas directement lieu à une fonctionnalité visible par le client.
Frank Puffer
@FrankPuffer Je ne suis pas d'accord sur le fait que les méthodes agiles ne rendent pas cela clair. SCRUM en particulier ne demande même pas aux développeurs d'estimer jusqu'à ce que la valeur de la fonctionnalité soit si élevée qu'elle soit réellement planifiée, c'est-à-dire juste dans le temps. Les méthodes agiles sont particulièrement adaptées à cela: identifiez d'abord les fonctionnalités ayant la valeur commerciale la plus élevée, puis estimez-les, puis faites-les, et voyez combien de temps cela a réellement pris. Faire mousser à nouveau. Après quelques cycles, vous aurez une très bonne idée de l'estimation par rapport au temps de développement réel.
RibaldEddie