¿Por qué la mayoría de los científicos computacionales (p. Ej. Biólogos, astrofísicos) son malos programadores según los estándares de CS?

No puedo mejorar la respuesta de Charles H Martin para “por qué”, pero tal vez pueda arrojar algo de luz sobre la pregunta secundaria de cómo podría verse el código escrito por los científicos desde una perspectiva de ingeniería de software. Estas son las cosas que noté cuando miré el código de los científicos durante la depuración.

  • Alto acoplamiento interno. Funciones largas, muchas variables globales, cálculo mezclado con E / S mezclado con interacción del usuario.
  • No a prueba de futuro. Pocas funciones de biblioteca diseñadas para ser llamadas desde muchos lugares, sin clases o separación de políticas versus mecanismos, sin versiones de estructura / formato. El código resuelve un problema, unidireccional, una vez.
  • Inescrutabilidad general. Nombres de variables cortos / sin sentido, pocos comentarios, sangría loca.
  • Sin makefiles, control de versiones primitivo. No son exactamente problemas de código. pero también característico.

Ninguno de estos es indicativo de estupidez o incompetencia. Solo son indicativos de no haber sido entrenados como programadores , lo cual es natural para las personas que estaban ocupadas entrenando en algo aún más difícil. Más clases de “ingeniería de software para científicos”, o emparejamiento de científicos con programadores, podrían ayudar. Por otra parte, si el código de los científicos hace lo que los científicos quieren, puede que no valga la pena. Es posible que nuestros estándares no se apliquen, y nuestra estética ciertamente no.

La misma razón por la que la mayoría de las personas de CS son terribles en matemáticas y hacen terribles científicos de datos

falta de entrenamiento, exposición y tutoría

Yo mismo nunca vi una función de clasificación o una tabla hash hasta que entré en la industria. Y, sin embargo, escribí un compilador funcional en lisp y desarrollé solucionadores numéricos de alto rendimiento para ejecutar en Cray y en clústeres de memoria distribuida utilizando algoritmos con reconocimiento de caché hace casi 15 a 20 años.

Creo que la mayoría de las personas de CS no pueden codificar un solucionador de aprendizaje automático decente desde cero, o realmente no entienden los problemas de rendimiento que surgen a escala.

solo un énfasis diferente

recuerde, la moderna Internet basada en HTML / HTTP fue inventada por investigadores en Astrofísica, no comp sci.

Creo que Jeff Darcy planteó un punto clave al final de su respuesta: “si el código de los científicos hace lo que los científicos quieren, podría no valer la pena. Nuestros estándares podrían no aplicarse, y nuestra estética ciertamente no”.

Jeff señala que los estándares de CS no son necesariamente útiles cuando se trata de las medidas científicas más importantes del trabajo de un científico. Esto es cierto, sin embargo, creo que todos estarían de acuerdo en que los científicos deben buscar un equilibrio con los principios de ingeniería de software. La excusa de que no hay suficiente tiempo para hacerlo es débil dada la cantidad de tiempo mucho mayor que se ahorrarían a sí mismos y a los futuros miembros de su laboratorio y comunidad científica en general.

Jeff menciona las clases de “ingeniería de software para científicos”. Creo que un gran ejemplo de un recurso gratuito es la organización voluntaria Software Carpentry, que responde a esta pregunta en su sitio web:

¿Por qué existe la carpintería de software? Debido a que la informática es ahora una parte integral de todos los aspectos de la ciencia, pero a la mayoría de los científicos nunca se les enseña cómo construir, usar, validar y compartir bien el software. Como resultado, muchos pasan horas o días haciendo cosas mal, eso podría hacerse bien en unos pocos minutos. Nuestro objetivo es cambiar eso para que los científicos puedan pasar menos tiempo luchando con el software y más tiempo haciendo investigaciones útiles “. (fuente: preguntas frecuentes)

Nadie lo ha dicho aún: todos los científicos que he conocido siempre han escrito código * mucho mejor * que cualquier programador que haya conocido. Pero eso es porque mi idea de “mejor” es bastante divergente de la tuya. Para mí, el código es “mejor” cuando me da un resultado más rápido, con mayor precisión, con suficientes garantías contra el mal uso. Para usted, el código es “mejor” cuando cumple con la moda de gestión de TI de las últimas semanas.

Si sus cincuenta páginas de código en Java siguen todos los patrones de diseño correctos y sus nombres de variables son maravillas de elocuencia y su programa es tan fácil de mantener que un mono podría hacerlo y le tomó tres meses escribir y procesar un segundo valor de datos en un minuto, y mis 3 páginas de código de espagueti peludo que junté durante el fin de semana que son ilegibles para cualquiera, incluido yo mismo, porque incluí algunas cosas MMX donde necesitaba algo de velocidad real y procesa datos de un segundo en un segundo – entonces mi código es mejor que el tuyo porque puede resolver mi problema en tiempo real. No importa lo bonito que sangraste tus líneas.

La razón, por supuesto, es obvia: es mucho más fácil enseñarle a un científico una programación suficiente (aunque sea “mala”) para que pueda hacer su trabajo que enseñarle a un mono código suficiente ciencia para hacer lo mismo. Por definición, los graduados de CS no entienden la física, la biología o la geología (o serían físicos, biólogos o geólogos) y, por definición, cualquier código que produzcan será inferior a cualquier cosa que un físico químico pueda improvisar después de un fin de semana de aprendizaje. pitón. “inferior” desde la perspectiva del dominio del problema, no desde una perspectiva artificial de “orientación a objetos” o lo que sea que la gente CS considere “realmente importante” esta semana.

Nunca aprendieron a escribir código “bien escrito”. Están más preocupados por la eficiencia y la corrección en primer lugar. Como CS y ciencia doble doble con la esperanza de convertirse en un científico computacional, espero poder ayudar a solucionar esto.

Oh querido, parece que alguien no quiere aprender FORTRAN