Quand on code avec les pieds…

OpenSSL est un bon exemple: http://corte.si/posts/code/reading-code.html

Codé à l’ancienne, avec des Goto, une mauvaise indentation, aucune convention de nommage: parfois en camel case, parfois avec des underscores, le nom de la fonction est mal nommée (avoué dans le code source en le commentaire dans l’en-tête). Bref, de la belle merde. Pour participer à ce projet il faut vraiment le vouloir. Déjà quand j’écris des bugfix pour un logiciel dont le style de codage ne me plait pas (en particulier la position des accolades), cela m’insupporte. Moi je code comme ceci:
if (cond) {
    instr...
    
} else {
    instr...
}

certains comme cela:
if (cond)
{
    instr...
}
else
{
    instr...
}

8 lignes au lieu de 6, seulement 2 de plus, mais visuellement je n’aime pas. La raison que je trouve généralement pour le second style est que cela permet de mieux voir quand le code est indenté, mais quand on fouille un peu plus c’est une habitude de la faculté/école où on leur faisait faire ça pour qu’ils se trompent moins. Peut-être car sur du papier il n’y a pas la coloration syntaxique, mais sinon « if » et « else » sont colorés et le code est parfaitement compréhensible. Je dirai même que dans le premier style d’écriture, on distingue mieux les deux blocs de code. Mais bon, chacun ses goûts.

Pour OpenSSL c’est carrément une absence totale de structure et de cohérence. Le mélange camel case et underscore… ça me rappelle PHP, en PHP il y a str_replace() par exemple, qui utilise un underscore, mais strlen(), ou strpos() qui en n’utilise pas (et qui ne sont ni en camel case au passage). Il y a html_ entity_decode() et htmlentities()… pour en voir d’autres c’est ici. Ce n’est pas pratique pour coder mais heureusement qu’un bon éditeur de code propose l’auto-complétion, cela ne supprime toutefois pas l’incohérence et empêche d’écrire une fonction sans douter (sans parfois devoir faire une recherche, ou sans attendre l’auto-complétion).

Puis il y en a qui sont fermé dans une idéologie qu’ils ne remettront jamais en question: que ce soit dans le monde du travail ou open source. Par exemple en javascript, pour créer de nouveaux éléments dans le DOM on peut soit utiliser innerHTML, soit créer les éléments à la main avec createElement(). Il y a des personnes qui s’emmerdent la vie à utiliser createElement() et appendChild() pour former le DOM seulement par principe. Car innerHTML a été mis en place par Microsoft de manière non standard, et c’est du coup souvent déprécié. Leur coté anti-microsoft les poussent à se pourrir la vie alors qu’ils pourraient se la simplifier. A noter que la fonction magique de jQuery, appelé html(), utilise innerHTML

Un récent projet open source que j’ai regardé (jquery.multifile), possède une indentation non uniforme. Parfois des tabulations, parfois des espaces, parfois les deux, parfois un seul espace (pour un niveau d’indentation), parfois plusieurs espaces (toujours pour un niveau d’indentation). Outch, heureusement qu’il existe des programmes pour remettre tout en forme. Par contre, il n’existe aucun programme pour simplifier la logique d’un code source… ce serait trop facile.

L’idéologie, ou les principes, peu importe comment on appelle ça, peut conduire les personnes à faire des choses compliquées… et cela inconsciemment même, je vous laisse imaginer le résultat dans un projet open source, sans vraiment de structure, sans assurance qualité, et ou chacun est libre de faire n’importe quoi. Au final, ça marche… ou pas, les gens en ont marre de patcher OpenSSL et cherchent une alternative: GnuTLS, cryptlib, etc.

homme ou femme ?

L’utilisateur n’est pas administrateur de son système, il doit avoir un compte dessus comme tout le monde: c’est un sous dossier de /home, c’est à dire /home/<username>/. Celui-ci est souvent considéré à tort comme l’équivalent de « Mes documents » de Windows, c’est entièrement faux. Ce dossier que l’on va appeler dossier « home » (qui ne représente donc pas /home mais /home/<username>/) peut contenir plein de choses dont des applications. En fait, libre à soit de s’en servir comme on le souhaite. Sauf si les programmes viennent foutre le bordel dedans… il faut donc une structure minimale imposée.

Dans Windows il y a en équivalent du home, ceci: C:\Documents and Settings\<username>\, avec l’username qui correspond souvent à Administrateur… Dans ce dossier se trouve « Application Data », « Bureau », Cookies, Favoris, Local Settings, Menu Démarrer, Mes documents, Mes documents récents, Modèles, et d’autres dossiers non intéressant. Il y a en gros deux dossiers importants: Mes documents, et Application Data (bien qu’étrangement Local Settings possède également un dossier Application Data avec beaucoup de chose dedans).

Dans linux, c’est le Bronx. A ma connaissance il n’existe pas d’API pour récupérer le dossier des données d’application, un peu comme GetFolderPath() de .NET dont il existe un équivalent pour win32. Sous linux c’est simple, chacun fait à sa sauce, et en général on souhaite masquer les fichiers de configuration à l’utilisateur donc on balance un « . » comme préfixe au fichier, puis on le stock n’importe où. Ce n’importe où c’est généralement simple: dans le home, on ne se fait pas chier sous linux, les « application data » c’est dans le home préfixé d’un point… et cela permet d’utiliser le home comme Mes documents puisque les fichiers de configuration sont cachés.

Mais c’est merdique. On se retrouve avec la racine du home poluée de fichiers de configuration ET de dossiers de configuration. Car si l’application doit stocker plus d’un seul fichier, elle ne s’embête pas et se créer son propre dossier, ou pire, plusieurs fichiers dans le home. Le fait que tout soit dans le home et invisible n’est pas spécialement chiant si on ne se préoccupe pas de ces fichiers. Sauf que dans le home on fait souvent beaucoup de chose, et on liste parfois tous les fichiers, comme tout bon bidouilleurs sous linux: on affiche tous les fichiers, un peu comme sous windows avec l’option « Afficher les fichiers et dossiers cachés ». Ne serait-ce pour savoir si des applications ne font pas n’importe quoi, ou bien pour facilement éditer les fichiers cachés (comme les .htaccess).

L’affichage de tous les fichiers met en évidence l’absence totale de structure. Un début de structure est présent avec un dossier « .config« , et pas mal d’application sauvegardent leur information dedans. Il y a alors une volonté de progrès qui fait plaisir à voir, mais elle ne semble pas partagée par tout le monde: car comme je le dis souvent, sous linux on programme avant tout pour soi-même et on se fou des autres, tant qu’un développeur ne sera pas dérangé par ce foutoir (parce qu’il n’affiche pas tous les fichiers), alors il ne changera rien. Et même des programmes récents n’utilisent toujours pas « .config ».

En fait, il est possible de personnaliser l’affichage par dossier, et par exemple indiquer de ne pas afficher les fichiers cachés d’un dossier précis, mais bien que cela peut être un solution, cela ne fera que masquer la bordel du home, qui comme sous Windows, doit posséder des sous-dossiers, pour les documents mais aussi pour les applications propres à l’utilisateur: une vraie structure est possible et l’est par défaut dans les distributions qui créent des dossiers par défaut dans le home. Il est alors tout à fait logique de mettre fin à cette sale habitude et ainsi tout mettre dans .config. Donc autant faire les choses bien et proposer une API comme Windows ou une variable d’environnement qui correspondrait au dossier de configuration.

Généralement les programmes cross-plateforme font de la merde sous windows. Exemple: Tulip 3.5, il m’a crée un dossier .Tulip-3.5 à la racine du lecteur C… génial. Dans le moins pire, il y a ceux qui le créent à la racine du home utilisateur: C:\Documents and Settings\<username> comme on a pu le voir, au lieu de Application Data. Par exemple yed3 (dossier .yed3), Virtual Box (.VirtualBox) et d’autres (.jmf, .designer, .JxBrowser). Sachant que sous Windows les noms commençant par un ‘.’ n’ont aucune signification particulière, cela peut vite devenir le bordel dans l’arborescence… La faute à qui ?

Toutefois, il existe une variable d’environnement pour définir le dossier de configuration sous linux, mais elle n’est pas spécialement connue, elle fait partie d’un standard de freedesktop. On peut y accéder ici et à première vu j’ai cru que je m’étais trompé de page. Sur cette page, il y a 80% de l’espace dédié au nom des auteurs et leur email, au point que j’ai cru que rien n’était en ligne. Un table of content dont la police est identique à celle du nom des auteurs et au même niveau n’a pas du tout attiré mon attention. Arrivé sur la page, la première fois j’y étais reparti aussi sec.

C’est typique du libre: un manque cruel de communication, d’organisation et d’ergonomie. Et si seulement ce n’était que ça… Du coup on apprend plutot ce genre de chose par du bouche à oreille, j’ai trouvé la page officiel de ce standard grâce à un blog que j’ai trouvé grâce à un commentaire qui critiquait une application qui n’utilisait justement pas ces standards. D’abord, es-ce que les distributions définissent cette variable d’environnement ? Pour ma part, Archlinux le fait mais j’ai quand même un immense bordel dans mon home.

A vrai dire, où aller chercher quand on développe sur linux ? où est la référence ? où est l’API ? d’ailleurs quelle API ? posix ? celle du noyau ? ah c’est éparpillé, c’est un puzzle. Certains donnent glib, mais c’est incomplet. Pour le coup, Windows fait mieux, et j’ai trouvé sans difficulté où sauvegarder des fichiers de configuration sous Windows. Subitement on voit l’intêret du framework Qt (ici avec QDesktopServices::DataLocation, constante sur la même page, et c’est cross-plateforme bien sûr).

C’est encore une entreprise qui sauve linux ? Les développeurs font-ils tout pour pouvoir vendre du service ? Ce problème est parfaitement représentatif du fonctionnement de linux. A coté de cela, il y a une propagande pour dire que linux c’est mieux que tout, que linux est prêt pour le desktop, ou que linux faisait déjà telle fonctionnalité il y a 10 ans déjà… et quand ce n’est pas un troll, c’est alors sans préciser que linux le faisait mal ou à moitié. Avoir une idée c’est bien, la réaliser c’est autre chose, la faire connaître c’est encore une autre histoire.