¿Qué habilidades básicas debe tener todo científico computacional? [cerrado]

52

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.

Greg Wilson
fuente
1
Gran pregunta! Pero no tengo claro una cosa: ¿qué quieres decir con científico computacional? ¿Algún científico que use computación? ¿O el grupo MUCHO más pequeño de personas que considerarían su título profesional como "científico computacional"?
David Ketcheson
99
Hacer una lista de preguntas no es bueno en el formato Stack Exchange. ¿Realmente tenemos que pasar por esto en cada sitio?
dmckee
44
@Dan Community Wiki no es una excusa para permitir preguntas que no pertenecen al sitio. También me gustaría animar a los que responden a tomar un ejemplo de Jed y al menos intentar explicar por qué necesitarías ciertas habilidades o no necesitarías otras
Ivo Flipse
55
@IvoFlipse: Esta es una pregunta que pertenece al sitio de alguna forma. Tal vez no como se indica actualmente; tal vez deba ser dividido en preguntas más pequeñas y reformulado, pero el tema de la ingeniería de software deficiente en la ciencia computacional es extremadamente importante, particularmente porque la ciencia computacional como disciplina aún está en sus etapas formativas. Este artículo en Nature indica por qué. Greg está prestando un gran servicio a la comunidad de ciencias computacionales a través de su sitio web.
Geoff Oxberry
55
No estoy de acuerdo con que esta pregunta se cierre. Consulte (y vote) meta.scicomp.stackexchange.com/questions/179/…
David Ketcheson

Respuestas:

46

"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.

Jed Brown
fuente
77
Estoy de acuerdo con Jed. ¡LaTeX es absolutamente necesario! :)
Paul
1
Cambiaría "Física e ingeniería" a experiencia en la materia. Después de todo, no todos somos físicos o ingenieros. El espíritu de esa parte de la respuesta está en el lugar correcto, pero hay una suposición bastante evidente.
Fomite
Gracias @EpiGrad, lo cambié a "conocimiento del dominio" con esos como ejemplos.
Jed Brown
Buena lista Una comprensión básica de los problemas de rendimiento también debe estar ahí. He conocido a muchas personas que no entienden el simple concepto de código de creación de perfiles. NB: se debe considerar que el rendimiento significa no solo problemas de velocidad sino también el uso de memoria.
Faheem Mitha
Errores tipográficos: "problemas" y "enterrados". SE no me dejó arreglarlos, una edición demasiado pequeña.
Faheem Mitha
26

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:

  • La suma y la multiplicación son rápidas, la división o las funciones trascendentales no lo son. He visto a hombres adultos reemplazar una operación de raíz cuadrada con algo que requirió tres divisiones y creo que han hecho algo grandioso (la división y la raíz cuadrada son igual de caras).
  • Los cachés de nivel 3 se hacen cada año más grandes, sí, pero el caché de nivel 0, es decir, el realmente rápido, todavía es de unos pocos kilobytes.
  • Los compiladores no son mágicos. Pueden desenrollar pequeños bucles o vectorizar operaciones extremadamente sencillas, pero no convertirán esa burbuja en una clasificación rápida.
  • Los métodos de llamada en objetos polimórficos con herencia múltiple en su bucle más interno pueden ser conceptualmente dulces, pero harán que su CPU quiera suicidarse.

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.

Pedro
fuente
2
No es aburrido en absoluto. Tomaría un curso como ese, si estuviera en oferta. :-)
Faheem Mitha
18

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.

Geoff Oxberry
fuente
77
No puedo evitar estar completamente en desacuerdo con esto. Python es un dolor de cabeza para los encargados del mantenimiento de sistemas, ya que es un objetivo en movimiento. Los científicos computacionales deben tener una comprensión básica de bash o csh para el pegado más rudimentario de cosas y la ejecución de trabajos en los sistemas que es probable que usen. Python es genial, y te apoyo abogando por que la gente de computación lo aprenda, pero no a expensas de algún shell rudimentario.
Bill Barth
77
@BillBarth: Creo que todo científico computacional tiene que aprender bash o csh básicos para scripts muy, muy básicos. La razón por la que defiendo el uso de Python para el script de shell más allá de esas tareas básicas es porque heredé un script bash de mil líneas que esencialmente ejecuta un programa . Pasa archivos de un lado a otro como semáforos, invoca repetidamente PBS y no hay forma de probarlo. El scripting de Shell es ideal para tareas pequeñas, pero no para tareas grandes, y esta pesadilla de cinta adhesiva y chicle me ha costado un par de años de mi tesis, por lo que insisto.
Geoff Oxberry
2
Como dije, no estoy en desacuerdo con que "aprender Python" podría ser apropiado para la lista. Simplemente no quiero hacerlo a expensas de "shell scripting". Ambos son importantes, y nadie le permitirá ejecutar ipython como su shell, por lo que las secuencias de comandos de shell son muy importantes.
Bill Barth
3
@BillBarth: en ninguna parte sugiero que Python reemplace el shell. Solo sugiero que Python reemplace bash por secuencias de comandos; Creo que si aprende bash básico, sabe lo suficiente como para escribir scripts sin estructuras de control, por lo que no hay necesidad de profundizar en "scripting bash". Tan pronto como desee incluir una estructura de control, debe cambiar a un idioma diferente, porque la programación en bash es un dolor de cabeza para el software y los mantenedores de bibliotecas.
Geoff Oxberry
1
+1. Python ha sido mi lenguaje de programación principal por algún tiempo. No es perfecto, pero lo hará hasta que alguien invente el lenguaje de programación perfecto.
Faheem Mitha
14

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

Peter Recore
fuente
1
Este documento ha sido mencionado tantas veces en foros en línea. Pero es un artículo muy largo y denso, y no estoy seguro de cuántas personas han podido sacar algo útil de esto.
johngreen
12

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:

  1. Análisis numérico
  2. Álgebra lineal
  3. Ecuaciones diferenciales ordinarias, parciales y / o estocásticas
  4. Mejoramiento
  5. Estadísticas y / o probabilidad
  6. Teoría inversa

Ciencias de la Computación:

  1. Algoritmos
  2. Estructuras de datos
  3. Programación en paralelo (MPI, OpenMP, CUDA, etc.)
  4. Visualización científica
  5. Arquitectura de Computadores
  6. Usando un entorno Linux

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.

Paul
fuente
¿Puedes elaborar sobre "Teoría inversa"?
Faheem Mitha
1
@FaheemMitha: Tradicionalmente, primero establecemos los parámetros de un modelo (por ejemplo, una ecuación diferencial parcial), luego observamos el comportamiento del sistema. Un "problema inverso" es hacer lo contrario. Comenzamos con las observaciones de la salida del sistema e intentamos determinar los parámetros del modelo que producen estas observaciones. La teoría inversa describe métodos para realizar esta tarea.
Paul
Gracias por la explicación. ¿Tiene un buen enlace / referencia para este tema?
Faheem Mitha
2
en.wikipedia.org/wiki/Inverse_problem es un buen lugar para comenzar. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf también tiene una buena descripción general. Pero para una comprensión más profunda, recomendaría un libro como amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…
Paul
4

¡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.

Encuesta
fuente
-1

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.

GertVdE
fuente
3
No sé si "presentimiento" es realmente una habilidad. Es más que una reacción instintiva a la experiencia previa.
naught101