Cómo planificar e incorporar herramientas de gestión de proyectos en el código de investigación

8

Estoy entrando en mi tercer año de mi programa de doctorado, y hasta ahora mi código de investigación (problemas numéricos inversos / imagen médica / procesamiento de imágenes / etc.) consiste principalmente en scripts y funciones MATLAB desorganizados, con algunos C ++ y CUDA MEX'd rutinas lanzadas para un poco de velocidad adicional aquí y allá. Trabajar con MATLAB ha sido (en su mayoría) agradable, y probablemente no me rendiré por completo, sin embargo:

Este verano, he estado trabajando en un código 'grande' en un laboratorio nacional, y estoy empezando a ver la belleza en un código bien controlado, orientado a objetos y controlado por versiones con un buen uso de gmake y otros juguetes informáticos. .

Mi pregunta es esta: ¿en qué medida debería intentar incorporar estas herramientas en mi código de investigación? ¿Cuánto tiempo debería pasar "planificando" la estructura y la implementación de mi código, o debería dejar de pensar en ello y simplemente escribir buenas rutinas? Siento que debería estar desarrollando una base de código fuente bien planificada como producto de mi disertación, por la experiencia y la credibilidad de CV, pero no estoy seguro de cómo navegar este proceso. ¿Algún consejo, libro / artículo / recomendaciones del sitio web, etc.?

icurays1
fuente
1
Puede agregar su código de investigación en un proyecto existente apropiado.
k20
1
Hay muchos puntos reflexivos en las respuestas a esta pregunta en la Academia.SE , que podrían ser útiles.
Christian Clason
1
El control de versiones es ideal incluso para el código de investigación de una sola persona. ¿Necesita reproducir algo que ejecutó para un artículo en 2012, con los errores exactos / falta de mejora que tenía en ese momento? Obtenga el commit apropiado de git y ejecútelo.
Peteris

Respuestas:

4

Consideraría estas preguntas:

  1. ¿Desea que su código se convierta en un código de propósito bastante general que pueda reutilizar más tarde, o es solo un poco de código que está utilizando para un proyecto de investigación o documento que no planea reutilizar? Si no tiene planes de reutilizar el código, entonces probablemente no valga la pena perder tiempo y esfuerzo mejorando el código.

  2. ¿Has aprendido lo suficiente sobre los algoritmos y las estructuras de datos que estás usando y tienes la confianza de que querrás seguir usando estos algoritmos y estructuras de datos? De lo contrario, podría ser prematuro congelar su investigación en un código estable.

  3. ¿Desea compartir el código, hacer que otros lo utilicen y, en última instancia, hacer que otras personas ayuden a desarrollar el código aún más? Como investigador, debe comprender que esta es una de las formas más efectivas de asegurarse de que su código tenga un impacto en su campo de investigación. Sin embargo, para comenzar, debe proporcionar un código razonablemente robusto y querrá publicarlo bajo una licencia de código abierto para que otros puedan utilizar el código en sus propios proyectos.

Brian Borchers
fuente
3

Mi pregunta es esta: ¿en qué medida debería intentar incorporar estas herramientas en mi código de investigación?

Solo todo lo que sientas pagará por lo que sea que estés tratando de hacer. Si está haciendo principalmente scripts de MATLAB, el control de versiones y quizás las pruebas unitarias serán todo lo que necesita. Si tiene archivos MEX, probablemente sea bueno tener un Makefile que los compile, aunque solo sea por su propia cordura, ya que escribir secuencias de comandos de compilación cada vez que desee construir los archivos MEX es frágil.

Parte de la razón por la cual estas herramientas de flujo de trabajo se utilizan e incorporan en grandes proyectos es porque la inversión en estas herramientas paga sus objetivos. Como ejemplo, para un código de investigación único que respalde su tesis, probablemente no valga la pena usar un sistema de construcción multiplataforma como CMake. Para una biblioteca cuyo propósito declarado es ser compatible con múltiples plataformas, como, por ejemplo, Elemental, tiene más sentido invertir tiempo en el uso de un sistema de construcción multiplataforma.

¿Cuánto tiempo debería pasar "planificando" la estructura y la implementación de mi código, o debería dejar de pensar en ello y simplemente escribir buenas rutinas?

Depende de qué tan familiarizado esté con el problema que está tratando de resolver, los algoritmos apropiados, las estructuras de datos, las prácticas de programación, etc. Al igual que el bosquejo y la preescritura son útiles para los artículos de revistas, una cierta cantidad de lluvia de ideas y seudocodificación es útil para escribir código bien estructurado. Me gusta el proceso de programación de pseudocódigo en Code Complete, de Steve McConnell; también incluye algunas referencias y pautas en términos de cuánto tiempo se debe dedicar a la fase de diseño, según el tipo de proyecto.

Escribir versiones descartables de rutinas y experimentar con pequeños fragmentos de código también es realmente útil. Un aforismo común en el desarrollo de software es que siempre tirará al menos una versión de su código.

Tiendo a creer que las prácticas de desarrollo "ágiles" tienden a funcionar mejor con la mayoría del desarrollo de software científico, basado en el trabajo de Greg Wilson en Software Carpentry (descargo de responsabilidad: he sido voluntario con ellos en el pasado). En términos generales, "ágil" significa que debe establecer metas que cree que alcanzará en un corto período de tiempo (por ejemplo, un par de días, una semana, tal vez un mes como máximo), planificar cómo alcanzar esas metas haciendo un pseudocodificación y diseñar, y luego escribir código, y repetir. Los ciclos cortos lo ayudarán a reaccionar ante los cambios, como cuando su asesor decide que quiere que extienda su trabajo de formas que no había previsto.

Siento que debería estar desarrollando una base de código fuente bien planificada como producto de mi disertación, por la experiencia y la credibilidad de CV, pero no estoy seguro de cómo navegar este proceso. ¿Algún consejo, libro / artículo / recomendaciones del sitio web, etc.?

Todo eso depende de lo que quieras hacer. Para los puestos relacionados con el desarrollo de software, es útil desarrollar una base de código fuente abierto, porque es algo que puede publicar en GitHub y señalar. Dicho esto, si desea convertirlo en un paquete de software que la gente usará, tendrá que pasar algún tiempo manteniéndolo; es posible que no quieras hacer eso. Contribuir con su código de investigación a proyectos existentes relevantes también puede ser una muy buena opción. Las empresas parecen querer una mezcla de ambos. Si puede contribuir al código de otras personas, muestra que es un jugador de equipo y que puede leer el código de otras personas y aún hacer algo útil con él.

En términos de referencias, la lista de lectura de referencias de Software Carpentry está bien orientada a los científicos, y si desea profundizar en la práctica de la ingeniería de software, Code Complete (consulte la lista en el enlace anterior) tiene más referencias que comienzan a ser un poco anticuado, pero son útiles para buscar. Los documentos que publicaron sobre las mejores prácticas en informática científica también son útiles.

Las lecciones de Carpintería de software también son útiles. Están centrados en Python cuando se trata de programación, por lo que puede tomar eso con un grano de sal, pero vale la pena ver las partes de control de versión.

Geoff Oxberry
fuente