Demandez à un modèle de répondre en JSON, et la plupart du temps json.loads() fonctionne sans problème. Les échecs sont ceux qui vous coûtent une session de débogage : un commentaire sur une ligne à l’intérieur de l’objet, un code fence markdown qui l’entoure, une clé écrite userEmail quand votre code attend user_email. Un prompt plus strict (“répondez UNIQUEMENT avec l’objet JSON, aucun autre texte”) rend ces cas plus rares. Il ne les rend pas impossibles, car le modèle peut quand même ignorer la consigne. La sortie structurée n’a plus besoin de cette consigne : vous donnez à l’API un JSON Schema, qui contraint l’échantillonnage des tokens du modèle pour que la réponse doive s’y conformer. ...
Spécificité CSS Expliquée : Comment la Cascade Décide
Vous écrivez .sidebar .card { color: blue; }, vous chargez la page, et la carte reste rouge à cause d’une règle ajoutée une heure plus tôt : .card { color: red; }. Votre nouvelle règle arrive plus tard dans le fichier. Elle perd quand même. Le navigateur compare les deux sélecteurs avec un système de points fixe, et .sidebar .card obtient un score plus élevé que .card, peu importe lequel a été écrit en dernier. ...
Table de Hachage : Comment le Hachage Fonctionne
Chercher une clé dans un dict Python contenant dix entrées prend le même temps que dans un dict qui en contient dix millions. Ce n’est pas un hasard lié à un langage rapide. Le dict de Python, le HashMap de Java et la Map de JavaScript sont tous des tables de hachage, et toute leur conception vise à faire tourner recherche, insertion et suppression en O(1) en moyenne. La notation Big O donne à cette recherche l’étiquette “temps constant”. Voici le mécanisme qui la justifie. ...
Ownership et Borrowing en Rust Expliqués
Un programme en C qui libère un buffer puis continue à le lire compile quand même. Il corrompt ensuite la mémoire, parfois immédiatement, parfois trois requêtes plus tard, dans une partie du code qui n’a jamais touché ce buffer. Rust rejette ce programme dès le cargo build, sans aucun garbage collector. Le compilateur garde la trace de qui possède chaque valeur et qui peut y accéder. Ce suivi, c’est l’ownership et le borrowing. ...
Mock, Stub, Fake et Spy : les Test Doubles Expliqués
Un test pour place_order a besoin d’une passerelle de paiement, d’un client SMS et d’un calculateur de taxes. Branchez les vraies dépendances, et chaque exécution de test débite une carte et envoie un SMS. Un test unitaire doit s’exécuter en quelques millisecondes, sans réseau : les trois doivent donc être remplacées par autre chose. Cet « autre chose » existe en cinq variantes, chacune résolvant un problème différent, et les traiter comme interchangeables est la raison pour laquelle les débats « mets juste un mock » en revue de code tournent en rond. ...
ESLint vs Prettier : Différences et Comment les Combiner
Vous enregistrez un fichier, Prettier le reformate, et ESLint signale immédiatement une erreur sur la ligne que Prettier vient de toucher. Les deux outils sont configurés, les deux tournent, et au lieu de vous aider, ils se bloquent l’un l’autre. Les deux outils ne font pas le même travail. Le problème, c’est qu’ils ont tous les deux un avis sur une seule chose : l’apparence du code à l’écran. Ce qu’ESLint vérifie réellement ESLint transforme votre code en arbre de syntaxe abstraite et exécute des règles sur sa structure. Son intérêt principal vient des règles qui détectent de vrais bugs : une variable jamais définie, un return inaccessible après un autre return, un import resté inutilisé après un refactoring, une clé d’objet dupliquée qui écrase silencieusement la première. Ce sont des vérifications sémantiques : ESLint lit ce que le code fait. ...
Transactions en Base de Données : ACID et Isolation
Pourquoi un virement bancaire a besoin de plus que deux UPDATE Déplacez 50 € d’un compte à un autre et la version naïve, ce sont deux instructions : soustraire du compte A, ajouter au compte B. Exécutez-les séparément et, si le processus plante ou si la connexion tombe entre les deux, l’argent a disparu de A et n’arrive jamais sur B. La base de données a fait exactement ce qu’on lui a demandé, deux fois. L’entreprise a quand même perdu 50 €. ...
Comment Créer un LLM Eval : Tester les Prompts Comme du Code
Pourquoi “ça a l’air juste” n’est pas un test pour un prompt Vous resserrez la formulation d’un prompt qui route des tickets, vous le testez sur les trois exemples ouverts dans votre notebook improvisé, et vous le déployez. Une semaine plus tard, les réclamations de facturation qui finissaient dans la bonne file commencent à finir dans “question”. Pas les trois cas que vous avez vérifiés : les quatre cents autres que vous n’avez pas vérifiés. Rien ne plante. Il n’y a pas de stack trace. Le prompt, lu à voix haute, sonne toujours bien. ...
React useEffect Expliqué : Dépendances et Cleanup
Un composant de chat reconnecte son WebSocket chaque fois que vous tapez une lettre dans un champ de recherche qui n’a rien à voir avec le chat. Un autre composant se re-render en boucle jusqu’à ce que l’onglet se bloque. Un troisième affiche son useEffect deux fois au montage, mais seulement en développement. Aucun de ces cas n’est un bug de React. Les deux premiers sont le tableau de dépendances qui fait exactement ce que vous lui avez demandé, et le troisième est Strict Mode qui vérifie que votre effet sait se nettoyer après lui-même. ...
Expressions Régulières : Comment le Regex Fonctionne
<.+> appliqué à <b>bold</b> and <i>italic</i> ne trouve pas <b>. Il trouve la chaîne entière, du premier < au tout dernier >. Rien n’est cassé. C’est exactement ce qu’un quantificateur greedy est censé faire, et c’est aussi le bug le plus courant de “mon regex matche trop”. Une fois que vous savez ce que fait le moteur pendant qu’il lit votre motif, ce bug et la plupart de ses cousins arrêtent d’être des mystères. ...