Journal
Technique4 min de lecture

Un bac à sable garni vaut mieux qu'une copie de la production

Tout notre environnement local est un Postgres embarqué dans le processus, qui démarre à vide, applique les vraies migrations et se remplit d'un faux salon convaincant. Aucun identifiant de production sur les portables, aucune donnée client réelle dans les captures d'écran, et une démo qui ne périme jamais.

LTL'équipe technique de Bookatu

Il y a un moment dans la vie de chaque petite équipe où quelqu'un propose de faire pointer le développement local sur une copie de la base de production, parce que les fausses données paraissent maigres et que les vrais bugs ne se produisent qu'avec de vrais enregistrements. C'est une idée tentante avec une longue traîne de regrets : des identifiants qui se répandent sur les portables, des noms de clients dans les captures d'écran, une tâche d'e-mails de test qui trouve un jour de vraies adresses. Nous avons pris l'autre chemin et nous ne sommes jamais revenus en arrière.

Un Postgres entier dans le processus

Les versions embarquées de Postgres sont devenues vraiment bonnes. Notre application décide au démarrage : s'il existe de vrais identifiants de base dans l'environnement, elle utilise la base hébergée ; s'ils sont vides, elle lance un Postgres dans le processus, stocké dans un dossier local. Les machines de développement n'ont tout simplement jamais les identifiants, si bien que le pire scénario d'un portable mal configuré est une base vide toute neuve, et non un incident de production.

js
// Choose the database at runtime. Blank env = embedded, local, harmless.function makeDb() {  const url = process.env.DATABASE_URL;  if (url) return connectHosted(url);  // In-process Postgres persisted to a local folder  const client = new EmbeddedPostgres('./.pgdata');  return drizzle(client, { schema });}

Le chemin de reconstruction compte autant que le moteur. Nous recréons la base locale en appliquant les mêmes fichiers de migration que la production a joués, dans l'ordre, depuis le premier. Cette seule décision a attrapé gratuitement toute une famille de bugs : une migration qui supposait une colonne venant d'un fichier plus tardif, un changement de schéma qui marchait sur un instantané périmé mais pas depuis zéro. Si le portable n'arrive pas à construire le schéma depuis l'historique, le prochain déploiement n'y arriverait pas non plus.

Garnissez une activité, pas des lignes

Ce qui sépare de fausses données inutiles de fausses données utiles, c'est le récit. Notre script de remplissage n'insère pas dix utilisateurs appelés test. Il crée un salon avec un nom, une équipe avec ses spécialités, des prestations avec des prix et des durées honnêtes, des clients avec un historique de visites, des rendez-vous à venir, des produits en rayon avec leurs niveaux de stock et un journal derrière eux. Les pages ont l'air habitées, ce qui veut dire que les bugs de mise en page, les états vides et les troncatures maladroites apparaissent comme ils apparaîtraient pour un vrai client.

Un tableau de bord de réservation rempli de données d'exemple : chiffre d'affaires, rendez-vous et activité des clients
Tout ce qui est dans cette capture est de la fiction. C'est exactement ce qui la rend publiable.

Cette dernière propriété est facile à sous-estimer. Chaque capture d'écran de notre documentation, de notre blog et de nos rapports de bug vient du bac à sable garni. Personne n'a à plisser les yeux devant une image en se demandant si un nom de client s'y est glissé, parce qu'il n'y a aucun nom de client à glisser. Le processus d'anonymisation le plus sûr, c'est de n'avoir rien à anonymiser.

Ce qu'il faut réussir

  • Faites du chemin sûr le chemin par défaut. Les développeurs devraient avoir à faire un détour pour atteindre les vraies données, et non pour les éviter.
  • Neutralisez aussi les effets de bord : les clés d'e-mail, de paiement et de stockage restent vides en local, si bien qu'une boucle sur les clients de test ne peut jamais écrire à une vraie personne.
  • Garnissez les états que vous redoutez : le compte tout neuf, la journée complète, le produit en rupture, le client venu une seule fois il y a des années.
  • Gardez le script de remplissage dans la relecture de code. Quand une fonctionnalité ajoute une table, le script grandit avec elle, sinon le bac à sable pourrit en silence.

Le bénéfice se cumule. Les nouveaux arrivants lancent deux commandes et disposent d'une activité qui tourne, avec de quoi fouiller. Le contrôle visuel peut photographier chaque page sans revue de confidentialité. Et l'environnement de démonstration est toujours à cinq minutes d'être impeccable, parce qu'impeccable n'est qu'une reconstruction plus loin.

Les données de production répondent aux questions. Les données de test permettent de les poser sans risque.

environnement de développement localdonnées de démarragepostgres embarquéconfidentialité des données de testexpérience développeur
Envie de mettre tout ça en pratique ?

Bookatu vous donne une page de réservation à votre image, des acomptes, des abonnements, des cartes cadeaux et des rappels, avec 0 % de commission sur vos réservations.

Commencer gratuitement