Las aplicaciones del futuro y las herramientas necesarias.

Como serán las aplicaciones del futuro?

Me encantaría poder contestar esa preguntas sin dudar, pero hacer futurología no es algo que me salga bien.  Lo que si puedo contestar, es como son las aplicaciones que tendremos que hacer en los próximos meses, porque son las que estamos programando ahora. Si bien no todas las aplicaciones son iguales, muchas de estas características se repiten en varias, por lo que es fácil detectar patrones repetidos.
Opino hoy de las aplicaciones hechas con Genexus.

Distribuidas

Las aplicaciones tienen que estar distribuidas en varios nodos. Esta división sera por performance, escalabilidad, modularidad, seguridad, ejecutar en dispositivos específicos o algún otro criterio pero es algo con lo cual vamos a tener que lidiar. Nuestra aplicación va a tener que ejecutar en diferentes computadoras (por ej. microservicios).

Múltiples fuentes de datos o bases de datos. 

Cada vez es mas común que las aplicaciones necesiten leer/grabar de diversas fuentes de datos y creo que esta tendencia es irreversible. Ademas de leer y grabar de bases de datos relacionales (de diversos vendedores) vamos a tener que aprender a usar otros manejadores de datos especializados para otro usos. Por ejemplo tendremos bases de datos de clave/valor, bases de datos orientadas a grafos, sistemas de información geográfica, bancos de imágenes / sonidos, documentos, textos, datos de sensores, streaming de video/audio. Tendremos que aprender a leer/grabar y procesar todas estas fuentes de datos. 

Múltiples tecnologías

Nuestras aplicaciones que acostumbraban a ser homogéneas en el lenguaje de programación y la plataforma en la que ejecutaban, pasaron a ser mas heterogéneas,  usando diferentes tecnologías para cada problema. Hoy ya tenemos cosas en C#, javascript, Swift, java, RPG y en el futuro podemos tener mas lenguajes especializados. 

Multiples versiones de herramientas

A medida que las aplicaciones maduran y se hacen mas complejas, puede necesitarse hacer convivir la aplicacion generadas en diferentes versiones de GeneXus y frameworks de desarrollo. Es comun que un desarrollo nuevo necesite alguna característica que recien fue desarrollada, pero el resto de la aplicacion no este en condiciones de migrar a esa nueva version. Lo ideal seria hacer convivir diferentes versiones haciendo algunos compromisos para no tener problemas. 

Integridad 

Al manejar diversas bases de datos o bases de datos distribuidas, es deseable (o en algunos casos indispensable) contar con algun tipo de control de integridad en los datos. Contar con integridad referencial e integridad transaccional es optimo. En caso de no tenerlo, vamos a tener que diseñar herramientas para controlarlas/corregirlas y manejar la integridad de los datos. Se necesitaran manejar algo como commit en dos fases o poder generar en forma facil las operaciones de cancelacion de lo hecho, cuando algo sale mal. 

Funcionamiento continuo

Cada vez son mas las aplicaciones que no toleran que el sistema deje de funcionar por motivos tecnicos. Las reorganizaciones / instalaciones deberan hacerse mientras el sistema funciona, por lo que tendremos que pensar de que forma podemos hacer versiones que siempre sean compatibles "hacia atras".  Esto trae consecuencias interesantes, como por ejemplo que las reorganizaciones monoliticas actuales deberan ser divididas en muchos pasos y aplicarlas en forma paulatina. 

Multi proveedor de nube / servicios. 

Las aplicaciones cada vez mas van a consumir servicios brindados por terceros (seguridad, búsqueda, mapas, cache, procesamiento de pagos, streaming, etc) y tambien de soporte para máquinas virtuales, containers, discos, etc.
Vamos a necesitar soportar muchos de estos proveedores.

Que herramientas necesitamos?

Build y deploy automatizado. 

Esto es algo que va a ser indispensable para las aplicaciones, pues es algo que agrega mucho valor y cada vez esta mas maduro.
A medida que las arquitecturas de las aplicaciones se van complicando, es cada vez mas dificil hacer esta tarea en forma manual sin cometer errores. Podremos tener herramientas que analicen que es lo que se debe instalar y revisen dependencias y hagan una instalación ordenada. Tal vez la Inteligencia Artificial nos ayude con esto. 

Analizadores estáticos de código

Vamos a necesitar analizar el código en forma mucho mas intensa de lo que lo hacemos hoy, para detectar posibles problemas de seguridad y posibles errores comunes.

Testeo Unitario

El testeo unitario a las aplicaciones, ha demostrado se de las herramientas mas efectivas para la detección de errores y cambios no deseados en el comportamiento. Ademas, incentiva el refactoring de codigo en forma segura.

Analizadores de reorganizaciones de base de datos. 


Dada el schema anterior y el schema al que se quiere llegar en la base de datos, establecer de que forma tengo que partir y ejecutar dicha reorganización para que todo pueda seguir funcionando sin problemas, aun durante la reorganización.

Puede ser necesario que una reorganización se ejecute en muchos pasos, pues por ejemplo, si tengo que cambiar el tipo de datos de un campo, tal vez sea necesario cambiar el nombre del atributo, y dividir la reorg en varios pasos.
La herramienta debería llevar la cuenta de cuales son los pasos ya ejecutados y los pasos que faltan ejecutar.

Habilitar o deshabilitar funcionalidades. 

En ambientes distribuidos, es comun tener que instalar algo, pero que no este disponible de ejecucion, hasta un momento posterior. Esto posibilita que se instale algo pero que no se ejecute hasta que toda la infraestructura este en condiciones de operar con la nueva funcionalidad (por ejemplo, una reorganizacion de la base de datos).
Esto hace necesario condicionar determinada funcionalidad y poder liberarla para determinados usuarios o en forma paulatina (para un nodo, para un subconjunto de usuarios, etc).

Manejar API

Nuestra aplicación va a necesitar manejar que es lo que publica y que es lo que consume (la api de las otras aplicaciones). Vamos a necesitar herramientas para poder manejar esto y por ejemplo, medir el impacto de los cambios en los servicios de terceros, sin tener que instalar nuestra aplicación.

Monitorear funcionamiento. 

Las aplicaciones van a tener que definir como deben ser monitoreadas, para poder detectar en forma temprana algun funcionamiento no deseado. Puede ser performance, caida de servicio, modificacion en algun servicio, problemas de seguridad, vencimiento de certificados, problemas de espacio insuficiente, etc.
Una herramienta de monitoreo centralizado es indispensable para aplicaciones complicadas.

Analisis de errores de ejecución

Dentro del monitoreo de las aplicaciones, un capitulo aparte va a llevar el análisis de los logs de errores. Todos los nodos de la aplicacion y los diferentes ambientes en los que se instalen, deberian centralizar los logs de errores en un unico lugar.

Esto posibilitaria detectar errores de la aplicacion en forma independinte si se genera en procesos batch, paginas web, aplicaciones smartdevices, etc.

Para el análisis de estos errores, vamos a necesitar ayuda para procesarlos y detectar qué programa es el que está fallando y cual es cambio que puede haber provocado este comportamiento. Además vamos a poder tener estadísticas de que es lo que falla en diferentes horas y en nodos, etc, lo cual muchas veces deja ver que el problema es de hardware, de infraestructura, de la aplicación o de algún otro motivo.

Comentarios

Entradas más populares de este blog

La nefasta influencia del golero de Cacho Bochinche en el fútbol uruguayo

Aplicación monolítica o distribuida?

Funcionalidades de GeneXus que vale la pena conocer: DATE Constants.