samedi 6 décembre 2008

L'essence du bug

Communiquer avec une machine, c'est mon activité quotidienne. Et il est des jours que je ne souhaite à personne de vivre. Ces jours où l'entendement s'évanouit dans un brouillard d'incertitude. Ces jours où l'on finit pas croire que l'image n'est pas un modèle de la réalité. Ces jours où l'image ne figure pas une situation possible dans l'espace logique. Ces jours où vous renvoyez le modèle de machine de Turing au rang de fable cybernétique.
Ce jour où vous découvrez votre incapacité à découvrir l'essence de cette ombre qui voile l'objet de vos intentions.

- Si je puis me permettre.
- Faites.
- C'est un bug.
- Vous dites?
- "L'ombre qui voile l'objet de vos intentions", c'est une erreur, une anomalie, une déficience, un dysfonctionnement. En informatique ça s'appelle un bug.

Une erreur? Comment cela est-ce possible? Comment une machine de turing peut-elle se tromper? Une machine peut échouer; elle ne peut pas commettre d'erreur. L'erreur est le fardeau de la liberté. L'erreur est subjective. Je fais une connerie, donc je suis.

- Puis-je à nouveau me permettre?
- Je vous en prie.
- L'erreur, c'est vous qui l'avez commise. C'est votre programme qui est buggé, pas la machine.

Ainsi, Wittgenstein a donc (encore) raison:
En logique, rien n'est accidentel: quand la chose se présente dans un état de choses, c'est que la possibilité de l'état de choses doit déjà être préjugée dans la chose.
Si le programme présente une erreur, c'est que la possibilité de l'erreur doit être préjugée dans le programme.

- Ben, c'est pas ce que j'ai dit.
- ha?
- Pour reprendre vos termes, j'ai dit: "Si le programme présente une erreur, c'est que la possibilité de l'erreur doit être préjugée dans le programmeur".

Alors selon vous, l'erreur se dissimule dans mes idées. Mais alors comment puis-je en prendre conscience? Par quel miracle mes idées sont-elles claires et distinctes lorsque je test et sont-elles obscures et confuses lorsque je développe un programme informatique?

- En test y'a juste à comparer un résultat avec un attendu. C'est juste ou c'est faux. Un point c'est tout.

Le test est une simple démarche empirique où l'expérience montre que les choses sont telles qu'elles doivent être. Tester c'est percevoir et juger: regarder, relever, comparer et vérifier. Un test est un être vrai. Nulle place est faite à l'indéterminé.

- Et le développement c'est le royaume du chaos. Pas la peine d'attendre la phase de codage pour se faire une idée de la débâcle. Dès la phase de spécification on sent très bien le désarroi qui nous attend. Je me demande même si le cycle en V n'est pas une allégorie de la descente aux enfers.

Il est vrai que les phases d'analyse du besoin, de spécification et de conception souffrent des trois défauts qui produisent la confusion:
D'abord, les idées complexes constituées de trop peu d'idées simples.
Deuxièmement: ou ses idées simples sont mêlées sans ordre.
Troisièmement, elles sont inconstantes et indéterminées.
John Locke - Essai sur l'entendement humain.
Et c'est au programmeur que revient la tâche d'interpréter l'obscurité et la confusion en terme de règles logiques. Et de cette interprétation de l'imprécision, du désordre et de l'indétermination naissent les bugs. Le bug est l'essence numérique de la confusion.

jeudi 20 novembre 2008

Langage ou logique de programmation

L'élection du meilleur langage de programmation est sans contestation le sujet favori des informaticiens en herbe. C'est une lutte sans merci que se livrent la communauté JAVA et la tribu C++ pour l'attribution du tant convoité territoire du langage objet. Et que dire de la secte des adorateurs d'ADA qui nient l'existence même de tout langage autre que l'objet de leur culte.
Mais qu'elle est le sens de cette rivalité, quelles sont les qualités de ces langages qui méritent ces querelles de comptoir?
Au commencement est le langage, cette capacité à communiquer au moyen d'un système de signes.
Lorsque je programme, je communique au moyen des signes que m'autorise un langage de programmation.
Mais je communique avec qui? Et que suis-je sensé communiquer avec ces signes?
L'opinion majoritaire prétend que je communique avec une machine, que je lui transmets des ordres. En détournant le propos d'Elizabeth Anscombe, que je donne la description d'une action future adressée à la machine et formulée dans une forme dont la fonction linguistique est de faire faire à la machine ce qui est décrit.
Si j'admets cette définition, je puis donc ordonner à un ascenseur de monter ou descendre au seul moyen d'un langage de programmation.

- ben ouais.
- Si j'écris "monte" en JAVA, il monte.
- heu .. non .. pas vraiment
- Oups c'est vrai, j'oubliais le ";". Va et "monte;".
- Ben, c'est un peu plus compliqué que ça.
- "monte; silteplait;" c'est mieux?
- Laisse tomber. Tu peux pas comprendre.

Si. Je comprends. Le mot "monte" n'appartient pas au lexique du langage JAVA, ni même à celui de C++. Il n'existe pas de langage de programmation dans lequel le signe "monte" ait un sens. Et pourtant les ascenseurs montent.
Un langage de programmation, ce n'est qu'une grosse centaine de signes et une syntaxe d'une ridicule simplicité comparée au langage commun. Alors comment les informaticiens peuvent-t-ils accomplir ce miracle de faire faire monter les ascenseurs par des machines sans jamais énoncer le mot "monte"?

- C'est tout un métier, mon bon monsieur.
- Oui. Mais encore.
- On prie beaucoup.
- Et c'est ça qui fait monter les ascenseurs!
- Non.

Mais alors, qu'est ce?
Et si tout cette histoire de "langage de programmation" n'était qu'un leurre. Et si ce "langage" n'en n'était pas un. Parce qu'à regarder de plus près, que trouve-t-on dans cette chose que l'on nomme "langage de programmation"?
Des connecteurs logiques (if, then, else, and, or, ...) des signes de l'aspect itératif (while, for, ...), des concepts (class, function, ...) quelques verbes (open, read, write, close, ...) et c'est à peu près tout.
Rien qui puisse dénoter, signifier, exprimer. Aucun nom, pas d'adjectif.
On prend trois mots dans un dictionnaire d'anglais, on les estampille "langage de programmation", on met le tout dans une belle boite aux couleurs fluos, et on te vend le paquet au prix du kilo de caviar. Chapeau bas messieurs les commerciaux.
Même les matheux ont des x et des y pour signifier des variables, des a et des b pour signifier des constantes, des A et des B pour les ensembles et ça leur coûte pas un rond.

- Hé, Ho, du calme papy. Faut pas t'énerver. Dans un langage de programmation, y en a aussi des x, des y et même des z.
- Je vous prie d'accepter toutes mes excuses. Je m'emballe, je m'emballe et je fini par ne plus savoir ce que je dis. Alors, il existe x et y en JAVA, disiez vous. Et JAVA en donne quelle description?
- Hein?
- Qu'elle est la signification de x et y dans le langage JAVA?
- Ben, rien en particulier. En général à peu près tout.
- Ah.

Si je comprend bien, x et y n'ont pas d'existence au sein du "langage de programmation" mais au sein d'un langage que j'exprime au moyen d'un "langage de programmation". Ce qu'on appelle "langage de programmation" n'est qu'un langage secondaire comme celui décrit par Bertrand Russell dans "Signification et vérité".
Ce n'est qu'une collection de mots logiques, une logique de programmation en somme.

- Ben si tu le dis.