THESE
présentée par
Jean Marie FAVRE
pour obtenir le titre de
Docteur de l’Université Joseph Fourier - Grenoble I
(arrêtés ministeriels du 5 juillet 1984 et du 30 mars 1992)
Spécialité : Informatique
Une approche pour la maintenance et
la ré-ingénierie globale des logiciels
date de soutenance : 26 octobre 1995
Composition du Jury :
J.P. Verjus
K. Bennett
J. Estublier
G. Kahn
S. Krakowiak
A. Van Lamsweerde
Thèse préparée au sein
du Laboratoire de Génie Informatique - Institut Imagà Carolina et à notre famille❤
❤
❤
Je tiens vivement à remercier les membres du jury pour m’avoir fait l’honneur d’y participer et
pour le temps qu’ils ont consacrés à cette thèse malgré leurs emplois du temps souvent
surchargés :
Monsieur Jean-Pierre Verjus, Professeur à l’Institut National Polytechnique de Grenoble,
Directeur de l’Institut de Mathématique Appliquée de Grenoble (IMAG), Directeur de l’INRIA
Rhône-Alpes, pour m’avoir fait l’honneur de présider le jury de cette thèse.
Monsieur Keith Bennett, Professeur à l’université de Durham, Directeur du Laboratoire pour la
Maintenance à Durham, Editeur du journal international “Software Maintenance”, pour son
accueil à Durham le mois dernier, pour avoir lu en détails cette thèse bien qu’elle soit écrite dans
la langue de Molière et pour être venu d’Angleterre malgré un calendrier bien chargé.
Monsieur Gilles Kahn, Directeur de recherche INRIA, Directeur Scientifique de l’INRIA France,
et Monsieur Axel Van Lamsweerde, Professeur à l’Université Catholique de Louvain (Belgique),
éditeur du journal international “Transactions on Software Engineering and Methodology” pour
avoir consacré de leur temps à rapporter sur ce travail et pour les remarques qu’ils m’ont faites.
Monsieur Jacky Estublier, Directeur de cette thèse, Directeur de recherche CNRS, Directeur de
l’équipe ADELE, pour m’avoir accueilli dans son équipe et pour m’avoir toujours fait confiance.
Je tiens également à lui témoigner ma reconnaissance pour m’avoir permis de travailler dans
d’aussi bonnes conditions.
Monsieur Sacha Krakowiak, Professeur à l’Université Joseph Fourier, Co-directeur du projet
Guide et de l’unité de recherche Bull-Imag, pour m’avoir accueilli en stage, il y a déjà bien
longtemps, dans le projet Guide, et pour l’honneur qu’il me fait aujourd’hui de participer à ce
jury.
Je voudrais aussi remercier tous les membres de l’équipe ADELE qui, de deux personnes lors de
mon arrivée, est passée à plus d’une dizaine aujourd’hui. Tous m’ont permis d’une manière ou
d’une autre de travailler dans la joie et la bonne humeur...
Je tiens aussi à remercier les membres de la escuela de computaciòn qui m’ont si bien accueilli
lors de mon séjour à l’Universidad Central de Venezuela en tant que coopérant. Je garde un très
bon souvenir de ces deux années et de l’accueil exceptionnel qui m’a été fait.
Finalement, ou plutôt avant tout, je tiens à remercier ma famille pour sa patiente et son soutient
inconditionnel ainsi que Carolina pour son courage et son amour .
A tous, merci !!!Introduction
Alors que l’informatique est résolument tournée vers l’avenir, cette thèse se concentre sur le
passé ; non pas par nostalgie mais plutôt parce que le futur des logiciels âgés est une
question d’actualité.
I.1 Contexte
Présentons tout d’abord le contexte général, puis le contexte spécifique.
I.1.1 Contexte général : maintenance, programmation globale et ré-ingénierie
Trop souvent recherche et industrie s’opposent, tout comme théorie et pratique, comprendre et
faire, développer et maintenir, etc.
Cette thèse se réclame comme faisant partie du Génie Logiciel et à ce titre ces oppositions
devraient plutôt être vues comme des complémentarités. En effet, le génie logiciel, comme toute
discipline d’ingénierie, est la rencontre entre la science et l’industrie [Shaw90]. Cette définition
marque la direction à suivre, même si l’on a parfois tendance à l’oublier.
Le génie logiciel est en effet une discipline très large. Selon que l’on se place dans un milieu
académique ou un milieu industriel, sa signification est susceptible de changer. Pour certains ce
terme fait référence à des méthodes abstraites qu’il est aujourd’hui impossible d’appliquer en
pratique. Pour d’autres, il fait référence à des pratiques éloignées de tout fondement scientifique.
Quoi qu’il en soit ces deux visions ne sont que les extrêmes d’un spectre voué à être équilibré.
Cette thèse retient trois thèmes du génie logiciel : la maintenance, la programmation globale et la
ré-ingénierie. Ces thèmes correspondent à des préoccupations industrielles particulièrement
importantes et pourtant elles sont souvent regardées avec dédain dans le monde académique. Cette
tendance est sans doute liée au fait que les notions et les concepts sous-jacents sont
particulièrement flous. Mais n’est ce pas justement parce qu’il y a des problèmes que l’on doit
chercher des solutions? En fait, ces trois thèmes correspondent en eux même à des oppositions.
12
La maintenance s’oppose au développement.
Bien que les problèmes qu’elle pose soient très importants, pendant longtemps ils ont tout
simplement été ignorés. Bien qu’aujourd’hui la situation se soit améliorée, la maintenance reste
l’une des principales zones d’ombre du génie logiciel. Maintenance et rapiéçage sont encore trop
souvent associés dans la réalité.
En génie logiciel, presque tous les efforts pour diminuer les coûts de la maintenance consistent à
améliorer la qualité des logiciels développés. Cette approche est indispensable. Pourtant elle est
loin d’être suffisante : (1) Tout au long de la maintenance, les modifications successives du
logiciel détériore sa qualité initiale. (2) La notion même de qualité évolue dans le temps, tout
comme la technologie. (3) Améliorer la qualité des logiciels lors du développement n’est valable
que pour le futur ; le problème de la maintenance consiste à considérer le passé et le présent.
La programmation globale s’oppose à la programmation détaillée.
Dès le début de l’informatique, ce sont les notions de la programmation détaillée qui ont été
étudiées : les algorithmes et les structures de données. Après plus de 5 décennies, cette discipline
a acquis un niveau de maturité important. Dans ce domaine des théories sont parfois utilisées. Il
est par exemple possible de décrire formellement la sémantique d’un langage de programmation.
Au contraire la programmation globale est basée sur des notions floues. On parle de versions, de
configurations et d’objets dérivés, sans pour autant que les concepts associés soient toujours les
mêmes ; en tout cas ils ne sont que rarement définis formellement. Il est vrai que ce thème a reçu
bien peu d’attention par rapport à la programmation détaillée : ce n’est qu’au cours de la dernière
décennie que des recherches actives y ont été consacrées.
Aujourd’hui de nombreux systèmes de programmation globale voient le jour. Pourtant les
fondements sur lesquels ceux-ci sont basés ne sont pas toujours très clairs. Dans ces conditions
comparer et évaluer ces différents systèmes est difficile. Dans bien des cas, l’apparition d’un
nouveau système correspond plus à des variations de surface qu’à des améliorations de fond.
Cette situation pourrait être comparée, dans le domaine de la programmation détaillée, à la
prolifération de nouveaux langages de programmation dans les années 60. Par contre, dans ce
dernier cas, ces apparitions ont étés suivies par un processus de classification et de rationalisation.
Remarquons finalement que dans le domaine de la programmation globale, l’état de la pratique
est encore dominé par l’utilisation de techniques rudimentaires conçues dans les années 70.
La ré-ingénierie est liée à la différence entre l’état de l’art et l’état de la pratique. Il s’agit d’une
approche pour diminuer le coût de la maintenance. Comme son nom l’indique, l’idée sous jacente
est de “refaire” en utilisant des méthodes et des techniques (plus) adaptées. Refaire, non
seulement parce que quelque chose a été mal fait, mais aussi parce que la manière de faire a
changé. En fait la ré-ingénierie est un support pour l’évolution des logiciels existants mais peut
être vue aussi comme un moyen facilitant le transfert de technologie.
La rétro-ingénierie est l’une des composantes de la ré-ingénierie. Comme son nom le suggère, il
s’agit de “faire les choses à l’envers”. Une telle approche est contestable dans bien des cas ; mais
elle peut aussi être utile. Les fonctionnalités offertes par les logiciels âgés ont souvent été affinées
au cours de longues années et il peut être préférable d’examiner le logiciel existant que de faire
une nouvelle analyse des besoins.
La ré-ingénierie s’est surtout intéressée à la programmation détaillée. Par contre son intersection
avec la programmation globale est quasi-inexplorée.3
I.1.2 Contexte spécifique : maintenance en présence de préprocesseurs
Le point de départ de cette thèse est plus spécifique. Nous nous intéressons aux problèmes posés
par l’utilisation de préprocesseurs dans le domaine de la programmation globale et de son rapport
avec la maintenance et la ré-ingénierie. Le cas du préprocesseur CPP est plus particulièrement
étudié.
CPP est le préprocesseur du langage C. Pour les chercheurs il s’agit d’un outil dépassé et pourtant
il est cité dans de nombreux articles... Pour beaucoup de programmeurs il s’agit d’un outil du
passé mais aussi du présent ; dans le futur, il risque d’être encore présent... L’utilisation extensive
et excessive des préprocesseurs rend les programmes impossibles à lire ; pourtant ils sont utilisés
pour écrire de grands volumes de code... L’utilisation des préprocesseurs rend la maintenance
difficile et pourtant ils sont largement utilisés par les chargés de maintenance... La présence des
préprocesseurs est un problème pour les programmeurs, les chargés de maintenance, les
constructeurs d’outils et pourtant ils sont toujours là... Malgré les problèmes occasionnés par les
préprocesseurs, aucun support ne leur est dédié...
Ces paradoxes forment le contexte spécifique de cette thèse. Ce contexte s’insère parfaitement
dans le contexte général: les préprocesseurs sont typiquement utilisés pour résoudre les
problèmes de programmation globale (problème d’architecture, de variation, etc.). C’est
essentiellement dans le cadre de la maintenance qu’ils sont utilisés et qu’ils posent des difficultés.
De nombreux logiciels âgés utilisent de tels outils et le problème de leur ré-ingénierie se pose.
Bien que le cas particulier des préprocesseurs ait été le point de départ de ce travail, ce n’est
aujourd’hui que l’illustration d’un discours bien plus général.
I.2 Objectifs
Les oppositions et les paradoxes présentés ci-dessus donnent lieu à différents objectifs.
I.2.1 Objectifs généraux
Trois objectifs généraux sont poursuivis :
O1 Montrer que la maintenance, la programmation globale et la ré-ingénierie sont des thèmes
dignes d’intérêt, autant pour la recherche que pour l’industrie.
L’effort doit se porter surtout du côté de la recherche : tout au long de la préparation de la
thèse, l’expérience nous a montré que les préoccupations qui nous animaient étaient souvent
bien éloignées de celles d’autres chercheurs en génie logiciel. Insister sur la problématique
et la justifier a été un passage obligé à chaque présentation de nos travaux. Bien souvent cela
revient à combattre les préjugés négatifs associés à la maintenance ; car finalement, si
depuis des décennies la maintenance est une zone sombre du génie logiciel, c’est entre autre
parce qu’elle est accompagnée d’un manque d’intérêt généralisé.
O2 Clarifier les relations entre maintenance, programmation globale et ré-ingénierie.
Expliquer clairement ce que recouvre chaque domaine et les relations qui les lient est
important pour leur développement.4
O3 Favoriser un processus de rationalisation dans le domaine de la programmation globale.
Dans le domaine de la programmation détaillée, l’apparition d’un grand nombre de langages
a été suivie par un processus de rationalisation. Aujourd’hui on dispose de certains critères
pour comparer et classer les langages de programmation. Ceux-ci sont fondés sur des bases
théoriques et concevoir un nouveau langage est une activité d’ingénierie dans le sens propre
du terme.
Pourquoi ne pas essayer d’atteindre le même degré de maturité dans le domaine
programmation globale ? Conceptualiser et formaliser devient un objectif primordial dans
ce domaine; même si c’est un objectif à long terme. Nous chercherons plus
particulièrement à montrer que bien que la pratique de la programmation globale se
caractérise par des échafaudages de systèmes hétérogènes, ceux-ci sont basés sur un
nombre limité de concepts.
O4 Définir et explorer le thème de la ré-ingénierie globale.
L’intersection entre la programmation globale et la ré-ingénierie est un thème peu étudié.
Présenter les concepts sous-jacents est l’un de nos objectifs.
Ces objectifs sont aussi généraux que difficiles à atteindre. O1 est très subjectif. Bien qu’il ne
1corresponde pas à une démarche habituelle dans une thèse , il nous a semblé important qu’il y
figure. O2 et O4 sont difficiles à atteindre car les domaines mis en jeu sont plutôt flous.
Finalement O3 est un objectif à long terme et notre travail ne constitue qu’un pas dans cette
direction. Les deux tiers de cette thèse sont consacrés à ces 4 objectifs.
I.2.2 Objectifs spécifiques
Le reste de la thèse est consacré à deux objectifs particuliers :
O5 Etudier le rôle des préprocesseurs et montrer qu’il s’agit d’un thème digne d’intérêt.
Si paradoxe il y a dans l’utilisation des préprocesseurs, il est naturel d’en chercher les
causes. La deuxième partie de cet objectif est un sous-ensemble réduit de O1. Montrer
qu’un préprocesseur peut être un sujet de recherche actuel représente l’un des défis de cette
thèse.
O6 Faciliter la maintenance et la ré-ingénierie de programmes utilisant des préprocesseurs.
Cet objectif est une réponse naturelle au dernier paradoxe présenté en I.1.2 (”Bien que les
préprocesseurs posent des problèmes de maintenance, ils ne bénéficient d’aucun support...”)
Ces objectifs forment le point de départ de ce travail, ils ne sont que cependant l’argument d’une
approche plus générale.
1. Souvent une thèse a pour but de résoudre un problème particulier dans un domaine donné. Justifier l’importance de la
problématique du domaine est souvent moindre.