Como resumen rápido:
Conceptualmente, es posible. Y, se ha hecho antes. Sin embargo, en la práctica, es engorroso el estado del arte en un “programa” que genera otro programa que todavía no es lo suficientemente bueno como para ser utilizado (por lo que sé).
Las empresas generalmente confían en contratar buenas personas con una amplia experiencia junto con buenos conocimientos fundamentales de informática para crear su programa de la mejor manera posible. Estas personas conocen una solución suficientemente buena frente a una mala solución. Los informáticos perfeccionistas verdaderamente inteligentes tienden a atascarse en un modo en el que ninguna solución es perfecta y, por lo tanto, hacen girar sus ruedas y nunca crean ningún producto entregable (o es tan complicado que es imposible implementarlo correctamente). Esto todavía parece ser el estado del arte.
Problemas clave:
1. especificando completamente y rigurosamente los requisitos de su programa
2. Vinculando diferentes marcos, quizás con diferentes lenguajes de desarrollo y API
3. Mantenimiento y depuración del software generado.
- ¿Perderán los programadores sus trabajos debido a la inteligencia artificial como DeepCoder?
- ¿Podrían los robots crear más trabajos de los que destruyen?
- ¿Qué son los conjuntos de datos en el aprendizaje automático y cómo funcionan?
- ¿Qué tan inteligente es la IA ahora (octubre de 2014)?
- ¿Pueden las máquinas enseñar a otras máquinas?
Cuenta anecdótica Longish / Descripción:
Un programa podría ayudar a un programador a elegir una buena manera de implementar un programa dados los requisitos. Sin embargo, no puedo pensar en un buen plan de negocios para tal programa:
1. Se crean constantemente nuevas arquitecturas y marcos. Algunos pueden no ser conocidos hasta que sean populares. Este programa para sugerir métodos de implementación quedará obsoleto o tendrá un uso limitado rápidamente. (Ejemplo: el lenguaje de programación Ruby no fue ampliamente conocido fuera de Japón durante mucho tiempo hasta que Ruby-on-rails despegó, creo)
2. Si el programa le sugiriera usar una tecnología con la que no está familiarizado, ¿la usaría? En una empresa, trabaja lo más posible con las mismas herramientas y conocimientos hasta que se espera una gran ganancia para volver a capacitar a todos en la nueva tecnología y adquirir las herramientas de desarrollo necesarias para ello. Es decir: si conozco Java pero no C, es improbable que use C para crear mi programa. Una pelea más común:
¿Cuál es el mejor servidor web para usar? ¿Cuál es el mejor editor para usar? Las guerras santas estallan sobre Apache e iis. Sobre vim y emacs. (O, mac vs pc). De hecho, si el programa sugirió alguna tecnología con la que no está familiarizado o no se siente cómodo, es probable que la rechace de todos modos.
3. Si conocía la tecnología que sugería el programa, probablemente no necesitaba el programa para comenzar.
Por lo tanto, una persona con un título en informática con buena comprensión fundamental sigue siendo el mejor “optimizador” en términos de creación de un programa.
Entonces, si un programa que sugiere la mejor manera de implementar, o un marco para usar, aún requiere que sepas cómo usarlo, cambiemos la discusión a algo un poco más útil. Un programa que puede generar la solución de programa que necesita dados los requisitos.
Como dijo Simon, fue un tema muy candente en los noventa. Se hizo un gran esfuerzo para generar un programa sin necesidad de conocer los detalles esenciales de la programación y / o detalles de hardware. Una gran ventaja sería que los expertos en el dominio (médicos, economistas, gerentes de negocios) podrían especificar sus requisitos y hacer que la computadora genere el programa apropiado para hacer el trabajo sin que necesiten saber cómo programar. ¡¡Eso habria sido genial!! No necesitaría que alguien desvíe su atención de su materia y aprenda a programar, por lo tanto, un grupo de dos oficios pero un maestro de ninguno.
Un gran problema: ¿cómo especifica rigurosamente sus requisitos para que una computadora pueda procesarlo y generar el programa? Una forma perseguida fue el UML. Pasas mucho tiempo especificando exhaustivamente los casos de uso y los requisitos utilizando el lenguaje de modelado unificado definido y tienes esencialmente un documento de requisitos que se puede analizar y potencialmente generar un programa. Las especificaciones UML más nuevas y las técnicas de modelado adicionales surgieron para hacer frente a requisitos que no estaban bien definidos. Como el lenguaje de restricción de objetos que cumple un rol que UML no tenía anteriormente. En concepto, parece factible y tal vez la gente todavía está trabajando en ello. En realidad, era engorroso y lento. A menudo pasaba mucho tiempo tratando de descubrir cómo enmarcar los requisitos en el lenguaje de modelado de manera concisa y correcta. En algunos casos recuerdo no saber cómo hacerlo. O no conocía los métodos de modelado tan bien como era necesario, o no había forma en el lenguaje de modelado para expresar lo que necesitaba.
Segundo gran problema: se necesitaba un programa para analizar UML y generar el programa. Uno de esos programas fue la rosa racional en tiempo real. Esencialmente se tomó la abstracción que era el modelo UML e intentó completar todo el código de la placa de la caldera. El “programador” rellenó un poco de código de lógica de negocios (por ejemplo, partes de los diagramas de transición de estado anteriores, principales y posteriores) y hay un “programa” que hace el trabajo que especificó. “Funcionó” y conceptualmente es posible. Cuando lo probé en los años 90, era muy restrictivo y no admitía todas las diferentes especificaciones de modelado. Y cuando no completó el código de lógica de negocios de la manera que esperaba el software, arrojaría montones de locos errores de compilación de C ++. Si fuera más inteligente, probablemente podría haber descubierto por qué se arrojaron esos errores. Me di por vencido y reescribí el código de lógica de negocios que causaba errores de diferentes maneras hasta que se detuvieron. Mi productividad se gastó en la lucha libre con la herramienta. Finalmente, el código de placa de caldera que el software estaba poniendo es probablemente ineficiente y demasiado general para soportar las construcciones soportadas por el UML. Era obvio que se estaba haciendo en C ++ y los errores arrojados parecían bastante complicados. Estaba creando una máquina de estados con menos de 10 estados. Podría haber hecho esto en unas pocas horas en C (siendo generoso con la estimación). Me tomó unos días hacerlo con Rational Rose Realtime. Probablemente, la actuación hubiera sido horrible. Cuando trabajaba en Nortel, recuerdo algo que dijo uno de los supervisores (el trabajo consistía en optimizar a mano el código generado por el compilador): los compiladores hacen un buen trabajo, pero nada nos supera. Hasta cierto punto, todavía estoy de acuerdo. (Con todas las nuevas superescaladoras, arquitecturas fuera de servicio, etc., está comenzando a ser una trampa para la optimización humana. Sin embargo, ese es un tema completamente diferente)
Tercer gran problema: supongamos que tiene un programa generado casi perfecto que satisface sus necesidades. Excepto que hay un error en él. A veces, la respuesta es 1, pero debería haber sido 0. Usted ha demostrado minuciosamente que, dadas las entradas, la respuesta debería ser 0. ¿Cómo depuraría este programa que se generó? ¿Es un error con la generación de código? ¿O los marcos que utilizó? ¿Qué pasa si solo bajo ciertas circunstancias, hay un problema de rendimiento? Devuelve la respuesta correcta, pero lentamente, más allá del tiempo en que la respuesta es útil (es decir, comercio de acciones). Si todo lo que sabía era el idioma de los requisitos que especificaba el idioma, no tiene ninguna esperanza de descubrirlo.
Desde que Rational fue vendido a IBM, no he escuchado muchas noticias sobre ellos. Tampoco he escuchado mucho sobre la “pandilla de 4”. No es que Rational haya sido descontinuado, pero no he oído que nadie lo use en realidad más que un lenguaje de especificación de requisitos. Y en la industria, no he oído que nadie lo use más allá de los proyectos de investigación.
Para ver esto de otra manera, desea especificar un programa en un método de lenguaje más natural que sea accesible para más personas con menos capacitación relacionada con la computadora. Está muy relacionado con los compiladores y la generación de código. No he escuchado mucho sobre esto, y si algo mejor desde la última vez que lo experimenté está disponible, no es convencional.
La promesa de tal cosa sigue siendo sorprendente. ¿Podría ser usted el que desarrolle y pruebe una solución viable y convencional?
¡¡¡Buena suerte!!! ¡Serás rico y bien recompensado! ¡Lo siguiente más importante desde la Web 1.0!