“Language shapes the way We think, and determines what We can think about.” Benjamin Lee Whorf
La programación reactiva es un paradigma de programación observado/observador o consumidor/productor similar a los esb’s (Enterprise Service Bus) y que se basa en el principio de ejecución: TODO ES UN STREAM. Esto introduce un cambio definitivo y radical en como se desarrollan las aplicaciones y convierte la programación en un recurso estratégico para generar cambios ad-hoc en la transformación digital de las empresas.
Table of Contents
- ¿Y que ha ocurrido con los lenguajes de programación?
- ¿En qué framework?
- ¿Hay algún desarrollo parecido?. ¿Open source o propietario?
- Entonces, ¿qué lenguaje utilizar? ¿Cuál es el más productivo? ¿Imperativos o lógicos? ¿Y, en qué entorno?
- Fase monolito
- ¿Qué es una arquitectura Reactiva Funcional o Funcional Reactiva?
- ¿Y ahora qué?
- Y al final…
La informática está inundando por completo nuestro tiempo, entorno y en consecuencia nuestras vidas. Hace 20 años los primeros ordenadores personales llegaban primero a las empresas y hogares y, hoy en día, nuestra especie está totalmente colonizada por todo tipo de gadgets IP. Sin olvidarnos de la introducción de los smartphones, que llegaron a nuestras vidas hace tan solo 10 años y han invadido nuestros bolsillos.
No obstante, y a pesar de estos grandes avances, pocos cambios han ocurrido desde el punto de vista de la programación de todos estos miles de millones de dispositivos, desde que los Sres. Ken Thonpsom y Dennis Ritchie, entre 1969 y 1972, crearan el lenguaje “C” para programar el mítico Unix.
Unix derivó, a su vez, hacia todas las distribuciones Linux: Debian, Red Hat, Fedora, Centos, Darwin, Ubuntu, etc. y posiblemente será el SO que perdure en la historia de la humanidad, por el principio de portabilidad con el que fue diseñado. No hay que olvidar que parte del sistema se programó con tarjetas perforadas sobre un DEC PDP7.
¿Y que ha ocurrido con los lenguajes de programación?
Son, sin duda, las herramientas elementales de toda la industria informática. Tal y como puede apreciarse en el grafico de arriba: Java, creado por James Gosling en 1995, y diseñado partiendo del mismo principio de portabilidad que el propio C y que como se hace evidente en la imagen es hoy, el lenguaje de desarrollo más extendido, pese a añadir únicamente algunas ventajas para el programador como es la orientación a objetos, que a su vez comparte con C++ y otros.
Existen varias categorizaciones de los lenguajes de programación como:
- Interpretados y compilados: Java, Scala, Python, Javascript, CCS, HTML y C, Perl , C++.
- Imperativos y lógicos: Java, C, C++, Perl, Python, Scala y Erlang, Lisp, Prolog, Clojure, etc.
- Y otras como concurrentes (Occan y Go), declarativos (Erlang, Lisp, Prolog), non-blocking (Erlang) y una larga lista de capacidades.
Adicionalmente a estas categorizaciones, y una vez definido con que lenguaje realizar nuestro trabajo:
- Web server side/Cliente: Java, Python, C#, PHP/JavaScript, HTML
- Shell-Script: ShellScript, Python, Perl , Go
- Móvil: Swift, Java, C
¿En qué framework?
Debemos escoger con qué framework trabajaremos en nuestro proyecto: Eclipse (Desarrollado y cedido a la comunidad por IBM, a la que agradecemos desde aquí su contribución ), Visual Estudio (Microsoft), NetBeans (SUN-Oracle), Developper Studio (Red Hat). Y por fin, una vez decidido todo esto, debemos valorar si partimos del framework de desarrollo genérico o, en el caso web, partimos de algún framework particular ya desarrollado:
- Symphony, Zend, CodeIgniter: PHP
- Django, Flask: Python
- Spring, Struts, JSF: JAVA
¿Hay algún desarrollo parecido?. ¿Open source o propietario?
Como puede verse, y a medida que avanzamos, aparecen nuevas soluciones verticales implementadas con productos que, a su vez, han pasado por todo la dicotomía de alternativas. De forma que al escogerlas, la empresa o el cliente acaba totalmente ligado al lenguaje y al versionado, evolución etc.
- Portal web: Oracle Portals, Drupal, EBD, WordPress, Magnolia
- Gestor de contenidos: Liferay, Alfresco, SharePoint
- CRM: vTiger, Sugar, SuiteCRM
- e-Commerce: Prestashop, Magento, OpenCart, Drupal
Con este status quo, las empresas, a excepción de las grandes cuentas, se ven abocadas a implantar ERP’s: SAP, Oracle, Microsoft, etc., y obligadas a añadir nuevas capas de software midleware adicionales a las bases de datos (Oracle, SQL Server, MySQL, mongoDB) y servidores de aplicaciones (JBoss EAP, WildFly, WebLogic Tomcat, IIS, WebSphere) como los Enterprise Service bus (ActiveMQ, RabbitMQ, WebSphereMQ).
Entonces, ¿qué lenguaje utilizar? ¿Cuál es el más productivo? ¿Imperativos o lógicos? ¿Y, en qué entorno?
La productividad está obviamente asociada a la curva de aprendizaje y a la disponibilidad de profesionales sénior con conocimientos del entorno. Es decir, puede darse la casuística en la que el equipo de desarrollo esté compuesto por diferentes tipos de lenguajes.
Fase monolito
Como resultado, tras un periodo de desarrollo de software, la empresa dispondrá de una plataforma que crecerá hasta donde el éxito le acompañe, incrementando la complejidad del ya sofisticado entorno. Tanto si la plataforma es Java, C#, PHP, Python o Perl, el desarrollo corre el riesgo de convertirse en un monolito difícil de mantener y evolucionar. Los procesos inicialmente simples tienden a cubrir cada vez más variantes, en función de las necesidades definidas por Dirección, Marketing o el propio Product Owner.
En una situación como esta la solución más adoptada por los Arquitectos de Desarrollo es la de evolucionar hacia una arquitectura:
- Orientada a servicios. Cada servicio es una función sin estado que recibe una llamada y devuelve una respuesta.
- Orientada a microservicios. Es una evolución de la orientación a servicios. Como en el caso anterior los microservicios están coordinados a través de la ORQUESTACIÓN.
- Reactiva, funcional y orientada a microservicios pero coordinados por COREOGRAFIA, y con la inferencia basada en eventos de negocio.
¿Qué es una arquitectura Reactiva Funcional o Funcional Reactiva?
La arquitectura reactiva funcional es aquella en la que la inferencia son los EVENTOS. En este caso no hablamos de eventos de sistema, como los subsistemas de ventanas de los entornos gráficos (X11, Windows o Gnome), sino por eventos de negocio.
La reactividad ha aparecido no solo en la parte servidora: Spring, Vert.x, ya que afecta a la arquitectura de ejecución sino que ha entrado para instalarse de forma definitiva en la parte cliente con implementaciones en Javascript: Reactjsliberada por Facebook al mundo open, Bacon.js o RxJS.
La importancia para las empresas radica en que se puede crear funcionalidad a partir de cualquier evento que se genere: alta_cliente, baja_cliente, venta_producto, así como la gestión de las operaciones: rotura_stock, paquetes_fuera_stock_minimo, alta_empleado, fin_promocion, envio_urgente, etc.
Esto permitirá interceptar el flujo de datos, crear bases de datos/registros y/o funcionalidades que multiplican las capacidades digitales de la empresa, creando una nueva especie de empresas más flexibles, más adaptadas a los nuevos escenarios y, por tanto, más competitivas.
¿Y ahora qué?
La solución, que ya documentan empresas como Nginx y otros fabricantes, es evolucionar de aplicaciones MONOLITO a micro servicios reactivos y funcionales con un roadmap bien definido, que acople el día a día de la empresa con la introducción de la arquitectura reactiva que ya usan empresas como Netflix u otras muchas.
En definitiva, ya estamos en el momento de marcar el rumbo hacia estas nuevas herramientas y entornos de desarrollo.
Y al final…
Dispondremos de entornos políglotas (desarrollados en cualquier lenguaje: Python, C#, Java, PHP, Erlang), non-blocking, funcionales, declarativos y preparados para los nuevos escenarios de cambio y adaptación constantes.
En Tenea estamos trabajando hace más de 5 años con tecnologías como ActiveMQ, RabittMQ, Fuse Enterprise (componentes OSGI), mongoDB, ElasticSearch o Solr y, por supuesto, en orientación a eventos y en programación reactiva.
Concretamente, nuestro motor de reglas IoT TeneaRules, que hemos miniaturizado para que corra sobre hardware de dominio público low cost (TP-Llink, Xiaomi), sobre el open source OpenWrt y cuya sintaxis declarativa y funcional nos permite programar comportamientos asociados a los eventos del entorno: ES_DE(NOCHE)= , ALARMA(ON)= ; PUERTA,PRINCIPAL(ABIERTA)=, etc.
Y algún dia por fin, con una simple pregunta tendremos a nuestro servicio un potente robot informativo, sincronizado por voz, ordenado por uso, personalizado, y con capacidades informativos que superarán por completo a nuestra imaginación: IA + Bigdata al 100% combinadas a nuestro gusto.
Fuentes
- The basis: http://reactivex.io; https://www.reactivemanifesto.org/
- Nginx
- Verte.x
- Red Hat: https://www.redhat.com/cms/managed-files/mi-microservices-architectures-public-sector-technology-overview-f9450kc-201712-en.pdf
- Paradigma de ejecución observador: https://en.wikipedia.org/wiki/Observer_pattern
- Un poco de filosofía: https://android.jlelse.eu/how-to-wrap-your-imperative-brain-around-functional-reactive-programming-in-rxjava-91ac89a4eccf