El arte evanescente de la programaci贸n cient铆fica, por Dr. Juan Juli谩n Merelo Guerv贸s.
De la universidad de Granada en el viejo continente de Europa
Somos malos
Arte de la programaci贸n cient铆fica /2
Muy malos
Arte de la programaci贸n cient铆fica /3
Yo, el peor
Arte de la programaci贸n cient铆fica /4
Esta charla es sobre ser un poco mejor En programaci贸n cient铆fica, nada menos Arte de la programaci贸n cient铆fica /5
Y sobre el
zen
Arte de la programaci贸n cient铆fica /6
Y sobre escribir trabajos publicables a través de programación científica eficiente y mantenible. Arte de la programación científica /7
1. Prepara tu entorno
Arte de la programaci贸n cient铆fica /8
Las herramientas del negocio ● ●
Usa sistemas operativos de verdad. Editores de programador: kate, emacs, geany (tu editor favorito aquí) + Debugger (gdb, languagespecific debugger) ●
●
Crea macros, colores según la sintaxis y comprobación de la misma, debugging en línea.
IDE: Eclipse, NetBeans ●
Curva de aprendizaje inclinada, dirigidos a Java, y demasiado pesados en consumo de recursos –
En muchos casos acaba mereciendo la pena Arte de la programación científica /9
2. Libera tu c贸digo y datos
Arte de la programaci贸n cient铆fica /10
Pero, tío... ●
Libera primero, programa después ●
El código científico debe nacer libre
●
La ciencia debe ser reproducible.
●
Más fácil para otros partir de tu trabajo ●
Se incrementa H –
Llegas al cielo de los científicos.
●
Manifiesta suposiciones escondidas.
●
Si no compartes, es que te da igual. Arte de la programación científica /11
3. Minimiza errores a trav茅s de programaci贸n dirigida por pruebas Arte de la programaci贸n cient铆fica /12
Tests antes del código ●
¿Qué quieres que haga tu código? ●
●
Mutar una cadena de bits, por ejemplo.
Escribe el test ●
¿El resultado es diferente del original? –
¡Por supuesto! ●
¿Lo seguirá siendo si cambias una dependencia? ¿O la representación?
●
¿Cambia todos los bits en la misma proporción?
●
¿Sigue la tasa de mutación (más o menos)?
●
¿Deja el original tranquilo? Arte de la programación científica /13
Una entornos de prueba ●
Las pruebas unitarias se hacen para pillar errores en los átomos más pequeños de un programa ●
●
Todos los lenguajes tienen su entorno ●
●
Interfaz, clase, función, decisión.
PHPUnit, jUnit, xUnit, DejaGNU...
Escribe tests para que fallen, no para que vayan bien.
Arte de la programación científica /14
4. Controla la fuente de tu poder
Arte de la programaci贸n cient铆fica /15
Los sistemas de control de fuentes te salvan el culo ●
Los sistemas de control de código permiten... ●
Checkpoints
●
Interacción estigmérgica
●
Responsabilidad invidual sobre cambios en el código.
●
Ramas
●
Sistemas distribuidos de moda: git, mercurial, bazaar
●
Centralizados, demodés: subversion, cvs.
●
¡Copia de seguridad instantánea!
Arte de la programación científica /16
Código completo 1) Bájate el código/actualízalo 2) Haz cambios 3) Haz commit (y push si hay repositorio central)
Arte de la programación científica /17
Código completo 1) Bájate el código/actualízalo 2) Haz cambios 3) Prueba tu código 4) Haz commit (y push si hay repositorio central)
Arte de la programación científica /18
5. S茅 agn贸stico para el lenguaje Arte de la programaci贸n cient铆fica /19
El lenguaje le da forma al pensamiento ●
●
●
●
No te creas todo lo que dicen: ●
Los lenguajes compilados son más rápidos... pues no
●
No existe el almuerzo gratis.
Evita programar en C en cualquier lenguaje que uses Consider DSL: Damn Small Languages/Domain specific Languages Python, Perl, Lua, Ruby, Javascript, Clojure... los lenguajes interpretados son más rápidos. Arte de la programación científica /20
El culmen del agnosticismo Evolving Regular Expressions for GeneChip Probe Performance Prediction http://www.springerlink.com/content/j3x8r108x757876w/ Las expresiones regulares están codificadas en AWK: Although this may seem complex, gawk (Unix’ free interpreted pattern scanning and processing language) can handle populations of a million individuals.
Arte de la programación científica /21
6
Velocidad de programaci贸n
>
velocidad del programa
Arte de la programaci贸n cient铆fica /22
Científicos, no ingenieros de software ●
●
●
●
Nuestros plazos son para trabajos, no para publicaciones de productos. Lo que se debe optimizar es la velocidad de publicación. ¿Cuanto tiempo pasas escribiendo el programa/ejecutándolo/escribiendo el trabajo? Los lenguajes interpretados molan ●
Y minimizan el tiempo-hasta-publicación.
Arte de la programación científica /23
¿Perl más rápido que Java? Algorithm::Evolutionary, a flexible Perl module for evolutionary computation
http://www.springerlink.com/content/8h025g83j0q6827 ●
Clase por clase, Perl más compacto que Java ●
●
Menos código que escribir.
Dentro del código evolutivo puro, Algorithm::Evolutionary más rápido que ECJ
Arte de la programación científica /24
10. Conviértete
en un adepto del lenguaje elegido Arte de la programación científica /25
Si a sus años no se ha acostumbrado... ●
Tu primer lenguaje es una marca de fuego.
●
Pero no hay dos lenguajes iguales.
●
●
Todos los lenguajes incluyen soluciones muy eficientes para ●
Expresiones regulares
●
Proceso simbólico
●
Gráficos
●
… pero no todo a la vez
Equilibrio entre eficiencia y conocimiento. Arte de la programación científica /26
11 No supongas: mide Arte de la programaci贸n cient铆fica /27
Las prestaciones importan ●
Medida básica: tiempo de CPU medido por time
jmerelo@penny:~/proyectos/CPAN/Algorithm-Evolutionary/benchmarks$ time perl onemax.pl 0; time: 0.003274 1; time: 0.005438 [...] 498; time: 1.006539 499; time: 1.00884 500; time: 1.010817 real 0m1.349s user 0m1.140s sys 0m0.050s Arte de la programación científica /28
Más profundo: profilers Arte de la programación científica /29
El tamaño importa
Arte de la programación científica /30
12 Siempre hay un mejor algoritmo/ estructura de datos Arte de la programaci贸n cient铆fica /31
Las diferencias son grandes ●
Los algoritmos de clasificación son un ejemplo ●
●
Usa caches para acelerar la evaluación ●
●
¿Y realmente los necesitas? Cambia CPU por memoria (o viceversa)
Miles de formas de calcular algo ●
¿Cómo calculas el número de unos? –
●
$fitness_of{$chromosome} = ($copy_of =~ tr/1/0/);
Los algoritmos interaccionan con las estructuras de datos Arte de la programación científica /32
13
Aprende los trucos del negocio
Arte de la programaci贸n cient铆fica /33
Estamos en dos negocios ●
El del algoritmo en el que estemos trabajando. ●
Tú y tu algoritmo, uno solo –
●
●
No funciona, pero por una razón diferente por la que crees que no funciona
El de los lenguajes de programación ●
¿Qué función está mejor implementada?
●
¿Hay otra biblioteca más para clasificar?
●
¿Dónde deberías ir si hay un problema?
Incluso un tercer negocio: el de la programación en sí. Arte de la programación científica /34
Caso de estudio: ordenación ●
La ordenación se usa de forma rutinaria en los algoritmos evolutivos, por ejemplo. ●
●
●
Pero también en muchos otros.
Ordenación más rápida (en Perl): http://raleigh.pm.org/sorting.html ●
Ordenar implica comparar.
●
Orcish Manoeuver, Schwartzian transform
●
Sort::Key, la más rápida http://search.cpan.org/dist/Sort-Key/
¿Realmente, de veras, tienes que ordenar? ●
En algunos casos basta con extraer los n mejores o peores.
Arte de la programación científica /35
Facilita el procesamiento
14
de la salida
Arte de la programaci贸n cient铆fica /36
Evita ahogarte en datos ●
●
Cada experimento produce megas de datos ●
Tiempos, vectores, matrices, matrices asociativas...
●
Difíciles de entender después de cierto tiempo.
Usa lenguajes de serialización para almacenar los datos. ●
YAML: Yet another markup language
●
JSON: Javascript Object Notation
●
XML: eXtensible Markup languajge
●
… el que más rabia te dé. Arte de la programación científica /37
Un ejemplo: MasterMind Entropy-Driven Evolutionary Approaches to the Mastermind Problem Carlos Cotta et al., http://www.springerlink.com/content/d8414476w2044g2m/ ●
La salida está en YAML
●
Incluye
●
●
Parámetros del experimento
●
Datos por ejecución y por generación.
●
Tiempo de ejecución y población final.
¡Libre! Arte de la programación científica /38
15
Cuando todo falla
visualiza
Arte de la programaci贸n cient铆fica /39
16 a 25
Saca copias de tus datos Arte de la programaci贸n cient铆fica /40
Mejor a salvo que sin publicar ●
●
Usa un ordenador viejo para copias de seguridad. En algunos caso, crea entornos virtuales para reproducir el entorno de un trabajo ●
● ●
●
¿Seguro que gcc 3.2.3 funciona en Ubuntu 12.10?
Usa rsync, bacula o simplemente cp No se trata de si tu disco duro va a fallar, se trata de cuando. La nube está bien, pero las copias mejor. Arte de la programación científica /41
26 MantĂŠn tus cosas juntas Arte de la programaciĂłn cientĂfica /42
¿Dónde dejé las llaves? ●
●
●
Trabajo: programa + datos + gráficos + registros de experimentos + texto + revisiones + informes revisores + presentaciones. Los experimentos deben ser reejecutados, los gráficos retrazados, trabajos reescritos. Usa registros para saber qué parametros produjeron qué datos que produjeron qué gráficos ●
●
Mejor si no tienes que hacerlo.
Ponlo todo en el mismo árbol de directorios
Y cuanto se tardó
Arte de la programación científica /43
Considera programación literaria ●
●
●
●
Literate programming consiste en crear en un solo documento la descripción de un trabajo y el programa que lo lleva a cabo. Algunos programas permiten escribir en LaTeX e insertar código del paquete estadístico R. Consultar disponibilidad para tu plataforma favorita. En todo caso, no es la forma más popular del mundo de escribir trabajos. Arte de la programación científica /44
27 Sal y huele el aire
Arte de la programaci贸n cient铆fica /45
Lo nuevo siempre es mejor ●
Los paradigmas de programación cambian a diario ●
●
NoSQL, cloud computing, internet de las cosas, Google Prediction API, map/reduce, GPGPU, lenguajes funcionales.
Mantén un equilibrio entre seguir las modas y encontrar formas más eficientes de hacer la programación de tu trabajo ●
Y cuando digo hacer quiero decir publicar.
Arte de la programación científica /46
28 Cuida tu c贸digo Arte de la programaci贸n cient铆fica /47
Un momento de gozo, una vida de tristeza ●
Ejecuta tests periódicamente, o cuando haya un cambio de las dependencias o SO. ●
●
Mantén una hoja de ruta de versiones. ●
●
Se puede automatizar. Recuerda, es software libre
Consigue que la comunidad eche una mano ●
Tu investigación es para todo el mundo.
Arte de la programación científica /48
¡Publica, no perezcas!
Arte de la programación científica /49
¡O camello!
(No se hizo daño a ningún gato preparando esta presentación) ¡O becario!
http://geneura.wordpress.com http://twitter.com/geneura http://facebook.com/jjmerelo
Arte de la programación científica /50