Como todos vosotros,  yo también he estado jugando con ChatGPT, la estrella del mundo LLM (Large Language Models) a día de hoy. He intentado usarlo para generar código a partir prompts sencillos. Con resultados impresionantes pero mixtos. ChatGPT NO reemplazará definitivamente a los programadores. Aún menos a los modeladores. Pero sí que puede revolucionar el desarrollo de software, especialmente como parte de la ingeniería del software dirigida por modelos. En este post, explico cómo

Primeros experimentos con ChatGPT

Para empezar, le pedí que creara un plugin de WordPress simple (ya que parece que es capaz de hacerlo) para mostrar mis presentaciones de slideshare más populares en cualquier página mediante el uso de un nuevo shortcode de WP. El resultado fue un trozo de código útil pero incompleto con algunos pequeños errores en cuanto al uso de la API de slideshare debido a la mezcla de versiones de la API. Pude mejorar los resultados chateando con ChatGPT. Pero por supuesto, eso sólo pude hacerlo porque tengo suficiente experiencia en la construcción de plugins de WP para saber lo que faltaba.

ChatGPT missed the code to register the shortcode

Pidiendo a ChatGPT que complete el código generado ya que se “olvidó” de registrar el shortcode en WordPress para que se reconozca al usarloSi lo que intentamos es crear modelos software a partir de requisitos textuales, ChatGPT rapidamente confiesa que no puede dibujar diagramas, pero me sorprendió agradablemente ver que conoce la sintaxis de PlantUML, por lo que podemos usarla para crear modelos textuales. De hecho, incluso puedes enseñar a ChatGPT nuevas sintaxis a través de ejemplos.

De nuevo, los resultados fueron útiles pero lejos de ser perfectos. Si le preguntas a ChatGPT que cree un diagrama de clases para un sistema de compras de productos, obtienes un modelo PlantUML bastante correcto (a veces comete algunos errores con la sintaxis de las asociaciones) que podría usarse como inspiración para el modelo real que necesitarás crear. Para mí, se ve principalmente útil como una forma de verificar si te estás dejando algo (por ejemplo, mirando el modelo de ChatGPT a lo mejor de tas cuenta de un atributo que no tenías y que, de hecho, debería ser parte de tu modelo). Y, como cada vez que preguntas, obtienes un resultado completamente diferente, también se podría usar para ver las variaciones de modelos en el dominio que podrían proponer sugerencias de diseño interesantes.

Generation of a PlantUML with ChatGPT

Generación de un diagrama de clases UML utilizando la sintaxis textual de PlantUML con ChatGPT

¿Representan los LLMs el fin de los programadores? ¿Y el de los analistas/diseñadores?

Con ChatGPT y la creciente popularidad de todo tipo de grandes modelos de lenguaje (LLM) entrenados para realizar muchas tareas diferentes, incluyendo tareas relacionadas con la generación de código a partir de una descripción de la tarea a implementar en lenguaje natural, muchos se plantean si estamos asisitiendo al final de la era de los programadores. A pesar de qué hoy en día, el código, como vimos antes, no es perfecto e incluso puede generar problemas de seguridad, está claro que mejorará rápidamente en futuras iteraciones. Y no hará falta ni esperar a GPT4.

Pero ni así. LLMs sobresalen en la generación de código repetitivo y con estructura simple. Si eres programador, espero que tu trabajo vaya más allá que escribir formularios de entrada de datos para bases de datos relacionales y cosas por estilo. Como ya discutimos en un post anterior, Kai-Fu Lee dice que cuanto más creativo es una tarea, más es necesaria la participación humana.

Hasta el propio ChatGPT, si se lo preguntas, te dirá que no es una amenaza para los programadores (que hagan cosas interesantes)

Además, puedes automatizar muchas cosas pero para generar cualquier sistema no trivial seguirás necesitando ser capaz de proporcionar una especificación precisa de lo que necesitas. Y éste es el trabajo de los analistas/modeladores, con lo que ¡estamos más a salvo aún que los programadores!

De modelos a prompts (o como los LLMs sí reemplazarán algo: a los generadores de código)

Esta idea de un componente que sobresale en la generación de código repetitivo a partir de modelos/especificaciones nos suena familiar, ¿verdad? En la ingeniería de software dirigida por modelos, esto es lo que conocemos como generadores de código: transformaciones de modelo a texto que aplican un conjunto de reglas sobre un modelo de entrada para generar código.

Mi predicción es que pronto veremos generadores de código basados en LLMs en plataformas low-code.  Todavía sería el humano quién crearía los modelos, pero luego esas especificaciones formales y modelos de software serían traducidos a un conjunto de prompts precisos para un LLM subyacente encargado de generar el código real.

Al igual que los actuales generadores de código basados en reglas y escritos manualmente, hay un límite a lo que se puede generar y siempre habrá algo de codificación manual en cuanto necesites algo que no sea completamente estándar. Pero de nuevo, esta es ya una limitación de los actuales generadores, no una nueva impuesta por el uso de LLM.

Hay inconvenientes evidentes en esta idea. En primer lugar, la salida no será determinista. Estoy bastante seguro de que con una buena ingeniería de prompts, lograríamos obtener resultados siempre similares, pero esto podría ser un problema. Otro problema es que nunca podremos estar 100% seguros de la calidad del código generado. Los generadores de código “tradicionales” pueden ser certificados, pero los basados en LLM no (al menos por ahora). Así que olvídate de usarlo para aplicaciones críticas (aunque de todas maneras este tipo de aplicaciones tampoco es el objetivo de las plataformas low-code). Una alternativa medio camino sería utilizar el LLM para crear la plantilla a usar para el generador. Esta plantilla es única para cada tecnología con lo que podría certificarse y una vez certificada utilizarla para generar el código para esa plataforma en concreto.

Pero también hay ventajas evidentes. La principal sería la capacidad de incluir cualquier plataforma inmediatamente y sin costo adicional. Ahora no necesitas crear (¡y mantener!) un nuevo generador para cada plataforma para la que quieras generar código. Con un LLM, puedes generar código para todas ellas, siempre y cuando el LLM las haya “visto” durante su entrenamiento. Además, siempre que actualices la versión de LLM que estás utilizando, podrás dirigirte inmediatamente a nuevas plataformas y nuevas versiones de dichas plataformas para generar siempre código actualizado. Y una vez que incorpores un LLM a tu plataforma low-code, podrías usar la misma LLM para otras tareas más allá de la generación de código, como la validación de los modelos a través de su verbalización en lenguaje natural.

¿Y vosotros, cómo créeis que los LLMs van a cambiar el futuro de la ingeniería de software?

¿Estáis de acuerdo con mi opinión? ¿O tenéis otra más (o menos) ambiciosa? ¿Qué otros aspectos de la ingeniería de software pueden beneficiarse de los LLMs? ¡Espero vuestras opiniones!