Machine learning applicato allo sviluppo del codice

15

Il mio background è in ingegneria meccanica, quindi ti prego di perdonare la mia ignoranza in quest'area.

Mi piace davvero la programmazione e lo sviluppo del software. Inoltre, recentemente ho seguito una lezione online gratuita di Machine Learning (ML), che consiglio vivamente, insegnata dal professore di Stanford Andrew Ng. Link qui .

Ho sentito questo professore dire che è difficile trovare aree che ML non avrà mai un impatto.

Domanda

Quindi la mia domanda è: quali ricerche sono state fatte finora per applicare l'apprendimento automatico allo sviluppo del codice? Che ne dici di fare il debug?

Se possibile, includi risorse / fonti / articoli scientifici.

Non ho avuto fortuna a cercarlo perché spesso lo sviluppo e la programmazione di ML e portano a risultati nello sviluppo del software (o nella programmazione) delle applicazioni ML.

    
posta Charles 18.06.2017 - 04:17
fonte

7 risposte

6

Fuzzing è un metodo di prova in cui l'apprendimento automatico può & è stato applicato. Fuzzing è un metodo di test nel regno dei test esplorativi automatizzati. Cerca di trovare difetti nel software eseguendo un gran numero di input e cercando errori. Le eccezioni non gestite sono la categoria più semplice, ma un'implementazione intelligente può utilizzare ML per trovare output sospetti. ML è largamente usato in questo dominio per rendere il processo più efficiente comunque. Questo funziona usando ML per evitare di testare ogni possibile input allenandosi su input "interessanti". (Dis-simili input che possono causare errori.)

    
risposta data 19.06.2017 - 20:17
fonte
4

Sì. Questa zona è calda adesso. Si chiama "codice grande" e DARPA ha inserito $ 40 milioni: link . Da questa sovvenzione sono emersi alcuni risultati impressionanti, come i sistemi Prophet e Genesis di Fan Long, che possono correggere automaticamente i bug nei programmi utilizzando un modello appreso di patch corrette. Anche Martin Vechev e il suo allievo Veselin Raychev sono stati pionieri in questo settore. Forse il loro risultato più impressionante è JSNice ( link ), che può "minimizzare il codice JavaScript.

Nel complesso, l'idea del grande codice non è stata all'altezza delle sue promesse: i dati sono troppo scarsi per imparare qualcosa di molto più interessante dei nomi delle variabili. Mentre sono ancora finanziato in parte da questo programma DARPA, il mio laboratorio ha quasi smesso di lavorarci. Su questa nota, l'ultima cosa che ho sentito su DeepCoder è che ottiene risultati abbastanza patetici rispetto allo stato dell'arte nella sintesi del programma.

Gli strumenti di maggior successo per la programmazione automatica si basano ancora su metodi non ML come i solutori SMT. Dai un'occhiata agli atti di ogni conferenza PL (ad esempio PLDI, POPL, OOPSLA) o qualsiasi conferenza di ingegneria del software accademico (ad esempio ICSE, FSE, ISSTA, ASE) e vedrai un sacco di esempi.

    
risposta data 23.06.2017 - 06:30
fonte
3

Microsoft ha sviluppato DeepCoder per utilizzare deep learning per prevedere un corpo del metodo da un dato input e output. Questo è l'unico esempio che conosco subito.

Posso dirti che la programmazione Meta-Genetica è un campo di studio con un'ambizione simile, ma non posso dire di conoscerne abbastanza per essere informato.

La programmazione genetica era nelle notizie nel 2015 quando muScalpel ha sviluppato una soluzione per trapiantare una funzionalità da un programma all'altro, utilizzando i test unitari per entrambi come una sorta di set di allenamento.

    
risposta data 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?

Una domanda correlata riguarda le tecniche di apprendimento automatico per la generazione e la compilazione del codice (dato che potresti immaginare transpilers e compilatori come un modo per "sviluppare codice" automaticamente, in modo pratico, scrivere codice da un linguaggio di livello superiore).

Ci sono stati diversi articoli a riguardo, ad esempio MCDPOST GCC .

Puoi anche google per articoli sulle tecniche di apprendimento automatico per il debug o per l'analisi statica del codice sorgente (o qualsiasi tipo di analisi del programma statico ).

Vedi anche il blog di J.Pitrat sull'intelligenza artificiale di avvio che è correlato alla tua domanda.

    
risposta data 22.06.2017 - 10:31
fonte
1

In un recente articolo su Communications of the ACM su Guadagnare usando la matematica Erik Meijer ha citato Jeff Dean , Google Senior Fellow, Systems and Infrastructure Group:

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

L'articolo fornisce una panoramica delle attività recenti nell'area di ricerca. È dietro una parete di pagamento, ma potrebbe valere la pena di leggerlo se sei interessato a parallelismi teorici tra codifica e apprendimento automatico / statistica. Forse l'elenco di riferimento alla fine dell'articolo potrebbe essere utile anche.

Ad esempio l'articolo si riferisce a WebPPL, programmazione probabilistica per il web .

    
risposta data 22.06.2017 - 10:21
fonte
0

Ecco un caso d'uso sull'utilizzo dell'apprendimento automatico per eseguire il debug dei microservizi. Ho documentato alcuni sforzi in analizzando i dati sulle prestazioni dei microservizi con l'apprendimento automatico in cui ho formato un albero delle decisioni dai dati sulle prestazioni raccolti da caricare il test su un microservizio, quindi ho studiato l'albero che mi ha fornito informazioni su un problema ambientale e mi ha aiutato a diagnosticare e correggere un bug delle prestazioni.

    
risposta data 06.11.2018 - 07:06
fonte
0

Ho trovato un ampio elenco di letture su tutti gli argomenti di apprendimento automatico legati alla codifica .

Come puoi vedere, le persone hanno cercato di applicare l'apprendimento automatico alla codifica, ma sempre in campi molto stretti, non solo una macchina in grado di gestire tutti i tipi di codifica o di debugging.
Il resto di questa risposta si concentra sulla vostra macchina di "debugging" relativamente ampia e sul perché questo non sia stato ancora tentato (per quanto riguarda le mie ricerche sull'argomento).

Ho redatto una parte lunga della risposta. Riassumendo (è importante per la parte successiva): seguendo l'attuale metodologia di apprendimento automatico, tutto ciò che un essere umano può imparare, una macchina può anche. Siamo limitati solo dal regno fisico (velocità della CPU, dimensioni di una macchina, ...), non una supposta applicabilità limitata dell'algoritmo di apprendimento stesso.

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

Il problema qui non è che è impossibile, ma piuttosto che è un argomento incredibilmente complesso.

Gli umani non si sono nemmeno avvicinati alla definizione di uno standard di codifica universale con cui tutti sono d'accordo. Anche i principi più condivisi come SOLID sono ancora una fonte di discussione per quanto riguarda quanto profondamente deve essere implementato. Per tutti gli scopi pratici, è impossibile aderire perfettamente a SOLID a meno che non si disponga di alcun vincolo finanziario (o temporale) di sorta; che semplicemente non è possibile nel settore privato in cui si verifica la maggior parte dello sviluppo. SOLID è una linea guida, non un limite difficile.

In assenza di una misura oggettiva di giusto e sbagliato, in che modo saremo in grado di fornire un feedback positivo / negativo a una macchina per farla apprendere?
Nella migliore delle ipotesi, possiamo avere molte persone che danno la loro opinione alla macchina ("questo è un codice buono / cattivo"), e il risultato della macchina sarà quindi un "parere medio". Ma non è necessariamente la stessa di una soluzione corretta . Può essere, ma non è garantito.

In secondo luogo, per il debug in particolare, è importante riconoscere che gli sviluppatori specifici sono inclini a introdurre un tipo specifico di errore / bug. La natura dell'errore può in alcuni casi essere influenzata dallo sviluppatore che l'ha introdotta.

Ad esempio, poiché sono spesso coinvolto nella correzione dei bug sul codice degli altri, ho una sorta di aspettativa sul tipo di errore che ogni sviluppatore è incline a fare. Dato un certo problema, so che dev A è probabile che dimentichi di aggiornare il file di configurazione, mentre dev B scrive spesso query LINQ errate. Sulla base dello sviluppatore, potrei guardare prima al file di configurazione o al LINQ.
Allo stesso modo, ho lavorato in diverse società come consulente ora, e posso vedere chiaramente che i tipi di bug possono essere prevenuti verso determinati tipi di società. Non è una regola dura e veloce che posso evidenziare in modo conclusivo, ma c'è una tendenza definita.

Può una macchina imparare questo? Può rendersi conto che il dev A ha più probabilità di rovinare la configurazione e dev è più probabile che B abbia rovinato una query LINQ? Certo che può Come ho detto prima, tutto ciò che un essere umano può imparare, una macchina può pure Tuttavia, come sai che hai insegnato alla macchina l'intera gamma di possibilità? Come puoi mai fornirlo con un set di dati piccolo (cioè non globale) e sapere per certo che rappresenta l'intero spettro di bug? Oppure, dovresti invece creare debugger specifici per aiutare sviluppatori / aziende specifici, piuttosto che creare un debugger che sia universalmente utilizzabile?

Chiedere un debugger appreso in macchina è come chiedere a Sherlock Holmes un dotto apprendista. Non è probabilmente impossibile crearne uno, ma spesso il ragionamento di base per essere un debugger / Sherlock dipende da valutazioni soggettive che variano da soggetto a soggetto e tocco su una varietà incredibilmente ampia di conoscenze / possibili difetti.
La mancanza di risultati corretti / errati rapidamente dimostrabili rende difficile insegnare facilmente a una macchina e verificare che stia facendo progressi.

    
risposta data 06.11.2018 - 08:47
fonte

Leggi altre domande sui tag