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.