8 votes

 

La Inteligencia Artificial (IA) es la rama de las ciencias de la computación que se enfoca en brindar a las máquinas o computadoras la capacidad de resolver problemas de manera tan inteligente como los humanos y, en algunos casos, mejor que los humanos, aprendiendo de una gran cantidad de datos. Si bien es cierto que aún estamos lejos de lograr una inteligencia artificial tan capaz como los seres humanos, en estos últimos años la IA se ha desarrollado de manera progresiva debido a los grandes avances en la capacidad de procesamiento de datos de los computadores, a las últimas investigaciones realizadas, el avance de la tecnología, y la gran cantidad de datos que actualmente se generan en la internet. Además, se han empezado a utilizar diversas técnicas de IA, como el aprendizaje automático y el procesamiento de lenguaje natural, en una amplia variedad de áreas, como salud, banca, educación, agronomía, y un largo etcétera. El área de desarrollo de software tampoco ha sido la excepción. La Ingeniería de Software  es una de las ramas de las ciencias de la computación que se refiere a la aplicación disciplinada de principios y métodos matemáticos, científicos y de ingeniería para la producción de software confiable y de calidad1. Este proceso está en constante optimización, aprovechando las últimas herramientas tecnológicas del mercado, como la IA, utilizada en diversas empresas emergentes que se han lanzado de acuerdo con un reporte de Deloitte2. Este informe menciona además que estas empresas recaudaron 704 millones de dólares durante el 2020, y se prevé que el empleo de los desarrolladores de software crezca un 21 por ciento entre 2018 y 2028, mucho más rápido que el promedio de todas las ocupaciones.

El proceso de desarrollar software se compone de diversas fases, que pueden variar dependiendo de la metodología que se utilice. Las más comunes son: Análisis y Diseño, donde se realiza el levantamiento y análisis de los requerimientos del software, es decir, de cómo va a funcionar, que debe poder hacer, etc. La Codificación, que es donde los programadores desarrollan el software tomando como base las fases anteriores, y finalmente las Pruebas, que es donde se evalúa que el software cumpla con lo solicitado. A continuación, les mostramos algunas aplicaciones de la IA en cada una de estas fases.

  1. Análisis y Diseño

En esta fase se realiza la identificación y el análisis de requerimientos del software, además de plantear un primer diseño de la solución. Las reuniones con los usuarios, la documentación y priorización de los requerimientos son tareas que se realizan a lo largo de esta fase. En las reuniones se discuten diversas funcionalidades y los analistas deben registrar las necesidades de los usuarios, para luego convertirlos en requerimientos de software. Sin embargo, a veces es difícil documentar e identificar todo lo tratado en la reunión, pero para estos casos, el proceso de transcripción de audio a texto (Figura 1), uno de los campos del procesamiento de lenguaje natural, puede ser útil para documentar todos los puntos tratados y obtener información más precisa7.

Figura 1

La priorización de requerimientos, una tarea donde a veces es difícil llegar a un consenso entre los usuarios, o conseguir disponibilidad de estos para realizarla, es otro campo donde se aplican las últimas técnicas de IA8. Técnicas como Prigov, basados en técnicas de clustering (aprendizaje automático), son utilizados para lograr una priorización preliminar y así ayudar a los usuarios a confirmar la priorización final. Finalmente, podemos obtener posibles requerimientos de diversas fuentes, una de ellas es el feedback de usuarios con respecto a una nueva aplicación (app), como los comentarios (reviews) en las app stores. Debido a que los comentarios son demasiados para leerlos por una persona, se puede recurrir a algoritmos de aprendizaje automático supervisado que ayudarían a leer e identificar, de manera automática, información relevante de los comentarios que luego puedan servir como futuros requerimientos. En la Figura 2 se puede observar un ejemplo, donde se ha identificado en un comentario tres clasificaciones: el primer texto es un cumplido, el segundo es una nueva posible funcionalidad, y finalmente están reportando un error del aplicativo. Algoritmos como Naive Bayes y Support Vector Machine son utilizados para entrenar modelos en base a información histórica3.

Figura 2

Otro aspecto que puede mejorar es el prototipado. Los prototipos son ampliamente utilizados al momento de diseñar soluciones para poder mostrar al usuario una versión simplificada de cómo quedará un sitio web o una aplicación. Para estos casos las últimas técnicas de IA que permiten convertir texto a imágenes o videos, como Stable Diffusion o DALL-E 2, ayudarán a poder visualizar los prototipos con mínimo esfuerzo y un mayor realismo.

  1. Codificación

Una de las principales mejoras que se han aplicado en esta fase es el autocompletado de código. El autocompletado da posibles opciones cuando un desarrollador está escribiendo código, como por ejemplo nombres de variables, sugerencias de sentencias, etc. Un ejemplo se tiene en StackOverFlow4, y otras herramientas como Kite y Codota enfocándose en Python y Java respectivamente. También existe Bayou, que fue entrenado con miles de programas en Java para reconocer patrones utilizando redes neuronales (otra clasificación dentro del aprendizaje automático), para mejorar la velocidad y eficiencia en la codificación. Además del autocompletado, OpenIA está trabajando en la generación de código en base a una descripción de este. Es decir, bastaría solo con escribir ‘Revisar si la palabra es palíndrome’ y automáticamente se generaría el código en un lenguaje de programación (Python en este caso)5. El año pasado se presentó AlphaCode de la empresa DeepMind, el cual genera código a un nivel de competición, es decir, resolviendo problemas específicos que requieren creatividad, conocimientos y rapidez y que usualmente son planteados en competencias internacionales de programación. AlphaCode resuelve problemas generando millones de programas utilizando modelos basados en Transformers (arquitectura basada en redes neuronales para la creación de modelos), entrenados en grandes cantidades de programas y luego seleccionando los mejores resultados10. La predicción de errores en el código también se ha incrementado con el uso de IA. Debido a la gran cantidad de códigos que pueden encontrarse en diversos repositorios, como GitHub, es posible utilizar esta información para el entrenamiento de diversos algoritmos para la predicción de errores9.

  1. Pruebas

La fase de Pruebas es una de las más beneficiadas con el uso de las técnicas de IA6. Se ha logrado automatizar diversas actividades de esta fase, siendo una de ellas la generación de los casos de prueba y sus datos. Estos casos de prueba se generan en base a los requerimientos y se usan para validar si una aplicación/software/programa es aceptable. El avance de las técnicas del procesamiento de lenguaje natural en el entendimiento y la generación de texto están ayudando a poder generar casos de prueba automáticos de manera más eficiente11. La generación de datos para las pruebas y la generación de reportes también utilizan este tipo de técnicas para su automatización. La IA también influye en otras pruebas, como en las pruebas de usabilidad. Estas pruebas no son tan frecuentes pero su importancia está incrementándose cada vez más, debido a que los usuarios se fijan cada vez más en la facilidad de uso y estética de una aplicación y actualmente puede ser una ventaja competitiva en la industria. Identificar errores de usabilidad a través de la identificación de patrones analizando la interacción de los usuarios con el aplicativo, o el uso de visión artificial para comprobar el estado de cada pantalla por cada evento, son algunos ejemplos usados en este tipo de pruebas. Herramientas como Appvance y Testim.io son ejemplos de cómo se usa la inteligencia artificial en la fase de pruebas.

Hay muchas otras aplicaciones que se pueden encontrar en otras fases de la ingeniería de software, para mejorar la planificación y las estimaciones en la gestión de proyectos, la automatización y control del despliegue de las aplicaciones y en el mantenimiento, en la seguridad de los datos. Como hemos visto, diversas soluciones basadas en inteligencia artificial ya son utilizadas para mejorar el proceso de desarrollo de software, y se prevé que otras tecnologías de IA, como blockchain o computación quántica, contribuyan también a este proceso en un futuro próximo. Los beneficios de la IA, en esta área y en otras, tienen y tendrán un fuerte impacto en los próximos años.

María Isabel Limaylla, Estudiante del Doctorado en Computación Universidad de la Coruña, España

 

 

 

 

 

 

 

Referencias

  1. Humphrey, W. S. (1988, April). The software engineering process: definition and scope. In Proceedings of the 4th international software process workshop on Representing and enacting the software process (pp. 82-83).
  2. deloitte.com/us/en/insights/focus/signals-for-strategists/ai-assisted-software-development.html.
  3. Shah, F. A. (2020). Extracting information from app reviews to facilitate software development activities(Doctoral dissertation, Tartu University).
  4. https://emilschutte.com/stackoverflow-autocomplete/
  5. https://www.youtube.com/watch?v=fZSFNUT6iY8
  6. Hourani, H., Hammad, A., & Lafi, M. (2019, April). The impact of artificial intelligence on software testing. In 2019 IEEE Jordan International Joint Conference on Electrical Engineering and Information Technology (JEEIT)(pp. 565-570).
  7. Vickers, W., Reddivari, S., & Reddivari, K. (2022, August). Evaluating Audio-to-Text utilizing Dragon in the Context of Just-in-Time Requirements. In 2022 IEEE 23rd International Conference on Information Reuse and Integration for Data Science (IRI)(pp. 124-125).
  8. Qayyum, S., & Qureshi, A. (2018). A survey on machine learning based requirement prioritization techniques. ACM International Conference Proceeding Series, 51–55. https://doi.org/10.1145/3293475.3293480
  9. Hammouri, A., Hammad, M., Alnabhan, M., & Alsarayrah, F. (2018). Software bug prediction using machine learning approach. International Journal of Advanced Computer Science and Applications9(2), 78-83.
  10. Li, Y., Choi, D., Chung, J., Kushman, N., Schrittwieser, J., Leblond, R., … & Vinyals, O. (2022). Competition-level code generation with alphacode. Science378(6624), 1092-1097.
  11. Gröpler, R., Sudhi, V., García, E. J. C., & Bergmann, A. (2021). NLP-Based Requirements Formalization for Automatic Test Case Generation. In CS&P(Vol. 21, pp. 18-30).