← Retour aux articles

SOFTWARE CRAFTSMANSHIP // IA GÉNÉRATIVE

La loi de Kidlin à l'ère de l'IA : spécifier est le nouveau coder

« Si vous parvenez à écrire clairement le problème, il est à moitié résolu. » Face à un agent IA qui préfère deviner plutôt que demander, cette maxime devient une discipline d'ingénierie : questions, tests, types.

« Si vous parvenez à écrire clairement le problème, il est à moitié résolu. » — La loi de Kidlin. Avec un agent IA, la seconde moitié ne coûte presque plus rien. Toute la valeur se concentre donc dans la première.

Plus de vingt ans de code m'ont appris une chose : ce n'est presque jamais la syntaxe qui ralentit une équipe, c'est l'ambiguïté du besoin.

Les agents de code ont déplacé le goulot d'étranglement. Produire du code ne coûte presque plus rien. Savoir précisément quoi produire, si.

Un problème bien cadré canalise une génération chaotique en un résultat ordonné

📜 Une maxime d'origine floue, un principe limpide

L'origine de la loi de Kidlin est incertaine. On la trouve partout sur le web, rarement sourcée. Elle est cousine d'une phrase attribuée à l'ingénieur Charles Kettering : « Un problème bien posé est un problème à moitié résolu. »

Peu importe le parrain. L'idée tient : écrire le problème force à trancher ce que l'on croyait évident, et révèle ce que l'on ignorait.

La loi de Kidlin : poser le problème par écrit transforme le chaos en clarté géométrique
La loi de Kidlin : écrire l'intention dissipe le flou et résout la moitié du problème avant même la première ligne de code.

💥 Le déclencheur : un prompt d'une ligne, une régression invisible

Prenons un scénario que beaucoup d'équipes reconnaîtront. Un moteur de facturation B2B, une fin de mois qui presse, et un prompt lancé à la volée : « Ajoute une remise de 10 % aux clients jusqu'à la fin du mois. »

En quelques secondes, l'agent livre plusieurs centaines de lignes propres, typées, accompagnées de tests verts qu'il a lui-même écrits.

Quelques jours plus tard, la comptabilité et le support tirent la sonnette d'alarme : la remise de 10 % s'est appliquée sur des clients grands comptes bénéficiant déjà de tarifs négociés contractuellement. Pire : le 31 du mois à 23h45, des commandes ont été rejetées en raison d'un fuseau horaire implicite non géré.

Personne n'avait posé la question : « La remise s'applique-t-elle aux prix négociés ? » ou « Quel fuseau horaire fait foi pour la fin du mois ? » L'agent ne l'a pas posée non plus. Il a choisi la réponse la plus plausible, sans le dire.

🌪️ Le coût caché : un agent qui préfère deviner

Un collègue humain s'arrête devant un besoin flou. Il fronce les sourcils et pose des questions jusqu'à dissiper le brouillard.

Un modèle de langage fait l'inverse. Les travaux sur la complaisance des assistants IA (sycophancy) montrent qu'ils tendent à satisfaire l'utilisateur plutôt qu'à le contredire.

Face au doute, il prend un raccourci. Il comble les trous par des suppositions, rarement explicitées, et produit un code plausible qui passe ses propres tests.

Le réflexe du prompt fleuve ne règle rien. Trois pages de prose restent ambiguës, simplement plus longues. Le flou change de taille, pas de nature.

🎯 La première moitié : forcer l'agent à poser des questions

Pour contrer ce biais, on équipe l'agent d'un outil de spécification. Une skill dédiée de cadrage inverse la dynamique : plutôt que de foncer tête baissée et de deviner, l'agent inspecte le besoin, liste ses zones d'ombre et soumet un questionnaire ciblé à l'humain.

Sur notre prompt initial, voici ce qu'un tel outil fait remonter avant toute génération de code :

? La remise de 10 % s'applique-t-elle aux lignes à prix déjà négociés ?
? Se cumule-t-elle avec une promotion catalogue déjà en cours ?
? « Fin du mois » : quel fuseau horaire fait foi (UTC ou celui du client) ?
? Quel événement déclenche l'éligibilité : mise au panier ou paiement finalisé ?
? Arrondi : par ligne ou sur le total TTC, au centime le plus proche ?

L'utilisateur reste le pilote. C'est lui qui arbitre chaque point d'ambiguïté. Rien n'est perdu du monde d'avant l'IA : les pratiques agiles et le craftsmanship, comme l'Example Mapping, trouvent ici tout leur sens. Formaliser trois exemples concrets et des questions ouvertes canalise l'agent infiniment mieux qu'une tartine de prose.

Tout va plus vite, y compris pour faire des erreurs. L'IA accélère la livraison quand le cap est net, mais elle démultiplie la vitesse d'accumulation de bugs silencieux quand l'intention de départ est incomplète.

🛡️ L'antidote craftsmanship : transformer les réponses en contraintes

Une réponse en prose reste fragile. Pour qu'elle contraigne l'agent, elle doit devenir exécutable. Deux outils suffisent : un test et des types.

[ PROMPT FLOU ]

  Intention vague
        |
        v
  Agent complaisant ---> comble les trous seul
        |
        v
  Tests verts ---> incident en production

[ KIDLIN-CRAFT ]

  Example mapping ---> zones d'ombre listées
        |
        v
  Arbitrage humain ---> réponses écrites en tests rouges
        |
        v
  Types stricts ---> l'agent implémente
        |
        v
  Tests verts ---> intention vérifiée sans ambiguïté

🔍 Avant : ce que produit le prompt d'une ligne

Le code est plausible. Il applique la remise partout sans vérifier la nature des prix, manipule des devises dans des flottants et se base sur une date système sans fuseau.

function applyMonthlyDiscount(cart: any): number {
  const now = new Date();
  let total = 0;
  for (const line of cart.lines) {
    total += line.price;
  }
  if (now.getDate() <= 31) {
    return total * 0.90;
  }
  return total;
}

✅ Après : l'exemple devient un test rouge

On écrit d'abord le test. Il encode l'exemple tranché : les lignes à prix négocié ne sont jamais remisées et la date est évaluée explicitement en UTC.

test("10% monthly discount never applies to negotiated prices during active period", () => {
  const promoPeriod = {
    startUtc: new Date("2026-10-01T00:00:00Z"),
    endUtc: new Date("2026-10-31T23:59:59Z"),
  };
  const cart = [catalogLine(euros(100)), negotiatedLine(euros(50))];
  const evaluationDate = new Date("2026-10-15T12:00:00Z");

  assert.deepEqual(
    totalWithMonthlyPromotion(cart, promoPeriod, evaluationDate),
    euros(140)
  );
});

Puis les types et l'implémentation. L'origine du prix devient un type, le taux devient une constante nommée, l'argent se compte en centimes immuables.

const CENTS_PER_EURO = 100;
const TEN_PERCENT_DISCOUNT = 0.10;

type PriceOrigin = "Catalog" | "Negotiated";
type Money = { readonly cents: number };
type CartLine = { readonly price: Money; readonly origin: PriceOrigin };
type PromotionPeriod = { readonly startUtc: Date; readonly endUtc: Date };

const euros = (amount: number): Money => ({ cents: Math.round(amount * CENTS_PER_EURO) });
const catalogLine = (price: Money): CartLine => ({ price, origin: "Catalog" });
const negotiatedLine = (price: Money): CartLine => ({ price, origin: "Negotiated" });

const calculateLinePrice = (line: CartLine, isPromoActive: boolean): Money => {
  if (line.origin === "Negotiated" || !isPromoActive) {
    return line.price;
  }
  const discountedCents = Math.round(line.price.cents * (1 - TEN_PERCENT_DISCOUNT));
  return { cents: discountedCents };
};

const totalWithMonthlyPromotion = (
  lines: readonly CartLine[],
  period: PromotionPeriod,
  currentDate: Date
): Money => {
  const isPromoActive = currentDate >= period.startUtc && currentDate <= period.endUtc;
  const totalCents = lines.reduce(
    (sum, line) => sum + calculateLinePrice(line, isPromoActive).cents,
    0
  );
  return { cents: totalCents };
};

Le résultat est court et vérifiable. Pas de else, pas de any, pas de taux magique. Surtout, la règle oubliée du scénario est désormais impossible à rater : un test rouge la protège.

🤖 Le TDD à l'ère de l'IA : donner une définition exécutable du « terminé »

Une spécification purement textuelle finit toujours par dériver. Face à un modèle probabiliste, la prose est une suggestion, mais un test rouge est un contrat indiscutable.

Le TDD n'est pas mort avec l'IA. Il devient la façon la plus rapide et la plus économique de guider un agent : poser l'intention sous forme de tests et de types stricts, puis le laisser implémenter jusqu'à ce que tout soit vert.

⚖️ Matrice comparative

+-----------------------+---------------------------+---------------------------+
| Dimension             | Prompt flou               | Kidlin-Craft              |
+-----------------------+---------------------------+---------------------------+
| Formulation           | Prose ambiguë             | Example mapping + types   |
| Gestion du doute      | Raccourcis silencieux     | Questions à l'humain      |
| Cas limites           | Découverts en prod        | Tranchés avant le code    |
| Code produit          | Volumineux, défensif      | Court, vérifiable         |
| Maîtrise cognitive    | Diluée dans le généré     | Ancrée dans la spec       |
| Maintenance           | Croissante                | Prévisible                |
+-----------------------+---------------------------+---------------------------+

🚀 Conclusion : votre métier n'est plus de taper, mais de cadrer

L'IA ne rend pas le craftsmanship obsolète. Plus le moteur va vite, plus les rails doivent être précis.

La loi de Kidlin, version agent : si vous savez écrire votre problème sous forme de questions tranchées, de tests et de types, l'agent fait le reste. Sinon, il automatise votre flou.

Et vous : quelle est la dernière question que votre agent aurait dû vous poser, et qu'il a tranchée seul ?

Catégorie : Vulgarisation & Technologie
Thèmes abordés :
← Retour aux articles