Pourquoi ne pouvons-nous pas capturer la conception de logiciels plus efficacement? [fermé]

14

En tant qu'ingénieurs, nous "concevons" tous des artefacts (bâtiments, programmes, circuits, molécules ...). C'est une activité (conception-le-verbe) qui produit une sorte de résultat (conception-le-nom).

Je pense que nous sommes tous d'accord pour dire que design-the-noun est une entité différente de l'artefact lui-même.

Une activité clé dans le secteur des logiciels (en effet, dans toute entreprise où l'artefact produit résultant doit être amélioré) est de comprendre la «conception (le-nom)». Pourtant, nous semblons, en tant que communauté, être à peu près des échecs complets à l'enregistrer, comme en témoigne la quantité d'efforts que les gens mettent pour redécouvrir des faits sur leur base de code. Demandez à quelqu'un de vous montrer la conception de son code et de voir ce que vous obtenez.

Je pense qu'une conception de logiciel a:

  • Une spécification explicite pour ce que le logiciel est censé faire et dans quelle mesure il le fait
  • Une version explicite du code (cette partie est facile, tout le monde l'a)
  • Une explication de la façon dont chaque partie du code sert à atteindre la spécification (par exemple, une relation entre les fragments de spécification et les fragments de code)
  • Une justification pour expliquer pourquoi le code est tel qu'il est (par exemple, pourquoi un choix particulier plutôt qu'un autre)

Ce qui n'est PAS une conception est une perspective particulière sur le code. Par exemple [ne pas choisir spécifiquement] les diagrammes UML ne sont pas des conceptions. Ce sont plutôt des propriétés que vous pouvez dériver du code, ou sans doute, des propriétés que vous souhaitez que vous puissiez dériver du code. Mais en règle générale, vous ne pouvez pas dériver le code d'UML.

Pourquoi est-ce qu'après plus de 50 ans de construction de logiciels, pourquoi n'avons-nous pas des moyens réguliers d'exprimer cela? (N'hésitez pas à me contredire avec des exemples explicites!)

Même si nous le faisons, la plupart de la communauté semble tellement concentrée sur l'obtention de "code" que design-the-noun se perd de toute façon. (À mon humble avis, jusqu'à ce que la conception devienne le but de l'ingénierie, avec l'artefact extrait de la conception, nous n'allons pas contourner cela).

Qu'avez-vous vu comme moyen d'enregistrer des dessins (dans le sens où je l'ai décrit)? Des références explicites aux articles seraient bien. Pourquoi pensez-vous que les moyens spécifiques et généraux n'ont pas réussi? Comment pouvons-nous changer ceci?

[J'ai mes propres idées qui étoffent le point de vue ci-dessus, mais je suis intéressé par les réponses des autres ... et c'est difficile de mettre en œuvre mon schéma [[et c'est peut-être le vrai problème: -]]]

EDIT 2011/1/3: L'un des fils de réponse laisse entendre que la «documentation» (vraisemblablement textuelle, en particulier non formelle) pourrait être adéquate. Je suppose que je devrais préciser que je ne le crois pas. Les outils CASE sont apparus sur la scène à partir des années 80, mais les premiers outils ont principalement capturé des pixels pour les diagrammes de tout ce que vous avez dessiné; Bien que les outils aient sans doute réussi sur le plan commercial, ils n'étaient vraiment pas très utiles. Un aperçu clé était que si les artefacts de "conception" supplémentaires ne sont pas formellement interprétables, vous ne pouvez pas obtenir d'aide sérieuse sur les outils. Je crois que la même idée s'applique à toute forme utile de capture de conception à long terme: si elle n'a pas de structure formelle, elle ne sera pas vraiment utile. Les documents texte échouent à peu près à ce test.

Ira Baxter
la source
1
Convenu sur UML - un outil de communication au mieux, contribuant à la description de la conception, mais n'étant pas en soi la conception. Au pire, cependant, UML est un code source graphique.
Steve314
quantifier "comment il le fait"
Steven A. Lowe
Quand je construis des systèmes, j'ai rencontré beaucoup d'exigences "non fonctionnelles": codé dans cette langue, utilise cette base de données, gère les enregistrements 1E10 avec un temps de réponse moyen de 100 ms, ... Vous ne pouvez pas les laisser hors de la spécification. (Sans exigences non fonctionnelles, une boucle permanente est un programme adéquat pour toute spécification fonctionnelle). Mon point sur la capture "design" est de gérer une autre exigence non fonctionnelle: "maintenable".
Ira Baxter
Votre discussion semble intéressante, mais je ne sais toujours pas sur quoi porte exactement la question. Pensez-vous que vous pourriez essayer de donner quelque chose comme un exemple concret ou quelque chose pour clarifier ce qui vous intéresse exactement. Je pense à quelque chose comme l'exemple FFT où vous pouvez donner une image complète des 4 points de votre question comme vous les voyez et peut-être quel genre de choses que vous aimeriez faire avec les résultats une fois capturés.
n1ckp
Je n'ai aucune idée du pourquoi de ce problème, mais c'est le sujet de Fred Brooks "The Design of Design" . (Excuses si vous êtes déjà familier.) Il discute des exemples de programmation et d'architecture. Il note en particulier que la capture des justifications (pour la conception et les conceptions alternatives rejetées) est vraiment utile et mal servie par les outils actuels.
Paul D. Waite

Réponses:

8

Je pense qu'il y a plusieurs raisons pour lesquelles nous ne sommes toujours pas bons dans ce domaine.

  1. Les gens ont longtemps pensé que les logiciels étaient comme des maisons et utilisaient des processus et des idées issus de la construction. "Architecte logiciel" était un titre recherché par tous les programmeurs. Au cours des dix dernières années, l'architecte logiciel a presque disparu. L'idée de processus en cascade où vous avez d'abord un architecte disant comment le logiciel devrait fonctionner et ressembler, puis amener les gens à faire des diagrammes de la façon dont il devrait être construit et enfin avoir un singe de code implémentant ces beaux diagrammes de flux de travail / UML à spécifier, cette idée est maintenant largement tourné en dérision. Donc, en fait, toute l'industrie a suivi la mauvaise voie pendant 40 ans.

  2. Les outils que nous utilisons changent et s'améliorent constamment. La programmation est un puzzle logique, et nous proposons de meilleures idées et techniques pour résumer ce puzzle et le rendre compréhensible. La façon dont nous modélisons cela doit évoluer à la même vitesse, mais elle est à la traîne. Les techniques améliorées pour résumer le puzzle de la programmation signifient également que nous pouvons augmenter la complexité. Et c'est ce que nous faisons. La programmation se situe toujours aux limites de la complexité que nous, en tant que programmeurs, pouvons gérer.

  3. Trouver des façons de décrire le programme est une sorte d'abstraction. Si nous pouvons trouver un bon moyen d'abstraire le logiciel, nous pouvons également mettre cette abstraction directement dans les outils de développement, et donc ajouter une autre abstraction / simplification à la programmation. Cela s'est produit plusieurs fois. Des exemples de telles abstractions sont les fonctions, les classes et les bibliothèques.

  4. Donc; Si vous disposez d'un modèle de logiciel réussi et précis , ce modèle sera équivalent au logiciel. Ce qui rend tout l'effort inutile, ce qui corrobore à son tour le point 1 ci-dessus: La modélisation du logiciel est beaucoup moins utile qu'on ne le pensait auparavant. Il est plutôt préférable d'extraire des données sur le logiciel du code. Créer un modèle UML à partir de l'apparence réelle du code est beaucoup plus instructif que de créer un modèle UML et d'essayer de mettre en œuvre ce modèle théorique.

Lennart Regebro
la source
2
Ne suis pas d'accord avec votre dernier point. Oui, ce sera plutôt équivalent au logiciel, mais il est toujours plus facile de redessiner un modèle que de refactoriser le logiciel réel quand (pas si) vous avez découvert que quelque chose n'était pas une si bonne idée après tout. Je ne sous-estimerais pas l'importance de l'étape de conception.
Joris Meys
1
@Joris Meys: Le problème est que vous ne saurez quoi et ce qui n'est pas une bonne idée tant que vous ne l'avez pas mise en œuvre. (Sauf dans les cas triviaux, mais vous n'aurez alors pas beaucoup recours à un diagramme UML). Vous ne devez pas non plus surestimer la difficulté de refactoriser le code. Je recommande de lire les livres de Kent Becks sur XP et Test Driven Design.
Lennart Regebro
@Lennart: merci pour la pointe
Joris Meys
2
@Lennart: La différence entre vous et Job est que vous semblez convenir qu'une spécification exprimée pourrait être nécessaire, bien que je ne sache pas comment votre ensemble d'abstractions actuellement programmables fait cela. Mais imaginez que j'ai besoin d'un programme de traitement du signal qui extrait les fréquences principales. Remarquez que je n'ai pas suggéré comment. Vous pourriez décider d' utiliser une transformation de Fourier rapide, et je trouverai sûrement des empreintes de pas partout dans le code qui implémente les bits FFT. Mais où est le fait que vous ayez décidé d'utiliser une FFT explicitement enregistrée? Je crois que vous en avez besoin à moins que vos lecteurs ne soient omniscients.
Ira Baxter
1
@Ira Baxter: Que diriez-vous "Nous avons choisi de mettre en œuvre le traitement du signal avec FFT"? Le code source a des commentaires, vous savez. Et je peux aussi l'écrire dans un fichier README. L'expression explicite de spécification est le code. Les lignes de texte comme "Nous avons choisi de l'implémenter avec FFT" ne sont pas explicites, ni de conception dans le sens de votre message d'origine. C'est la documentation de l'implémentation. Vous semblez vous être retrouvé dans un mode argumentatif, mais je ne comprends pas contre quoi vous essayez de vous opposer.
Lennart Regebro du
5

Vous pourriez être intéressé à consulter la documentation sur la traçabilité des logiciels. Dans aucun ordre particulier:

  • CUBRANIC, D., MURPHY, GC, SINGER, J., ET BOOTH KELLOGG, S. Hipikat: une mémoire de projet pour le développement de logiciels. Transactions on Software Engineering 31, 6 (2005), 446–65.
  • TANG, A., BABAR, MA, GORTON, I., ET HAN, J. Enquête sur l'utilisation et la documentation de la justification de la conception de l'architecture. In Proc of the 5th Working IEEE / IFIP Conference on Software Architecture (2005).
  • RAMESH, B., POWERS, T., STUBBS, C., ET EDWARDS, M. Mise en œuvre de la traçabilité des exigences: une étude de cas. In Proc of the Int'l Symp on Requirements Engineering (York, 1995).
  • HORNER, J., ET ATWOOD, ME Justification de la conception: la justification et les obstacles. In Proc of the 4th Nordic Conference on Human-Computer Interaction: Changing Roles (Oslo, Norvège, 2006).
  • CLELAND-HUANG, J., SETTIMI, R., ROMANOVA, E., BERENBACH, B., ET CLARK, S. Meilleures pratiques pour la traçabilité automatisée. Computer 40, 6 (juin 2007), 27–35.
  • ASUNCION, H., FRANÇOIS, F., ET TAYLOR, RN Un outil de traçabilité logicielle industrielle de bout en bout. In Proc of the 6th Joint Meeting of the European Software Eng Conf and the ACM SIGSOFT Int'l Symp on the Foundations of Software Engineering (ESEC / FSE) (Dubrovnik, 2007).

Notez que ce n'est que la pointe de l'iceberg, et je suis sûr que j'ai oublié certains documents clés.

Sur une note distincte, mon propre travail sur Arcum était un moyen pour les programmeurs d'exprimer à l'IDE l'utilisation d'idiomes de conception transversaux. Une fois exprimé, les programmeurs pourraient ensuite transformer leur code source pour utiliser des implémentations alternatives:

Soit dit en passant, Arcum est également lié à votre travail DMS.

Macneil
la source
1
+1 pour cela. La RT n'est pas tout, mais c'est l'une des nombreuses étapes positives vers la résolution du problème au lieu de lui faire les mêmes vieilles excuses.
Aaronaught
2

UML est à un programme ce que les plans sont à un bâtiment à mon humble avis. Les plans seuls ne sont pas une conception hors cours, vous avez besoin de spécifications de matériaux (outils de code utilisés) pour cela, d'une vue générale du bâtiment (une représentation schématique de l'ensemble du logiciel, y compris des conceptions GUI), de la façon dont le bâtiment est planté dans les environs (un schéma clair de la façon dont le logiciel interagit avec les autres / est planté dans le système d'exploitation), comment il se présente au climat et au sol (interaction avec le matériel), ... Beaucoup de livres sur le design essaient de le définir, mais comme avec beaucoup de choses en science, chaque scientifique a un peu sa propre définition.

Maintenant, je ne suis pas d'accord non plus avec votre observation selon laquelle vous ne pouvez pas dériver le code d'UML. Vous pouvez, si vous disposez des informations complémentaires mentionnées. Mais le vrai code n'est plus la conception, c'est l'artefact. Vous ne pouvez pas non plus extraire les vraies pierres et le béton d'un plan, mais vous avez besoin du plan pour mettre les vraies pierres et le béton dans la bonne forme et au bon endroit.

Dans cette optique, j'ai trouvé l' article suivant intéressant (je l'ai rencontré dans un contexte différent lorsque je cherchais un logiciel graphique, mais néanmoins ...). L'approche graphique pour décrire un design avait du sens pour moi, même si - encore une fois - ce n'est qu'une partie du design à mon avis. La chose intéressante est que cette approche donne un cadre pour comprendre et refactoriser les conceptions (par opposition à refactoriser le logiciel), comme indiqué dans les articles suivants:

Il existe de nombreuses autres approches pour décrire (une partie de) la conception, comme la conception structurée (cartes HIPO) ou la conception de programmes intégrés , les modèles de conception , ...

Pourtant, tant qu'il n'y a pas d'ensemble standard de l'industrie, il est peu probable d'avoir une façon «régulière» d'exprimer cela. Même après 50 ans et plus. Et soyez honnête, si votre entreprise trouve un bon moyen d'exprimer un design, le partagerez-vous avec le monde?

Joris Meys
la source
Si votre entreprise trouve un bon moyen de le faire, les programmeurs le diront rapidement à tout le monde. :-)
Lennart Regebro
Je pense que vous manquez mon point sur UML (et toute autre notation "unique"). UML-before-code est une contrainte sur la façon dont vous voulez construire le logiciel. Il en va de même pour toutes les autres notations (oui, j'en ai vu beaucoup, j'y suis depuis un certain temps). Étant donné une contrainte, il est sans doute possible de produire du code respectant cette contrainte (méthode de plaisanterie: produire tous les programmes possibles et vérifier ceux qui correspondent à la contrainte, choisissez-en un). En ce sens, vous pouvez "générer du code à partir d'UML". Mais (si nous nous en tenons aux diagrammes de classes), ce code n'implémentera pas la fonction que vous voulez ...
Ira Baxter
... et la plupart des autres schémas de notation en souffrent également, ils ne capturent pas vraiment une spécification de ce que le programme est censé faire. Ils ne fournissent pas non plus une justification; pourquoi votre graphique UML a-t-il la forme? Quelle partie du code puis-je modifier sans casser le graphique? Puis-je changer de manière à ne pas nuire à l'intention derrière le graphique?
Ira Baxter
@Ira: Après avoir visité votre page Web, c'est devenu plus clair pour moi. Mais je dois admettre qu'une discussion sémantique de haut niveau sur ces questions dépasse ma compétence. Pourtant, si vous considérez le vrai code comme faisant partie de la conception, alors où est l'artefact réel? UML - ou toute autre notation - est à mon humble avis un plan de la structure du code, et c'est quelque chose que j'aime appeler une partie de la conception. Plus que le code réel en fait. attention à la partie . Ce n'est pas le design, mais c'est quand même une contribution essentielle. encore une fois, à mon humble avis. La justification, etc. peut être ajoutée à cela comme expliqué.
Joris Meys
@Joris: La plupart des notations schématiques peuvent être considérées comme des projections (artefacts inférés) à partir du code (au moins après sa fin) ou pourraient être considérées comme des conseils pour la construction du code (plan directeur). Il existe de nombreux diagrammes possibles (certains répertoriés dans votre réponse). Lesquels sont fondamentaux pour le code dont vous disposez et quels sont simplement les accidents? Les organigrammes sont des digrammes, ils doivent donc être qualifiés; Pourtant, je suis assez confiant que les organigrammes d'un morceau de code ne seraient pas considérés comme faisant partie de sa conception. Alors, qu'est-ce qui est fondamental? Qu'est-ce qui est accidentel?
Ira Baxter
2

D'après ma propre expérience personnelle, je dirais que nous sommes bien capturer la conception de logiciels. Nous avons une base de données de documents d'exigences et de conception pour chaque fonctionnalité que nous avons jamais implémentée sur notre plateforme. Je suppose que ma circonstance est peut-être unique. Voici quelques éléments auxquels penser.

Chaque personne de mon équipe a un diplôme d'ingénieur ... principalement EE ou CE. L'ingénierie vous apprend la conception dans le cadre du programme d'études.

Je pense qu'il y a beaucoup de soi-disant ingénieurs logiciels qui viennent d'horizons CS. La conception de logiciels ne fait pas partie intégrante de la plupart des programmes CS. Je ne dis pas que toutes les majors CS sont mauvaises en conception, mais je parierais que la plupart n'ont aucune éducation formelle qui leur a enseigné. Je pense que beaucoup de gens supposent que si vous pouvez programmer, vous pouvez concevoir un logiciel, ce qui n'est pas vrai. Étant donné que de nombreux programmeurs n'ont pas de formation en ingénierie, il n'est pas vraiment surprenant que de nombreux projets logiciels ne disposent pas d'une équipe capable de capturer la conception.

Pemdas
la source
Quelle méthode spécifique de rédaction des exigences et des documents de conception utilisez-vous? (J'ai regardé votre biographie et je m'attendais à voir quelqu'un de l'espace de défense et j'ai été surpris). Je suppose par exigences que vous voulez dire du texte en langage naturel? ... si oui, vous n'avez aucun argument à leur sujet? (Je distingue les exigences du langage naturel des spécifications formelles). Sont-ils complets? Et les documents de conception? Sont-ils complètement à jour pour le système d'expédition actuel? Je conviens que beaucoup de soi-disant programmeurs et ingénieurs logiciels ne le sont pas, donc nous pouvons nous en tenir à discuter de ceux qui devraient le faire.
Ira Baxter
1
Je ne suis pas sûr qu'il y ait un nom spécifique à notre méthode. Nos exigences sont ce que j'appellerais un hybride entre les exigences du langage naturel et des documents de conception de haut niveau. Nous avons généralement deux séries de modifications. Tout d'abord, nous documentons ce qu'une fonctionnalité doit faire en anglais simple. Ensuite, nous précisons exactement comment cela va fonctionner du point de vue de l'utilisateur. Le document a deux objectifs. Premièrement, nous voulons fournir un document qui peut avoir été examiné par notre équipe marketing pour s'assurer que nous répondons à nos besoins commerciaux. Deuxièmement, nous voulons fournir un document pouvant être utilisé par notre équipe AQ ​​pour effectuer des tests.
Pemdas
1
Nos documents de conception sont beaucoup plus formels et détaillés. Ils incluent toujours les éléments suivants: une sorte d'analyse de cas d'utilisation, une explication des compromis ou des raisons pour lesquelles nous avons choisi une façon particulière de faire les choses, des références à d'autres conceptions, des définitions d'interface explicites, des structures de données ... ect. Nous n'avons pas nécessairement de commentaires explicites sur la façon dont un code spécifique répond à certaines exigences. Je ne sais pas si je pense que cela est important ou non.
Pemdas
1
Je dirais que nos documents sont à 95% à jour. Quelques choses ici et là se glissent entre les mailles du filet.
Pemdas
2

Je vois deux problèmes.

Le premier est qu'il est extrêmement difficile de synchroniser le code et la documentation. S'ils sont séparés, ils divergent et la documentation devient inutile. Les programmeurs ont essayé d'utiliser des outils pour faire le travail de les garder synchronisés (comme les outils CASE), mais ces outils se sont intercalés entre les programmeurs et leur code, ce qui a fait plus de dégâts que de bien. L'une des idées clés de la conception pilotée par domaine (Evans, 2004) est qu'une bonne conception est vraiment difficile, donc pour en tirer quelque chose, vous devez:

  • choisissez la plus petite zone possible de votre programme où une bonne conception apportera de grands avantages, le domaine dit de base
  • travailler très dur pour obtenir un bon design sous la forme d'un langage omniprésent que tous les membres de l'équipe utilisent tout le temps
  • dans la mesure du possible, intégrez la conception au code

L'autre gros problème avec notre façon de concevoir, c'est que nos méthodes de conception ne sont pas assez mathématiques. Les abstractions qui fuient ne se prêtent pas à en tirer des conclusions solides, et le monde de la logique strictement appliquée et de la vérité claire s'appelle les mathématiques, ce que les programmeurs évitent le plus souvent.

Les quelques outils mathématiques dont nous disposons, comme les méthodes formelles, sont très lourds.

Map-Reduce est un bel exemple de mathématiques en programmation. L'idée centrale est la suivante: lorsque vous avez une opération binaire associative, vous pouvez distribuer son exécution très facilement. Une opération binaire est une fonction à deux paramètres, l'associativité implique que (a + b) + c = a + (b + c)

a1 + a2 + ... + a99 + b1 + b2 + ... + b99 + c1 + c2 + ... + c99 est

(a1 + a2 + ... + a99) + (b1 + b2 + ... + b99) + (c1 + c2 + ... + c99) où les As, Bs et Cs peuvent être ajoutés trivialement à différents endroits, leurs résultats collectés et résumé en peu de temps.

Réduire la carte est une idée ridiculement simple. Il peut être décrit sur une seule feuille de papier. Si vous pouvez supposer que le lecteur a une solide compréhension du concept d'associativité, s'il tient sur une assez petite feuille de papier. Essayez maintenant d'expliquer map-Reduce à quelqu'un sans utiliser le terme d'associativité ou y faire référence indirectement. Je vous défie.

La conception de logiciels sans abstractions mathématiques, c'est comme essayer de faire de l'architecture sans jamais se soucier d'apprendre la géométrie.

Haskell peut peut-être résoudre ce problème au fil du temps. L'utilisation de concepts de la théorie des catégories pour décrire les programmes me semble prometteuse. La théorie des catégories est si abstraite que même les mathématiciens l'ont peu utilisée, mais apparemment les catégories, qui sont abstraites au-delà de la reconnaissance, semblent être suffisamment abstraites pour décrire la structure du logiciel. Nous le saurons. Lentement.

Waquo
la source