|

Écrivez
à AILES ! |

Bugs :
multiples sens
(Laurent Bossavit)
ILLUSTRATIONS |

Retour
vers l'article
(tester et intégrer) |
|
|
Des multiples sens du mot bug

par Laurent
Bossavit
[LBossavit],
[AyeConf]
|
Laurent Bossavit, présenté plus
en détail ici ([LBossavit]), a déjà
été confronté,
en tant que développeur et chef de projet confirmé, à cet insecte nuisible pour tout programme
informatique... le bug.
Mais au fait, est-on sûr de bien savoir de
quoi in parle lorsque l'on emploie ce terme ? Est-ce si
important de bien connaître ce qui se cache derrière ce
terme ?
Si les réponses à ces questions sont « oui » et
« boaf, pas trop, non », vous
devriez lire l'article de Laurent Bossavit, initialement
écrit en anglais - et
publié ici : [AyeConf]
-. Il m'a autorisé à le traduire et le commenter
pour vous.
Mes "remarques" sont en
[italique rouge entre crochets].
Les renseignements essentiels de cet
entretien sont en gras
italique rouge. |
Entomologie
(étude des insectes)
Certains mots nous alarment dès que nous les
entendons, car nous les avons souvent trouvés par le passé au cœur
de certains problèmes ou situations obscures. Un de ces signaux
d'alarme est le mot "bug", c'est-à-dire non un
représentant de l'espèce des Hémiptères, mais bien un de ceux que
l'on trouve dans les programmes informatiques.
[Et pourtant, il n'est pas inutile de rappeler l'origine bien animale
de ce terme "bug" - insecte en anglais - et qui fut, à
l'origine, une mite - "moth" - : cf. illustrations]
Cela ne me dérange pas d'entendre les gens parler
de "bug" - vous m'entendrez souvent parler moi-même de
"bug", lors de situation où je n'ai pas à être précis.
C'est une toute autre histoire lorsque des décisions découlent de ce
dont je parle, car une large part de ce qui importe à un
professionnel du logiciel est lié d'une façon ou d'une autre aux
"bugs". En tant que développeur de programmes, j'ai de
profonds soupçons quant au mot "bug" dans des contextes
professionnels. Je trouve le terme vague et presque sans intérêt
dans la résolution de problème. Pire, j'ai souvent entendu des
personnes employer le mot "bug" dans le seul but de blâmer
ou d'éviter une responsabilité.
Comptes d'une équipe incertaine
J'ai travaillé une fois pour
un famille de programmes que mon employeur avait acquis d'une
compagnie qui se retirait du marché. Je fus consulté rapidement à
l'ouverture des négociations et une des choses que mon patron
mentionna fut la "liste des bugs" du produit, liste qui en
comprenait, appris-je, 200.
Quelques temps passa; les négociations se
conclurent, assistées par une petite équipe de 1 technicien et 1
expert du domaine; l'acquisition se réalisa. Un peu plus tard, mon
patron me demanda de prendre la direction de la partie technique du
projet, afin de "stabiliser" le produit le préparant à un
sérieux effort de vente. Lorsque je m'enquis de la "liste des
bugs", j'entendis qu'elle avait été réduite à 5.
Je ne croyais pas qu'une
petite équipe travaillant sur un produit peu familier pouvait
corriger 200 bugs en 3 semaines. J'étais intrigué et j'ai
investigué un peu plus en profondeur. Il s'avéra que l'équipe
d'acquisition avait passé en revue la liste et en avait ôté tous
les bugs qui ne posait pas un soucis concret pour un client actuel.
Cela explicita un peu les choses : une définition du terme
"bug" qui m'est familière est "un
souci concernant la qualité du produit", ou
encore "un décalage entre les
attentes de l'utilisateur et le comportement réel du programme".
Si personne ne s'en inquiète, ce n'est
pas un bug.
[Laurent Bossavit revient sur la définition
de la qualité dans son interview]
Peu de temps après, au cours d'une conversation
avec mon patron, je fus à nouveau troublé. J'avais erré au travers
du quart de millions de ligne de code C++ que le produit comprenait,
afin de déterminer l'effort requis pour le "stabiliser". Je
n'avais pas aimé de que j'y avais vu : du code-spaghetti, de la
programmation pseudo-orientée-objet, d'immenses redondances entre
modules, et tout un tas de mauvaises choses ["all
manners of Bad Things"]. J'exprimais ces inquiétudes
à mon responsable.
« Ne vous inquiétez pas », me dit-il, « nous savons que la qualité du code est correcte. Après tout, nous n'avons
seulement que 5 bugs connus ». Or, mon responsable était un ancien
programmeur. Pour beaucoup de programmeurs, et le dictionnaire leur
donnent raison, le terme "bug" signifie plus précisément
un défaut ou une erreur dans un programme. Dans beaucoup de cas, cela
signifie un défaut dans leur travail. Bien entendu, d'après
cette définition, "pas de bugs" signifierait "pas de
défauts".
Je pensais, bien sûr, que mes inquiétudes devraient
compter pour quelque chose. D'après la première définition de
"bug" comme étant "un soucis concernant la qualité du
logiciel", tout mes soucis auraient du être un "bug". Mes
objections furent balayées en grande partie sous le prétexte que « dans la mesure où des utilisateurs emploient effectivement le produit et qu'ils
ne se plaignent pas, on peut assumer que sa qualité est correcte ».
[on rejoint là la problématique de la
qualité évoquée par Laurent Bossavit dans son interview:
la qualité est aussi "ce
qui est apprécié par une personne"...]
Ce n'était pas entièrement exact : à une occasion nous
avons été appelé pour résoudre un problème urgent à un site d'un
de nos clients. « Y avait-il un bug ? », demanda mon collègue qui
prit l'appel. L'utilisateur ne le savait pas. Tout ce qu'il savait,
c'est que au démarrage de l'application, cela arrivait à la moitié
de la phase d'initialisation avant de se planter. Nous vînmes sur
site pour enquêter. Il s'avéra que le "bug" était une
version corrompue du fichier dans lequel l'application sauvegardait la
position des fenêtres ouvertes. Une fois restaurée une version
correcte de ce fichier, tout revint à la normal. Nous n'avons pu
faire planter de nouveau l'application.
Une inspection du code concerné ne nous montra pas
de problème évident. En tout cas, aucun problème évident pour
nous. Mes collègues prétendirent qu'il s'agissait d'un "bug
intermittent", plus dur à corriger puisqu'il ne pouvait être
reproduit avec fiabilité. J'étais inquiet du coût potentiellement
élevé en support si jamais un tel incident devait se reproduire
régulièrement, mais en fin de compte, la décision fut de reporter
ce problème à une date indéterminée.
Personne ne semblait se sentir vraiment responsable
- sans doutes avec raison. L'image du terme "bug" évoques
celui de petites créatures rampantes incognito dans les programmes,
au travers des interstices de notre compréhension, une image qui tend
à absoudre le programmeur de la responsabilité des conséquences
d'une programme "buggué". Tant qu'il ou elle a sincèrement
fait l'effort d'ôter tous les "bugs" qu'il ou elle pouvait
trouver, qui peut le ou la blâmer si certains demeurent dans le
produit qui est finalement livré aux utilisateurs ?
Ce qui me fit vraiment réagir, cependant, fut
l'annonce d'un de mes collègue dans un rapport de situation comme
quoi elle avait corrigé un "bug" dont j'étais responsable.
Dans la mesure où ce rapport avait été transmis en copie à mon
patron, l'enquêtais bien entendu plus avant.
Voici ce que je trouva : dans la version originale de
l'application, du code accédait illégalement à un bloc mémoire qui
était libéré par une précédente application. Toutefois, puisque
aucun appel lé à la mémoire n'était fait entre ces 2 appels,
l'accès illégal était passé inaperçu. J'ai récemment modifié
des parties de l'application non liées entre, ce qui a entraîné
comme résultat une opération mémoire faîtes au point crucial.
L'application se plantait maintenant, et n'avait pas planté avant :
cela ne pouvait qu'être que de ma faute.
Qu'y a-t-il dans un mot ?
Dans le contexte d'un projet, beaucoup de
définitions et d'usages différents de "bug" ont fait
surface : soucis concernant la qualité; décalage entre comportement
et spécifications; ou entre comportement et attentes; plantage du
produit pendant l'utilisation; erreurs de programmation; comportement
répréhensible de la part d'un programmeur (moi).
[Rappelons que ce phénomène n'est pas
isolé : cf. illustrations]
Nous avons accepté tacitement ces différentes
interprétations, sans vraiment réaliser à quel point elles avaient
évoluées sur la durée du projet, comment différentes personnes
soutenaient différentes interprétations en même temps, ou dans
quelle mesure ces interprétations s'opposaient l'une à l'autre de
différentes manières.
Je suis complètement en accord avec Von Neumann : « Cela n'a aucun sens d'être précis lorsque vous ne savez même pas de quoi vous
parlez ». Mais cela comporte un corollaire : Si vous savez de quoi vous
parlez, être précis peut rapporter gros.
Comme en toutes choses, cela comporte des compromis:
une précision excessive peut impliquer ses propres risques, comme la
perte de l'attention des gens. Une façon d'envisager les compromis
est de penser en terme de courbe de compromis, comme illustré
ci-dessous : vous devez faire attention aux compromis si vous êtes
proche de la courbe des compromis, et si découvrez que tout gain
résultant d'une augmentation de la précision (moins d'erreurs, moins
de conflits évitables) doit être comparé à une augmentation des
coûts (plus de formations pour les nouveaux embauchés, par exemple).

D'un autre côté, d'après ma propre
expérience; la plupart des équipes ne sont même pas sur la courbe
des compromis. Elles sont dans la zone inférieure, celle où il est
possible d'améliorer la qualité de la communication sans autres
efforts importants supplémentaires.
Une bonne façon d'améliorer la qualité est de
passer un peu de temps au sein de l'équipe à discuter de l'emploi
d'autres termes au sens plus explicite que celui de "bug".
La littérature sur les logiciels en suggère plusieurs, tels que "faute"
["fault"], "échec" ["failure"],
"défaut" ["defect"], "erreur"
["error"],
"problème" ["issue"]. (Évidemment
- et c'est un autre aspect du compromis -, la définition
"exacte" de ces termes est sujet à débat parmi la communauté
informatique. Je ne veux pas apparaître en faveur d'un ensemble de
définition plutôt qu'un autre car cela nécessiterait un tout autre
article.[... et pourtant, vous pouvez lire un
exemple de définition de ces termes ici : Questionnaire
Programmation : Bug (Réponses)]) Avec la terminologie vient des
modèles et des techniques utiles, comme des diagrammes d'effets ["diagrams
of effects"] pour tracer les causes des défauts, or une
"triage des problèmes" ["issue triage"]
afin d'éviter de perdre du temps sur des problèmes mineurs lorsque
plusieurs requièrent notre attention.
Si vous examinez un pile d'appels ["stack
trace"] et pensez vous souvenir d'un endroit dans le
code où vous craignez avoir passé un paramètre nul, vous ne
corrigez pas un "bug". Vous essayez de localiser un défaut ["defect"],
et vous avez un idée quant à son origine. Lorsque je travaille selon
ce mode, les types de phrase que je veux entendre de mes collègues
sont « mon hypothèse est que », « voyons si l'on peut reproduire cet état »,
« ceci élimine cela, donc... », etc. Si l'on trouve que les
interactions avec les collègues programmeurs sont bien plus lentes
car gênées par des phrases vagues ou des raisonnements imprécis,
elles sont bien plus rapides lorsqu'elles sont supportées par un
vocabulaire au champs plus large que le simple terme "bug",
et par des raisonnements basés sur des cas de tests et des
expériences contrôlées.
Même si vous utilisez un terme vague comme
"bug" de façon intentionnelle, par exemple pour désigner
un "soucis concernant la qualité" dans le sens le plus
général du terme, afin de provoquer l'examen approfondi de ces
soucis, vous devriez être vague de façon précise : c'est-à-dire,
soyez sûr que votre définition de "bug" soit connue
explicitement par les participants de votre conversation. Assurez-vous
qu'il est bien entendu qu'aucun blâme ou d'exclusion n'est attaché
à ce terme.
Au minimum, accordez-vous quelques secondes de
réflexion à chaque fois que vous apprêtez à employer le mot
"bug" au boulot, lorsque vous en corrigez un, si vous
écrivez un rapport à propos d'un bug, ou pensez que vous en avez
remarqué dans le code de quelqu'un d'autre. Examinez les possibles
mauvaises interprétations entre vous et vos collègues. Prenez notes
à chaque fois que quelque chose semble clocher, et vous mettrez
bientôt en évidence des façons d'améliorer votre communication.
Dans le projet que j'ai mentionné ci-dessus,
beaucoup d'incompréhensions auraient pu être évitées. Par
exemple, appeler la première "liste de bugs" une liste de
problèmes aurait attiré l'attention sur le fait que tous les items
de la listes étaient là parce que, à un moment donné, un client a
rapporté ce problème à l'équipe de développement. Avec cela à
l'esprit, je n'aurais pas été surpris d'apprendre que certains
problèmes étaient devenus "obsolètes" et qu'il n'y avait
plus aucun intérêt à en conserver la trace.
Si nous avions connus la notion de "module
sans défaut" ["defect-prone
modules"] (et, en conséquence, si nous nous étions
d'accord au préalable sur une définition du mot "défaut"),
mes inquiétudes sur la qualité interne du code n'auraient pas été
ignorées. Les termes "faute" ["fault"],
"échec" ["failure"],
"condition d'échec" ["failure
condition"] auraient pu être
de bon outils pour analyser ce qui se passait concernant les échecs
de nos clients. Un modèle moins simpliste de relation entre
modification du code - y compris des modifications légitimes - et
défauts qui en résultent aurait évité beaucoup de reproches.
Les mots révèlent les cultures
Mon collègue Phlip, un développeur comme moi,
remarque au passage: « Nous savons tous que les bugs sont inhérents à la vie du développement. Notre
boulot est d'écrire du code, trouver les bugs qui s'y trouvent, en faire une
liste et les ôter un par un ». Cela est bien sûr ironique. Cela ne devient
vrai que si nous croyons en "la mort, les impôts et les
bugs" ["death, taxes and
bugs"]. (On ne peut pas faire grand-chose concernant
la mort et les impôts, mais nous savons que les "bugs" sont
dans notre sphère de contrôle)
[Voici quelques compléments sur cette
"culture" cf. illustrations]
Toutes les cultures ont leurs zones d'ombres et
leurs faiblesses, et les plus sérieuses erreurs résultent de telles
zones d'ombres. La seule solution que je connaisse est d'aborder les
cultures en elles-mêmes, avec lucidité, comme des conventions
faîtes par des hommes et que nous avons le pouvoir de changer. [Cela
rejoint l'illustration sur les conventions déjà mentionnées plus
haut]. Si l'on remarque qu'une partie de notre culture, comme un terme
populaire, nous conduit à des erreurs, nous pouvons prendre des
mesures pour effectuer un changement volontaire.
Réfléchissez comment vous et d'autres dans votre
équipe utilisez le mot "bug". Discutez-en. Vous vous
épargnerez beaucoup d'ennuis.
Remerciements Cet article doit
beaucoup aux efforts de la communauté Shape,
et particulièrement Bob Lee, James Ward, James
Bach, Dave Liebreich, Bill Hamaker, Sue Petersen, Dwayne Phillips,
Michael Bolton, Sharon Marsh Roberts, C. Keith Ray, Stephen Norrie,
David Bowles, et Jim Batterson. Ils représentent le parfait
contre-exemple. Tout They are a perfect counterexample to
the old saw about too many cooks spoiling the broth. Any infelicities
left within are entirely mine.
Références
Cf. Quality Software Management
de Jerry Weinberg,
- volume 2, p. 237, pour une discussion concernant la terminologie
des erreurs et défauts des logiciels;
- volume 4, p. 177, pour un exemple de courbe des compromis.
La communauté Shape se trouve ici : http://www.geraldmweinberg.com/shape.html.
"Computer bug" cartoon courtesy of C. Ware,
copyright 1997
|