El Software Engineering Institute de la Universidad Carnegie Mellon, una referencia en el campo de la Ingeniería de Software, acaba de publicar el documento: “Architecting the Future of Software Engineering: A National Agenda for Software Engineering Research & Development” donde proponen una hoja de ruta para el futuro de la Ingeniería de Software. El documento cubre tanto las áreas de investigación relevantes como las tecnologías y arquitecturas emergentes más prometedoras (para los próximos 10-15 años) en cada una de esas áreas. Y da tambén su visión sobre como será desarrollar software en el futuro, y más importante aún para muchos de vosotros, como será aprender a ser Ingeniero Software en ese futuro y cómo será vuestro trabajo. En este punto, coincide bastante con las tesis de Kai-Fu Lee.

Más que programar, la función del ingeniero software del futuro será definir que es lo que el software debería (y no debería) hacer y dejar que la IA se encargue de la generación del código (como mínimo toda la parte más repetitiva) Click To Tweet

Más que un documento es un libro entero (150 páginas) resultado de un trabajo intenso en colaboración con representantes de varios sectores industriales (defensa, aeroespacial, finanzas,…). Vale la pena ojear el libro, pero os pongo aquí un pequeño resumen de las áreas que ellos ven como el futuro de la ingeniería de software y mi resumen de lo que comentan de cada una de ellas:

  • Desarrollo de software con la ayuda de la IA. En cada etapa del proceso de desarrollo tenemos ejemplos de como la Inteligencia Artificial promete asistir a los desarrolladores humanos, liberándolos de las tareas más repetitivas y permitiendo que se focalizen en las partes más creativas del proceso. Para optimizar este tipo de colaboración persano-AI necesitamos repensar nuestros procesos de dearrollo (por ejemplo, teniendo en cuenta explícitamente los datos que nos permitan optimizar los consejos de los componentes IA).
  • Evolución continua de los sistemas. Los sistemas software de hoy en día no son estáticos, son “fluídos”. Es dcir, tenemos que prever que tendrán que evolucionar y actualizarse continuamente durante su vida útil. Necesitamos avances teóricos y prácticos que nos permitan asegurar esta evolución contínua de una manera eficiente.
  • Construcción de software por composición. La complejidad del software actual hace irrealizable que un sólo equipo pueda desarrollar el sistema completo. El problema de integrar componentes no es nuevo pero crece en complejidad ya que muchas veces los componentes a integrar no estaban ni pensados / diseñados para su integración futura ni para la co-evolución conjunta con el resto del sistema. Necesitamos herramientas, métodos y lenguajes para especificar y verificar reglas de composición que nos permitan expresar el comportamiento global que queremos y la calidad esperada de la composición.
  • Sistemas socio-técnicos. Muchos sistemas tienen (y buscan) influenciar y hasta “atrapar” a los usuarios. Pensad como ejemplo en todo el software detrás de las redes sociales. Hay que desarrollar técnicas que permitan evaluar (y limitar) esta influencia y los posibles sesgos que introducen. La idea es definir una nueva serie de atributos de calidad con visión social que permita evaluar estos tipos de sistemas aprendiendo de la gente experta en ciencias sociales.
  • Sistemas software inteligentes. Estos sistemas incluyen tanto componentes software “tradicionales” como componentes software “inteligentes”. No sabemos todavía muy bien cuáles son las mejores prácticas de ingeniería para desarrolar estos componentes inteligentes y aún menos como conseguir una colaboración óptima entre estos y los más tradicionales. De hecho éste es justamente el objetivo de nuestro proyecto LOCOSS (low-code development of smart software)
  • Ingeniería de sistemas quánticos. Avanzar en técnicas de ingeniería de software para sistemas cuánticos es tan importante como los avances en el hardware de esos mismas sistemas. El objetivo es sobretodo ser capaz de programarlas más fácilmente, mejorando el nivel de abstracción con el que podemos especificar y verificar los programas cuánticos. El objetivo final es llegar poder desarrollar programas cuánticos con metodologías y ténicas parecidas a las que hoy usamos para el desarrollo de sistemas “normales”.