Un diagrama de flujo con varias formas y símbolos, incluyendo una burbuja de diálogo azul, un signo de interrogación y una marca de verificación
Descripción general

La AI puede revolucionar el desarrollo de aplicaciones generando, optimizando y traduciendo código a lo largo de todo el ciclo de vida del desarrollo de software. La adopción de AI generativa puede conducir a una creación de software coherente, una utilización óptima de la creatividad de los desarrolladores y mejores habilidades de los desarrolladores. Por ejemplo:

  • Para los desarrolladores de Python y Java, la IA generativa puede aumentar sus capacidades automatizando tareas de bajo valor como la generación de código y la búsqueda de errores. También puede mejorar la optimización del código, hacer cumplir los estándares de programación y ayudar en la selección de API y bibliotecas, lo que lleva a aplicaciones más eficientes y robustas.
  • En lenguajes tradicionales como COBOL, la IA generativa puede hacer que los sistemas heredados recobren vida. Mediante la refactorización y optimización del código COBOL existente, la IA generativa puede mejorar el rendimiento y la facilidad de mantenimiento de estos sistemas. También puede ayudar a convertir el código COBOL a lenguajes más modernos, como Java, proporcionando una herramienta valiosa en los esfuerzos de modernización del sistema.
  • Para los ingenieros de confiabilidad de sitios (SRE) que trabajan con Ansible, la IA generativa puede automatizar la creación de playbooks, optimizar los scripts existentes o incluso identificar posibles errores. Esta automatización puede reducir significativamente el tiempo dedicado a tareas rutinarias, lo que permite a los SRE centrarse en desafíos más complejos.
¿Por qué utilizar la IA generativa en el desarrollo de aplicaciones?

Aplicar la IA generativa al desarrollo de aplicaciones tiene grandes beneficios potenciales:

  • Coherencia: al aplicar la IA generativa para revisar y refactorizar el código, los desarrolladores pueden mantener estándares de programación coherentes, lo que facilita la resolución de problemas y el mantenimiento del software.
  • Optimización de la creatividad: la IA generativa puede automatizar tareas de bajo valor, lo que libera a los desarrolladores para que se centren en tareas más complejas, lo que se traduce en ciclos de desarrollo más cortos y cambios más frecuentes.
  • Amplificación de habilidades: la IA generativa puede actuar como mentora de los desarrolladores júnior, permitiéndoles desempeñarse a nivel sénior o incluso experto.

La aplicación de IA generativa para revisar, refactorizar y aplicar estándares de programación empresarial al software da como resultado un software más coherente; por ejemplo, enfoques comunes para resolver problemas recurrentes, estructura de código común, código autodocumentado, etc., independientemente de qué desarrollador escribió el código. Esto, a su vez, hace que la aplicación resultante sea más fácil de solucionar y mantener, ya que hay menos necesidad de que los mantenedores comprendan primero la estructura y las idiosincrasias de las diferentes secciones de código.

Al igual que en otros ámbitos, la IA generativa tiene el potencial de liberar a los desarrolladores de aplicaciones de tareas de bajo valor, como escribir código simple o repetitivo, o identificar el origen de un error problemático. Con más tiempo para centrarse en tareas de mayor valor, los desarrolladores pueden permitir ciclos de desarrollo más cortos, más funcionalidad por versión de software y cambios más pequeños y frecuentes.

Por último, la aplicación de la IA generativa al desarrollo de aplicaciones puede amplificar las habilidades de los desarrolladores, permitiendo a los desarrolladores júnior rendir a un nivel sénior o incluso experto. Los desarrolladores sénior pueden incorporar el entrenamiento de modelos en sus ciclos de lanzamiento, integrando prácticas líderes a medida que se mejora el código. La IA generativa puede actuar como un mentor experto para el personal subalterno, liberando a los desarrolladores sénior para enfocarse en otras tareas y mejorando el nivel de habilidad del equipo de desarrollo general.

Casos de uso para desarrollo de aplicaciones

La IA generativa se puede aplicar al desarrollo de aplicaciones en varios casos de uso amplios. Muchos modelos generales, como Llama 2, se entrenan en código de aplicación escrito en múltiples lenguajes de programación contemporáneos, y también hay disponibles modelos ajustados para la generación de código.

Los casos de uso que vemos que se benefician de la IA generativa incluyen:

  • Generación de código: la IA generativa puede generar código nuevo a partir de instrucciones en lenguaje natural.
  • Optimización y refactorización de código: la IA se puede utilizar para optimizar y reestructurar el código, haciéndolo más eficiente y eliminando duplicaciones.
  • Aplicación de estándares de programación: la IA puede aplicar los estándares y convenciones de programación, lo que también puede ayudar a cumplir con los estándares reglamentarios.
  • Conversión de código: la IA puede convertir código de un lenguaje a otro.
  • Comprensión del código, documentación y búsqueda de errores: la IA puede interpretar el código y generar explicaciones sobre su funcionalidad, además de identificar errores.
  • Selección de API y bibliotecas: la IA puede ayudar a los desarrolladores a elegir las API y las bibliotecas de software adecuadas para sus aplicaciones.

Cada uno de estos casos de uso se describe a continuación.

La capacidad de generación de texto nativo de los modelos de lenguaje grandes (LLM) se puede utilizar para generar nuevo código a partir de instrucciones en lenguaje natural. Por ejemplo, un desarrollador puede enviar la instrucción "Escribir una consulta SQL para recuperar el nombre y apellido de un cliente de la tabla de clientes" y recibir una consulta SQL a cambio.

El uso de LLM para la generación de código puede aumentar significativamente las habilidades de desarrollo de aplicaciones de los principiantes o incluso de los no desarrolladores, pero puede llegar rápidamente a un punto de rendimiento decreciente a medida que los resultados requeridos se vuelven más complejos, o a medida que el nivel de detalle requerido en las instrucciones se acerca al código que se generará.

 

La optimización y refactorización de código, el proceso de mejorar el código para que sea más eficaz y esté mejor estructurado, puede considerarse como una combinación de dos capacidades de LLM: generación de texto y resumen de texto. Mediante un LLM general o ajustado, un desarrollador puede dar instrucciones para optimizar o reestructurar un fragmento de código para que tenga más rendimiento o eliminar el código duplicado.

Los LLM funcionan bien para optimizar y refactorizar fragmentos de código más pequeños que se ajustan a la ventana de contexto de los modelos, pero requieren soluciones más grandes que mantengan metadatos sobre toda la aplicación de software para lograr resultados aceptables en fragmentos de código más grandes o sistemas de software completos.

Al igual que la optimización de código, los LLM se pueden utilizar para aplicar y hacer cumplir los estándares de programación empresarial en torno a temas como la nomenclatura de funciones y variables, la estructura del código y las convenciones de programación empresarial. Normalmente aplicados a nivel de repositorio como parte del proceso de revisión de código y compromiso, los LLM ajustados a los estándares de programación de la empresa pueden traducir el código presentado para cumplir con los estándares de la empresa. Estas normas también pueden incluir convenciones de endurecimiento que ayudan a la empresa a cumplir con las regulaciones.

Como los lenguajes de programación son como cualquier otro lenguaje, la capacidad de traducción de texto nativo de los LLM puede traducir software escrito en un lenguaje de programación a otro, por ejemplo, convertir C# a Java.

Al igual que la optimización de código, los LLM por sí solos funcionan bien para convertir pequeños fragmentos de código que se ajustan a la ventana de contexto del modelo, pero se necesitan soluciones más grandes que mantengan metadatos y otra información contextual importante para convertir fragmentos de código más grandes o sistemas de software completos.

Gracias a sus capacidades de conversión de código, la IA generativa también puede facilitar la traducción de código entre diferentes lenguajes de programación, como la traducción de código COBOL a Java. Esto puede ser particularmente útil en entornos multilingües o durante migraciones de sistemas, ahorrando a los desarrolladores el tiempo y el esfuerzo de reescribir manualmente el código.

La comprensión del código es el análogo de la generación de código. En lugar de convertir las instrucciones en lenguaje natural en código, la explicación del código toma un fragmento de código como entrada y genera una explicación en lenguaje natural de la funcionalidad del código. Por ejemplo, una instrucción como "Explicar la función de este código python" seguida de una sección de python puede generar un resumen general y línea por línea del propósito del código.

Esta capacidad también se puede utilizar para detectar errores en el código, también conocido como búsqueda de errores, al indicar al modelo que "Identifique por qué está fallando este fragmento de código".

API and Library Selection es la aplicación de la generación aumentada por recuperación (RAG, por sus siglas en inglés) a la gestión de API y bibliotecas de software empresarial. Un desarrollador que busca una API para usar con una aplicación podría redactar una instrucción de RAG que consulte una base de datos empresarial de nombres de API, descripciones, endpoints, etc., para responder preguntas como "¿Tenemos una API que hace xyz?" En la medida en que las descripciones de la API y la biblioteca de códigos se mantengan con alta calidad y palabras clave, dicha aplicación podría ajustarse para proporcionar respuestas coherentes que aceleren el desarrollo de la aplicación, así como la incorporación de desarrolladores.

Decisiones y consideraciones arquitectónicas

Los arquitectos deben tomar una serie de decisiones de arquitectura importantes al diseñar soluciones de desarrollo de aplicaciones mediante LLM.

¿El modelo ofrece indemnización o protección por derechos de autor, y cómo se puede identificar si el código generado está limitado por los términos de licencia? Incluso los modelos entrenados con licencias permisivas pueden verse obstaculizados por cláusulas de licencia, como otorgar crédito al titular original de los derechos de autor.

Los arquitectos que crean soluciones destinadas a hacer cumplir y aplicar estándares de programación empresarial deben considerar el esfuerzo necesario para ajustar un LLM para "comprender" los estándares empresariales; y tomar una decisión informada sobre si otros métodos, como las herramientas de linting, están mejor instrumentados para lograr una capacidad similar.

La ayuda para completar automáticamente el código debe responder rápidamente para no interferir en el flujo de ideas del desarrollador. Los arquitectos deben considerar la ubicación y la conectividad de los modelos de asistencia al desarrollador para garantizar que los soportes para desarrolladores sean beneficiosos y no intrusivos.

No se garantiza que los modelos de lenguaje grandes produzcan código funcionalmente correcto, especialmente si el código generado o revisado debe encajar en un sistema de software más grande. Si bien no existe una solución directa a este problema (y cada vez menos a medida que evolucionan los LLM), los arquitectos deben ser conscientes de que el código generado por LLM debe estar sujeto a los mismos controles de garantía de calidad y seguridad que el código producido por desarrolladores humanos.

Los LLM generalmente disponibles generalmente se entrenan en una pequeña cantidad de lenguajes de programación contemporáneos, como Python, Javascript, C # y otros. Los arquitectos de soluciones que necesitan admitir lenguajes más antiguos o especializados pueden encontrarse con pocas opciones para los modelos disponibles, o pueden verse obligados a ajustar agresivamente un modelo general para satisfacer sus necesidades específicas.

Siguientes pasos

Hable con nuestros expertos sobre la implementación de un patrón de despliegue de nube híbrida.

Colaboradores

Pete Nuwayser, Chris Kirby, Mihai Criveti

Actualizado: 30 de noviembre de 2023