Mon expérience est en génie mécanique, alors veuillez pardonner mon ignorance dans ce domaine.
J'apprécie vraiment la programmation et le développement de logiciels. De plus, j'ai récemment pris un cours gratuit d'apprentissage en ligne (ML), que je recommande fortement, dispensé par le professeur de Stanford Andrew Ng. Lien ici .
J'ai entendu ce professeur dire qu'il est difficile de trouver des domaines que le ML n'aura jamais d'impact.
Question
Ma question est donc la suivante: quelles recherches ont été effectuées jusqu'à présent pour appliquer l'apprentissage automatique au développement de code? Et le débogage?
Veuillez inclure les ressources / sources / articles scientifiques si possible.
Je n'ai pas eu de chance à chercher cela parce que souvent la recherche de ML et le développement (ou la programmation) de logiciels aboutissent à des résultats dans le développement (ou la programmation) de logiciels d'applications ML.
Réponses:
Le fuzzing est une méthode de test où l'apprentissage automatique peut et a été appliqué. Le fuzzing est une méthode de test dans le domaine des tests exploratoires automatisés. Il tente de trouver des défauts dans le logiciel en exécutant un grand nombre d'entrées et en recherchant les erreurs. Les exceptions non gérées sont la catégorie la plus simple, mais une implémentation intelligente peut utiliser ML pour trouver des sorties suspectes. Le ML est cependant largement utilisé dans ce domaine afin de rendre le processus plus efficace. Cela fonctionne en utilisant ML pour éviter de tester toutes les entrées possibles en vous entraînant sur les entrées "intéressantes". (Entrées non similaires susceptibles de provoquer une défaillance.)
la source
Oui. Cette zone est chaude en ce moment. C'est ce qu'on appelle le «gros code» et la DARPA y a investi 40 millions de dollars: http://www.darpa.mil/program/mining-and-understanding-software-enclaves . Certains résultats impressionnants sont sortis de cette subvention, tels que les systèmes Prophet et Genesis de Fan Long, qui peuvent corriger automatiquement les bogues dans les programmes en utilisant un modèle appris de correctifs corrects. Martin Vechev et son élève Veselin Raychev ont également été des pionniers dans ce domaine. Leur résultat le plus impressionnant est peut-être JSNice ( http://jsnice.org/ ), qui peut "minimiser le code JavaScript.
Dans l'ensemble, l'idée de gros code n'a pas été à la hauteur de sa promesse: les données sont beaucoup trop rares pour apprendre quelque chose de beaucoup plus intéressant que les noms de variables. Bien que je sois toujours financé en partie par ce programme DARPA, mon laboratoire a surtout cessé de travailler dessus. Sur cette note, la dernière chose que j'ai entendue à propos de DeepCoder est qu'il obtient des résultats assez pathétiques par rapport à l'état de l'art en matière de synthèse de programmes.
La plupart des outils efficaces de programmation automatisée reposent toujours sur des méthodes non ML comme les solveurs SMT. Jetez un œil aux actes de toute conférence PL (par exemple: PLDI, POPL, OOPSLA) ou de toute conférence universitaire en génie logiciel (par exemple: ICSE, FSE, ISSTA, ASE), et vous verrez de nombreux exemples.
la source
Microsoft a développé DeepCoder pour utiliser l'apprentissage en profondeur afin de prédire un corps de méthode à partir d'une entrée et de sorties données. C'est le seul exemple que je connaisse au pied levé.
Je peux vous dire que la programmation méta-génétique est un domaine d'étude avec une ambition similaire, mais je ne peux pas dire que j'en sais suffisamment pour être informé.
La programmation génétique a fait la une des journaux en 2015 lorsque muScalpel a développé une solution pour transplanter une fonctionnalité d'un programme à un autre, en utilisant les tests unitaires pour les deux comme une sorte d'ensemble de formation.
la source
Une question connexe concerne les techniques d'apprentissage automatique pour la génération et la compilation de code (puisque vous pourriez imaginer des transpilateurs et des compilateurs comme un moyen de "développer du code" automatiquement - en écrivant du code - à partir d'un langage de niveau supérieur).
Il y a eu plusieurs articles à ce sujet, par exemple MILEPOST GCC .
Vous pouvez également rechercher des articles sur les techniques d'apprentissage automatique pour le débogage ou pour l'analyse de code source statique (ou tout type d' analyse de programme statique ) sur Google .
Voir aussi le blog de J.Pitrat sur le démarrage de l'intelligence artificielle qui est lié à votre question.
la source
Dans un récent article de Communications of the ACM sur Making money using math, Erik Meijer a cité Jeff Dean, chercheur principal de Google, Systems and Infrastructure Group:
L'article donne un aperçu des activités récentes dans le domaine de la recherche. Il se trouve derrière un mur de rémunération, mais peut être intéressant à lire si vous êtes intéressé par les parallèles théoriques entre le codage et l'apprentissage automatique / les statistiques. Peut-être que la liste de référence à la fin de l'article pourrait également être utile.
À titre d'exemple, l'article fait référence à WebPPL, programmation probabiliste pour le Web .
la source
Voici un cas d'utilisation de l'utilisation de l'apprentissage automatique pour déboguer des microservices. J'ai documenté certains efforts dans l' analyse des données de performance du microservice avec l'apprentissage automatique où j'ai formé un arbre de décision à partir des données de performance collectées lors du test de charge d'un microservice, puis étudié l'arbre qui m'a donné un aperçu d'un problème environnemental et m'a aidé à diagnostiquer et à corriger un bogue de performance.
la source
J'ai trouvé une liste de lecture assez complète sur tous les sujets d'apprentissage automatique liés au codage .
Comme vous pouvez le voir, les gens ont essayé d'appliquer l'apprentissage automatique au codage, mais toujours dans des domaines très étroits, pas seulement une machine capable de gérer toutes sortes de codage ou de débogage.
Le reste de cette réponse se concentre sur votre machine de «débogage» de portée relativement large et pourquoi cela n'a pas encore vraiment été tenté (pour autant que mes recherches sur le sujet le montrent).
J'ai expurgé une longue partie de la réponse. Pour résumer (c'est important pour la partie suivante): selon la méthodologie actuelle d'apprentissage automatique, tout ce qu'un humain peut apprendre, une machine peut aussi. Nous ne sommes limités que par le domaine physique (vitesse du processeur, taille d'une machine, ...), et non par une applicabilité supposée limitée de l'algorithme d'apprentissage lui-même.
Le problème ici n'est pas qu'il est impossible, mais plutôt que c'est un sujet incroyablement complexe.
Les humains ne sont même pas parvenus à définir une norme de codage universelle avec laquelle tout le monde est d'accord. Même les principes les plus largement acceptés comme SOLID sont toujours une source de discussion sur la profondeur de sa mise en œuvre. À toutes fins pratiques, il est impossible d'adhérer parfaitement à SOLID à moins que vous n'ayez aucune contrainte financière (ou temporelle) quelle qu'elle soit; ce qui n'est tout simplement pas possible dans le secteur privé où se produit l'essentiel du développement. SOLID est une directive, pas une limite stricte.
En l'absence d'une mesure objective du bien et du mal, comment allons-nous pouvoir donner une rétroaction positive / négative à une machine pour la faire apprendre?
Au mieux, beaucoup de gens peuvent donner leur propre opinion sur la machine ("c'est un bon / mauvais code"), et le résultat de la machine sera alors une "opinion moyenne". Mais ce n'est pas nécessairement la même chose qu'une bonne solution . C'est possible, mais ce n'est pas garanti.
Deuxièmement, pour le débogage en particulier, il est important de reconnaître que des développeurs spécifiques sont enclins à introduire un type spécifique de bogue / erreur. La nature de l'erreur peut dans certains cas être influencée par le développeur qui l'a introduite.
Par exemple, comme je suis souvent impliqué dans la correction de bogues du code des autres au travail, j'ai une sorte d'attente quant au type d'erreur que chaque développeur est susceptible de commettre. Étant donné un certain problème, je sais que le dev A est susceptible d'oublier la mise à jour du fichier de configuration, tandis que le dev B écrit souvent de mauvaises requêtes LINQ. Sur la base du développeur, je peux d'abord regarder vers le fichier de configuration ou le LINQ.
De même, j'ai travaillé dans plusieurs entreprises en tant que consultant maintenant, et je peux clairement voir que les types de bugs peuvent être biaisés vers certains types d'entreprises. Ce n'est pas une règle stricte et rapide que je peux souligner de manière concluante, mais il y a une tendance définie.
Une machine peut-elle apprendre cela? Peut-il se rendre compte que le dev A est plus susceptible de gâcher la configuration et que le dev B est plus susceptible de gâcher une requête LINQ? Bien sûr que oui. Comme je l'ai déjà dit, tout ce qu'un humain peut apprendre, une machine peut aussi.
Cependant, comment savez-vous que vous avez appris à la machine toutes les possibilités? Comment pouvez-vous jamais lui fournir un petit ensemble de données (c'est-à-dire non global) et savoir avec certitude qu'il représente le spectre complet des bogues? Ou, voudriez-vous plutôt créer des débogueurs spécifiques pour aider des développeurs / entreprises spécifiques, plutôt que de créer un débogueur qui est universellement utilisable?
Demander un débogueur appris par machine, c'est comme demander un Sherlock Holmes appris par machine. Il n'est pas prouvable impossible d'en créer un, mais souvent le raisonnement de base pour être un débogueur / Sherlock repose sur des évaluations subjectives qui varient d'un sujet à l'autre et touchent à une variété incroyablement large de connaissances / défauts possibles.
L'absence de résultats corrects / incorrects rapidement prouvables fait qu'il est difficile d'enseigner facilement une machine et de vérifier qu'elle progresse bien.
la source