David Madore's WebLog: Ce qui m'insupporte avec les applications open source

Index of all entries / Index de toutes les entréesXML (RSS 1.0) • Recent comments / Commentaires récents

Entry #1584 [older|newer] / Entrée #1584 [précédente|suivante]:

(jeudi)

Ce qui m'insupporte avec les applications open source

J'ai reçu une nouvelle machine au bureau ; jusqu'à présent j'utilisais mon portable personnel, mais à peine âgé de 2½ ans c'est déjà un vieillard : le voilà donc remplacé par un Core 2 Quad (enfin, un Core 2 Duo pour l'instant parce que Dell a fait une erreur en livrant le mauvais processeur) avec 8Go de RAM qui m'offre un environnement de travail un peu plus confortable (par exemple j'ai pu y compiler Sage — mais je digresse). Bref, j'ai décidé d'y installer une Ubuntu (mais peu importe, ce que je vais dire s'appliquerait à n'importe quelle distribution Linux), et j'ai gagné le droit de batailler contre la configuration : comme d'habitude, obtenir un système qui est à 99% comme on voudrait prend cinq minutes, passer à 99.9% prend cinq jours, et passer à 100% prendrait l'éternité.

Une des doctrines (je cherche ici à traduire le mot anglais tenet) de l'open source, et aussi d'une certaine manière d'Unix, et spécifiquement des distributions Linux, c'est qu'on doit avoir plein de petits programmes qui sont comme les morceaux d'un puzzle et que ces morceaux s'assemblent pour former un système utile. Malheureusement, il y a plusieurs problèmes avec ça :

Premièrement, il arrive que le même morceau soit écrit de plusieurs façons différentes par plusieurs personnes indépendantes ; il arrive aussi qu'un morceau soit écrit, puis abandonné (rendu obsolète) à la faveur d'un autre mieux écrit ; ou encore, que deux morceaux fassent des choses semblables mais en fait différentes (et pas forcément incompatible) ; tout cela est très bien. Le problème, c'est qu'on manque complètent de carte pour expliquer comment les morceaux s'arrangent, du coup on est perdu dans un labyrinthe de petits programmes tous semblables dont les rapports entre eux ne sont expliqués nulle part.

Voici un exemple : il y a (au moins !) deux systèmes complètement différents d'économie d'écran dans une distribution Linux standard : le X screensaver et le Gnome screensaver (et peut-être aussi un analogue du côté de KDE) ; chacun de ces deux systèmes d'économie d'écran vient avec plusieurs dizaines d'économiseurs d'écrans (c'est-à-dire d'animations qu'on peut, concrètement, avoir sur l'écran), certains étant d'ailleurs communs aux deux, et par ailleurs les deux font appel à une même capacité sous-jacente du serveur X à éteindre l'écran. Bien sûr, les auteurs du Gnome screensaver prétendent que le X screensaver est obsolète et ceux du X screensaver prétendent que le Gnome screensaver est mauvais pour d'autres raisons. Les réglages du X screensaver et ceux du Gnome screensaver sont semblables mais subtilement différents. Il est tout à fait possible de ne pas savoir lequel on utilise, voire d'utiliser malencontreusement les deux à la fois (qui vont plus ou moins se marcher sur les pieds). Du coup, quand un utilisateur novice demandera de l'aide à un utilisateur un peu moins novice mais néanmoins ignorant de l'existence de deux systèmes différents d'économie d'écran, cela peut donner des jolis dialogues de sourds. Personnellement, j'ai compris l'existence des deux trucs quand j'ai essayé de régler mon X screensaver en utilisant les réglages du Gnome screensaver ce qui, évidemment, ne marchait pas, sans afficher le moindre message d'erreur compréhensible ; de même, je ne comprenais pas pourquoi mon poussinet avait une liste assez différent d'économiseurs d'écran que la mienne. Tout ceci réjouit immensément le Club Contexte mais pas forcément les utilisateurs. Personnellement, je n'ai rien contre l'existence de deux systèmes différents, à condition que chacun signale l'existence de l'autre et explique qu'il est différent sur tel ou tel point et dans quelle mesure ils sont compatibles, comment savoir lequel on utilise, etc.

Un autre exemple : pour placer l'ordinateur en sommeil (suspend-to-RAM) ou en hibernation (suspend-to-disk), il existe tout un tas de mécanismes : le noyau a des capacités dans ce sens (écrire mem ou disk dans /sys/power/state), mais il existe aussi des choses telles que uswsusp, hibernate, pm-utils, gnome-power-manager et j'en oublie certainement. Comment savoir ce qui dépend de quoi, ce qui remplace quoi, ce qui sert à quoi, ce qui obsolète quoi, et ce qui peut servir en supplément à quoi ? Les documentations vous diront toutes qu'il s'agit d'un truc pour placer l'ordinateur en sommeil ou en hibernation, pas comment le truc en question se relie aux autres trucs qui prétendent servir à la même chose. En fait, il s'avère que uswsusp est une sorte de béquille au code du noyau qui lui permet de faire marcher plus de configurations en reconnaissant des besoins spécifiques à certains périphériques, que hibernate (Linux-spécifique et peut-être obsolète) et pm-utils (plus général) sont des collections de scripts censés travailler à plus haut niveau et font appels soit au noyau soit à uswsusp s'il existe, et que gnome-power-manager est sans doute une interface graphique à pm-utils (comme il en existe forcément aussi dans KDE) ; mais cela, on ne peut l'apprendre qu'en passant des heures à essayer de démêler les fils — car chercher un des noms dans Google ne vous aidera pas à trouver le rapport avec les autres. Résultat, si vous avez un problème dans le suspend, vous ne savez pas qui incriminer, vous ne savez pas contre quel package envoyer un rapport de bug, vous ne savez pas où chercher des logs, vous ne savez pas si vous pouvez essayer un autre programme ou si le composant en question est le seul qui remplisse sa fonction. C'est un cauchemar.

Mais le pire de tout, c'est probablement les mécanismes d'impression. Là vous devez à la fois choisir le spooler (ou front end) d'impression (par exemple CUPS, qui est d'ailleurs une horreur) qui sert à dispatcher les jobs d'impression et le driver (ou back end) qui sert à convertir les jobs au format compris par l'imprimante. Du côté du spooler, il y a plein de morceaux qui s'emboîtent de façon très compliquée et nulle part expliquée (CUPS, par exemple, est un serveur, donc il y a des clients qui vont avec, mais aussi des clients CUPS qui font semblant d'être des clients LPR ce qui fait que vous ne comprendrez pas si vous aurez besoin de ça si vous utilisez CUPS et pas LPR). Du côté du driver, c'est encore pire, parce qu'il y a toujours Ghostscript qui intervient d'une façon ou d'une autre, mais il en existe des versions patchées, il en existe de nombreux drivers proprement dits, et évidemment il y a un nuage de scripts autour de tout ça et des fichiers PPD dont on ne sait jamais s'ils décrivent l'imprimante ou le driver ou autre chose. Pour compliquer le tout, il existe des sortes de méta-drivers comme Gutenprint ou GIMP-print (peut-être certains sont-ils obsolètes mais, justement, c'est impossible à savoir). Et il existe un métasblurgh qui englobe tout ça à la fois et qui s'appelle Foomatic. Si votre imprimante ne marche pas, vous n'aurez aucune chance de savoir si la faute en est à Foomatic, Gutenprint, GIMP-print, Ghostscript, un des drivers de celui-ci, ou CUPS ou autre chose ; et si vous interagissez avec des machines Windows, ajoutes Samba à l'affaire (pour Mac OS, par contre, c'est aussi du CUPS). Je ne reproche pas l'existence de cette multiplicité de systèmes, je reproche que les auteurs des différentes parties (ou personne, en fait) ne prennent pas le soin d'expliquer comment elles se connectent aux autres. Il y a un embryon d'explication sur linuxprinting.org, mais ce n'est qu'un embryon.

Évidemment, parfois les choses marchent toutes seules (et les distributions Linux font tout pour que ce soit le cas). Parfois ça ne marche pas. Ce n'est pas mon reproche. Mon reproche est que quand les choses ne marchent pas, c'est quasiment impossible de savoir à qui on a affaire.

Là je parlais avant tout des soucis liés à la multiplicité des éléments qui font la même chose, même si dans le cas de l'impression ça tire aussi sur le problème de la multiplicité des éléments qui s'emboîtent de façon incompréhensible. Un problème différent mais apparenté est celui de la multiplicité des éléments non documentés qui parlent entre eux de façon trop automagique.

Un exemple archétypique serait Gnome (ou KDE, mais je connais mieux Gnome, pas forcément que j'aime beaucoup plus). Gnome est un environnement graphique pensé pour être aussi convivial pour le débutant que les environnements proposés par Microsoft Windows ou Mac OS. Du coup, il faut qu'il y ait toutes sortes de de programmes et de démons qui fassent des choses magiques qui ne sont pas trop prévues par l'esprit ancestral d'Unix. Par exemple, quand on insère une clé USB, le noyau Linux va le dire (via le système de fichiers /sys et/ou via une socket netlink) à un démon appelé udev qui va lui-même le dire à un démon appelé hal et ensuite, en passant le message par l'intermédiaire d'un autre démon appelé dbus, toutes sortes de choses magiques vont se passer par les différentes couches de Gnome. L'ennui, c'est que si on ne veut pas que toute cette magie se passe (par exemple, si pour une raison quelconque je ne veux pas que mon ordinateur monte automatiquement les clés USB qu'on insère dedans), c'est très difficile : il faut comprendre par où elle passe pour pouvoir l'arrêter. Les rois mages udev, hal et dbus ont tellement envahi tout le fonctionnement de Linux qu'on ne peut plus se passer de les comprendre, et ils sont très complexes, mais au moins il faut admettre qu'il en existe des documentations au moins de certains aspects (et assez rébarbatives, il faut le dire), par exemple pour ce qui est de hal. La magie qui se déroule dans les entrailles de Gnome, en revanche, elle n'est expliquée nulle part, pas plus qu'une partie importante de son terrifiant mécanisme de configuration (qu'on peut naviguer avec gconf-editor).

Un autre exemple est toute la sauce des GNU autotools, dans les compilations : quand la compilation marche bien, on est content, mais si jamais quelque chose échoue, allez fouiller dans un Makefile généré à partir d'un Makefile.in lui-même généré à partir d'un Makefile.am pour comprendre d'où sortait la ligne de commande erronée et comment lui faire comprendre de passer telle option en plus au compilateur !

C'est très décevant pour les gens comme moi qui connaissent bien Unix de constater à quel point ces mécanismes pour faire de la magie deviennent sans arrêt plus complexes et moins bien documentés. Certes ils font des choses utiles, quand ils marchent ; mais quand on veut faire quelque chose qui les dépasse ou simplement quand ils cassent, on se rend compte qu'il n'y a aucune documentation, aucun log d'erreur, et que le source est labyrinthique (il n'est souvent même pas évident de savoir de quoi il faut chercher le source, d'ailleurs).

En plus, si on gagne en complexité, on ne gagne pas toujours en flexibilité : souvent, au prétexte qu'il faut que tel ou tel aspect du programme soit configurable par les utilisateurs novices, donc par une interface graphique simple, on se retrouve avec des outils extrêmement peu configurables. (Je pense notamment au gestionnaire de fenêtres de Gnome, Metacity, qui a remplacé le plus flexible Sawfish : j'ai l'impression qu'on ne peut même pas avoir deux racourcis clavier qui fassent le même effet, chose qui peut être souhaitable dans certains cas, sous prétexte qu'il faut que les utilisateurs novices puissent éditer leurs racourcis clavier avec une interface très simple où chaque action est associée à un racourci et un seul. Ainsi, si on veut avoir le eye candy moderne de Metacity ou Compiz, on est obligé de se passer de la puissance et de la flexibilité d'un Sawfish ou même Fvwm : c'est vraiment triste.)

Il y a cependant un programme auquel je tire mon chapeau, parce qu'il a réussi à combiner le meilleur de tout : à la fois très simple pour le novice et très puissant pour l'expert, constitué de milliers de composantes, extensible, et pourtant remarquablement bien documenté (ce ne fut pas toujours le cas, mais maintenant il est vraiment bon de ce côté-là), c'est Firefox.

↑Entry #1584 [older|newer] / ↑Entrée #1584 [précédente|suivante]

Recent entries / Entrées récentesIndex of all entries / Index de toutes les entrées