it-swarm.com.de

Maschinelles Lernen für die Codeentwicklung

Mein Hintergrund liegt im Maschinenbau, bitte verzeihen Sie meine Unkenntnis in diesem Bereich.

Ich genieße es wirklich, zu programmieren und Software zu entwickeln. Außerdem habe ich kürzlich einen kostenlosen Online-Kurs für maschinelles Lernen (ML) besucht, den ich sehr empfehlen kann und der von Stanford-Professor Andrew Ng unterrichtet wird. Link hier .

Ich habe diesen Professor sagen hören, dass es schwierig ist, Bereiche zu finden, die ML niemals beeinflussen wird.

Frage

Meine Frage ist also, welche Forschungsarbeiten wurden bisher durchgeführt, um maschinelles Lernen auf die Codeentwicklung anzuwenden? Wie wäre es mit Debuggen?

Bitte geben Sie nach Möglichkeit Ressourcen/Quellen/wissenschaftliche Arbeiten an.

Ich hatte kein Glück, danach zu suchen, weil das häufige Durchsuchen von ML und Softwareentwicklung (oder Programmierung) zu Ergebnissen bei der Softwareentwicklung (oder Programmierung) führt ) von ML-Anwendungen.

18
Charles

Fuzzing ist eine Testmethode, bei der maschinelles Lernen angewendet werden kann und wurde. Fuzzing ist eine Testmethode im Bereich automatisierter Erkundungstests. Es wird versucht, Fehler in der Software zu finden, indem eine große Anzahl von Eingaben ausgeführt und nach Fehlern gesucht wird. Nicht behandelte Ausnahmen sind die einfachste Kategorie, aber eine intelligente Implementierung kann ML verwenden, um verdächtige Ausgaben zu finden. ML wird in diesem Bereich hauptsächlich verwendet, um den Prozess jedoch effizienter zu gestalten. Dies funktioniert durch die Verwendung von ML, um zu vermeiden, dass jede mögliche Eingabe durch Training an "interessanten" Eingaben getestet wird. (Nicht ähnliche Eingaben, die wahrscheinlich zu Fehlern führen.)

6
RubberDuck

Ja. Dieser Bereich ist gerade heiß. Es heißt "Big Code" und DARPA hat 40 Millionen US-Dollar investiert: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Einige beeindruckende Ergebnisse sind aus diesem Zuschuss hervorgegangen, wie beispielsweise die Prophet- und Genesis-Systeme von Fan Long, mit denen Fehler in Programmen mithilfe eines erlernten Modells korrekter Patches automatisch behoben werden können. Martin Vechev und sein Schüler Veselin Raychev waren ebenfalls Pioniere auf diesem Gebiet. Das vielleicht beeindruckendste Ergebnis ist JSNice ( http://jsnice.org/ ), mit dem JavaScript-Code "minimiert" werden kann.

Insgesamt hat die Idee des großen Codes ihr Versprechen nicht erfüllt: Die Daten sind viel zu spärlich, um etwas viel Interessanteres als Variablennamen zu lernen. Während ich zum Teil noch durch dieses DARPA-Programm finanziert werde, hat mein Labor größtenteils aufgehört, daran zu arbeiten. In diesem Sinne ist das Letzte, was ich über DeepCoder gehört habe, dass es im Vergleich zum Stand der Technik in der Programmsynthese ziemlich erbärmliche Ergebnisse liefert.

Die meisten erfolgreichen Tools für die automatisierte Programmierung basieren immer noch auf Nicht-ML-Methoden wie SMT-Lösern. Werfen Sie einen Blick auf den Ablauf einer PL-Konferenz (z. B. PLDI, POPL, OOPSLA) oder einer akademischen Software-Engineering-Konferenz (z. B. ICSE, FSE, ISSTA, ASE), und Sie werden zahlreiche Beispiele sehen.

4
James Koppel

Microsoft hat DeepCoder entwickelt, um mithilfe von Deep Learning einen Methodenkörper aus einer bestimmten Eingabe und Ausgabe vorherzusagen. Das ist das einzige Beispiel, das ich ohne weiteres kenne.

Ich kann Ihnen sagen, dass Meta-Genetic Programming ein Studienbereich mit ähnlichen Ambitionen ist, aber ich kann nicht sagen, dass ich genug darüber weiß, um sachkundig zu sein.

Genetische Programmierung war in den Nachrichten im Jahr 2015, als muScalpel eine Lösung entwickelte, um ein Feature von einem Programm in ein anderes zu übertragen, wobei die Unit-Tests für beide als eine Art Trainingsset verwendet wurden.

3
RJB

Meine Frage ist also, welche Forschungsarbeiten wurden bisher durchgeführt, um maschinelles Lernen auf die Codeentwicklung anzuwenden? Wie wäre es mit Debuggen?

Eine verwandte Frage betrifft Techniken des maschinellen Lernens zur Codegenerierung und -kompilierung (da Sie sich Transpiler und Compiler als eine Möglichkeit vorstellen können, automatisch Code zu "entwickeln" - tatsächlich Code zu schreiben - eine höhere Sprache).

Es gab mehrere Artikel darüber, zum Beispiel MILEPOST GCC .

Sie können auch nach Artikeln über Techniken des maschinellen Lernens zum Debuggen oder zur statischen Quellcode-Analyse (oder einer beliebigen Art von statische Programmanalyse ) suchen.

Siehe auch J.Pitrats Blog über das Bootstrapping künstlicher Intelligenz , der mit Ihrer Frage zusammenhängt.

Ich fand eine ziemlich umfangreiche Leseliste zu allen codierungsbezogenen Themen des maschinellen Lernens .

Wie Sie sehen können, haben die Leute versucht, maschinelles Lernen auf das Codieren anzuwenden, aber immer in sehr engen Bereichen, nicht nur auf einer Maschine, die alle Arten von Codierung oder Debugging verarbeiten kann.
Der Rest dieser Antwort konzentriert sich auf Ihre relativ weitreichende "Debugging" -Maschine und warum dies noch nicht wirklich versucht wurde (soweit meine Forschung zu diesem Thema zeigt).


Ich habe einen längeren Teil der Antwort redigiert. Zusammenfassend (es ist wichtig für den nächsten Teil): Nach der aktuellen Methodik des maschinellen Lernens kann alles, was ein Mensch lernen kann, auch eine Maschine. Wir sind nur durch den physischen Bereich (CPU-Geschwindigkeit, Größe einer Maschine, ...) begrenzt, nicht durch eine vermeintlich eingeschränkte Anwendbarkeit des Lernalgorithmus selbst.

welche Forschungsarbeiten wurden bisher durchgeführt, um maschinelles Lernen auf die Codeentwicklung anzuwenden? Wie wäre es mit Debuggen?

Das Problem hier ist nicht, dass es unmöglich ist, sondern dass es ein unglaublich komplexes Thema ist.

Der Mensch hat noch nicht einmal annähernd einen universellen Kodierungsstandard definiert, dem alle zustimmen. Selbst die am weitesten verbreiteten Prinzipien wie SOLID sind immer noch eine Quelle für Diskussionen darüber, wie tief es muss umgesetzt werden. Für alle praktischen Zwecke ist es unmöglich, SOLID perfekt einzuhalten, es sei denn, Sie haben keinerlei finanzielle (oder zeitliche) Einschränkungen. was im privaten Sektor, in dem die meiste Entwicklung stattfindet, einfach nicht möglich ist. SOLID ist eine Richtlinie, keine feste Grenze.

Wie können wir einer Maschine ohne objektives Maß für richtig und falsch ein positives/negatives Feedback geben, damit sie lernt?
Bestenfalls können viele Leute der Maschine ihre eigene Meinung geben ("das ist guter/schlechter Code"), und das Ergebnis der Maschine wird dann eine "durchschnittliche Meinung" sein. Aber das ist nicht unbedingt dasselbe wie eine richtige Lösung. Es kann sein, aber es ist nicht garantiert.

Zweitens ist es insbesondere für das Debuggen wichtig zu erkennen, dass bestimmte Entwickler dazu neigen, eine bestimmte Art von Fehler/Fehler einzuführen. Die Art des Fehlers kann in einigen Fällen von dem Entwickler beeinflusst werden, der ihn eingeführt hat.

Da ich beispielsweise häufig an der Fehlerbehebung des Codes anderer bei der Arbeit beteiligt bin, habe ich eine gewisse Erwartung, welche Art von Fehler jeder Entwickler machen kann. Angesichts eines bestimmten Problems weiß ich, dass Entwickler A wahrscheinlich die Aktualisierung der Konfigurationsdatei vergisst, während Entwickler B häufig fehlerhafte LINQ-Abfragen schreibt. Basierend auf dem Entwickler kann ich zuerst auf die Konfigurationsdatei oder den LINQ schauen.
In ähnlicher Weise habe ich jetzt bei mehreren Unternehmen als Berater gearbeitet, und ich kann deutlich erkennen, dass Arten von Fehlern auf bestimmte Arten von Unternehmen ausgerichtet sein können. Es ist keine feste Regel, auf die ich abschließend hinweisen kann, aber es gibt einen bestimmten Trend.

Kann eine Maschine das lernen? Kann es erkennen, dass Entwickler A die Konfiguration eher durcheinander bringt und Entwickler B eher eine LINQ-Abfrage durcheinander bringt? Natürlich kann es. Wie ich bereits sagte, alles, was ein Mensch lernen kann, kann auch eine Maschine.
Woher wissen Sie jedoch, dass Sie der Maschine alle Möglichkeiten beigebracht haben? Wie können Sie jemals einen kleinen (d. H. Nicht globalen) Datensatz bereitstellen und sicher sein, dass er das gesamte Spektrum der Fehler darstellt? Oder würden Sie stattdessen bestimmte Debugger erstellen, um bestimmten Entwicklern/Unternehmen zu helfen, anstatt einen Debugger zu erstellen, der universell einsetzbar ist?

Nach einem maschinell erlernten Debugger zu fragen, ist wie nach einem maschinell erlernten Sherlock Holmes zu fragen. Es ist nicht nachweislich unmöglich, eine zu erstellen, aber oft hängt die Hauptüberlegung, ein Debugger/Sherlock zu sein, von subjektiven Einschätzungen ab, die von Thema zu Thema unterschiedlich sind und eine unglaublich große Vielfalt von Kenntnissen/möglichen Fehlern berühren.
Das Fehlen schnell nachweisbarer korrekter/falscher Ergebnisse macht es schwierig, eine Maschine einfach zu unterrichten und zu überprüfen, ob sie gute Fortschritte macht.

1
Flater

In einem kürzlich erschienenen Artikel in Communications of the ACM über Geld verdienen mit Mathematik zitierte Erik Meijer Jeff Dean, Senior Fellow von Google, Systems and Infrastructure Group:

Wenn Google heute von Grund auf neu erstellt würde, würde ein Großteil davon gelernt und nicht codiert.

Der Artikel gibt einen Überblick über aktuelle Aktivitäten im Forschungsbereich. Es befindet sich hinter einer Pay Wall, ist aber möglicherweise lesenswert, wenn Sie an theoretischen Parallelen zwischen Codierung und maschinellem Lernen/Statistik interessiert sind. Vielleicht ist auch die Referenzliste am Ende des Artikels hilfreich.

Als Beispiel bezieht sich der Artikel auf WebPPL, probabilistische Programmierung für das Web .

1
Claude

Hier ist ein Anwendungsfall für die Verwendung von maschinellem Lernen zum Debuggen von Microservices. Ich dokumentierte einige Bemühungen in Analysieren von Microservice-Leistungsdaten mit maschinellem Lernen , wo ich einen Entscheidungsbaum aus den Leistungsdaten trainierte, die beim Lasttest eines Microservices gesammelt wurden, und dann den Baum studierte, der mir Einblick in ein Umweltproblem gab und mir half einen Leistungsfehler diagnostizieren und beheben.

0
Glenn