Le rôle pris par les techniques informatiques dans la sphère politique et sociale les ont placées sur le devant de la scène médiatique. On lit ainsi beaucoup de choses sur “les algorithmes”, auxquels on prête constamment de nouvelles facultés qui paraissent illimitées. Si la notion d’algorithme est vaste, elle n’en a pas moins un sens, et renvoie à certaines réalités bien définies, au-delà desquelles le terme n’est plus approprié.
Il se trouve que j’ai achevé récemment la (quasi-)lecture de l’ouvrage collectif de 1995 Histoire d’algorithmes : du caillou à la puce signalé par Arthur Charpentier et téléchargeable sur le web. (Quand je dis “achevé”, je confesse que je n’ai pas parcouru minutieusement la totalité des près de 600 pages de l’ouvrage qui retracent les démonstrations mathématiques et reproduisent de nombreux extraits des auteurs étudiés. Je m’attendais à lire quelque chose sur l’histoire de l’algorithmique au XXe siècle, qui n’est abordée que rapidement au dernier chapitre).
Il ressort de l’ouvrage une définition antérieure à l’essor de l’informatique : celle de l’algorithme comme méthode de calcul, façon de faire formalisée et partageable en mathématiques. Le livre détaille ainsi, les façons de calculer ayant existé historiquement, de :
- multiplications et divisions
- carrés magiques
- équations à une ou plusieurs inconnues
- règles de trois
- pi, circonférence du cercle et quadrature
- racines carrées
- nombres premiers
- équations linéaires
- interpolations
- équations différentielles
- etc.
Il montre également qu’il existe plusieurs façons de calculer : exactement ou par approximation.
Ces façons de calculer sont décrites en langage naturel (grec, arabe, italien…) par des auteurs bien connus comme Euclide, Archimède, Fibonacci, Leibniz, Descartes, Newton… et d’autres moins connus. Par exemple, voici le début du texte d’Euclide sur la méthode de calcul du plus petit diviseur commun :
“Deux nombres inégaux étant proposés, le plus petit étant retiré du plus grand, si le reste ne mesure celui qui est avant lui que lorsqu’on a pris l’unité, les nombres proposés sont premiers entr’eux.
Soient les deux nombres inégaux ΑΒ, ΓΔ ; que le plus petit étant toujours retranché du plus grand, le nombre restant ne mesure celui qui est avant lui que lorsque l’on a pris l’unité ; je dis que les nombres ΑΒ, ΓΔ sont premiers entr’eux, c’est-à-dire que l’unité seule les mesure.”
On est donc bien loin d’un formalisme mathématique ou informatique, même si le texte n’est pas très fluide en première lecture car très précis.
En ce sens on a pu comparer un algorithme à une “recette de cuisine”, c’est-à-dire la description d’une série d’opérations permettant d’arriver à un certain résultat défini au départ. C’est là une acception peu exigeante d’algorithme, qui n’est pas inexacte mais peut conduire à une mauvaise compréhension de ce que le terme désigne en général.
La notion d’algorithme a en effet évolué avec l’avènement de l’informatique d’abord théorique puis de l’informatique tout court.
L’ouvrage cité plus haut propose ainsi la définition suivante :
1. L’algorithme doit pouvoir être écrit dans un langage, c’est-à-dire un ensemble de mots écrits à partir d’un alphabet.
2. La question posée est déterminée par une donnée, appelée entrée, pour laquelle l’algorithme sera exécuté.
3. L’algorithme est un processus qui s’exécute étape par étape.
4. L’action à chaque étape est strictement déterminée par l’algorithme, l’entrée et les résultats obtenus dans les étapes précédentes.
5. La réponse (sortie) est clairement spécifiée.
6. L’exécution se termine en un nombre finie d’étapes.
Pour le dire un peu plus succinctement, un algorithme informatique est la description non ambiguë dans un langage formel (un langage de programmation) d’une suite finie et ordonnée d’étapes qui, à partir de données en entrée, livre des données en sortie en un temps fini, en vue d’un objectif prédéterminé.
Un point important pour bien comprendre les implications de cette définition est qu’un algorithme ne fait qu’exécuter les tâches que vous avez décrites, a priori beaucoup plus rapidement que si vous deviez les exécuter vous-mêmes. C’est son seul intérêt par rapport à un humain : il va très vite, ce qui a pour conséquence de rendre possible des calculs tout à fait inenvisageables avant l’informatique, voire envisageables seulement récemment (car la puissance des machines fait qu’on peut utiliser des algorithmes de plus en plus complexes, qui n’étaient pas possibles avec des ordinateurs d’il y a x ou y années).
J’insiste encore une fois : un algorithme ne fait que ce qu’on lui a dit de faire. Il se réduit même pas cela : il est la description de ce qu’on a dit de faire. Il ne prend pas de décision, il n’agit pas, c’est un outil pour celui qui l’écrit (ou celui qui l’utilisera). Ainsi :
- un algorithme ne manipule pas des gens : ce sont les personnes qui ont écrit l’algorithme qui essaient de vous causer du tort ;
- un algorithme ne fait pas de politique : ce sont les gens qui ont écrit l’algorithme qui essaient d’utiliser un outil dans un sens et un but politique ;
- un algorithme ne gouverne pas : ce sont les gens qui ont écrit l’algorithme qui utilisent un outil pour faire plus rapidement des manipulations d’information qui vont les pousser à prendre telle ou telle décision pour des individus ;
- un algorithme ne fait pas de profilage : ce sont les gens qui ont écrit l’algorithme qui font du profilage en utilisant un outil pour faire rapidement les calculs nécessaires au profilage ;
- etc.
Il ne s’agit pas seulement de jouer sur les mots ou les structures grammaticales : à force d’écrire des phrases donc le sujet grammatical est “un algorithme” au lieu de “une personne”, l’idée selon laquelle nous ne contrôlons pas nos outils fait son chemin. Or c’est factuellement faux et idéologiquement dangereux. A force de décrire un algorithme comme un agent autonome, on finit par le croire et par par se désengager de questions très importantes comme la politique, l’éthique, autour desquelles on voudrait déléguer la décision à des algorithmes, c’est-à-dire des suites d’instructions qui ne prennent pas de décisions. C’est une idée persistante dans nos cultures, du golem à la révolte des machines, que nos outils puissent agir par eux-mêmes. Malgré les fantasmes éveillés par la recherche en intelligence artificielle, nous sommes encore tout à fait incapables de construire des programmes qui se comporteraient comme des agents autonomes, c’est-à-dire qui agiraient différemment de ce que décrit une suite d’instructions du fait qu’ils posséderaient une forme de libre arbitre.
Jusqu’à preuve du contraire, seuls les humains (et peut-être des animaux, mais on ne va pas rentrer dans ce débat) disposent d’un libre arbitre et sont capable de décider, agir, vouloir, penser… toutes ces choses que les algorithmes ne font pas mais grâce auxquelles nous en sommes venus à être capable d’écrire des algorithmes et de les faire fonctionner.
Le débat éthique pour déterminer ce que les algorithmes devraient faire ou ne pas faire occulte les enjeux autours d’un autre point de leur définition : la question du formalisme, c’est-à-dire de la forme que prennent nos instructions pour être exécutables par la machine. Pour le dire simplement il faut rendre les choses “binaire”, dire “c’est ça ou pas”, ou alors décrire précisément sous quelles modalités cela peut être un peu des deux (avec des pourcentages par exemple, auquel cas il faut décrire comme ce pourcentage est calculé). C’est sur ce moment que s’opèrent des décisions qui vont avoir un effet chaque fois que l’algorithme est exécuté. C’est là par exemple que sont définis les mécanismes de catégorisation, dans le cas d’un algorithme dont la fonction est de déterminer la catégorie d’une donnée. On décide ainsi combien il y a de catégories, comment elles peuvent être calculées, si une donnée peut appartenir à une ou plusieurs catégories, s’il y a des degrés d’appartenance à une catégorie… Si l’on songe que ces catégories, qui seront calculées par l’algorithme, peuvent être déterminantes pour des individus, comme “éligible”/”pas éligible”, “autorisé”/”interdit”, “possible”/”impossible”, alors on peut prendre toute la mesure des décisions qui sont prises en amont de l’exécution de l’algorithme, dans sa conception.
Un algorithme n’est jamais parfait, il est le fruit d’arbitrages et de négociations avec ce que l’on croit préférable (et éventuellement de facteurs plus triviaux comme le temps ou le budget dont l’on dispose, la bonne foi dont on fait montre…). Le code qui décrit l’algorithme est le résultat du travail par lequel, à un moment donné, on propose une solution à un problème. D’autres solutions sont possibles, peut-être meilleures sous certains aspects, moins bonnes sous d’autres, occasionnellement idéales ou catastrophiques. C’est là que se font les arbitrages et les décisions dont les conséquences se manifesteront chaque fois que l’algorithme est exécuté ou utilisé.
Il est donc essentiel de garder la trace de ces arbitrages et décisions pris au moment de la conception. Un algorithme n’est pas neutre, il a une odeur : il est conçu avec un objectif déterminé, dans un contexte particulier, et représente la somme des adaptations plus ou moins importantes à ce contexte. Aussi réutiliser un algorithme existant suppose non seulement de comprendre sa finalité, de se replonger dans sa conception, mais de prendre en compte la façon dont le code répond à cette finalité.
Comme les livres, ce ne sont pas les algorithmes qui peuvent être dangereux : il faut veiller sur ceux qui les écrivent, ceux qui les commandent et ceux qui s’en emparent.
Update : suite de la discussion chez Oranadoz, dans l’article et les commentaire