Aller au contenu principal
Site en cours de refonte — quelques pages peuvent bouger ou évoluer.
04 avril 2026

Le vibe coding, c’est grisant. La maintenance, beaucoup moins.

Le prototype en 2 heures, tout le monde peut y arriver. Le vrai test, c’est la semaine 3, quand ça casse et que tu dois comprendre vite, sans magie.

11 min de lecture
36 vues
réactions
Partager :
Le vibe coding, c’est grisant. La maintenance, beaucoup moins.

Si tu cherches comment faire du vibe coding sans te suicider au debug et à la maintenance, tu es au bon endroit. Le problème n’est pas de générer du code vite. Le problème, c’est le moment où un user clique sur un cas « pas prévu », que ça part en 500, et que tu te rends compte que tu n’as ni contexte, ni logs lisibles, ni garde-fous. Là, tu n’as pas « ship ». Tu as fait une démo.

Ce que je te propose ici, c’est un set de garde-fous simples, réalistes, qui ne cassent pas la vitesse. L’idée n’est pas de transformer ton week-end en projet ISO 9001. L’idée, c’est d’éviter le mur.

Le mur du vibe coding : le premier bug en prod ne ressemble jamais à ton prompt

Le vibe coding marche super bien pour assembler un flux qui « a l’air de » fonctionner. Tu décris l’intention, l’IA te sort une feature complète, tu testes deux clics, tu te dis que c’est bon. Et c’est là que tu te fais piéger. Parce que la réalité, ce n’est pas deux clics. C’est un payload incomplet, un état inattendu, un timeout, une permission manquante, une donnée en double, un user qui spam le bouton, un web hook qui arrive deux fois. Le bug réel est rarement spectaculaire. Il est juste gris, pénible, et il te vole ta journée.

Autre point qui revient beaucoup dans les retours terrain (et qu’on voit aussi dans les discussions no-code/IA) : no-code a des contraintes et des rails. Ça frustre parfois, mais ça évite plein de bêtises. Le vibe coding, lui, te donne surtout de la confiance. Et la confiance sans garde-fous, c’est une dette qui se paie cash.

Fixer un périmètre : ce que l’IA a le droit de toucher (et ce qu’elle ne touche jamais)

Premier réflexe quand tu veux garder de la vitesse sans perdre le contrôle : tu définis un périmètre de modification. Concrètement, tu décides où l’IA peut générer/éditer librement, et où elle n’a pas le droit de mettre les mains sans revue sérieuse. Si tu ne fais pas ça, tu vas te retrouver avec des changements « innocents » qui cassent la sécu, la perf, ou un invariant métier.

Ce qui doit rester stable et très humain, c’est typiquement ce qui a un gros blast radius : auth, permissions, accès DB, billing, intégrations critiques, migrations, tout ce qui touche à la conformité ou aux logs/audit. À l’inverse, tu peux laisser l’IA aller vite sur des zones « à faible risque » : UI non critique, écrans internes, CRUD simple, scripts ponctuels, prototypes isolés. Ce n’est pas une religion, c’est du pragmatisme : tu mets tes efforts de contrôle là où une erreur coûte cher.

Mon conseil très concret : garde une architecture de frontières même minimaliste. Un dossier « core » très peu modifié, un dossier « features » où ça itère vite. Si tout est mélangé, tu vas payer deux fois : au debug et au refacto.

Forcer des sorties structurées : contrats d’API, schémas, types (sinon tu débugges du flou)

Le vibe coding produit facilement du code qui « marche » tant que les données sont gentilles. Dès que ça sort du chemin heureux, c’est le festival des champs optionnels, des formats inconsistants, des erreurs silencieuses, et des conversions implicites. La parade la plus rentable que je connaisse, c’est de forcer des contrats tôt, et de les faire respecter par du code.

Si tu fais une API, même interne, écris un contrat. OpenAPI, JSON Schema, ou au minimum des types TypeScript validés à runtime. Si tu consommes un modèle IA, impose un format de sortie strict. Si tu échanges entre front et back, arrête le « on verra bien ». Parce que ce « on verra bien » devient un incident à 23h.

Exemple volontairement simple : un schéma de réponse pour une route qui renvoie un ticket. L’intérêt n’est pas le schéma en lui-même. L’intérêt, c’est que tu as une vérité unique. Tu peux valider en runtime, logguer proprement quand ça diverge, et écrire des tests qui arrêtent les régressions.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Ticket",
  "type": "object",
  "required": ["id", "status", "createdAt"],
  "properties": {
    "id": {"type": "string"},
    "status": {"type": "string", "enum": ["open", "closed"]},
    "createdAt": {"type": "string", "format": "date-time"},
    "assigneeId": {"type": ["string", "null"]}
  },
  "additionalProperties": false
}

Oui, c’est un peu de boulot. Non, ce n’est pas « du formalisme ». C’est juste une façon d’éviter les bugs les plus cons, ceux où tu passes une heure à comprendre que « closed » est parfois « Close » ou que le champ s’appelle tantôt assignee tantôt assigneeId.

Observabilité obligatoire : logs corrélés, erreurs lisibles, et un minimum de vérité

Quand ça plante, le premier truc que tu veux, c’est répondre à une question bête : « cette requête-là, elle a fait quoi exactement ? ». Or le vibe coding a tendance à sortir des logs anecdotiques, pas actionnables, et souvent non corrélés. Résultat : tu as des lignes de log, mais tu n’as pas d’histoire. Tu n’as pas le film, tu as des captures d’écran.

Le garde-fou ici est simple : un request id partout, propagé du front au back, et loggué systématiquement. Ajoute un user id (ou un id anonymisé), une trace de l’action, et un code d’erreur stable quand ça échoue. Pas besoin d’un APM à 500€ par mois pour faire déjà 80% du job. Mais tu dois pouvoir greffer ensuite des traces et des spans si ça grossit.

Un exemple en Node/TypeScript, minimal, qui fait le taf : on injecte un requestId dans le contexte, on loggue en JSON, et on renvoie ce même id au client. Quand un user te ping, tu n’as pas à jouer à Cluedo.

import { randomUUID } from "crypto";
import type { Request, Response, NextFunction } from "express";

export function requestContext(req: Request, res: Response, next: NextFunction) {
  const requestId = (req.header("x-request-id") ?? randomUUID()).toString();
  (req as any).requestId = requestId;
  res.setHeader("x-request-id", requestId);
  next();
}

export function logInfo(req: Request, message: string, extra: Record<string, unknown> = {}) {
  const payload = {
    level: "info",
    message,
    requestId: (req as any).requestId,
    path: req.path,
    method: req.method,
    ...extra
  };
  console.log(JSON.stringify(payload));
}

Et s’il y a un seul endroit où je mets du « non négociable » : la gestion d’erreurs. Une erreur doit être explicite, logguée avec son contexte, et renvoyer un message côté client qui n’est pas juste « Something went wrong ». Sinon tu vas débugger à l’aveugle, et tu vas finir par « reprompter » au lieu de comprendre. Mauvais réflexe.

Tests minimum viables : ce que tu ne testes pas va casser, et ça reviendra

Le vibe coding te pousse à penser en « feature livrée ». Les tests te forcent à penser en « comportement maintenu ». Tu n’as pas besoin de viser une couverture parfaite. Tu as besoin de tests qui protègent les chemins rentables : les golden paths, et surtout les échecs attendus.

Un test qui vérifie qu’un endpoint renvoie bien 200 quand tout va bien, c’est sympa. Un test qui vérifie que tu renvoies 401 quand le token est absent, 403 quand le rôle n’est pas bon, 400 quand le payload est invalide, et 409 quand tu te prends un conflit métier, c’est ce qui t’évite les régressions « invisibles ». C’est aussi ce qui empêche l’IA de « corriger » un bug en changeant le contrat sans que tu le voies.

Si tu veux un standard très praticable : un pack de smoke tests pour dire « l’app est vivante », quelques scénarios de bout en bout sur les parcours qui font tourner le produit, et des tests d’erreurs sur les points de friction (auth, paiement, webhooks, idempotence). Ça suffit souvent à éviter les pires surprises, sans ralentir ton cycle.

Remplacer un SaaS en vibe coding : là, tu joues avec la prod des autres

Le fantasme du moment, c’est « je vais vibe coder un clone de SaaS ». Parfois c’est une très bonne idée, surtout pour des outils internes ou des workflows simples. Mais il faut être lucide : quand tu remplaces un SaaS, tu ne remplaces pas juste des écrans. Tu remplaces de la maintenance, de l’assurance, de la sécurité, de l’exploitation, et tout un tas de décisions ennuyeuses que tu n’avais pas à prendre avant. Le NCSC insiste justement sur ce déplacement du coût : moins de licence, plus de responsabilité.

Et la sécurité, ici, ce n’est pas « on met un mot de passe fort ». C’est des permissions correctes, des rôles cohérents, une séparation entre admin et utilisateurs, une journalisation exploitable, et une capacité de restauration. Si ton outil gère des actions sensibles, tu veux des logs d’audit qui ressemblent à quelque chose, pas un vague console.log("done"). Tu veux aussi des backups testés, et une procédure de rollback. La première fois que tu supprimes des données par erreur, tu comprendras très vite pourquoi les SaaS sérieux parlent de rétention et de restauration.

Autre piège classique : les secrets. Les projets vibe-coded finissent vite avec des clés d’API en dur, des tokens partagés, des environnements mal séparés. Et ça, en prod, c’est juste un incident en attente. Si tu as un minimum de discipline à garder, garde celle-là.

Règle de survie : si tu ne peux pas débugger sans l’IA, tu n’as pas ship

Je vais le dire franchement parce que ça évite beaucoup d’auto-illusion : si ton système ne peut pas être compris et réparé par un humain « sans conversation », tu n’as pas livré un produit. Tu as livré un truc qui marche tant que l’auteur est là, tant que le contexte est frais, tant que l’IA est disponible et inspirée. C’est fragile.

Le bon niveau d’exigence n’est pas « je peux tout expliquer au tableau ». C’est plus modeste : je peux lire les logs, reproduire, identifier la couche fautive, et corriger sans réécrire la moitié du projet. Pour y arriver, tu n’as pas besoin d’être un héros. Tu as besoin de frontières, de contrats, de logs corrélés, de quelques tests, et d’une hygiène sécu minimale. Tout le reste, c’est de la déco.

Conclusion : garde la vitesse, mais impose des rails

Le vibe coding est une arme très cool, surtout pour lancer, explorer, débloquer un MVP. Mais si tu veux un produit qui tient, tu dois accepter une idée simple : la vitesse sans rails te coûte plus tard, et plus cher, au pire moment. La bonne nouvelle, c’est que les rails qui comptent vraiment sont peu nombreux. Tu les poses une fois, tu les fais respecter, et tu continues à aller vite.

Et si tu veux un signal simple pour savoir si tu es en train de construire ou juste d’empiler : demande-toi combien de temps il te faut pour comprendre un bug sans reprompter. La réponse dit tout.

Sources

Cet article vous a plu ?

Commentaires

Laisser un commentaire

Entre 10 et 2000 caractères

Les commentaires sont modérés avant publication.

Aucun commentaire pour le moment.

Soyez le premier à donner votre avis !