Recientemente he visto por Twitter un post que me ha llamado mucho la atención por se muy real, se titula Defensa del código científico ineficiente, y viene a discutir un tema muy conocido en el mundo científico. Básicamente la cuestión es esta: muchos científicos, como un servidor, pasamos muchos días programando para resolver los problemas matemáticos que nos encontramos en nuestra investigación, entonces se plantean dos preguntas ¿Sabemos programar para realizar estas cuestiones? ¿No sería mejor que lo hicieran informáticos que harían un código más eficiente?
El trabajo del autor del post es precisamente ese, mejorar el código de investigadores para hacerlo más eficiente y narra como en algún momento ciertos investigadores se han negado a hacer esas mejoras. La cuestión es sencilla, si yo necesito mi programa para solucionar un problema y lo soluciona ya está todo hecho, no necesito mejorarlo para que en vez de 5 minutos tarde 1 porque es algo que sólo usaré una vez. Yo apoyo totalmente esa postura por los motivos siguientes:
Mi código sólo lo uso yo
En mi opinión es muy diferente hacer un programa para venderlo o liberarlo que hacerlo para uso personal. En los cursos de programación que hice en la universidad me enseñaron como hacer los programas robustos, de modo que si te pide un dato numérico y tú escribes una letra no se vuelva loco, también por si tratas de crear una matriz que es demasiado grande no se pare, sino que te de la posibilidad de solucionarlo. ¿Cuántas veces he usado esto en mi carrera profesional? Pues ninguna, obviamente.
La cuestión es que el código que yo hago lo uso yo mismo, y lo entiendo porque es mi código. Rara vez lo hago de modo que me pregunte los parámetros, sino que se los meto en un fichero de texto o bien dentro del mismo programa. Si la matriz es muy grande se para y entonces lo corrijo, si me equivoco y le introduzco un dato erróneo pues lo cambio. Simplemente no necesito dedicar tiempo a hacer mi código a prueba de errores de ese tipo porque es mucho más rápido e igual de eficiente no cometer errores de ese tipo.
El tiempo de CPU es más barato que mi tiempo
Esto es lo que principalmente comenta el post en cuestión y me ha recordado a un problema que tuve hace un par de años. Tenía que realizar un cálculo denominado Integración Montecarlo, para un trabajo sobre entrelazamiento en átomos. Era un cálculo sobre el que tenía alguna idea pero no lo sabía hacer, así que me puse a estudiar. Básicamente descubrí que hay varios métodos, el "plain Montecarlo", MISER y VEGAS. El primero es el más lento pero más fiable y los otros dos son bastante más rápidos. Después de analizarlo decidí que el primero es el que usaría, porque no necesitaba hacer alguno de los otros dos.
La cuestión básica es que en mi grupo de Granada hay un cluster de ordenadores muy potente, el proteus. Yo tenía acceso al él y decidí que era suficientemente eficiente hacer los cálculos mediante el uso de muchos núcleos al mismo tiempo, de modo que me ahorró a mi mucho tiempo de preparar el código. La cuestión es que como el tiempo de computación hoy en día es mucho más barato que el tiempo de trabajo de una persona especializada si los resultados van a ser iguales no merece la pena dedicarte a hacer un código extremadamente eficiente, sale más rentable simplemente hacer uno suficientemente bueno y luego usar un buen ordenador (o muchos).
Aquí he de decir que durante esos cálculos conseguí colapsar el cluster entero dos veces . Por suerte el grupo tiene un informático que se encarga de arreglar estas cosas y que conmigo tiene el cielo ganado.
El resultado es el mismo
Y esta es la clave principal. A veces cuando discutes esto alguien te dice "Sí, tú puedes hacerlo, pero yo lo haría mejor porque sé más de programación", esto es lo que no tiene sentido. Si yo hago un programa para resolver un problema matemático y mi programa lo resuelve ya está, no se puede hacer mejor. Me da bastante igual si has usado punteros, definido categorías, usado C++ o Fortran, el problema está resuelto.
Esto no es como programar un sistema operativo, que siempre se puede mejorar, hacer más o menos rápido, cambiar la interfaz y demás. Si yo quiero, por ejemplo, calcular el valor de Pi con dos decimales y hago mi programa y me da 3.14 no hay lugar para la mejora. Puedes hacer uno que te de más decimales, o que tarde un segundo mientras el mío tarda 10 (es un decir), pero eso no aporta nada al proyecto.
Las mayores dificultades no son de programación, sino de matemáticas
Como punto final mencionar que, según mi experiencia, las mejoras de optimización de un código a otro no suelen depender de cuestiones puramente informáticas, sino del algoritmo que uses. Por ejemplo una mejora radical se da si usas la transformada rápida de Fourier en vez de la transformada discreta de Fourier. Este cambio es un cambio matemático, al final la programación se hará igual en una u otra y no será determinante a la hora de tardar más o menos en computar el problema. Sobre este tipo de cosas los físicos entendemos bastante.
Finalmente decir que tanto en mi actual trabajo como el anterior los físicos trabajamos junto a informáticos. En Granada teníamos al encargado del cluster que nos solucionaba todas las papeletas. En mi actual instituto tenemos un equipo muy bueno que se encarga de llevar la red, arreglar los equipos y facilitarnos el trabajo. Ahora bien, tanto allí como aquí mi código lo hago yo y no me aportaría nada tener a alguien haciéndolo (me aportaría trabajar menos, pero se supone que no se trata de eso).
Este post se lo dedico a mi amigo José Martín, el informático que arregló el cluster tantas veces después de que lo tumbara, esperemos que en el futuro siga arreglándolo y no me mande a la mierda. XD XD
Este post se lo dedico a mi amigo José Martín, el informático que arregló el cluster tantas veces después de que lo tumbara, esperemos que en el futuro siga arreglándolo y no me mande a la mierda. XD XD