viernes, 24 de junio de 2011

La programación científica ¿Es eficiente?

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

5 comentarios:

  1. Toda la razón. No soy físico pero sí ingeniero y muchas veces me he encontrado ante un problema que yo lo sé resolver, pero no alguien que no sea ingeniero (qué digo ingeniero, que entienda algo de Matemáticas). Y sin embargo, cada día encuentro "informáticos" que afirman muy seriamente que su carrera no requiere de las Matemáticas, y lo más grave, universidades que hacen todo lo posible por darles la razón. En esto de la programación, como decía mi abuela: "Mandarlo y hacerlo y serás bien servido". Un saludo.

    ResponderEliminar
  2. Al final, esto es un tema de casos concretos.

    - Un código robusto ahorra tiempo. Un buen diseño supone un ahorro de tiempo en identificación de errores, depuración, recompilación y despliegue. Dependiendo del caso, un código poco robusto es una pérdida de tiempo importante.

    - ¿Cuánto tiempo hiciste perder al encargado del cluster para arreglar el problema de un código no optimizado? ¿Cuánto tiempo perdieron otros compañeros mientras tu proceso acaparaba los recursos de la máquina? En ocasiones no es sólo "tu tiempo" con el que estás jugando, sino con recursos compartidos.

    Todo esto es un tema, no de optimización del código, sino de optimización de recursos. ¿El tiempo invertido en mejorar el código es superior a los beneficios que reporta? Si la respuesta es sí, no mejores el código, si la respuesta es no, hazlos. El problema es que, a priori, es difícil establecer esta relación en algunos casos.

    Cuestión aparte es si realmente los programas son tan específicos o si un código más flexible y estructurado podría ayudarte, a largo plazo, a reusar ese código para solucionar problemas diferentes. O si un proceso funciona correctamente para una carga de información dada, pero si se escala hacia arriba se vuelve inoperativo.

    Resumiendo, lo importante es optimizar los recursos, no el código, y tener una visión global del problema y las soluciones, de forma que una inversión de tiempo actual, pueda suponer un ahorro de tiempo futuro.

    ResponderEliminar
  3. Buenas.

    Ciertamente Kanijo es un problema de estimación. Es muy complicado saber si un programa tardará un tiempo razonable o no, y mucho más si lo vas a volver a usar en el futuro o no. Yo cosas como algoritmos de integración o de resolución de ecuaciones los tengo muy depurados, porque es algo que se usa con frecuencia. Otros más específicos los cuido y comento menos.

    El cluster funciona realmente bien. Cuando yo lo tumbé al día siguiente ya estaba funcionando de nuevo, y teniendo en cuenta que allí hay sobre todo programas de muy larga duración perder un día no es tampoco traumático.

    Otros temas son investigaciones orientadas principalmente a desarrollar un nuevo método de cálculo. Ahí es evidente que hay que poner todo el esfuerzo en conseguir que el método sea lo más eficiente y flexible que sea posible.

    Saludos.

    ResponderEliminar
  4. El Informático que afirme que en su carrera no necesita matemáticas es un impresentable. Desde luego si te vas a dedicar a configurar correos electrónicos... entonces vale, pero eso no es un informático.
    Hay un gran problema en la informática y es que aquí cualquiera se hace un curso CCC y ya es ingeNERO.

    ResponderEliminar

Agradecemos mucho tu opinión, pero comentarios difamatorios, insultantes o con ánimo de ofender, trollear o spamear serán eliminados. Tampoco se aceptan comentarios anónimos.