web-dev-qa-db-fra.com

Quelle est une bonne analogie pour expliquer comment le développement logiciel est différent de la construction d'un pont?

Si vous aviez un gestionnaire, quelques niveaux au-dessus de vous, vous indiquez que le logiciel de construction est comme créer un pont, comment réagiriez-vous cela?

Si ce responsable croit vraiment que nous devrions être capables d'estimer avec précision et de construire un système, quelles sont les bonnes métaphores à expliquer pourquoi ce n'est pas le cas?

10
Bob Horn

J'embrasserais la métaphore et il suffit de souligner où les pratiques de renforcement des pont normales diffèrent des pratiques de développement de logiciels normales.

Les exigences du pont sont bien définies à l'avance et ne changent pas pendant la construction. Personne ne pense à déplacer le point de départ ou de fin du pont à mi-chemin à travers la construction. Personne ne s'attend à ce qu'un pont routier aide à soutenir par magie un train ou à faire de l'appui d'une route rurale à deux voies à une surhomme de huit voies. Il est beaucoup plus facile de faire des projections précises lorsque vous savez à l'avance exactement ce que vous êtes invité à projeter plutôt que de faire des suppositions et de faire face à des changements constants.

La grande majorité des ponts utilisent des matériaux, des architectures et des techniques extrêmement véridiques. Un ingénieur romain pourrait être transporté deux mille ans à l'avenir et reconnaître généralement ce qui se passait sur un chantier de construction moderne. Bien sûr, il y aurait des différences, mais vous construisez toujours des arches à l'équilibrage de la charge, vous utilisez toujours nombre des mêmes matériaux, etc. La plupart des logiciels en construction, d'autre part, impliquent beaucoup de nouveauté. Si vous vouliez une pièce de logiciel "standard", vous l'achetiriez plutôt que de la construire, donc si vous avez fait le choix de construire quelque chose, cela implique fortement qu'il soit roman d'une manière ou d'une autre. La nouveauté introduit un risque, mais que la nouveauté est également, probablement, qu'est-ce qui fournit de la valeur.

C'est aussi un peu un mythe que les projets de génie civil sont toujours estimés avec précision. La plupart des projets de construction finissent par prendre plus de temps et coûtent plus que les projections initiales. Le gros creuser à Boston , par exemple, était plus d'une décennie par rapport à la planification et coûtait bien plus de deux fois le montant initial (plus si vous ne vous ajustez pas pour l'inflation). Et très, très peu de gens qui ont déjà construit une maison vous indiqueront comment ils ont été agréablement surpris que tout soit achevé à temps et au budget.

16
Justin Cave

Essentiellement, vous demandez quelle est la différence entre un processus d'ingénierie et un processus de développement de logiciels. Et là sont un certain nombre de différences significatives.

  1. La différence top est le degré de contraintes ou exigences appliquées contre le produit final.

    • Un pont a des contraintes fixes. "L'écart de pont est ### mètres de large."
    • Les projets logiciels sont notoires pour la fluidité de leurs contraintes. Les mots de passe de la semaine dernière doivent être de 4 caractères. Cette semaine, il est maintenant 12.
  2. La prochaine différence est le corpus de connaissances Entourant les matériaux utilisés pour construire le produit final.

    • Le béton, l'acier et le bois sont tous des matériaux bien recherchés et compris. Une barre de béton de 18 "renforcée avec une barre d'acier de 3/4" à des intervalles ### aura des propriétés distinctes et fixes.
    • Avec des logiciels et parce que vous venez de clignoter, votre cadre préféré a une nouvelle version majeure publiée. La langue que vous utilisez a introduit un nouveau concept ou une nouvelle approche de programmation. Les propriétés des outils logiciels sont de manière significativement plus fluide.
  3. Ensuite, considérons le degré de Spécificité entourant les exigences.

    • En plus d'être fixes, les exigences sont plus faciles à dicter avec un processus d'ingénierie. La longueur du pont peut être spécifiée. Le tonnage minimum qu'il doit soutenir peut (et la volonté!) Être spécifié. Ces spécifications ont des valeurs numériques fixes et numériques. La vérification de l'exigence est plus simple d'exécuter dans le processus d'ingénierie.
    • Envisagez maintenant d'une interface utilisateur logicielle et de la manière dont la terminologie est fluide avec la spécification de la manière dont il devrait ressembler et être "réactif".
  4. Ensuite, examinez la répétabilité du processus.

    • La connaissance de la transaction des processus d'ingénierie est beaucoup plus élevée que celle des processus logiciels. De plus, la construction d'un pont donné est assez dang semblable à la construction de tout autre pont. C'est un domaine assez bien fixe.
    • Logiciel ... pas tellement. Bien que nous ayons des modèles de simplification et de réduction de la complexité des tâches répétées, des modèles restent à un niveau beaucoup plus abstrait que ce qu'est un processus de conception d'ingénierie.
  5. Enfin, considérons le niveau de documentation et de révision.

    • Construire un pont nécessite un nombre incroyable de plans, de schémas et de dessins associés. Heck, il y a des conceptions juste pour montrer des éléments spécifiques (tels que l'acier) pour la structure.
    • À quand remonte la dernière fois que vous avez vu ce degré de documentation sur un produit logiciel? Si jamais que vous ayez, c'était une méthodologie de cascade qui est souvent décrite comme "lente" et "impraticable". Combien de fois vos documents de conception de logiciels ont-ils été examinés par une tierce partie externe avant votre construction? Comment réagiriez-vous de devoir attendre de recevoir un permis avant de pouvoir commencer à coder?

Il y a de la valeur dans la métaphore de la construction de projets de construction et de la construction de logiciels. Mais il est important de ne pas prendre cette métaphore trop loin.


Vous avez demandé spécifiquement d'estimer et de construire des systèmes.

L'estimation du côté logiciel est plus compliquée en raison du manque de spécificité concernant le projet. Le manque de répétabilité entrave également également l'estimation car les projets logiciels sont presque toujours la première fois que vous avez construit quelque chose comme ça. Les estimations de votre premier projet de ce type vont toujours subir un degré d'erreur.

Construire des estimations souffrent de la nature changeante des contraintes/exigences. Parce que c'est apparemment si facile de modifier les spécifications logicielles, nous ne réalisons pas l'impact de cette demande de changement. Du point de vue de l'ingénierie, la construction de logiciels peut tolérer un degré de changement de changement incroyable et survivre toujours. Pas ainsi avec un projet d'ingénierie traditionnel - vous devez rejeter la demande de changement ou commencer le projet.

Construire des estimations souffrent également de la nature changeante du corps de la connaissance. Devoir constamment chasser pourquoi la fonctionnalité XYZ ne fonctionne pas empêche le temps de développement et la capacité de faire des estimations précises. Guérit de manière concrète de manière systématiquement prévisible. La mise en place d'un ensemble de panneaux d'interface utilisateur n'est nulle part que prévisible.


( Disclaimer:

  1. Bien que je suis ingénieur, aucune de mes réponses ne devrait être interprétée comme une opinion professionnelle et d'ingénierie.

  2. Pendant que je travaille pour une entreprise d'ingénierie, mes commentaires ne représentent pas nécessairement ceux de mon employeur.

  3. Mon origine est en développement de logiciels, pas de processus d'ingénierie. Appliquez une bonne dose de scepticisme et de modération à mes commentaires concernant le processus d'ingénierie.

10
user53019

Il y a beaucoup de façons dont ils sont les mêmes: les deux sont construits sur des spécifications, pas de masse produite, à la fois un degré de planification, d'estimation et d'expertise technique, et les deux nécessitent l'application de principes simples à plus grande échelle. Cela rend la comparaison plus appropriée que, disons, fabrication de lignes de montage.

Pour moi, les plus grandes différences sont le degré de précision requis dans l'ingénierie logicielle et la facilité de modification du produit fini. Cela crée une vaste différence dans la manière dont les erreurs de conception et de mise en œuvre sont comptabilisées.

En ce qui concerne la précision, si une poutre classée à 3 tonnes ne peut en réalité que 5999 livres, votre pont restera toujours. Si vous obtenez un peu mal de gigaoctets, il peut apporter une application logicielle entière vers le bas. Vous ne pouvez pas simplement faire ce bit deux fois aussi fort que nécessaire. C'est soit bon ou mal.

Heureusement, quand un bit incorrect est découvert, il est relativement facile de changer. Si vous ne découvrez pas une faille dans votre conception de pont avant sa construction, elle peut être extrêmement coûteuse à réparer.

C'est ce qui rend les processus si différents. Si vous avez testé des ponts comme vous avez testé le logiciel, vous le construirez, puis causer des ouragans, des tsunamis, des tremblements de terre et une chaleur extrême et froid pour voir si elle se trouve toujours. Après la reconstruction et le réessayer plusieurs fois, cela réussirait enfin les tests et vous commenceriez à laisser les gens conduire dessus. Ensuite, vous découvrirez que les voitures bleus font s'effondrer le pont et vous la reconstruiriez à nouveau. Ensuite, un client se plaint de ce que la conception de Golden Gate Bridge ne fonctionne pas lorsqu'il essaie de le copier pour un pont à Hawaii, et le marketing s'attendrait à ce que vous le faisiez fonctionner pour le même coût, car il semble que le problème soit exactement le même.

4
Karl Bielefeldt

Les exigences relatives à un pont sont probablement beaucoup moins sujettes aux changements d'utilisateurs. J'imagine que si c'est un très Complexe Bridge, vos utilisateurs voudront qu'il fasse la même chose, tout au long du projet.

Je suppose que d'une manière d'une certaine manière, plus détaillée requise pour un pont pourrait Changement (comme le changement de capacité de charge maximale, nombre de voies et trottoirs, hauteur du pont, points de terminaison du pont), mais j'imagine que certaines de ces choses sont beaucoup plus difficiles à changer après la construction d'un pont a commencé. Et finalement, un pont est toujours un pont - il vous amène d'un côté d'une caractéristique géographique à une autre. Je ne pense pas que quiconque déciderait à mi-chemin du projet de pont qu'il devrait maintenant être une tour de radio ou une ferme de poulet.

Une autre pensée: dans des logiciels, la concurrence avec des marchés similaires peut conduire des délais et des exigences. Je ne vois généralement pas de ponts construits tous à côté de l'autre en compétition pour avoir accès (et où je vis, ils sont construits par des agences gouvernementales en charge des infrastructures).

De plus: je ne sais pas combien de ponts reçoivent des dates de sortie, puis racontées de les coller. J'aimerais penser qu'un pont ne sera pas ouvert à la circulation avant d'avoir été minutieusement testé de manière à ce qu'il soit connu de ne pas s'effondrer lorsque les gens l'utilisent. Je souhaite que la même chose puisse être dite sur les logiciels, mais pour la plupart des logiciels (systèmes critiques exclus, bien sûr), le coût dans la vie des "bugs" et des défauts est beaucoup plus bas.

Disclaimer: Je ne suis pas un ingénieur et je n'ai jamais construit un pont