Comment lutter contre l’entropie ?
Introduction
Que cela votre chambre ou votre base de code, toute chose est soumise à l’entropie : nous allons toujours de l’ordre vers le désordre. Cela dit, il existe un certain nombre d’outils et stratégies pour limiter et contrôler ce phénomène. Passons-les en revue au travers de problèmes concrets.
Mais que fait le back-end ?!
Ne vous est-il jamais arrivé de vous retrouver bloqué par le back-end car vous ne saviez pas quel était le format de réponse attendu ? Ou même, de ne pas avoir de documentation du tout et de devoir regarder le code vous-même pour comprendre certaines incohérences ? Parfois, lorsque vous codez sur les deux fronts, il vous est probablement aussi déjà arrivé de mettre à jour une interface d’un côté et d’oublier de le faire de l’autre.
Une méthode pour remédier à ces problèmes est d’adopter une méthodologie de travail basée sur le contrat [Contract-First Development].
Le principe est le suivant : au lieu de commencer à coder à partir des demandes du client puis de générer (lorsqu’on y pense, ou de façon automatique) la documentation de l’API, on commence par définir un contrat en collaboration avec tous les membres de l’équipe, puis, à partir de cette base qui deviendra la source de vérité unique pour la structure de l’API, les développements pourront commencer.
Voici un exemple concret et quelques outils pour mettre en place cette méthode de travail :
- Définition de l’API : la première chose à faire est de rédiger votre contrat. Celui-ci est conventionnellement rédigé en suivant la spécification OpenAPI. Vous pouvez au choix retrousser vos manches et l’écrire au format JSON (le format YAML est beaucoup plus pénible à écrire et peut vous causer des coucis) ou bien utiliser un outil externe pour faciliter le processus. Il existe une quantité importante d’outils graphiques (cf :GUI editors) ainsi que d’autres solutions comme TypeSpec pour générer votre contrat ; à vous de tester et de voir ce qui vous convient le mieux.
- Données factices et générations :
comme la forme des données a été discutée et formalisée,
il est maintenant possible pour l’équipe front-end de
travailler avec des données factices en attendant le
back-end. Une façon efficace de faire est d’utiliser une
bibliothèque comme MSW pour
intercepter les requêtes, et en conjonction Faker pour générer les données factices (ne sous-estimez pas
cet outil : rédiger de telles données à la main est laborieux
et la mise à jour de ces dernières prend également du temps).
L’avantage d’avoir commencé par rédiger votre contrat avec
OpenAPI est que vous pouvez même vous dispenser de l’effort
de rédiger le code pour générer les données factices en utilisant
des générateurs. Ces derniers vous permettent,
en donnant en entrée un fichier OpenAPI (au format .jsonou.yaml) de générer automatiquement tout un tas de choses utiles comme les types et DTO de vos objets, de la documentation, des données factices et même vos fonctions pour appeler votre back-end si vous utilisez TanStack Query. Il en existe à ma connaissance trois principaux :- openapi-generator : probablement le générateur le plus connu.
- swagger-codegen : le générateur officiel par SmartBear. Nécessite java pour le faire fonctionner.
- Kubb : un projet qui ne semble pas aussi connu que les deux autres précédemment cités, mais dont le nombre important de plugins en fait un outil à considérer sérieusement.
- Partage du contrat : vous avez
votre contrat et même généré des utilitaires au moyen de
clui-ci ; comment le partager aux différents membres de
l’équipe à présent ? Deux choix principaux :
-
Si vous travaillez dans un monorepo, vous pouvez utiliser le système de workspaces (disponible sur pnpm, bun et npm) et placer votre contrat dans un dossier
shared. - Vous pouvez créer un dépôt séparé pour gérer votre contrat et ensuite publier sur le registre de votre choix (GitLab Package Registry ou npm)
-
Si vous travaillez dans un monorepo, vous pouvez utiliser le système de workspaces (disponible sur pnpm, bun et npm) et placer votre contrat dans un dossier
- Aller plus loin : je n’ai fait que dessiner cette méthodologie dans les grandes lignes, mais il est possible de faire beaucoup plus. Vous pouvez notamment explorer OpenAPI.Tools pour découvrir d’autres outils et fouiller du côté des tests de contrats pour découvrir un autre paradigme de test.
Guerre de formatage
De manière assez surprenante, le formatage et la vérification [linting] du code est souvent un sujet sur lequel les équipes perdent du temps et où peuvent naître des tensions. Combien de sang n’a pas coulé durant l’éternelle guère entre la tabulation et l’espace ?
Prettier et ESLint (respectivement utilisés pour le formatage et la vérification du code) sont les deux outils de référence dans l’écosystème JavaScript pour remédier à ces problèmes.
Ne perdez pas de vue que le problème principal à résoudre
est l’homogénéité du code, c’est
pourquoi la question du meilleur outil
ou formatage ne doit pas entrer en compte.
Assurez-vous
simplement que votre linter ou formateur prenne bien en compte
tous les cas de figure que vous pourrez rencontrer (ce que est
généralement le cas avec le combo ESLint/Prettier, comparé à
d’autres outils comme Biome qui par exemple ne permet pas de formater le code HTML, SCSS
ou Vue au momement où j’écris ces mots).
Une autre question qui arrive est ensuite celle de l’utilisation de ces outils. Comment utiliser Prettier et ESLint de sorte à ce que le code soit toujours vérifié et formaté ? J’y répondrai avec cette maxime que j’estime être vraie, y compris au-delà du développement :
Ne demandez pas aux hommes de faire le bien : empêchez-les de faire le mal.
Ne faites confiance à personne : ni aux utilisateurs, ni aux développeurs, ni à vous-même ! Si vous demandez aux développeurs d’utiliser leurs IDE [environnement de développement], rien ne vous assure que la configuration sera identique sur tous les postes, que tout le monde utilisera le même IDE ou pensera à installer toutes les extensions.
La seule façon d’être assuré de la vérification du formatage et de la vérification du code est de lancer les scripts respectifs à ces outils sur votre pipeline (idéalement lorsque vous faites une demande de fusion).
Pour détecter les erreurs en local plus rapidement, vous
pouvez bien entendu utiliser les outils de votre IDE ou,
après discussion avec les membres de votre équipe, ajouter
des pre-commit hooks pour vérifier votre code à chaque
commit (vous pouvez les mettre en place au choix avec Husky et lint-staged, des outils éprouvés, ou bien lefthook, plus récent mais qui fonctionne bien et qui ne nécessite
pas d’installer lint-staged pour détecter les fichiers
indexés par Git).
Notez cependant que les pre-commit hooks ne remplacent pas la pipeline : comme je l’ai écrit plus haut, vous ne devez faire confiance à personne. Les pre-commit hooks offrent un certain confort de développement en local mais ils peuvent facilement être outrepassés.
Le code CSS est inmaintenable !
Contrairement au code JavaScript qui reçoit toujours un minimum d’attention, le CSS est très souvent négligé et par le fait qu’il ne ne bénificie pas de la sécurité de typage de TypeScript, le code mort est très fréquent, les erreurs faciles à faire et l’ordre difficile à étabir.
Il existe cependant un outil permettant de vérifier votre code CSS de la même manière que votre code JavaScript avec ESLint : stylelint. Voici une liste des plugins et fonctionnalités les plus pratiques :
- stylelint-color-format : homogénéisation du format de la couleur (je recommande le format HSL qui est très pratique pour créer des palettes).
- stylelint-config-idiomatic-order : homogénéisation de l’ordre de vos déclarations de façon idiomatique.
- stylelint-declaration-block-no-ignored-properties : avez-vous déjà vu des conjonctions de
widthavecdisplay: inline? Maintenant vous n’en verrez plus ;-) - Détection des fautes de frappe.
- Ajout de limites pour les sélecteurs.
- stylelint-config-standard : pour étendre la configuration initiale avec quelques éléments supplémentaires.
Il y a des fautes de frappe partout !
Vérifier l’orthographe de votre projet (que cela soit les commentaires, le contenu du README ou le nom de vos variables) est un autre élément qu’il ne faut pas négliger. Un outil de choix pour contrôler ce point est CSpell. Pour plus de commodité, vous pouvez l’utiliser via un plugin ESLint (@cspell/eslint-plugin) et en complément utiliser une extension pour VSCode (Code Spell Checker).
Suppléments
En guise de supplément, voici une liste de quelques plugins ESLint et Prettier que j’apprécie (certains seront peut-être disponible nativement au moment ou vos lisez ces mots) :
- ESLint Airbnb Extended : pour un style de code unifié.
- prettier-plugin-sort-imports : pour trier ses imports.
- eslint-plugin-postcss-modules : pour être prévenu des classes CSS inutilisées dans vos projets utilisant les CSS Modules.
- eslint-plugin-typescript-sort-keys : pour trier les clés de vos interfaces TypeScript.
- eslint-plugin-sort-destructure-keys : pour trier les éléments déstructurés. Très pratique avec React.