¿La inteligencia artificial va a revolucionar el desarrollo de software?

Matthew Belcher and Danish Javed

Matthew Belcher and Danish Javed

Ver biografía y publicaciones del autor

Debido a la popularidad del blog, hemos creado un ebook que puedes descargar haciendo clic en la siguiente imagen:

[ES] Descarga nuestro ebook sobre GenAI

Tendencias en el desarrollo de software, IA y programación

En el mundo de la tecnología, en constante evolución, estamos entrando en una nueva era con la llegada de la Inteligencia Artificial Generativa (o Gen AI). La Gen AI promete redefinir la forma en que abordamos el desarrollo de software, automatizando las tareas rutinarias de codificación, generando estructuras de código complejas y mejorando la calidad del software. En este contexto, ¿está la Gen AI preparada para revolucionar el desarrollo de software? ¿Son sólo exageraciones o estamos realmente en la cúspide de algo transformador?

Las herramientas de Gen AI podrían aumentar drásticamente la productividad, reducir los errores manuales y desencadenar una oleada de innovación, al permitir a los profesionales utilizar la mayor parte de su tiempo en la resolución creativa de problemas y el pensamiento estratégico de alto nivel. Este enfoque revolucionario nos invita a reimaginar el desarrollo de software como una relación simbiótica entre el intelecto humano y la inteligencia artificial, donde el todo es mayor que la suma de sus partes.

En este blog examinaremos algunas de las herramientas de la Gen AI para entender qué impacto pueden tener en el desarrollo de software y cómo pueden dar lugar a nuevas formas de trabajo. Además, reflexionaremos sobre algunas de sus implicaciones legales y éticas, y su impacto en el Software Craftsmanship.

Qué es la Inteligencia Artificial Generativa (Gen AI)

La Inteligencia Artificial Generativa (Gen AI) es un tipo de tecnología de inteligencia artificial que puede producir diversos tipos de contenido, incluyendo texto, imágenes, audio y video. Esto se logra mediante el análisis de extensas cantidades de datos recopilados de diversas fuentes, identificando patrones y siendo capaz de generar nuevos datos basados en estos patrones observados, así como en datos sintéticos a partir de una entrada dada y, en particular, en respuesta a comandos específicos.

Este arte de dar instrucciones precisas es un subcampo del data science y del machine learning también conocido como Prompt Engineering. Consiste en dar instrucciones claras y concisas para obtener los mejores resultados los resultados de las herramientas de Gen AI. De este modo, la asistencia será más inteligente y eficiente para diversas tareas.

Los modelos de IA Generativa aprenden los patrones y la estructura de sus datos de entrenamiento y luego generan nuevos datos con características similares.. La IA Generativa tiene aplicaciones potenciales en una amplia gama de industrias, incluyendo arte, escritura, desarrollo de software, atención médica, finanzas, juegos, marketing, moda, administración y regulación en el sector público.

Hay que tener en cuenta que los modelos de Gen AI no tienen un propósito general y no son aplicables a todas las situaciones, además de que no implican una "Inteligencia General". Carecen de sentido común, inteligencia emocional y están diseñados únicamente para generar nuevos datos que se asemejen a un conjunto de datos dado. La finalidad de los modelos generativos es comprender los patrones fundamentales y las distribuciones presentes en los datos de entrenamiento. Luego, aplican este conocimiento para crear nuevos puntos de datos que se asemejen al conjunto original.

La Inteligencia Artificial General (IAG o AGI por sus siglas en inglés), también conocida como "Strong AI", plantea notables desafíos técnicos y científicos y aún se encuentra en proceso de desarrollo. De hecho, hay muchos que incluso cuestionan su realización futura.

En el desarrollo de software, la IA Generativa puede utilizarse para la generación de código y la automatización, lo que puede ayudar a automatizar tareas repetitivas como la creación de interfaces de usuario, pruebas y documentación, ahorrando tiempo y esfuerzo a los desarrolladores. Estos modelos también pueden ayudar a identificar errores y sugerir soluciones, mejorando la precisión y eficiencia del proceso de desarrollo. 

Herramientas Gen AI en el desarrollo de software

Es crucial abordar las herramientas de software Gen AI con una comprensión completa y equilibrada de sus capacidades y limitaciones. Están diseñadas para complementar y asistir a los desarrolladores de software, no reemplazarlos.

Los esfuerzos colaborativos entre humanos y herramientas de inteligencia artificial pueden llevar a procesos de desarrollo de software más eficientes y efectivos, pero la experiencia y el juicio humano siguen siendo fundamentales para ofrecer soluciones de software de alta calidad. Como ejemplo, aunque las herramientas Gen AI de asistencia de código hacen un buen trabajo proporcionando sugerencias de completado de código, no ofrecen sugerencias sobre decisiones arquitectónicas que podríamos estar tomando, por lo tanto, el juicio humano sigue siendo crucial en este proceso. Estas herramientas carecen de la capacidad para incorporar un contexto empresarial más amplio y equilibrar decisiones de compensación necesarias para tareas como esta.

Las herramientas Gen AI tienen el potencial de ayudar a desarrolladores menos experimentados. En lugar de limitarse a su propio conocimiento de un lenguaje, herramienta o marco de software, estas herramientas abren la posibilidad para que estos desarrolladores aprovechen una base de conocimientos mucho más amplia. Como resultado, les permite desarrollar programas de software más complejos y potenciar su propia curva de aprendizaje.

Sin embargo, es importante comprender que depender del código generado por herramientas Gen AI conlleva un grado de riesgo y debe manejarse con precaución. Existe el peligro de que los desarrolladores de software se vuelvan complacientes y depositen demasiada confianza en el código generado. Una característica definitoria de cualquier buen desarrollado de software, es la capacidad de criticar el código y tomar decisiones de diseño que se ajusten al problema en cuestión. Por lo tanto, es esencial no perder estas habilidades y revisar cuidadosamente si el código generado se adecua al propósito y al diseño general del sistema antes de incorporarlo a una solución, como se mencionó previamente.

Las herramientas Gen AI tienen aplicaciones en la generación de código para soluciones de software, pero también se pueden emplear en varias etapas del desarrollo. Estas herramientas están experimentando un rápido desarrollo, con la introducción de nuevas opciones populares que examinaremos a continuación.

ChatGPT

El generative pre-trained transformer de OpenAI, conocido comúnmente como ChatGPT, no se presenta como una herramienta de desarrollo de software. Más bien, es una interfaz de usuario de propósito general sobre un modelo de lenguaje de aprendizaje automático que puede generar texto similar al humano en respuesta a las entradas que recibe. De hecho, el modelo es tan extenso que se le denomina Large Language Model (o LLM).

A pesar de no estar dirigido específicamente al desarrollo de software, ha tenido un impacto significativo en cómo los desarrolladores de software abordan la escritura de código. Proporciona a los desarrolladores una interfaz para "conversar" sobre un problema de codificación. ChatGPT puede responder ofreciendo sugerencias y fragmentos de código para que el ingeniero los utilice. Es importante tener en cuenta que las respuestas proporcionadas por ChatGPT se generan utilizando la gran cantidad de datos que ha recopilado y en los que se ha entrenado principalmente a partir de Internet.

La versión más reciente del modelo subyacente, GPT4.5 (en el momento de escribir este blog), ha introducido diversas mejoras en las respuestas que puede ofrecer. Estas mejoras se pueden utilizar para diversas tareas relacionadas con el desarrollo de software, tales como mejorar la documentación, generar casos de prueba, analizar código y, por supuesto, generar fragmentos de código.

En Codurance, también observamos un aumento en la disponibilidad de complementos para los IDEs populares que brindan acceso al modelo subyacente. Estos complementos ofrecen una función de chat incorporada, lo que permite a los desarrolladores solicitar al modelo que genere código en función de determinadas indicaciones. En algunas situaciones, el modelo también puede tener en cuenta el contexto del proyecto (es decir, la totalidad de la base de código) y ofrecer sugerencias adicionales.

ChatGPT puede ser utilizado para una variedad de casos de uso en el desarrollo de software. Puede brindar asistencia para entender un lenguaje de programación o un marco de trabajo, permitiendo a los desarrolladores acceder rápidamente a información relevante y fragmentos de código. Genera código y ofrece sugerencias, acelerando la creación de prototipos y ahorrando tiempo en tareas rutinarias. ChatGPT puede ayudar en la detección de errores y depuración, proporcionando ideas y posibles soluciones. También facilita la creación rápida de prototipos y la exploración, permitiendo a los desarrolladores experimentar con diferentes ideas. Además, su interfaz de lenguaje natural mejora la accesibilidad para usuarios con diversos niveles de experiencia en programación.

En Codurance defendemos las prácticas de Extreme Programming (XP) en los proyectos con nuestros clientes. Una de ellas es la programación en parejas (pair programming). Sin embargo, adoptamos un enfoque pragmático al respecto: no todo requiere pair programming. Con la llegada de ChatGPT y herramientas similares, es posible imitar algunas de las ventajas de estas prácticas.

Aunque ChatGPT claramente tiene mucho que ofrecer en el desarrollo de software, también hay limitaciones a tener en cuenta. Puede carecer de comprensión contextual dependiendo del complemento utilizado, lo que puede llevar a sugerencias irrelevantes o inexactas que requieren validación humana. La dependencia del modelo de entrenamiento puede introducir sesgos o ejemplos de código defectuosos. Puede no comprender completamente la intención del desarrollador o el contexto del proyecto, lo que resulta en abordar parcialmente la funcionalidad deseada. Pueden surgir preocupaciones de privacidad y seguridad si se comparte información sensible inadvertidamente. Se deben considerar aspectos éticos, como evitar código sesgado o discriminatorio. Una dependencia excesiva en ChatGPT puede obstaculizar el desarrollo de habilidades, y la colaboración en tiempo real sigue siendo esencial para discusiones matizadas.

GitHub Copilot 

GitHub Copilot se presenta como la última incorporación a una serie de herramientas que están marcando la pauta en la industria del desarrollo de software. Nos sorprendió de manera positiva su velocidad de sugerencias y precisión. Nuestra experiencia al utilizarlo junto con el enfoque de Test Driven Development (TDD) funcionó bien. Era casi como tener a otra persona emparejada con nosotros. Aunque los fragmentos de código generados no siempre eran perfectos y a menudo necesitaban ajustes, nos llevaron parte del camino para evitar la tediosa configuración inicial.

Cuando se nombra bien un caso de prueba (test-case), Copilot intentará completar el cuerpo de la prueba basándose en el nombre de nuestro método y utilizando el contexto del código. Aunque esto no es el escenario típico de uso de Copilot que se muestra en diversas demostraciones de codificación, es decir, proporcionando instrucciones paso a paso o indicaciones, hizo un buen trabajo al crear el cuerpo de la prueba.

La latencia de las sugerencias fue bastante buena, era perceptible en ocasiones, pero en general fue una buena experiencia. No consideramos que recorrer los fragmentos sugeridos fuera tan natural como otras opciones.

Copilot también está en pleno desarrollo, con muchas funciones que se lanzan de manera regular. Una de las adiciones más recientes al complemento es la función de chat (disponible solo en VSCode en el momento de escribir este blog), así como Copilot Labs, que tiene conceptos de Brushes (pinceles), como Refactor, Cleanup, Readable, etc., que buscan hacer que su código sea más limpio, legible o refactorizarlo utilizando una alternativa.

Otra característica interesante en Copilot Labs es que puede traducir código de un lenguaje a otro, por ejemplo, de Java a Python a nivel de fragmento. Esto indica la posibilidad en el futuro de traducir una aplicación completa de un lenguaje a otro, lo cual sería útil si alguien desea trasladar su base de código a un lenguaje alternativo, quizás como parte de un esfuerzo más amplio para evolucionar su pila tecnológica. Esto podría ser especialmente útil para organizaciones que deseen emprender una iniciativa de modernización de software que involucre bases de código o lenguajes más antiguos. 

AWS Code Whisperer

Amazon AWS ha estado trabajando en su propio asistente de inteligencia artificial para el desarrollo de software. Similar a Copilot, admite varios lenguajes, IDE populares y aborda las mismas necesidades de generación de código asistida por inteligencia artificial. Al igual que con nuestra aproximación TDD con Copilot, pudimos obtener la finalización del método a partir de un caso de prueba bien nombrado.

Los detalles de implementación de CodeWhisperer no son bien conocidos, pero se ha entrenado con código que es de código abierto o interno de Amazon. Actualmente se ofrece de forma gratuita para individuos con una cuenta de AWS Builders y una versión con licencia como CodeWhisperer Professional para organizaciones que utilizan servicios en la nube de AWS.

Es importante destacar que CodeWhisperer es similar a Copilot en el sentido de que puede ayudar a escribir aplicaciones, pero donde CodeWhisperer realmente destaca es al escribir código para los servicios de AWS. Algunos de estos servicios comúnmente utilizados incluyen AWS S3, Lambda, etc. Copilot puede hacer lo mismo, pero CodeWhisperer lo hace de manera más efectiva.

Otra característica destacada es que Code Whisperer también verificará las vulnerabilidades de seguridad enumeradas en el OWASP Top 10 contra el código que está siendo generado o escrito por el desarrollador. Una vez que se identifica una vulnerabilidad de seguridad, CodeWhisperer proporcionará sugerencias sobre cómo corregirla. Sin embargo, esta funcionalidad está limitada a Python, Java y JavaScript en este momento.

En general, creemos que CodeWhisperer en su estado actual no es tan rico en funciones como Copilot, pero esto podría cambiar en el futuro, ya que es un ámbito en rápida evolución. Nosotros continuaremos monitoreando ambas herramientas activamente.

Privacidad y seguridad: preocupaciones

La privacidad y la seguridad son aspectos cruciales a tener en cuenta al utilizar herramientas como GitHub Copilot y CodeWhisperer. Aunque estas asistentes de codificación impulsadas por inteligencia artificial buscan ofrecer sugerencias eficientes y precisas, es importante señalar la posibilidad de generar código con vulnerabilidades de seguridad, a pesar de los esfuerzos para filtrar código inseguro de sus datos de entrenamiento.

Es esencial reconocer que la aparición de estas herramientas de inteligencia artificial plantea implicaciones de seguridad que deben abordarse. A medida que estas herramientas se vuelven más sofisticadas, resulta imperativo implementar medidas de seguridad sólidas para proteger la información sensible y prevenir posibles mal usos.

Un aspecto importante a considerar es que, como usuarios de estas herramientas, conservamos la propiedad del código generado. Esto también incluye cualquier sugerencia ofrecida por estas herramientas, ya que se adaptan a nuestros requisitos específicos basados en las indicaciones que proporcionamos.

Tanto GitHub Copilot como CodeWhisperer utilizan la recopilación de datos para mejorar sus servicios. GitHub Copilot captura indicaciones en tiempo real, sugerencias generadas por la inteligencia artificial y datos de interacción del usuario dentro del entorno de desarrollo integrado (IDE). Sin embargo, GitHub Copilot for Business no almacena indicaciones y sugerencias, solo datos de interacción de usuario seudónimos.

De manera similar, CodeWhisperer (versión individual) almacena datos de uso y contenido para mejorar su servicio, pero los usuarios pueden optar por no compartir estos datos. Los datos recopilados incluyen telemetría y contenido del lado del cliente, pero en la versión profesional, la recopilación de contenido para mejorar el servicio está desactivada. Tenga la seguridad de que la telemetría no incluye código real ni información personal identificable (PII), y el uso de datos se puede limitar a su propia red privada virtual (VPC) para un mejor control.

Aunque ambas herramientas carecen de acceso al código fuente, aún pueden tener acceso a información contextual, como la pila tecnológica utilizada y descripciones de funciones de dominio proporcionadas mediante indicaciones. Para evitar problemas de propiedad intelectual, es recomendable consultar con asesores legales.

Comprender estas consideraciones de privacidad y seguridad nos ayuda a tomar decisiones informadas y a aprovechar estas herramientas poderosas mientras protegemos nuestro código e información personal.

Software Craftsmanship y la Inteligencia Artificial

Quienes conozcan a Codurance sabrán que los principios del Software Craftsmanship son la base de nuestro trabajo. Por lo tanto, consideramos necesario analizar cómo la IA puede afectar a este enfoque. Para aquellos que no estén familiarizados con el Software Craftsmanship, es una filosofía que busca elevar el nivel de calidad en la industria del software a través del profesionalismo y la excelencia técnica.

Creemos que incluso con el surgimiento de la inteligencia artificial y las herramientas de asistencia de código de la inteligencia artificial generativa, el Software Craftsmanship aún tiene un lugar muy importante en el desarrollo de software. Si bien las herramientas de asistencia de código de la inteligencia artificial generativa, como las discutidas en este blog, pueden generar código que bien podría ser funcionalmente correcto, es importante recordar que siguen siendo solo herramientas. Como tales, carecen de la capacidad para comprender las sutilezas del dominio empresarial, las necesidades específicas de un usuario o una comprensión más profunda del contexto más amplio en el que reside el software que se está escribiendo. El Software Craftsmanship no se trata solo de crear software funcionalmente correcto. En su esencia, está la idea de sentir orgullo por el software que se está desarrollando y producir soluciones de software bien diseñadas, que sean capaces de mantenerse en el tiempo y sean confiables. Algo que un ser humano, un software craftsperson, debe poseer y no externalizar en una herramienta.

Sin embargo, creemos que el Software Craftsmanship y la inteligencia artificial pueden coexistir y complementarse de manera armoniosa. Por ejemplo, las herramientas de asistencia de código de la inteligencia artificial generativa y otras herramientas relacionadas pueden utilizarse para automatizar tareas repetitivas que se comprenden bien, que no son excesivamente complejas pero que consumen tiempo de todos modos. Esto libera tiempo para que los desarrolladores de software se centren más en actividades que aportan más valor, como el diseño arquitectónico general, la resolución de problemas complejos y la implementación de funciones críticas para el negocio.

Conclusión

Al inicio de este blog, planteamos la pregunta de si la inteligencia artificial está a punto de revolucionar el desarrollo de software. Si bien el lanzamiento de herramientas de inteligencia artificial generativa (Gen AI) como las discutidas aquí indudablemente tienen el potencial de aumentar la productividad, entre otras cosas, todavía queda camino por recorrer antes de que podamos declarar que el desarrollo de software ha sido revolucionado.

Aquellos que siguen la inteligencia artificial sabrán que este es un espacio increíblemente dinámico, con nuevas herramientas que parecen ser lanzadas cada semana. Esto significa que también es un espacio en constante evolución: los modelos de inteligencia artificial se están entrenando y se están lanzando nuevos modelos. Cada modelo parece ser más avanzado que el anterior. En el momento de escribir este blog, Meta acaba de anunciar el próximo lanzamiento de su nuevo modelo, Llama2. Todo esto significa que aunque la inteligencia artificial no está revolucionando el desarrollo de software en este momento, ciertamente tiene el potencial de ser transformadora.

Lo que está claro es que la inteligencia artificial es una presencia constante y, por lo tanto, es esencial que los líderes tecnológicos evalúen su posible impacto en el proceso de desarrollo de software. Aquellos que lo hagan estarán en una posición privilegiada para aprovechar sus beneficios. En este análisis, resulta fundamental abordar las implicaciones de seguridad y legales discutidas anteriormente. Asimismo, se debe reflexionar sobre cómo los procesos y prácticas técnicas actuales podrían evolucionar o qué nuevas prácticas podrían incorporarse para optimizar los beneficios derivados de la adopción de la inteligencia artificial. Un tema recurrente en las discusiones recientes ha sido el Test Driven Development y cómo la inteligencia artificial puede desempeñar un papel significativo en esa práctica.

Es importante comprender las implicaciones completas de adoptar herramientas de inteligencia artificial en su proceso de desarrollo de software. Si bien estas herramientas de inteligencia artificial pueden ofrecer una asistencia tremenda, las sugerencias y los avisos generados por estas herramientas son propiedad de las respectivas compañías. Esto plantea preocupaciones sobre la propiedad y la propiedad intelectual. Los desarrolladores de software y los líderes técnicos deben tener esto en cuenta y tomar las precauciones necesarias para proteger sus propias ideas y contribuciones. Dicho esto, el reciente anuncio de Meta de que planean hacer de código abierto su último modelo de inteligencia artificial es ciertamente un desarrollo interesante en este espacio.

Además de comprender las implicaciones legales y éticas, también es importante darse cuenta de que un aumento en la cantidad de código no implica necesariamente calidad; de hecho, podría argumentarse que veremos mucho código inadecuado donde los primeros modelos de inteligencia artificial han sido excesivamente utilizados. Los desarrolladores de software deben practicar la precaución al usar herramientas de asistencia de código Gen AI y aplicar el mismo nivel de atención y cuidado al código generado como lo hacen al código que escriben.

En Codurance somos prudentemente optimistas ante el potencial de la IA en el desarrollo de software. Nos entusiasman las posibilidades que la IA podría abrir y las mejoras de productividad que podría aportar a la forma de desarrollar software en el futuro. Pero, al mismo tiempo, somos conscientes de las implicaciones éticas, legales y de seguridad.

New call-to-action