Nos va a ayudar la inteligencia artificial en el desarrollo de software?
La inteligencia artificial está permitiendo resolver con computadoras en problemas que antes solo eran resolubles por seres humanos.
Quienes desarrollamos con GeneXus, ya estamos usando algunos de estos algoritmos por ejemplo para la normalización de la base de conocimiento, el uso de reglas y la generación de código. Todos estas cosas son aplicadas a la etapa de programación, pero puede aplicarse a alguna otra etapa del desarrollo?.
Sin ser bugs, podrían detectar cuando un codigo no cumple con determinada regla. Si bien esto puede hacerse hoy en dia con algoritmos tradicionales el poder aprender de los nuevos casos, le da una potencia interesante. Si varias empresas comparten sus códigos, se puede también aprender de experiencias de otros.
Otra cosa buena, seria poder instalar nuevas funcionalidades "apagadas", para poder instalarlas en producción sin afectar a los usuarios y poder "prender" la funcionalidad cuando se desee, sin instalar nuevo código. Lograr esto, sin ensuciar el código, es una linda tarea.
Esto implica hacer todas los cambios que permiten que la aplicación siga funcionando (por ejemplo, agregar columnas con default) lo antes posible.
Puede necesitarse crear vistas que apunten a tablas que ya existen, crear triggers para mantener datos, postergar el borrado de columnas hasta que este todo funcionando ok, etc.
Lo que hoy hacemos en un solo paso, puede llevar varios pasos y varios dias.
En caso que pueda, que genere los programas para mantener dicha compatibilidad por el tiempo que se necesite.
Tambien sirve tener acceso a los errores que han tenido otros colegas al instalar la nuevas versiones.
Estas son algunas cosas que se me ocurrieron al vuelo y es seguro que hay muchas mas. No todas necesitan de inteligencia artificial o algoritmos sofisticados pero si todas necesita automatizar proceso que hoy hacemos en forma manual.
Los proximos años, van a estar divertidos para la industria del software.
Como pueden afectar al ciclo de desarrollo de software?
Quienes desarrollamos con GeneXus, ya estamos usando algunos de estos algoritmos por ejemplo para la normalización de la base de conocimiento, el uso de reglas y la generación de código. Todos estas cosas son aplicadas a la etapa de programación, pero puede aplicarse a alguna otra etapa del desarrollo?.
Análisis estático de código.
Supongamos que podemos alimentar a un sistema de inteligencia artificial con caso de código que dio problemas en otros sistemas y código que no dio problemas. Con suficientes ejemplos, podria detectar el patron que siguen determinados patrones de codificación y permitir solucionarlos.Sin ser bugs, podrían detectar cuando un codigo no cumple con determinada regla. Si bien esto puede hacerse hoy en dia con algoritmos tradicionales el poder aprender de los nuevos casos, le da una potencia interesante. Si varias empresas comparten sus códigos, se puede también aprender de experiencias de otros.
Code Review.
Podríamos tener programas que digan que el código es "suficientemente bueno" como para ser integrado a la solución. Es similar al anterior, pero no para búsqueda de errores sino para búsqueda de "malos olores" en el código.Documentación y generación de ayuda.
Si tenemos un programa que registra lo que hicieron los usuarios anteriores de la misma, que me pueda indicar cuales son los pasos que debo seguir para lograr lo que quiero, cuando estoy trancado o tengo dudas.Testeo unitario.
Que la generación de los test unitarios sea algo automático y que la aplicación aprenda de los resultados de las corridas. Cuando hago un cambio a un objeto, automáticamente se ejecuta el test unitario y se corre en background. Si todo sigue igual, no me entero. Si algo esta diferente, debo revisarlo y aceptarlo y este pasa a ser el nuevo resultado valido.Testing funcional.
La aplicación registra el uso de los usuarios en producción y luego replica lo mismo en un ambiente de pruebas para ver si todo funciona igual. El sistema saba el estado de la base de datos y todas esas pequeñas minucias.Instalacion.
El sistema esa listo para ser instalado?. Esto implica medir varios indicadores y hay que determinar si es posible la puesta en producción.Instalacion sin downtime.
Tengo una version en producción y otra para instalar. Que pasos debo dar para poder instalar la nueva version, sin tener que bajar mi aplicación, en caso de tener servicios funcionando, diferentes nodos, cambios en la base de datos, nuevos user controls, cambio en cantidad de parámetros de algunos objetos, nueva version de generador, parches de seguridad, etc.Otra cosa buena, seria poder instalar nuevas funcionalidades "apagadas", para poder instalarlas en producción sin afectar a los usuarios y poder "prender" la funcionalidad cuando se desee, sin instalar nuevo código. Lograr esto, sin ensuciar el código, es una linda tarea.
Puedo partir la reorganización de la base de datos?
Suponiendo que tengo una base de datos y quiero hacer un cambio en el esquema de la misma. Como puedo hacerlo de forma de minimizar el tiempo en que la aplicacion no esta disponible?.Esto implica hacer todas los cambios que permiten que la aplicación siga funcionando (por ejemplo, agregar columnas con default) lo antes posible.
Puede necesitarse crear vistas que apunten a tablas que ya existen, crear triggers para mantener datos, postergar el borrado de columnas hasta que este todo funcionando ok, etc.
Lo que hoy hacemos en un solo paso, puede llevar varios pasos y varios dias.
Análisis de configuración/seguridad.
Analizando la configuración de mi aplicación, me diga si hay problemas en la misma y como solucionarlos.Análisis de compatibilidad hacia atrás.
Dado la version instalada de mi aplicacion y la nueva versión, que analice que es lo que cambia y prediga si puede generar problemas de incompatibilidades.En caso que pueda, que genere los programas para mantener dicha compatibilidad por el tiempo que se necesite.
Análisis de cambios de version de software de base.
Sale una nueva version de C#, Java, Javasrcipt, GeneXus, Android, iOS, Windows, Linux, SQLServer Oracle, User Control, etc. Como puede afectar mi aplicacion?. Esto es un trabajo enorme hoy en dia y creo que mucho del mismo puede automatizarse, analizando dependencias y teniendo releases notes de los cambios de cada componente de software de una forma mas procesable por maquina.Tambien sirve tener acceso a los errores que han tenido otros colegas al instalar la nuevas versiones.
Microservicios.
Tengo una aplicación monolítica y me piden que la instale como microservicios. Como debo dividirla? Que hago con el código compartido?. Y con las tablas compartidas? Cuales son las interfaces que debo tener?Estas son algunas cosas que se me ocurrieron al vuelo y es seguro que hay muchas mas. No todas necesitan de inteligencia artificial o algoritmos sofisticados pero si todas necesita automatizar proceso que hoy hacemos en forma manual.
Los proximos años, van a estar divertidos para la industria del software.
Interesante..., sumaria la posibilidad de poder codificar a partir de lenguaje natural. Si hoy día estamos colocando capas de abstracción como patrones, a futuro podríamos dictarle a nuestro entorno de desarrollo que deseamos y que sea traducido a instancias de patrones, objetos y código...
ResponderBorrarEl lenguaje natural, lo veo demasiado ambiguo como para poder formalizar codificacion, pero si podria usarse para escribir requerimientos y analizar si hay requerimientos contradictorios.
ResponderBorrarOtro uso puede ser para analizar performance de programas. Ejecutando un programa, que haga un analisis del log de ejecucion e indique posibles mejoras en la performance.
Indices en la base de datos.
Que indices son necesarios y cuales se pueden eliminar para mejorar la performance en la base de datos.
Indentificar codigo que no se usa mas
En sistemas grandes, que funcionan por mucho tiempo, es comun tener partes de codigo que ya no se ejecuta nunca. Seria bueno poder identificarlos y borrarlos.
Supongo que a los demas se le van a ocurrir muchos mas.
Enrique buenas.. estoy totalmente de acuerdo contigo. Asi como tenemos User Control, Patterns, tendría que haber un Packing Software que empaquete todo lo que tenés en desarrollo (jdbc, jboss, tomcat, mysql, sql, con sus versiones correspondientes y librerias) y arme una paquete para llevar al cliente que al desplegarlo quede operativo. Es como si encapsulara todo lo que hace operativa tu app y lo lleve al Cliente.
ResponderBorrarLa otra movida que se esta usando es la de los docker que son como compartimientos estables de software https://hub.docker.com/_/mysql/ que quizás pueda servir para lo que planteas. Abrazo Marcelo.
Marcelo,
BorrarCreo que lo que planteas de hacer una herramienta que haga los Deploy Units (o Packages) esta bastante avanzado en las ultimas versiones de GeneXus.
Ademas, las proxima version de GeneXus van a tener la posibilidad de hacer deploy a Docker, ya esta como para probarlo. Aun le falta bastante pero es prometedor.
Tal vez no quedo claro pero lo que yo pienso que se puede hacer es algo que analice tu aplicacion y te indique si salio alguna version nueva de los componentes que utiliza y que analice si es posible usarla en mi aplicacion sin romper la funcionalidad actual. Y si la rompe, que me diga donde, asi puedo arreglarla.
No es nada facil.
Gracias por el comentario.
Enrique :
BorrarOk entendido. Esta buenisima tu idea.
Seguro va a requerir regirse por algun standard de calidad para que todos los proveedores establezcan las compatibilidades y arreglos de nuevas versiones en algun formato que con inteligencia artificial se pueda leer, analizar y recomendar acciones.
Un gran desafio!!