Concevoir des modèles dans l'écriture de logiciels numériques en C ++

13

Je recherche des ressources sur les modèles de conception et les principes des logiciels numériques, potentiellement mais pas nécessairement en mettant l'accent sur les approches orientées objet des codes numériques.

Je connais le texte, Writing Scientific Software: A Guide for Good Style , mais cela traite encore beaucoup de choses comme les problèmes de virgule flottante, comment et quand optimiser, etc.

Je cherche des informations sur la vue d' ensemble de la conception de codes numériques, pas sur tout ce qui concerne les algorithmes et autres.

J'espère qu'il y a des ressources pour cela, et il ne suffit pas de parcourir bibliothèque après bibliothèque, d'autant plus qu'il n'y a pas de guide pour faire les choses correctement en matière de conception, à part ma propre connaissance des bons idiomes et des bonnes pratiques en C ++.

(Ce n'est pas spécifique à une langue, mais s'il y a un contenu spécifique à une langue, je préférerais C ++.)

user1997744
la source
J'ai souvent pensé à écrire un tel livre; mais la gamme d'approches possibles est énorme (et dépend fortement de la technique numérique principale + du domaine du problème) et ce qui est nécessaire ressemble plus à une encyclopédie. De plus, aucune personne ne peut saisir toutes les possibilités. La meilleure solution consiste à suivre les pratiques logicielles traditionnelles en gardant à l'esprit les développements matériels. Quelle est votre technique et votre domaine d'intérêt?
Biswajit Banerjee
2
Une autre référence utile qui n'est pas tout à fait sur la cible est "Calcul efficace en physique" par Anthony Scopatz et Kathryn Huff.
Brian Borchers
@BrianBorchers Hm, il semble que la moitié soit dans une introduction à Python et se concentre ensuite sur les outils de développement.
user1997744

Réponses:

8

Ayant développé un logiciel numérique depuis 20 ans maintenant, je trouve que nous avons probablement utilisé la majorité des modèles de conception décrits dans le livre du Gang of Four ( voir ici ). En fin de compte, les logiciels numériques ne sont que des logiciels complexes à grande échelle, il n'est donc pas surprenant que les mêmes considérations de conception s'appliquent que dans d'autres logiciels.

Il existe, bien sûr, un certain nombre de cas qui sont vraiment spécifiques aux algorithmes numériques (voir, par exemple, ici ), mais connaître l'ensemble "traditionnel" de modèles de conception est déjà un bon début.

Wolfgang Bangerth
la source
Je voudrais ajouter que, pour les calculs numériques sur du matériel plus récent, il faut s'efforcer de minimiser la chasse au pointeur (que de nombreux modèles de Gang of Four utilisent). Un bon point de départ pour les conceptions C ++ est github.com/isocpp/CppCoreGuidelines/blob/master/…
Biswajit Banerjee
@BiswajitBanerjee Oui, les directives de base du C ++ sont des connaissances de base pour quiconque utilise le C ++ moderne. Herb Sutter est l'un des éditeurs et vous pouvez toujours faire confiance à ses conseils.
user1997744
@ user1997744 Voulez-vous dire Bjarne? Herb Sutter est également célèbre pour son idée "toujours automatique" qui conduit à un code en écriture seule (je ne sais pas à quel point je ferais confiance à son jugement). De plus, les directives de base C ++ sont loin des connaissances de base. Vous serez surpris.
Biswajit Banerjee
@BiswajitBanerjee Eh bien, s'ils ne le sont pas, je peux dire que je ne laisserais jamais un développeur progresser au-delà d'une seule interview s'il n'était pas familier avec la majorité des directives et les utiliser (à l'exception des cas où le code hérité peut rendre cela délicat).
user1997744
6

Je recommande ce Matthew G Knepley. Langages de programmation pour le calcul scientifique. arXiv preprint arXiv: 1209.1711, 2012 ( https://arxiv.org/pdf/1209.1711.pdf )

Je conseille également de regarder et de lire d'autres codes, par exemple triangle, PETSc, MoAB, deal.II, fenics et bien d'autres. Toutes les solutions ne fonctionneront pas pour vous, mais à la fin, faire face et apprendre des autres (développeurs expérimentés et codes réussis) est la meilleure leçon pour concevoir du code.

De plus, je pense qu'il vaut mieux se joindre à un projet existant et devenir contributeur ou développeur. Parfois, vous aimez lancer quelque chose de nouveau, mais vous devez avoir des arguments solides pour le faire.

likask
la source
Mon argument pour lancer quelque chose de nouveau est l'expérience d'apprentissage et le sentiment d'accomplissement :)
user1997744
1
Je comprends cet argument. J'avais fait la même chose il y a longtemps. Maintenant, je pense que c'était prématuré. Il se pourrait qu'au début, nous ayons tous à faire les mêmes erreurs. Pour apprendre à marcher en premier, il faut tomber. En écrivant votre propre code, si c'est la première fois, vous serez très probablement le seul utilisateur de votre code. En contribuant au code développé par la communauté, votre travail sera probablement utilisé par d'autres et cela vous donnera un sentiment d'accomplissement et d'appréciation. Vous recevrez des commentaires / avis à la demande de tirage, à partir de laquelle vous apprendrez et améliorerez vos compétences.
likask
Eh bien, il n'y a pas de bibliothèque pour un calcul ésotérique ultra spécifique que je dois faire, donc en fin de compte, je dois en fait écrire le mien, bien sûr, il n'est pas nécessaire de tout réinventer.
user1997744
Excellent conseil pour rejoindre un projet existant open source. J'ai été entraîné dans un réseau de programmeurs bien mieux que moi en faisant cela.
user14717