¿Qué metodología de software debo seguir cuando investigo?

9

Por lo general, analizo datos de experimentos y, aunque tengo un esquema general de pasos que debo seguir, es posible que deba ajustarlo a los detalles específicos de los experimentos o las preguntas detrás. Por lo general, soy el único que codifica.

Miré en Wikipedia pero no estoy seguro de qué metodología puedo usar, en parte porque nunca he seguido ninguna, y en parte porque a veces solo exploro los datos, para ver cómo se ve, y otras veces solo quiero una respuesta. (Y porque no se espera mucho que pruebe o tenga una cierta calidad en mi código)

Se me solicitó hacer esta pregunta después de una o dos horas descubriendo que la función r se tablebasa en el orden de los vectores y no en el nombre de los elementos para compararlos. Entonces pensé que debería haber probado el comportamiento y las funciones que usaba con algunos datos simulados. Pero utilicé la tabla después de que otro análisis resultó en la falta de información, por lo que no podría haber seguido la metodología de desarrollo basada en pruebas (si la entendiera bien). Sin embargo, siento que con alguna mejora en la forma en que enfrento el proyecto, podría ser más eficiente, además de detectar errores antes, pero también cómo y qué buscar en caso de que dude de un resultado, así que no se concentre solo en Este error de ejemplo.

¿Qué metodología de software se adapta mejor a la investigación?

Básicamente, estoy preguntando cómo garantizar la calidad y el progreso cronometrado, así como mantener la especificidad de la investigación.

Ejemplo de como trabajo:

Un biólogo tiene en mente una pregunta y sabe que hacer un experimento llevará a tener datos de interés (es decir, niveles de expresiones genéticas en dos condiciones), luego establece el experimento y recolecta muestras de 10 personas / ratones / ratas. Ahora debo analizar esos datos para esas 10 muestras usando bibliotecas y pruebas existentes (o implementando nuevas pruebas) pero teniendo en cuenta la pregunta que el biólogo tenía en mente (es decir, qué genes se expresan más en una condición que en otra). La estructura es la misma que en experimentos anteriores (que involucraban 6 condiciones y otro animal) pero la prueba estadística, las normalizaciones y la estructura de datos pueden cambiar. Por lo tanto, suelo copiar una versión anterior y adaptarla a las necesidades actuales.

llrs
fuente
77
lo que estás dong ahora está bien. ¡Ninguna metodología te impedirá cometer errores! solo asegúrese de estar usando un sistema de control de versiones y mantenga sus bases de código bien organizadas.
gbjbaanb
Ninguna metodología detendrá los errores. ¡Pero algunos detectarán los errores antes! Diseño por contrato, o diseño basado en contrato.
Frank Hileman
¿Podría por favor elaborar su última oración? No lo entendí en absoluto.
llrs
quizás en.wikipedia.org/wiki/Test-driven_development con algún tipo de marco de prueba automatizado: las pruebas pequeñas son útiles para detectar errores y las pruebas más grandes pueden mapear (aproximadamente) en sus hipótesis
david.libremone
1
@Llopis, idealmente, primero escribe una prueba, falla, luego escribe el código, la prueba pasa, luego confirma su código; si descubre un error más adelante, escribe la prueba que habría detectado el error, falla , arregla el código, la prueba pasa, luego confirma su código - no puede ver todo, pero puede asegurarse de que no vuelva a ocurrir lo mismo
david.libremone

Respuestas:

6

Quizás lo que se necesita no sea una metodología de software, sino un cambio político en la academia que solucione el problema de la falta de reconocimiento del papel desempeñado por el desarrollo de software en la ciencia.

El Software Sustainability Institute (Reino Unido) es la organización más cercana a lo que está buscando: cómo defender un uso más concienzudo de la programación de computadoras en la investigación científica.

También proporciona punteros de información para aquellos interesados ​​en las metodologías de desarrollo de software.

Sin embargo, debo señalar que las metodologías generalmente gobiernan los equipos de programadores de software, con iteraciones y refinamiento gradual de los objetivos del proyecto, y funcionan con bases de código estables que duran mucho tiempo. Son para proyectos que son órdenes de magnitud más complejos que lo que estás haciendo.


En cuanto a por qué esta cosa muy obviamente correcta (uso más concienzudo de la programación de computadoras en la investigación científica) no se ha logrado y siempre se ha confirmado, aquí está la verdad inconveniente: en entornos administrativos académicos, se puede ver que los científicos degradan la importancia que juega la computadora programación. A veces se puede ver que se unen para negar el reconocimiento de las contribuciones de las personas involucradas en el software, incluso si la naturaleza de esa contribución se ajusta a la disciplina científica.


En su lugar de trabajo, hay cosas que faltaban y cosas que puede hacer.

Cosas que faltaban:

  • Falta de pautas
  • Falta de supervisión o persona para hacer preguntas
  • Falta de mentores o programadores informáticos que conozcan las herramientas que utiliza (por ejemplo, R)
  • Falta de reutilización de software, archivo, control de versiones o documentación de software previamente desarrollado, para propósitos de repetibilidad y aprendizaje.

En resumen, la cultura general es que las personas involucradas no están realmente interesadas en ... lo adivinaste ... un uso más concienzudo de la programación de computadoras en la investigación científica.


Cosas que puedes hacer:

  • Dedica más tiempo a aprender tus herramientas.
    • Pase más tiempo leyendo la documentación y ejemplos de código para sus lenguajes de programación
    • Tendrás que aprender a amar las herramientas que usas.
  • Intente escribir algo, para beneficio del próximo programador de computadoras que será esclavizado por el mismo grupo de personas durante los próximos años.
    • Un wiki será excelente.
  • Intenta configurar el control de versión de origen
    • Poder recuperar fragmentos de código comúnmente reutilizados
    • Poder guardar una instantánea del código utilizado en un experimento particular

Para los desarrolladores de software de carrera, las pautas de esta naturaleza se pueden encontrar en:

Estos se consideran los requisitos básicos para ejecutar un negocio de desarrollo de software. Sin embargo, cuando estás luchando en una guerra de apatía, solo, debes priorizar. Mejorar con las herramientas, escribir y mantener información, mantener versiones del código fuente es lo mínimo para un entorno único.

rwong
fuente
Recursos interesantes sobre el Instituto de Sostenibilidad de Software gracias! Voy a escribir mis propias directrices de la gestión de código y datos, tengo un supervisor pero no parecen tener "conocimiento de las herramientas", yo uso git, pero voy a tratar de seguir su consejo sobre la documentación
LLR
ja, sí, un wiki ... por haber probado algunos, recomendaría dokuwiki.org/dokuwiki# aquí. Fácil de configurar y mantiene los documentos como archivos de texto en lugar de en una base de datos. Descubrí que era el mejor equilibrio entre la facilidad de configuración, la facilidad de uso y la sostenibilidad de los datos.
Newtopian
Los problemas en la ciencia asistida por computadora que describe @rwong están presentes en la mayoría de los institutos que he trabajado (física y astronomía)
steffen
2

No se preocupe tanto por la metodología, pero intente concentrarse más en lo que necesita para realizar un seguimiento de sus requisitos para el desarrollo del software en sí.

Después de una corta estadía en una posición relativamente similar a la suya, esto es lo que puedo extraer de mi experiencia personal.

Exactitud algorítmica

Probablemente el aspecto más importante, debería ser capaz de demostrar que su software hace lo que fue diseñado para hacer. Aquí las pruebas automatizadas son tu mejor aliado. Me doy cuenta de que puede ser difícil prescindir de un conjunto de datos adecuado, pero en realidad debes acostumbrarte a crear tus propios conjuntos de datos. Sin embargo, su propósito es algo diferente: no está tratando de extraer la tendencia de los datos, sino asegurarse de que el software produzca resultados predecibles y correctos de un conjunto de datos conocido. Entonces, para el reconocimiento de patrones, por ejemplo, no necesita una composición genética de múltiples presentaciones, solo unas pocas líneas de texto podrían ser suficientes para garantizar que el algoritmo detecte el patrón.

Solía ​​elaborar mis datos para representar casos de esquina, casos imposibles. Solía ​​centrarme más en los extremos que en la norma esperada. Muchas veces puedo recordar probar algo imposible solo para ver surgir esta situación en el conjunto de datos real. Si no lo hubiera probado, no habría implementado las detecciones de errores y el registro necesarios para identificar posibles corrupciones o errores en el conjunto de datos. TDD es una buena opción para esta parte, aunque creo que es más importante crear un buen conjunto de pruebas independientemente de si lo hace antes o después del código real.

Versionado

Con demasiada frecuencia, esta parte se deja de lado. Un buen esquema de versiones para su código y paquetes / ejecutables producidos lo ayudarán inmensamente a mantener su progreso en orden. Poder recuperar exactamente el código que se usó para crear resultados obtenidos previamente puede ayudar a rastrear errores o discrepancias. La ramificación también puede ayudar al experimentar con diferentes enfoques o algoritmos.

Asegúrese de etiquetar el código utilizado en los cálculos reales. Consulte las versiones semánticas si necesita ayuda para nombrar las versiones.

Construcción automatizada

Un corolario al punto anterior. Asegúrese de automatizar tanto como sea posible el proceso de creación y empaquetado de su software. No necesita ir a monty completo, solo lo suficiente para que sea trivial crear el sistema final a partir de la fuente y las dependencias. El objetivo aquí es ahorrarle tiempo, pero también tener un medio reproducible para volver a crear el software desde la fuente, incluidas las dependencias y otros elementos externos. Groovy, Maven, ant, Scons, cmake, son solo una pequeña muestra de herramientas de automatización de compilación y sistemas de secuencias de comandos que pueden ayudar.

Si desea hacer un esfuerzo adicional, instale Jenkins o teamcity o cualquier otro sistema de integración continua. Bonificación adicional si tiene que mantener varios servidores o trabajadores para la informática distribuida. La mayoría de estos sistemas tendrán medios para ayudar en el mantenimiento. Además, podrá automatizar completamente las ejecuciones de prueba para que no necesite esperar los resultados antes de continuar, solo confirme y reciba un correo más tarde. He tenido un sistema que tardó horas en superar los conjuntos de prueba. Poner esta automatización fue la mejor inversión de mi tiempo. Especialmente si ya tienes los scripts para construir todo.

Aislamiento del ambiente

Los investigadores pasan una cantidad excesiva de tiempo aislando un conjunto único o pequeño de variables de interés de sistemas complejos a través de sus protocolos. Esto también debe extenderse a sus prácticas de desarrollo de software. También puede verificar la contenedorización con Docker o Vagrant. Le dará un mejor control sobre el entorno en el que se ejecuta el software.

No es necesario tener un gran equipo antes de que esto valga la pena, estuve solo la mayor parte del tiempo, pero me beneficié enormemente al poner esto en práctica. La tranquilidad y el tiempo ahorrados siempre superaron con creces la sobrecarga que me costó hacer esto.

Newtopian
fuente
Por lo general, dejé el código tal como estaba cuando lo terminé, por lo que la última versión es la que se usa para los cálculos, por lo que es posible que necesite mejorar eso. También sobre la exactitud algorítmica, ¿no debería suponer que las bibliotecas que uso funcionan correctamente?
llrs
puedes, aunque ya he hecho pruebas en dependencias externas, pero eso era raro ... es tu propio código el que deberías probar, ¿usaste las bibliotecas correctamente? ¿Falla de manera reticular (su código)? etc.
Newtopian
0
  1. ¿Puedes usar R? Para eso es.

  2. Mantenga su código simple . Elija legibilidad y no se preocupe por el rendimiento a menos que sea un problema. Existen metodologías para tratar de evitar que los equipos de programadores pongan errores en el código del otro, incluso si el equipo es una persona.

  3. Dicho esto, la disciplina de codificación es súper importante. He visto código de científicos y matemáticos avanzados altamente capacitados, y es horrible . Ignoran totalmente el formato. Aprietan el código juntos como si estuviera empaquetado al vacío. Sus nombres variables son totalmente desconcertantes. No escriben comentarios, o escriben comentarios inescrutables, o los comentarios dicen una cosa mientras que el código dice otra. No hagas esas cosas. Siempre piense en los cambios futuros que usted u otros podrían tener que hacer.

Mike Dunlavey
fuente
1
Estoy usando R, espero que mi código sea lo suficientemente simple como para detectar errores que podría haber escrito y cualquier error que pudiera haber cometido. Sigo el estilo de formato de código de Google R, y me gustaría pensar que los comentarios son útiles para explicar por qué tomo esas decisiones en el código.
llrs
@Llopis: Entonces diría que estás en el camino correcto.
Mike Dunlavey
@Llopis en el desarrollo de software basado en equipos, es una rutina para los miembros del equipo pedirle a otro que revise el código, basándose en el supuesto de que más ojos pueden detectar más errores. Desafortunadamente, en su situación no hay nadie para revisar la suya, y la cultura del secreto en la investigación le habrá impedido permitir que otros (fuera de los permisos de su lugar de trabajo) revisen su código.
rwong
1
@rwong, de hecho, ahora puedo compartir mi código de investigación, por lo que cualquiera podría revisarlo en github
llrs el
@Llopis: Razón de más para hacerlo legible. Una cosa que trato de hacer es dar un tutorial muy pequeño (en comentarios) sobre el tema, porque es probable que la experiencia del lector difiera de la mía.
Mike Dunlavey