Todo científico necesita saber un poco sobre estadísticas: qué significa correlación, qué es un intervalo de confianza, etc. Del mismo modo, todo científico debería saber un poco sobre informática: la pregunta es, ¿qué? ¿Qué es razonable esperar que todo científico que trabaja sepa sobre la construcción y el uso de software? Nuestra lista de habilidades básicas, las cosas que las personas deben saber antes de abordar cualquier cosa con "nube" o "peta" en su nombre, es:
- programación básica (bucles, condicionales, listas, funciones y E / S de archivo)
- el script de shell / shell básico
- control de versiones
- cuanto probar los programas
- SQL básico
Hay muchas cosas que no están en esta lista: programación matricial (MATLAB, NumPy y similares), hojas de cálculo cuando se usan bien, son tan poderosas como la mayoría de los lenguajes de programación), herramientas de automatización de tareas como Make, etc.
Entonces: ¿qué hay en tu lista? ¿Qué crees que es justo esperar que cada científico sepa en estos días? ¿Y qué sacarías de la lista anterior para dejar espacio? Nadie tiene tiempo suficiente para aprenderlo todo.
Respuestas:
"Computational Scientist" es algo amplio porque incluye a personas que realizan análisis numéricos con papel / LaTeX e implementaciones de prueba de concepto, personas que escriben bibliotecas de propósito general y personas que desarrollan aplicaciones que resuelven ciertas clases de problemas, y usuarios finales que utilizan esos aplicaciones. Las habilidades necesarias para estos grupos son diferentes, pero existe una gran ventaja de tener cierta familiaridad con el "stack completo". Describiré lo que creo que son las partes críticas de esta pila, las personas que trabajan en ese nivel, por supuesto, deberían tener un conocimiento más profundo.
Conocimiento de dominio (por ejemplo, antecedentes de física e ingeniería)
Todos deben conocer los conceptos básicos de la clase de problemas que están resolviendo. Si trabaja en PDE, esto significaría cierta familiaridad general con algunas clases de PDE (por ejemplo, Poisson, elasticidad y Navier-Stokes incompresible y compresible), especialmente qué propiedades son importantes para capturar "exactamente" y qué puede depender de la discretización. error (esto informa la selección del método con respecto a la conservación local y los integradores simplécticos). Debe conocer algunos tipos de análisis funcionales y de interés para las aplicaciones (optimización de elevación y arrastre, predicción de fallas, inversión de parámetros, etc.).
Matemáticas
Todos deberían tener cierta familiaridad general con las clases de métodos relevantes para el dominio de su problema. Esto incluye características básicas de álgebra lineal dispersa versus densa, disponibilidad de "métodos rápidos", propiedades de técnicas de discretización espacial y temporal y cómo evaluar qué propiedades de un problema físico son necesarias para que una técnica de discretización sea adecuada. Si usted es principalmente un usuario final, este conocimiento puede ser de muy alto nivel.
Ingeniería de software y bibliotecas
Alguna familiaridad con las técnicas de abstracción y el diseño de la biblioteca es útil para casi todos en la ciencia computacional. Si trabaja con métodos de prueba de concepto, esto mejorará la organización de su código (facilitando que alguien más lo "traduzca" en una implementación sólida). Si trabaja en aplicaciones científicas, esto hará que su software sea más extensible y facilitará la interfaz con las bibliotecas. Sea defensivo al desarrollar código, de modo que los errores se detecten lo antes posible y los mensajes de error sean lo más informativos posible.
Herramientas
Trabajar con software es una parte importante de la ciencia computacional. La competencia con el idioma elegido, el soporte del editor (por ejemplo, etiquetas, análisis estático) y las herramientas de depuración (depurador, valgrind) mejoran en gran medida la eficiencia de su desarrollo. Si trabaja en entornos por lotes, debe saber cómo enviar trabajos y obtener sesiones interactivas. Si trabaja con código compilado, un conocimiento práctico de compiladores, vinculadores y herramientas de compilación como Make le ahorrará mucho tiempo. El control de versiones es esencial para todos, incluso si trabaja solo. Aprende Git o Mercurial y úsalo para cada proyecto. Si desarrolla bibliotecas, debe conocer los estándares de idioma de manera razonablemente completa para que casi siempre escriba código portátil la primera vez, de lo contrario, quedará enterrado en las solicitudes de soporte del usuario cuando su código no se construya en su entorno funky.
Látex
LaTeX es el estándar de facto para la publicación científica y la colaboración. El dominio de LaTeX es importante para poder comunicar sus resultados, colaborar en propuestas, etc. Crear secuencias de comandos para la creación de figuras también es importante para la reproducibilidad y la procedencia de los datos.
fuente
Mi propia experiencia es en informática, por lo que mis opiniones pueden ser un poco sesgadas. Dicho esto, agregaría "algoritmos básicos y estructuras de datos" a la lista. Lo que quiero decir con lo básico es esencialmente búsqueda lineal y clasificación, y estructuras de datos como árboles equilibrados, montones o tablas hash.
¿Por qué? Bueno, en la mayoría de los algoritmos computacionales, terminas gastando una cantidad extraordinaria de tiempo y esfuerzo cambiando los datos y no calculando nada. ¿Alguna vez implementó un código de elementos finitos? Eso es alrededor del 90% de organización de datos. La diferencia entre hacer esto y hacerlo bien puede ser un orden de magnitud en la eficiencia computacional.
Un punto menor relacionado con la informática también agregaría es una breve introducción sobre cómo funciona realmente un procesador y qué es bueno y qué no es. Por ejemplo:
Esto es algo aburrido, pero lleva solo unos minutos explicarlo, y tenerlo en cuenta le permitirá escribir un buen código desde el principio, o diseñar algoritmos que no dependan de características de hardware inexistentes.
En cuanto a qué eliminar de la lista, creo que SQL es un poco demasiado para los científicos computacionales. Además, la prueba de software es importante, pero es una ciencia en sí misma. Las pruebas unitarias y los tipos correctos de datos abstractos son algo que debería enseñarse con programación básica y no requiere un programa de maestría de dos años.
fuente
Podría agregar a esto más adelante, pero para empezar, sacaría "scripting de shell" y lo reemplazaría específicamente con "scripting de Python". Python es mucho más portátil que los scripts de shell, y más legible que los lenguajes de scripts y shell comparables. Su gran biblioteca estándar y su popularidad en las ciencias (con la posible excepción de la biología, que también usa Perl) lo convierten en una gran lengua franca computacional , sin mencionar un buen primer idioma para la programación de aprendizaje. Ahora es el primer idioma que se enseña a los mayores de EECS en el MIT, y es popular en el mercado laboral, particularmente en informática científica. Su documentación en línea es extensa, y también hay una serie de textos de programación basados en Python disponibles en línea.
Usando Python, podría enseñar construcciones básicas de programación, así como secuencias de comandos. Además, Python tiene un excelente soporte para pruebas unitarias, por lo que Python también podría usarse para enseñar pruebas unitarias. Python también tiene una API de base de datos extensa (que podría reemplazar o aumentar la necesidad de aprender SQL), y un par de utilidades de compilación que ofrecen una funcionalidad similar a la de Make. Personalmente prefiero SCons sobre Make, porque encuentro que Python es más fácil de documentar y probar que los scripts de shell.
En última instancia, el principio motivador detrás de mi chelín flagrante para Python es la eficiencia. Es mucho más fácil racionalizar su flujo de trabajo si puede hacer la mayor parte de su trabajo en un idioma o una herramienta, especialmente cuando esa herramienta es un lenguaje de script expresivo. Claro, podría hacer todo en C, pero mi programa sería 5 veces más largo y es probable que no necesite la velocidad. En cambio, puedo usar Python para importar datos de un archivo de texto, trazarlo, llamar a rutinas de optimización, generar variantes aleatorias, trazar mis resultados, escribir resultados en un archivo de texto y probar mi código de forma unitaria. Si Python es demasiado lento, es posible ajustar Python alrededor del código C, C ++ o Fortran que se encarga de las tareas computacionalmente intensivas. Python es, para mí, una ventanilla única para la mayoría de mis necesidades informáticas científicas.
Python aún no es exactamente MATLAB; SciPy y NumPy todavía tienen mucho camino por recorrer en términos de funcionalidad, pero en términos de utilidad general, uso Python para una variedad más amplia de tareas que MATLAB.
fuente
Punto flotante matemático. La mayoría de la ciencia se ocupa de los valores del mundo real, y los valores del mundo real a menudo se representan como coma flotante en el mundo informático. Hay muchas trampas potenciales con carrozas que pueden causar estragos en la importancia de los resultados.
La referencia favorita para este tema parece ser "Lo que todo informático debe saber sobre la aritmética de coma flotante (1991)" por David Goldberg http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768
fuente
Un científico computacional debe tener suficiente familiaridad en informática, matemáticas y un campo de aplicación en ciencia / ingeniería. Incluiría habilidades en cada una de las siguientes áreas:
Matemáticas:
Ciencias de la Computación:
Ciencia / Ingeniería: depende de la aplicación en la que desee especializarse. En mi caso particular (ingeniería), agregaría cosas como mecánica continua, transferencia de calor, dinámica de fluidos, método de elementos finitos, etc. Diría que cuanto más familiaridad tenga con múltiples campos de la ciencia, más versátil eres como científico computacional.
fuente
¡Gran pregunta seguida de respuestas fascinantes! Me gustaría intervenir con solo una pequeña adición. Por lo que he experimentado (yo mismo y indirectamente), una herramienta todo en uno suele ser realmente bueno saber. Dicha herramienta podría ser MATLAB, Octave o incluso Python (con bibliotecas). Siempre que tenga un problema en su "zona de confort", una buena idea (por lo que yo sé y creo) sería probar con una herramienta todo en uno. Puedes intentar escribir tus propios códigos más tarde. La belleza de estos paquetes es que la programación no interfiere con la comprensión de lo que está haciendo.
Tome un ejemplo de gráficos por computadora. Escribir un código para la traducción, rotación o escala de una figura es 10 líneas de código en MATLAB (arriba) pero puede ejecutarse para páginas en C. No estoy diciendo que C no sea bueno. Todo lo que digo es que si no tienes una buena razón para escribir códigos en C, MATLAB sería una salida más simple, mejor y más intuitiva.
Algunos pueden estar en desacuerdo y afirmar que la programación tipo C es una excelente manera de desarrollar la intuición. Tal vez lo es. Pero cuando no tiene que lidiar con un problema más de unas pocas veces, apenas se justifica sentarse y escribir sus propios códigos en un idioma como C.
fuente
Sentido común y presentimiento ... Esto último llega solo con el tiempo y después de haber "sobrevivido" un par de experiencias vergonzosas en el gran mundo malo.
fuente