domingo, agosto 05, 2007

El patito feo

Esta historia comienza durante una reunión de coordinación para determinar las herramientas y de desarrollo para un proyecto de una casa de bolsa.
Tierra adentro, en la parte baja de la pradera, escondido entre los altos juncos que crecían en el borde de la laguna, había un nido lleno de huevos. Mamá Pata estaba suavemente sentada sobre ellos, para darles calor. Esperaba con paciencia el nacimiento de sus patitos.
Durante una discusión sobre las características del proyecto, queda claro que el mismo deberá ser altamente concurrente y distribuido, entre otras para permitir la escalabilidad y la tolerancia a fallas. En este escenario surge inmediatamente una candente discusión sobre el lenguaje a utilizar para el desarrollo del sistema.

Jorge explica: que en el proyecto anterior la mayoría de las penurias durante el desarrollo se relacionaron con la concurrencia, las carreras por por recursos compartidos aparecían en todas partes y eran muy difíciles de depurar, el sistema ya en producción falla de vez en cuando de forma inexplicable y es prácticamente imposible reproducir los problemas. Durante este tiempo ha estado investigando el tema y propone JoCaml para el desarrollo del sistema.

Todos los miembros del equipo quedan estupefactos, y se hizo un silencio sepulcral.
Crac! Crac! Uno tras otro comenzaron a abrirse los huevos, y los patitos asomaban por ellos sus cabecitas. Pero... que será esa horrible ave gris que aparecía? Mamá Pata no salía de su asombro. "Ninguno de los otros patitos es como este!", exclamó.
Al salir de su asombro, vino la inevitable pregunta: ¿Jorge, que es eso?, es un lenguaje funcional especializado en la expresión de concurrencia y ha sido utilizado exitosamente en algunos proyectos ...

¿Y como es?, interrumpió José, mientras el resto de los integrantes introducían sendas consultas en Google. Bueno JoCaml es un lenguaje funcional, los programas se expresan siempre en base a funciones, no hay variables globales, asignaciones o ciclos, todo se logra utilizando recursión, procesos y primitivas de comunicación entre estos.
... después fueron al corral de los patos. Los otros patos los miraron con impertinencia y dijeron: "Miren, aquí viene otra cría, como si ya no fuéramos bastantes! Y qué feo es ese patito! Sáquenlo de este corral! No lo queremos!".
¿Sin variables globales, ni asignación, ni ciclos?, ¿cómo se puede hacer algo en ese lenguaje?, es absurdo, además ¿cómo cooperan los procesos si no hay memoria compartida?

En ese momento el gerente interrumpe: eso es raro, debemos entrenar a los programadores, probablemente no haya soporte, ya es tarde, y todavía debemos elegir entre varios lenguajes y docenas de bibliotecas.
Uno por uno, los patos se lanzaron sobre el patito feo y lo picotearon en el cuello, y lo empujaron de un lado a otro. Vinieron después algunos pollitos y ellos también picotearon al patito.
Francisco: ¡sí! ¿que vamos a hacer si nos enredamos y no tenemos soporte?

Jorge piensa: ¿tal vez investigar o pensar?, ¿para que tenemos Internet?

José: tal vez deberíamos analizar un poco de que se trata JoCaml y la programación funcional antes de seguir criticando ¿no creen?.

Pablo: ¡no! aquí dice que los lenguajes funcionales son únicamente de interés académico, no podemos darnos el lujo de utilizar herramientas académicas.

Juan: Si, debemos utilizar un lenguaje empresarial.

Pedro: debemos estar conscientes de que el estándar de facto en Wall Street es Java.

Luis: por cierto que algo tan raro como JoCaml debe ser para gurues.
Mamá Pata trató de proteger al patito feo. "Déjenlo tranquilo", pidió a las malignas aves, "él no hace daño a nadie". Pero de nada sirvió. Y hasta sus propios hermanitos empezaron a tratarlo mal.
Jorge: pero leí que una de las ventajas de la programación funcional es que los programas son mas fáciles de comprender, generalmente los programadores que trabajan con lenguajes funcionales producen código más modular, reutilizan más código y lo hacen de mejores maneras. Lo difícil de lograr en nuestro sistema es la concurrencia, y en JoCaml es casí imposible que aparezca un deadlock, no hay variables que compartir y las estructuras de datos son únicamente de lectura, y la concurrencia se expresa en base un álgebra evitando al programador el trabajo de secuenciar el acceso a los datos.

Pedro: un googlefight entre Java y JoCaml me da 229 millones contra 91 mil, ¡nadie usa eso!.

José: caramba, ¿álgebra?, ¿estructuras de datos inmodificables?, mejor lo dejamos así.

El gerente: si, dejemos eso de lado, evitemos los problemas, y vamos a concentrarnos en cosas útiles, deberíamos usar Java con alguna biblioteca de concurrencia y comunicaciones, de cualquier modo en Java tenemos funciones y todavía podemos utilizar todo lo demás, no creo que los programadores puedan trabajar con esas cosas raras que son de interés puramente académicas.
Todos los días era lo mismo. El patito feo no podía escapar al maltrato. "Creo que será mejor que me vaya lejos, muy lejos", se dijo por fin. Así es que, saltando el cerco, salió a viajar tan rápido como pudo.
Jorge se quedo sin argumentos y se resignó, atendiendo al resto de la reunión sin demasiado interés.

Este es el escenario típico de introducción de una "nueva" tecnología en una organización, los argumentos de descalificación son la regla, y la mayoría de ellos son FUD y es una lástima de que Jorge se haya quedado sin argumentos, tal vez si hubiera tenido algo más de experiencia con lenguajes funcionales, se habría dado cuenta de que todas las personas en la reunión y los programadores, probablemente ya han utilizado un lenguaje funcional de consultas a bases de datos llamado SQL, pero además las secretarias, su mamá, ustedes que están leyendo esto, y una cantidad importante de todos los usuarios de computadoras en el mundo, ya usan otro lenguaje funcional con increíble naturalidad y frecuencia.

Sin embargo, después de los 10 minutos de aprendizaje de este lenguaje, nadie parece notar que está programando, la mayoría ni siquiera saben que están describiendo funciones, así de intuitiva puede llegar a ser la programación funcional.

Esto se debe a que desde kinder nos están enseñando los mecanismos fundamentales de este tipo de programación, no se a ustedes, pero a mi, en kinder, me enseñaron al menos la función sucesor: suc no hay naranja = 1 naranja, suc 1 naranja = 2 naranjas, suc 2 = 3, etc., así que además ya nos comenzaban a dar inducción, esto fue muy útil cuando nos enseñaron la suma, ¿recuerdan?, tal vez no la llamaban "suc", en mi caso la llamaban "y una más" y se utilizaba notación postfija en vez de prefija: 2 naranjas "y una más" = 3 naranjas. Ahora si recuerdan.

Uno de los conceptos brillantes de éste lenguaje es que el usuario diagrama sus funciones en dos dimensiones (aunque últimamente se permite diagramar en tres) de este modo automáticamente se puede hacer un programa para lograr un cálculo y un reporte simultáneamente, pero lo hace sin utilizar asignaciones, secuencias, posiciones o comandos de impresión, solo se utilizan funciones matemáticas, diagramación y formatos.

A estas alturas deben estar pensando que no les digo como se llama el lenguaje para mantener el suspenso, pero no es así, lo que sucede es que el lenguaje del cual estoy hablando ¡no tiene nombre!, por ello somos más inconscientes de su existencia, evitando que se forme un culto a su alrededor a pesar de su importancia para la computación personal.

En 1979 un producto incluyó este lenguaje y revolucionó el uso de las computadoras hogareñas cambiando su historia y su denominación, que en adelante serían conocidas como computadoras personales, las primeras servían fundamentalmente para la recreación, mientras las últimas eran, y son, herramientas de trabajo.

El producto en cuestión si tenía un nombre: VisiCalc, y sus ideas fundamentales fueron rápidamente copiadas y mejoradas por SuperCalc, Multiplan y Lotus 123, hasta llegar hoy a productos sofisticados como Microsoft Excel y OpenOffice Calc, mientras la gran mayoría de los usuarios, siguen utilizando únicamente su característica fundamental: la descripción de un modelo matemático en base a funciones dentro de una cajita, que se componen con más funciones que están en otras cajitas dispersas a través de la hoja electrónica.

Esta sinfonía matemática donde los resultados se propagan automáticamente desde los datos iniciales a sus respectivas cajitas, es el máximo ejemplo de programación funcional descriptiva, el usuario no se preocupa por la secuencia de ejecución, no necesita las asignaciones, solo trabaja describiendo composiciones de funciones y es un ejemplo del último objetivo de la informática: describir un problema y que nos den la solución.

Los "expertos" rápidamente acotarán que este lenguaje no es turing completo, que no sirve, etc. sin embargo no estoy diciendo que sirve para cualquier cosa, estoy diciendo que es el lenguaje de programación más popular que existe sobre la tierra, y que demuestra que la programación funcional y declarativa es mas natural e intuitiva que la programación imperativa, a pesar de que durante los años de aprendizaje en informática, nos hayan hecho olvidar lo que aprendimos desde kinder.

El caso del lenguaje utilizado por las hojas de cálculo es extremo, pero, ¿ si existen lenguajes capaces de ayudar en esta dirección, no vale el dicho popular: "agarrando aunque sea fallo" ?, pienso que hay muchos casos en los cuales la respuesta es sí, incluso sopesando los problemas asociados como la presunta falta de soporte, herramientas y bibliotecas.
"Me gustaría ir con ellos", se dijo el patito. Quizá ni siquiera me hagan caso, por ser tan feo. Pero, sin embargo, no importa, lo intentaré".
Voló hasta el agua y nadó rápidamente hacia ellos. Pero cuando miró hacia abajo y vio su propio reflejo en el agua clara, que sorpresa! Ya no era un ave gris y fea, como le había parecido siempre. Él también era un hermoso cisne blanco.
Sucede con frecuencia que las cosas más obvias son las menos evidentes (como la manzana de Newton), y sin un análisis serio sobre tecnologías diferentes a las que nos venden, o las que usa "todo el mundo", estamos limitando artificialmente nuestra visión, y como consecuencia llegando a conclusiones que pudieran ser diametralmente opuestas a la verdad.

Así es como descartamos de plano algunas cosas porque no coinciden con nuestros parámetros de evaluación, pero si nunca nos salimos de la caja, ¿cómo nos vamos a dar cuenta de que ni siquiera estamos usando los parámetros adecuados para evaluar algo de una especie diferente?

1 comentario:

Guillermo dijo...

Me deleité con el estilo de del "Patito feo".

JoRGe no será JOsé Rey, el viejo? (GEriatrics)

Como de costumbre, se aprende toneladas contigo. Googlefight, FUD, JoCaml, Turin completo (Turing? Y yo que acabo de escribir un artículo sobre el anciano Juego de la Vida, y su código [almosT 500 PIC assembly language instructions, exercise...])

Lo enigmático del patito feo es que un conjunto lleno de feos, de pronto se convierte en "normal", y eso define la belleza... (?)

Lo bello es lo normal; lo MUY bello, o muy feo, es lo que se sale de la norma, y por tanto, es más subjetivo que lo subjetivo.

Saludos,

LGUC