Antecedentes
El año pasado hice una pasantía en un grupo de investigación en física en una universidad. En este grupo, usamos principalmente LabVIEW para escribir programas para controlar nuestras configuraciones, hacer adquisición de datos y analizar nuestros datos. Para los dos primeros propósitos, eso funciona bastante bien, pero para el análisis de datos, es una verdadera molestia. Además de eso, todos eran en su mayoría autodidactas, por lo que el código que se escribía era en general un desastre (no es de extrañar que todos los doctores decidieran rápidamente reescribir todo desde cero). El control de versiones era desconocido y era imposible de configurar debido a las estrictas regulaciones de software y red del departamento de TI.
Ahora bien, las cosas salieron sorprendentemente bien, pero ¿cómo hacen las personas en ciencias naturales el desarrollo de software?
Preguntas
Algunas preguntas concretas:
- ¿Qué lenguajes / entornos ha utilizado para desarrollar software científico, especialmente análisis de datos? ¿Qué bibliotecas? (por ejemplo, ¿qué usas para trazar?)
- ¿Hubo formación para personas sin experiencia significativa en programación?
- ¿Tenías algo como control de versiones y seguimiento de errores?
- ¿Cómo haría para intentar crear un entorno decente para la programación, sin interferir demasiado con los científicos individuales (¡especialmente los físicos son personas tercas!)
Resumen de respuestas hasta ahora
Las respuestas (o mi interpretación de ellas) hasta ahora: (2008-10-11)
- Idiomas / paquetes que parecen ser los más utilizados:
- Casi todos los encuestados utilizan el control de versiones; el seguimiento de errores y otros procesos son mucho menos comunes.
- El curso de carpintería de software es una buena manera de enseñar técnicas de programación y desarrollo a los científicos.
- ¿Cómo mejorar las cosas?
- No obligue a las personas a seguir protocolos estrictos.
- Cree un entorno usted mismo y muestre los beneficios a los demás. Ayúdelos a comenzar a trabajar con el control de versiones, el seguimiento de errores, etc.
- Revisar el código de otras personas puede ayudar, pero tenga en cuenta que no todos pueden apreciarlo.
Respuestas:
¿Qué lenguajes / entornos ha utilizado para desarrollar software científico, esp. ¿análisis de los datos? ¿Qué bibliotecas? (Por ejemplo, ¿qué usas para trazar?)
Solía trabajar para Enthought , el principal patrocinador corporativo de SciPy . Colaboramos con científicos de las empresas que contrataron a Enthought para el desarrollo de software personalizado. Python / SciPy parecía ser un entorno cómodo para los científicos. Es mucho menos intimidante comenzar con C ++ o Java si eres un científico sin experiencia en software.
La distribución Enthought Python viene con todas las bibliotecas de computación científica, incluyendo el análisis, el trazado, visualation 3D, etc.
¿Hubo formación para personas sin experiencia significativa en programación?
Enthought ofrece capacitación en SciPy y la comunidad SciPy es bastante buena para responder preguntas en las listas de correo.
¿Tenías algo como control de versiones, seguimiento de errores?
Sí y sí (Subversion y Trac). Dado que trabajábamos en colaboración con los científicos (y normalmente de forma remota), el control de versiones y el seguimiento de errores eran esenciales. Fue necesario un poco de entrenamiento para que algunos científicos internalizaran los beneficios del control de versiones.
¿Cómo podría intentar crear un entorno decente para la programación, sin interferir demasiado en el camino de los científicos individuales (especialmente los físicos son personas tercas!)
Asegúrese de que estén familiarizados con la cadena de herramientas. Se necesita una inversión inicial, pero hará que se sientan menos inclinados a rechazarla en favor de algo más familiar (Excel). Cuando las herramientas les fallan (y lo harán), asegúrese de que tengan un lugar al que acudir en busca de ayuda: listas de correo, grupos de usuarios, otros científicos y desarrolladores de software de la organización. Cuanta más ayuda haya para que vuelvan a hacer física, mejor.
fuente
El curso de Carpintería de software está dirigido específicamente a personas que realizan computación científica y tiene como objetivo enseñar los conceptos básicos y lecciones de la ingeniería de software, y la mejor manera de aplicarlos en proyectos.
Cubre temas como control de versiones, depuración, pruebas, secuencias de comandos y varios otros problemas.
He escuchado unas 8 o 9 de las conferencias y creo que es muy recomendable.
Editar: Los MP3 de las conferencias también están disponibles .
fuente
Física nuclear / de partículas aquí.
Para mejorar las cosas:
Una sugerencia más para mejorar las cosas.
fuente
Esto puede ser un poco tangencial, pero es de esperar que sea relevante.
Solía trabajar para National Instruments, R&D, donde escribí software para kits de herramientas de comunicación y RF de NI. Usamos LabVIEW bastante, y aquí están las prácticas que seguimos:
fuente
No soy exactamente un científico 'natural' (estudio transporte) pero soy un académico que escribe mucho de mi propio software para el análisis de datos. Intento escribir todo lo que puedo en Python, pero a veces me veo obligado a usar otros lenguajes cuando estoy trabajando para ampliar o personalizar una herramienta de software existente. Hay muy poca formación en programación en mi campo. La mayoría de las personas son autodidactas o aprendieron sus habilidades de programación de clases tomadas anteriormente o fuera de la disciplina.
Soy un gran fanático del control de versiones. Usé Vault ejecutándose en mi servidor doméstico para todo el código de mi tesis. Ahora mismo estoy intentando que el departamento configure un servidor Subversion, pero supongo que seré el único que lo usará, al menos al principio. He jugado un poco con FogBugs, pero a diferencia del control de versiones, no creo que eso sea tan útil para un equipo de un solo hombre.
En cuanto a animar a otros a usar el control de versiones y cosas por el estilo, ese es realmente el problema al que me enfrento ahora. Estoy pensando en obligar a mis estudiantes de posgrado a usarlo en proyectos de investigación que están haciendo para mí y alentarlos a usarlo para su propia investigación. Si doy una clase que involucre programación, probablemente forzaré a los estudiantes a usar el control de versiones allí también (calificándolos según lo que hay en el repositorio). En lo que respecta a mis colegas y sus estudiantes de posgrado, todo lo que realmente puedo hacer es poner a disposición un servidor y confiar en la persuasión suave y dar un buen ejemplo. Francamente, en este punto, creo que es más importante hacer que hagan copias de seguridad periódicas que controlar el código fuente (algunas personas llevan consigo la única copia de sus datos de investigación en unidades flash USB).
fuente
1.) Los lenguajes de script son populares en estos días para la mayoría de las cosas debido a un mejor hardware. Perl / Python / Lisp son frecuentes para aplicaciones ligeras (automatización, computación ligera); Veo mucho Perl en mi trabajo (EM computacional) ya que nos gusta Unix / Linux. Para temas de rendimiento, normalmente se utilizan C / C ++ / Fortran. Para la computación paralela, bueno, usualmente paralelizamos manualmente las ejecuciones en EM en lugar de tener un programa que lo haga implícitamente (es decir, dividir los trabajos por ángulo de visión al calcular las secciones transversales del radar).
2.) Aquí simplemente lanzamos gente a la mezcla. Gran parte del código que tenemos es muy complicado, pero los científicos suelen ser un grupo de despistados a los que no les importa ese tipo de cosas. No es ideal, pero tenemos cosas que ofrecer y nos falta mucho personal. Estamos mejorando lentamente.
3.) Usamos SVN; sin embargo, no tenemos software de seguimiento de errores. Lo mejor para nosotros es un archivo txt que le dice dónde están los errores específicos.
4.) Mi sugerencia para implementar las mejores prácticas para los científicos: hágalo lentamente . Como científicos, normalmente no enviamos productos. Nadie en la ciencia se hace un nombre por tener un código limpio y fácil de mantener . Por lo general, obtienen el reconocimiento de los resultados de ese código. Necesitan ver una justificación para dedicar tiempo a aprender prácticas de software. Introduzca lentamente nuevos conceptos e intente que los sigan; son científicos, así que después de que su propia evidencia empírica confirme la utilidad de cosas como el control de versiones, ¡comenzarán a usarlo todo el tiempo!
fuente
Recomiendo encarecidamente leer "Lo que todo científico informático debe saber sobre la aritmética de punto flotante" . Muchos de los problemas que encuentro con regularidad provienen de problemas con la programación de punto flotante.
fuente
Soy un físico que trabaja en el campo de la física de la materia condensada, construyendo modelos clásicos y cuánticos.
Idiomas:
Bibliotecas:
Gráficos:
Herramientas de desarrollo:
fuente
Trabajo como físico en una universidad del Reino Unido.
Quizás debería enfatizar que diferentes áreas de investigación tienen diferente énfasis en la programación. Los físicos de partículas (como dmckee) realizan modelos computacionales casi exclusivamente y pueden colaborar en grandes proyectos de software, mientras que las personas en campos como el mío (materia condensada) escriben código con relativa poca frecuencia. Sospecho que la mayoría de los científicos caen en el último campo. Yo diría que las habilidades de codificación generalmente se consideran útiles en física, pero no esenciales, al igual que las habilidades de física / matemáticas se consideran útiles para los programadores pero no esenciales. Teniendo esto en cuenta...
Por lo general, el análisis y el trazado de datos se realizan utilizando paquetes de análisis de datos genéricos como IGOR Pro , ORIGIN , Kaleidegraph , que se pueden considerar como 'Excel plus'. Estos paquetes suelen tener un lenguaje de secuencias de comandos que se puede utilizar para automatizar. Un análisis más especializado puede tener una utilidad dedicada para el trabajo que generalmente se habrá escrito hace mucho tiempo, nadie tiene la fuente y tiene muchos errores. Algunos tipos más técnicos podrían usar los lenguajes que se han mencionado (Python, R, MatLab con Gnuplot para trazar).
El software de control se realiza comúnmente en LabVIEW, aunque en realidad usamos Delphi, lo cual es algo inusual.
He estado en seminarios sobre computación en cuadrícula, visualización en 3D, aprendizaje de Boost, etc. impartidos por ambas universidades en las que he estado. Como estudiantes universitarios, nos enseñaron VBA para Excel y MatLab, pero C / MatLab / LabVIEW es más común.
No, aunque la gente tiene configuraciones de desarrollo personal. Nuestra base de código está en una carpeta compartida en un 'servidor' que se mantiene actualizado con una herramienta de sincronización.
¡Un paso a la vez! Estoy tratando de reemplazar la carpeta compartida con algo un poco más sólido, quizás ayudaría encontrar un cliente SVN que imite el comportamiento actual de las herramientas de sincronización.
Sin embargo, diría que, en general, para la mayoría de los proyectos de ciencias naturales, ¡es mejor invertir el tiempo en investigación!
fuente
Ex-físico académico y ahora físico industrial del Reino Unido aquí:
¿Qué lenguajes / entornos ha utilizado para desarrollar software científico, esp. ¿análisis de los datos? ¿Qué bibliotecas? (Por ejemplo, ¿qué usas para trazar?)
Utilizo principalmente MATLAB en estos días (funciones de visualización y matemáticas de fácil acceso). Solía usar mucho Fortran e IDL . He usado C (pero soy más un lector que un escritor de C), macros de Excel (feas y confusas). Actualmente necesito poder leer Java y C ++ (pero realmente no puedo programar en ellos) y también he pirateado Python. Para mi propio entretenimiento, ahora estoy haciendo algo de programación en C # (principalmente para obtener portabilidad / bajo costo / interfaces bonitas). Puedo escribir Fortran en prácticamente cualquier idioma que se me presente ;-)
¿Hubo formación para personas sin experiencia significativa en programación?
La mayoría (¿todos?) Los cursos de física de pregrado tendrán un pequeño curso de programación generalmente en C, Fortran o MATLAB, pero son los conceptos básicos reales. Realmente me gustaría haber tenido alguna formación en ingeniería de software en algún momento (control de revisión / pruebas / diseño de sistemas de mediana escala)
¿Tenías algo como control de versiones, seguimiento de errores?
Comencé a usar Subversion / TortoiseSVN hace relativamente poco tiempo. Los grupos con los que he trabajado en el pasado han utilizado el control de revisión. No conozco ningún grupo académico que utilice software formal de seguimiento de errores. Todavía no utilizo ningún tipo de prueba sistemática.
¿Cómo podría intentar crear un entorno decente para la programación, sin interferir demasiado en el camino de los científicos individuales (especialmente los físicos son personas tercas!)
Intentaría presentar algunas ideas de ingeniería de software a nivel de pregrado y luego reforzarlas con la práctica a nivel de posgrado, también proporcionaría sugerencias sobre recursos como el curso de Carpintería de software mencionado anteriormente.
Espero que una fracción significativa de los físicos académicos escriban software (aunque no necesariamente todos) y necesitan urgentemente al menos una introducción a las ideas en ingeniería de software.
fuente
Python, NumPy y pylab (trazado).
No, pero estaba trabajando en un laboratorio de investigación multimedia, así que casi todo el mundo tenía experiencia en informática.
Sí, Subversion para control de versiones, Trac para seguimiento de errores y wiki. Puede obtener un alojamiento de control de versiones / seguimiento de errores gratuito en http://www.assembla.com/ si sus TOS se ajustan a su proyecto.
Asegúrese de que la infraestructura esté configurada y bien mantenida e intente vender los beneficios del control de fuente.
fuente
Soy estadístico en una universidad del Reino Unido. Generalmente, la gente aquí usa R para el análisis de datos, es bastante fácil de aprender si conoce C / Perl. Su verdadero poder está en la forma en que puede importar y modificar datos de forma interactiva. Es muy fácil tomar una serie de archivos CSV (o Excel) y fusionarlos, crear nuevas columnas basadas en otras y luego lanzarlas a un GLM, GAM o algún otro modelo. Trazar también es trivial y no requiere el conocimiento de un lenguaje completamente nuevo (como PGPLOT o GNUPLOT). Por supuesto, también tiene la ventaja de tener un montón de características integradas (desde cosas simples como media, desviación estándar, etc.). el camino a las redes neuronales, splines y trazados GL).
Habiendo dicho esto, hay un par de problemas. Con conjuntos de datos muy grandes, R puede volverse muy lento (solo he visto esto con conjuntos de datos> 50,000x30) y, dado que se interpreta, no obtiene la ventaja de Fortran / C a este respecto. Pero, puede (muy fácilmente) hacer que R llame a las bibliotecas compartidas de C y Fortran (ya sea de algo como netlib o de las que haya escrito usted mismo). Por lo tanto, un flujo de trabajo habitual sería:
Lo que me funciona muy bien.
Soy una de las únicas personas en mi departamento (de más de 100 personas) que usa el control de versiones (en mi caso, usando git con githuib.com). Esto es bastante preocupante, pero simplemente no parecen estar interesados en probarlo y están contentos con pasar archivos zip (¡puaj!)
Mi sugerencia sería continuar usando LabView para la adquisición (y quizás intentar que sus compañeros de trabajo estén de acuerdo en un conjunto de herramientas para la adquisición y hacer que esté disponible para todos) y luego pasar a exportar los datos a un CSV (o similar) y haciendo el análisis en R. Realmente tiene muy poco sentido reinventar la rueda a este respecto.
fuente
¿Qué lenguajes / entornos ha utilizado para desarrollar software científico, esp. ¿análisis de los datos? ¿Qué bibliotecas? (Por ejemplo, ¿qué usas para trazar?)
Mi departamento de física de pregrado enseñó clases de LabVIEW y lo usó ampliamente en sus proyectos de investigación.
La otra alternativa es MATLAB , en la que no tengo experiencia. Hay campamentos para ambos productos; cada uno tiene sus propias ventajas / desventajas. Dependiendo del tipo de problemas que necesite resolver, un paquete puede ser más preferible que el otro.
Con respecto al análisis de datos, puede usar cualquier tipo de analizador de números que desee. Idealmente, puede hacer los cálculos duros en el lenguaje X y formatear la salida para trazar bien en Excel, Mathcad , Mathematica o cualquiera que sea el sistema de trazado del estilo del día. No espere estandarización aquí.
¿Tenías algo como control de versiones, seguimiento de errores?
Mirando hacia atrás, no lo hicimos, y hubiera sido más fácil para todos si lo hiciéramos. ¡No hay nada como romper todo y luchar durante horas para arreglarlo!
Definitivamente use el control de fuente para cualquier código común. Anime a las personas a escribir su código de una manera que pueda hacerse más genérica. En realidad, esto es solo las mejores prácticas de codificación. Realmente, debería hacer que enseñen (o tomen) una clase de informática para que puedan aprender lo básico.
¿Cómo podría intentar crear un entorno decente para la programación, sin interferir demasiado en el camino de los científicos individuales (especialmente los físicos son personas tercas!)
Existe una clara división entre la adquisición de datos (DAQ) y el análisis de datos. Es decir, es posible estandarizar en el DAQ y luego permitir que los científicos jueguen con los datos en el programa de su elección.
fuente
Otra buena opción es Scilab . Tiene módulos gráficos al estilo de LabVIEW , tiene su propio lenguaje de programación y también puede incrustar código Fortran y C, por ejemplo. Se utiliza en los sectores público y privado, incluidas las grandes empresas industriales. Y es gratis.
En cuanto al control de versiones, algunos prefieren Mercurial , ya que brinda más libertades para administrar y definir los repositorios. Sin embargo, no tengo experiencia con eso.
Para trazar utilizo Matplotlib . Pronto tendré que hacer animaciones y he visto buenos resultados con MEncoder . Aquí hay un ejemplo que incluye una pista de audio.
Finalmente, sugiero que sea modular, es decir, tratar de mantener las piezas principales de código en diferentes archivos, para que la revisión, la comprensión, el mantenimiento y la mejora del código sean más fáciles. He escrito, por ejemplo, un módulo de Python para pruebas de integridad de archivos, otro para secuencias de procesamiento de imágenes, etc.
También debe considerar desarrollar con el uso de un depurador que le permita verificar el contenido de las variables en puntos de interrupción configurables en el código, en lugar de usar líneas de impresión. He usado Eclipse para el desarrollo de Python y Fortran (aunque obtuve un error falso al compilar un programa corto de Fortran con él, pero puede haber sido una mala configuración) y estoy empezando a usar el IDE de Eric para Python. Te permite depurar, administrar versiones con SVN , tiene una consola integrada, puede hacer refactorización con Bicycle Repair Man (también puede usar otra), tienes Unittest, etc. Una alternativa más ligera para Python es IDLE , incluido con Python desde la versión 2.3.
Como algunas sugerencias, también sugiero:
No utilizar variables de un solo carácter. Cuando desee buscar apariencias, obtendrá resultados en todas partes. Algunos argumentan que un IDE decente facilita esto, pero luego dependerá de tener acceso permanente al IDE. Incluso usar ii, jj y kk puede ser suficiente, aunque esta elección dependerá de su idioma. (Las vocales dobles serían menos útiles si los comentarios de código se hacen en estonio, por ejemplo).
Comentando el código desde el principio.
Para aplicaciones críticas, a veces es mejor confiar en versiones de compilador / lenguaje más antiguas (versiones principales), más estables y mejor depuradas. Por supuesto, puede tener un código más optimizado en versiones posteriores, errores corregidos, etc., pero estoy hablando de usar Fortran 95 en lugar de 2003, Python 2.5.4 en lugar de 3.0, más o menos. (Especialmente cuando una nueva versión rompe la compatibilidad con versiones anteriores). Muchas mejoras suelen introducir muchos errores. Aún así, esto dependerá de los casos de aplicación específicos. Tenga en cuenta que esta es una elección personal, muchas personas podrían argumentar en contra de esto.
¡Utilice copias de seguridad redundantes y automatizadas! (Con control de versiones).
fuente
Definitivamente, use Subversion para mantener copias instantáneas del código fuente actualizadas, en progreso y estables. Esto incluye C ++, Java, etc. para herramientas de software propias y scripts rápidos para procesamiento único.
Con una fuerte inclinación por la ciencia y la ingeniería aplicada hacia la metodología de desarrollo de "vaquero solitario", la práctica habitual de organizar el repositorio en tronco, etiqueta y lo que sea, ¡no se moleste! A los científicos y sus técnicos de laboratorio les gusta girar perillas, mover electrodos y perseguir fugas de vacío. Es un trabajo suficiente para que todos estén de acuerdo, digamos Python / NumPy o sigan alguna convención de nomenclatura; olvídese de intentar que sigan prácticas y convenciones arcanas de los desarrolladores de software.
fuente
Para la gestión del código fuente, los sistemas centralizados como Subversion son superiores para el uso científico debido al claro punto único de verdad (SPOT). El registro de cambios y la capacidad de recuperar versiones de cualquier archivo, sin tener que buscar dónde encontrar algo, tiene enormes ventajas para el mantenimiento de registros. Herramientas como Git y Monotone : ¡Dios mío, el caos que puedo imaginar que seguiría! Tener registros claros de qué versión de los scripts de hack-job se usaron mientras se jugaba con el nuevo sensor cuando ese bosón de Higgs pasó o esa supernova explotó, conducirá a la felicidad.
fuente
Idiomas que he usado para temas numéricos y relacionados con la ciencia:
Mi editor es Emacs, aunque uso vim para cosas rápidas como editar archivos de configuración.
Para trazar, generalmente genero un archivo de texto y lo ingreso en gnuplot.
Para el análisis de datos, generalmente genero un archivo de texto y uso GNU R.
Veo a mucha gente aquí usando FORTRAN (en su mayoría 77, pero alrededor de 90), mucho Java y algo de Python. No me gustan esos, así que no los uso.
Creo que esto no se aplica a mí, ya que me gradué en informática, pero donde trabajo no hay una formación formal, pero las personas (ingenieros, físicos, matemáticos) se ayudan entre sí.
¡El control de versiones es absolutamente importante! Guardo mi código y datos en tres máquinas diferentes, en dos lados diferentes del mundo, en repositorios de Git. Los sincronizo todo el tiempo (¡así que tengo control de versiones y copias de seguridad!) No hago control de errores, aunque puedo empezar a hacerlo. Pero mis colegas no usan BTS ni VCS en absoluto.
Primero, les daría la mayor libertad posible. (En la universidad donde trabajo, podría elegir entre que alguien instale Ubuntu o Windows, o instalar mi propio sistema operativo; elegí instalar el mío propio. No tengo apoyo de ellos y soy responsable de todo lo que suceda con mis máquinas, incluidos los problemas de seguridad, pero hago lo que quiero con la máquina).
En segundo lugar, vería a qué están acostumbrados y lo haría funcionar (¿necesita FORTRAN? Lo configuraremos. ¿Necesita C ++? No hay problema. ¿Mathematica? OK, compraremos una licencia). Luego, vea cuántos de ellos quisieran aprender "herramientas adicionales" para ayudarlos a ser más productivos (no diga "herramientas diferentes". Diga "adicionales" para que no parezca que nadie "perderá" o "dejará ir "o lo que sea). Comience con los editores, vea si hay grupos a los que les gustaría usar VCS para sincronizar su trabajo (oye, puede quedarse en casa y enviar su código a través de SVN o GIT, ¿no sería genial?) Y así sucesivamente. No impongas: muestra ejemplos de lo geniales que son estas herramientas. Realice análisis de datos con R y demuéstreles lo fácil que fue. Muestre buenos gráficos y explique cómo los ha creado (pero comience con ejemplos simples,
fuente
Sugeriría F # como un candidato potencial para realizar manipulaciones relacionadas con la ciencia dados sus fuertes lazos semánticos con construcciones matemáticas.
Además, su compatibilidad con unidades de medida, como se describe aquí, tiene mucho sentido para garantizar una traducción adecuada entre el modelo matemático y el código fuente de implementación.
fuente
En primer lugar, definitivamente optaría por un lenguaje de secuencias de comandos para evitar tener que explicar muchas cosas adicionales (por ejemplo, la administración manual de la memoria está, en su mayoría, bien si está escribiendo cosas de bajo nivel y sensibles al rendimiento, pero para alguien que simplemente quiere usar una computadora como calculadora científica actualizada, definitivamente es excesivo). Además, mire a su alrededor si hay algo específico para su dominio (como es R para estadísticas). Esto tiene la ventaja de que ya se trabaja con los conceptos con los que los usuarios están familiarizados y de tener un código especializado para situaciones específicas (por ejemplo, calcular desviaciones estándar, aplicar pruebas estadísticas, etc. en el caso de R).
Si desea utilizar un lenguaje de secuencias de comandos más genérico, optaría por Python. Dos cosas que tiene a su favor son:
Como ventaja adicional, tiene bibliotecas para la mayoría de las cosas que le gustaría hacer con él.
fuente
No soy un experto en esta área, pero siempre he entendido que para eso se creó MATLAB . También hay una forma de integrar MATLAB con SVN para el control de fuentes .
fuente