Les meilleures pratiques pour gérer la complexité / visualiser les composants dans votre logiciel?

StackOverflow https://stackoverflow.com/questions/304054

  •  08-07-2019
  •  | 
  •  

Question

Nous construisons des outils pour extraire des informations du Web. Nous avons plusieurs morceaux, tels que

  • Analyser les données du Web
  • Extraire des informations en fonction de templates & amp; règles commerciales
  • Analyser les résultats dans la base de données
  • Appliquer la normalisation & amp; règles de filtrage
  • Etc, etc.

Le problème est le dépannage de problèmes & amp; avoir une bonne " image de haut niveau " de ce qui se passe à chaque étape.

Quelles techniques vous ont aidé à comprendre et à gérer des processus complexes?

  • Utiliser des outils de flux de travail tels que la fondation Windows Workflow
  • Encapsulez des fonctions séparées dans des outils de ligne de commande & amp; utilisez des outils de script pour les lier ensemble
  • Ecrivez un langage DSL (Domain-Specific Language) pour spécifier l'ordre dans lequel les choses doivent se passer à un niveau supérieur.

Demandez simplement comment vous maîtrisez un système comportant de nombreux composants en interaction. Nous aimerions documenter / comprendre le fonctionnement du système à un niveau supérieur au traçage via le code source.

Était-ce utile?

La solution

Le code dit ce qui se passe à chaque étape. Utiliser un DSL serait une aubaine, mais peut-être pas si cela vous coûte d’écrire votre propre langage de script et / ou votre compilateur.

La documentation de niveau supérieur ne doit pas inclure de détails sur ce qui se passe à chaque étape. il devrait donner un aperçu des étapes et de la manière dont elles sont liées.

Bons conseils:

  • Visualisez les relations entre votre schéma de base de données.
  • Utilisez visio ou d’autres outils (comme celui que vous avez mentionné - ne l’ont pas utilisé) pour les aperçus de processus (à mon sens, il appartient à la spécification de votre projet).
  • Assurez-vous que votre code est correctement structuré / compartimenté / etc.
  • Assurez-vous de disposer d'une sorte de spécification de projet (ou d'une autre documentation "générale" qui explique ce que le système fait à un niveau abstrait).

Je ne recommanderais pas de créer des outils de ligne de commande, sauf si vous en avez vraiment besoin. Pas besoin de maintenir des outils que vous n'utilisez pas. (Ce n'est pas la même chose que de dire que cela ne peut pas être utile; mais la plupart de ce que vous faites ressemble plus à une utilisation dans une bibliothèque qu'à l'exécution de processus externes).

Autres conseils

J'utilise le célèbre Graphviz d'AT & T, qui est simple et qui fait très bien son travail. C'est la même bibliothèque que Doxygen utilise aussi.

De plus, si vous faites un petit effort, vous pouvez obtenir de très beaux graphes.

Oublié de mentionner, la façon dont je l’utilise est la suivante (parce que Graphviz analyse les scripts Graphviz), j’utilise un système alternatif pour enregistrer les événements au format Graphviz. / p>

Je trouve un matrice de structure de dépendance un moyen utile d'analyser la structure d'une application. Un outil comme lattix pourrait vous aider.

En fonction de votre plate-forme et de votre chaîne d’outils, de nombreux packages d’analyses statiques vraiment utiles peuvent vous aider à documenter les relations entre les sous-systèmes ou les composants de votre application. NDepend est un bon exemple pour la plate-forme .NET. Cependant, il en existe beaucoup d'autres pour d'autres plateformes.

Avoir une bonne conception ou un bon modèle avant de construire le système est le meilleur moyen de comprendre comment l’application doit être structurée, mais des outils tels que ceux que j’ai mentionnés peuvent vous aider à appliquer les règles architecturales et vous donneront souvent un aperçu du conception qui vient de parcourir le code ne peut pas.

Je n'utiliserais aucun des outils que vous avez mentionnés.

Vous devez dessiner un diagramme de haut niveau (j'aime le crayon et le papier).

Je concevrais un système comportant plusieurs modules et effectuant différentes tâches. Il serait intéressant de le concevoir de manière à ce que vous puissiez avoir plusieurs instances de chaque module fonctionnant en parallèle.

Je penserais à utiliser plusieurs files d'attente pour

  • URL à explorer
  • Pages explorées sur le Web
  • Informations extraites basées sur les modèles & amp; règles commerciales
  • Résultats analysés
  • normalisé & amp; résultats filtrés

Vous auriez des programmes simples (probablement en ligne de commande sans interface utilisateur) qui liraient les données des files d'attente et les inséreraient dans une ou plusieurs files d'attente (le robot d'indexation alimenterait les " URL à explorer " et "Pages explorées sur le Web", vous pouvez utiliser:

  • Un robot d'exploration Web
  • Un extracteur de données
  • Un analyseur
  • Un normalisateur et un filtre

Ceux-ci s’adapteraient entre les files d’attente et vous pourriez en exécuter de nombreuses copies sur des PC distincts, ce qui permettrait de les redimensionner.

La dernière file d'attente pourrait être transmise à un autre programme qui publie tout dans une base de données pour une utilisation réelle.

Ma société écrit des spécifications fonctionnelles pour chaque composant principal. Chaque spécification suit un format commun et utilise divers diagrammes et images, le cas échéant. Nos spécifications ont une partie fonctionnelle et une partie technique. La partie fonctionnelle décrit ce que le composant fait à un niveau élevé (pourquoi, quels objectifs il résout, ce qu’il ne fait pas, avec quoi il interagit, des documents externes qui sont liés, etc.). La partie technique décrit les classes les plus importantes dans les composants et tous les modèles de conception de haut niveau.

Nous préférons le texte car il est le plus polyvalent et le plus facile à mettre à jour. C’est un gros problème - tout le monde n’est pas un expert (ni même décent) de Visio ou de Dia, et cela peut constituer un obstacle à la mise à jour des documents. Nous rédigeons les spécifications sur un wiki afin de pouvoir facilement relier chaque spécification (ainsi que de suivre les modifications) et permettre une navigation non linéaire dans le système.

Pour un argument émanant d'autorité, Joel recommande les spécifications fonctionnelles ici et ici .

La conception descendante aide beaucoup. Une erreur que je vois est de rendre le design top down sacré. Votre conception de niveau supérieur doit être examinée et mise à jour comme toute autre section de code.

Il est important de partitionner ces composants tout au long du cycle de vie du développement de votre logiciel: temps de conception, temps de développement, tests, version et exécution. Dessiner un diagramme ne suffit pas.

J'ai constaté qu'adopter une architecture à micro-noyau peut vraiment aider "diviser et conquérir". cette complexité. L’essence de l’architecture du micro-noyau est la suivante:

  • Processus (chaque composant s'exécute dans un espace mémoire isolé)
  • Threads (chaque composant s'exécute sur un thread séparé)
  • Communication (les composants communiquent via un seul canal de transmission de messages)

J'ai écrit un système de traitement par lots assez complexe qui ressemble à votre système en utilisant:

Chaque composant correspond à un exécutable .NET Les durées de vie des exécutables sont gérées par Autosys (toutes sur le même ordinateur) La communication se fait via TIBCO Rendezvous

Si vous pouvez utiliser une boîte à outils offrant une introspection à l'exécution, c'est encore mieux. Par exemple, Autosys me permet de voir quels processus sont en cours d’exécution et quelles erreurs se sont produites tandis que TIBCO me permettait d’inspecter les files de messages au moment de l’exécution.

J'aime utiliser NDepend pour procéder au reverse engineering de bases de code .NET complexes. L'outil est livré avec plusieurs fonctionnalités de visualisation remarquables telles que:

Graphique de dépendance: alt text

Matrice de dépendance: texte alternatif

Visualisation de la métrique du code par le biais de la cartographie: texte alternatif

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top