Minha formação é em engenharia mecânica, então, por favor, perdoe minha ignorância nessa área.
Eu realmente gosto de programação e desenvolvimento de software. Além disso, recentemente participei de uma aula on-line de aprendizado de máquina (ML), que eu recomendo, ministrada pelo professor Andrew Ng, de Stanford. Link aqui .
Ouvi esse professor dizer que é difícil encontrar áreas que o ML nunca terá impacto.
Questão
Então, minha pergunta é: que pesquisa foi feita até agora na aplicação do aprendizado de máquina ao desenvolvimento de código? Que tal depuração?
Inclua recursos / fontes / artigos científicos, se possível.
Não tive sorte em pesquisar 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 aplicativos ML.
fonte
Respostas:
Fuzzing é um método de teste em que o aprendizado de máquina pode e foi aplicado. Fuzzing é um método de teste no campo do teste exploratório automatizado. Ele tenta encontrar defeitos no software executando um grande número de entradas e procurando erros. Exceções não tratadas são a categoria mais simples, mas uma implementação inteligente pode usar o ML para encontrar resultados suspeitos. O ML é amplamente utilizado nesse domínio, a fim de tornar o processo mais eficiente. Isso funciona usando o ML para evitar testar todas as entradas possíveis treinando entradas "interessantes". (Entradas não semelhantes que provavelmente causam falhas.)
fonte
Sim. Esta área está quente agora. É chamado de "código grande" e a DARPA investiu US $ 40 milhões: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Alguns resultados impressionantes surgiram dessa concessão, como os sistemas Profeta e Genesis da Fan Long, que podem corrigir erros 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 o resultado mais impressionante seja o JSNice ( http://jsnice.org/ ), que pode "minimizar o código JavaScript.
No geral, a idéia de código grande não cumpriu sua promessa: os dados são muito escassos para aprender algo muito mais interessante do que nomes de variáveis. Enquanto ainda sou financiado em parte por esse programa da DARPA, meu laboratório parou de trabalhar nele. Na mesma 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 se baseiam em métodos que não são de ML, como os solucionadores SMT. Veja os procedimentos de qualquer conferência PL (por exemplo: PLDI, POPL, OOPSLA) ou de qualquer conferência acadêmica de engenharia de software (por exemplo: ICSE, FSE, ISSTA, ASE) e você verá muitos exemplos.
fonte
A Microsoft desenvolveu o DeepCoder para usar o aprendizado profundo para prever um corpo de método a partir de uma determinada entrada e saída. Esse é o único exemplo que conheço de improviso.
Posso dizer que a Programação Meta-Genética é um campo de estudo com uma 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.
fonte
Uma pergunta 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 maneira de "automaticamente desenvolver código" - na verdade, escrevendo código - a partir de uma linguagem de nível superior).
Houve vários artigos sobre isso, por exemplo, MILEPOST GCC .
Você também pode procurar no Google por documentos sobre técnicas de aprendizado de máquina para depuração ou para análise estática de código-fonte (ou qualquer tipo de análise estática de programa ).
Veja também o blog de J.Pitrat sobre inicialização de inteligência artificial, relacionado à sua pergunta.
fonte
Em um artigo recente da Communications of the ACM sobre como ganhar dinheiro usando a matemática, Erik Meijer citou Jeff Dean, pesquisador sênior do Google, Systems and Infrastructure Group:
O artigo fornece uma visão geral das atividades recentes na área de pesquisa. Está atrás de um muro 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 também possa ser útil.
Como exemplo, o artigo se refere à WebPPL, programação probabilística para a web .
fonte
Aqui está um caso de uso do aprendizado de máquina para depurar microsserviços. Documentei alguns esforços na 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 do teste de carga de um microsserviço e, em seguida, estudei a árvore, que me deu informações sobre um problema ambiental e me ajudou a diagnosticar e corrigir um bug de desempenho.
fonte
Encontrei uma lista de leitura bastante extensa sobre todos os tópicos de aprendizado de máquina relacionados à 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 uma máquina que pode lidar com todos os tipos de codificação ou depuração.
O restante desta resposta se concentra na sua máquina de "depuração" de escopo relativamente amplo e por que isso ainda não foi realmente tentado (tanto quanto mostra minha pesquisa sobre o tópico).
Eu redigi uma parte longa da resposta. Para resumir (é importante para a próxima parte): seguir a metodologia atual de aprendizado de máquina, qualquer coisa que um humano possa aprender, uma máquina também. Estamos limitados apenas pelo domínio físico (velocidade da CPU, tamanho de uma máquina, ...), não uma suposta aplicabilidade limitada do próprio algoritmo de aprendizado.
A questão aqui não é que seja impossível, mas que é um tópico incrivelmente complexo.
Os seres humanos nem sequer chegaram perto de definir um padrão de codificação universal com o qual todos concordam. Mesmo os princípios mais amplamente aceitos, como o SOLID, ainda são uma fonte de discussão sobre a profundidade em que deve ser implementado. Para todos os fins práticos, é impossível aderir perfeitamente ao SOLID, a menos que você não tenha nenhuma restrição financeira (ou de tempo); o que simplesmente não é possível no setor privado, onde ocorre o maior desenvolvimento. O SOLID é uma diretriz, não um limite rígido.
Na ausência de uma medida objetiva do certo e do errado, como poderemos dar um feedback positivo / negativo a uma máquina para fazê-la aprender?
Na melhor das hipóteses, podemos fazer com que muitas pessoas dêem sua própria opinião à máquina ("este é um código bom / ruim"), e o resultado da máquina será então uma "opinião média". 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 desenvolvedores específicos tendem 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 códigos de outras pessoas no trabalho, tenho uma espécie de expectativa de que tipo de erro cada desenvolvedor está propenso a cometer. Dado um certo problema, eu sei que o dev A provavelmente esquece de atualizar o arquivo de configuração, enquanto o dev B geralmente escreve consultas LINQ ruins. Baseado 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 agora e posso ver claramente que tipos de bugs podem ser direcionados a certos tipos de empresas. Não é uma regra rígida e rápida que eu possa apontar conclusivamente, mas há uma tendência definida.
Uma máquina pode aprender isso? Consegue perceber que é mais provável que o dev A atrapalhe a configuração e o dev B atrapalhe uma consulta LINQ? Claro que pode. Como eu disse antes, qualquer coisa que um humano pode aprender, uma máquina também pode.
No entanto, como você sabe que ensinou à máquina toda a gama de possibilidades? Como você pode fornecer um conjunto de dados pequeno (isto é, não global) e saber que ele representa todo o espectro de bugs? Ou, você criaria depuradores específicos para ajudar desenvolvedores / empresas específicos, em vez de criar um depurador universalmente utilizável?
Pedir um depurador aprendido a máquina é como pedir um Sherlock Holmes aprendido a máquina. Não é comprovadamente impossível criar um, mas muitas vezes o principal raciocínio de ser um depurador / Sherlock depende de avaliações subjetivas que variam de assunto para assunto e tocam em uma variedade incrivelmente ampla de conhecimentos / possíveis falhas.
A falta de resultados corretos / incorretos, comprováveis rapidamente, dificulta o ensino fácil de uma máquina e a verificação de que ela está fazendo um bom progresso.
fonte