Aprendizado de máquina aplicado ao desenvolvimento de código

15

Meu histórico é em engenharia mecânica, então, por favor, perdoe minha ignorância para esta área.

Eu realmente gosto de programação e desenvolvimento de software. Além disso, recentemente eu fiz uma aula on-line de aprendizado de máquina (ML), que eu recomendo, ensinada pelo professor de Stanford Andrew Ng. Link aqui .

Eu ouvi esse professor dizer que é difícil encontrar áreas que o ML nunca terá impacto.

Pergunta

Então, minha pergunta é: que pesquisa foi feita até agora na aplicação do aprendizado de máquina ao desenvolvimento de código? Como sobre a depuração?

Por favor, inclua recursos / fontes / artigos científicos, se possível.

Eu não tive a sorte de procurar por isso, porque muitas vezes pesquisando ML e desenvolvimento de software (ou programação) acaba levando a resultados no desenvolvimento de software (ou programação) de aplicações ML.

    
por Charles 18.06.2017 / 04:17
fonte

7 respostas

6

Fuzzing é um método de teste em que o aprendizado de máquina pode & foi aplicado. Fuzzing é um método de teste no domínio dos testes exploratórios automatizados. Ele tenta encontrar defeitos no software executando um grande número de entradas e procurando por erros. As exceções sem tratamento são a categoria mais simples, mas uma implementação inteligente pode usar o ML para localizar saídas suspeitas. ML é amplamente utilizado neste domínio para tornar o processo mais eficiente no entanto. Isso funciona usando ML para evitar testar todas as entradas possíveis treinando em entradas "interessantes". (Dis-entradas semelhantes que são susceptíveis de causar falha.)

    
por 19.06.2017 / 20:17
fonte
4

Sim. Esta área está quente agora. Chama-se "grande código" e a DARPA investiu 40 milhões de dólares: link . Alguns resultados impressionantes surgiram dessa concessão, como os sistemas Prophet e Genesis do Fan Long, que podem corrigir bugs automaticamente em programas usando um modelo aprendido de correções corretas. Martin Vechev e seu aluno Veselin Raychev também foram pioneiros nessa área. Talvez seu resultado mais impressionante seja o JSNice ( link ), que pode "minimizar o código JavaScript.

No geral, a ideia do código grande não cumpriu sua promessa: os dados são muito escassos para aprender algo muito mais interessante que os nomes das variáveis. Embora eu ainda seja financiado em parte por este programa DARPA, meu laboratório praticamente parou de trabalhar nele. Nessa nota, a última coisa que ouvi sobre o DeepCoder é que ele obtém resultados bastante patéticos em comparação com o estado da arte na síntese de programas.

As ferramentas mais bem sucedidas para programação automatizada ainda dependem de métodos não-ML, como os solucionadores de SMT. Dê uma olhada nos anais de qualquer conferência do PL (por exemplo: PLDI, POPL, OOPSLA) ou em qualquer conferência acadêmica de engenharia de software (por exemplo: ICSE, FSE, ISSTA, ASE), e você verá muitos exemplos.

    
por 23.06.2017 / 06:30
fonte
3

A Microsoft vem desenvolvendo DeepCoder para usar o aprendizado profundo prever um corpo de método a partir de uma dada entrada e saída. Esse é o único exemplo que conheço de improviso.

Eu posso dizer que Meta-Genetic Programming é um campo de estudo com ambição semelhante, mas não posso dizer que conheço o suficiente para ter conhecimento.

A Programação Genética foi notícia em 2015, quando o muScalpel desenvolveu uma solução para transplantar um recurso de um programa para outro, usando os testes de unidade para ambos como uma espécie de conjunto de treinamento.

    
por 19.06.2017 / 19:33
fonte
2

So my question is, what research has been done so far in applying machine learning to code development? How about debugging?

Uma questão relacionada é sobre técnicas de aprendizado de máquina para geração e compilação de código (já que você pode imaginar transpilers e compiladores como uma forma de "desenvolver código" automaticamente - escrevendo código de alguma linguagem de nível superior.

>

Existem vários artigos sobre isso, por exemplo, MILEPOST GCC .

Você também pode pesquisar no google artigos sobre técnicas de aprendizado de máquina para depuração ou para análise de código-fonte estático (ou qualquer tipo de análise de programa estático ).

Veja também o blog da J.Pitrat sobre inteligência artificial bootstrap que está relacionado à sua pergunta.

    
por 22.06.2017 / 10:31
fonte
1

Em um artigo recente no Communications of the ACM sobre Ganhar dinheiro usando matemática Erik Meijer citou Jeff Dean , Google Senior Fellow, Grupo de Sistemas e Infraestrutura:

If Google were created from scratch today, much of it would be learned, not coded.

O artigo oferece uma visão geral sobre atividades recentes na área de pesquisa. Está atrás de uma parede de pagamento, mas pode valer a pena ler se você estiver interessado em paralelos teóricos entre codificação e aprendizado de máquina / estatística. Talvez a lista de referências no final do artigo possa ser útil também.

Como exemplo, o artigo refere-se a WebPPL, programação probabilística para a web .

    
por 22.06.2017 / 10:21
fonte
0

Aqui está um caso de uso sobre o uso de aprendizado de máquina para depurar microservices. Eu documentei alguns esforços em análise de dados de desempenho de microsserviço com aprendizado de máquina , onde treinei uma árvore de decisão a partir dos dados de desempenho coletados teste de carga de um microservice, em seguida, estudei a árvore que me deu uma visão sobre um problema ambiental e me ajudou a diagnosticar e corrigir um bug de desempenho.

    
por 06.11.2018 / 07:06
fonte
0

Eu encontrei bastante extensa lista de leitura em todos os tópicos de aprendizado de máquina relacionados a codificação .

Como você pode ver, as pessoas têm tentado aplicar o aprendizado de máquina à codificação, mas sempre em campos muito estreitos, não apenas em uma máquina que possa lidar com todos os tipos de codificação ou depuração. O resto desta resposta se concentra em sua máquina de "depuração" de escopo relativamente amplo e por que isso ainda não foi realmente tentado (até onde minha pesquisa sobre o tópico mostra).

Eu redigi uma parte extensa da resposta. Para resumir (é importante para a próxima parte): seguindo a atual metodologia de aprendizado de máquina, qualquer coisa que um humano possa aprender, uma máquina também pode. Estamos limitados apenas pelo reino físico (velocidade da CPU, tamanho de uma máquina, ...), não uma suposta aplicabilidade limitada do próprio algoritmo de aprendizagem.

what research has been done so far in applying machine learning to code development? How about debugging?

A questão aqui não é que é impossível, mas sim que é um tópico incrivelmente complexo.

Os seres humanos não chegaram nem perto de definir um padrão de codificação universal com o qual todos concordam. Mesmo os princípios mais amplamente acordados, como o SOLID, ainda são uma fonte de discussão sobre quão quão profundamente ele deve ser implementado. Para todos os efeitos práticos, é imposible aderir perfeitamente ao SOLID, a menos que você não tenha nenhuma restrição financeira (ou tempo); o que simplesmente não é possível no setor privado, onde ocorre a maior parte do desenvolvimento. SOLID é uma diretriz, não um limite rígido.

Na ausência de uma medida objetiva de certo e errado, como poderemos dar uma máquina de feedback positivo / negativo para fazê-lo aprender?
Na melhor das hipóteses, podemos ter muitas pessoas dando sua própria opinião para a máquina ("isso é bom / código ruim"), e o resultado da máquina será então uma "opinião comum". Mas isso não é necessariamente o mesmo que uma solução correta . Pode ser, mas não é garantido que seja.

Em segundo lugar, para depuração em particular, é importante reconhecer que os desenvolvedores específicos são propensos a introduzir um tipo específico de bug / erro. A natureza do erro pode, em alguns casos, ser influenciada pelo desenvolvedor que o introduziu.

Por exemplo, como estou frequentemente envolvido na correção de erros do código de outras pessoas no trabalho, tenho uma espécie de expectativa de que tipo de erro cada desenvolvedor está propenso a fazer. Dado um certo problema, eu sei que o dev A provavelmente esquecerá de atualizar o arquivo de configuração, enquanto o dev B freqüentemente escreve consultas LINQ ruins. Com base no desenvolvedor, posso olhar primeiro para o arquivo de configuração ou para o LINQ.
Da mesma forma, já trabalhei em várias empresas como consultor, e posso ver claramente que tipos de bugs podem influenciar certos tipos de empresas. Não é uma regra difícil e rápida que eu possa apontar de forma conclusiva, mas há uma tendência definida.

Uma máquina pode aprender isso? É possível perceber que o dev A é mais propenso a bagunçar a configuração e o dev B tem maior probabilidade de atrapalhar uma consulta LINQ? Claro que pode. Como eu disse antes, qualquer coisa que um humano possa aprender, uma máquina também pode. No entanto, como você sabe que ensinou a máquina toda a gama de possibilidades? Como você pode fornecer um conjunto de dados pequeno (ou seja, não global) e saber que ele representa o espectro completo de bugs? Ou, em vez disso, você criaria depuradores específicos para ajudar desenvolvedores / empresas específicos, em vez de criar um depurador que seja universalmente utilizável?

Pedir um depurador aprendido por máquina é como pedir por um Sherlock Holmes aprendido por máquinas. Não é provavel- mente impossível criar um, mas muitas vezes o principal raciocínio a ser um depurador / Sherlock depende de avaliações subjetivas que variam de assunto para assunto e de uma variedade incrivelmente ampla de conhecimento / possíveis falhas.
A falta Os resultados corretos / incorretos rapidamente comprovados dificultam o ensino de uma máquina com facilidade e a verificação de que ela está progredindo bem.

    
por 06.11.2018 / 08:47
fonte