OpenShift Commons: descripción general y demostración de Konveyor AI
|Introducción a Konveyor y Konveyor AI
- Konveyor es un proyecto de código abierto iniciado hace aproximadamente tres años, fruto de la colaboración entre Red Hat e IBM. Se centra en ayudar a las organizaciones a integrar sus cargas de trabajo en Kubernetes, aprovechando las tecnologías nativas de la nube.
- El propósito principal de Konveyor es establecer estándares para la integración de aplicaciones en Kubernetes, facilitando el uso de tecnologías avanzadas en la nube. Desde su inicio, ha crecido en la comunidad, incluyendo nuevos contribuyentes como Microsoft, que pronto se unirán como mantenedores oficiales.
- Además, el «Migration Toolkit for Applications» es una distribución apoyada por Red Hat de Konveyor, disponible sin costo adicional para los suscriptores de OpenShift, facilitando la incorporación a Kubernetes y la modernización.
«Konveyor es un proyecto de código abierto que ayuda a organizar la integración de sus cargas de trabajo en Kubernetes.»
Motor de Análisis de Konveyor
- Konveyor incluye un motor de análisis que permite a los usuarios identificar patrones problemáticos en su código fuente, denominados anti-patrones. Estos son elementos que pueden obstaculizar el funcionamiento de aplicaciones en plataformas específicas.
- Utiliza análisis de código estático y protocolos de lenguaje, como el Language Server Protocol, para potenciar su funcionalidad. Konveyor ofrece más de 2,400 reglas predefinidas para guiar a los usuarios en sus migraciones, permitiendo la creación de reglas personalizadas para escenarios específicos.
- Al finalizar el análisis, los usuarios reciben un informe detallado que indica dónde se encontraron problemas, acompañado de orientación sobre cómo solucionarlos, incluyendo fragmentos de código y enlaces a documentación externa.
«El motor de análisis permite a los usuarios identificar anti-patrones en su código que podrían impedir que sus aplicaciones se ejecuten adecuadamente.»
Konveyor AI: Mejora en la Modernización de Aplicaciones
- Konveyor AI es una extensión de Konveyor que tiene como objetivo incrementar la economía de la modernización y migración de aplicaciones utilizando inteligencia artificial generativa. El enfoque es lograr cambios en el código fuente de manera automatizada basándose en los problemas detectados por Konveyor.
- Se busca que Konveyor AI aproveche los conocimientos almacenados sobre las migraciones previas de una organización, evitando la necesidad de construir modelos de lenguaje de gran tamaño (LLMs) costosos. En su lugar, pretende utilizar la generación aumentada por recuperación para proporcionar contexto adicional a los LLMs.
- Konveyor AI no se adhiere a un único modelo de lenguaje, permitiendo que las organizaciones seleccionen el modelo más adecuado para cada dominio de problema, facilitando así migraciones que abarquen múltiples lenguajes de programación.
«El objetivo de Konveyor AI es automatizar los cambios de código fuente basados en los problemas identificados durante el análisis.»
Fase de código organizacional y experiencia de usuario
- La fase de código organizacional consiste en proporcionar cadenas de código sugeridas como un diferencial utilizando un plugin. Durante la demo, se mostrará cómo funciona esto. La experiencia del usuario es bastante directa; el migrador ejecuta un análisis sobre su código fuente, el cual encontrará problemas. Posteriormente, el usuario puede seleccionar uno de estos problemas para resolver.
- Al activar el API de Kai, se extraerá información relevante que incluirá detalles sobre migraciones previas que se hayan hecho en el código de la aplicación. Kai tiene la capacidad de identificar soluciones anteriores a problemas similares en la base de código de la organización y también puede utilizar integraciones con herramientas externas para rastrear el historial de migraciones y analizar la efectividad de cada una.
«La experiencia del usuario es bastante directa; el migrador ejecuta un análisis sobre su código fuente.»
Limitaciones y desafíos de los LLMs
- Uno de los desafíos al trabajar con Modelos de Lenguaje Grande (LLMs) es que tienen ventanas de contexto limitadas, lo que impide cargar una aplicación completa en uno de ellos para una migración automática efectiva. Por lo tanto, hay que dividir el problema en partes más pequeñas para interactuar con estos modelos de manera eficaz. Además, si se trabaja con tecnologías y arquitecturas personalizadas que no fueron incluidas en el entrenamiento del modelo, es necesario ampliar su conocimiento.
- La afinación del modelo puede ser costosa y requerir muchos recursos, lo que complica aún más el trabajo con estos modelos. La proliferación de modelos especializados en el mercado genera la necesidad de seleccionar el mejor modelo para un dominio específico.
«Tienen ventanas de contexto limitadas, lo que impide cargar una aplicación completa en un LLM.»
Abordaje para resolver problemas con LLMs
- Para abordar la limitación de la ventana de contexto, se han descompuesto los problemas de migración más grandes en preguntas más pequeñas, utilizando un motor de análisis que identifica problemas en el código fuente y realiza solicitudes LLM para cada uno de ellos. Las respuestas se agregan al final para lograr una migración completa de la aplicación. Esto puede hacerse manualmente para cada problema o automatizarse.
- Se busca además influir en el LLM para obtener información más precisa sobre tecnologías personalizadas. La estrategia incluye proporcionar un resumen de los problemas encontrados en el código, junto con ejemplos de cómo se han resuelto problemas similares en migraciones anteriores.
«Se han descompuesto los problemas de migración más grandes en preguntas más pequeñas.»
Diferenciadores de Kai respecto a otros modelos
- A diferencia de otros «co-pilot clones», Kai se basa en datos estructurados de migración. Al realizar migraciones a gran escala, los primeros intentos suelen ser muy manuales. Sin embargo, al migrar aplicaciones representativas de diferentes tipos, se facilita la automatización de tareas repetitivas, aprovechando el conocimiento acumulado en iteraciones previas.
- El enfoque de Kai es agnóstico al modelo, lo que permite integrar múltiples modelos, ya sean comerciales o personalizados, para interactuar con un amplio espectro de capacidades de LLM. De esta manera, se busca mejorar la efectividad de las migraciones sin estar atados a un modelo en particular.
«Kai se basa en datos estructurados de migración.»
Migración de Aplicaciones y Automatización
- La migración de aplicaciones suele ser un proceso que implica mover aplicaciones de una plataforma a otra. En las iteraciones iniciales, el enfoque es clásico, resolviendo problemas conforme aparecen y documentando esos desafíos en forma de reglas personalizadas.
- Estas reglas son luego compartidas con un ecosistema más amplio de desarrolladores, lo que ayuda a crear un conocimiento colectivo alrededor del proceso de migración. A medida que se adquiere suficiente información, se puede empezar a solicitar correcciones automáticas a nivel de IDE para problemas específicos.
- Con el tiempo, a medida que se completa la migración de un número considerable de aplicaciones, se podrá migrar a un nivel de repositorio, lo que acelerará el proceso significativamente. El migrador se encargará de los ajustes finales para asegurar que todo funcione correctamente.
«La idea será que migrarás la aplicación a nivel de repositorio y luego un migrador hará los ajustes finales.»
Desafíos en la Migración de Tecnología Legada
- La migración desde aplicaciones legadas con deudas técnicas es crítica, especialmente cuando se utilizan marcos antiguos que presentan dificultades en la modificación del código. Este tipo de sistemas a menudo carecen de recursos suficientes y enfrentan riesgos de seguridad debido a bibliotecas desactualizadas.
- Además, el costo de mantenimiento de dichas aplicaciones puede ser alto, y encontrar profesionales con experiencia en tecnología vieja se torna complicado. Por lo que la migración no solo cobra relevancia para una única aplicación, sino que se convierte en un proyecto masivo si se considera un número elevador de aplicaciones a migrar.
- Ayudar a las organizaciones a realizar esta migración de una manera más rápida y eficiente es el objetivo central del enfoque actual.
«Al migrar muchas aplicaciones, el proyecto se convierte en algo masivo y complicado.»
Visualización de la Demo de Migración
- La demostración se enfoca en la migración de código legado de Java EE a Quarkus, un marco más moderno que ofrece un enfoque ligero y ágil para el desarrollo de aplicaciones.
- La aplicación de ejemplo es una tienda de productos que incluye una interfaz de usuario, gestión de inventario, catálogo, carrito de compras y procesamiento de pedidos, todo funcionando como un monolito.
- Durante la presentación, se destaca que aunque la arquitectura monolítica tiene su lugar, la modernización puede incluir transiciones hacia arquitecturas más distribuidas y asíncronas.
«La tienda de aplicaciones muestra cómo un monolito puede seguir siendo relevante mientras se busca la modernización.»
Análisis de Código Estático e Integración con Konveyor AI
- Un componente esencial de Konveyor AI es el análisis de código estático, que permite obtener detalles sobre el estado del código. Este análisis genera un informe que es fundamental para identificar problemas y errores que necesitan ser corregidos antes de avanzar en el proceso de integración.
- Una vez que se ha realizado el análisis, los resultados se alimentan a Konveyor AI para generar los parches necesarios que corrigen los problemas detectados. Esto hace que el flujo de trabajo sea más eficiente y reduce el riesgo de errores.
- Konveyor AI es capaz de trabajar en conjunción con sistemas de control de versiones como Git, lo que facilita la implementación de los cambios recomendados directamente en el repositorio de código.
- Konveyor AI utiliza diferentes modelos de lenguaje de gran tamaño (LLM) para interpretar el análisis y generar correcciones. Esto brinda a los usuarios la flexibilidad de elegir el modelo que mejor se adapte a sus necesidades, habiendo demostrado eficacia con modelos como Mistral y otros.
“Konveyor AI permite observar las diferencias entre las bases de código y aceptar los cambios que se convierten en parte de la línea de producción.”
Implementación Práctica de Correcciones de Código
- Después de finalizar el análisis, el usuario puede visualizar incidentes específicos en el código, como el uso de anotaciones obsoletas. Por ejemplo, se muestra que las importaciones de Java X ya no son válidas y deben reemplazarse por las de Jakarta.
- Cada línea del código que presenta un problema se detalla de forma individual, ofreciendo un análisis granular que ayuda a los desarrolladores a comprender cómo realizar las correcciones necesarias.
- Aunque el ejemplo inicial es sencillo, Konveyor AI también aborda problemas más complejos, como la conversión de Beans manejados por mensajes, adaptándolos a nuevas tecnologías más eficientes y modernas.
“No se trata solo de una respuesta en bloque; Konveyor AI proporciona detalles sobre cada incidente para permitir correcciones más precisas.”
Generación de Soluciones con Modelos de Lenguaje
- Konveyor AI procesa las incidencias enviadas por el usuario y genera automáticamente un archivo de correcciones que se pueden revisar. Esta capacidad de recibir múltiples incidencias a la vez optimiza el proceso de migración.
- A medida que las solicitudes son procesadas, el sistema proporciona un análisis exhaustivo del cambio sugerido, incluyendo información sobre la razón del cambio y el contexto histórico relacionado con las especificaciones de Java y Jakarta.
- Además de remover importaciones obsoletas, Konveyor AI puede agregar líneas de código específicas según el marco de trabajo que se esté utilizando, lo que mejora la compatibilidad con arquitecturas modernas.
“El sistema puede responder a preguntas específicas sobre los cambios necesarios y generar un archivo con todas las modificaciones requeridas de forma eficiente.”
Ejemplos de Conversión de Código
- Durante la demostración, se mencionó la conversión de aplicaciones Java usando Kai, donde se realizan cambios específicos en el código. Por ejemplo, se ajustan las anotaciones de la aplicación y se renombra el código para alinearse con las nuevas especificaciones de Quarkus. Esta simplificación hace que el proceso de adaptación sea más accesible para los desarrolladores.
- Se presentó un caso práctico con un servicio de carrito de compras, donde el código base entero se actualizaba para reflejar las nuevas exigencias, asegurando que el sistema funcionara correctamente bajo las nuevas configuraciones.
- Además, se exploró un punto final de «carro de compras» que estaba basado en REST, el cual también requirió cambios en las anotaciones y la reestructuración del código.
«Lo que hice fue que convertí todos los archivos a través de Kai, y una vez que los convertí, puedes ver todos los cambios que se me muestran.»
Proceso de Aceptación de Cambios
- Una vez que se realizan los cambios en el código, estos pueden convertirse en parte del repositorio actual. Se sugirió usar una práctica recomendable que es ramificar el proyecto original, permitiendo trabajar en la nueva versión sin alterar el proyecto base.
- Se demostró cómo usar Git para gestionar esta nueva rama de código, facilitando el seguimiento de las modificaciones mientras se preserva el original.
«Una de las buenas prácticas sería realmente ramificar esto… sin perturbar tu proyecto original.»
Implementación de la Aplicación en Quarkus
- Se mencionó la facilidad de iniciar la aplicación Corcus a través de comandos simples, lo que reduce la complejidad vista en aplicaciones tradicionales que requerían scripts de despliegue extensos. Con la integración de contenedores de prueba, se puede iniciar rápidamente con una base de datos como Postgres.
- Además, se explicó que la capacidad de desplegar la aplicación directamente en OpenShift simplifica el proceso de implementación, ahorrando tiempo y esfuerzo al desarrollador.
«La belleza de esto es que comenzamos con una simple aplicación Java que tradicionalmente habría requerido reiniciar y crear scripts de implementación.»
Migración y Refactorización de Código
- El proceso de migración no es automático, sino que se realiza desde el entorno de desarrollo integrado (IDE) del desarrollador. Esto permite validar y aplicar cambios en el código de forma manual.
- La refactorización de aplicaciones a menudo se confunde con la re-arquitectura. Es fundamental diferenciar entre ambos conceptos, ya que aunque pueden realizarse en cualquier orden, tienen objetivos y procesos distintos.
- Herramientas como Kai permiten descomponer aplicaciones en componentes más pequeños, facilitando la refactorización hacia frameworks modernos como Quarkus. Sin embargo, Kai no se encarga de re-arquitecturar el código ni de dividirlo según patrones de diseño específicos como diseño impulsado por dominios o funciones serverless.
- Al migrar, es importante tener un objetivo claro relacionado con cuestiones como la deuda técnica, la falta de agilidad, problemas de seguridad, o costos elevados. Kai ayuda a simplificar aplicaciones Java a nuevas estructuras, eliminando elementos innecesarios del código.
«Kai permite refactorizar aplicaciones, pero no re-arquitecturarlas.»
Importancia de la Agilidad en el Desarrollo
- Una vez que se realiza la migración, los desarrolladores deben considerar cómo hacer su código más ágil y eficiente. Esto puede incluir automatización de procesos y el uso de patrones de microservicios.
- Aunque Kai no proporciona la re-arquitectura, sí facilita la modernización del código, permitiendo que el desarrollador tome decisiones respecto a la estructura y la división del mismo según sea necesario para sus objetivos de desarrollo.
«Kai facilita la transición a una arquitectura moderna, pero no toma decisiones por ti.»