Mi experiencia es en ingeniería mecánica, así que perdone mi ignorancia en esta área.
Realmente disfruto la programación y el desarrollo de software. Además, recientemente tomé una clase gratuita en línea de Machine Learning (ML), que recomiendo encarecidamente, impartida por el profesor de Stanford Andrew Ng. Enlace aquí .
He escuchado a este profesor decir que es difícil encontrar áreas en las que el ML nunca afecte.
Pregunta
Entonces mi pregunta es, ¿qué investigación se ha realizado hasta ahora en la aplicación del aprendizaje automático al desarrollo de código? ¿Qué hay de la depuración?
Incluya recursos / fuentes / documentos científicos si es posible.
No he tenido suerte buscando esto porque a menudo buscar ML y el desarrollo (o programación) de software termina dando lugar a resultados en el desarrollo (o programación) de aplicaciones ML.
Respuestas:
Fuzzing es un método de prueba donde el aprendizaje automático puede y ha sido aplicado. Fuzzing es un método de prueba en el ámbito de las pruebas exploratorias automatizadas. Intenta encontrar defectos en el software ejecutando una gran cantidad de entradas y buscando errores. Las excepciones no controladas son la categoría más simple, pero una implementación inteligente puede usar ML para encontrar resultados sospechosos. Sin embargo, ML se usa en gran medida en este dominio para hacer que el proceso sea más eficiente. Esto funciona mediante el uso de ML para evitar probar cada entrada posible al entrenar entradas "interesantes". (Entradas no similares que probablemente causen fallas).
fuente
Si. Esta área está de moda en este momento. Se llama "código grande", y DARPA puso $ 40 millones en él: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Se han obtenido algunos resultados impresionantes de esta subvención, como los sistemas Prophet y Genesis de Fan Long, que pueden corregir automáticamente los errores en los programas mediante el uso de un modelo aprendido de parches correctos. Martin Vechev y su alumno Veselin Raychev también han sido pioneros en esta área. Quizás su resultado más impresionante es JSNice ( http://jsnice.org/ ), que puede "minimizar el código JavaScript".
En general, la idea del código grande no ha cumplido su promesa: los datos son demasiado escasos para aprender algo mucho más interesante que los nombres de variables. Si bien todavía estoy financiado en parte por este programa DARPA, mi laboratorio ha dejado de trabajar en él. En esa nota, lo último que escuché sobre DeepCoder es que obtiene resultados bastante patéticos en comparación con el estado del arte en la síntesis de programas.
Las herramientas más exitosas para la programación automatizada aún dependen de métodos que no son de ML como los solucionadores SMT. Eche un vistazo a las actas de cualquier conferencia PL (por ejemplo: PLDI, POPL, OOPSLA) o cualquier conferencia académica de ingeniería de software (por ejemplo: ICSE, FSE, ISSTA, ASE), y verá muchos ejemplos.
fuente
Microsoft ha estado desarrollando DeepCoder para utilizar el aprendizaje profundo para predecir el cuerpo de un método a partir de una entrada y salida dadas. Ese es el único ejemplo que conozco de improviso.
Puedo decirle que la Programación Metagenética es un campo de estudio con una ambición similar, pero no puedo decir que sepa lo suficiente para estar bien informado.
La Programación Genética apareció en las noticias en 2015 cuando muScalpel desarrolló una solución para trasplantar una función de un programa a otro, utilizando las pruebas unitarias para ambos como una especie de conjunto de entrenamiento.
fuente
Una pregunta relacionada es acerca de las técnicas de aprendizaje automático para la generación y compilación de código (ya que se podría imaginar a los transpiladores y compiladores como una forma de "desarrollar código" automáticamente, de hecho escribiendo código, desde algún lenguaje de nivel superior).
Ha habido varios documentos sobre eso, por ejemplo MILEPOST GCC .
También puede buscar documentos sobre técnicas de aprendizaje automático para la depuración o para el análisis de código fuente estático (o cualquier tipo de análisis de programa estático ).
Vea también el blog de J.Pitrat sobre bootstrapping de inteligencia artificial que está relacionado con su pregunta.
fuente
En un artículo reciente en Comunicaciones de la ACM sobre Ganar dinero usando las matemáticas, Erik Meijer citó a Jeff Dean, Miembro Senior de Google, Grupo de Sistemas e Infraestructura:
El artículo ofrece una descripción general de las actividades recientes en el área de investigación. Está detrás de un muro de pago, pero podría valer la pena leerlo si le interesan los paralelos teóricos entre la codificación y el aprendizaje automático / estadísticas. Quizás la lista de referencias al final del artículo también podría ser útil.
Como ejemplo, el artículo hace referencia a WebPPL, programación probabilística para la web .
fuente
Aquí hay un caso de uso sobre el uso del aprendizaje automático para depurar microservicios. Documenté algunos esfuerzos en el análisis de datos de rendimiento de microservicios con aprendizaje automático donde entrené un árbol de decisión a partir de los datos de rendimiento recopilados de las pruebas de carga de un microservicio y luego estudié el árbol que me dio una idea sobre un problema ambiental y me ayudó a diagnosticar y corregir un error de rendimiento.
fuente
Encontré una lista de lectura bastante extensa sobre todos los temas de aprendizaje automático relacionados con la codificación .
Como puede ver, la gente ha estado tratando de aplicar el aprendizaje automático a la codificación, pero siempre en campos muy estrechos, no solo en una máquina que puede manejar todo tipo de codificación o depuración.
El resto de esta respuesta se centra en su máquina de "depuración" de alcance relativamente amplio y por qué esto aún no se ha intentado realmente (hasta donde mi investigación sobre el tema muestra).
Redacté una larga parte de la respuesta. Para resumir (es importante para la siguiente parte): siguiendo la metodología actual de aprendizaje automático, cualquier cosa que un humano pueda aprender, una máquina también puede hacerlo. Solo estamos limitados por el ámbito físico (velocidad de CPU, tamaño de una máquina, ...), no una supuesta aplicabilidad limitada del algoritmo de aprendizaje en sí.
El problema aquí no es que sea imposible, sino que es un tema increíblemente complejo.
Los humanos ni siquiera se han acercado a definir un estándar de codificación universal con el que todos estén de acuerdo. Incluso los principios más ampliamente acordados como SOLID siguen siendo una fuente de discusión sobre cuán profundamente debe implementarse. A todos los efectos prácticos, es imposible adherirse perfectamente a SOLID a menos que no tenga ninguna restricción financiera (o de tiempo); lo cual simplemente no es posible en el sector privado donde ocurre la mayor parte del desarrollo. SOLID es una guía, no un límite estricto.
En ausencia de una medida objetiva de lo correcto y lo incorrecto, ¿cómo vamos a poder dar retroalimentación positiva / negativa a una máquina para que aprenda?
En el mejor de los casos, podemos hacer que muchas personas den su propia opinión a la máquina ("este es un código bueno / malo"), y el resultado de la máquina será una "opinión promedio". Pero eso no es necesariamente lo mismo que una solución correcta . Puede ser, pero no se garantiza que lo sea.
En segundo lugar, para la depuración en particular, es importante reconocer que los desarrolladores específicos son propensos a introducir un tipo específico de error / error. La naturaleza del error puede en algunos casos ser influenciada por el desarrollador que lo introdujo.
Por ejemplo, como a menudo participo en la corrección de errores del código de otros en el trabajo, tengo una especie de expectativa sobre qué tipo de error es propenso a cometer cada desarrollador. Dado un cierto problema, sé que es probable que el desarrollador A se olvide de actualizar el archivo de configuración, mientras que el desarrollador B a menudo escribe consultas LINQ incorrectas. Según el desarrollador, primero puedo mirar hacia el archivo de configuración o el LINQ.
Del mismo modo, he trabajado en varias empresas como consultor ahora, y puedo ver claramente que los tipos de errores pueden estar sesgados hacia ciertos tipos de empresas. No es una regla dura y rápida que pueda señalar de manera concluyente, pero hay una tendencia definitiva.
¿Puede una máquina aprender esto? ¿Puede darse cuenta de que es más probable que el desarrollador A estropee la configuración y que el desarrollador B estropee una consulta LINQ? Por supuesto que puede. Como dije antes, cualquier cosa que un humano pueda aprender, una máquina también puede hacerlo.
Sin embargo, ¿cómo sabe que le ha enseñado a la máquina toda la gama de posibilidades? ¿Cómo puede proporcionarle un conjunto de datos pequeño (es decir, no global) y saber con certeza que representa el espectro completo de errores? ¿O, en su lugar, crearía depuradores específicos para ayudar a desarrolladores / compañías específicas, en lugar de crear un depurador que sea universalmente utilizable?
Pedir un depurador aprendido por la máquina es como pedir un Sherlock Holmes aprendido por la máquina. No es probable que sea imposible crear uno, pero a menudo el razonamiento central para ser un depurador / Sherlock depende de evaluaciones subjetivas que varían de un sujeto a otro y tocan una variedad increíblemente amplia de conocimiento / posibles fallas.
La falta de resultados correctos / incorrectos comprobables rápidamente hace que sea difícil enseñar fácilmente a una máquina y verificar que esté progresando bien.
fuente