clock-1392328_640

Llevo ya bastantes años programando, casi una eternidad, sobre todo en Java, pero también en php últimamente, y al principio, en la carrera, en todo tipo de lenguajes como C, Pascal, LISP, PROLOG, etc.

Hasta ahora me había encontrado con el uso de la asincronía muy de pasada, sobre todo cuando programé en java para el escritorio, con la librería Swing. Lo típico de crear un hilo nuevo para hacer un trabajo pesado y no detener el hilo de trabajo del primer plano para que el usuario no percibiera lags en la aplicación. Alguna llamada a un servicio asíncrono con un callback… en el servidor no se es muy amigo de crear hilos… en fin, ni de lejos nada con lo que he visto en los últimos días…

Renovarse o morir

Si amigos míos ;-), he caído en el reverso tenebroso y me he puesto en serio a aprender node.js y de pasada el javascript… despúes del subidón inicial al comprobar que era capaz de hacer algún bot con el framework de Microsoft ha venido la gran depresión al encontrarme con un hecho que al principio parece anecdótico.. programar en node.js no tiene nada que ver respecto a hacerlo en aplicaciones Java de servidor. En java estamos a acostumbrados a que el servidor te asigne un hilo de ejecución (un thread) y en él puedes ejecutar el código que quieras de manera secuencial, todo muy “natural”, todo como siempre ha sido…

Sin embargo, node.js no es multihilo, sólo tiene un hilo de ejecución en realidad, pero casi todo lo que hace lo hace en modo asíncrono. Eso significa que cuando llamas a una función normalmente le pasas como parámetro otra función de callback para que te llamen una que se acaba el trabajo de la primera función… hasta ahí bien, pero que pasa cuando tienes que llamar a un servicio que te da una lista de elementos y después tienes que llamar a un servicio de detalle por cada elemento de la lista? pues que se desatan los infiernos… o como llaman los entendidos el callback hell.

Un ejemplo… ¿sencillo?

Para ilustrar un poco lo que quiero decir, os pondré el ejemplo de una prueba que hecho. La prueba consiste básicamente en llamar al API de Wunderlist (el gestor de tareas) para que liste las tareas que ya han alcanzado su fecha de fin.

Como en Wunderlist las tareas se agrupan en carpetas, lo que hay que hacer es obtener la lista de carpetas y luego en un bucle, para cada carpeta pedir sus tareas y ver si la fecha de fin es menor que la fecha actual. Desde el punto de vista de la programación secuencial tradicional ningún problema al respecto, únicamente hay que conocer el API de wunderlist y prácticamente ya está listo.

En cuanto se pasa a node.js, empiezan las cosas a complicarse, y mucho… se desatan los infiernos…. y es que como todo es asíncrono, la pedir el listado de carpetas, y empezar con la petición de las tareas, te encuentras que empieza una invocación cuando no ha acabado la anterior…. un desastre.

En la programación “tradicional”, se dispone de herramientas como la sincronización de métodos, los semáforos, etc. etc. para esperar a que un hilo acabe antes de continuar con la ejecución de otro… si embargo, la “manipulación” de hilos en el servidor no está permitida.

Al final, después de muchas pruebas, pensé en montar un sistema de pilas de trabajos, en la que se van apilando los “recursos” como las carpetas y las tareas según se vayan obteniendo y luego otro “hilo” que saca estos objetos de la pila y los trata. Cuando la pila se vacía, entonces todo el trabajo se ha acabado.

Este enfoque me parecía matar moscas a cañonazos para hacer algo tan simple como recuperar un listado de tareas de wunderlist… sin embargo, investigando un poco di con una librería de node.js que hacía precisamente esto, es esta async.

Captura de pantalla 2016-07-09 a las 10.24.39

En fin, como conclusión, tengo que decir que node.js me gusta mucho, a pesar de mis reticencias iniciales de programar en javascript (para un programador Java es poco menos que pasarse al lado oscuro 😉 pero veo que tiene una gran potencia… y que es un lenguaje con futuro en el que se basan las “cosas nuevas” como los frameworks de desarrollo de bots. Así que no está nada mal salirse de la zona de confort y aprender no ya un nuevo lenguaje, si no una nueva plataforma y sobre todo una nueva forma de programar.