Diseñar patrones al escribir software numérico en C ++

13

Estoy buscando recursos sobre patrones de diseño y principios para software numérico, potencialmente pero no necesariamente con un enfoque en enfoques orientados a objetos para códigos numéricos.

Conozco el texto, Writing Scientific Software: A Guide for Good Style , pero aún trata muchas cosas como cuestiones de coma flotante, cómo y cuándo optimizar, etc.

Estoy buscando información sobre la imagen más amplia del diseño de códigos numéricos, no sobre nada relacionado con algoritmos y similares.

Espero que haya recursos para esto, y no quede uno solo para ir de biblioteca en biblioteca, especialmente porque no hay una guía sobre cómo hacer las cosas correctamente, aparte de mi propio conocimiento de buenas expresiones idiomáticas y prácticas en C ++.

(Esto no es específico del idioma, pero si hay algún contenido específico del idioma, preferiría C ++).

usuario1997744
fuente
A menudo he pensado en escribir un libro así; pero el rango de posibles enfoques es enorme (y depende en gran medida de la técnica numérica primaria + el dominio del problema) y lo que se necesita es más como una enciclopedia. Además, ninguna persona sola puede tener una idea de todas las posibilidades. Lo mejor que puede hacer es seguir las prácticas tradicionales de software teniendo en cuenta los desarrollos de hardware. ¿Cuál es su técnica y dominio de interés?
Biswajit Banerjee
2
Otra referencia útil que no está del todo bien dirigida es "Computación efectiva en física" de Anthony Scopatz y Kathryn Huff.
Brian Borchers
@BrianBorchers Hm, parece que la mitad está en una introducción a Python y luego se enfoca en herramientas de desarrollo.
user1997744

Respuestas:

8

Después de haber desarrollado un software numérico durante 20 años, creo que probablemente hemos utilizado la mayoría de los patrones de diseño descritos en el Libro por la Banda de los Cuatro ( ver aquí ). Al final del día, el software numérico es también un software complejo a gran escala, por lo que quizás no sea sorprendente que se apliquen las mismas consideraciones de diseño que en otro software.

Hay, por supuesto, una serie de casos que realmente son específicos de los algoritmos numéricos (ver, por ejemplo, aquí ) pero conocer el conjunto "tradicional" de patrones de diseño es realmente un buen comienzo.

Wolfgang Bangerth
fuente
Me gustaría agregar que, para los cálculos numéricos en el hardware más nuevo, uno debería esforzarse por minimizar la persecución del puntero (que utilizan muchos de los patrones de la Banda de los Cuatro). Un buen punto de partida para los diseños de C ++ es github.com/isocpp/CppCoreGuidelines/blob/master/…
Biswajit Banerjee
@BiswajitBanerjee Sí, las pautas básicas de C ++ son conocimientos básicos para cualquier persona en el uso moderno de C ++. Herb Sutter es uno de los editores y siempre puedes confiar en sus consejos.
user1997744
@ user1997744 ¿Te refieres a Bjarne? Herb Sutter también es famoso por su idea "siempre automática" que lleva a un código de solo escritura (no estoy seguro de cuánto confiaría en su juicio). Además, las directrices básicas de C ++ están lejos de ser conocimientos básicos. Te sorprenderás.
Biswajit Banerjee
@BiswajitBanerjee Bueno, si no lo son, puedo decir que nunca dejaría que un desarrollador progrese más allá de una sola entrevista si no estuvieran familiarizados con la mayoría de las pautas y su uso (excluyendo dónde el código heredado puede hacer que sea complicado).
user1997744
6

Recomiendo este Matthew G Knepley. Lenguajes de programación para informática científica. preimpresión de arXiv arXiv: 1209.1711, 2012 ( https://arxiv.org/pdf/1209.1711.pdf )

También aconsejo mirar y leer otros códigos, por ejemplo, triángulo, PETSc, MoAB, deal.II, fenics y muchos otros. No todas las soluciones funcionarán para usted, pero al final, hacer frente y aprender de otros (desarrolladores experimentados y códigos exitosos) es la mejor lección sobre cómo diseñar código.

Además, creo que es mejor unirse a un proyecto existente y convertirse en colaborador o desarrollador. A veces te gusta comenzar algo nuevo, pero debes tener argumentos sólidos para hacerlo.

Me gusta
fuente
Mi argumento para comenzar algo nuevo es la experiencia de aprendizaje y el sentido de logro :)
user1997744
1
Entiendo este argumento. Había hecho lo mismo hace mucho tiempo. Ahora creo que fue prematuro. Podría ser que al principio todos tenemos que cometer los mismos errores. Para aprender a caminar primero, tienes que caerte. Escribiendo su propio código, si es la primera vez, es muy probable que sea el único usuario de su código. Al contribuir al código desarrollado por la comunidad, su trabajo probablemente será utilizado por otros y esto le dará una sensación de logro y aprecio. Recibirá comentarios / revisión a solicitud de extracción, de allí aprenderá y mejorará sus habilidades.
like
Bueno, no hay una biblioteca para un cálculo esotérico ultra específico que necesito hacer, por lo que al final tengo que escribir la mía aunque, por supuesto, no hay necesidad de reinventarlo todo.
user1997744
Un gran consejo para unirse a un proyecto existente de código abierto. Al hacer eso, me metí en una red de programadores mucho mejor que yo.
user14717