Dim 23 février 2025
Cet article a été inspiré par une discussion sur Mastodon initiée par @annso@framapiaf.org
Au commencement, il y a un amoncellement de données moches. Un gloubiboulga mal rangé, déstructuré, dans un format peu pratique ou périmé. Avec des scories, du bruit, du chaos, du déchet. Ça peut prendre la forme d'un unique fichier, mais c'est plus généralement une soupe d'octets aux origines plus ou moins douteuses. Les noms des fichiers ne veulent rien dire. Il manque des colonnes par-ci, dont les valeurs sont retrouvables ailleurs, dans un fichier structuré différemment. Ou bien cette information précieuse, celle qui donnerait un sens à tout cela est cachée, ailleurs sur la toile, planquée derrière une API.
Mais dans ce fouillis, il y a forcément un chemin vers la lumière. Ces données ne sont pas inutiles. Elles sont simplement, pour le moment, inutilisables.
Alors une personne se dresse. Elle voit ce tas de nouilles. Ça ne lui plaît pas. Cette personne veut extraire ces données. Elle veut les ranger, les polir, les agréger, les nettoyer, les rendre exploitables.
Il nous faut une formule alchimique, pour transmuter le plomb en or.
Alors cette personne se munit de ses outils préférés. Pas forcément les outils académiques. Pas forcément les outils adoubés par les instances dirigeantes de sa hiérarchie. Oh certes, tel langage de programmation est validé par le politburo du comité technique, mais… il est inadapté pour cette tâche précise. Il demanderait trop de temps d'industrialisation, trop d'allers-et-retours avec un Architecte en chef. A-t-on vraiment besoin de spécs pour cette tâche ? A-t-on vraiment envie, alors qu'on sait que ce fatras de données ne demande qu'un petit coup de pouce, qu'une étincelle programmatique pour retrouver un sens, un usage ? Nul besoin d'analyser, ticketiser, découper, normifier.
Qui a besoin d'un stratège quand un franc-tireur ferait l'affaire ?
Cette tâche n'est pas une longue campagne de la Guerre contre le chaos. C'est une opération de guérilla.
La personne ouvre son éditeur favori. Elle crée un fichier dans le langage de programmation qui lui donne le plus de satisfaction. Celui auquel elle pense intuitivement, quand il faut résoudre facilement et rapidement un problème de ce genre.
Peu importe l'outil, le langage, l'éditeur de texte, le shell. Nous sommes impatients. Le résultat compte.
Et c'est ainsi que naissent les moulinettes. Quand une personne dispose de la bonne boîte à outils, quand elle perçoit un obstacle à sa portée, elle sait qu'une moulinette peut résoudre son problème.
Le nom de la moulinette est simple, factuel. C'est un résumé de ce qu'elle doit faire. Ce n'est pas un nom de produit, de projet. Pas besoin de marketing. La moulinette n'a rien à vendre. S'il faut transmogrifier des fichiers CSV en JSON, elle s'appellera transmogrify-csv-to-json
.
La moulinette n'est pas faite pour traiter un petit volume de données. Pour ça, on ne s'embête pas, on le fait à la main. La moulinette prend tout son sens quand ça serait trop pénible de transformer la ratatouille à l'aide de "copier-coller" et de "chercher-remplacer".
La moulinette ne doit pas faire qu'un seul tour. Une moulinette, c'est fait pour mouliner.
Une moulinette, ce n'est pas non plus un one-liner. Pour ça, on n'a pas besoin de script. On n'a pas besoin de se creuser les méninges, de faire appel à une logique, un algorithme, un enchaînement non-linéaire de commandes. Si la personne face aux données hétérogènes peut faire son nettoyage en une ligne de shell, elle fera cette ligne de shell, fais-lui confiance. Et si c'est le cas, il y a de grandes chances que cette ligne de shell existe déjà sur un disque dur, quelque part. Ce n'est pas notre sujet. Nous ne nous intéressons pas à ces proto-moulinettes. Nous voyons un peu plus loin.
La moulinette, c'est de l'artisanat. Une moulinette est dédiée à une tâche précise. Certes, la personne qui doit écrire la moulinette aura certainement dans ses cartons des bribes de code d'une autre moulinette qu'elle pourra utiliser, ici ou là. Une routine pour ouvrir des fichiers d'un certain type, ou pour convertir une date d'un format à un autre. Un machin qui sait changer l'encodage ISO-8859-15
en UTF8
sans perdre son Latin. Un jeu de fonctions pour ouvrir un fichier ODT et en extraire ses méta-données.
Mais on reste quand même sur une moulinette spécifique. Adaptée à la situation. Et qu'on ne l'oublie pas : une moulinette, c'est l'outil adapté pour certaines situations. Tout ne résout pas par une moulinette. La moulinette est humble, elle sait ce qu'elle sait faire et bien. Mais elle sait aussi qu'elle restera dans l'ombre, qu'elle ne sera jamais exposée aux utilisateurs finaux. Peut-être même que des pans entier de la population ne sauront jamais que s'ils accèdent enfin au portail trucmuche point com, après 48h d'attente, c'est grâce à une modeste moulinette.
N'en déplaise aux puristes, la moulinette sera écrite sans tests. Pas de TDD, même si, ça et là, la personne qui écrit la moulinette ne pourra pas s'empêcher d'écrire une fonction et des tests à côté, vite fait. Mais on ne va pas brancher de CI sur ce script. Non. On doit aller vite. On fait vite et bien.
Ça ne veut pas dire qu'on ne teste pas. Une fois qu'une ébauche de la moulinette est prête, la personne qui l'a écrite va la lancer une première fois, pour voir. La moulinette ouvre les fichiers qui sont dans le dossier source
et écrit dans un dossier target
.
Le premier jet est rarement le bon. Au début, on cible les données les plus faciles à lire. Les cas généraux, les fichiers les plus pertinents. Mais bien sûr, si on lance la moulinette sur toutes les sources de données, on tombe sur un os. Un champ trop long, une valeur manquante, une faute de frappe. On l'a dit. Cette mixture est impure. Si elle avait été bien organisée, aurait-on eu besoin de moulinette ?
Mais par petites touches, la moulinette prend forme, elle s'améliore, commence à produire une ébauche de résultat. Elle ne chute plus sur les imperfections des données. Plus on mouline la moulinette, plus elle bonifie ce qu'elle produit. Elle tourne de plus en plus vite, sur des volumes de plus en plus grands.
Puis, au bout de plusieurs dizaines d'itérations, la moulinette n'a plus besoin de mouliner. Nous sommes enfin satisfaits. Le dossier "target
" est renommé en transmogrified-csv-to-json-YYYY-MM-DD
. Puis il est compressé en .zip
ou .tgz
.
Nul besoin de revue de code. Nous sommes sûrs de nous. Il ne peut pas y avoir de bug. La moulinette est infaillible.
Toutes les moulinettes sont infaillibles.
Satisfaite, la personne qui a écrit la moulinette peut l'archiver quelque part. Au cas où.
Inlassablement, on écrit tous les jours de nouvelles moulinettes, parce qu'il n'y aura jamais d'outil universel capable de ranger cet Himalaya de données improbables, ce capharnaüm de zéros et de uns.
Dans l'ombre, les moulinettes tiennent en équilibre le monde numérique.