¿Cuáles son los principales desafíos de la ingeniería de software automatizada?

  • Capturando requisitos informales
  • Codificación de requisitos capturados en una notación formal para ser procesados ​​por una máquina
  • Traducción de los requisitos al código en ejecución

La gente ha estado trabajando en lo anterior durante los últimos 50 años. Mucho trabajo interesante, algunos éxitos estrechos pero espectaculares. Nada que se parezca al equivalente de Turing de un “programador automático”.

En un frente más práctico, construyo herramientas que me gustaría pensar como la automatización de varias tareas de ingeniería de software (vea la biografía sobre nuestro DMS Software Reengineering Toolkit). Los problemas que enfrentamos:

  • Desarrollo de interfaces de lenguaje (lexing, análisis, tablas de símbolos, control y análisis de flujo de datos). El procesamiento de idiomas de computadora reales requiere estos, y las definiciones de lenguaje se están volviendo grandes y canosas (consulte C ++ 14, Java 8, …). Cada uno de estos requiere importantes inversiones de ingeniería (léase “ingeniero hombre-años plural”).
  • Los preprocesadores C y C ++ (y varias herramientas de modificación de código fuente similares que se encuentran con otros lenguajes; considere Make y sus macros y condicionales). Procesar el código fuente que contiene estos es actualmente muy difícil, ya que las directivas del preprocesador esencialmente destruyen la estructura que el analizador de lenguaje quiere encontrar. Puede expandir las directivas fuera de existencia, pero luego sus herramientas no están tratando el código fuente como lo ve el * usuario *. (Creemos que tenemos un control sobre esto, aún no está disponible comercialmente).
  • Escala. Las personas dispuestas a comprar herramientas no lo hacen para programas de 1000 líneas. Entonces, la base de clientes son personas con un millón de líneas de código. Bien, ahora léalos todos a la vez y descubra cómo están relacionados. Para complicar esto, el hecho de que millones de sistemas de líneas se codifican habitualmente en varios idiomas (un lenguaje de procedimiento principal, algunos lenguajes de scripting, descripciones de pantallas y bases de datos, idiomas web, …). (Nuestro motor puede manejar múltiples idiomas al mismo tiempo)
  • Costos computacionales. ¿Cuánto tiempo le tomará a su herramienta procesar un millón de líneas de código para producir incluso respuestas simples? (Nuestro motor está construido en un lenguaje de programación en paralelo para ayudar aquí).
  • Formas de expresar lo que quiere que haga la herramienta automatizada, y medios confiables para hacerlo. (¿Hacer preguntas sobre el código? ¿Cambiar el código? ¿Reorganizar el código?). (Podemos plantear transformaciones locales, hacer coincidir modismos de código mediante coincidencias de flujo de datos … pero aún es difícil escribir esto).

En cuanto a capturar requisitos informales en un documento formal … ni siquiera lo intentamos.