El papel de la IA en el desarrollo de software
Un análisis de las herramientas de IA en programación y sus limitaciones.
― 9 minilectura
Tabla de contenidos
- ¿Qué Son las Herramientas de Compleción de Código de IA?
- Rendimiento de las Herramientas de IA
- ¿Qué Son los Modismos de Programación y las Mejores Prácticas?
- Explorando las Sugerencias de Copilot
- Entendiendo las Limitaciones
- La Necesidad de Mejoras
- Posibles Direcciones Futuras
- Conclusión
- Fuente original
- Enlaces de referencia
Las herramientas de IA para programación, como GitHub Copilot y otras, se han vuelto importantes en los últimos años. Ayudan a los desarrolladores de software proporcionando sugerencias de código según lo que están escribiendo. Estas herramientas pueden incluso desempeñarse mejor que muchos humanos cuando se trata de desafíos de codificación. Sin embargo, la ingeniería de software implica más que solo escribir código; se trata de entender problemas, seguir buenas prácticas y diseñar software de manera efectiva.
Este artículo explora cómo funcionan actualmente las herramientas de IA, dónde sobresalen y cuáles son sus limitaciones. Veremos cómo herramientas como Copilot sugieren código, cómo se desempeñan con diferentes lenguajes de programación y los desafíos que enfrentan a medida que la creación de software se vuelve más compleja.
¿Qué Son las Herramientas de Compleción de Código de IA?
Las herramientas de completado de código están diseñadas para ayudar a los desarrolladores prediciendo lo que podrían querer escribir a continuación. Estas herramientas pueden proporcionar sugerencias para nombres de variables, métodos o incluso bloques completos de código. Utilizan grandes modelos de lenguaje que están entrenados con una cantidad enorme de código fuente para generar sugerencias relevantes.
GitHub Copilot es una de las herramientas más populares en este campo. Aprovecha un modelo de lenguaje neuronal creado por OpenAI. Este modelo está entrenado para entender el contexto del código que se está escribiendo y puede sugerir código que se ajuste a ese contexto. Por ejemplo, si un desarrollador empieza a escribir una función, Copilot puede sugerir el resto de la función basado en sus Datos de Entrenamiento.
Rendimiento de las Herramientas de IA
Mientras que herramientas de IA como Copilot pueden predecir lo que un desarrollador quiere escribir de manera efectiva, no siempre proporcionan las mejores o más adecuadas soluciones. A veces, sugieren código que no sigue las Mejores Prácticas o los modismos de programación comunes, lo que puede llevar a problemas conocidos como "malos olores de código".
Los malos olores de código son indicadores de problemas potenciales en el código. No son errores, pero pueden sugerir debilidades o áreas que podrían mejorarse para una mejor mantenibilidad, legibilidad y rendimiento.
Por ejemplo, si Copilot sugiere una forma de ordenar una lista que implica pasos innecesarios o que podría hacerse de manera más eficiente, eso sería visto como una falla al no proporcionar una sugerencia de alta calidad.
¿Qué Son los Modismos de Programación y las Mejores Prácticas?
Los modismos de programación son formas establecidas de resolver problemas comunes en el desarrollo de software. Representan los métodos más conocidos que los desarrolladores experimentados utilizan para escribir código limpio, eficiente y legible. Algunos modismos son específicos de lenguajes de programación, mientras que otros son más generales.
Las mejores prácticas son directrices que ayudan a los desarrolladores a escribir código que sea mantenible, seguro y eficiente. Cubren una variedad de temas, como cómo estructurar el código, cómo manejar errores y cómo optimizar el rendimiento.
Por ejemplo, en Python, usar comprensiones de listas es una forma más idiomática de crear una lista basada en otra lista en comparación con usar un bucle for. Si una herramienta no sugiere el enfoque idiomático, puede que no ayude al desarrollador a escribir el mejor código posible.
Explorando las Sugerencias de Copilot
Para evaluar qué tan bien se desempeña Copilot, podemos ver cómo maneja Python y JavaScript. Nos enfocaremos en qué tan bien sigue los modismos de programación y evita los malos olores de código en sus sugerencias de código para estos dos lenguajes.
Rendimiento en Python
En las pruebas, se encontró que Copilot sugirió el enfoque idiomático solo el 8% de las veces para los modismos de Python que examinamos. Esto indica que tiene dificultades para presentar las formas más comunes y aceptadas de hacer las cosas en Python. De hecho, 15 de los 25 modismos probados no aparecieron en las mejores sugerencias.
Por ejemplo, al probar el modismo para la comprensión de listas, Copilot sugirió un bucle for en su lugar. Este es un enfoque menos eficiente que la forma más concisa de usar comprensiones de listas. Aunque podría funcionar, no es el método preferido en Python.
Copilot se desempeñó mejor con ciertos modismos que ocurren más frecuentemente en los datos de entrenamiento. Por ejemplo, cuando la solución idiomática está entre los fragmentos más comúnmente utilizados, Copilot es más probable que la proporcione.
Rendimiento en JavaScript
Cuando se probó contra las mejores prácticas de JavaScript de una guía de estilo de codificación conocida, Copilot nuevamente se quedó corto. Solo recomendó la mejor práctica sugerida en la guía en 3 de 25 casos. Esto refleja una incapacidad significativa para sugerir enfoques que se alineen con los estándares de codificación establecidos.
Por ejemplo, cuando se le preguntó cómo copiar el contenido de un array, Copilot sugirió un método ineficiente que implicaba un bucle para iterar a través de cada elemento. La forma recomendada, que utiliza el operador de propagación, es mucho más rápida y limpia. Esta brecha muestra que aunque Copilot puede proporcionar sintaxis correcta, a menudo pierde la oportunidad de sugerir mejores prácticas.
Entendiendo las Limitaciones
Las herramientas de IA sobresalen en generar código que compila y se ejecuta correctamente, pero tienen dificultades con conceptos de nivel superior como calidad del código, Patrones de Diseño y mejores prácticas. La complejidad del desarrollo de software requiere una comprensión más profunda que solo la sintaxis.
A medida que los desarrolladores trabajan en proyectos más complejos, necesitan herramientas que puedan ayudarlos con decisiones arquitectónicas así como con fragmentos individuales de código. Copilot, hasta ahora, no maneja estas preocupaciones de nivel superior de manera efectiva.
Desafíos para Sugerir Código de Calidad
Un desafío significativo para Copilot es su conjunto de datos de entrenamiento. Muchas herramientas de IA aprenden de repositorios de código existentes, los cuales pueden no seguir siempre las mejores prácticas. Esto resulta en sugerencias que reflejan la calidad de los datos de entrenamiento en lugar de la calidad de las convenciones de codificación.
Además, como Copilot es de código cerrado, no hay forma de ver cómo fue entrenado o verificar la presencia de modismos o prácticas específicas en sus materiales de entrenamiento. Esto limita nuestra capacidad de entender por qué se hacen ciertas sugerencias y cómo se pueden mejorar.
Necesidad de Contexto de Múltiples Archivos
Otra limitación es la falta de capacidad para considerar el contexto más amplio de un proyecto. Actualmente, Copilot analiza archivos individuales o bloques de código, pero no puede ver cómo encajan en el sistema más grande. Esto significa que no puede sugerir patrones de diseño que puedan requerir la entrada de múltiples archivos.
Por ejemplo, en una arquitectura típica Modelo-Vista-Controlador (MVC), el Modelo no debería comunicarse directamente con la Vista. Sin embargo, sin entender la configuración general del proyecto, Copilot podría sugerir código que viola este principio.
La Necesidad de Mejoras
Para apoyar tareas de diseño de software más complejas, las herramientas de IA necesitan ir más allá de simples sugerencias de código. Deben entender la arquitectura de software y ser capaces de proporcionar sugerencias relevantes basadas en la estructura general del proyecto.
Reuniendo Mejores Datos de Entrenamiento
Una forma de mejorar las herramientas de IA es enfocándose en recopilar datos de entrenamiento de alta calidad. Esto podría implicar excluir código mal escrito de los conjuntos de datos o priorizar repositorios que sigan las mejores prácticas. Tener una base sólida de buenos ejemplos ayudará a la IA a producir mejores sugerencias.
Además, introducir fuentes verificadas, como documentación de codificación o pautas de renombre, también podría mejorar la calidad de las sugerencias al asegurarse de que se alineen con las mejores prácticas aceptadas.
Colaboración con Otras Herramientas
Las herramientas de IA también podrían trabajar junto a soluciones de análisis de código existentes que identifiquen malos olores de código o sugieran mejoras. Al integrar estas herramientas, la IA podría ofrecer a los usuarios sugerencias que no solo compilen, sino que también cumplan con los estándares de calidad.
Por ejemplo, combinar Copilot con herramientas como SonarQube podría significar que las sugerencias se filtren por calidad antes de presentarse al desarrollador, lo que podría llevar a mejores resultados de codificación.
Posibles Direcciones Futuras
El futuro de la programación asistida por IA podría llevar a una codificación más accesible para todos, incluidos aquellos que son nuevos en la programación. Estas herramientas podrían proporcionar sugerencias que fomenten buenos hábitos de codificación y ayuden a los desarrolladores a crecer en sus habilidades.
Sin embargo, también hay que tener precaución. A medida que estos modelos mejoren, podrían reforzar inadvertidamente malos hábitos si no se entrenan adecuadamente. El sesgo de automatización, donde los desarrolladores confían ciegamente en las sugerencias de una IA, podría llevar a software que no cumple con los estándares de calidad.
También hay posibilidades de que estos modelos evolucionen de generar simples fragmentos de código a ofrecer ideas sobre arquitecturas de software más complejas. Podrían un día sugerir patrones de diseño y mejores prácticas basadas en las necesidades específicas de un proyecto, mejorando el proceso general de desarrollo de software.
Conclusión
Las herramientas de IA como GitHub Copilot están dando pasos para apoyar el desarrollo de software al hacer sugerencias de código. Sin embargo, hay limitaciones significativas en su estado actual, particularmente en lo que respecta a la calidad del código, las mejores prácticas y la comprensión de estructuras de proyectos complejas.
A medida que estas herramientas continúan evolucionando, hay una clara necesidad de que mejoren sus metodologías de entrenamiento, proporcionen mejores sugerencias y se adapten a las complejidades del diseño de software. El objetivo es apoyar a los desarrolladores en la creación de software de alta calidad mientras se minimiza el riesgo de malas prácticas de codificación.
Título: From Copilot to Pilot: Towards AI Supported Software Development
Resumen: AI-supported programming has arrived, as shown by the introduction and successes of large language models for code, such as Copilot/Codex (Github/OpenAI) and AlphaCode (DeepMind). Above human average performance on programming challenges is now possible. However, software engineering is much more than solving programming contests. Moving beyond code completion to AI-supported software engineering will require an AI system that can, among other things, understand how to avoid code smells, to follow language idioms, and eventually (maybe!) propose rational software designs. In this study, we explore the current limitations of AI-supported code completion tools like Copilot and offer a simple taxonomy for understanding the classification of AI-supported code completion tools in this space. We first perform an exploratory study on Copilot's code suggestions for language idioms and code smells. Copilot does not follow language idioms and avoid code smells in most of our test scenarios. We then conduct additional investigation to determine the current boundaries of AI-supported code completion tools like Copilot by introducing a taxonomy of software abstraction hierarchies where 'basic programming functionality' such as code compilation and syntax checking is at the least abstract level, software architecture analysis and design are at the most abstract level. We conclude by providing a discussion on challenges for future development of AI-supported code completion tools to reach the design level of abstraction in our taxonomy.
Autores: Rohith Pudari, Neil A. Ernst
Última actualización: 2023-03-07 00:00:00
Idioma: English
Fuente URL: https://arxiv.org/abs/2303.04142
Fuente PDF: https://arxiv.org/pdf/2303.04142
Licencia: https://creativecommons.org/licenses/by/4.0/
Cambios: Este resumen se ha elaborado con la ayuda de AI y puede contener imprecisiones. Para obtener información precisa, consulte los documentos originales enlazados aquí.
Gracias a arxiv por el uso de su interoperabilidad de acceso abierto.