Lexique Dev — +1432 définitions

Glossaire complet pour développeurs web : termes, définitions, exemples de code et analogies

1432+Définitions
20Stacks
3Niveaux
Advanced Ecosystem 87 Architecture 100 CSS-in-JS 23 DevOps 113 HTML / CSS 83 IA / LLM 80 JavaScript 124 MongoDB 65 Mongoose 27 NestJS 93 Personalities 106 PHP 69 PostgreSQL 45 React 129 Sass 26 Styled-Components 15 Tailwind CSS 45 Testing 86 TypeScript 78 WordPress 38

1432 termes affichés

Stack Advanced Ecosystem Architecture CSS-in-JS DevOps HTML / CSS IA / LLM JavaScript MongoDB Mongoose NestJS Personalities PHP PostgreSQL React Sass Styled-Components Tailwind CSS Testing TypeScript WordPress
Niveau 🟢 Junior 🟡 Mid 🔴 Senior
|

!default / !global

Sass 🟡 Mid

!default assigne une valeur seulement si la variable n'existe pas encore (idéal pour les librairies). !global rend une variable locale accessible dans le scope global.

!default c'est 'sauf avis contraire', !global c'est 'je crie pour que tout le monde entende'.

// Librairie
$primary: blue !default; // Overridable
$border-radius: 4px !default;

// Projet utilisateur (avant @use)
$primary: red; // Override la valeur

// !global (a eviter si possible)
@mixin set-theme($color) {
  $theme-color: $color !global;
}

Cas d'usage : Créer des librairies Sass configurables ou les utilisateurs peuvent overrider les valeurs par défaut.

Anti-pattern : Abuser de !global, qui casse l'encapsulation des modules et crée des effets de bord.
#styling#sass

#[\Deprecated]

PHP 🟢 Junior

Attribut natif de PHP 8.4 qui marque une fonction, une méthode, une constante de classe ou un cas d'enum comme déprécié. À l'appel, le moteur émet un E_USER_DEPRECATED avec le message et la version (since) fournis ; la réflexion expose isDeprecated().

L'étiquette « bientôt retiré de la vente » sur un produit encore en rayon.

class PhpVersion
{
  #[\Deprecated(
    message: "utilisez getVersion() à la place",
    since: "8.4",
  )]
  public function getPhpVersion(): string
  {
    return $this->getVersion();
  }
}
// Appel : Deprecated: Method PhpVersion::getPhpVersion()
// is deprecated since 8.4, utilisez getVersion() à la place

Cas d'usage : Faire évoluer une API publique de bibliothèque sans casser les utilisateurs, avec un signal uniforme pour les IDE et l'analyse statique.

Anti-pattern : Déprécier sans message ni alternative : l'avertissement n'aide personne à migrer.
#core#php84

#[\NoDiscard]

PHP 🟢 Junior

Attribut de PHP 8.5 qui avertit (E_WARNING pour les fonctions natives, E_USER_WARNING pour le code utilisateur) quand la valeur de retour d'une fonction est ignorée. Le cast (void) marque un rejet volontaire. Appliqué nativement à flock() et aux méthodes set*() de DateTimeImmutable.

Le distributeur qui bipe si vous partez sans prendre votre carte.

#[\NoDiscard]
function getPhpVersion(): string {
  return 'PHP 8.5';
}

getPhpVersion();
// Warning: The return value should either be used
// or intentionally ignored

(void) getPhpVersion(); // rejet explicite, pas d'avertissement

// piège classique désormais signalé :
$date->setTime(0, 0); // DateTimeImmutable retourne une copie !

Cas d'usage : Objets immuables (with*/set* qui retournent une copie) et fonctions dont le retour porte un statut à vérifier.

Anti-pattern : Marquer #[\NoDiscard] une fonction dont le retour est accessoire : on noie le code d'avertissements.
#core#php85

#[\Override]

PHP 🟢 Junior

Attribut de PHP 8.3 qui déclare qu'une méthode surcharge une méthode parente ou d'interface. Si aucune méthode correspondante n'existe (faute de frappe, renommage dans la classe mère), PHP lève une erreur fatale à la compilation au lieu de laisser une méthode orpheline silencieuse.

Le « répondre à » d'un courriel : si le message d'origine n'existe pas, la messagerie refuse d'envoyer.

class MyTest extends TestCase
{
  #[\Override]
  protected function taerDown(): void
  {
    // Fatal error: MyTest::taerDown() has #[\Override]
    // attribute, but no matching parent method exists
  }
}

Cas d'usage : Tests, hooks de framework et hiérarchies profondes : sécuriser les refactorisations de la classe mère.

Anti-pattern : Poser #[\Override] sur une méthode nouvelle qui ne surcharge rien : erreur fatale immédiate.
#core#php83

$addFields

MongoDB 🟡 Mid? entretien

Stage d'aggregation qui ajoute de nouveaux champs aux documents sans supprimer les champs existants. Alias de $set dans le contexte d'aggregation.

Coller un post-it supplémentaire sur une fiche sans rien effacer de ce qui est déjà écrit.

{ $addFields: {
  totalPrice: {
    $multiply: ['$price', '$quantity']
  },
  isExpensive: {
    $gt: ['$price', 100]
  }
}}

Cas d'usage : Enrichir les documents avec des champs calcules sans perdre les données originales.

#sgbd#interview#database#mongodb

$bucket

MongoDB 🔴 Senior

Stage d'aggregation qui distribue les documents dans des intervalles (buckets) définis par des bornes. Utile pour créer des histogrammes ou des tranches.

Trier des élèves par tranche d'âge : 6-10, 11-14, 15-18 ans.

{ $bucket: {
  groupBy: '$age',
  boundaries: [0, 18, 30, 50, 100],
  default: 'Other',
  output: { count: { $sum: 1 } }
}}

Cas d'usage : Créer des rapports avec des tranches de prix, d'ages ou de scores.

#sgbd#interview#database#mongodb

$facet

MongoDB 🔴 Senior

Stage d'aggregation qui exécute plusieurs sous-pipelines en parallèle sur le même jeu de documents. Chaque sous-pipeline produit un résultat indépendant dans un seul document de sortie.

Un journaliste qui écrit trois angles différents du même evenement en même temps.

{ $facet: {
  byCategory: [
    { $group: { _id: '$cat', n: { $sum: 1 } } }
  ],
  priceStats: [
    { $group: { _id: null, avg: { $avg: '$price' } } }
  ],
  total: [{ $count: 'count' }]
}}

Cas d'usage : Générer un dashboard avec des statistiques multiples en un seul appel a la base.

#sgbd#interview#database#mongodb

$group

MongoDB 🟡 Mid? entretien

Stage d'aggregation qui regroupe les documents par une clé (_id) et applique des accumulateurs ($sum, $avg, $max, $min, $push, $first). Équivalent du GROUP BY en SQL.

Trier des billes par couleur dans des bols différents, puis compter combien il y en a dans chaque bol.

{ $group: {
  _id: '$category',
  count: { $sum: 1 },
  avgPrice: { $avg: '$price' },
  items: { $push: '$name' }
}}

Cas d'usage : Calculer des métriques agrégées par catégorie, utilisateur, période ou tout autre critère de regroupement.

#sgbd#interview#database#mongodb

$lookup

MongoDB 🟡 Mid? entretien

Stage d'aggregation qui réalise une jointure gauche (LEFT JOIN) entre deux collections. Ajoute un tableau de documents correspondants depuis la collection jointe.

Appeler le service comptabilité pour joindre les factures de chaque client a leur fiche.

{ $lookup: {
  from: 'orders',
  localField: '_id',
  foreignField: 'userId',
  as: 'userOrders'
}}

Cas d'usage : Combiner des données de collections séparées quand l'embedding n'est pas adapte.

Anti-pattern : Faire des $lookup sur des collections non indexées sur le foreignField, rendant la jointure O(n*m).
#sgbd#interview#database#mongodb

$match

MongoDB 🟡 Mid? entretien

Stage d'aggregation qui filtre les documents, équivalent du WHERE en SQL. Place en début de pipeline, il utilise les index pour optimiser les performances.

Le vigile a l'entrée de la boite de nuit : seuls ceux qui remplissent les critères passent.

{ $match: {
  status: 'active',
  createdAt: { $gte: new Date('2024-01-01') }
}}

Cas d'usage : Filtrer les documents en amont du pipeline pour réduire le volume de données traite par les stages suivants.

#sgbd#interview#database#mongodb

$project

MongoDB 🟡 Mid? entretien

Stage d'aggregation qui restructure les documents en incluant, excluant ou créant de nouveaux champs calcules. Permet de renommer des champs et d'appliquer des expressions.

Un monteur vidéo qui sélectionne les scènes a garder et ajoute des effets spéciaux.

{ $project: {
  fullName: { $concat: ['$first', ' ', '$last'] },
  year: { $year: '$createdAt' },
  _id: 0
}}

Cas d'usage : Formater la sortie de l'aggregation pour qu'elle corresponde exactement au format attendu par le frontend.

#sgbd#interview#database#mongodb

$rankFusion

MongoDB 🔴 Senior

Stage d'aggregation, généralement disponible (GA) depuis MongoDB 8.0, qui combine les classements de plusieurs sous-pipelines (par exemple recherche vectorielle et recherche full-text) en un seul classement hybride pondéré.

Comme un jury qui fusionne les notes de plusieurs juges (recherche vectorielle, recherche texte) en un classement final unique.

db.products.aggregate([
  { $rankFusion: {
    input: { pipelines: {
      vector: [{ $vectorSearch: {
        index: 'v_idx', path: 'emb',
        queryVector: [0.1, 0.2], limit: 20
      }}],
      text: [{ $search: {
        text: { query: 'chaussures', path: 'name' }
      }}]
    }}
  }}
]);

Cas d'usage : Combiner recherche sémantique et recherche full-text pour un classement de résultats plus pertinent (hybrid search).

Anti-pattern : Pondérer tous les sous-pipelines de la même façon sans ajuster selon leur pertinence métier.
#sgbd#interview#database#mongodb#mongo8

$scoreFusion

MongoDB 🔴 Senior

Stage d'aggregation, généralement disponible (GA) depuis MongoDB 8.3 (4 mai 2026), qui combine les scores de plusieurs sous-pipelines selon une formule explicite plutôt que par simple fusion de rangs comme $rankFusion.

La ou $rankFusion fusionne des classements, $scoreFusion fusionne des notes chiffrées selon une formule choisie.

db.articles.aggregate([
  { $scoreFusion: {
    input: {
      pipelines: {
        recent: [{ $addFields: {
          score: { $divide: [1, '$ageInDays'] }
        }}],
        relevance: [{ $search: {
          text: { query: 'ia', path: 'title' }
        }}]
      },
      normalization: 'minMaxScaler'
    }
  }}
]);

Cas d'usage : Construire un score composite (fraîcheur + pertinence textuelle) pour trier un fil d'actualité.

Anti-pattern : Confondre $scoreFusion (formule de score) et $rankFusion (fusion de rangs) : leur comportement diffère sur des distributions de scores hétérogènés.
#sgbd#interview#database#mongodb#mongo83

$unwind

MongoDB 🟡 Mid? entretien

Stage d'aggregation qui decompacte un champ tableau en créant un document par élément. Transforme un document avec un tableau de N éléments en N documents.

Ouvrir un paquet de bonbons et poser chaque bonbon sur la table individuellement.

// { tags: ['js', 'mongo'] } devient :
// { tags: 'js' }
// { tags: 'mongo' }
{ $unwind: '$tags' }

Cas d'usage : Préparer les données d'un tableau pour un $group ou un $sort sur les éléments individuels.

Anti-pattern : Appliquer $unwind sur des tableaux de milliers d'éléments, multipliant la mémoire utilisée.
#sgbd#interview#database#mongodb

$wpdb->prepare

WordPress 🟡 Mid

Méthode de la classe $wpdb pour créer des requêtes SQL paramétrées dans WordPress. Équivalent des prepared statements PDO, adapte a l'écosystème WP.

Comme un coffre-fort avec une serrure a combinaison : les données ne peuvent pas s'échapper du cadre prévu.

global $wpdb;
$results = $wpdb->get_results(
  $wpdb->prepare(
    "SELECT * FROM {$wpdb->posts}
     WHERE post_author = %d AND post_status = %s",
    $authorId, 'publish'
  )
);

Cas d'usage : Pour toute requête SQL directe dans WordPress qui inclut des variables.

Anti-pattern : Concaténer des variables dans la requête : $wpdb->query("DELETE FROM ... WHERE id = $id").
#core#interview#security#wordpress

Directive Next.js (expérimentale en 15, activée par cacheComponents: true depuis Next.js 16, 21 octobre 2025) qui rend cachable une page, un composant ou une fonction async. La clé de cache est dérivée automatiquement par le compilateur (ID de build, ID de fonction, arguments et variables capturées). Tout ce qui n'est pas marqué est dynamique par défaut : le cache implicite de l'ancien App Router disparaît. Les portées 'use cache' constituent la coquille statique du Partial Prerendering.

Un plat cuisiné sous vide : préparé une fois, réchauffé à chaque service tant que la date (cacheLife) n'est pas dépassée.

// next.config.ts
export default { cacheComponents: true };

// lib/data.ts
import { cacheLife, cacheTag } from 'next/cache';
export async function getProducts(category: string) {
  'use cache';
  cacheLife('hours');            // durée explicite recommandée
  cacheTag('products');          // invalidation ciblée
  return db.products.findMany({ where: { category } });
}
// Composant entier cachable (doit être async)
export async function Footer() { 'use cache'; return <footer>…</footer>; }

Cas d'usage : Mettre en cache des requêtes BDD ou des blocs de page coûteux tout en gardant le reste dynamique, avec navigation instantanée côté client.

Anti-pattern : Lire cookies(), headers() ou searchParams dans une portée 'use cache' (erreur next-request-in-use-cache) ; passer une instance de classe en argument (non sérialisable).
#nextjs#caching#performance#interview

'use client'

React 🟡 Mid

Directive qui marque un composant comme Client Component, activant l'interactivité (state, effets, handlers). Frontière entre serveur et client dans l'arbre.

Comme le panneau 'zone libre-service' dans un magasin : a partir de la, c'est le client qui interagit.

'use client';

import { useState } from 'react';

export function Counter() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}

Cas d'usage : Composants interactifs : formulaires, boutons, modales, tout ce qui a besoin de state ou d'event handlers.

Anti-pattern : Mettre 'use client' a la racine de l'app, perdant tous les avantages des Server Components.
#rendering#react19#nextjs

'use server'

React 🟡 Mid

Directive qui marque une fonction (ou tout un module) comme Server Function : elle s'exécute sur le serveur mais le client en reçoit une référence appelable, comme un RPC. Elle ne marque PAS un Server Component : les composants serveur sont le défaut, sans directive.

Comme un bouton dans un ascenseur : tu appuies cote client, mais le moteur (serveur) fait tout le travail.

'use server';

export async function createUser(formData) {
  const name = formData.get('name');
  await db.insert({ name });
  revalidatePath('/users');
}

Cas d'usage : Mutations de données (formulaires, CRUD) sans créer de route API séparée.

Anti-pattern : Croire que 'use server' protège la fonction : elle crée un endpoint public. Arguments et retour doivent être sérialisables ; la désérialisation de ces requêtes a été le vecteur de la CVE-2025-55182 (3 décembre 2025), d'où l'importance de tenir react-server-dom-* à jour.
#rendering#react19#nextjs#security

--erasableSyntaxOnly

TypeScript 🟡 Mid

Option introduite en TypeScript 5.8 (28 février 2025) qui interdit toute syntaxe TypeScript nécessitant une génération de code : enum, namespace contenant du code, propriétés de paramètre de constructeur, import x = require(). Elle garantit que le fichier peut être exécuté par simple effacement des types, comme le fait Node.js (type stripping, stable en 24.12.0 et 25.2.0). La documentation Node la recommande avec verbatimModuleSyntax.

N'écrire qu'au crayon sur la copie : la gomme suffit pour retrouver le texte original.

// tsconfig.json
// { "compilerOptions": { "erasableSyntaxOnly": true, "verbatimModuleSyntax": true } }

// ❌ Refusé : nécessite du code généré
enum Statut { Actif, Inactif }
class A { constructor(private x: number) {} }

// ✅ Effaçable
const Statut = { Actif: 0, Inactif: 1 } as const;
type Statut = (typeof Statut)[keyof typeof Statut];
class B { #x: number; constructor(x: number) { this.#x = x; } }

Cas d'usage : Tout projet exécuté par node fichier.ts, Bun ou Deno sans build, ou transpilé par un outil sans typechecker.

Anti-pattern : Activer le type stripping Node sans cette option : l'erreur ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX arrive à l'exécution, pas à la compilation.
#tooling#ts5.8#node24

--isolatedDeclarations

TypeScript 🔴 Senior

Option introduite en TypeScript 5.5 (20 juin 2024) qui exige une annotation de type explicite sur chaque export dont le type ne se déduit pas trivialement. En échange, les fichiers .d.ts peuvent être générés fichier par fichier, sans vérification de type globale, donc en parallèle et par des outils non-TS (Oxc, esbuild, SWC). Pensée pour les monorepos.

Chaque colis porte son étiquette complète : n'importe quel trieur peut le router sans ouvrir les autres colis.

// tsconfig.json : { "compilerOptions": { "isolatedDeclarations": true, "declaration": true } }

// ❌ Erreur TS9007 : le type de retour doit être annoté
export function creer(n: number) { return { id: n, tags: [] }; }

// ✅ Le .d.ts se déduit sans typechecker
export function creer(n: number): { id: number; tags: string[] } {
  return { id: n, tags: [] };
}

Cas d'usage : Monorepos où la génération des .d.ts est le goulot du build ; bibliothèques publiées avec un bundler Rust.

Anti-pattern : L'activer sur une base existante d'un coup : des centaines d'erreurs ; l'introduire paquet par paquet.
#tooling#ts5.5#monorepo

--moduleResolution bundler

TypeScript 🟡 Mid

Stratégie de résolution des modules ajoutée en TypeScript 5.0 (16 mars 2023) pour les projets construits par Vite, esbuild, webpack ou Rolldown : elle comprend le champ exports et les conditions de package.json comme Node, mais tolère les imports sans extension et n'exige pas de syntaxe CommonJS. TypeScript 7.0 (8 juillet 2026) supprime les anciennes stratégies classic, node et node10 ; bundler et nodenext deviennent les deux choix courants.

Le plan de métro adapté à la ligne qu'on prend vraiment, plutôt que la carte routière nationale.

{
  "compilerOptions": {
    "module": "esnext",
    "moduleResolution": "bundler",
    "noEmit": true,
    "allowImportingTsExtensions": true
  }
}

Cas d'usage : Applications front bundlées : le bundler émet le JavaScript, tsc ne fait que vérifier les types.

Anti-pattern : Utiliser bundler pour une bibliothèque exécutée directement par Node : les imports sans extension casseront à l'exécution ; prendre nodenext.
#tooling#ts5#ts7#bundler

--verbatimModuleSyntax

TypeScript 🟡 Mid

Option introduite en TypeScript 5.0 (16 mars 2023) : les imports et exports sont conservés tels qu'écrits, et seuls ceux marqués type sont supprimés. Fini l'élision implicite des imports « probablement de type » : le code émis est prévisible, ce qui est indispensable aux transpileurs fichier par fichier et au type stripping de Node.js, qui la recommande avec erasableSyntaxOnly.

Le traducteur qui rend chaque phrase mot pour mot au lieu de décider ce qui « ne sert à rien ».

// tsconfig.json : { "compilerOptions": { "verbatimModuleSyntax": true } }

import type { Utilisateur } from './types.ts';  // effacé
import { type Role, charger } from './api.ts'; // Role effacé, charger gardé

// ❌ Erreur : Utilisateur est un type, il faut `import type`
// import { Utilisateur } from './types.ts';

export type { Utilisateur };

Cas d'usage : Projets ESM modernes, bibliothèques, exécution directe par Node/Bun/Deno, builds Vite/esbuild/Oxc.

Anti-pattern : Le combiner avec des imports CommonJS déguisés (import x = require) sous module esnext : erreur de compilation.
#tooling#ts5#modules

.attrs()

Styled-Components 🟡 Mid

Méthode chainable qui attache des attributs par défaut ou calcules a un styled component. Évite de répéter les mêmes props a chaque utilisation.

Les réglages par défaut d'un appareil : tu les configures une fois, plus besoin d'y penser.

const Input = styled.input.attrs(({ $size }) => ({
  type: 'text',
  size: $size || '1em',
}))`
  padding: ${({ size }) => size};
  border: 1px solid #ccc;
  border-radius: 4px;
`
// <Input $size="2em" />

Cas d'usage : Définir des attributs HTML par défaut (type, role, aria-*) sur un styled component.

#styling#css-in-js

.dockerignore

DevOps 🟢 Junior

Fichier listant les patterns à exclure du contexte de build Docker. Réduit la taille du contexte envoyé au daemon.

La liste des choses à NE PAS mettre dans la valise avant un voyage.

node_modules
.git
.env
dist
*.md
.DS_Store

Cas d'usage : Accélérer le build et éviter de copier des fichiers sensibles ou inutiles dans l'image.

Anti-pattern : Oublier .env et node_modules : build lent et secrets exposés.
#devops#docker

103 Early Hints

Advanced Ecosystem 🟡 Mid

Code de statut HTTP informatif défini par la RFC 8297 : pendant que le serveur prépare la vraie réponse (requête en base, rendu), il envoie d'abord un 103 contenant des en-têtes Link (preload, preconnect) pour que le navigateur commence à charger CSS, polices et scripts. Chrome le supporte depuis la version 103, uniquement sur HTTP/2 et HTTP/3 ; Cloudflare peut le générer automatiquement à partir des en-têtes Link de vos pages.

Le serveur du restaurant qui vous apporte pain et couverts dès la commande, sans attendre que le plat soit prêt en cuisine.

// Node.js >= 18 : res.writeEarlyHints (HTTP/2 côté proxy pour Chrome)
import http from 'node:http';

http.createServer(async (req, res) => {
  res.writeEarlyHints({
    link: [
      '</styles/app.css>; rel=preload; as=style',
      '</fonts/inter.woff2>; rel=preload; as=font; crossorigin',
      '<https://api.example.com>; rel=preconnect',
    ],
  });                                   // 103 part immédiatement
  const html = await renderPage(req);   // travail lent (BDD, SSR)
  res.writeHead(200, { 'content-type': 'text/html' });
  res.end(html);                        // 200 final
}).listen(3000);

Cas d'usage : Pages rendues côté serveur avec un TTFB de plusieurs centaines de millisecondes : les ressources critiques se chargent pendant l'attente.

Anti-pattern : Lister vingt ressources en Early Hints : la bande passante se disperse et le HTML lui-même arrive plus tard ; se limiter au CSS critique, aux polices et aux preconnect.
#performance#http#web

12-Factor App

DevOps 🟡 Mid? entretien

Méthodologie en 12 principes pour construire des applications cloud-native. Inclut config via env vars, stateless processes, port binding, logs as streams.

Les 12 commandements du développeur cloud : suis-les et ton app tournera partout sans problème.

// Factor 3 : Config via env vars
const dbUrl = process.env.DATABASE_URL;
// Factor 6 : Stateless processes
// Pas de state en mémoire locale
// Factor 11 : Logs as event streams
process.stdout.write(JSON.stringify(logEvent));

Cas d'usage : Concevoir des applications facilement déployables sur n'importe quel cloud ou PaaS.

Anti-pattern : Config hardcodée, sessions en mémoire, fichiers locaux : impossible à scaler.
#devops#cloud#interview

2FA / MFA

Advanced Ecosystem 🟡 Mid

Authentification multi-facteurs combinant quelque chose que l'utilisateur sait (mot de passe), possède (téléphone/clé) ou est (biométrie). Réduit drastiquement les compromissions.

Entrer dans un coffre-fort de banque avec une clé ET un code : voler l'un sans l'autre est inutile.

import { authenticator } from 'otplib';
const secret = authenticator.generateSecret();
const qrUrl = authenticator.keyuri(user.email, 'MyApp', secret);
// Verification
const isValid = authenticator.verify({
  token: userInput, secret: user.totpSecret
});

Cas d'usage : Ajouter une couche de sécurité obligatoire pour les comptes admin et les opérations sensibles.

Anti-pattern : Envoyer les codes 2FA uniquement par SMS, vulnérable au SIM swapping.
#security#authentication

7-1 Pattern

Sass 🟡 Mid

Architecture de fichiers Sass en 7 dossiers (abstracts, base, components, layout, pages, themes, vendors) et 1 fichier main.scss qui les importe tous.

Un classeur avec 7 intercalaires et une table des matières : tout est range et facile a trouver.

sass/
  abstracts/  (_variables, _mixins, _functions)
  base/       (_reset, _typography)
  components/ (_button, _card, _modal)
  layout/     (_header, _footer, _grid)
  pages/      (_home, _about)
  themes/     (_dark, _light)
  vendors/    (_bootstrap)
  main.scss   (importe tout)

Cas d'usage : Organiser un projet CSS moyen/grand pour que chaque développeur sache ou trouver et ajouter du code.

#styling#interview#sass

:has()

HTML / CSS 🟡 Mid

Pseudo-classe relationnelle surnommée 'sélecteur parent'. Permet de cibler un élément en fonction de ses descendants, frères ou états internes sans JavaScript.

Comme dire 'la maison QUI A un jardin' : on sélectionne le parent selon ce qu'il contient.

/* Card avec image = layout horizontal */
.card:has(img) { display: flex; }
/* Form avec champ invalide = bordure rouge */
form:has(:invalid) { border: 2px solid red; }
/* Label quand son input est focus */
label:has(+ input:focus) { color: blue; }

Cas d'usage : Adapter dynamiquement les styles parents selon le contenu ou l'état des enfants, sans JS.

Anti-pattern : Chaîner trop de :has() imbriqués qui impactent les performances de rendu.
#core#interview

:is()

HTML / CSS 🟡 Mid

Pseudo-classe fonctionnelle qui accepte une liste de sélecteurs et adopte la spécificité du sélecteur le plus spécifique de la liste. Simplifie les sélecteurs longs et répétitifs.

Comme un raccourci postal : au lieu d'écrire 3 adresses séparées, on les groupe en une seule ligne.

/* Avant : 3 règles répétitives */
article h1, article h2, article h3 { color: navy; }
/* Après : condensé avec :is() */
article :is(h1, h2, h3) { color: navy; }

Cas d'usage : Factoriser des sélecteurs CSS répétitifs pour réduire la taille et améliorer la lisibilité.

Anti-pattern : Confondre :is() et :where() : :is() prend la spécificité max, :where() a toujours 0.
#core#interview

:where()

HTML / CSS 🟡 Mid

Identique à :is() en fonctionnalité mais avec une spécificité toujours à 0. Parfait pour les styles de base facilement surchargeables.

Comme une suggestion écrite au crayon : facile à effacer et remplacer par quelque chose d'autre.

/* Spécificité 0 : facile à surcharger */
:where(article, section, aside) h2 {
  font-size: 1.5rem;
}
/* N'importe quel sélecteur peut surcharger */
.custom h2 { font-size: 2rem; }

Cas d'usage : Définir des styles reset ou utilitaires de base qui doivent être facilement surchargeables.

#interview

<Activity>

React 🟡 Mid

Composant livré dans React 19.2 (1er octobre 2025) qui masque ou révèle un sous-arbre sans le démonter. En mode hidden, le contenu est caché en display: none, l'état React et le DOM (brouillon de textarea, position vidéo) sont conservés, les effets sont nettoyés et le rendu continue à basse priorité. Il permet aussi de pré-rendre en arrière-plan un écran pas encore visible.

Mettre une pièce en veille : lumières éteintes, mais les meubles restent en place pour le retour.

import { Activity } from 'react';

function App({ tab }) {
  return (
    <>
      <Activity mode={tab === 'home' ? 'visible' : 'hidden'}>
        <Home />     {/* état conservé quand on change d'onglet */}
      </Activity>
      <Activity mode={tab === 'posts' ? 'visible' : 'hidden'}>
        <Posts />    {/* pré-rendu à basse priorité si caché */}
      </Activity>
    </>
  );
}

Cas d'usage : Onglets, barres latérâles, écrans d'un flux multi-étapes dont on veut garder l'état ; pré-chargement du code et des données d'une page probable.

Anti-pattern : Cacher une <vidéo> ou un <iframe> sans couper la lecture dans un nettoyage d'effet : les effets de bord du DOM persistent.
#core#react19#performance

Depuis Chrome 135 (annonce du 24 mars 2025), appearance: base-select sur select et ::picker(select) rend la liste déroulante entièrement stylable ; les <option> acceptent du HTML riche (images, SVG). <selectedcontent>, unique enfant d'un <button> placé en tête du <select>, affiche un clone de l'option choisie. Disponibilité limitée, non Baseline ; repli automatique sur le select natif.

Une vitrine de pâtisserie à la place d'un menu texte : on voit ce qu'on choisit.

<select>
  <button><selectedcontent></selectedcontent></button>
  <option><img src="fr.svg" alt=""> Français</option>
  <option><img src="en.svg" alt=""> English</option>
</select>
<style>
  select, ::picker(select) { appearance: base-select; }
  select::picker-icon { transition: rotate .3s; }
  select:open::picker-icon { rotate: 180deg; }
  selectedcontent img { display: none; }
</style>

Cas d'usage : Sélecteurs de langue, de statut ou d'avatar accessibles et natifs, sans bibliothèque de « custom select » en JavaScript.

Anti-pattern : Mettre à jour dynamiquement le contenu d'une option déjà sélectionnée sans rafraîchir <selectedcontent> : le clone n'est refait qu'au changement.
#advanced

Composant stable depuis React 19.3 (9 septembre 2026), après une phase expérimentale annoncée le 23 avril 2025. Il anime les éléments qui entrent, sortent, se déplacent ou se partagent entre écrans en s'appuyant sur l'API View Transition du navigateur. Il ne se déclenche que dans une transition (startTransition, Suspense, useDeferredValue). addTransitionType permet de choisir l'animation selon la cause (navigation avant/arrière).

Le fondu enchaîné d'un monteur vidéo, appliqué automatiquement entre deux plans de votre interface.

import { ViewTransition, addTransitionType, startTransition } from 'react';

<ViewTransition
  enter={{ 'nav-forward': 'slide-left', 'nav-back': 'slide-right', default: 'auto' }}
  exit="auto"
>
  <Page />
</ViewTransition>

// Dans le routeur
startTransition(() => {
  addTransitionType('nav-' + direction);
  navigate(url);
});
/* CSS : ::view-transition-old(.slide-left) { animation: ... } */

Cas d'usage : Transitions de pages, agrandissement d'une vignette en plein écran (prop name partagée), apparition/disparition d'items de liste.

Anti-pattern : Placer <ViewTransition> sous un nœud DOM (il doit englober directement le contenu animé) ou ignorer prefers-reduced-motion.
#ui#react19#animation

@apply

Tailwind CSS 🟡 Mid

Directive qui injecte des utilitaires Tailwind dans une classe CSS. En v4, dans un fichier séparé (CSS module, <style> Vue/Svelte), il faut d'abord @référence la feuille principale pour accéder au thème, sans dupliquer le CSS émis.

Créer un raccourci clavier qui exécute plusieurs commandes d'un coup.

/* Component.vue <style> ou styles.module.css */
@reference "../../app.css";

.btn-primary {
  @apply px-4 py-2 bg-blue-500 text-white rounded-lg
    hover:bg-blue-700 transition-colors;
}

Cas d'usage : Extraire un composant réutilisable quand les classes sont trop longues dans le HTML.

Anti-pattern : Abuser de @apply pour tout, annulant l'intérêt de l'approche utility-first.
#styling#interview#tailwind#tailwind4

@at-root

Sass 🔴 Senior

Directive qui échappe au nesting pour générer le sélecteur a la racine du fichier CSS. Utile pour créer des sélecteurs frères ou globaux depuis un contexte imbrique.

Sortir de l'immeuble pour planter un arbre dans le jardin commun, pas sur ton balcon.

.card {
  color: black;
  @at-root .theme-dark #{&} {
    color: white;
  }
}
// CSS: .theme-dark .card { color: white; }

Cas d'usage : Générer des sélecteurs de theme ou de contexte sans casser la structure du nesting.

#styling#sass

@Body

NestJS 🟢 Junior? entretien

Décorateur de paramètre qui extrait le corps de la requête HTTP et le mappe sur un DTO. Peut cibler une propriété spécifique avec @Body('key'). Depuis NestJS 12.0.0, @Body() accepte aussi une option schema compatible Standard Schema (Zod, Valibot, ArkType), validée par StandardSchemaValidationPipe, en complément du flux class-validator historique.

Comme ouvrir un colis et en extraire le contenu pour le traiter.

@Post()
create(@Body() dto: CreateUserDto) {
  return this.userService.create(dto);
}

@Post('login')
login(@Body('email') email: string) {
  return this.authService.login(email);
}

Cas d'usage : Recevoir les données envoyées par le client dans les requêtes POST, PUT ou PATCH.

#core#interview#nest12

@each / @for / @while

Sass 🟡 Mid

Boucles Sass pour générer du CSS dynamiquement. @each itere sur des listes/maps, @for sur une plage numérique, @while tant qu'une condition est vraie.

Des machines qui produisent des variantes en série : même modèle, différentes couleurs/tailles.

$colors: (primary: #3498db, danger: #e74c3c);

@each $name, $color in $colors {
  .btn-#{$name} {
    background: $color;
    &:hover { background: darken($color, 10%); }
  }
}

Cas d'usage : Générer automatiquement des variantes de composants (couleurs, tailles, états) a partir de maps.

Anti-pattern : Générer trop de classes avec des boucles, gonflant le CSS final inutilement.
#styling#interview#sass

@extend

Sass 🟡 Mid

Directive qui fait hériter un sélecteur des styles d'un autre. Le sélecteur étendu est ajoute au sélecteur source dans le CSS compile (groupement de sélecteurs).

Copier les gènes d'un parent : l'enfant hérité de toutes les caractéristiques sans duplication.

.message {
  padding: 1rem;
  border: 1px solid;
  border-radius: 4px;
}
.success { @extend .message; border-color: green; }
.error { @extend .message; border-color: red; }
// CSS: .message, .success, .error { padding... }

Cas d'usage : Éviter la duplication CSS quand plusieurs sélecteurs partagent un ensemble commun de styles.

Anti-pattern : Enchaîner les @extend créé des sélecteurs CSS énormes et imprévisibles. Préférer les mixins.
#styling#interview#sass

Règle qui déclare une fonction CSS nommée --nom(), avec paramètrès typés, valeurs par défaut et descripteur result ; on l'appelle ensuite comme n'importe quelle fonction. Le résultat peut dépendre d'un @média interne. Disponibilité limitée, non Baseline.

Une recette de cuisine réutilisable : mêmes gestes, ingrédients différents.

@function --transparent(--color <color>, --alpha <number>: 0.8)
  returns <color> {
  result: oklch(from var(--color) l c h / var(--alpha));
}

@function --double(--value) {
  result: calc(var(--value) * 2);
}

.btn {
  background: --transparent(var(--brand), 0.5);
  padding: --double(8px); /* 16px */
}

Cas d'usage : Design systems : factoriser les conversions de couleur, d'espacement ou de tailles fluides sans préprocesseur.

Anti-pattern : Remplacer toutes les variables par des fonctions : réserver @function aux calculs vraiment paramétrés.
#advanced

@Get/@Post/@Put/@Delete/@Patch

NestJS 🟢 Junior? entretien

Décorateurs de méthode qui mappent les méthodes HTTP aux handlers du controller. Chacun définit le verbe HTTP et le chemin optionnel de la route.

Comme les panneaux directionnels dans un aéroport : chacun oriente vers la bonne porte d'embarquement.

@Controller('items')
export class ItemController {
  @Get() findAll() { /* ... */ }
  @Post() create(@Body() dto: CreateItemDto) { /* ... */ }
  @Put(':id') update(@Param('id') id: string) { /* ... */ }
  @Delete(':id') remove(@Param('id') id: string) { /* ... */ }
}

Cas d'usage : Définir les opérations CRUD standard sur une ressource REST.

Anti-pattern : Utiliser @Post pour des opérations de lecture ou @Get avec un body de requête.
#core#interview

@Headers

NestJS 🟢 Junior

Décorateur de paramètre qui extrait les headers HTTP de la requête. Peut cibler un header spécifique par nom ou récupérer tous les headers.

Comme lire l'étiquette sur un colis pour connaître l'expéditeur et le contenu.

@Get()
getData(@Headers('authorization') auth: string) {
  return this.service.getData(auth);
}

Cas d'usage : Extraire les tokens d'authentification, API keys ou headers custom des requêtes.

#core

@Inject

NestJS 🟡 Mid

Décorateur qui spécifie le token d'injection pour un paramètre de constructeur. Nécessaire pour les providers enregistres avec un token string ou symbol.

Comme préciser le nom exact du fournisseur quand il y a plusieurs pour le même type de service.

@Injectable()
export class AppService {
  constructor(
    @Inject('DATABASE_CONNECTION')
    private db: Connection,
  ) {}
}

Cas d'usage : Injecter des providers enregistres avec useValue/useFactory qui utilisent des tokens string.

#core

@Injectable

NestJS 🟢 Junior? entretien

Décorateur qui marque une classe comme injectable par le conteneur DI de NestJS. Obligatoire pour tout provider qui participe a l'injection de dépendances.

Comme un badge professionnel : sans lui, le système ne te reconnaît pas comme employé.

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

Cas d'usage : Annoter chaque service, guard, interceptor, pipe et tout provider custom.

Anti-pattern : Oublier @Injectable sur un service qui injecte d'autres dépendances, causant une erreur runtime.
#core#interview

@layer

Tailwind CSS 🟡 Mid

Organisation du CSS en couches natives (@layer base, components, utilities). En v4 les @tailwind base/components/utilities disparaissent au profit d'un seul @import ; @layer base et components restent valides, mais un utilitaire personnalisé se déclare avec @utility pour supporter les variantes.

Les étages d'un immeuble : base au sous-sol, composants au milieu, utilitaires au sommet (la plus haute priorité).

@import "tailwindcss";

@layer base {
  h1 { font-size: var(--text-2xl); }
}
@layer components {
  .card { padding: --spacing(4); box-shadow: var(--shadow-md); }
}
/* v3 : @layer utilities { .tab-4 {...} }  →  v4 : */
@utility tab-4 { tab-size: 4; }

Cas d'usage : Organiser ses styles custom pour qu'ils s'intègrent correctement dans le système de spécificité Tailwind.

#styling#tailwind#tailwind4

@media (prefers-*)

HTML / CSS 🟡 Mid

Média queries qui détectent les préférences utilisateur du système : prefers-color-scheme (thème), prefers-reduced-motion (animations), prefers-contrast (contraste élevé).

Comme un restaurant qui adapte automatiquement le menu selon les allergies déclarées du client.

@media (prefers-reduced-motion: reduce) {
  * { animation-duration: 0.01ms !important; }
}
@media (prefers-color-scheme: dark) {
  :root { --bg: #1a1a1a; --fg: #eee; }
}
@media (prefers-contrast: more) {
  .btn { border: 2px solid; }
}

Cas d'usage : Respecter les préférences système pour l'accessibilité, le confort visuel et les performances.

Anti-pattern : Ignorer prefers-reduced-motion et imposer des animations à tous les utilisateurs.
#core#accessibility#interview

@Param

NestJS 🟢 Junior

Décorateur de paramètre qui extrait les paramètrès de route de l'URL (ex: /users/:id). Peut cibler un paramètre spécifique ou récupérer tous les params.

Comme lire le numéro de chambre sur la clé d'hôtel pour savoir ou aller.

@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
  return this.userService.findOne(id);
}

Cas d'usage : Extraire les identifiants de ressources ou slugs depuis les URLs REST.

#core

@property

HTML / CSS 🔴 Senior

Règle at qui enregistre une custom property avec un type, une valeur initiale et un comportement d'héritage. Permet d'animer des variables CSS et d'ajouter une validation de type.

Comme déclarer le type d'une variable en TypeScript : on précise ce qu'elle peut contenir et sa valeur par défaut.

@property --hue {
  syntax: '<angle>';
  inherits: false;
  initial-value: 0deg;
}
.element {
  --hue: 0deg;
  background: hsl(var(--hue) 80% 50%);
  transition: --hue 0.5s;
}
.element:hover { --hue: 120deg; }

Cas d'usage : Animer des dégradés ou des couleurs via des transitions sur des custom properties typées.

#interview

@Query

NestJS 🟢 Junior

Décorateur de paramètre qui extrait les query parameters de l'URL (ex: ?page=1&limit=10). Supporte la transformation via pipes.

Comme les filtres de recherche sur un site e-commerce : ils affinent les résultats sans changer la page.

@Get()
findAll(
  @Query('page', new DefaultValuePipe(1), ParseIntPipe) page: number,
  @Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit: number,
) { return this.service.paginate(page, limit); }

Cas d'usage : Implémenter la pagination, le tri et le filtrage sur les endpoints de liste.

#core

@scope

HTML / CSS 🔴 Senior

Règle @scope qui limite la portée des styles à un sous-arbre DOM, avec une borne haute (racine) et optionnellement une borne basse (limite). Elle ajoute un critère de cascade, la proximité de portée. Baseline « Newly available » depuis mars 2026.

Comme une clôture de jardin avec une zone interdite au fond : les règles s'appliquent dans l'espace délimité.

@scope (.card) to (.card-footer) {
  p { color: navy; }
  a { text-decoration: underline; }
}
/* Les <p> dans .card-footer ne sont pas affectés */

Cas d'usage : Isoler les styles d'un composant sans Shadow DOM ni convention de nommage comme BEM.

#interview#baseline2026

@SetMetadata

NestJS 🟡 Mid

Décorateur qui attache des metadonnees personnalisées a un handler ou controller, lisibles via Reflector dans les guards ou interceptors.

Comme coller une étiquette 'VIP' ou 'Public' sur une porte pour que le vigile sache qui laisser entrer.

export const Roles = (...roles: string[]) =>
  SetMetadata('roles', roles);

@Post()
@Roles('admin')
create() { /* ... */ }

Cas d'usage : Définir les roles requis sur un endpoint pour les vérifier dans un RolesGuard.

#core#security

@source (détection des sources)

Tailwind CSS 🟡 Mid

Depuis Tailwind v4.0, la détection des classes est automatique et respecte .gitignore. @source ajoute un chemin ignoré (bibliothèque dans node_modules), @source not exclut un dossier, @import "tailwindcss" source(none) désactive l'automatique, et @source inline() remplace la safelist avec expansion d'accolades.

Dire au facteur quelles rues desservir en plus de sa tournée habituelle, et lesquelles éviter.

@import "tailwindcss";

@source "../node_modules/@acme/ui-lib";
@source not "../src/legacy";

/* safelist : bg-red-50 … bg-red-950 avec hover: */
@source inline("{hover:,}bg-red-{50,{100..900..100},950}");

Cas d'usage : Monorepos et bibliothèques de composants partagées, classes construites dynamiquement côté serveur.

Anti-pattern : Garder content: [...] dans un tailwind.config.js chargé par @config alors que @source fait le travail sans JavaScript.
#styling#tailwind#tailwind4

@starting-style

HTML / CSS 🔴 Senior

Règle @starting-style qui définit les styles de départ d'une transition d'entrée (display: none vers visible). Combinée à transition-behavior: allow-discrète, elle anime aussi la sortie. Baseline « Newly available » depuis août 2024.

Comme le rideau d'un théâtre : on définit la position de départ avant qu'il ne s'ouvre en douceur.

dialog[open] {
  opacity: 1;
  transition: opacity 0.3s, overlay 0.3s allow-discrete,
    display 0.3s allow-discrete;
  @starting-style { opacity: 0; }
}
dialog { opacity: 0; }

Cas d'usage : Animer l'ouverture de modales, popovers et éléments passant de display:none à visible.

#interview#baseline2024

@supports

HTML / CSS 🟡 Mid

Feature query CSS qui teste le support d'une propriété ou valeur avant de l'appliquer. Permet l'amélioration progressive en servant des styles de fallback aux navigateurs plus anciens.

Comme vérifier si un appareil a le bon adaptateur avant de le brancher, avec un plan B si ce n'est pas le cas.

.grid {
  display: flex; /* Fallback */
}
@supports (grid-template-columns: subgrid) {
  .grid {
    display: grid;
    grid-template-columns: subgrid;
  }
}

Cas d'usage : Utiliser des fonctionnalités CSS modernes avec fallback gracieux pour les navigateurs qui ne les supportent pas.

#core#interview

@tailwindcss/typography (Prose)

Tailwind CSS 🟡 Mid

Plugin officiel qui ajoute la classe prose pour styler du contenu riche (articles, markdown, CMS). En v4 il se charge avec la directive @plugin dans le CSS, plus via plugins: [] du fichier JS.

Un styliste personnel pour tes articles : il rend tout beau sans que tu touches a chaque élément.

<!-- app.css : @import "tailwindcss"; @plugin "@tailwindcss/typography"; -->
<article class="prose prose-lg dark:prose-invert max-w-none">
  <h1>Mon article</h1>
  <p>Le contenu est stylé automatiquement…</p>
</article>

Cas d'usage : Styler du contenu éditorial/markdown venant d'un CMS ou d'une base de données.

#styling#interview#tailwind#tailwind4

@theme (configuration CSS-first)

Tailwind CSS 🟡 Mid

Directive de Tailwind v4.0 (22 janvier 2025) qui remplace theme de tailwind.config.js. Chaque variable déclarée dans un espace de noms (--color-*, --font-*, --breakpoint-*, --spacing-*, --text-*…) génère les utilitaires et variantes correspondants, et reste disponible comme variable CSS native. --color-*: initial réinitialise un espace de noms ; @theme inline sert quand on référence d'autres variables.

Un tableau de bord où déplacer un curseur change toutes les pièces reliées d'un coup.

@import "tailwindcss";

@theme {
  --color-mint-500: oklch(0.72 0.11 178); /* bg-mint-500, text-mint-500… */
  --font-display: "Satoshi", sans-serif;  /* font-display */
  --breakpoint-3xl: 120rem;               /* 3xl:… */
}

@theme inline {
  --font-sans: var(--font-inter); /* référence une variable externe */
}

.custom { color: var(--color-mint-500); } /* utilisable en CSS pur */

Cas d'usage : Décrire la charte (couleurs, polices, points de rupture) dans la feuille principale et la partager avec le CSS maison.

Anti-pattern : Déclarer les tokens en CSS ordinaire (:root { --color-x }) : aucune classe utilitaire n'est générée sans @theme.
#styling#interview#tailwind#tailwind4

@use / @forward

Sass 🟡 Mid

@use importe un module Sass avec un espace de noms (module.$var), et peut le configurer avec with(). @forward réexporte les membres d'un module pour créer des points d'entrée. Migration automatique : sass-migrator module --migrate-deps entrée.scss.

@use c'est importer un outil, @forward c'est le mettre en vitrine dans ta boutique pour les autres.

// _colors.scss
$primary: blue !default;

// _index.scss
@forward 'colors';

// component.scss
@use 'settings' with ($primary: navy); // configure
.btn { color: settings.$primary; }
// ou @use 'settings' as *;  // => $primary sans préfixe

Cas d'usage : Remplacer @import (déprécie) par un système de modules avec namespaces et encapsulation.

Anti-pattern : Continuer à utiliser @import, déprécié depuis Dart Sass 1.80.0 et retiré dans Dart Sass 3.0, qui pollue la portée globale.
#styling#interview#sass#dart-sass

@UseFilters

NestJS 🟡 Mid

Décorateur qui attache un ou plusieurs filtres d'exception a un controller ou handler pour intercepter et formater les erreurs spécifiques.

Comme un traducteur qui reformule les erreurs techniques en messages compréhensibles pour le client.

@Controller('users')
@UseFilters(new HttpExceptionFilter())
export class UserController {
  @Post()
  create(@Body() dto: CreateUserDto) {
    return this.service.create(dto);
  }
}

Cas d'usage : Appliquer un format d'erreur personnalise pour un domaine spécifique de l'API.

#core

@UseGuards

NestJS 🟡 Mid

Décorateur qui attache un ou plusieurs guards a un controller ou un handler. Les guards s'exécutent avant le handler pour autoriser ou refuser l'accès.

Comme placer un vigile devant une porte spécifique ou a l'entrée de tout le bâtiment.

@Controller('admin')
@UseGuards(AuthGuard, RolesGuard)
export class AdminController {
  @Get('dashboard')
  getDashboard() { return 'admin data'; }
}

Cas d'usage : Protéger un controller entier ou des routes spécifiques avec authentification et autorisation.

#core#security

@UseInterceptors

NestJS 🟡 Mid

Décorateur qui attache un ou plusieurs interceptors a un controller ou handler pour transformer les requêtes/réponses ou ajouter des comportements transversaux.

Comme ajouter un filtre Instagram a une photo : le contenu est le même mais la présentation change.

@Controller('users')
@UseInterceptors(CacheInterceptor)
export class UserController {
  @Get()
  @UseInterceptors(ClassSerializerInterceptor)
  findAll() { return this.service.findAll(); }
}

Cas d'usage : Appliquer la sérialisation, le cache ou le logging sur des routes spécifiques.

#core

@UsePipes

NestJS 🟡 Mid

Décorateur qui attache un ou plusieurs pipes a un controller ou handler pour valider ou transformer les données entrantes automatiquement.

Comme un détecteur de métaux a l'entrée : il filtre automatiquement tout ce qui n'est pas conforme.

@Post()
@UsePipes(new ValidationPipe({ whitelist: true }))
create(@Body() dto: CreateUserDto) {
  return this.service.create(dto);
}

Cas d'usage : Activer la validation automatique des DTOs avec class-validator sur des routes spécifiques.

#core

Directive de Tailwind v4 qui déclare un utilitaire maison compatible avec toutes les variantes (hover:, lg:, dark:). La forme fonctionnelle nom-* accepte des valeurs via --value() (thème, entier nu, littéral, arbitraire) et un modificateur via --modifier(), avec --default() comme repli (v4.3). Elle remplace @layer utilities et addUtilities().

Ajouter sa propre pièce au jeu de construction, taillée pour s'emboîter avec les autres.

@utility content-auto {
  content-visibility: auto;
}

/* tab-2, tab-4, tab-[7] */
@utility tab-* {
  tab-size: --value(--tab-size-*, integer, [integer]);
}

/* text-fluid-3/1.2 : valeur + modificateur */
@utility text-fluid-* {
  font-size: --value(integer, --default(2));
  line-height: --modifier(number, --default(1.2));
}

Cas d'usage : Étendre Tailwind avec des propriétés absentes (content-visibility, text-shadow…) ou des échelles métier, sans plugin JavaScript.

Anti-pattern : Définir l'utilitaire dans @layer utilities comme en v3 : il ne réagira pas aux variantes.
#styling#tailwind#tailwind4

@variant et @custom-variant

Tailwind CSS 🟡 Mid

Deux directives v4. @variant applique une variante Tailwind (dark, hover, md…) à l'intérieur d'une règle CSS maison ; v4.3 (8 mai 2026) accepte les variantes empilées (hover:focus) et composées (hover, focus). @custom-variant crée une nouvelle variante à partir d'un sélecteur, par exemple pour piloter le mode sombre par classe.

Un tampon « uniquement le week-end » qu'on appose sur n'importe quelle règle.

@import "tailwindcss";

@custom-variant dark (&:where(.dark, .dark *));
@custom-variant hocus (&:hover, &:focus);

.button {
  background: var(--color-sky-500);
  @variant hover:focus { background: var(--color-sky-600); } /* empilée */
  @variant dark { background: var(--color-sky-300); }
}

Cas d'usage : Écrire du CSS de composant qui réutilise les variantes du projet, et définir des variantes métier (theme-midnight, hocus).

Anti-pattern : Réécrire les média queries et sélecteurs à la main dans le CSS custom au lieu d'utiliser les variantes existantes.
#styling#tailwind#tailwind4

A/B Test

Testing 🟡 Mid

Expérimentation ou deux variantes (A et B) sont présentées a des groupes d'utilisateurs différents pour mesurer laquelle performe le mieux selon des métriques définies.

Comme un restaurant qui teste deux recettes de dessert sur deux tables différentes et mesure laquelle est la plus commandée.

// Feature flag A/B test
const variant = getExperimentVariant(userId, 'checkout-v2');
if (variant === 'B') {
  return <NewCheckout />;
}
return <OldCheckout />;
// Tracking: analytics.track('purchase', { variant });

Cas d'usage : Pour prendre des décisions produit basées sur des données réelles plutôt que des opinions (boutons, textes, parcours).

Anti-pattern : Arrêter le test trop tôt sans signifiance statistique, menant a des conclusions fausses.
#testing#product#frontend

A2A (Agent2Agent Protocol)

IA / LLM 🔴 Senior

Standard ouvert de communication entre agents, créé par Google puis donné à la Linux Foundation, sous licence Apache 2.0, en version 1.0 ; le comité technique réunit AWS, Cisco, Google, IBM Research, Microsoft, Salesforce, SAP et ServiceNow. Chaque agent publie une Agent Card décrivant ses compétences, puis les agents s'échangent des tâches sans exposer leur mémoire ni leurs outils internes. Complémentaire de MCP : MCP relie un agent à ses outils, A2A relie des agents entre eux.

MCP est la prise pour brancher vos appareils ; A2A est le téléphone pour appeler un autre bureau.

// Agent Card (extrait) publiée par un agent A2A
{
  "name": "Agent Facturation Socy",
  "description": "Répond aux questions de facturation et émet des avoirs",
  "url": "https://agents.socy.fr/billing",
  "version": "1.0.0",
  "capabilities": { "streaming": true },
  "skills": [
    { "id": "issue-credit-note", "name": "Émettre un avoir",
      "description": "Crée un avoir à partir d'un numéro de facture" }
  ]
}

Cas d'usage : Systèmes multi-agents inter-équipes ou inter-entreprises où chaque agent reste une boîte noire.

Anti-pattern : Confondre A2A et MCP, ou déployer A2A pour deux agents du même dépôt qui pourraient s'appeler en fonction.
#ia#agents#protocoles

AAA (Arrange-Act-Assert)

Testing 🟢 Junior? entretien

Pattern de structuration des tests en 3 phases : Arrange (préparer les données), Act (exécuter l'action), Assert (vérifier le résultat). Rend les tests lisibles et uniformes.

Comme une recette de cuisine : préparer les ingrédients (Arrange), cuisiner (Act), goûter et vérifier (Assert).

test('applies 10% discount for VIP', () => {
  // Arrange
  const user = createUser({ vip: true });
  const cart = createCart({ total: 100 });
  // Act
  const finalPrice = applyDiscount(user, cart);
  // Assert
  expect(finalPrice).toBe(90);
});

Cas d'usage : Comme structure standard pour tous les tests unitaires afin de maintenir la lisibilité et la cohérence.

Anti-pattern : Mélanger Act et Assert dans la même ligne ou avoir plusieurs Act dans un seul test.
#testing#interview#principle

Aaron Swartz

Personalities 🟡 Mid

Programmeur et activiste américain, co-auteur de la spec RSS a 14 ans, co-fondateur de Reddit et militant pour le libre accès a l'information. Décédé en 2013 a 26 ans.

Le prodige qui voulait que le savoir soit libre pour tous — un génie du code devenu martyr du libre accès.

<!-- RSS 1.0 — co-ecrit par Aaron Swartz a 14 ans -->
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <channel>
    <title>Mon Blog</title>
    <link>https://example.com</link>
  </channel>
</rdf:RDF>

Cas d'usage : Comprendre les enjeux du libre accès a l'information et l'importance de l'activisme technologique.

#personalities#history#interview

ABAC

NestJS 🔴 Senior

Attribute-Based Access Control : système d'autorisation base sur les attributs du sujet, de la ressource et du contexte. Plus flexible que RBAC.

Comme une boite de nuit avec des règles complexes : âge + tenue + liste VIP + heure déterminant l'accès.

// Regle ABAC: l'auteur peut modifier son propre article
canActivate(ctx: ExecutionContext) {
  const user = ctx.switchToHttp().getRequest().user;
  const articleId = ctx.switchToHttp().getRequest().params.id;
  const article = await this.articleService.findOne(articleId);
  return article.authorId === user.id;
}

Cas d'usage : Implémenter des règles d'autorisation fines comme 'un auteur ne peut modifier que ses propres articles'.

#security

Abilities API

WordPress 🔴 Senior

Registre standardisé, introduit dans WordPress 6.9 « Gene » (2 décembre 2025), qui décrit des unités de fonctionnalité lisibles par machine : wp_register_ability() déclare label, description, input_schema, output_schema, exécuté_callback et permission_callback, sur le hook wp_abilities_api_init. Les abilities s'exposent en REST sous wp-abilities/v1. WordPress 7.0 ajoute un client côté navigateur et un client IA, 7.1 un cycle d'exécution filtrable.

La carte d'un restaurant lisible par un robot : chaque plat, ses ingrédients et qui a le droit de le commander.

add_action('wp_abilities_api_init', function () {
  wp_register_ability('my-plugin/get-post-count', [
    'label'       => __('Nombre d\'articles', 'my-plugin'),
    'description' => __('Retourne le total d\'articles publiés.'),
    'category'    => 'content-management',
    'execute_callback'    => fn() => wp_count_posts()->publish,
    'permission_callback' => fn() => current_user_can('read'),
    'meta' => ['show_in_rest' => true],
  ]);
});
// GET  /wp-json/wp-abilities/v1/abilities
// POST /wp-json/wp-abilities/v1/abilities/my-plugin/get-post-count/run

Cas d'usage : Exposer proprement les actions d'une extension aux agents IA, aux automatisations et aux autres extensions, avec schéma et permissions.

Anti-pattern : Appeler wp_register_ability() hors du hook wp_abilities_api_init : _doing_it_wrong() et l'enregistrement échoue.
#advanced#wordpress#wp69#ia

AbortController

JavaScript 🟡 Mid

API pour annuler des opérations asynchrones (fetch, event listeners, streams). Créé un signal qui peut être passe a n'importe quelle API supportant l'annulation.

Un bouton d'arrêt d'urgence : tu peux stopper une opération en cours a tout moment.

const controller = new AbortController();
fetch('/api/data', { signal: controller.signal })
  .catch(err => {
    if (err.name === 'AbortError') console.log('Annule');
  });
// Annuler apres 5s
setTimeout(() => controller.abort(), 5000);

Cas d'usage : Timeout de requêtes fetch, annulation lors du démontage d'un composant React, cleanup de listeners.

Anti-pattern : Ne jamais annuler les fetch dans les useEffect React, provoquant des memory leaks.
#core#async#navigateur

Abstract Class

PHP 🟡 Mid

Classe qui ne peut pas être instanciee directement et qui sert de modèle. Elle peut contenir des méthodes abstraites (sans corps) et des méthodes concrètes.

Comme un plan d'architecte : il définit la structure mais on ne peut pas y habiter, il faut d'abord construire la maison.

abstract class Shape {
  abstract public function area(): float;
  public function describe(): string {
    return get_class($this) . ': ' . $this->area();
  }
}

Cas d'usage : Quand plusieurs classes partagent une logique commune mais doivent chacune implémenter certains comportements spécifiques.

Anti-pattern : Utiliser une classe abstraite la ou une interface suffirait, créant un couplage inutile.
#core#interview#oop

Abstract Factory

Architecture 🟡 Mid? entretien

Fournit une interface pour créer des familles d'objets lies sans spécifier leurs classes concrètes. C'est une factory de factories.

Un catalogue IKEA par style : tu choisis 'scandinave' et tu obtiens table, chaise et lampe assorties.

class DarkThemeFactory {
  createButton() { return new DarkButton(); }
  createInput() { return new DarkInput(); }
}
// Usage: const ui = getFactory('dark');

Cas d'usage : Créer des composants UI cohérents par theme ou des connecteurs DB par provider.

Anti-pattern : Créer une abstract factory pour un seul produit — utiliser Factory Method suffit.
#architecture#interview#gof#creational

Abstract Factory

PHP 🔴 Senior

Pattern qui fournit une interface pour créer des familles d'objets lies sans spécifier leurs classes concrètes. Étend le Factory Method a plusieurs produits.

Comme un concessionnaire de marque : Peugeot produit berlines ET SUV, Toyota aussi, mais dans leur propre style.

interface UIFactory {
  public function createButton(): Button;
  public function createInput(): Input;
}
class DarkThemeFactory implements UIFactory {
  public function createButton(): Button { return new DarkButton(); }
  public function createInput(): Input { return new DarkInput(); }
}

Cas d'usage : Quand on doit créer des familles d'objets cohérents (theme UI, drivers de base de données).

Anti-pattern : Introduire une Abstract Factory quand une simple Factory Method suffit.
#advanced#pattern

Acceptance Test

Testing 🟡 Mid

Test qui vérifie qu'une fonctionnalité répond aux critères d'acceptation définis par le Product Owner ou le client. Souvent écrit en langage naturel (Gherkin).

Comme la checklist du client lors de la réception d'une maison neuve : chaque point du cahier des charges est vérifié.

// En Gherkin (Cucumber)
// Feature: Connexion utilisateur
//   Scenario: Login reussi
//     Given un utilisateur inscrit "[email protected]"
//     When il saisit son mot de passe correct
//     Then il voit son tableau de bord
//     And un cookie de session est cree

Cas d'usage : Pour formaliser et automatiser les critères d'acceptation du Product Owner en tests exécutables.

Anti-pattern : Écrire des tests d'acceptance trop techniques que le PO ne peut pas lire ni valider.
#testing#agile#product

Accessibility Tree

HTML / CSS 🟡 Mid

Représentation parallèle au DOM que le navigateur construit pour les technologies d'assistance. Chaque noeud contient un rôle, un nom, un état et une valeur accessibles.

Comme le plan d'évacuation d'un bâtiment : une vue simplifiée qui ne montre que les infos essentielles pour naviguer.

<!-- Le navigateur crée un noeud accessible : -->
<!-- Role: button, Name: 'Envoyer', State: enabled -->
<button aria-label="Envoyer le formulaire">
  <svg>...</svg>
</button>

Cas d'usage : Pour comprendre et déboguer ce que les lecteurs d'écran communiquent réellement aux utilisateurs.

Anti-pattern : Ne jamais inspecter l'arbre d'accessibilité dans DevTools et supposer que le rendu visuel suffit.
#core#accessibility

accessor (auto-accessors)

TypeScript 🔴 Senior

Mot-clé accessor introduit en TypeScript 4.9 pour les classes : accessor x = 1 déclare un champ privé de stockage et une paire getter/setter publique sur le prototype. Il vient de la proposition TC39 Decorators (Stage 2.7 au 27 septembre 2026), où il permet aux décorateurs d'intercepter lectures et écritures, ce qu'un champ ordinaire ne permet pas.

Une boîte aux lettres avec fente et clé : on passe toujours par l'ouverture, jamais par le fond de la boîte.

function suivi<T>(cible: ClassAccessorDecoratorTarget<any, T>,
                  ctx: ClassAccessorDecoratorContext) {
  return {
    set(this: any, v: T) {
      console.log(`${String(ctx.name)} ←`, v);
      cible.set.call(this, v);
    },
  };
}
class Compteur {
  @suivi accessor valeur = 0; // get/set générés, stockage privé
}

Cas d'usage : Décorateurs de réactivité, de validation ou d'observation de propriétés (frameworks, ORM).

Anti-pattern : Utiliser accessor sans décorateur ni logique : un simple champ suffit et coûte moins.
#advanced#ts4.9#decorators

ACID

DevOps 🟡 Mid? entretien

Propriétés des transactions relationnelles. Atomicité (tout ou rien), Cohérence, Isolation (pas d'interférence), Durabilité (persisté après commit).

Un virement bancaire : soit les deux comptes sont mis à jour, soit aucun. Pas de demi-transfert.

const trx = await db.transaction();
try {
  await trx('accounts').where({ id: from }).decrement('balance', amount);
  await trx('accounts').where({ id: to }).increment('balance', amount);
  await trx.commit();
} catch (e) {
  await trx.rollback();
}

Cas d'usage : Garantir l'intégrité des données financières, commandes, stocks.

Anti-pattern : Faire deux requêtes séparées au lieu d'une transaction : incohérence si crash entre les deux.
#devops#database#interview

ACID in MongoDB

MongoDB 🔴 Senior

Depuis la version 4.0, MongoDB supporte les propriétés ACID (Atomicité, Cohérence, Isolation, Durabilite) au niveau multi-documents. Un seul document est toujours ACID nativement.

MongoDB a passe son permis ACID : avant il ne conduisait qu'un document, maintenant il gère tout un convoi.

// ACID single doc : toujours garanti
db.accounts.updateOne(
  { _id: 'A' },
  { $inc: { balance: -100 }, $push: { log: 'debit' } }
);

Cas d'usage : Justifier le choix de MongoDB pour des applications nécessitant des garanties transactionnelles.

#sgbd#interview#database#mongodb

Action (React Router)

React 🟡 Mid

Fonction associée à une route qui traite les mutations (POST, PUT, DELETE) soumises par un <Form>. Après l'action, React Router revalide automatiquement les loaders de la page. Depuis la v8 (17 juin 2026), l'action peut être précédée d'un middleware (auth, contexte), activé par défaut.

Comme la boite aux lettres d'un bureau : tu deposes ton courrier (formulaire), le bureau (action) le traite.

import { redirect } from 'react-router';
import type { Route } from './+types/new-user';

export async function action({ request }: Route.ActionArgs) {
  const form = await request.formData();
  await api.createUser(Object.fromEntries(form));
  return redirect('/users');   // les loaders sont revalidés
}
// <Form method="post"> déclenche l'action sans JS custom

Cas d'usage : Gérer les soumissions de formulaires avec revalidation automatique des loaders après mutation.

#routing#forms

Action Hook

WordPress 🟢 Junior

Hook qui permet d'exécuter du code a un moment précis du cycle WordPress (init, wp_head, save_post, etc.). Ne retourne pas de valeur.

Comme une alarme programmée : quand elle sonne, tu exécutés l'action prévue.

add_action('save_post', function(int $postId): void {
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
  update_post_meta($postId, '_custom_field', 'value');
}, 10, 1);

Cas d'usage : Pour exécuter du code en réaction a un evenement WordPress : création de post, login, activation de plugin.

Anti-pattern : Accrocher du code lourd (requêtes API) sur des hooks fréquents comme 'init' sans condition.
#core#interview#wordpress

Actions (transitions asynchrones)

React 🟡 Mid? entretien

Depuis React 19 (5 décembre 2024), une fonction asynchrone passée à startTransition ou à la prop action d'un <form> est une « Action ». React gère pour vous l'état pending, le séquencement, les erreurs (remontées à l'Error Boundary) et la réinitialisation du formulaire. Les hooks useActionState, useFormStatus et useOptimistic sont bâtis dessus.

Un serveur de restaurant qui prend la commande, annonce « c'est en cours », et revient vous prévenir si la cuisine a un souci : vous n'avez plus à surveiller la porte.

function UpdateName() {
  const [name, setName] = useState('');
  const [error, setError] = useState(null);
  const [isPending, startTransition] = useTransition();

  function handleSubmit() {
    startTransition(async () => {         // Action
      const err = await updateName(name); // isPending géré par React
      if (err) { setError(err); return; }
      redirect('/profile');
    });
  }
  return <button onClick={handleSubmit} disabled={isPending}>Enregistrer</button>;
}

Cas d'usage : Toute mutation déclenchée par l'utilisateur (enregistrer, liker, supprimer) où l'on affichait auparavant un état isLoading manuel.

Anti-pattern : Gérer à la main isLoading/error avec trois useState alors qu'une Action fournit isPending et la propagation d'erreur.
#core#react19#interview

Deux patterns ORM opposes. Active Record (Éloquent) : l'objet connaît sa persistence. Data Mapper (Doctrine) : un mapper externe gère la persistence, l'entité reste pure.

Active Record : un employé qui classe lui-même ses dossiers. Data Mapper : un archiviste indépendant qui gère le classement.

// Active Record (Eloquent)
$user = User::find(1);
$user->name = 'Alice';
$user->save();

// Data Mapper (Doctrine)
$user = $em->find(User::class, 1);
$user->setName('Alice');
$em->flush();

Cas d'usage : Active Record pour les projets simples/rapides, Data Mapper pour les domaines complexes avec logique métier riche.

Anti-pattern : Utiliser Active Record sur un domaine complexe et finir avec des modèles de 1000 lignes mélangeant métier et persistence.
#core#interview#architecture

Ada Lovelace

Personalities 🟢 Junior

Mathématicienne britannique considérée comme la première programmeuse de l'histoire. Elle a écrit le premier algorithme destine a être exécuté par une machine, la machine analytique de Charles Babbage.

La première personne a avoir écrit une recette de cuisine... avant même que le four n'existe.

// Premier algorithme de l'histoire (1843)
// Calcul des nombres de Bernoulli
// sur la Machine Analytique de Babbage
// — Bien avant l'electricite

Cas d'usage : Connaître les origines de la programmation et comprendre que l'informatique a des racines bien antérieures aux ordinateurs électroniques.

Anti-pattern : Penser qu'elle n'était qu'une theoricienne : son algorithme était concret et exécutable.
#personalities#history#interview

Adapter

Architecture 🟢 Junior

Convertit l'interface d'une classe en une autre interface attendue par le client. Permet a des classes incompatibles de collaborer.

Un adaptateur de prise électrique : ta prise française fonctionne dans une prise anglaise grâce a l'adaptateur.

class StripeAdapter {
  constructor(stripe) { this.stripe = stripe; }
  pay(amount) {
    return this.stripe.charges.create({ amount });
  }
}

Cas d'usage : Intégrer une librairie tierce dont l'API ne correspond pas a votre interface interne.

Anti-pattern : Adapter toute l'application a la librairie externe au lieu d'isoler l'adaptation.
#architecture#interview#gof#structural

ADR (Architecture Decision Record)

Architecture 🟢 Junior? entretien

Document court, versionné avec le code, qui consigne une décision d'architecture importante : contexte, décision, conséquences, statut (proposé, accepté, déprécié, remplacé). Popularisé par Michael Nygard dans son billet « Documenting Architecture Décisions » de 2011, le format a évolué vers des modèles comme MADR. Une ADR n'est jamais modifiée après acceptation : on en écrit une nouvelle qui la remplace.

Le journal de bord d'un capitaine : on ne réécrit pas les pages d'hier, on ajoute celle d'aujourd'hui en expliquant pourquoi on change de cap.

# docs/adr/0007-remplacer-ingress-nginx-par-gateway-api.md
# 7. Remplacer Ingress NGINX par la Gateway API
Date : 2026-03-02
Statut : Accepté (remplace ADR-0003)
## Contexte
Ingress NGINX est retiré par le projet Kubernetes en mars 2026 :
plus de correctifs de sécurité.
## Décision
Migrer vers Envoy Gateway + HTTPRoute via ingress2gateway.
## Conséquences
+ routage canary natif, rôles séparés plateforme/équipes
- formation, réécriture des annotations spécifiques

Cas d'usage : Toute décision structurante (base de données, découpage en services, framework, hébergement) qu'un nouvel arrivant devra comprendre dans deux ans.

Anti-pattern : Écrire l'ADR après coup pour justifier, ou la modifier en silence : elle perd sa valeur d'historique honnête.
#architecture#documentation#interview

Adrian Cockcroft

Personalities 🔴 Senior

Architecte britannique, ancien de Sun, eBay et Netflix, où il a dirigé la migration pionnière vers le cloud et les microservices, puis VP chez AWS (2016-2022). Retraité du travail à plein temps le 3 juin 2022, il est aujourd'hui associé et analyste chez OrionX (durabilité, HPC, IA).

Le capitaine qui a navigue Netflix du datacenter vers le cloud — et tout le monde a suivi sa carte.

// Architecture Netflix — Adrian Cockcroft
// Patterns cloud-native :
// - Circuit Breaker (Hystrix)
// - Service Discovery (Eureka)
// - API Gateway (Zuul)
// - Config Server
// Netflix OSS = reference cloud-native

Cas d'usage : Les patterns Netflix sont devenus des standards de l'industrie (resilience, observabilite, microservices).

#personalities#history#interview

Advisory Locks

PostgreSQL 🔴 Senior? entretien

Verrous coopératifs applicatifs gères par PostgreSQL. Contrairement aux verrous de table, ils n'ont de sens que pour l'application qui les utilise. Peuvent être session-level ou transaction-level.

Un panneau 'Occupe' sur une cabine : c'est l'application qui le respecte, pas la base qui bloque.

-- Verrou au niveau session
SELECT pg_advisory_lock(42);
-- ... logique exclusive ...
SELECT pg_advisory_unlock(42);

Cas d'usage : Éviter les exécutions concurrentes de cron jobs ou de migrations sur la même ressource logique.

#sgbd#interview#database#postgresql

Agent IA

IA / LLM 🟡 Mid? entretien

Système où le LLM décide lui-même de ses étapes et de ses appels d'outils pour atteindre un objectif, par opposition au workflow dont le chemin est fixé par le code (distinction posée par Anthropic le 19 décembre 2024). Un agent = un modèle + des outils + une boucle + un contexte géré. À réserver aux tâches ouvertes où l'erreur est rattrapable (tests, revue, rollback).

Un stagiaire autonome à qui l'on confie une mission, un badge d'accès limité et un point d'étape régulier.

// Critères avant de construire un agent (Anthropic, « Building effective agents »)
const shouldBuildAgent = {
  complexite: 'tâche multi-étapes difficile à spécifier à l\'avance',
  valeur:     'le résultat justifie coût et latence supérieurs',
  viabilite:  'le modèle est réellement compétent sur ce type de tâche',
  coutErreur: 'les erreurs sont détectables et réversibles (tests, revue, rollback)',
};
// Un seul « non » → rester sur un appel simple ou un workflow codé.
const agentOK = Object.values(shouldBuildAgent).every(Boolean);

Cas d'usage : Agent de code (Claude Code, Codex), agent support qui consulte CRM et base de tickets, agent de recherche.

Anti-pattern : Construire un agent pour un besoin qui tient en un appel ou une chaîne de deux prompts.
#ia#agents#interview

Famille d'outils qui exécutent des tâches de développement de bout en bout. Cursor : éditeur-agent basé sur VS Code, règles dans .cursor/rules, choix du modèle (Claude, GPT, Gemini, Composer). GitHub Copilot cloud agent : on lui assigne une issue, il travaille dans GitHub Actions et ouvre une PR brouillon (59 min max par session). Codex d'OpenAI : CLI en Rust, extension IDE, version web et application bureau.

Trois collègués avec des styles différents : l'un vit dans votre éditeur, l'autre travaille la nuit sur GitHub, le troisième dans un terminal.

# Codex CLI (OpenAI)
curl -fsSL https://chatgpt.com/codex/install.sh | sh
codex "ajoute des tests pour le module auth et fais-les passer"

# GitHub Copilot cloud agent : assigner une issue à @copilot
gh issue create --title "Corriger le 500 sur /export" --assignee copilot
# → travaille dans GitHub Actions, ouvre une PR brouillon à relire

# Cursor : règles de projet versionnées
mkdir -p .cursor/rules && cat > .cursor/rules/style.mdc <<'EOF'
---
description: Conventions TypeScript du projet
alwaysApply: true
---
Strict mode, pas de any, tests Vitest à côté du fichier.
EOF

Cas d'usage : Choisir l'outil selon le flux : édition interactive, tâches asynchrones sur issues, automatisation terminal.

Anti-pattern : Fusionner une PR d'agent sans la relire parce que la CI est verte : la CI ne teste que ce qui est testé.
#ia#agents#outils#dev