Christine Solnon
1996/97
``Le logiciel est l'ensemble des programmes, procédés et règles, et éventuellement de la documentation, relatifs au fonctionnement d'un ensemble de traitement de l'information''
(arrêté du 22 déc. 1981)
Autrement dit, et de façon plus générale, un logiciel est un ensemble de programmes informatiques (du code) mais également un certain nombre de documents se rapportant à ces programmes et nécessaires à leur installation, utilisation, développement et maintenance: spécifications, schémas conceptuels, jeux de tests, mode d'emploi, ...
La ``crise du logiciel'' est apparue à la fin des années 60 et provient d'un décalage entre les progrès matériels d'une part et logiciels d'autre part: alors qu'apparaissaient les ordinateurs de la troisième génération, de plus en plus puissants et de moins en moins coûteux, la construction de logiciels restait dans le domaine de l'artisanat et du folklore, où chacun y allait de sa petite recette. De fait, alors que les nouvelles machines rendaient possibles des applications jusqu'alors irréalisables, les méthodes de développement logiciel ne s'appliquaient pas à de grands systèmes:
``Le génie logiciel est l'ensemble des activités de conception et de mise en oeuvre des produits et des procédures tendant à rationaliser la production du logiciel et son suivi''
(arrêté du 30 déc. 83)
Autrement dit, le génie logiciel est ``l'art'' de produire de bons logiciels, au meilleur rapport qualité/prix. Il utilise pour cela des principes d'ingéniérie et comprend des aspects à la fois techniques et non techniques: le génie logiciel est basé sur des méthodologies et des outils qui permettent de formaliser et même d'automatiser partiellement la production de logiciels, mais il est également basé sur des concepts plus informels, et demande des capacités de communication, d'interprétation et d'anticipation. De fait, la ``crise du logiciel'' n'est toujours pas résolue. Le génie logiciel reste un ``art'' qui demande de la part de l'informaticien une bonne formation aux différentes techniques (le ``savoir''), mais également un certain entrainement et de l'expérience (le ``savoir faire'').
Si le génie logiciel est l'art de produire de bons logiciels, il est nécessaire de fixer les critères de qualité d'un logiciel. On peut séparer ces qualités en deux catégories, suivant que l'on regarde le logiciel de l'extérieur ou de l'intérieur:
Ces différentes qualités ne sont pas toujours compatibles ni même réalisables, et il est nécessaire de trouver des compromis. Dans tous les cas, les objectifs de qualité doivent être définis pour chaque logiciel, et la qualité du logiciel doit être controlée par rapport à ces objectifs.
Le processus logiciel désigne l'ensemble des activités nécessaires au développement et à la maintenance d'un logiciel. Il s'agit d'un processus variable (selon le type d'application) et complexe, composé de différentes phases inter-dépendantes.
Afin de tenter de résoudre la crise du logiciel, ce processus a fait l'objet de différentes modélisations. Historiquement, le premier modèle de développement proposé est celui dit ``de la cascade'', au début des années 70. Ce modèle a été assez largement mis en oeuvre, mais on s'est rapidement aperçu qu'il n'est pas toujours approprié. Sa vision simpliste du processus sous-estime le coût des retours en arrière dans le cycle de vie. Ainsi, plusieurs alternatives au modèle de la cascade ont été proposées, basées notamment sur le prototypage et l'assemblage de composants réutilisables.
Paragraphe en cours de construction ...
Paragraphe en cours de construction ...
Le modèle de la cascade est bien adapté au processus logiciel s'il y a peu de retours en arrière. Dans ce modèle, l'élaboration des spécifications est une phase particulièrement critique: les erreurs de spécifications sont généralement détectées au moment des tests, voire au moment de la livraison du logiciel à l'utilisateur. Leur correction nécessite alors de reprendre toutes les phases du processus.
Une difficulté majeure de la phase de spécification provient du fait que les différents partenaires ne parlent généralement pas le même langage:
Une solution, pour vérifier la conformité de la spécification avec les besoins du client, est de construire rapidement un prototype de l'application.
L'intégration d'une phase de prototypage dans le processus logiciel peut s'effectuer de deux façons différentes:
Paragraphe en cours de construction ...
Un AGL (Atelier de Génie Logiciel) ou atelier CASE (Computer Aided Software Engineering) est un logiciel aidant à la réalisation de logiciels. Autrement dit, il s'agit d'un système pour le développement logiciel assisté par ordinateur. Un AGL intègre des outils adaptés aux différentes phases de la production d'un logiciel et facilite la communication et la coordination entre ces différentes phases. Un AGL est basé sur des méthodologies qui formalisent le processus logiciel, et à l'intérieur de ce processus, chacune des phases qui le composent.
Les AGL apportent une réelle solution à certains problèmes du génie logiciel et contribuent nettement à l'amélioration de la productivité et de la qualité du logiciel, notamment en faisant le suivi des différentes phases du processus logiciel et en offrant un cadre cohérent et uniforme de production. Néanmoins, cet enthousiasme doit être modéré: le processus logiciel est encore loin d'être maîtrisé et les différentes formalisations qui en sont proposées font encore l'objet de controverses, et dans tous les cas, sont bien loin d'être totalement automatisables. L'informaticien a encore de belles années de travail devant lui avant d'être supplanté par des AGL...
Les AGL intègrent différents outils d'aide au développement de logiciels, appelés outils CASE: éditeurs de texte (vi, emacs, ...), de diagrammes (TRAMIS VIEW, X-fig, ...), outils de gestion de configuration (make), SGBD, compilateurs, debuggers, outils pour la mise en forme (pretty-printers), la génération de tests, la génération d'interfaces homme-machine, ...
Ces différents outils interviennent lors d'une ou plusieurs phases
du cycle de vie du logiciel: conception (éditeurs de texte, de diagrammes,
...), programmation (éditeurs de texte, compilateurs, pretty printers,
générateurs d'interfaces homme/machine...), mise au point
(debuggers, outils de génération de tests, ...), etc, ...
Certains outils, concernant notament la gestion de configurations, la gestion
de projet, interviennent durant la totalité du processus logiciel.
Un AGL intègre différents outils CASE, de manière à les faire coopérer de façon uniforme. Cette intégration peut (devrait) s'effectuer à trois niveaux:
Un AGL doit prendre en charge la communication de ces données entre les différents outils. Cette intégration peut être simplement physique: tous les outils de l'AGL utilisent un seul format de représentation des données, par exemple des fichiers UNIX, sur une même machine. Cette approche implique que tous les outils de l'AGL connaissent la structure logique (l'organisation) des fichiers qu'ils sont amenés à utiliser: il est nécessaire de normaliser la structure logique des fichiers. L'intégration des données peut se faire également au niveau logique en utilisant un système de gestion des objets qui gère automatiquement les différentes entités et leurs inter-relations (cette approche nécessite la définition des différents types de données manipulées).
Un AGL devrait également gérer la cohérence entre les différentes versions de ces données (gestion de configuration).
On distingue essentiellement deux types d'AGL selon la nature des outils intégrés:
TRAMIS est un environnement de conception qui intègre notamment un éditeur de diagrammes (TRAMIS View), un générateur de prototypes (TRAMIS Dialog), ...
WinDev est un environnement de développement.
Un autre exemple d'environnement de développement est Unix qui intègre différents outils pour la programmation et le test. L'intégration des données est faite par l'intermédiaire des fichiers Unix, la gestion (limitée) de configurations est faite par make...
Certains environnement, plus évolués, sont dédiés à un langage particulier. Il existe par exemple des environnements dédiés à InterLisp, Smalltalk, Loops (l'environnement Loops fonctionne sur une machine dédiée à Loops), Oz ... Ces différents environnements proposent des bibliothèques de composants, une interface graphique, des éditeurs dédiés au langage, des interprètes, debuggers, ... Ces environnements permettent un développement rapide et convivial. En revanche, l'application développée est intégrée dans (et généralement inséparable de) l'environnement, ce qui peut poser des problèmes de portabilité et de coût.
Enfin, il existe des générateurs d'environnements de programmation: Mentor, Gandalf, Synthesizer Generator, ... A partir de la description formelle d'un langage (à l'aide de grammaires attribuées, de la logique), ces différents systèmes génèrent un environnement de programmation dédié au langage, contenant un éditeur dédié au langage, un pretty-printer, un debugger, un interpréteur, ...