Utilisateur:Kremi11/Brouillon

Une page de Wikipédia, l'encyclopédie libre.

Les outils d'aide au développement (compréhension d'interface de programmation, de méthodes) sont des outils qui ont pour vocation de permettre aux développeurs de comprendre et de mieux appréhender les méthodes provenant d'une interface de programmation ou encore du code du programme qu'il souhaite améliorer.

Contexte[modifier | modifier le code]

L'aide au développement s'intègre dans le contexte d'amélioration continue de la programmation informatique. Cette aide se justifie par la constante expansion de la base de code existante et la nécessité pour un développeur de ne pas recréer ce qui existe. La problématique qu'essai de résoudre cette aide est l'optimisation de la productivité des développeurs.

Aujourd'hui, pour s'aider lors de le développement, les informaticiens peuvent utiliser plusieurs outils :

Différentes équipes de chercheurs ont pour objectif de mettre en place de nouveaux outils d'aide au développement en utilisant différentes techniques, afin d'en comparer leur efficacité. Parmi ces techniques on trouve la présentation d'exemples d'utilisation de la méthode que l'on souhaite utiliser, ou encore des exemples issus de forum de question/réponse.

Recherche sur un base de Code[modifier | modifier le code]

Beaucoup de programmes privilégient l'apprentissage par l'exemple, évitant à l'utilisateur de devoir rechercher dans le code ou sur internet ce dernier. Le programme retourne un exemple d'utilisation de la méthode dans son contexte.

MUSE[modifier | modifier le code]

MUSE[1], exemple d'utilisation de méthode (en anglais : Method USage Examples), génère des exemples de code pour aider les développeurs à réutiliser des méthodes particulières. MUSE va chercher, extraire et documenter un usage concret de l'utilisation de la méthode.

Pour une méthode donnée, l'outil analyse des applications existantes pour collecter les différentes façon d'utiliser la méthode. Il va ensuite effectuer une comparaison des ces différentes utilisation pour détecter les partie de code les plus utiles, et le moins utiles.

MUSE est constitué de plusieurs outils :

- L'outil de téléchargement, qui télécharge le code source des projets et les compile.

- L'extracteur, qui analyse le source code pour rechercher les public méthode et si elle sont utilisé dans le projet client. Pour chacune de ces utilisations, MUSE l'enregistre en tant que exemple d'usage.

- L’évaluateur, qui trie les exemples d'usage et sélectionne les plus représentatives.

- L'injecteur, qui ajoute des commentaires informatifs pour chaque exemple. Pour chaque méthode ayant un exemple d'usage, l'injecteur crée une page html qui contient tout les exemples sélectionnés, ordonné par l’évaluateur, et injecte cette page dans la documentation officiel.

MUSE a été évalué grâce à plusieurs études,  la première, un questionnaire, a vocation de valider l’ordonnancement et la sélection des exemples retournées, elle a eu lieu auprès de développeurs logiciels. Le résultat de cette étude a montré que la façon dont MUSE retournait les exemples correspond majoritairement à ce qu’aurait montrer les développeurs.

La seconde étude, un questionnaire aussi, avait pour vocation d’étudier la perception des utilisateurs de MUSE quant à son utilité et cette étude a fait ressortir que 82% des exemples fournis par MUSE ont été perçu comme utile.

La troisième étude, une expérience contrôlée de dé,  a montrée que les développeurs amélioraient la qualité de l’utilisation des méthodes lorsqu’ils utilisent MUSE.

SNIFF un moteur de recherche[modifier | modifier le code]

SNIFF[2], échantillon pour des requêtes sans formulaire (en anglais SNIppet for Free-Form queries), permet de faire une requête en anglais. Puis retourne un petit et utile exemple de code. Cela permet d’avoir de meilleurs réponses qu’en utilisant un moteur de recherche (ex : Google).

Exemple :

Résultat pour la requête "Lire une ligne de texte à partir d'un fichier" (en anglais : read a line of text from a file)

FileReader fr = new FileReader(String fileName);
BufferedReader br = new BufferedReader(FileReader fr);
String line = br.readLine()

SNIFF va récupérer du code source Java disponible sur le web et l’annoter avec la description Javadoc et les commentaires définis dans l'interface de programmation Java, mais également dans le code client. Ces commentaires sont modifiés, les mots communs comme les prépositions, les conjonctions sont supprimés. Enfin ce code est indexé dans une base de données. Exemple de code annoté :

FileReader fr = new FileReader(fileName); 
// File Reader
// Creates new FileReader given file name read
BufferedReader br = new BufferedReader(fr);
// Buffered Reader
// Creates character-input stream
// uses input buffer specified size

Une requête de SNIFF analyse la base de données et récupère des morceaux de code qui correspondent à la requête.

L'évaluation des résultats de SNIFF s'est fait au travers de 2 expériences :

  • Comparaison de l'impact, par rapport à Prospector et Google Code Search (GCS), sur la performance des développeur à compléter une tâche donnée
  • Comparaison à des moteurs de recherche en ligne comme GCS, Koders et Krugle en récupérant des messages sur des problèmes Java et en les transformants en requêtes avant de les redonner aux programmes

La première expérience a montré que de manière général SNIFF permet d'avoir le code désiré en moins de temps que GCS et Javasketch.

La seconde expérience montre que dans 87,5% la demande recherchée se retrouve à la première place des retours alors que GCS, Koders et Krugle retourne la demande recherchée dans le top 5 dans, respectivement, 75%, 87.5% et 75% des cas.

Strathcona[modifier | modifier le code]

Sous la forme d’un module d'extension (en anglais : plugin) Eclipse, Strathcona[3] est un outil qui aide le développeur a utiliser les méthodes d’une structure logicielle (en anglais : framework) en utilisant le contexte de son code source. Le répertoire d’exemple est extrait automatiquement des applications existantes utilisant le framework. Le développeur n'a pas besoin d’apprendre un nouveau langage de requête. Lorsque le développeur fait une requête d’exemple, l’outil extrait le contexte structurel du code sur lequel le développeur travail. L’outil analyse alors les exemples stockés et sélectionne l’exemple à retourner en utilisant un ensemble d'heuristiques de correspondance structurel.

Recherche sur forum de question/réponse[modifier | modifier le code]

Parmi les moyens actuels pour un développeur de découvrir l'utilisation d'une méthode ou d'une interface de programmation se trouve la recherche de l'élément à découvrir via un moteur de recherche qui redirige souvent sur des forums de question/réponse (ex: Stack Overflow) où les utilisateurs auront donnés des informations sur sa bonne utilisation.

QECK[modifier | modifier le code]

QECK[4], extension de requêtes basées sur la culture populaire pour la recherche de code (en anglais : Query Expansion Based on Crowd Knowledge for Code Search), est un outil qui propose d'améliorer les performances de la recherche de code. Il retourne des couples de questions réponses extraient de Stack Overflow.

Il génère de manière automatique l'extension de la requête grâce à un système de retour pseudo-pertinant (en anglais : Pseudo Relevance Feedback) qui ajoute des éléments de codes à la requête.

L'efficacité de l'extension a été évaluée grâce à trois expériences qui avaient pour vocation de répondre aux questions suivantes : "Est-ce que QECK améliore la performance des algorithmes de recherches ?", "Comment les paramètres modifies les performances ?" et "Est-ce que le mode de recherche de QECK est meilleurs que celui de l'état de l'art au moment de l'évaluation ?". De ces études, les résultats suivants sont ressortis : les algorithmes sont amélioré jusqu'à 64% en terme de précision, et 35% en gain cumulatif attendu normalisé (NDCG); les algorithmes ont le défaut d'avoir trop de mots parasites (non utile pour la requête) et finalement QECK est sensiblement meilleurs que les autres algorithmes d'amélioration en 2016.

Prompter[modifier | modifier le code]

Prompter[5] est un module d'extension Eclipse qui, lorsque le développeur code son application, Prompter étudie le contexte de celle-ci et notifie le développeur à chaque fois qu'il trouve un échange questions/réponses correspondant.

La notification est accompagnée d'un niveau de confiance du plugin quant au degré de confiance sur l'intérêt par rapport au contexte. Le développeur est libre de cliquer sur cette notification pour afficher l'échange correspondant pour l'aider.

Si les notifications ne lui suffisent pas, le développeur peut aussi préciser via une requête ce qu'il recherche.

L'évaluation de Prompter s'est fait au travers de 2 expériences :

  • Évaluation de la justesse du système de recommandation auprès des développeurs
  • Évaluation générale auprès des développeurs

La première expérience montre que les résultats de l'outil sont, de manière général, jugés comme utiles par les développeurs.

La seconde expériences montre que durant des maintenances et des tâches de développement, il aide les développeurs.

Recherche sur le code d'une interface de programmation[modifier | modifier le code]

Certaines interfaces de programmation sont documentées par des exemples de code qui permettent de comprendre comment utiliser simplement une méthode donnée. Bien que ces exemples soient très utiles, il peut-être pénible pour un développeur de les rédiger, de plus elles peuvent être incomplètes, pas à jour, ou non représentatives des pratiques actuelles. C'est pour cela que plusieurs outils veulent générer automatiquement des exemple d'usage des méthodes d'une interface de programmation.

MAPO : récupérer et recommander les patrons d'utilisation pour les interfaces de programmation[modifier | modifier le code]

MAPO[6][7], est basé sur 3 parties :

  • La stratégie d’extraction : c’est un analyseur de code et un ensemble de stratégies pour extraire des informations sur les usages des méthodes d’une interface de programmation à partir d’exemples.
  • La technique de minage : c’est une technique qui mine des modèles d’usage à partir des informations extraites dans la stratégie d'extraction, en utilisant une application de partitionnement de données.
  • Le mécanisme de recommandation : c’est un outil permettant de recommander un modèles d’usage d'une méthode de l’interface de programmation, avec un extrait de code associé.

Résumer les exemples d'utilisation d'interface de programmation[modifier | modifier le code]

C'est un algorithme[8] qui génère automatiquement des exemple d’usages d’une interface de programmation. L’algorithme se base sur une classe et une librairie de programmes utilisant cette classe. Il extrait des modèles d’usage abstraits pour la classe et les formatent dans une forme utilisable dans une documentation.

Exemple pour la classe BufferedReader :

Code d'exemple fournis dans la documentation du JDK, version 6 :

BufferedReader in = new BufferedReader(new FileReader("foo.in")

Code d'exemple générer par l'outil :

FileReader f; //initialized previously
BufferedReader br = new BufferedReader(f);
while(br.ready()) {
    String line = br.readLine();
    //do something with line
}
br.close();

Les noms des variables, “f” et “br”,sont choisis en fonction des noms les plus couramment utilisés, et les commentaires sont présents pour indiquer les endroits qui sont à implémenter par le développeur.

Cette solution se veut une amélioration des précédents travaux (notamment MAPO), qui présentaient des exemples complexes et difficiles à comprendre.

Une étude réalisée sur 150 développeurs, montre que 82% du temps, les exemples générés par l'algorithme sont aussi bons que de la documentation rédigé par un humain. Et dans 94% du temps, ils sont meilleurs que les exemples fournis par les outils de recherche de code.

UP-Miner[modifier | modifier le code]

UP-Miner[9], modèle d'utilisation d'une méthode d'une interface de programmation (en anglais : USage Pattern Liner of API methods), est un outil qui recherche des exemples d'usage d'une interface de programmation dans du code source. Il implémente l'algorithme BIDE (Extension BI-Directionnel) pour trouver des invocations fréquentes et proches d'une méthodes d'une interface.

A partir d'une méthode d'une interface, UP-Miner peut automatiquement rechercher tous les modèles d'utilisation, et retourner un exemple qui peut être réutilisé par le développeur.

Il se veut différent des autres outils de recherche de modèles, qui utilisent des représentations de programme compliqués, comme les diagrammes de flux de données.

L'évaluation de l'outil sur des développeurs montre que UP-Miner est efficace pour les aider a utiliser une interface de programmation. Aussi, l'outil réduit la moyenne de modèle redondant à 11.92% (comparé aux 51.12% de MAPO).

Références[modifier | modifier le code]

Bibliographie[modifier | modifier le code]

(en) L. Nie, H. Jiang, Z. Ren, Z. Sun et X. Li, « Query Expansion Based on Crowd Knowledge for Code Search », IEEE Transactions on Services Computing, vol. 9, no 5,‎ , p. 771-783 (ISSN 1939-1374, DOI 10.1109/TSC.2016.2560165)
(en) Shaunak Chatterjee, Sudeep Juvekar et Koyshik Sen, « SNIFF : A Search Engine for Java Using Free-Form Queries », Fundamental Approaches to Software Engineering, vol. 5503,‎ , p. 385-400 (DOI 10.1007/978-3-642-00593-0_26)
(en) L. Moreno, G. Bavota, M. Di Penta, R. Oliveto et A. Marcus, « How Can I Use This Method ? », IEEE Transactions on Services Computing, vol. 1,‎ , p. 880-890 (DOI 10.1109/ICSE.2015.98)
(en) Luca Ponzanelli, Gabriele Bavota, Massimiliano Di Penta, Rocco Oliveto et Michele Lanza, « Mining StackOverflow to turn the IDE into a self-confident programming prompter », MSR 2014 Proceedings of the 11th Working Conference on Mining Software Repositories,‎ , p. 102-111 (ISBN 978-1-4503-2863-0, DOI 10.1145/2597073.2597077)
(en) Hao Zhong, Tao Xie, Lu Zhang, Jian Pei et Hong Mei, « MAPO: Mining and Recommending API Usage Patterns », ECOOP 2009 – Object-Oriented Programming, vol. 5653,‎ , p. 318-343 (ISBN 978-3-642-03012-3 978-3-642-03013-0[à vérifier : ISBN invalide], DOI 10.1007/978-3-642-03013-0_15)
(en) Tao Xie et Jian Pei, « MAPO: mining API usages from open source repositories », MSR '06 Proceedings of the 2006 international workshop on Mining software repositories,‎ , p. 54 (ISBN 978-1-59593-397-3, DOI 10.1145/1137983.1137997)
(en) Raymond P. L. Buse et Westley Weimer, « Synthesizing API usage examples », IEEE Transactions on Services Computing,‎ , p. 782-792 (ISBN 978-1-4673-1066-6 978-1-4673-1067-3[à vérifier : ISBN invalide], DOI 10.1109/ICSE.2012.6227140)
(en) Reid Holmes et Gail C. Murphy, « Using Structural Context to Recommend Source Code Examples », ICSE '05 Proceedings of the 27th international conference on Software engineering,‎ , p. 117-125 (ISBN 1-58113-963-2, DOI 10.1145/1062455.1062491)

(en) Jue Wang, Yingnong Dang, Hongyu Zhang, Kai Chen, Tao Xie et Dongmei Zhang, « Mining Succinct and High-Coverage API Usage Patterns from Source Code », Mining Software Repositories (MSR), 2013 10th IEEE Working Conference on,‎ , p. 319-328 (ISBN 978-1-4673-2936-1 978-1-4799-0345-0[à vérifier : ISBN invalide], DOI 10.1109/MSR.2013.6624045)