1 / 111

Qualité en Développement

Qualité en Développement. Laurent Henocque Enseignant Chercheur ESIL/INFO France http://laurent.henocque.perso.esil.univmed.fr/ mis à jour en Octobre 2008. Licence Creative Commons.

tommy
Download Presentation

Qualité en Développement

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Qualité en Développement Laurent Henocque Enseignant Chercheur ESIL/INFO France http://laurent.henocque.perso.esil.univmed.fr/ mis à jour en Octobre 2008

  2. Licence Creative Commons Cette création est mise à disposition selon le Contrat Paternité-Partage des Conditions Initiales à l'Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-sa/2.0/fr/ ou par courrier postal à Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

  3. Objectifs • Ce cours a pour projet de donner les bases de techniques de travail reconnues comme nécessaires pendant tout le cycle de vie du logiciel, et • d'apprendre les méthodes qui permettent d'affronter systématiquement et de résoudre les problèmes.

  4. Plan • Concepts fondamentaux de qualité logicielle, • notamment les notions de contrats, d'invariants et une discussion sur la notion de test. • Comment l’activité de programmation peut être organisée, dans un objectif de qualité. • Considérations techniques sur la qualité. • Aspects humains (psychologiques notamment)

  5. Qualité en programmation Notions fondamentales

  6. Le contrat • Principe fondamental dans toutes les activités industrielles ou plus généralement économiques, le contrat est aussi un fondement de toutes les étapes de l'élaboration d'un logiciel, de sa spécification jusqu'à son abandon. • Bien sûr, en fonction du point auquel on se situe, la nature et les effets des différents contrats seront variables.

  7. Le contrat • Le contrat garantit une communication sans défaut, par un examen exhaustif de tous les cas nécessaires. Un bon contrat lève toute ambiguïté entre ses parties. • Le contrat est un support fondamental de la simplicité des solutions mises en oeuvre pour le respecter. • En effet, il permet de travailler en monde clos, et de ne pas anticiper des évolutions improbables.

  8. Documents contractuels • Réponses aux questions suivantes : • • "quoi" : • quelles sont les fonctionnalités à implanter, • • "comment ": • comment accède t'on à ces fonctionnalités, • • "quand" • quelles sont les limites hors desquelles ces fonctionnalités ne sont pas accessibles (pas implantées). • Ces contrats lient dans tous les cas des "clients" et des "fournisseurs".

  9. Trois niveaux fondamentaux de contrat en informatique • Le plus haut niveau permet la communication entre acheteur du logiciel et prestataire, c'est le cahier des charges (spécification). • Le niveau suivant lie les membres d'une équipe d'informaticiens, c'est la conception. • Enfin, avec la granularité nécessaire, le dernier niveau lie les programmes entre eux.

  10. La spécification : contrat entre client et fournisseur • Le client admet que ses besoins y sont exprimés de façon correcte et complète, et donc accepte d'avance toute solution conforme. • Le prestataire sait de son côté que les solutions qu'il envisage sont réalisables (dans les délais, ceux ci pouvant apparaître comme un besoin dans la spécification).

  11. Vision du développement agile • Une partie importante des projets informatiques est aujourd'hui réalisée en développement agile, en itérant de façon très rapide des prototypes, destinés à recaler le cahier des charges

  12. La conception : contrat liant les membres de l'équipe • La conception décrit de manière détaillée l'ensemble des solutions techniques devant être mises en oeuvre pour implanter ce qui a été spécifié. • Il est formellement impossible de faire plus, ou moins, que ce que la conception a décrit.

  13. Contrat entre programmes • Chaque élément logiciel s'engage sur les points suivants : • quoi : quelle est la fonctionnalité implantée par ce programme. • comment : quelles sont les règles de nommage (noms de fonction, types des arguments, types en général) pour obtenir cette fonctionnalité. • quand : quelles sont les données de base pour lesquelles son fonctionnement est garanti (contraintes de domaine).

  14. Que faire de ce qui sort du contrat? • Supposons qu'on implémente la division réelle • y = f(x,z) = x/z • La valeur z=0 est hors du domaine de définition de la fonction. • float divise(float x, float z){ return x/z;}

  15. Une option

  16. Une autre option

  17. Cas des Exceptions • Les langages de programmation modernes (C++, Java) permettent de gérer les exceptions • Il s'agit d'un mécanisme de contrôle particulier, mais la prise en charge de ces exceptions rentre dans le contrat au sens propre

  18. Les Interfaces de Programmation • Il est d'usage que sur l'ensemble d'un projet, ou sur même sur une gamme de produits, soient définis des guides de style pour la définition des types et des signatures de fonctions et méthodes (y compris leur nommage). • Exemples: • les fonctions du module graphique débutent par "Gr", • les symboles globaux commencent par une lettre capitale, • tous les objets statiques sont en majuscules, • aucun nom de variable n’a moins de six caractères etc…

  19. Principe de l’Utilisateur Parfait

  20. Principe de l'utilisateur parfait • Tout programme s'engage à se comporter comme un utilisateur parfait de ses ressources (les fonctions qu'il appelle), • c'est à dire à ne jamais appeler une fonction dans des conditions qui la mettent hors de son domaine de définition. • Tout programme qui fournit un service au système s'engage à fonctionner correctement lorsque ses éléments de calculs sont valides.

  21. Traduction technique • Aucune fonction ne doit s'attendre à gérer un cas ou un autre élément de programme fournirait des données incorrectes. • Aucune fonction ne doit tester les arguments de son calcul pour leur correction.

  22. Utilisation d'invariants • Un invariant est une propriété logique qui est toujours vraie pendant l'exécution d'une partie d'un programme, • soit un prérequis • (condition sur les données en entrée nécessaire pour le déroulement d’un programme), • soit implicite du fait de la nature du programme • (la définition et la vérification des invariants implicites est un outil de base dans la preuve formelle de programmes).

  23. La macro/instruction « assert » • En C/C++/Java, l’outil de base pour la vérification d’invariants dans les programmes est la macro « assert »

  24. Exemple: definition de 1/x

  25. Compiler en C/C++ • Compiler avec les assertions: • CC -o test test.cc • Compiler sans les assertions: • CC -o test -DNDEBUG test.cc

  26. Test de 1/x

  27. Différents types d'invariants

  28. Invariants de compatibilité système • Ces invariants permettent de valider le respect par l'architecture matérielle et logicielle de conditions nécessaires au programme

  29. Invariants de compatibilité de bibliothèques • On vérifie que les types définis par deux bibliothèques distinctes sont compatibles

  30. Invariants d’étape dans les algorithmes • décrit une condition connue comme devant être vraie en un point d’un algorithme • Par exemple un pointeur non nul à la sortie d'une boucle

  31. Exemple // tab est un tableau d’entiers positifs int Max=-1; int MaxI=-1; for (int i=0; i<N;i++){ assert(tab[i]>=0); if (tab[i]>Max){Max=tab[i];MaxI=i;} } assert(Max>-1); assert(MaxI>=0); assert(MaxI<N); tab[MaxI]--; // toujours valide

  32. Variants de boucle • Un tel invariant s’appelle un « variant » parce qu’il décrit le fait que deux itérations successives d’une boucle modifient la valeur d’une variable de contrôle d’une manière telle que l’on sait que le programme va s’arrêter.

  33. Exemple de variant de boucle

  34. Invariants de classe • Ces invariants décrivent des conditions vraies de toutes les instances d’une classe à tout moment de leur existence compris entre • la fin de leur construction et • le début de leur destruction

  35. Exemple

  36. Finalement, un test c'est quoi?

  37. Exemple • Par exemple, imaginons une fonction définie par intervalles sur le domaine des nombres réels strictement positifs: • x≤0 fonction non définie test de domaine • x>0 et x<3 f(x)=1/x test de partie • x≥3 f(x)=1/3 test de partie 1/3 0 3

  38. Principe • Principe des tests de domaine: une fonction qui implante un algorithme ne teste jamais l'appartenance de ses arguments au domaine de définition.

  39. Test de domaines V1 • Ou l’on ne veut surtout pas que le programme s’arrête - combien de temps?

  40. Test de domaines V2 • Ou l’on se dit - lançons une exception, il sera bien à temps plus tard de le capter…

  41. Test de domaines V3 • Où la paresse l’emporte

  42. Test de domaines V4 • On ne teste pas les domaines. On les asserte

  43. Impact sur la performance • Dans de très nombreuses situations, les algorithmes garantissent que les conditions d'appel des fonctions sont satisfaites.

  44. Commentaire final • Les invariants de domaine fournissent une documentation vivante intégrée au programme - utile pour la maintenance • Les tests ne peuvent jamais être enlevés • Si nécessaire, on peut toujours compléter les API avec des versions qui testent

  45. Organisation de l'activité

  46. Compiler et exécuter dès le début de son activité • Les outils de génération de code sont la première aide du programmeur. • compiler aussi tôt que possible, avec tous les fichiers include des bibliothèques que l'on va utiliser. • linker avec les bibliothèques que l'on doit utiliser par la suite. • exécuter le programme de façon à pouvoir le tester.

  47. Sauver le temps • Ne pas programmer de fonctions inutiles. • Communiquer l'information. • Messageries, aide et manuel de référence en ligne, cvs. • Réduire le temps d'accès à l'information. • utilisation d'outils

  48. Sauver le temps • Documenter ses programmes. • Protéger ses programmes. • assert permet de presque totalement supprimer les recours au débugger. • Réduire la charge des machines. • dans des projets importants la progression vers le but s'accompagne d'une montée en charge du système. • A intervalles réguliers , prendre les décisions qui s'imposent pour que la compilation et les tests se fassent en un temps acceptable.

  49. Savoir automatiser • Bien utiliser les outils disponibles pour gagner du temps et des efforts rébarbatifs est fondamental dans l'activité de développement. • La mise en oeuvre d'un automatisme annexe doit prendre un temps négligeable au regard du problème posé (disons que cela se compte en minutes en général).

  50. Exemple: un shell pour l'appel récursif d'une commande dans les sous répertoires

More Related