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.
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é.
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.
!default assigne une valeur seulement si la variable n'existe pas encore (ideal 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 : Creer des librairies Sass configurables ou les utilisateurs peuvent overrider les valeurs par defaut.
Methode chainable qui attache des attributs par defaut ou calcules a un styled component. Evite de repeter les memes props a chaque utilisation.
Les reglages par defaut 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 : Definir des attributs HTML par defaut (type, role, aria-*) sur un styled component.
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_StoreCas d'usage : Accélérer le build et éviter de copier des fichiers sensibles ou inutiles dans l'image.
Directive qui marque un composant comme Client Component, activant l'interactivite (state, effets, handlers). Frontiere 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.
Directive qui marque une fonction comme Server Action : elle s'execute sur le serveur mais peut etre appelee depuis le client, comme un RPC transparent.
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 donnees (formulaires, CRUD) sans creer de route API separee.
Directive CSS qui permet d'extraire des utilitaires Tailwind dans des classes CSS custom. Utile pour les composants reutilisables ou l'integration avec du CSS existant.
Creer un raccourci clavier qui execute plusieurs commandes d'un coup.
/* styles.css */
.btn-primary {
@apply px-4 py-2 bg-blue-500 text-white
rounded-lg hover:bg-blue-700
transition-colors font-medium;
}Cas d'usage : Extraire un composant reutilisable quand les classes sont trop longues dans le HTML.
Directive qui echappe au nesting pour generer le selecteur a la racine du fichier CSS. Utile pour creer des selecteurs freres 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 : Generer des selecteurs de theme ou de contexte sans casser la structure du nesting.
Decorateur de parametre qui extrait le corps de la requete HTTP et le mappe sur un DTO. Peut cibler une propriete specifique avec @Body('key').
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 donnees envoyees par le client dans les requetes POST, PUT ou PATCH.
Boucles Sass pour generer du CSS dynamiquement. @each itere sur des listes/maps, @for sur une plage numerique, @while tant qu'une condition est vraie.
Des machines qui produisent des variantes en serie : meme modele, differentes couleurs/tailles.
$colors: (primary: #3498db, danger: #e74c3c);
@each $name, $color in $colors {
.btn-#{$name} {
background: $color;
&:hover { background: darken($color, 10%); }
}
}Cas d'usage : Generer automatiquement des variantes de composants (couleurs, tailles, etats) a partir de maps.
Directive qui fait heriter un selecteur des styles d'un autre. Le selecteur etendu est ajoute au selecteur source dans le CSS compile (groupement de selecteurs).
Copier les genes d'un parent : l'enfant herite de toutes les caracteristiques 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 : Eviter la duplication CSS quand plusieurs selecteurs partagent un ensemble commun de styles.
Decorateurs de methode qui mappent les methodes HTTP aux handlers du controller. Chacun definit le verbe HTTP et le chemin optionnel de la route.
Comme les panneaux directionnels dans un aeroport : 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 : Definir les operations CRUD standard sur une ressource REST.
Decorateur de parametre qui extrait les headers HTTP de la requete. Peut cibler un header specifique par nom ou recuperer tous les headers.
Comme lire l'etiquette sur un colis pour connaitre l'expediteur 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 requetes.
Decorateur qui specifie le token d'injection pour un parametre de constructeur. Necessaire pour les providers enregistres avec un token string ou symbol.
Comme preciser le nom exact du fournisseur quand il y a plusieurs pour le meme 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.
Decorateur qui marque une classe comme injectable par le conteneur DI de NestJS. Obligatoire pour tout provider qui participe a l'injection de dependances.
Comme un badge professionnel : sans lui, le systeme ne te reconnait pas comme employe.
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}Cas d'usage : Annoter chaque service, guard, interceptor, pipe et tout provider custom.
Directive qui organise le CSS en couches (base, components, utilities). Permet de controler la specificite et l'ordre de vos styles custom.
Les etages d'un immeuble : base au sous-sol, composants au milieu, utilitaires au sommet (la plus haute priorite).
@layer base {
h1 { @apply text-2xl font-bold; }
}
@layer components {
.card { @apply p-4 rounded-lg shadow; }
}
@layer utilities {
.text-shadow { text-shadow: 2px 2px 4px #0003; }
}Cas d'usage : Organiser ses styles custom pour qu'ils s'integrent correctement dans le systeme de specificite Tailwind.
Media 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.
Decorateur de parametre qui extrait les parametres de route de l'URL (ex: /users/:id). Peut cibler un parametre specifique ou recuperer tous les params.
Comme lire le numero de chambre sur la cle d'hotel 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.
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.
Decorateur de parametre 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 resultats 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 : Implementer la pagination, le tri et le filtrage sur les endpoints de liste.
Règle at qui limite la portée des styles à un sous-arbre DOM spécifique, avec une borne haute (scope root) et optionnellement une borne basse (scope limit). Résout le problème de fuite de styles.
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.
Decorateur qui attache des metadonnees personnalisees a un handler ou controller, lisibles via Reflector dans les guards ou interceptors.
Comme coller une etiquette '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 : Definir les roles requis sur un endpoint pour les verifier dans un RolesGuard.
Règle at qui définit les styles de départ pour les transitions d'entrée d'éléments (display: none vers visible). Permet d'animer l'apparition d'éléments sans JavaScript.
Comme le rideau d'un théâtre : on définit la position de départ avant qu'il ne s'ouvre en douceur.
dialog {
opacity: 1; transition: opacity 0.3s;
}
@starting-style {
dialog { opacity: 0; }
}
dialog:not([open]) { opacity: 0; }Cas d'usage : Animer l'ouverture de modales, popovers et éléments passant de display:none à visible.
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.
Plugin officiel qui ajoute la classe prose pour styler automatiquement du contenu riche (articles, markdown, CMS). Gere les titres, listes, code, citations.
Un styliste personnel pour tes articles : il rend tout beau sans que tu touches a chaque element.
<article class="prose prose-lg prose-blue
dark:prose-invert max-w-none">
<h1>Mon Article</h1>
<p>Le contenu est automatiquement style...</p>
<pre><code>const x = 1;</code></pre>
</article>Cas d'usage : Styler du contenu editorial/markdown venant d'un CMS ou d'une base de donnees.
@use importe un module Sass avec un namespace (variables accessibles via module.$var). @forward re-exporte les membres d'un module pour creer des points d'entree.
@use c'est importer un outil, @forward c'est le mettre en vitrine dans ta boutique pour les autres.
// _colors.scss
$primary: blue;
// _index.scss
@forward 'colors';
// component.scss
@use 'settings'; // => settings.$primary
// ou @use 'settings' as *; // => $primaryCas d'usage : Remplacer @import (deprecie) par un systeme de modules avec namespaces et encapsulation.
Decorateur qui attache un ou plusieurs filtres d'exception a un controller ou handler pour intercepter et formater les erreurs specifiques.
Comme un traducteur qui reformule les erreurs techniques en messages comprehensibles 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 specifique de l'API.
Decorateur qui attache un ou plusieurs guards a un controller ou un handler. Les guards s'executent avant le handler pour autoriser ou refuser l'acces.
Comme placer un vigile devant une porte specifique ou a l'entree de tout le batiment.
@Controller('admin')
@UseGuards(AuthGuard, RolesGuard)
export class AdminController {
@Get('dashboard')
getDashboard() { return 'admin data'; }
}Cas d'usage : Proteger un controller entier ou des routes specifiques avec authentification et autorisation.
Decorateur qui attache un ou plusieurs interceptors a un controller ou handler pour transformer les requetes/reponses ou ajouter des comportements transversaux.
Comme ajouter un filtre Instagram a une photo : le contenu est le meme mais la presentation change.
@Controller('users')
@UseInterceptors(CacheInterceptor)
export class UserController {
@Get()
@UseInterceptors(ClassSerializerInterceptor)
findAll() { return this.service.findAll(); }
}Cas d'usage : Appliquer la serialisation, le cache ou le logging sur des routes specifiques.
Decorateur qui attache un ou plusieurs pipes a un controller ou handler pour valider ou transformer les donnees entrantes automatiquement.
Comme un detecteur de metaux a l'entree : 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 specifiques.
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 supplementaire sur une fiche sans rien effacer de ce qui est deja ecrit.
{ $addFields: {
totalPrice: {
$multiply: ['$price', '$quantity']
},
isExpensive: {
$gt: ['$price', 100]
}
}}Cas d'usage : Enrichir les documents avec des champs calcules sans perdre les donnees originales.
Stage d'aggregation qui distribue les documents dans des intervalles (buckets) definis par des bornes. Utile pour creer des histogrammes ou des tranches.
Trier des eleves par tranche d'age : 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 : Creer des rapports avec des tranches de prix, d'ages ou de scores.
Stage d'aggregation qui execute plusieurs sous-pipelines en parallele sur le meme jeu de documents. Chaque sous-pipeline produit un resultat independant dans un seul document de sortie.
Un journaliste qui ecrit trois angles differents du meme evenement en meme temps.
{ $facet: {
byCategory: [
{ $group: { _id: '$cat', n: { $sum: 1 } } }
],
priceStats: [
{ $group: { _id: null, avg: { $avg: '$price' } } }
],
total: [{ $count: 'count' }]
}}Cas d'usage : Generer un dashboard avec des statistiques multiples en un seul appel a la base.
Stage d'aggregation qui regroupe les documents par une cle (_id) et applique des accumulateurs ($sum, $avg, $max, $min, $push, $first). Equivalent du GROUP BY en SQL.
Trier des billes par couleur dans des bols differents, 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 metriques agregees par categorie, utilisateur, periode ou tout autre critere de regroupement.
Stage d'aggregation qui realise une jointure gauche (LEFT JOIN) entre deux collections. Ajoute un tableau de documents correspondants depuis la collection jointe.
Appeler le service comptabilite pour joindre les factures de chaque client a leur fiche.
{ $lookup: {
from: 'orders',
localField: '_id',
foreignField: 'userId',
as: 'userOrders'
}}Cas d'usage : Combiner des donnees de collections separees quand l'embedding n'est pas adapte.
Stage d'aggregation qui filtre les documents, equivalent du WHERE en SQL. Place en debut de pipeline, il utilise les index pour optimiser les performances.
Le vigile a l'entree de la boite de nuit : seuls ceux qui remplissent les criteres passent.
{ $match: {
status: 'active',
createdAt: { $gte: new Date('2024-01-01') }
}}Cas d'usage : Filtrer les documents en amont du pipeline pour reduire le volume de donnees traite par les stages suivants.
Stage d'aggregation qui restructure les documents en incluant, excluant ou creant de nouveaux champs calcules. Permet de renommer des champs et d'appliquer des expressions.
Un monteur video qui selectionne les scenes a garder et ajoute des effets speciaux.
{ $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.
Stage d'aggregation qui decompacte un champ tableau en creant un document par element. Transforme un document avec un tableau de N elements 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 : Preparer les donnees d'un tableau pour un $group ou un $sort sur les elements individuels.
Methode de la classe $wpdb pour creer des requetes SQL parametrees dans WordPress. Equivalent des prepared statements PDO, adapte a l'ecosysteme WP.
Comme un coffre-fort avec une serrure a combinaison : les donnees ne peuvent pas s'echapper du cadre prevu.
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 requete SQL directe dans WordPress qui inclut des variables.
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.
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.
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 matieres : 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 developpeur sache ou trouver et ajouter du code.
Experimentation ou deux variantes (A et B) sont presentees a des groupes d'utilisateurs differents pour mesurer laquelle performe le mieux selon des metriques definies.
Comme un restaurant qui teste deux recettes de dessert sur deux tables differentes et mesure laquelle est la plus commandee.
// 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 decisions produit basees sur des donnees reelles plutot que des opinions (boutons, textes, parcours).
Pattern de structuration des tests en 3 phases : Arrange (preparer les donnees), Act (executer l'action), Assert (verifier le resultat). Rend les tests lisibles et uniformes.
Comme une recette de cuisine : preparer les ingredients (Arrange), cuisiner (Act), gouter et verifier (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 lisibilite et la coherence.
Programmeur et activiste americain, co-auteur de la spec RSS a 14 ans, co-fondateur de Reddit et militant pour le libre acces a l'information. Decede en 2013 a 26 ans.
Le prodige qui voulait que le savoir soit libre pour tous — un genie du code devenu martyr du libre acces.
<!-- 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 acces a l'information et l'importance de l'activisme technologique.
Attribute-Based Access Control : systeme 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 regles complexes : age + tenue + liste VIP + heure determinant l'acces.
// 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 : Implementer des regles d'autorisation fines comme 'un auteur ne peut modifier que ses propres articles'.
API pour annuler des operations asynchrones (fetch, event listeners, streams). Cree un signal qui peut etre passe a n'importe quelle API supportant l'annulation.
Un bouton d'arret d'urgence : tu peux stopper une operation 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 requetes fetch, annulation lors du demontage d'un composant React, cleanup de listeners.
Classe qui ne peut pas etre instanciee directement et qui sert de modele. Elle peut contenir des methodes abstraites (sans corps) et des methodes concretes.
Comme un plan d'architecte : il definit 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 implementer certains comportements specifiques.
Pattern qui fournit une interface pour creer des familles d'objets lies sans specifier leurs classes concretes. Etend 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 creer des familles d'objets coherents (theme UI, drivers de base de donnees).
Fournit une interface pour creer des familles d'objets lies sans specifier leurs classes concretes. 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 : Creer des composants UI coherents par theme ou des connecteurs DB par provider.
Test qui verifie qu'une fonctionnalite repond aux criteres d'acceptation definis par le Product Owner ou le client. Souvent ecrit en langage naturel (Gherkin).
Comme la checklist du client lors de la reception d'une maison neuve : chaque point du cahier des charges est verifie.
// En Gherkin (Cucumber)
// Feature: Connexion utilisateur
// Scenario: Login reussi
// Given un utilisateur inscrit "alice@test.com"
// When il saisit son mot de passe correct
// Then il voit son tableau de bord
// And un cookie de session est creeCas d'usage : Pour formaliser et automatiser les criteres d'acceptation du Product Owner en tests executables.
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.
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.
Depuis la version 4.0, MongoDB supporte les proprietes ACID (Atomicite, Coherence, 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 gere 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 necessitant des garanties transactionnelles.
Fonction associee a une route qui gere les mutations de donnees (POST, PUT, DELETE) via les soumissions de formulaires natifs.
Comme la boite aux lettres d'un bureau : tu deposes ton courrier (formulaire), le bureau (action) le traite.
export async function createAction({ request }) {
const formData = await request.formData();
await api.createUser(Object.fromEntries(formData));
return redirect('/users');
}
// Route: { path: 'users/new', action: createAction }Cas d'usage : Gerer les soumissions de formulaires avec revalidation automatique des loaders apres mutation.
Hook qui permet d'executer du code a un moment precis du cycle WordPress (init, wp_head, save_post, etc.). Ne retourne pas de valeur.
Comme une alarme programmee : quand elle sonne, tu executes l'action prevue.
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 executer du code en reaction a un evenement WordPress : creation de post, login, activation de plugin.
Deux patterns ORM opposes. Active Record (Eloquent) : l'objet connait sa persistence. Data Mapper (Doctrine) : un mapper externe gere la persistence, l'entite reste pure.
Active Record : un employe qui classe lui-meme ses dossiers. Data Mapper : un archiviste independant qui gere 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 metier riche.
Mathematicienne britannique consideree comme la premiere programmeuse de l'histoire. Elle a ecrit le premier algorithme destine a etre execute par une machine, la machine analytique de Charles Babbage.
La premiere personne a avoir ecrit une recette de cuisine... avant meme 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'electriciteCas d'usage : Connaitre les origines de la programmation et comprendre que l'informatique a des racines bien anterieures aux ordinateurs electroniques.
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 electrique : ta prise francaise fonctionne dans une prise anglaise grace a l'adaptateur.
class StripeAdapter {
constructor(stripe) { this.stripe = stripe; }
pay(amount) {
return this.stripe.charges.create({ amount });
}
}Cas d'usage : Integrer une librairie tierce dont l'API ne correspond pas a votre interface interne.
Architecte britannique, ancien VP Cloud chez Netflix et AWS. Il a dirige la migration pionniere de Netflix vers le cloud et les microservices, posant les bases de l'architecture cloud-native.
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-nativeCas d'usage : Les patterns Netflix sont devenus des standards de l'industrie (resilience, observabilite, microservices).
Verrous cooperatifs applicatifs geres par PostgreSQL. Contrairement aux verrous de table, ils n'ont de sens que pour l'application qui les utilise. Peuvent etre 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 : Eviter les executions concurrentes de cron jobs ou de migrations sur la meme ressource logique.
Groupe d'entites et de value objects traite comme une unite de coherence transactionnelle. Toutes les modifications passent par la racine d'agregat.
Un bon de commande avec ses lignes : tu ne modifies jamais une ligne directement, tu passes toujours par la commande.
class Order {
#items = [];
addItem(product, qty) {
this.#items.push(new OrderLine(product, qty));
this.recalculateTotal();
}
}Cas d'usage : Garantir les invariants metier dans un perimetre transactionnel defini.
Entite principale d'un agregat qui sert de point d'entree unique. Les objets externes ne peuvent referencer que la racine, jamais les entites internes.
Le chef d'equipe : toute communication avec l'equipe passe par lui pour garantir la coherence.
// Order est la racine, OrderLine est interne
const order = await orderRepo.findById(id);
order.addItem(product, qty); // Pas: orderLine.setQty()
await orderRepo.save(order);Cas d'usage : Proteger les invariants metier en forçant toutes les operations via un point d'entree unique.
Framework de transformation de donnees ou les documents passent par une sequence d'etapes (stages). Chaque stage transforme les documents et les passe au suivant, comme un pipeline Unix.
Une chaine de montage en usine : chaque poste (stage) effectue une operation sur la piece avant de la passer au suivant.
db.orders.aggregate([
{ $match: { status: 'completed' } },
{ $group: {
_id: '$customerId',
total: { $sum: '$amount' }
}},
{ $sort: { total: -1 } }
]);Cas d'usage : Calculer des statistiques, generer des rapports ou transformer des donnees complexes directement dans MongoDB.
Mathematicien britannique, pere de l'informatique theorique. Il a formalise le concept de machine universelle (machine de Turing) et a joue un role decisif dans le dechiffrement d'Enigma pendant la Seconde Guerre mondiale.
L'architecte qui a dessine les plans de tous les ordinateurs... avant qu'aucun ne soit construit.
// Machine de Turing — concept fondamental
// Etat + Ruban + Regles de transition
// Si etat=q0 et symbole=1 alors
// ecrire 0, deplacer droite, aller q1
// Base theorique de TOUT programmeCas d'usage : Comprendre les fondements theoriques de l'informatique : calculabilite, decidabilite et les limites de ce qu'un ordinateur peut resoudre.
Service SaaS de recherche instantanée avec typo-tolerance, facettes et analytics intégrés. Offre des widgets UI prêts à l'emploi (InstantSearch).
Un moteur de recherche Google clé en main pour votre propre site, avec résultats en moins de 50ms.
import algoliasearch from 'algoliasearch';
const client = algoliasearch('APP_ID', 'SEARCH_KEY');
const index = client.initIndex('products');
const { hits } = await index.search('iphone', {
filters: 'price < 1000',
hitsPerPage: 20,
});Cas d'usage : Ajouter rapidement une recherche performante sur un site e-commerce ou une documentation.
Ecosysteme de librairies CSS-in-JS alternatives : Emotion (API similaire + css prop), Stitches (variants), Vanilla Extract (zero-runtime), Panda CSS (build-time).
Differentes marques de voiture : meme but (se deplacer), moteurs et options differents.
// Emotion
import { css } from '@emotion/react'
<div css={css`color: red;`} />
// Vanilla Extract
import { style } from '@vanilla-extract/css'
const box = style({ color: 'red' })Cas d'usage : Choisir la librairie CSS-in-JS adaptee aux contraintes du projet (perf, DX, SSR).
Proxy helper deploye a cote d'un service pour gerer les connexions sortantes (retry, circuit breaker, monitoring). Variante du Sidecar.
Un ambassadeur diplomatique : il represente ton pays et gere les protocoles complexes a ta place.
// Le sidecar ambassador gere le retry et le circuit breaking
// L'app appelle simplement localhost:9000
const res = await fetch('http://localhost:9000/external-api');Cas d'usage : Simplifier les connexions sortantes d'un service vers des APIs externes.
Fichiers de declaration (.d.ts) qui decrivent la forme de code JavaScript existant sans implementation. Permettent a TS de typer des libs JS.
Comme un plan architectural sans les murs reels — il decrit la structure sans la construire.
// globals.d.ts
declare const API_URL: string;
declare function legacy(x: number): string;
// Utilisable partout sans importCas d'usage : Typer des bibliotheques JavaScript, des variables globales injectees ou du code legacy.
API CSS qui positionne un élément relativement à un autre (l'ancre) sans JS. Gère automatiquement le repositionnement quand l'espace manque (fallback positioning).
Comme un post-it attaché à un objet spécifique sur un bureau : il suit l'objet et se déplace si l'espace manque.
.trigger { anchor-name: --btn; }
.tooltip {
position: fixed;
position-anchor: --btn;
top: anchor(bottom);
left: anchor(center);
position-try: flip-block;
}Cas d'usage : Positionner des tooltips, popovers et menus contextuels par rapport à leur déclencheur sans Floating UI.
Informaticien danois, createur de TypeScript, C# et Turbo Pascal. Chez Microsoft, il a transforme l'ecosysteme JavaScript avec TypeScript, adopte massivement par l'industrie.
Le traducteur qui a ajoute la grammaire a JavaScript — comme mettre des panneaux de signalisation sur une autoroute sans regles.
// TypeScript — Anders Hejlsberg, 2012
interface User {
name: string;
age: number;
}
const greet = (user: User): string => {
return `Hello, ${user.name}!`;
};Cas d'usage : TypeScript est devenu le standard pour les projets JS professionnels. Comprendre son createur aide a saisir sa philosophie.
Chercheur slovaco-canadien en IA, ancien directeur IA chez Tesla (Autopilot) et chez OpenAI. Ses tutoriels YouTube sur les reseaux de neurones 'from scratch' sont des references pedagogiques.
Le YouTuber PhD qui code des reseaux de neurones en live comme d'autres font des recettes de cuisine.
# micrograd — Andrej Karpathy
# Moteur autograd en 100 lignes
class Value:
def __init__(self, data):
self.data = data
self.grad = 0
def __add__(self, other):
return Value(self.data + other.data)
def backward(self): ...Cas d'usage : Ses projets pedagogiques (micrograd, nanoGPT, minGPT) sont les meilleures ressources pour comprendre l'IA de l'interieur.
Informaticien britannico-americain, co-fondateur de Coursera et de Google Brain. Son cours de Machine Learning sur Coursera est le plus suivi au monde, formant des millions de personnes a l'IA.
Le prof de maths qui a rendu l'IA accessible a tout le monde — son cours gratuit a forme plus de devs IA que toutes les universites reunies.
# Machine Learning — Andrew Ng
# Regression lineaire (cours Coursera)
import numpy as np
def gradient_descent(X, y, theta, alpha, n):
for _ in range(n):
h = X @ theta
theta -= (alpha/len(y)) * X.T @ (h - y)
return thetaCas d'usage : Son cours Coursera est LE point d'entree recommande pour apprendre le machine learning.
Classes animate-* pour les animations predefinies (spin, ping, pulse, bounce) et transition-* pour les transitions CSS avec duree et easing configurables.
animate c'est une choregraphie complete, transition c'est juste un fondu entre deux poses.
<div class="animate-spin h-8 w-8 border-4
border-blue-500 rounded-full border-t-transparent">
</div>
<button class="transition-all duration-300 ease-in-out
hover:scale-105 hover:shadow-lg">Bouton</button>Cas d'usage : Ajouter du mouvement subtil aux interactions utilisateur (loading spinners, hover effects).
Classes sans nom definies a la volee avec new class. Utiles pour creer des implementations jetables d'interfaces, surtout dans les tests.
Comme un figurant dans un film : il joue son role une seule fois sans avoir besoin d'un nom au generique.
$mock = new class implements Logger {
public array $logs = [];
public function log(string $msg): void {
$this->logs[] = $msg;
}
};Cas d'usage : Pour les tests unitaires (mocks rapides) ou les implementations uniques dans des factories.
Outil de configuration management et d'automatisation agentless (via SSH). Utilise des playbooks YAML déclaratifs pour configurer des serveurs.
Un chef d'équipe qui donne des instructions par téléphone (SSH) sans avoir besoin d'installer un logiciel sur place.
# playbook.yml
- hosts: webservers
tasks:
- name: Install nginx
apt: name=nginx state=present
- name: Start nginx
service: name=nginx state=startedCas d'usage : Configurer des serveurs, déployer des applications, orchestrer des tâches multi-machines.
Couche de traduction entre votre domaine et un systeme externe ou legacy. Empeche les concepts etrangers de polluer votre modele.
Un traducteur-interprete entre deux pays : il adapte non seulement la langue mais aussi les conventions culturelles.
class LegacyUserAdapter {
toModernUser(legacyData) {
return new User({
id: legacyData.USR_ID,
name: `${legacyData.FNAME} ${legacyData.LNAME}`,
});
}
}Cas d'usage : Integrer un systeme legacy sans contaminer votre domaine avec ses conventions.
Plateforme de streaming distribué à haute performance. Les messages sont persistés dans des topics partitionnés, consommés par des consumer groups.
Un journal officiel : les articles (messages) sont publiés, archivés, et chaque lecteur (consumer) peut relire depuis n'importe quelle date.
// Producer
await producer.send({
topic: 'user-events',
messages: [{ key: userId, value: JSON.stringify(event) }]
});
// Consumer
await consumer.subscribe({ topic: 'user-events' });
await consumer.run({ eachMessage: async ({ message }) => {
processEvent(JSON.parse(message.value));
}});Cas d'usage : Event sourcing, streaming de données temps réel, communication inter-services à grande échelle.
Point d'entree unique pour toutes les requetes client. Gere routage, authentification, rate limiting, aggregation et transformation.
La reception d'un hotel : tous les clients passent par elle, et elle dirige vers le bon service.
// Kong / AWS API Gateway config
routes:
- path: /users
service: user-service
plugins: [rate-limit, jwt-auth]
- path: /orders
service: order-serviceCas d'usage : Entree unifiee pour les microservices avec concerns transversaux centralises.
Bonnes pratiques de gestion des clés API : génération sécurisée, stockage hashé côté serveur, rotation régulière, scoping des permissions et révocation.
Des clés de voiture numérotées avec un registre : on sait qui a quelle clé, on peut la désactiver à distance.
const apiKey = `sk_live_${crypto.randomBytes(32).toString('hex')}`;
// Store only hash in DB
const hash = crypto.createHash('sha256').update(apiKey).digest('hex');
await db.insert({ hash, userId, permissions: ['read'], expiresAt });Cas d'usage : Fournir un accès programmatique à votre API avec traçabilité et contrôle granulaire.
Offset : skip/limit simple mais instable sur les donnees qui changent. Cursor : basee sur un marqueur stable, performante a grande echelle.
Offset : 'page 5 d'un livre' (instable si on ajoute des pages). Cursor : 'lire a partir du marque-page' (toujours fiable).
// Offset: GET /users?page=3&limit=20
// Cursor: GET /users?after=eyJpZCI6MTAwfQ&limit=20
const cursor = Buffer.from(JSON.stringify({ id: lastId })).toString('base64');Cas d'usage : Offset pour les petits datasets avec UI de pages. Cursor pour les feeds infinis et les APIs a fort volume.
Limite le nombre de requetes qu'un client peut faire dans un intervalle de temps. Protege contre les abus, le DDoS et la surcharge.
Le nombre max de retraits au distributeur par jour : protege la banque et ton compte.
// Express rate limiter
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 min
max: 100, // 100 requetes par fenetre
});
app.use('/api/', limiter);Cas d'usage : APIs publiques, protection contre les abus, equite d'acces entre clients.
Strategies pour faire evoluer une API sans casser les clients existants : URL path (/v1/), header (Accept), query param. Chaque approche a ses tradeoffs.
Les editions d'un manuel scolaire : la v1 reste disponible pendant que la v2 est utilisee par les nouveaux etudiants.
// URL versioning (le plus courant)
app.use('/api/v1/users', usersV1Router);
app.use('/api/v2/users', usersV2Router);
// Header versioning
// Accept: application/vnd.api+json;version=2Cas d'usage : APIs publiques avec des clients que vous ne controlez pas et qui ne migrent pas en meme temps.
Orchestre les use cases de l'application : coordonne le domaine, les repositories et les services externes. Ne contient pas de logique metier.
Un chef de projet : il coordonne les equipes mais ne code pas lui-meme.
class PlaceOrderUseCase {
async execute(dto) {
const order = Order.create(dto);
await this.repo.save(order);
await this.eventBus.publish(order.events);
}
}Cas d'usage : Orchestrer un use case complet : validation, persistance, publication d'events.
Syntaxe entre crochets permettant d'utiliser des valeurs custom non prevues dans le theme. Evite de modifier la config pour des cas ponctuels.
Un joker dans un jeu de cartes : tu l'utilises quand aucune carte standard ne convient.
<div class="top-[117px] w-[calc(100%-2rem)]
bg-[#1da1f2] grid-cols-[1fr_2fr]
text-[clamp(1rem,2vw,1.5rem)]">
</div>Cas d'usage : Respecter une maquette pixel-perfect avec des valeurs specifiques sans polluer la config Tailwind.
Attributs WAI-ARIA qui définissent le rôle d'un élément pour les technologies d'assistance. Ils complètent ou remplacent la sémantique native quand le HTML seul ne suffit pas.
Comme un badge nominatif qui précise la fonction de quelqu'un dans une équipe, même si son titre officiel est différent.
<div role="alert">Erreur de saisie</div>
<div role="tablist">
<button role="tab" aria-selected="true">Tab 1</button>
<div role="tabpanel">Contenu</div>
</div>Cas d'usage : Quand un composant custom (onglets, modal, menu) ne peut pas utiliser d'éléments HTML natifs.
Methodes fonctionnelles : map (transformer), filter (filtrer), reduce (accumuler), find/findIndex (chercher), some/every (tester), flat/flatMap (aplatir). Chainables et non-mutantes.
Un pipeline de cuisine : laver (filter), couper (map), mixer (reduce) — chaque etape transforme sans toucher au stock original.
const result = users
.filter(u => u.active)
.map(u => u.name)
.sort();
const total = prices.reduce((sum, p) => sum + p, 0);
const found = items.find(i => i.id === 42);Cas d'usage : Transformation de donnees, filtrage de listes, calculs d'aggregation, recherche.
PostgreSQL supporte nativement les colonnes de type tableau. Permet de stocker plusieurs valeurs du meme type dans une seule colonne, avec des operateurs dedies (@>, &&, ANY).
Une cellule Excel qui peut contenir une liste de valeurs au lieu d'une seule.
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
tags TEXT[] DEFAULT '{}'
);
SELECT * FROM posts WHERE 'sql' = ANY(tags);
SELECT * FROM posts WHERE tags @> '{sql,pg}';Cas d'usage : Stocker des tags, des permissions ou de petites listes sans creer une table de jointure.
Zone de memoire brute de taille fixe, non redimensionnable. Accessible via des TypedArrays (Uint8Array, Float32Array, etc.) ou DataView pour lire/ecrire des donnees binaires.
Un terrain vague cloture : il existe en memoire, mais tu as besoin d'outils (TypedArray) pour y construire quelque chose.
const buf = new ArrayBuffer(16);
const view = new Uint8Array(buf);
view[0] = 255;
const float = new Float32Array(buf);
// Meme memoire, vue differenteCas d'usage : Traitement d'images, audio, fichiers binaires, communication avec WebGL ou WASM.
Syntaxe compacte pour les fonctions anonymes avec =>, qui ne possede ni son propre this, ni arguments, ni super. Le this est herite du scope lexical englobant.
Un assistant qui n'a pas de bureau propre (pas de this) : il utilise toujours le bureau de son chef (scope parent).
const add = (a, b) => a + b;
const greet = name => `Hello ${name}`;
const getObj = () => ({ key: 'value' });
class Timer {
start() {
setInterval(() => console.log(this), 1000);
// this = instance Timer (lexical)
}
}Cas d'usage : Callbacks, methodes de tableaux (map, filter), quand on veut capturer le this du parent.
Syntaxe courte fn() => pour les closures a une seule expression, avec capture automatique des variables du scope parent par valeur.
Comme un post-it avec une instruction rapide au lieu d'ecrire une lettre complete.
$prices = [10, 20, 30];
$tax = 0.2;
$withTax = array_map(
fn($price) => $price * (1 + $tax),
$prices
);Cas d'usage : Pour les callbacks courts dans array_map, array_filter et autres fonctions d'ordre superieur.
Fichier ou ensemble de fichiers produits par un job CI/CD (binaire, image Docker, rapport de tests). Passé entre stages ou archivé.
Le produit fini sortant d'un atelier, prêt à être livré ou inspecté au poste suivant.
- uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/Cas d'usage : Partager le résultat du build entre le job de build et le job de deploy.
Prop speciale qui change l'element HTML rendu sans modifier les styles. Un Button styled.button peut etre rendu comme un <a> avec as="a".
Un acteur qui joue differents roles avec le meme costume.
const Button = styled.button`
padding: 0.5rem 1rem;
background: blue;
color: white;
`
// Rendu comme <a> avec les memes styles
<Button as="a" href="/page">Lien style</Button>
// Rendu comme un autre composant
<Button as={Link} to="/page">Nav</Button>Cas d'usage : Reutiliser les styles d'un composant sur un element HTML different (button -> a, div -> section).
Propriété aspect-ratio qui maintient un rapport largeur/hauteur fixe sur un élément. Remplace le hack du padding-top en pourcentage pour les conteneurs responsives.
Comme un cadre photo qui garde toujours les mêmes proportions, quelle que soit sa taille.
.video-container {
aspect-ratio: 16 / 9;
width: 100%;
}
.avatar {
aspect-ratio: 1;
border-radius: 50%;
}Cas d'usage : Maintenir les proportions des vidéos, images et cartes sans le hack du padding-bottom.
Fonction avec une signature asserts qui lance une erreur si la condition n'est pas remplie. Apres l'appel, le type est narrowe pour le reste du scope.
Comme un douanier qui refuse l'entree et arrete tout si vos papiers sont invalides — pas de retour possible.
function assertString(val: unknown): asserts val is string {
if (typeof val !== "string") throw new Error("Not string");
}
const x: unknown = getData();
assertString(x);
x.toUpperCase(); // x est string iciCas d'usage : Validation stricte en debut de fonction qui narrowe les types pour tout le reste du bloc.
Sucre syntaxique sur les Promises. async declare une fonction retournant une Promise, await suspend l'execution jusqu'a la resolution. Rend le code asynchrone lisible comme du synchrone.
Commander un cafe et attendre au comptoir : tu ne fais rien d'autre en attendant (await), mais le reste du cafe (event loop) continue de tourner.
async function fetchUser(id) {
try {
const res = await fetch(`/api/users/${id}`);
return await res.json();
} catch (err) {
console.error('Fetch failed', err);
}
}Cas d'usage : Ecrire du code asynchrone lisible pour les appels API, acces BD, operations fichiers.
Fonction async function* combinant generateurs et async/await. Peut yield des valeurs de maniere asynchrone, consommable via for await...of.
Un chef qui prepare les plats un par un (yield) en attendant chaque ingredient de la livraison (await).
async function* pollData(url, ms) {
while (true) {
const res = await fetch(url);
yield await res.json();
await new Promise(r => setTimeout(r, ms));
}
}Cas d'usage : Polling periodique, lecture de flux reseau, traitement de files de messages.
Protocole pour iterer sur des sequences asynchrones. L'objet implemente [Symbol.asyncIterator]() et next() retourne une Promise de {value, done}. Utilisable avec for await...of.
Un podcast en streaming : chaque episode arrive de maniere asynchrone, et tu les ecoutes un par un.
async function* fetchPages(url) {
let page = 1;
while (true) {
const data = await fetch(`${url}?p=${page++}`);
const json = await data.json();
if (!json.length) return;
yield json;
}
}
for await (const page of fetchPages('/api')) {}Cas d'usage : Pagination API, lecture de streams, traitement de donnees en flux.
Approche où chaque classe CSS fait exactement une chose (une propriété, une valeur). Le CSS total est borné car les classes sont réutilisées partout. Tailwind et UnoCSS l'implémentent.
Comme un alphabet : un nombre fini de lettres pour écrire une infinité de mots.
/* Atomic classes */
.d-flex { display: flex; }
.ai-center { align-items: center; }
.p-4 { padding: 1rem; }
.bg-blue { background: blue; }
<div class="d-flex ai-center p-4 bg-blue">Cas d'usage : Grands projets où la taille du CSS doit rester constante même si le nombre de composants augmente.
Approche ou chaque classe CSS ne fait qu'une seule chose. Les outils comme Tailwind, Griffel ou Stylex generent des classes atomiques pour minimiser la taille du CSS.
Un alphabet : chaque lettre est simple, mais tu peux ecrire tous les mots en les combinant.
/* Atomic CSS genere */
.a { display: flex; }
.b { padding: 8px; }
.c { color: blue; }
/* Usage */
<div class="a b c">...</div>
/* Au lieu de: .card { display:flex; padding:8px; color:blue; } */Cas d'usage : Reduire drastiquement la taille du CSS final car les declarations sont partagees entre composants.
Objet global fournissant des operations atomiques sur les SharedArrayBuffer : load, store, add, sub, and, or, xor, wait, notify. Garantit l'integrite en contexte multithread.
Un tour de parole officiel : chaque personne attend son tour pour parler (wait/notify) et ses mots sont enregistres sans interruption (operations atomiques).
const sab = new SharedArrayBuffer(4);
const arr = new Int32Array(sab);
Atomics.store(arr, 0, 42);
Atomics.load(arr, 0); // 42
Atomics.add(arr, 0, 8); // ancien: 42
Atomics.load(arr, 0); // 50Cas d'usage : Synchronisation entre workers, compteurs partages, mutex software.
Metadonnees structurees ajoutees au code via #[...], introduites en PHP 8.0. Remplacent les annotations en commentaires par une syntaxe native.
Comme des etiquettes collees sur des boites : elles decrivent le contenu sans le modifier.
#[Route('/api/users', methods: ['GET'])]
class UserController {
#[Cache(ttl: 3600)]
public function list(): Response {
// ...
}
}Cas d'usage : Pour la configuration declarative : routes, validation, serialisation, ORM mapping.
Mecanismes d'authentification de MongoDB. SCRAM (Salted Challenge Response Authentication Mechanism) est le defaut, x509 utilise des certificats TLS pour une authentification sans mot de passe.
SCRAM = badge avec code PIN. x509 = empreinte digitale, impossible a falsifier.
// Creer un utilisateur SCRAM
db.createUser({
user: 'admin',
pwd: 'secret',
roles: [{ role: 'readWrite', db: 'mydb' }]
});Cas d'usage : Securiser l'acces a la base en production, SCRAM pour les humains, x509 pour les services.
Piege de performance ou trop d'options avec autoload=yes sont chargees en memoire a chaque requete. Une table wp_options volumineuse ralentit tout le site.
Comme charger TOUS tes dossiers dans ton sac chaque matin au lieu de prendre seulement ceux du jour.
// Mauvais : autoload par defaut = yes
update_option('huge_data', $bigArray);
// Bon : desactiver autoload
update_option('huge_data', $bigArray, false);
// Audit
// SELECT SUM(LENGTH(option_value)) FROM wp_options
// WHERE autoload = 'yes';Cas d'usage : Lors de l'audit de performance d'un site WordPress lent au premier chargement.
React 18 regroupe automatiquement plusieurs mises a jour d'etat en un seul re-rendu, meme dans les callbacks asynchrones et les timeouts.
Comme un facteur qui attend d'avoir tout le courrier du quartier avant de faire sa tournee, au lieu d'un aller-retour par lettre.
// React 18: un seul re-rendu pour les deux
async function handleClick() {
const data = await fetchData();
setName(data.name); // batch
setAge(data.age); // batch -> 1 seul rendu
}Cas d'usage : Amelioration automatique des performances sans intervention du developpeur en React 18+.
Plugin PostCSS qui ajoute automatiquement les prefixes vendeur (-webkit-, -moz-, etc.) selon la liste de navigateurs cibles (browserslist). Plus besoin de les ecrire manuellement.
Un traducteur qui ajoute automatiquement les sous-titres dans toutes les langues necessaires.
/* Input */
.box { display: flex; user-select: none; }
/* Output avec Autoprefixer */
.box {
display: -webkit-flex;
display: flex;
-webkit-user-select: none;
user-select: none;
}Cas d'usage : Garantir la compatibilite navigateurs sans ecrire manuellement les prefixes vendeur.
Utility type qui decompresse recursivement les Promise imbriquees pour obtenir le type de la valeur resolue finale.
Comme ouvrir des paquets cadeaux emboites jusqu'a trouver le vrai cadeau au centre.
type A = Awaited<Promise<string>>; // string
type B = Awaited<Promise<Promise<number>>>; // number
type C = Awaited<string>; // stringCas d'usage : Obtenir le type resolu d'une fonction async ou d'une chaine de Promises pour le typage correct.
Type d'index par defaut dans PostgreSQL. Structure en arbre equilibre optimisee pour les comparaisons d'egalite et de plage (<, >, BETWEEN, ORDER BY).
Un dictionnaire avec des onglets alphabetiques : tu trouves n'importe quel mot en quelques sauts.
CREATE INDEX idx_users_email
ON users (email);
-- Equivalent a :
CREATE INDEX idx_users_email
ON users USING btree (email);Cas d'usage : Optimiser les requetes de recherche, tri et filtrage sur des colonnes frequemment interrogees.
Transpileur JavaScript historique qui transforme la syntaxe moderne (ES2024+, JSX) en code compatible avec les anciens navigateurs. Remplace progressivement par SWC et esbuild.
Comme un traducteur universel : il prend votre texte moderne et le traduit en langue ancienne que tout le monde comprend.
// babel.config.json
{
"presets": [
["@babel/preset-env", { "targets": "> 0.5%" }],
"@babel/preset-react",
"@babel/preset-typescript"
]
}Cas d'usage : Pour les projets legacy necessitant des transformations custom ou un support navigateurs tres anciens.
Propriété backdrop-filter qui applique des effets graphiques (flou, saturation) à la zone derrière un élément. Crée des effets de verre dépoli (glassmorphism) sans image.
Comme une vitre dépolie dans une salle de bain : on voit les formes à travers mais pas les détails.
.glass-panel {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(12px) saturate(180%);
border: 1px solid rgba(255, 255, 255, 0.2);
}Cas d'usage : Créer des navbars ou panneaux en glassmorphism qui laissent transparaître le contenu en fond.
Informaticienne americaine, creatrice du principe de substitution de Liskov (le L de SOLID). Elle a aussi concu le langage CLU qui a influence Python, Java et C#.
La gardienne de l'heritage : grace a elle, quand tu crees une sous-classe, tu sais qu'elle ne cassera pas le contrat du parent.
// Principe de Liskov (LSP)
// Si S est sous-type de T, alors tout objet T
// peut etre remplace par un objet S
// sans casser le programme
class Bird { fly() {} }
class Penguin extends Bird { fly() { throw Error() } }
// VIOLATION du LSP !Cas d'usage : Principe fondamental de la POO, question classique en entretien et pilier de SOLID.
Fichier index.ts/js qui re-exporte les modules d'un dossier pour simplifier les imports. Peut nuire au tree shaking et au temps de build si mal utilise.
Un sommaire de livre : pratique pour trouver un chapitre, mais si le sommaire force a charger tout le livre, c'est contre-productif.
// components/index.ts (barrel)
export { Button } from './Button';
export { Modal } from './Modal';
export { Input } from './Input';
// Usage
import { Button } from './components';Cas d'usage : API publiques de librairies, organisation de dossiers de composants.
Fichiers index.ts qui re-exportent tout un dossier. Pratique pour les imports mais cause des problemes de tree-shaking et de performance en chargeant du code inutilise.
Comme une porte d'entree unique pour un centre commercial : pratique pour trouver, mais vous devez traverser tout le batiment meme pour un seul magasin.
// src/utils/index.ts (barrel file)
export { formatDate } from './date';
export { formatCurrency } from './currency';
export { sendEmail } from './email'; // lourd!
// Probleme: import { formatDate } from './utils'
// => charge aussi sendEmail inutilement
// Fix: import directement depuis le fichier sourceCas d'usage : Acceptable pour les librairies publiees, mais a eviter dans le code applicatif pour les performances.
Modèle de cohérence des systèmes distribués NoSQL. Basically Available, Soft state, Eventually consistent. Opposé à ACID, favorise la disponibilité.
Un réseau social : ton post apparaît chez toi immédiatement mais chez tes amis quelques secondes plus tard.
// Écriture sur le noeud primaire
await primary.set('user:123', userData);
// La replica peut avoir un léger retard
const cached = await replica.get('user:123');
// Peut retourner l'ancienne valeur pendant quelques msCas d'usage : Systèmes à très haute disponibilité où un léger délai de cohérence est acceptable.
Behavior-Driven Development : extension du TDD qui exprime les tests en langage metier (Given-When-Then) pour favoriser la collaboration entre devs, QA et PO.
Comme ecrire le scenario d'un film avant de le tourner : tout le monde (realisateur, acteurs, producteur) comprend l'histoire.
// Cucumber + step definitions
// Feature: Panier d'achat
// Scenario: Ajout d'un produit
// Given un panier vide
// When j'ajoute "iPhone" au panier
// Then le panier contient 1 article
Given('un panier vide', () => { cart = new Cart(); });
When('j\'ajoute {string} au panier', (item) => {
cart.add(item);
});Cas d'usage : Pour les projets ou la communication entre equipes techniques et metier est critique pour la qualite.
Convention de nommage Block-Element-Modifier qui structure les classes CSS. Block = composant, Element = partie interne (__), Modifier = variante (--).
Comme un système d'adresse : Pays__Ville--Quartier identifie précisément chaque zone.
/* Block */
.card {}
/* Element */
.card__title {}
.card__body {}
/* Modifier */
.card--featured {}
.card__title--large {}Cas d'usage : Organiser le CSS de projets moyens à grands pour éviter les conflits de nommage et clarifier les relations.
Convention de nommage Block__Element--Modifier combinee avec le nesting Sass et le caractere &. Cree des classes plates et previsibles.
Un systeme d'adresse : Immeuble__Appartement--Variante (card__title--large).
.card {
padding: 1rem;
&__header { border-bottom: 1px solid #eee; }
&__title { font-size: 1.25rem; }
&--featured {
border-color: gold;
.card__title { color: gold; }
}
}Cas d'usage : Nommer les classes CSS de facon previsible et eviter les conflits de specificite.
Informaticien neerlandais, co-createur de CSS avec Hakon Wium Lie. Il travaille au W3C sur les specifications CSS depuis 1995.
Le co-architecte du systeme de decoration du web — chaque page stylisee lui doit quelque chose.
/* Specification CSS originale */
/* Hakon Wium Lie & Bert Bos, 1996 */
h1 { color: blue; }
p { font-size: 14pt; }
/* Cascade + Specificite + Heritage */Cas d'usage : Comprendre les specifications CSS et l'importance du W3C dans la standardisation du web.
Un backend dedie par type de client (web, mobile, IoT) qui adapte et agrege les donnees des services backend pour les besoins specifiques de chaque frontend.
Un assistant personnel par langue : chacun traduit et resume l'information selon les besoins de son interlocuteur.
// Mobile BFF - donnees legeres
app.get('/api/mobile/feed', async (req, res) => {
const data = await feedService.get();
res.json(data.map(toMobileFeedItem));
});Cas d'usage : Quand le web a besoin de donnees riches et le mobile de donnees legeres.
Type primitif pour representer des entiers de taille arbitraire, au-dela de Number.MAX_SAFE_INTEGER (2^53 - 1). Cree avec le suffixe n ou BigInt().
Un cahier avec un nombre illimite de pages pour ecrire des nombres, contrairement a une calculatrice a ecran fixe.
const big = 9007199254740993n;
big + 1n; // 9007199254740994n
// Attention : pas de melange
// big + 1; // TypeError
BigInt(Number.MAX_SAFE_INTEGER) + 1n;Cas d'usage : Identifiants de bases de donnees 64-bit, calculs financiers de precision, cryptographie.
Entrepreneur americain, co-fondateur de Microsoft. Il a democratise l'ordinateur personnel avec MS-DOS puis Windows, et a fait de Microsoft l'entreprise dominante du logiciel pendant des decennies.
Le commercant qui a mis un ordinateur sur chaque bureau du monde — en vendant le logiciel, pas le materiel.
10 REM BASIC — Le premier produit Microsoft
20 PRINT "Hello, World!"
30 GOTO 20
REM Microsoft BASIC (1975)
REM Premier logiciel commercial pour PCCas d'usage : Comprendre l'histoire de Microsoft et comment le modele de licence logicielle a faconne l'industrie.
Methodes de Function.prototype pour controler this. call(ctx, ...args) et apply(ctx, [args]) appellent immediatement. bind(ctx, ...args) retourne une nouvelle fonction avec this lie.
call = telephoner a quelqu'un maintenant. apply = idem mais tu lis la liste des courses. bind = enregistrer le numero en favori pour appeler plus tard.
function greet(msg) { return `${msg}, ${this.name}`; }
const user = { name: 'Bob' };
greet.call(user, 'Hi'); // 'Hi, Bob'
greet.apply(user, ['Hi']); // 'Hi, Bob'
const bound = greet.bind(user);
bound('Hey'); // 'Hey, Bob'Cas d'usage : Fixer le this dans les callbacks, emprunter des methodes d'un autre objet, partial application.
Informaticien danois, createur du C++. Il a ajoute la programmation orientee objet au langage C, creant le langage qui propulse les jeux video, navigateurs et systemes embarques.
Celui qui a pris le C (une voiture fiable) et y a ajoute la turbo, la clim et le GPS — au prix d'un manuel de 1500 pages.
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
// C++ — Bjarne Stroustrup, 1985Cas d'usage : Comprendre les fondations de la POO et pourquoi C++ reste dominant dans la performance critique (jeux, finance, systemes).
Stratégie de déploiement maintenant deux environnements identiques (blue=actif, green=nouvelle version). Le switch est instantané via le load balancer.
Préparer un deuxième plateau repas en cuisine puis échanger les plateaux sur la table d'un coup.
# 1. Déployer la nouvelle version sur green
# 2. Tester green
# 3. Basculer le trafic
aws elbv2 modify-listener \
--listener-arn $ARN \
--default-actions TargetGroupArn=$GREEN_TG
# 4. L'ancien blue devient le prochain greenCas d'usage : Déploiement zero-downtime avec rollback instantané en cas de problème.
Informaticien americain, co-inventeur de TCP/IP avec Vint Cerf. Il a aussi lance le programme qui a mene a la creation d'ARPANET, l'ancetre d'Internet.
Le co-architecte de l'autoroute numerique mondiale — sans lui, pas de routes pour le web.
// TCP — fiabilite de la communication
// SYN -> SYN-ACK -> ACK
// Three-way handshake
// Chaque paquet est acquitte
// Retransmission si perteCas d'usage : Comprendre les fondations d'Internet et du protocole qui garantit la fiabilite des communications.
Frontiere explicite dans laquelle un modele de domaine particulier s'applique. Chaque contexte a son propre langage et ses propres regles.
Les departements d'une entreprise : 'client' signifie prospect en commercial et compte en comptabilite.
// Context 'Sales': Customer has cart, wishlist
// Context 'Billing': Customer has invoices, payments
// Meme mot, modeles differents, bases separeesCas d'usage : Decomposer un systeme complexe en sous-domaines autonomes avec des frontieres claires.
Regles GitHub/GitLab sur les branches protegees (main, develop) : requiert reviews, CI verte, signatures, et interdit les force push. Filet de securite essentiel.
Comme les barrieres de securite sur une autoroute : elles empechent les vehicules de sortir de la route meme en cas d'erreur.
# Regles recommandees pour main
# - Require 1+ review approvals
# - Require status checks (CI) to pass
# - Require branches to be up to date
# - No force pushes
# - No deletions
# - Include administratorsCas d'usage : Pour proteger les branches de production contre les pushes directs, les force pushes et les merges sans review.
Technique pour simuler du typage nominal en ajoutant une propriete fantome (brand) a un type. Empeche le melange accidentel de types structurellement identiques.
Comme des billets de differentes devises — meme papier, meme forme, mais on ne melange pas des euros et des dollars.
type USD = number & { __brand: "USD" };
type EUR = number & { __brand: "EUR" };
const usd = (n: number) => n as USD;
const eur = (n: number) => n as EUR;
function pay(amount: USD) {}
pay(usd(100)); // OK
// pay(eur(100)); // ErreurCas d'usage : Distinguer des IDs, devises ou unites de mesure qui sont structurellement des strings/numbers.
Points de rupture dans les media queries où le layout change pour s'adapter à la taille de l'écran. Les breakpoints modernes sont basés sur le contenu plutôt que sur des appareils spécifiques.
Comme les vitesses d'une boîte de transmission : on passe à la vitesse supérieure quand le régime l'exige.
:root {
--bp-sm: 640px;
--bp-md: 768px;
--bp-lg: 1024px;
}
@media (min-width: 768px) {
.sidebar { display: block; }
}Cas d'usage : Adapter les layouts aux différentes tailles d'écran dans une approche mobile-first.
Informaticien americain, createur de JavaScript en 10 jours chez Netscape en 1995. JS est devenu le langage le plus utilise au monde, present dans chaque navigateur web.
Le gars qui a construit un prototype en 10 jours... et 3 milliards d'appareils l'utilisent encore 30 ans plus tard.
// JavaScript — Brendan Eich, 1995
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet('World'));
// Cree en 10 jours, domine le web depuisCas d'usage : JavaScript est LE langage du web. Le connaitre est obligatoire pour tout developpeur front-end et full-stack.
Informaticien canadien, co-auteur du livre 'The C Programming Language' (K&R) avec Dennis Ritchie. Il a aussi nomme Unix et contribue a AWK.
Le prof qui a ecrit LE manuel que tout le monde a lu — et le premier 'Hello, World!' vient de lui.
// Le premier 'Hello, World!' — B. Kernighan
// Apparu dans un tutorial C de 1974
main() {
printf("hello, world\n");
}Cas d'usage : Comprendre l'importance de la documentation et de la pedagogie dans l'adoption d'un langage.
Decouple une abstraction de son implementation pour qu'elles puissent varier independamment. Evite l'explosion combinatoire de sous-classes.
Une telecommande universelle : la telecommande (abstraction) fonctionne avec n'importe quelle TV (implementation).
class Notification {
constructor(sender) { this.sender = sender; }
send(msg) { this.sender.deliver(msg); }
}
// new Notification(new SmsSender()).send('Hi');Cas d'usage : Quand deux dimensions de variation (ex: forme + couleur) generent trop de sous-classes.
Block Range Index, index extremement compact qui stocke les min/max par bloc de pages. Ideal pour les colonnes naturellement ordonnees comme les timestamps.
Au lieu d'indexer chaque page d'un livre, noter juste 'pages 1-50 : chapitres A-C'.
CREATE INDEX idx_logs_time
ON logs USING brin (created_at)
WITH (pages_per_range = 128);Cas d'usage : Indexer des tables de logs ou de series temporelles avec des milliards de lignes et un index minuscule.
API de communication entre contextes de meme origine (onglets, iframes, workers). Plus simple que SharedWorker pour du broadcast de messages.
Une radio interne d'entreprise : tous les bureaux (onglets) branchees sur la meme frequence recoivent le message.
// Onglet 1
const bc = new BroadcastChannel('auth');
bc.postMessage({ type: 'logout' });
// Onglet 2
const bc2 = new BroadcastChannel('auth');
bc2.onmessage = (e) => {
if (e.data.type === 'logout') redirectToLogin();
};Cas d'usage : Synchroniser le logout entre onglets, mettre a jour le theme, notifier les onglets d'un changement.
Cryptographe et expert en securite americain, auteur de 'Applied Cryptography'. Il est surnomme le 'security guru' et son blog est une reference en cybersecurite.
Le grand sage de la securite informatique : quand il dit qu'un systeme est fragile, les gouvernements ecoutent.
// Loi de Schneier :
// 'Anyone can invent a security system
// that he himself cannot break.
// That doesn't mean it's secure.'
//
// Toujours utiliser des algos eprouves
// (AES, RSA) — jamais inventer les siensCas d'usage : Comprendre les principes de securite et pourquoi il ne faut JAMAIS creer sa propre cryptographie.
Ensemble de techniques pour empêcher les attaques par force brute sur l'authentification : lockout progressif, CAPTCHA, délai exponentiel entre les tentatives.
Un coffre-fort qui ajoute 10 secondes d'attente supplémentaires après chaque mauvais code, rendant le crochetage impraticable.
const attempts = await getLoginAttempts(email);
if (attempts > 5) {
const delay = Math.pow(2, attempts - 5) * 1000;
await sleep(delay); // Exponential backoff
}
if (attempts > 10) {
requireCaptcha(req);
}Cas d'usage : Protéger les formulaires de login et de reset de mot de passe contre les attaques automatisées.
Binary JSON, format de serialisation binaire utilise par MongoDB pour stocker les documents. BSON etend JSON avec des types supplementaires comme Date, ObjectId, Decimal128 et BinData.
JSON en tenue de sport : meme structure mais plus rapide a parcourir et capable de porter des types de donnees plus lourds.
// BSON supporte des types absents en JSON
{
_id: ObjectId("507f1f77bcf86cd799439011"),
created: ISODate("2024-01-15"),
price: NumberDecimal("19.99")
}Cas d'usage : Comprendre pourquoi MongoDB peut stocker des dates et des nombres decimaux precis, contrairement au JSON brut.
Separe la construction d'un objet complexe de sa representation. Permet de construire etape par etape avec une API fluide.
Commander un burger personnalise : pain, puis steak, puis sauce, puis fromage — chaque etape est optionnelle.
const query = new QueryBuilder()
.select('name', 'email')
.from('users')
.where('active = true')
.limit(10)
.build();Cas d'usage : Construction de requetes SQL, objets de configuration ou DTOs avec beaucoup de parametres optionnels.
Implementation du Builder pattern avec un typage qui evolue a chaque etape. Chaque methode retourne un type plus precis, garantissant la completude a la compilation.
Comme un formulaire multi-etapes ou chaque page deverrouille la suivante — pas de raccourci possible.
class QueryBuilder<T extends object = {}> {
select<K extends string>(col: K) {
return this as QueryBuilder<T & Record<K, true>>;
}
build(): T { return {} as T; }
}
new QueryBuilder().select("name").select("age").build();Cas d'usage : APIs fluides (query builders, form builders) ou l'ordre et la completude des appels sont critiques.
Modules integres de Sass (sass:color, sass:math, sass:string, sass:list, sass:map) qui fournissent des fonctions utilitaires sans installation supplementaire.
La boite a outils livree avec ta maison : tournevis, marteau, tout est la de base.
@use 'sass:color';
@use 'sass:math';
@use 'sass:list';
$light: color.adjust(#3498db, $lightness: 20%);
$half: math.div(100%, 2);
$mixed: color.mix(red, blue, 50%);
$first: list.nth((a, b, c), 1); // aCas d'usage : Manipuler couleurs, nombres, listes et maps sans dependances externes.
Validateurs integres a Mongoose : required, min/max (Number), minlength/maxlength (String), enum, match (regex). Ils s'executent automatiquement avant la sauvegarde.
Un videur qui verifie ta carte d'identite, ta tenue et ta reservation avant de te laisser entrer.
{
age: { type: Number, min: 0, max: 150 },
role: { type: String, enum: ['user', 'admin'] },
name: { type: String, minlength: 2 }
}Cas d'usage : Valider les donnees utilisateur avant de les persister en base sans logique custom.
Pattern d'isolation des ressources en compartiments séparés. Si un compartiment sature, les autres continuent de fonctionner normalement.
Les compartiments étanches d'un navire : si un se remplit d'eau, les autres restent secs et le bateau ne coule pas.
// Pools de connexions séparés par service
const paymentPool = new Pool({ max: 10 });
const analyticsPool = new Pool({ max: 5 });
// Si analytics sature son pool,
// le pool de payment reste disponibleCas d'usage : Empêcher qu'un service lent consomme toutes les connexions et bloque les autres.
Execute un ensemble d'operations d'ecriture (insert, update, delete) en un seul appel reseau. Supporte les modes ordonne et non-ordonne pour optimiser les performances.
Envoyer un colis contenant plusieurs courriers au lieu de poster chaque lettre separement.
await db.collection('users').bulkWrite([
{ insertOne: { document: { name: 'New' } } },
{ updateOne: {
filter: { name: 'Old' },
update: { $set: { status: 'archived' } }
}},
{ deleteOne: { filter: { name: 'Gone' } } }
]);Cas d'usage : Executer des migrations complexes melangeant insertions, mises a jour et suppressions en une seule operation atomique.
Module pour gerer des queues de jobs asynchrones via Redis et Bull/BullMQ. Permet le traitement en arriere-plan avec retries et scheduling.
Comme une file d'attente au guichet : les taches arrivent, sont traitees dans l'ordre et reessayees si besoin.
@Processor('email')
export class EmailProcessor {
@Process()
async sendEmail(job: Job<EmailData>) {
await this.mailer.send(job.data);
}
}
// Ajout en queue
await this.emailQueue.add({ to: 'user@mail.com', subject: 'Hello' });Cas d'usage : Traiter l'envoi d'emails, le redimensionnement d'images ou les exports CSV en arriere-plan.
Librairie Node.js de gestion de queues basée sur Redis. Supporte les jobs delayed, repeatable, la priorisation et les workers concurrents.
Une file d'attente intelligente avec des tickets numérotés, des VIP, et des tâches programmées.
const queue = new Queue('emails');
await queue.add('welcome', { userId: '123' });
const worker = new Worker('emails', async (job) => {
await sendEmail(job.data.userId);
});Cas d'usage : Traitement asynchrone : envoi d'emails, génération de PDF, processing d'images.
Analyse visuelle du contenu du bundle JavaScript pour identifier les dependances lourdes et les opportunites de code splitting.
Comme une radio de valise a l'aeroport : tu vois exactement ce qui prend le plus de place dans ton bagage.
// Avec @next/bundle-analyzer
// next.config.js
const withAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
});
module.exports = withAnalyzer(nextConfig);
// ANALYZE=true npm run buildCas d'usage : Diagnostiquer pourquoi le bundle est trop gros et prioriser les optimisations de taille.
Analyse visuelle de la composition du bundle JavaScript pour identifier les dependances lourdes et les opportunites d'optimisation (code splitting, lazy loading).
Comme une radiographie de votre valise : vous voyez exactement ce qui prend le plus de place et ce que vous pouvez retirer.
// Avec Vite
// npx vite-bundle-visualizer
// Avec Webpack
// webpack-bundle-analyzer
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
module.exports = {
plugins: [new BundleAnalyzerPlugin()],
};Cas d'usage : Avant chaque release pour detecter les dependances qui gonflent inutilement le bundle.
Processus de suppression ou mise à jour des données en cache devenues obsolètes. L'un des deux problèmes les plus durs en informatique.
Retirer les produits périmés des rayons du supermarché : oublier et le client mange un yaourt périmé.
// TTL-based
await cache.set('user:123', data, 'EX', 300);
// Event-based
userEvents.on('updated', async (userId) => {
await cache.del(`user:${userId}`);
});Cas d'usage : Maintenir la fraîcheur des données cachées sans sacrifier les performances.
Stratégie où l'application vérifie le cache d'abord, puis lit la DB en cas de miss et remplit le cache. Le cache ne se remplit qu'à la demande.
Tu cherches dans ton tiroir (cache), si ce n'est pas là tu vas au grenier (DB) et tu ranges une copie dans le tiroir.
async function getUser(id) {
let user = await cache.get(`user:${id}`);
if (!user) {
user = await db.findUser(id);
await cache.set(`user:${id}`, user, 'EX', 300);
}
return user;
}Cas d'usage : Pattern le plus courant pour accélérer les lectures fréquentes sans charger la DB.
Module de cache integre qui supporte le cache en memoire ou via des stores externes (Redis). Utilise des interceptors pour cacher les reponses automatiquement.
Comme un post-it avec les reponses frequentes : plus rapide que de recalculer a chaque fois.
@Module({
imports: [CacheModule.register({
store: redisStore,
host: 'localhost',
ttl: 60,
})],
})
export class AppModule {}
@UseInterceptors(CacheInterceptor)
@Get()
findAll() { return this.service.findAll(); }Cas d'usage : Cacher les reponses de endpoints lourds comme les listes avec pagination pour reduire la charge DB.
Pile LIFO (Last In, First Out) qui trace les contextes d'execution des fonctions en cours. Chaque appel de fonction empile un frame, chaque return le depile.
Une pile d'assiettes : tu poses la derniere en haut et tu reprends toujours celle du dessus.
function a() { b(); }
function b() { c(); }
function c() { console.trace(); }
a();
// c -> b -> a -> globalCas d'usage : Lire les stack traces d'erreurs et comprendre les depassements de pile (stack overflow).
File d'attente (macrotask queue) ou sont places les callbacks de setTimeout, setInterval, I/O et evenements DOM. Traites apres que la call stack et la microtask queue sont vides.
La file d'attente normale a la poste : tu passes apres les clients prioritaires (microtasks).
setTimeout(() => console.log('macro'), 0);
Promise.resolve().then(() => console.log('micro'));
// micro, macroCas d'usage : Planifier des taches non-urgentes qui ne doivent pas bloquer le rendu ou les promesses en cours.
Déploiement progressif envoyant d'abord un petit pourcentage du trafic vers la nouvelle version. Si les métriques sont bonnes, on augmente progressivement.
Le canari dans la mine : on envoie un éclaireur (1% du trafic) pour vérifier que l'air est bon avant d'envoyer tout le monde.
# Istio canary routing
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
spec:
http:
- route:
- destination: { host: api, subset: stable }
weight: 90
- destination: { host: api, subset: canary }
weight: 10Cas d'usage : Déploiements à haut risque sur des systèmes critiques avec observation progressive.
Strategie de deploiement ou la nouvelle version est deployee sur un petit pourcentage du trafic pour detecter les problemes avant un rollout complet.
Comme le canari dans la mine de charbon : s'il s'arrete de chanter, on sait qu'il y a un probleme avant que les mineurs soient en danger.
# Kubernetes canary deployment
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
spec:
http:
- route:
- destination: { host: app, subset: stable }
weight: 95
- destination: { host: app, subset: canary }
weight: 5Cas d'usage : Pour deployer en production avec un filet de securite, en limitant l'impact d'un bug a 5% des utilisateurs.
Un système distribué ne peut garantir simultanément que 2 des 3 propriétés : Consistency, Availability, Partition tolerance. En pratique on choisit CP ou AP.
Tu peux avoir un resto rapide, bon marché, ou de qualité : choisis-en deux, pas trois.
// CP (Consistency + Partition tolerance)
// -> MongoDB avec write concern majority
// AP (Availability + Partition tolerance)
// -> Cassandra, DynamoDB
// CA n'existe pas en distribué (partition inévitable)Cas d'usage : Choisir la bonne base de données selon les besoins de cohérence vs disponibilité.
Systeme de permissions WordPress ou les roles (admin, editor, author) regroupent des capabilities (edit_posts, manage_options). Controle l'acces aux fonctionnalites.
Comme les badges d'acces dans une entreprise : le directeur ouvre toutes les portes, le stagiaire quelques-unes.
// Verifier une capability
if (!current_user_can('edit_posts')) {
wp_die('Acces interdit');
}
// Ajouter un role custom
add_role('moderator', 'Moderateur', [
'read' => true, 'edit_posts' => true,
]);Cas d'usage : Pour controler finement qui peut faire quoi dans l'admin et via l'API REST.
Verification systematique des permissions utilisateur avant toute action sensible via current_user_can(). Pilier de la securite WordPress.
Comme un vigile qui verifie le badge avant de laisser entrer dans une zone restreinte.
add_action('wp_ajax_delete_item', function() {
if (!current_user_can('delete_posts')) {
wp_send_json_error('Non autorise', 403);
}
check_ajax_referer('delete_item_nonce');
// Suppression securisee
});Cas d'usage : Avant toute action admin : CRUD, changement de settings, acces aux donnees sensibles.
Mécanisme @layer qui organise les styles en couches ordonnées dans la cascade. La dernière couche déclarée a priorité, indépendamment de la spécificité des sélecteurs.
Comme des calques dans Photoshop : chaque couche a une priorité claire, le calque du dessus gagne.
@layer reset, base, components, utilities;
@layer reset { * { margin: 0; } }
@layer base { a { color: blue; } }
@layer components { .btn { color: white; } }
@layer utilities { .text-red { color: red; } }Cas d'usage : Gérer la priorité CSS dans un design system complexe sans guerres de spécificité.
Librairie d'autorisation isomorphe qui definit les abilities (permissions) de facon declarative. S'integre avec NestJS via un guard custom.
Comme un reglement interieur detaille : chaque personne sait exactement ce qu'elle peut et ne peut pas faire.
const ability = defineAbility((can, cannot) => {
can('read', 'Article');
can('update', 'Article', { authorId: user.id });
cannot('delete', 'Article');
});
// ability.can('update', article) -> true/falseCas d'usage : Gerer des permissions granulaires avec des conditions sur les champs des entites.
Réseau de serveurs distribués géographiquement pour servir le contenu statique au plus proche de l'utilisateur. Réduit la latence et la charge serveur.
Des distributeurs automatiques dans chaque quartier au lieu d'un seul magasin central.
// Cloudflare, CloudFront, Vercel Edge
// Headers de cache
Cache-Control: public, max-age=31536000, immutable
// Invalidation
aws cloudfront create-invalidation \
--distribution-id ABC --paths "/*"Cas d'usage : Servir images, JS, CSS avec des temps de réponse <50ms partout dans le monde.
Réseau de serveurs géographiquement distribués qui cache et sert le contenu statique au plus près des utilisateurs. Réduit la latence et décharge le serveur d'origine.
Des boulangeries de quartier qui stockent le pain cuit à la boulangerie centrale : plus besoin de traverser la ville.
// Next.js with CDN headers
export async function GET() {
return new Response(data, {
headers: {
'Cache-Control': 'public, s-maxage=3600, stale-while-revalidate=86400',
},
});
}Cas d'usage : Servir les assets statiques, images et API réponses cachées avec latence < 50ms mondiale.
Passe une requete le long d'une chaine de handlers. Chaque handler decide de traiter la requete ou de la passer au suivant.
Le service client : operateur, superviseur, manager — ta demande remonte jusqu'a quelqu'un qui peut la traiter.
class Handler {
setNext(h) { this.next = h; return h; }
handle(req) {
if (this.canHandle(req)) return this.process(req);
return this.next?.handle(req);
}
}Cas d'usage : Pipeline de validation, middleware Express, gestion d'evenements DOM (bubbling).
Outil de gestion de versions pour monorepos. Chaque PR ajoute un fichier changeset decrivant le changement et son semver, puis l'outil genere le changelog et publie automatiquement.
Comme un carnet de bord de modifications : chaque mecanicien note ce qu'il a change, et le systeme compile le rapport final.
# Creer un changeset
npx changeset
# Choisir package -> minor -> "Add OAuth"
# Fichier cree: .changeset/brave-fox.md
# En CI: version + publish
npx changeset version # bump versions
npx changeset publish # publish to npmCas d'usage : Pour les librairies et design systems en monorepo necessitant un versioning et changelog automatises.
Discipline qui consiste a injecter volontairement des pannes (reseau, serveur, latence) en production pour verifier la resilience du systeme. Popularisee par Netflix (Chaos Monkey).
Comme un exercice d'evacuation incendie : on simule la catastrophe pour verifier que tout le monde sait reagir correctement.
// Principe Chaos Monkey (conceptuel)
// 1. Definir l'etat stable (metriques normales)
// 2. Hypothese: le systeme resiste a la panne X
// 3. Injecter: kill un pod, coupure reseau...
// 4. Observer: le systeme se retablit-il ?
// Outils: Gremlin, LitmusChaos, Chaos MeshCas d'usage : Pour les systemes distribues critiques afin de decouvrir les failles de resilience avant qu'elles ne causent des incidents reels.
Contrainte qui verifie qu'une condition booleenne est vraie pour chaque ligne. Peut referencer plusieurs colonnes de la meme table.
Un videur qui verifie ta carte d'identite : si tu as moins de 18 ans, tu ne rentres pas.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
price NUMERIC CHECK (price > 0),
discount NUMERIC CHECK (discount BETWEEN 0 AND 1)
);Cas d'usage : Garantir les regles metier au niveau de la base : prix positif, age minimum, stock non negatif.
Commande Git pour appliquer un commit spécifique d'une branche sur une autre sans fusionner toute la branche.
Cueillir une cerise sur un arbre sans prendre tout l'arbre : on prend juste le commit voulu.
# Appliquer un commit spécifique sur main
git checkout main
git cherry-pick abc1234
# Cherry-pick sans commit
git cherry-pick --no-commit abc1234Cas d'usage : Appliquer un hotfix de prod sur main sans merger toute la branche de release.
Theme qui herite de toutes les fonctionnalites d'un theme parent et permet de le personnaliser sans modifier ses fichiers. Les mises a jour du parent sont preservees.
Comme customiser une voiture de serie : on ajoute des options sans modifier la carrosserie d'origine.
/* style.css */
/*
* Theme Name: Mon Theme Enfant
* Template: theme-parent
*/
// functions.php
add_action('wp_enqueue_scripts', function() {
wp_enqueue_style('parent', get_template_directory_uri() . '/style.css');
});Cas d'usage : Pour personnaliser un theme tiers tout en conservant la possibilite de le mettre a jour.
Workflow lancé depuis un autre Workflow parent dans Temporal. Permet la décomposition de processus complexes et l'isolation des échecs.
Un manager qui délègue une sous-tâche à un employé tout en continuant son propre travail.
async function parentWorkflow(orders) {
const handles = orders.map(order =>
startChild(processOrderWorkflow, { args: [order] })
);
return Promise.all(handles.map(h => h.result()));
}Cas d'usage : Traiter en parallèle plusieurs sous-processus indépendants tout en gardant un contrôle centralisé.
Deux approches de coordination de services. Orchestration : un chef centralisé dirige (Temporal). Chorégraphie : chaque service réagit aux événements des autres (event-driven).
Orchestre symphonique (chef d'orchestre dirigeant chaque musicien) vs danse de salon (chaque danseur réagit aux mouvements du partenaire).
// Orchestration (centralized)
await paymentService.charge(order);
await inventoryService.reserve(order);
await shippingService.ship(order);
// Choreography (event-driven)
eventBus.emit('order.created', order);
// Each service listens and reacts independentlyCas d'usage : Choisir orchestration pour les workflows critiques avec compensation, chorégraphie pour le découplage maximal.
Informaticien americain, createur de Swift (langage Apple), LLVM (infrastructure de compilateur) et du langage Mojo. LLVM est utilise par Rust, Swift, Clang et bien d'autres.
Le batisseur d'autoroutes pour compilateurs : LLVM est la route sur laquelle roulent la plupart des langages modernes.
// Swift — Chris Lattner, 2014
func greet(_ name: String) -> String {
return "Hello, \(name)!"
}
print(greet("World"))
// Langage Apple pour iOS/macOSCas d'usage : LLVM est l'infrastructure de compilation la plus utilisee au monde. Swift est essentiel pour le dev iOS.
Detecte les defaillances et empeche l'application de tenter des operations vouees a l'echec. Trois etats : ferme, ouvert, semi-ouvert.
Un disjoncteur electrique : il coupe le courant quand il detecte une surcharge pour proteger l'installation.
class CircuitBreaker {
#failures = 0;
async call(fn) {
if (this.#failures > 5) throw new Error('Circuit open');
try { return await fn(); }
catch(e) { this.#failures++; throw e; }
}
}Cas d'usage : Appels a des services externes instables pour eviter les cascades de pannes.
Pattern de résilience qui coupe les appels vers un service défaillant après N échecs. Évite la cascade de pannes. États : closed, open, half-open.
Un disjoncteur électrique : il coupe le courant automatiquement quand il détecte une surcharge pour protéger le reste.
const breaker = new CircuitBreaker(callExternalAPI, {
timeout: 3000,
errorThresholdPercentage: 50,
resetTimeout: 30000
});
breaker.fallback(() => cachedResponse);
const result = await breaker.fire(params);Cas d'usage : Protéger un service des cascades de pannes quand un service downstream est instable.
Situation ou le module A importe B et B importe A. En CommonJS, on obtient un export partiel. En ESM, ca fonctionne grace aux live bindings mais peut causer des bugs subtils.
Deux personnes qui se tiennent la porte mutuellement : ca fonctionne si l'une passe en premier, mais ca peut devenir un blocage.
// a.js
import { b } from './b.js';
export const a = 'A' + b;
// b.js
import { a } from './a.js';
export const b = 'B'; // a est undefined ici en CJS!Cas d'usage : Detecter et casser les cycles avec des outils comme madge ou eslint-plugin-import.
Situation ou deux providers ou modules dependent mutuellement l'un de l'autre, causant une erreur de resolution. Se resout avec forwardRef.
Comme deux personnes bloquees a une porte, chacune attendant que l'autre passe en premier.
// Module A importe B, B importe A
@Module({
imports: [forwardRef(() => ModuleB)],
})
export class ModuleA {}Cas d'usage : Resoudre temporairement une dependance circulaire tout en planifiant un refactoring pour l'eliminer.
Fonction CSS qui contraint une valeur entre un minimum et un maximum avec une valeur préférée fluide. clamp(min, preferred, max) remplace les combinaisons de min()/max().
Comme un thermostat : la température varie librement entre une borne basse et une borne haute.
h1 {
/* De 1.5rem à 3rem, fluide entre */
font-size: clamp(1.5rem, 4vw, 3rem);
}
.container {
width: clamp(320px, 90%, 1200px);
}Cas d'usage : Typographie fluide et largeurs adaptatives sans media queries ni calculs complexes.
Technique consistant a combiner plusieurs classes utilitaires pour creer un style complet. L'ordre des classes n'affecte pas la specificite.
Comme composer un plat en ajoutant des ingredients un par un : sel, poivre, huile, chacun apporte sa touche.
<button class="px-4 py-2 bg-blue-500 text-white
rounded-lg hover:bg-blue-600 transition-colors">
Cliquer
</button>Cas d'usage : Construire des composants UI en empilant des utilitaires sans ecrire de CSS custom.
Mathematicien americain, pere de la theorie de l'information. Il a demontre que toute information peut etre encodee en bits (0 et 1), fondement de toute communication numerique.
Celui qui a prouve que tout — musique, texte, video — peut se reduire a une suite de oui/non.
// Theorie de l'information (1948)
// H = -SUM(p(x) * log2(p(x)))
// Entropie = mesure de l'information
// 1 bit = 1 choix binaire
// Base de toute compression, crypto, telecomCas d'usage : Comprendre les bases de la compression de donnees, de la cryptographie et des telecommunications.
Architecture en couches concentriques ou les dependances pointent vers l'interieur. Le domaine est au centre, independant des frameworks et de l'infrastructure.
Un oignon : chaque couche protege le coeur (domaine) des details exterieurs (UI, DB, frameworks).
// Domain (centre) - aucune dependance
class User { validate() { ... } }
// Use Case
class CreateUser { execute(dto) { ... } }
// Infrastructure (exterieur)
class PostgresUserRepo { save(user) { ... } }Cas d'usage : Applications complexes avec logique metier riche qui doit survivre aux changements de frameworks.
Abstraction pour communiquer avec d'autres microservices via send() (request-reply) ou emit() (event-based). Injectee via ClientsModule.
Comme un telephone interne d'entreprise : tu appelles un autre service et attends (send) ou laisses un message (emit).
@Injectable()
export class OrderService {
constructor(@Inject('PAYMENT_SERVICE') private client: ClientProxy) {}
processPayment(order: Order) {
return this.client.send('process_payment', order);
}
notifyShipping(order: Order) {
this.client.emit('order_shipped', order);
}
}Cas d'usage : Appeler des microservices distants depuis un service NestJS de facon decouple.
API asynchrone navigator.clipboard qui permet de lire et écrire dans le presse-papiers de manière sécurisée. Remplace le vieux document.execCommand('copy') avec gestion des permissions.
Comme un presse-papiers sécurisé de bureau : on peut copier et coller, mais avec l'autorisation du propriétaire.
// Copier du texte
await navigator.clipboard.writeText('Copié !');
// Lire le presse-papiers
const text = await navigator.clipboard.readText();
// Copier une image
const blob = await fetch(url).then(r => r.blob());
await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })]);Cas d'usage : Bouton 'Copier le code' dans une documentation ou un snippet de code.
Fonction qui capture et retient les variables de son scope parent meme apres que celui-ci a termine son execution. C'est le mecanisme fondamental derriere les callbacks, modules et data privacy en JS.
Un sac a dos que tu emportes en quittant la maison : meme loin de chez toi, tu as toujours acces a ce que tu y as mis.
function counter() {
let count = 0;
return {
increment: () => ++count,
get: () => count
};
}
const c = counter();
c.increment(); // 1Cas d'usage : Encapsuler un etat prive dans un module ou creer des fonctions factory avec configuration injectee.
Utilitaires pour construire des chaines de classes conditionnelles. cn() combine clsx + twMerge pour gerer les conditions ET les conflits Tailwind.
Un assistant qui compose ta tenue selon la meteo : si pluie alors parapluie, si froid alors manteau.
import { clsx } from 'clsx'
import { twMerge } from 'tailwind-merge'
const cn = (...inputs) => twMerge(clsx(inputs))
cn('p-4 bg-blue-500', isActive && 'bg-green-500',
{ 'opacity-50': isDisabled })
// => 'p-4 bg-green-500' si isActiveCas d'usage : Gerer proprement les classes conditionnelles dans les composants React avec Tailwind.
Metrique qui mesure le pourcentage de code execute par les tests (lignes, branches, fonctions). Utile comme indicateur mais trompeur comme objectif unique.
Comme mesurer le pourcentage de pieces visitees lors d'une inspection de maison : visiter 100% ne garantit pas d'avoir vu les fissures.
// jest.config.js
module.exports = {
collectCoverage: true,
coverageThreshold: {
global: {
branches: 80,
functions: 80,
lines: 80,
},
},
};Cas d'usage : Comme garde-fou pour detecter les zones non testees, avec un seuil raisonnable (70-80%).
Pratique ou un ou plusieurs pairs examinent le code soumis avant son integration. Ameliore la qualite, partage les connaissances et detecte les bugs humainement.
Comme la relecture d'un manuscrit par un editeur : il detecte les fautes et les incoherences que l'auteur ne voit plus.
// Bonne PR review checklist
// [ ] Le code fait ce que la description promet
// [ ] Pas de code mort ou commente
// [ ] Tests inclus pour les nouveaux cas
// [ ] Pas de secrets hardcodes
// [ ] Performance acceptable
// [ ] Nommage clair et coherentCas d'usage : Pour chaque changement de code afin de maintenir la qualite et partager les connaissances dans l'equipe.
Technique qui decoupe le bundle JS en morceaux charges a la demande via React.lazy et import() dynamique, reduisant le temps de chargement initial.
Comme un buffet a volonte : tu ne prends que ce que tu vas manger maintenant, pas tout le menu d'un coup.
const AdminPanel = React.lazy(() => import('./AdminPanel'));
function App() {
return (
<Suspense fallback={<Spinner />}>
{isAdmin && <AdminPanel />}
</Suspense>
);
}Cas d'usage : Pages lourdes (admin, dashboard), composants conditionels, routes non critiques.
Fichier GitHub qui assigne automatiquement des reviewers aux PR en fonction des fichiers modifies. Garantit que les experts appropriees reviewent chaque changement.
Comme un organigramme de responsabilites : chaque zone du batiment a un responsable attitre pour les travaux.
# .github/CODEOWNERS
*.ts @team/frontend
/api/ @team/backend
/infra/ @team/devops
*.sql @team/dba
package.json @team/leadsCas d'usage : Dans les equipes moyennes/grandes pour garantir que les bons experts sont automatiquement assignes en review.
Environnements de dev cloud GitHub bases sur les Dev Containers. Un VS Code complet dans le navigateur ou en local, avec les ports, extensions et outils pre-configures.
Comme un PC gamer dans le cloud : vous y accedez de n'importe quel appareil et retrouvez toute votre configuration.
# Lancer un Codespace depuis GitHub
# 1. Bouton 'Code' -> 'Codespaces'
# 2. 'Create codespace on main'
# 3. VS Code s'ouvre dans le navigateur
# 4. npm ci + extensions installes automatiquement
# Ou en CLI:
# gh codespace create -r owner/repo -b mainCas d'usage : Pour les contributions open source ou les equipes distribuees voulant un setup zero-config.
Regroupement de documents dans MongoDB, equivalent d'une table en SQL. Les collections n'imposent pas de schema par defaut, chaque document peut avoir une structure differente.
Un dossier dans une armoire : tu y ranges des fiches, mais rien ne t'oblige a ce qu'elles aient toutes le meme format.
// Creer implicitement
db.products.insertOne({ name: "Laptop" });
// Lister les collections
show collections;Cas d'usage : Organiser les documents par domaine metier : users, orders, products.
Fonction CSS qui mélange deux couleurs dans un espace colorimétrique donné. Permet de créer des variantes (hover, disabled) à partir d'une couleur de base sans calcul manuel.
Comme mélanger deux pots de peinture dans les proportions voulues pour obtenir la teinte parfaite.
.btn {
--bg: #3b82f6;
background: var(--bg);
}
.btn:hover {
background: color-mix(in oklch, var(--bg), black 20%);
}
.btn:disabled {
background: color-mix(in oklch, var(--bg), gray 50%);
}Cas d'usage : Générer des variantes de couleur (hover, active, disabled) dynamiquement depuis un token unique.
Fonctions du module sass:color pour manipuler les couleurs : ajuster la luminosite, saturation, teinte, ou melanger deux couleurs avec un ratio.
Un peintre qui eclaircit, assombrit ou melange ses couleurs sur sa palette.
@use 'sass:color';
$base: #3498db;
$lighter: color.adjust($base, $lightness: 15%);
$darker: color.scale($base, $lightness: -30%);
$blend: color.mix($base, white, 80%);Cas d'usage : Generer des palettes de couleurs derivees automatiquement a partir d'une couleur de base.
Encapsule une requete comme un objet, permettant de parametrer, mettre en file d'attente, journaliser et annuler des operations.
Un bon de commande au restaurant : il capture l'intention, peut etre mis en attente ou annule.
class CreateUserCmd {
constructor(data) { this.data = data; }
execute() { return db.users.insert(this.data); }
undo() { return db.users.delete(this.data.id); }
}Cas d'usage : Systeme undo/redo, file de taches asynchrones, CQRS command side.
Outil qui verifie que les messages de commit respectent un format conventionnel (Conventional Commits). Permet l'automatisation du changelog et du versioning semantique.
Comme un formulaire avec des champs obligatoires : votre message de commit doit respecter le modele pour etre accepte.
// commitlint.config.js
module.exports = {
extends: ['@commitlint/config-conventional']
};
// Valide: feat(auth): add OAuth login
// Valide: fix(cart): handle empty state
// Invalide: fixed stuffCas d'usage : Pour automatiser le changelog et le semantic versioning a partir de messages de commit structures.
CommonJS (require/module.exports) est synchrone, dynamique et utilise par Node.js historiquement. ESM (import/export) est statique, asynchrone, supportant le tree shaking. ESM est le standard moderne.
CommonJS = commander par telephone (dynamique, a la demande). ESM = liste de courses pre-ecrite (statique, analysable a l'avance).
// CommonJS
const fs = require('fs');
module.exports = { readFile: fs.readFile };
// ESM
import { readFile } from 'fs';
export { readFile };Cas d'usage : Choisir le bon systeme de modules selon le contexte : ESM pour le nouveau code, CommonJS pour la compatibilite Node.js legacy.
Strategie de factorisation des styles repetitifs en composants (React, Vue) ou en classes @apply. Le composant JS/TS est prefere a @apply.
Quand tu repetes la meme recette, tu l'ecris sur une fiche plutot que de la reciter a chaque fois.
// Prefere: composant React
const Button = ({ children }) => (
<button className="px-4 py-2 bg-blue-500
text-white rounded hover:bg-blue-600">
{children}
</button>
);Cas d'usage : Eviter la duplication de longues chaines de classes dans les templates/JSX.
Les differentes phases d'un composant : montage, mise a jour et demontage. En hooks, useEffect gere ces phases.
Comme la vie d'un employe : embauche (mount), promotions (update), depart (unmount).
useEffect(() => {
console.log('Monte ou mis a jour');
return () => console.log('Demonte / cleanup');
}, [dep]); // se relance si dep changeCas d'usage : Gerer les effets de bord comme les abonnements, les appels API ou les timers.
Compose enchaine des fonctions de droite a gauche, pipe de gauche a droite. Chaque fonction recoit le resultat de la precedente. Fondamental en programmation fonctionnelle.
Une chaine de montage : chaque poste (fonction) transforme le produit et le passe au suivant.
const pipe = (...fns) => (x) =>
fns.reduce((acc, fn) => fn(acc), x);
const transform = pipe(
str => str.trim(),
str => str.toLowerCase(),
str => str.replace(/\s+/g, '-')
);
transform(' Hello World '); // 'hello-world'Cas d'usage : Transformation de donnees en pipeline, middleware, traitement de texte, ETL.
Gestionnaire de dependances standard de PHP. Gere les packages, l'autoloading PSR-4, les scripts et le versioning semantique via composer.json.
Comme un chef de chantier qui commande les bons materiaux dans les bonnes versions et s'assure que tout est compatible.
// composer.json
{
"require": {
"php": "^8.2",
"laravel/framework": "^11.0"
},
"autoload": {
"psr-4": { "App\\": "src/" }
}
}Cas d'usage : Dans tout projet PHP moderne pour gerer les dependances et l'autoloading.
Compose des objets en structures arborescentes pour representer des hierarchies partie-tout. Les clients traitent uniformement objets simples et composes.
Un dossier de fichiers : un dossier peut contenir des fichiers ou d'autres dossiers, et on peut tous les supprimer de la meme facon.
class Folder {
children = [];
add(child) { this.children.push(child); }
getSize() {
return this.children.reduce((s, c) => s + c.getSize(), 0);
}
}Cas d'usage : Menus imbriques, arbres DOM, systemes de fichiers, organigrammes.
Couches indépendantes gérées par le GPU pour le compositing. Les éléments promus en couche composite (via transform, opacity, will-change) sont animés sans affecter les autres couches.
Comme des calques transparents empilés : on peut bouger un calque sans redessiner les autres.
/* Promouvoit l'élément en couche composite */
.animated {
transform: translateZ(0); /* hack de promotion */
/* Mieux : */
will-change: transform;
}
/* Vérifier dans DevTools > Layers */Cas d'usage : Comprendre pourquoi certaines animations sont fluides (compositing) et d'autres saccadent (reflow).
Principe de design qui favorise l'assemblage d'objets (a un) plutot que l'heritage (est un) pour la reutilisation de code. Produit des architectures plus flexibles.
Comme des briques LEGO : on assemble des pieces pour construire ce qu'on veut, plutot que d'heriter d'un modele fixe.
class OrderService {
public function __construct(
private PaymentGateway $payment,
private Mailer $mailer,
private Logger $logger,
) {}
}Cas d'usage : Dans la majorite des cas ou on est tente d'heriter pour reutiliser du code.
Favoriser la composition d'objets plutot que l'heritage de classes pour reutiliser du comportement. Plus flexible et moins fragile.
Les LEGO : tu assembles des pieces pour creer des formes variees, au lieu de mouler une piece monolithique par forme.
// Heritage fragile:
class FlyingSwimmingDuck extends FlyingDuck { swim() {} }
// Composition:
class Duck {
constructor(private fly: Flyable, private swim: Swimmable) {}
}Cas d'usage : Combiner des comportements sans les limites de l'heritage simple ou le diamond problem.
Pattern ou un composant parent partage son etat implicitement avec ses enfants via Context, offrant une API declarative et flexible.
Comme un menu deroulant HTML <select>/<option> : les options savent qu'elles font partie du select sans configuration explicite.
// Utilisation declarative
<Tabs>
<Tabs.List>
<Tabs.Tab>Profil</Tabs.Tab>
<Tabs.Tab>Settings</Tabs.Tab>
</Tabs.List>
<Tabs.Panels>
<Tabs.Panel>Contenu profil</Tabs.Panel>
<Tabs.Panel>Contenu settings</Tabs.Panel>
</Tabs.Panels>
</Tabs>Cas d'usage : Composants UI complexes (tabs, accordeons, menus) necessitant une API flexible et composable.
Index cree sur plusieurs champs. L'ordre des champs est crucial : il suit la regle ESR (Equality, Sort, Range) pour des performances optimales.
Un annuaire trie d'abord par ville, puis par nom : chercher 'Paris + Dupont' est rapide, mais 'Dupont' seul ne profite pas de l'index.
db.orders.createIndex(
{ status: 1, createdAt: -1, amount: 1 }
);
// Suit la regle ESRCas d'usage : Optimiser des requetes qui filtrent et trient sur plusieurs champs simultanement.
Algorithmes de compression HTTP réduisant la taille des transferts. Brotli offre 15-20% de compression en plus que gzip et est supporté par tous les navigateurs modernes.
Aspirer l'air d'un sac sous vide avant de l'envoyer par la poste pour réduire les frais de port.
// Express with compression
import compression from 'compression';
app.use(compression({ level: 6 }));
// Nginx config
gzip on;
brotli on;
brotli_types text/html application/javascript text/css;Cas d'usage : Réduire de 60-80% la taille des transferts HTTP pour les fichiers texte (JS, CSS, HTML, JSON).
Mode de rendu ou React peut interrompre, reprendre et abandonner des rendus en cours pour prioriser les interactions utilisateur urgentes.
Comme un serveur de restaurant qui interrompt la preparation d'une commande pour repondre a un client qui attend a la caisse.
// Active automatiquement avec createRoot
import { createRoot } from 'react-dom/client';
const root = createRoot(document.getElementById('root'));
root.render(<App />);Cas d'usage : Garder l'interface reactive pendant des rendus lourds (longues listes, calculs complexes).
Types qui selectionnent un type selon une condition (T extends U ? X : Y). Le mot-cle infer permet d'extraire des sous-types dans la branche true.
Comme un aiguillage ferroviaire — selon le type de train, il est dirige sur une voie ou une autre.
type Unwrap<T> = T extends Promise<infer U> ? U : T;
type A = Unwrap<Promise<string>>; // string
type B = Unwrap<number>; // numberCas d'usage : Extraire des types imbriques (retour de Promise, elements de tableau, props de composants React).
Objet Kubernetes stockant des données de configuration non sensibles sous forme clé-valeur. Injecté comme variable d'env ou fichier monté.
Un tableau d'affichage public dans un bureau : tout le monde peut lire les infos affichées.
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
NODE_ENV: production
LOG_LEVEL: infoCas d'usage : Externaliser la configuration pour pouvoir la changer sans reconstruire l'image.
Module officiel @nestjs/config pour gerer les variables d'environnement. Charge les fichiers .env et fournit ConfigService pour l'injection.
Comme un coffre-fort d'entreprise : centralise tous les secrets et parametres, accessible uniquement aux autorises.
@Module({
imports: [ConfigModule.forRoot({
isGlobal: true,
validationSchema: Joi.object({
DB_HOST: Joi.string().required(),
DB_PORT: Joi.number().default(5432),
}),
})],
})
export class AppModule {}Cas d'usage : Centraliser et valider toutes les variables d'environnement au demarrage de l'application.
Objet qui gere la connexion a MongoDB. Mongoose maintient un pool de connexions et un buffer des operations en attente jusqu'a ce que la connexion soit etablie.
Le fil du telephone entre ton appli et la base de donnees, avec une ligne d'attente integree.
await mongoose.connect(
'mongodb://localhost:27017/mydb',
{ maxPoolSize: 10 }
);
mongoose.connection.on('error', console.error);Cas d'usage : Initialiser la connexion a la base au demarrage de l'application NestJS ou Express.
Technique de reutilisation de connexions base de donnees via un pool precharge. Evite le cout de creation/destruction de connexions a chaque requete.
Comme un parc de voitures partagees : au lieu que chacun achete sa voiture, on partage un pool.
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
extra: {
max: 20,
idleTimeoutMillis: 30000,
},
})Cas d'usage : Optimiser les performances en production en configurant le pool selon la charge attendue.
Réutilisation d'un pool de connexions persistantes à la base de données au lieu d'en créer une nouvelle par requête. Réduit la latence et la charge.
Un parking de vélos partagés : tu prends un vélo disponible et tu le rends après, pas besoin d'en acheter un à chaque trajet.
const pool = new Pool({
host: 'db.example.com',
max: 20, // max connexions
idleTimeoutMillis: 30000
});
const result = await pool.query('SELECT ...');Cas d'usage : Éviter d'ouvrir/fermer des milliers de connexions par seconde, source de latence et crash.
Assertion qui empeche le widening et rend toutes les proprietes readonly et les valeurs litterales. Transforme un objet/tableau en version profondement immutable.
Comme graver dans le marbre — une fois ecrit, chaque detail est fige exactement tel quel.
const config = {
api: "https://api.com",
retries: 3
} as const;
// type: { readonly api: "https://api.com"; readonly retries: 3 }Cas d'usage : Creer des constantes avec des types litteraux exacts pour les discriminated unions et les lookups.
Syntaxe PHP 8.0 qui declare et assigne les proprietes directement dans la signature du constructeur, eliminant le code repetitif.
Comme remplir un formulaire qui cree automatiquement le dossier, au lieu de recopier chaque champ a la main.
class Product {
public function __construct(
private string $name,
private float $price,
private int $stock = 0,
) {}
}Cas d'usage : Pour tout constructeur PHP : reduit le boilerplate et rend le code plus lisible.
Utility type qui extrait les types des parametres du constructeur d'une classe sous forme de tuple.
Comme lire la notice de montage d'un meuble pour savoir quels outils sont necessaires.
class Service {
constructor(public url: string, public timeout: number) {}
}
type Args = ConstructorParameters<typeof Service>;
// [string, number]Cas d'usage : Creer des factory functions ou des conteneurs d'injection de dependances types.
Propriété qui informe le navigateur qu'un élément est indépendant du reste du document pour le layout, le paint ou le style. Permet au moteur de rendu d'optimiser en isolant les recalculs.
Comme un aquarium scellé : ce qui se passe dedans n'affecte pas l'extérieur et vice versa.
/* Isolation complète sauf la taille */
.widget { contain: content; }
/* Equivalent à layout + style + paint */
/* Isolation totale */
.fixed-size-widget { contain: strict; }
/* Equivalent à size + layout + style + paint */Cas d'usage : Améliorer les performances de rendu d'éléments indépendants (widgets, cartes, items de liste).
Classe qui fixe la largeur max d'un element selon le breakpoint actif. Peut etre centre automatiquement via la config.
Les bords d'une route : ils empechent le contenu de s'etaler a l'infini sur grands ecrans.
<div class="container mx-auto px-4">
<!-- Contenu centre et contraint -->
</div>
// config: container: { center: true, padding: '1rem' }Cas d'usage : Centrer le contenu principal et limiter sa largeur sur grands ecrans.
Permettent d'adapter le style d'un composant en fonction de la taille de son conteneur parent plutôt que du viewport. Déclarés via container-type: inline-size et @container.
Comme un meuble modulable qui change de forme selon la taille de la pièce où il est placé, pas de la maison entière.
.card-wrapper {
container-type: inline-size;
}
@container (min-width: 400px) {
.card { display: flex; gap: 1rem; }
}
@container (max-width: 399px) {
.card { display: block; }
}Cas d'usage : Rendre un composant vraiment réutilisable en l'adaptant à son contexte local, pas au viewport global.
Queries basees sur la taille du conteneur parent (pas du viewport). Supportees en Tailwind via le plugin @tailwindcss/container-queries avec les prefixes @sm, @md, @lg.
Un meuble qui s'adapte a la taille de la piece ou il se trouve, pas a la taille de la maison.
<div class="@container">
<div class="@sm:flex @lg:grid @lg:grid-cols-2">
<!-- S'adapte a la taille du parent -->
</div>
</div>Cas d'usage : Creer des composants vraiment responsifs qui s'adaptent a leur conteneur, pas au viewport.
Pattern qui separe les composants en deux types : Container (logique, data fetching) et Presentational (UI pure, recoit des props). Moins pertinent avec les hooks.
Comme un realisateur (container) et un acteur (presentational) : l'un dirige, l'autre joue le role.
// Presentational : UI pure
function UserCard({ name, avatar }) {
return <div><img src={avatar} /><p>{name}</p></div>;
}
// Container : logique
function UserCardContainer({ userId }) {
const { data } = useQuery({ queryKey: ['user', userId], queryFn: fetchUser });
return <UserCard name={data?.name} avatar={data?.avatar} />;
}Cas d'usage : Rendre les composants UI reutilisables et testables en les separant de la logique.
Propriété contain qui isole un sous-arbre du DOM pour le layout, le style et le painting. Le navigateur peut optimiser le rendu en sachant que les changements ne déborderont pas.
Comme des murs coupe-feu dans un bâtiment : un incendie dans une zone n'affecte pas les autres.
.widget {
contain: layout style paint;
}
/* Raccourci pour tout sauf size */
.card {
contain: content;
}
/* Strict = size + content */
.isolated { contain: strict; }Cas d'usage : Optimiser les performances de rendu de composants indépendants dans un dashboard ou un feed infini.
Mecanisme qui permet a un mixin de recevoir un bloc de CSS via @content. Le bloc est injecte a l'endroit ou @content est appele dans le mixin.
Un gabarit avec un trou : tu remplis le trou avec le contenu que tu veux a chaque utilisation.
@mixin on-hover {
&:hover, &:focus-visible {
@content;
}
}
.button {
background: blue;
@include on-hover {
background: darkblue;
transform: scale(1.05);
}
}Cas d'usage : Creer des mixins de contexte (media queries, pseudo-selecteurs) qui encapsulent un pattern.
Mecanisme HTTP ou le client et le serveur se mettent d'accord sur le format de la reponse via les headers Accept et Content-Type.
Commander dans un restaurant multilangue : tu demandes le menu en français, on te le donne en français.
// Client
Accept: application/json
// Serveur
app.get('/users', (req, res) => {
if (req.accepts('json')) res.json(users);
else if (req.accepts('xml')) res.send(toXml(users));
else res.status(406).end();
});Cas d'usage : APIs qui doivent supporter plusieurs formats (JSON, XML, CSV) pour differents clients.
Configuration content qui indique a Tailwind ou scanner les classes utilisees. Essentiel pour le tree-shaking : seules les classes trouvees sont generees en prod.
Dire au facteur quelles boites aux lettres existent pour qu'il ne distribue pas de courrier fantome.
// tailwind.config.js
module.exports = {
content: [
'./src/**/*.{js,ts,jsx,tsx}',
'./components/**/*.vue',
'./node_modules/flowbite/**/*.js'
]
}Cas d'usage : Configurer correctement le scanning pour eviter que des classes soient manquantes en production.
En-tête HTTP qui restreint les sources autorisées pour les scripts, styles, images et autres ressources. Principale défense contre les attaques XSS.
Une liste blanche à l'entrée d'un club VIP : seules les sources approuvées peuvent entrer et s'exécuter.
// CSP Header
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-abc123';
style-src 'self' 'unsafe-inline';
img-src 'self' https://cdn.example.com;
connect-src 'self' https://api.example.com;Cas d'usage : Empêcher l'exécution de scripts malicieux injectés dans la page (XSS, injection de publicités).
Propriété CSS qui permet au navigateur de sauter le rendu des éléments hors viewport. content-visibility: auto diffère le layout et le painting, améliorant drastiquement le temps de rendu initial.
Comme un théâtre qui ne monte le décor d'une scène que quand les acteurs y arrivent.
.article-section {
content-visibility: auto;
contain-intrinsic-size: auto 500px;
}
/* Le navigateur saute le rendu des sections
hors viewport et réserve 500px d'espace */Cas d'usage : Pages longues avec beaucoup de contenu (blog, feed, documentation) pour réduire le temps de rendu initial.
Systeme de partage de donnees sans prop drilling via createContext, Provider et useContext. Attention : chaque changement de valeur re-rend TOUS les consommateurs.
Comme un haut-parleur dans un magasin : tout le monde entend l'annonce, meme ceux qui ne sont pas concernes.
const AuthCtx = createContext(null);
function AuthProvider({ children }) {
const [user, setUser] = useState(null);
return (
<AuthCtx.Provider value={{ user, setUser }}>
{children}
</AuthCtx.Provider>
);
}Cas d'usage : Donnees peu changeantes (theme, auth, locale) partagees a travers l'arbre.
Cartographie des relations entre Bounded Contexts : shared kernel, customer-supplier, conformist, ACL, partnership. Definit les contrats d'integration.
La carte diplomatique mondiale : elle montre quels pays sont allies, en conflit, ou independants.
// Context Map (documentation)
// Sales <-> Billing : Customer-Supplier
// Sales -> Shipping : Conformist
// Sales <-> Legacy CRM : Anti-Corruption LayerCas d'usage : Visualiser et planifier les integrations entre sous-domaines d'un systeme complexe.
Mécanisme Temporal qui termine un Workflow et en démarre un nouveau avec un historique frais. Évite la croissance illimitée de l'historique d'événements.
Commencer un nouveau carnet quand l'ancien est plein, en notant juste le résumé de la dernière page.
async function pollingWorkflow(state) {
for (let i = 0; i < 100; i++) {
state = await pollExternal(state);
}
await continueAsNew(state);
}Cas d'usage : Maintenir des Workflows de longue durée (polling, monitoring) sans dépasser la limite d'historique.
Test qui verifie que l'interface (contrat) entre un consommateur et un fournisseur d'API est respectee. Chaque cote teste independamment sa conformite au contrat.
Comme un contrat de location : le locataire et le proprietaire verifient chacun que les clauses sont respectees sans avoir besoin de se rencontrer.
// Pact consumer test
const interaction = {
uponReceiving: 'a request for user',
withRequest: { method: 'GET', path: '/users/1' },
willRespondWith: {
status: 200,
body: { id: 1, name: like('Alice') }
}
};Cas d'usage : En architecture microservices pour garantir que les equipes peuvent deployer independamment sans casser les integrations.
Controlled : la valeur est geree par React (via state + onChange). Uncontrolled : la valeur est geree par le DOM (via ref et defaultValue).
Controlled = GPS qui te guide a chaque virage. Uncontrolled = carte papier que tu consultes quand tu veux.
// Controlled
const [val, setVal] = useState('');
<input value={val} onChange={e => setVal(e.target.value)} />
// Uncontrolled
const ref = useRef();
<input defaultValue="" ref={ref} />
// ref.current.value pour lireCas d'usage : Controlled pour validation en temps reel, uncontrolled pour formulaires simples ou performance critique.
Classe decoree @Controller qui gere les requetes HTTP entrantes et retourne les reponses. Chaque methode est mappee a une route via des decorateurs HTTP.
Comme un receptionniste d'hotel : il recoit les demandes des clients et les redirige vers le bon service.
@Controller('users')
export class UserController {
constructor(private userService: UserService) {}
@Get(':id')
findOne(@Param('id') id: string) {
return this.userService.findOne(id);
}
}Cas d'usage : Definir les endpoints REST de l'API et deleguer la logique metier aux services.
Privilegier des conventions sensees par defaut plutot que de forcer une configuration explicite. Le developpeur ne configure que ce qui devie de la convention.
Une reunion hebdo toujours lundi 9h : pas besoin de reinviter chaque semaine, seules les exceptions sont signalees.
// Convention NestJS: UserController -> /users
@Controller('users') // convention: nom du controleur = route
class UserController {
@Get() findAll() { ... } // GET /users
}Cas d'usage : Frameworks comme Rails, NestJS, Spring Boot : reduire le boilerplate de configuration.
Convention de messages de commit structurés (type(scope): description). Permet la génération automatique de changelogs et le versionnement sémantique.
Un formulaire standardisé : tout le monde remplit les mêmes champs, rendant le tri automatique possible.
feat(auth): add OAuth2 login
fix(api): handle null response body
chore(deps): update express to v5
BREAKING CHANGE: remove v1 endpointsCas d'usage : Automatiser le versionnement et le changelog dans le pipeline CI/CD.
Les attributs de sécurité des cookies : httpOnly empêche l'accès JavaScript (anti-XSS), secure exige HTTPS, sameSite protège contre le CSRF.
Un coffre-fort avec trois serrures : une contre le vol numérique, une contre l'espionnage réseau, une contre la tromperie.
res.cookie('session', token, {
httpOnly: true, // No JS access
secure: true, // HTTPS only
sameSite: 'lax', // CSRF protection
maxAge: 3600000, // 1 hour
path: '/',
});Cas d'usage : Stocker des tokens d'authentification de manière sécurisée dans le navigateur.
Trois métriques Google mesurant l'expérience utilisateur : LCP (temps d'affichage du plus grand élément), INP (réactivité aux interactions), CLS (stabilité visuelle).
Les 3 notes d'un restaurant : rapidité du service (LCP), réactivité du serveur (INP), stabilité de la table (CLS).
// Measure with web-vitals library
import { onLCP, onINP, onCLS } from 'web-vitals';
onLCP(({ value }) => analytics.send('LCP', value));
onINP(({ value }) => analytics.send('INP', value));
onCLS(({ value }) => analytics.send('CLS', value));
// Good: LCP<2.5s, INP<200ms, CLS<0.1Cas d'usage : Monitorer et optimiser l'UX mesurable pour améliorer le SEO et la satisfaction utilisateur.
Cross-Origin Resource Sharing : mecanisme HTTP qui permet a un frontend sur un domaine different d'acceder a l'API. Configure via app.enableCors().
Comme un visa d'entree : il autorise les visiteurs de certains pays (origines) a acceder au territoire (API).
app.enableCors({
origin: ['https://monsite.com', 'https://admin.monsite.com'],
methods: ['GET', 'POST', 'PUT', 'DELETE'],
credentials: true,
});Cas d'usage : Permettre au frontend SPA sur un autre domaine de communiquer avec l'API backend.
Mecanisme de securite HTTP qui permet a un serveur d'indiquer quelles origines sont autorisees a acceder a ses ressources. Gere via des headers specifiques.
Le badge d'acces a un immeuble : seuls les employes autorises (origines) peuvent entrer dans certains etages (endpoints).
app.use(cors({
origin: ['https://myapp.com'],
methods: ['GET', 'POST'],
credentials: true,
maxAge: 86400 // preflight cache 24h
}));Cas d'usage : Frontend sur un domaine different du backend — quasi-obligatoire en SPA moderne.
Mécanisme de sécurité navigateur qui bloque les requêtes cross-origin. Les requêtes non-simples déclenchent un preflight OPTIONS pour vérifier les permissions du serveur.
Avant de livrer un colis international, le douanier appelle le destinataire pour vérifier qu'il attend bien ce paquet.
import cors from 'cors';
app.use(cors({
origin: 'https://myapp.com',
methods: ['GET', 'POST', 'PUT', 'DELETE'],
credentials: true,
maxAge: 86400, // Cache preflight 24h
}));Cas d'usage : Configurer une API backend pour accepter les requêtes du frontend déployé sur un autre domaine.
Covariance: un sous-type peut remplacer le type parent (sortie). Contravariance: le type parent peut remplacer le sous-type (entree). Determine la compatibilite des generics.
Covariance: un chien peut passer la ou un animal est attendu (du specifique au general). Contravariance: l'inverse pour les consommateurs.
// Covariant: retour de fonction
type Getter<T> = () => T; // Dog -> Animal OK
// Contravariant: parametre de fonction
type Setter<T> = (val: T) => void; // Animal -> Dog OKCas d'usage : Comprendre pourquoi certaines assignations generiques echouent et concevoir des APIs correctement typees.
Index qui inclut des colonnes supplementaires non-cle via INCLUDE. Permet un Index-Only Scan en fournissant toutes les colonnes necessaires sans acceder a la table.
Un sommaire de livre qui inclut un resume de chaque chapitre : pas besoin de tourner les pages.
CREATE INDEX idx_orders_covering
ON orders (user_id)
INCLUDE (total, status);Cas d'usage : Eliminer les acces table pour les requetes frequentes qui ne lisent que quelques colonnes.
Command Query Responsibility Segregation : separe les modeles de lecture (Query) et d'ecriture (Command). Permet d'optimiser chaque cote independamment.
Un guichet de banque : un guichet pour deposer (ecriture), un autre pour consulter le solde (lecture).
// Command side
class CreateOrderCmd { execute(data) { db.write(data); } }
// Query side (modele optimise lecture)
class OrderQuery { getList() { return readDb.orders.find(); } }Cas d'usage : Applications avec des ratios lecture/ecriture tres differents ou des modeles de lecture complexes.
Une methode est soit une commande (modifie l'etat, ne retourne rien) soit une query (retourne des donnees, ne modifie rien). Jamais les deux.
Au guichet : soit tu deposes un cheque (commande), soit tu consultes ton solde (query). Pas les deux en meme temps.
class Stack {
push(item) { this.items.push(item); } // Command: void
peek() { return this.items.at(-1); } // Query: value
// pop() viole CQS: modifie ET retourne
}Cas d'usage : Base de CQRS, rend le code previsible et plus facile a raisonner.
Fonction RTK qui genere automatiquement un thunk avec les actions pending/fulfilled/rejected pour les operations asynchrones.
Comme un livreur avec suivi : tu sais quand il part (pending), arrive (fulfilled) ou echoue (rejected).
const fetchUsers = createAsyncThunk(
'users/fetch',
async (_, { rejectWithValue }) => {
try { return (await api.getUsers()).data; }
catch (e) { return rejectWithValue(e.message); }
}
);Cas d'usage : Appels API avec gestion automatique des etats de chargement et d'erreur dans Redux.
Fonction qui cree un composant injectant du CSS global (reset, fonts, variables). Contrairement a styled, ces styles ne sont pas scopes a un element.
Le papier peint de l'appartement : il couvre tous les murs, pas juste un meuble.
import { createGlobalStyle } from 'styled-components'
const GlobalStyle = createGlobalStyle`
*, *::before, *::after { box-sizing: border-box; }
body {
margin: 0;
font-family: ${({ theme }) => theme.font};
background: ${({ theme }) => theme.bg};
}
`
// <GlobalStyle /> dans AppCas d'usage : Definir le CSS reset, les styles globaux du body et les custom properties CSS.
Fonction de Reselect (integree a RTK) qui cree des selecteurs memoises. Le resultat n'est recalcule que si les inputs changent, evitant des calculs redondants.
Comme un formulaire pre-rempli : tant que les donnees source ne changent pas, le calcul derive est reutilise.
const selectUsers = (state) => state.users.list;
const selectActiveUsers = createSelector(
[selectUsers],
(users) => users.filter(u => u.active)
);
// Ne refiltre que si state.users.list changeCas d'usage : Derivation de donnees couteuses depuis le store Redux (filtrage, tri, aggregation).
Methode de Test.createTestingModule qui cree un module NestJS isole pour les tests. Permet de mocker les dependances via overrideProvider.
Comme un simulateur de vol : tu recrees l'environnement complet mais en mode test.
const module = await Test.createTestingModule({
providers: [UserService,
{ provide: UserRepository, useValue: mockRepo }],
}).compile();
const service = module.get<UserService>(UserService);
expect(await service.findAll()).toEqual([]);Cas d'usage : Ecrire des tests unitaires et d'integration pour les services NestJS avec des mocks.
API de Vanilla Extract pour definir des themes type-safe via des CSS custom properties. Genere un contrat de theme et des classes de theme interchangeables.
Un contrat de location : le theme definit les regles (variables), chaque variante les remplit differemment.
import { createTheme } from '@vanilla-extract/css'
const [themeClass, vars] = createTheme({
color: { primary: 'blue', bg: 'white' },
space: { sm: '0.5rem', md: '1rem' },
})
// vars.color.primary => var(--xxx)Cas d'usage : Creer un systeme de theming type-safe et zero-runtime avec des variantes (light/dark).
Technique d'inlining du CSS nécessaire au rendu above-the-fold directement dans le <head> HTML. Le reste du CSS est chargé de manière asynchrone pour ne pas bloquer le premier rendu.
Comme mettre les ingrédients de l'entrée en premier sur le plan de travail et préparer le dessert plus tard.
<head>
<style>/* Critical CSS inliné */
.header { display: flex; }
.hero { height: 100vh; }
</style>
<link rel="preload" href="full.css" as="style"
onload="this.rel='stylesheet'">
</head>Cas d'usage : Optimiser le FCP et LCP en éliminant le CSS bloquant le rendu pour le contenu visible initialement.
Technique qui extrait le CSS necessaire au rendu initial (above the fold) et l'inline dans le HTML. Le reste est charge en asynchrone pour accelerer le First Paint.
Mettre les vetements essentiels dans ton bagage a main et le reste en soute.
<!-- HTML inline critical CSS -->
<head>
<style>.hero{display:flex;height:100vh;}</style>
<link rel="preload" href="/styles.css" as="style"
onload="this.rel='stylesheet'">
</head>Cas d'usage : Ameliorer les metriques FCP et LCP en evitant le blocage du rendu par le CSS externe.
Le chemin critique de rendu CSS identifie les ressources CSS qui bloquent le premier affichage. Optimiser ce chemin implique d'inliner le CSS critique et de différer le reste.
Comme le chemin critique en gestion de projet : les tâches sur ce chemin déterminent le délai total.
<!-- 1. CSS critique inliné -->
<style>/* Above-the-fold styles */</style>
<!-- 2. CSS non-critique en async -->
<link rel="preload" href="styles.css" as="style">
<noscript><link rel="stylesheet" href="styles.css"></noscript>Cas d'usage : Réduire le temps de First Contentful Paint en éliminant le CSS render-blocking.
Le serveur envoie un HTML vide avec un bundle JS. Le navigateur execute React pour generer le DOM. Mauvais pour le SEO et le premier affichage.
Comme recevoir des meubles en kit : le client (navigateur) doit tout assembler lui-meme avant de pouvoir s'asseoir.
// index.html minimal
// <div id="root"></div>
// <script src="bundle.js"></script>
import { createRoot } from 'react-dom/client';
createRoot(document.getElementById('root')).render(<App />);Cas d'usage : Dashboards internes, apps behind auth ou le SEO n'est pas critique.
Cross-Site Request Forgery : attaque ou un site malveillant force le navigateur a envoyer des requetes authentifiees. Protege via des tokens anti-CSRF.
Comme quelqu'un qui forge ta signature pour signer un cheque a ta place sans que tu le saches.
import csurf from 'csurf';
app.use(csurf({ cookie: true }));
// Le token CSRF est envoye au client et verifie a chaque mutationCas d'usage : Proteger les applications avec sessions/cookies contre les requetes forgees.
Attaque qui force un utilisateur authentifie a executer des actions non voulues sur un site ou il est connecte, via un lien ou formulaire piege.
Comme quelqu'un qui imite ta signature pour envoyer une lettre en ton nom.
// Generation du token
$_SESSION['csrf'] = bin2hex(random_bytes(32));
echo '<input type="hidden" name="csrf" value="'
. $_SESSION['csrf'] . '">';
// Verification
if (!hash_equals($_SESSION['csrf'], $_POST['csrf']))
throw new SecurityException();Cas d'usage : Sur tout formulaire ou action modifiant des donnees (POST, PUT, DELETE).
Système qui scope automatiquement les classes CSS à un composant via un hash unique au build. On importe les styles comme un objet JS et les noms de classes sont générés automatiquement.
Comme des badges nominatifs uniques dans une conférence : impossible que deux personnes aient le même.
/* Button.module.css */
.primary { background: blue; }
// Button.tsx
import styles from './Button.module.css';
const Button = () => (
<button className={styles.primary}>OK</button>
);
/* Rendu: class="Button_primary_x7ks2" */Cas d'usage : Projets React/Vue avec bundler pour isoler les styles par composant sans convention de nommage.
Plugin PostCSS de minification CSS. Supprime les espaces, commentaires, raccourcit les couleurs et proprietes pour reduire la taille du fichier CSS final.
Un compresseur de valise : meme contenu, mais ca prend beaucoup moins de place.
/* Avant: 234 bytes */
.card {
background-color: #ffffff;
margin: 0px 0px 0px 0px;
padding: 16px;
}
/* Apres cssnano: 48 bytes */
.card{background:#fff;margin:0;padding:16px}Cas d'usage : Reduire la taille du CSS en production pour ameliorer les temps de chargement.
Mécanisme ::part() qui expose des éléments internes du Shadow DOM au style externe. L'attribut part='nom' sur l'élément interne permet au CSS parent de le cibler.
Comme des boutons de réglage sur la façade d'un appareil : on peut les ajuster sans ouvrir le boîtier.
/* Dans le Shadow DOM du composant */
<button part="btn">Click</button>
/* CSS externe */
my-component::part(btn) {
background: blue;
color: white;
}Cas d'usage : Permettre la personnalisation contrôlée du style d'un Web Component sans casser l'encapsulation.
Prop speciale d'Emotion qui permet d'appliquer des styles directement sur un element JSX sans creer un styled component. Accepte un objet ou un template literal.
Ecrire une note directement sur l'element au lieu de creer une etiquette nommee.
/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react'
<div css={css`
display: flex;
padding: 1rem;
&:hover { background: #f0f0f0; }
`}>
Inline styles avec pseudo-selectors!
</div>Cas d'usage : Styler rapidement un element unique sans creer un styled component dedie.
Pattern qui utilise les CSS custom properties (--var) comme pont entre le CSS-in-JS et le CSS natif. Permet le theming dynamique sans re-render React.
Un traducteur bilingue entre CSS-in-JS et CSS natif : les deux parlent via les variables CSS.
// Definir les tokens en CSS vars
const GlobalStyle = createGlobalStyle`
:root {
--primary: ${({ theme }) => theme.primary};
}
`
// Utiliser partout (meme hors styled)
.card { color: var(--primary); }Cas d'usage : Creer un systeme de theming performant qui fonctionne avec CSS-in-JS ET du CSS classique.
Approche qui écrit le CSS directement en JavaScript (styled-components, Emotion). Les styles sont scopés au composant, peuvent utiliser des variables JS et sont générés au runtime ou au build.
Comme un chef qui prépare la sauce directement dans le plat au lieu de la préparer séparément.
import styled from 'styled-components';
const Button = styled.button<{ $primary?: boolean }>`
background: ${p => p.$primary ? 'blue' : 'gray'};
color: white;
padding: 0.5rem 1rem;
`;Cas d'usage : Applications React avec styles dynamiques basés sur les props ou le thème.
Helper qui permet de definir des blocs de CSS reutilisables avec interpolations. Necessaire pour les interpolations conditionnelles a l'interieur des styled components.
Un paragraphe pre-ecrit que tu peux inserer dans n'importe quelle lettre.
import styled, { css } from 'styled-components'
const truncate = css`
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
`
const Title = styled.h2`
font-size: 1.5rem;
${truncate}
`Cas d'usage : Extraire et reutiliser des blocs de styles communs entre plusieurs styled components.
Common Table Expression : sous-requete nommee definie avec WITH, utilisable comme une table temporaire dans la requete principale. Peut etre recursive pour les hierarchies.
Definir une variable intermediaire dans un calcul complexe pour le rendre lisible etape par etape.
WITH active_users AS (
SELECT * FROM users WHERE status = 'active'
)
SELECT a.name, COUNT(o.id) as orders
FROM active_users a
JOIN orders o ON a.id = o.user_id
GROUP BY a.name;Cas d'usage : Decomposer des requetes complexes en etapes lisibles, ou parcourir des structures arborescentes avec CTE recursive.
Méthodologie Composition-Utility-Block-Exception qui embrasse la cascade CSS. Utilise les compositions pour le layout, les utilities pour les tokens, les blocks pour les composants, et les exceptions pour les variantes.
Comme un architecte qui planifie les pièces (composition), choisit les matériaux (utilities), meuble chaque pièce (blocks) et ajuste les détails (exceptions).
/* Composition : layout */
.flow > * + * { margin-top: var(--flow-space); }
/* Utility : token */
.text-primary { color: var(--primary); }
/* Block : composant */
.card { /* styles spécifiques */ }
/* Exception */
.card[data-variant='featured'] { /* override */ }Cas d'usage : Projets qui veulent tirer parti de la cascade CSS plutôt que la combattre.
Transformer une fonction a N arguments en N fonctions a 1 argument chainables. Chaque appel retourne une nouvelle fonction jusqu'a ce que tous les arguments soient fournis.
Un formulaire en plusieurs etapes : chaque page collecte une info, et le formulaire n'est soumis qu'a la derniere etape.
const curry = (fn) => {
const arity = fn.length;
return function go(...args) {
return args.length >= arity
? fn(...args)
: (...more) => go(...args, ...more);
};
};
const add = curry((a, b, c) => a + b + c);
add(1)(2)(3); // 6Cas d'usage : Configuration progressive de fonctions, creation de variantes specialisees, composition fonctionnelle.
Pointeur iterable vers les resultats d'une requete. Le curseur ne charge pas tous les documents en memoire mais les recupere par batches depuis le serveur.
Un marque-page dans un gros livre : tu lis page par page au lieu de photocopier tout le livre d'un coup.
const cursor = db.users.find({});
while (await cursor.hasNext()) {
const doc = await cursor.next();
process(doc);
}Cas d'usage : Iterer sur de grands resultats sans saturer la memoire de l'application.
Decorateur personalise cree avec createParamDecorator ou applyDecorators pour extraire des donnees ou combiner des decorateurs existants.
Comme creer un raccourci clavier personnalise qui combine plusieurs actions en un seul geste.
export const CurrentUser = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user;
},
);Cas d'usage : Extraire l'utilisateur courant du token JWT dans chaque handler sans dupliquer le code.
API native du navigateur permettant de définir de nouvelles balises HTML avec leur propre comportement. Le nom doit contenir un tiret pour éviter les collisions avec les éléments natifs.
Comme créer une nouvelle pièce de Lego sur mesure qui s'emboîte parfaitement avec les pièces standard.
class UserAvatar extends HTMLElement {
connectedCallback() {
const name = this.getAttribute('name');
this.innerHTML = `<img alt="${name}">`;
}
}
customElements.define('user-avatar', UserAvatar);Cas d'usage : Construire des composants framework-agnostic partageables entre React, Vue et Angular.
Fonction JavaScript prefixee par 'use' qui encapsule de la logique reutilisable composee d'autres hooks. Chaque appel cree sa propre instance de state.
Comme une recette de cuisine : tu la reutilises dans differents repas, mais chaque plat a ses propres ingredients (state).
function useDebounce(value, delay = 300) {
const [debounced, setDebounced] = useState(value);
useEffect(() => {
const id = setTimeout(() => setDebounced(value), delay);
return () => clearTimeout(id);
}, [value, delay]);
return debounced;
}Cas d'usage : Extraire et reutiliser de la logique stateful entre composants (fetch, debounce, form, auth).
API pour creer ses propres plugins Tailwind via addUtilities, addComponents, addVariant. Permet d'etendre le framework avec des fonctionnalites specifiques au projet.
Fabriquer tes propres briques LEGO quand les formes standard ne suffisent plus.
const plugin = require('tailwindcss/plugin')
module.exports = plugin(({ addVariant, e }) => {
addVariant('hocus', ['&:hover', '&:focus'])
// Usage: hocus:bg-blue-500
})Cas d'usage : Ajouter des variantes custom (hocus, supports) ou des utilitaires metier au framework.
Type de contenu personnalise au-dela des posts et pages natifs. Permet de modeliser des entites metier (produits, evenements, temoignages) avec leur propre interface admin.
Comme ajouter un nouveau type de classeur dans une armoire de bureau : factures, devis, contrats.
register_post_type('product', [
'labels' => ['name' => 'Produits'],
'public' => true,
'has_archive' => true,
'supports' => ['title', 'editor', 'thumbnail'],
'show_in_rest' => true,
]);Cas d'usage : Quand le contenu ne correspond pas aux posts/pages natifs : portfolio, evenements, FAQ, produits.
Variables CSS déclarées avec -- et utilisées via var(). Elles cascadent, sont héritées et peuvent être modifiées dynamiquement en JS, contrairement aux variables Sass.
Comme des réglages centralisés dans une télécommande : on change une valeur et tous les appareils s'adaptent.
:root {
--color-primary: #3b82f6;
--spacing: 1rem;
}
.btn {
background: var(--color-primary);
padding: var(--spacing);
}
.dark { --color-primary: #60a5fa; }Cas d'usage : Créer un système de design tokens avec thèmes clair/sombre modifiables en runtime.
Providers definis avec useClass, useValue, useFactory ou useExisting pour un controle total sur ce qui est injecte. Permet l'injection de valeurs non-classes.
Comme choisir entre acheter un meuble en kit, le faire sur mesure ou recycler un ancien meuble.
providers: [
{ provide: 'API_KEY', useValue: process.env.API_KEY },
{ provide: Logger, useClass: ProdLogger },
{ provide: 'DB', useFactory: (cfg: ConfigService) =>
createConnection(cfg.get('DB_URL')),
inject: [ConfigService],
},
]Cas d'usage : Injecter des variables d'environnement, des connexions dynamiques ou des implementations alternatives.
Systeme de classification personnalise pour organiser les contenus au-dela des categories et tags natifs. Peut etre hierarchique ou plate.
Comme creer un nouveau systeme d'etiquettes dans une bibliotheque : par couleur, par taille, par theme.
register_taxonomy('brand', ['product'], [
'labels' => ['name' => 'Marques'],
'hierarchical' => false,
'show_in_rest' => true,
'rewrite' => ['slug' => 'marque'],
]);Cas d'usage : Pour classifier les CPT : marques de produits, lieux d'evenements, niveaux de difficulte.
Fonctions de validation personnalisees definies dans le schema. Peuvent etre synchrones ou asynchrones et retournent un booleen ou lancent une erreur.
Un test sur mesure en plus des controles standard : verifier que le code postal correspond bien a la ville.
{
phone: {
type: String,
validate: {
validator: (v) => /^\+33[0-9]{9}$/.test(v),
message: 'Format FR invalide'
}
}
}Cas d'usage : Valider des regles metier specifiques comme un format de telephone, une plage de dates ou un IBAN.
Librairie qui cree des variantes de composants type-safe avec des classes CSS (Tailwind). Definit base, variants, compoundVariants et defaultVariants.
Un configurateur de voiture : tu choisis couleur, taille, options, et il genere la bonne combinaison.
import { cva } from 'class-variance-authority'
const button = cva('px-4 py-2 rounded font-medium', {
variants: {
intent: { primary: 'bg-blue-500', danger: 'bg-red-500' },
size: { sm: 'text-sm', lg: 'text-lg px-6 py-3' },
},
defaultVariants: { intent: 'primary', size: 'sm' },
})
// button({ intent: 'danger', size: 'lg' })Cas d'usage : Creer des composants Tailwind avec des variantes type-safe sans styled-components.
Framework de test E2E et composant qui s'execute directement dans le navigateur, offrant un time-travel debugger visuel et une DX excellente.
Comme une camera de surveillance dans votre app : vous voyez chaque clic, chaque requete, et vous pouvez rembobiner.
// login.cy.js
describe('Login', () => {
it('logs in successfully', () => {
cy.visit('/login');
cy.get('#email').type('alice@test.com');
cy.get('#password').type('secret123');
cy.get('button[type=submit]').click();
cy.url().should('include', '/dashboard');
});
});Cas d'usage : Pour les tests E2E d'applications web avec besoin d'un debugger visuel puissant et une courbe d'apprentissage douce.
Mode de test Cypress qui monte des composants React dans un vrai navigateur, permettant des tests visuels et d'interaction sans lancer toute l'application.
Comme tester une piece de voiture sur un banc d'essai reel au lieu d'une simulation informatique.
import { mount } from 'cypress/react';
it('affiche le compteur', () => {
mount(<Counter initial={5} />);
cy.get('[data-testid="count"]').should('have.text', '5');
cy.get('button').click();
cy.get('[data-testid="count"]').should('have.text', '6');
});Cas d'usage : Tests d'interaction complexes (drag & drop, animations) necessitant un vrai navigateur.
Contrôleur garantissant qu'un Pod tourne sur chaque noeud du cluster (ou un sous-ensemble). Utilisé pour les agents système.
Un concierge par immeuble : chaque bâtiment (noeud) a exactement un concierge attitré.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-agent
spec:
selector:
matchLabels: { app: log-agent }
template:
spec:
containers:
- name: agent
image: datadog/agent:latestCas d'usage : Déployer des agents de monitoring, collecte de logs ou réseau sur chaque noeud.
Plugin Tailwind qui ajoute des classes de composants semantiques (btn, card, modal). Fournit des themes pre-faits tout en restant personnalisable.
Un kit de meubles IKEA pre-assembles : prets a l'emploi mais tu peux les customiser.
<button class="btn btn-primary">Cliquer</button>
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<h2 class="card-title">Titre</h2>
</div>
</div>Cas d'usage : Prototyper rapidement avec des composants pre-styles tout en gardant l'ecosysteme Tailwind.
Developpeur russe-americain, co-createur de Redux et membre de l'equipe React core chez Meta. Son blog 'Overreacted' et ses explications pedagogiques sont des references.
Le professeur de React : il n'a pas invente le framework mais il l'a rendu comprehensible pour des millions de devs.
// Redux — Dan Abramov, 2015
const reducer = (state = 0, action) => {
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
};Cas d'usage : Redux a defini le pattern de state management en React. Ses idees influencent Zustand, Recoil et Jotai.
Chercheur en securite americain, celebre pour avoir decouvert une faille critique dans le DNS en 2008. Il a coordonne un patch mondial secret avant la divulgation. Decede en 2021.
Le medecin qui a decouvert une epidemie silencieuse (faille DNS) et a vaccine Internet en secret avant qu'elle ne se propage.
// Faille DNS — Dan Kaminsky, 2008
// DNS Cache Poisoning
// Attaquant peut rediriger n'importe quel
// domaine vers un faux serveur
// Patch coordonne avec tous les vendors
// en secret — cas unique dans l'histoireCas d'usage : Comprendre l'importance de la securite DNS et de la divulgation responsable des vulnerabilites.
Chercheur italo-americain en IA, co-fondateur et CEO d'Anthropic (createur de Claude). Ancien VP Research chez OpenAI, il a fonde Anthropic pour developper une IA sure et alignee.
Le scientifique qui a quitte le labo principal pour en creer un plus prudent — la securite de l'IA avant la vitesse.
// Anthropic — Dario Amodei, 2021
// Constitutional AI (CAI)
// Approche d'alignement de l'IA :
// 1. Definir des principes (constitution)
// 2. L'IA s'auto-critique selon ces regles
// 3. RLHF + auto-revision
// Claude = produit phare d'AnthropicCas d'usage : Comprendre les enjeux de securite de l'IA et l'importance de l'alignement des modeles de langage.
Prefix dark: qui applique des styles quand le mode sombre est actif. Peut fonctionner via la media query prefers-color-scheme ou via une classe sur le HTML.
Un interrupteur jour/nuit dans ta maison : les meubles restent, seul l'eclairage change.
<div class="bg-white dark:bg-gray-900
text-black dark:text-white">
Mode clair et sombre automatique
</div>
// tailwind.config: darkMode: 'class'Cas d'usage : Implementer un theme sombre sans dupliquer les composants ni gerer des variables CSS manuellement.
Dart Sass est l'implementation officielle et activement maintenue. Node Sass (base sur LibSass en C++) est deprecie et ne recoit plus de nouvelles fonctionnalites.
Dart Sass est le nouveau modele de voiture, Node Sass est l'ancien modele qui n'est plus fabrique.
// package.json
// BIEN :
"sass": "^1.77.0" // Dart Sass
// DEPRECIE :
"node-sass": "^9.0.0" // Ne supporte pas @useCas d'usage : Toujours utiliser Dart Sass (package npm 'sass') pour avoir acces a @use, @forward et les built-in modules.
Attributs personnalisés préfixés par data-* qui stockent des informations supplémentaires sur un élément HTML. Accessibles en JS via element.dataset et ciblables en CSS via [data-*].
Comme des post-it collés sur des dossiers : ils ajoutent des infos sans modifier le contenu du dossier.
<button data-action="delete" data-id="42">
Supprimer
</button>
<script>
btn.addEventListener('click', (e) => {
const { action, id } = e.target.dataset;
});
</script>Cas d'usage : Stocker des métadonnées légères sur les éléments pour le JS sans polluer les attributs HTML standards.
Conteneur logique de collections dans MongoDB. Une instance MongoDB peut heberger plusieurs databases, chacune avec ses propres fichiers sur disque.
Une armoire entiere dans un bureau : chaque armoire (database) contient ses propres dossiers (collections).
use myApp;
db.stats();
show dbs;Cas d'usage : Isoler les donnees de differentes applications ou environnements sur un meme serveur.
Scripts versionnés et ordonnés pour modifier le schéma de base de données de manière incrémentale, reproductible et réversible.
Un journal des travaux dans un immeuble : chaque rénovation est documentée et peut être annulée.
// 001_create_users.sql
CREATE TABLE users (
id UUID PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL
);
-- npx prisma migrate dev
-- npx knex migrate:latestCas d'usage : Synchroniser le schéma de base entre tous les environnements de manière automatisée.
Utilitaire qui regroupe et met en cache les requetes de base de donnees dans une execution GraphQL. Resout le probleme classique N+1.
Comme un livreur qui regroupe toutes les commandes d'un quartier en une seule tournee au lieu de faire un aller-retour par colis.
@Injectable({ scope: Scope.REQUEST })
export class UserLoader {
private loader = new DataLoader<number, User>(async (ids) => {
const users = await this.userService.findByIds([...ids]);
return ids.map(id => users.find(u => u.id === id));
});
load(id: number) { return this.loader.load(id); }
}Cas d'usage : Optimiser les resolvers GraphQL en batchant les requetes par entite pour eviter le N+1.
Utilitaire qui batch et cache les requetes de donnees pour resoudre le probleme N+1 dans GraphQL. Regroupe les appels DB d'un meme tick en une seule requete.
Un serveur qui attend que toute la table ait commande avant d'aller en cuisine, au lieu de faire un aller-retour par personne.
const userLoader = new DataLoader(async (ids) => {
const users = await db.users.findByIds(ids);
return ids.map(id => users.find(u => u.id === id));
});
// userLoader.load(1); userLoader.load(2); -> 1 queryCas d'usage : Resolvers GraphQL qui chargent des entites liees pour eviter N+1 requetes.
Queue spéciale recevant les messages qui ont échoué après plusieurs tentatives de traitement. Permet l'analyse post-mortem et le reprocessing.
Le bureau des objets trouvés de la poste : les lettres non distribuables y sont stockées pour investigation.
const queue = new Queue('payments', {
defaultJobOptions: {
attempts: 3,
backoff: { type: 'exponential', delay: 1000 },
removeOnFail: false
}
});
// Les jobs échoués vont dans la DLQCas d'usage : Ne pas perdre les messages critiques (paiements, commandes) malgré les erreurs.
Retarde l'execution d'une fonction jusqu'a ce qu'un delai se soit ecoule sans nouvel appel. Chaque appel reinitialise le timer. N'execute que le dernier appel.
L'ascenseur qui attend que plus personne n'entre pendant 3 secondes avant de fermer les portes.
function debounce(fn, ms) {
let timer;
return function(...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), ms);
};
}
const search = debounce(query => fetch(query), 300);Cas d'usage : Recherche en temps reel (attendre que l'utilisateur arrete de taper), resize handler, auto-save.
Fichiers .d.ts.map qui lient les declarations aux sources originales. Permettent 'Go to Definition' de naviguer vers le .ts source au lieu du .d.ts.
Comme un GPS qui mene directement a l'usine au lieu de s'arreter a la vitrine du magasin.
// tsconfig.json
{
"compilerOptions": {
"declaration": true,
"declarationMap": true,
"sourceMap": true
}
}Cas d'usage : Monorepos et bibliotheques ou les developpeurs doivent naviguer vers le code source des dependances.
Mecanisme ou plusieurs declarations du meme nom sont fusionnees en une seule definition. S'applique aux interfaces, namespaces et enums.
Comme deux equipes qui construisent chacune une aile du meme batiment — a la fin, c'est un seul edifice.
interface Box { width: number }
interface Box { height: number }
// Box = { width: number; height: number }
const b: Box = { width: 10, height: 20 };Cas d'usage : Etendre les types de bibliotheques tierces sans modifier leur code source.
Permet de définir un Shadow DOM directement en HTML via <template shadowrootmode='open'>, sans JavaScript. Le navigateur attache automatiquement le shadow root au parsing.
Comme un meuble livré déjà monté au lieu d'un kit à assembler soi-même.
<my-card>
<template shadowrootmode="open">
<style>p { color: blue; }</style>
<p><slot></slot></p>
</template>
Contenu visible
</my-card>Cas d'usage : SSR de Web Components : le contenu encapsulé est rendu côté serveur sans flash de contenu non stylisé.
Ajoute dynamiquement des responsabilites a un objet sans modifier sa classe. Offre une alternative flexible a l'heritage.
Ajouter des garnitures sur une pizza : chaque garniture enveloppe la precedente et ajoute son propre gout.
function withLogging(fn) {
return (...args) => {
console.log('Call:', fn.name);
return fn(...args);
};
}
const save = withLogging(saveUser);Cas d'usage : Ajouter logging, cache, validation ou authentification de facon transparente.
Syntaxe @decorator pour modifier ou annoter des classes et leurs membres. TS supporte les decorateurs legacy (experimentalDecorators) et le standard TC39 stage 3 (TS 5.0+).
Comme un cadre autour d'un tableau — il enveloppe l'oeuvre sans la modifier, en ajoutant du contexte.
// Stage 3 decorator (TS 5.0+)
function log(_target: any, ctx: ClassMethodDecoratorContext) {
console.log(`Decorating ${String(ctx.name)}`);
}
class Api {
@log greet() { return "hi"; }
}Cas d'usage : AOP (logging, auth, validation) dans les frameworks comme Angular, NestJS ou TypeORM.
Valeur par defaut assignee a un parametre generique, utilisee quand le type n'est pas explicitement fourni ni inferable. Similaire aux parametres par defaut de fonctions.
Comme la taille standard d'un vetement — si vous ne precisez pas, on vous donne du M.
interface ApiResponse<T = unknown> {
data: T;
status: number;
}
const res: ApiResponse = { data: null, status: 200 };
const typed: ApiResponse<User> = { data: user, status: 200 };Cas d'usage : Fournir un type par defaut dans les bibliotheques pour simplifier l'usage basique tout en permettant la personalisation.
Supprime tous les documents correspondant au filtre. Avec un filtre vide {}, supprime tous les documents de la collection.
Vider tout un tiroir du classeur d'un coup.
await db.collection('logs').deleteMany({
createdAt: { $lt: new Date('2023-01-01') }
});Cas d'usage : Purger des donnees obsoletes comme des logs ou des sessions expirees.
Supprime le premier document correspondant au filtre. Retourne deletedCount indiquant si un document a ete supprime.
Retirer une seule fiche du classeur et la mettre a la poubelle.
const result = await db.collection('users')
.deleteOne({ _id: userId });
console.log(result.deletedCount); // 1Cas d'usage : Supprimer un document precis comme un compte utilisateur apres demande RGPD.
Informaticien americain, createur du langage C et co-createur d'Unix avec Ken Thompson. Le C reste le langage le plus influent de l'histoire, a la base de C++, Java, JavaScript et bien d'autres.
Le forgeron qui a fabrique l'enclume sur laquelle tous les autres outils ont ete forges.
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
// Le programme le plus reproduit de l'histoireCas d'usage : Comprendre les racines de la quasi-totalite des langages modernes et des systemes d'exploitation.
Strategie de design qui duplique volontairement des donnees entre documents pour eviter les jointures couteuses. Optimise la lecture au prix de la complexite en ecriture.
Ecrire le nom du client directement sur chaque facture au lieu de ne mettre qu'un numero client.
// Denormalise : nom duplique
{
orderId: 1,
customerName: 'Alice',
customerId: ObjectId('...')
}Cas d'usage : Quand les lectures sont beaucoup plus frequentes que les ecritures et que les donnees dupliquees changent rarement.
Pattern ou les dependances sont fournies a une classe par le framework plutot que creees par la classe elle-meme. NestJS utilise l'injection par constructeur.
Comme un restaurant ou les ingredients sont livres par les fournisseurs plutot que cultives par le chef.
@Injectable()
export class OrderService {
constructor(
private userService: UserService,
private paymentService: PaymentService,
) {}
}Cas d'usage : Decouple les classes pour faciliter les tests unitaires et permettre le remplacement des implementations.
Les modules de haut niveau ne doivent pas dependre de modules de bas niveau. Les deux doivent dependre d'abstractions (interfaces). L'abstraction ne depend pas des details.
Comme un chef qui commande 'du poisson frais' sans se soucier du fournisseur specifique.
// Haut niveau depend de l'abstraction
class OrderService {
public function __construct(
private PaymentGateway $gateway // interface
) {}
}
// Bas niveau implemente l'abstraction
class StripePayment implements PaymentGateway { }Cas d'usage : Pour decouvrir les couches de l'application et permettre le remplacement des implementations (tests, refactoring).
Les modules de haut niveau ne doivent pas dependre des modules de bas niveau. Les deux doivent dependre d'abstractions. Les abstractions ne dependent pas des details.
Une prise electrique : l'appareil et le reseau dependent du standard de la prise, pas l'un de l'autre.
// Haut niveau depend d'une abstraction
interface Logger { log(msg: string): void; }
class UserService {
constructor(private logger: Logger) {}
}
// Injecte ConsoleLogger ou FileLoggerCas d'usage : Rendre le code testable en injectant des mocks et decoupler les couches.
Ressource Kubernetes déclarant l'état désiré des Pods (image, replicas, stratégie de mise à jour). Gère le rollout et le rollback.
Un contrat de maintenance : tu déclares combien d'employés tu veux et K8s s'assure que ce nombre est toujours respecté.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 3
selector:
matchLabels: { app: api }
template:
spec:
containers:
- name: api
image: mon-app:1.0Cas d'usage : Déployer des applications stateless avec rolling updates et rollback automatique.
Standard de representation des decisions de design (couleurs, typo, espacement) dans un format agnostique (JSON/YAML). Convertis en CSS, Sass, JS, iOS, Android via des outils.
Une partition de musique : un format universel que chaque instrument (plateforme) peut jouer.
// tokens.json (W3C Design Token format)
{
"color": {
"primary": {
"$value": "#3498db",
"$type": "color"
}
}
}
// => CSS: --color-primary: #3498db;
// => Sass: $color-primary: #3498db;Cas d'usage : Synchroniser les valeurs de design entre Figma, web, mobile et toutes les plateformes.
Syntaxe ES6 pour extraire des valeurs d'objets ou tableaux dans des variables distinctes. Supporte les valeurs par defaut, le renommage et l'imbrication.
Ouvrir un colis et ranger chaque article directement dans le bon tiroir au lieu de tout laisser dans le carton.
const { name, age = 25 } = user;
const [first, ...rest] = [1, 2, 3];
// Nested
const { address: { city } } = user;
// Rename
const { name: userName } = user;Cas d'usage : Extraire proprement les props d'un composant React, les champs d'une reponse API, les arguments de fonction.
Specification permettant de definir un environnement de developpement reproductible dans un conteneur Docker. Supporte par VS Code, GitHub Codespaces et JetBrains.
Comme un bureau portable pre-equipe : ou que vous alliez, vous retrouvez exactement le meme poste de travail configure.
// .devcontainer/devcontainer.json
{
"name": "Node.js Dev",
"image": "mcr.microsoft.com/devcontainers/node:20",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
},
"postCreateCommand": "npm ci",
"customizations": { "vscode": { "extensions": ["dbaeumer.vscode-eslint"] } }
}Cas d'usage : Pour onboarder un nouveau developpeur en 5 minutes avec un environnement identique a toute l'equipe.
Developpeur dano-americain, createur de Ruby on Rails et co-fondateur de Basecamp/37signals. Rails a popularise le pattern MVC, 'Convention over Configuration' et le developpement web rapide.
Le chef cuisinier qui a cree la recette 'full-stack en 15 minutes' — et qui n'a pas peur de dire ce qu'il pense.
# Ruby on Rails — DHH, 2004
class PostsController < ApplicationController
def index
@posts = Post.all
end
def create
@post = Post.new(post_params)
@post.save
end
endCas d'usage : Rails a influence tous les frameworks MVC (Laravel, Django, NestJS). Ses conventions sont devenues des standards.
Container d'injection de dependances qui instancie automatiquement les objets et leurs dependances. Realisation concrete du principe d'inversion de dependances.
Comme une agence d'interim : tu decris le profil recherche, elle fournit la personne qualifiee.
// Symfony DI
services:
App\Service\Mailer:
arguments:
$transport: '@mailer.transport'
// Auto-wiring resout les types automatiquementCas d'usage : Pour eliminer les new manuels et centraliser la configuration des services.
Élément natif <dialog> qui gère les modales avec piège de focus, fermeture Escape et backdrop intégrés. La méthode showModal() crée une modale accessible sans bibliothèque externe.
Comme une fenêtre de guichet : elle capte toute l'attention, bloque l'accès au reste, et se ferme proprement.
<dialog id="dlg">
<h2>Confirmation</h2>
<form method="dialog">
<button value="ok">OK</button>
</form>
</dialog>
<button onclick="dlg.showModal()">Ouvrir</button>Cas d'usage : Remplacer les modales custom par l'élément natif pour une accessibilité et une gestion du focus automatiques.
Outil qui charge et decharge automatiquement des variables d'environnement quand vous entrez ou sortez d'un repertoire. Base sur un fichier .envrc versionne.
Comme un badge d'acces automatique : en entrant dans le bureau (dossier), vos droits (variables) s'activent automatiquement.
# .envrc
export DATABASE_URL=postgres://localhost/myapp
export API_KEY=dev-key-123
export NODE_ENV=development
# Terminal:
# cd my-project -> direnv: loading .envrc
# cd .. -> direnv: unloading
# direnv allow -> autoriser un nouvel .envrcCas d'usage : Pour gerer automatiquement les variables d'environnement par projet sans .env global.
Union de types partageant une propriete commune (discriminant) qui permet a TS de distinguer chaque variante. Pattern fondamental pour modeliser des etats.
Comme des colis avec une etiquette de couleur — la couleur suffit pour savoir quel traitement appliquer.
type Result =
| { status: "ok"; data: string }
| { status: "error"; message: string };
function handle(r: Result) {
if (r.status === "ok") r.data; // string
else r.message; // string
}Cas d'usage : Modeliser des etats applicatifs (loading/success/error) avec exhaustivite garantie par le compilateur.
Mecanisme d'heritage de schema qui permet de stocker des documents de types differents dans une meme collection, avec un champ discriminateur (__t) pour differencier les types.
Un parking multi-vehicules : voitures, motos et camions partagent le meme espace mais ont des regles differentes.
const Event = mongoose.model('Event', eventSchema);
const Click = Event.discriminator('Click',
new Schema({ url: String })
);
const Purchase = Event.discriminator('Purchase',
new Schema({ amount: Number })
);Cas d'usage : Modeliser un systeme d'evenements (analytics) ou des entites polymorphiques dans une seule collection.
Suivi d'une requête à travers tous les services d'un système distribué via un trace ID unique. Chaque service ajoute un span au trace.
Le suivi d'un colis : chaque entrepôt (service) scanne le code-barres (trace ID) et ajoute une étape.
// OpenTelemetry
const tracer = trace.getTracer('api');
app.use((req, res, next) => {
const span = tracer.startSpan('http.request');
span.setAttribute('http.method', req.method);
res.on('finish', () => span.end());
next();
});Cas d'usage : Identifier quel service cause la latence dans une chaîne de 10 microservices.
Quand un type conditionnel agit sur un parametre generique nu (T extends U), il se distribue sur chaque membre d'une union. Chaque membre est evalue independamment.
Comme un tri postal — chaque lettre de la pile est examinees individuellement et envoyee dans la bonne boite.
type NoNull<T> = T extends null | undefined ? never : T;
type R = NoNull<string | null | number>;
// string | number (null elimine)Cas d'usage : Filtrer ou transformer chaque membre d'une union independamment (Exclude, Extract fonctionnent ainsi).
Images Docker minimalistes de Google ne contenant que l'application et ses dépendances runtime, sans shell ni gestionnaire de paquets.
Un coffre-fort scellé : impossible d'y entrer même si on essaie, ce qui le rend plus sûr.
FROM node:20 AS build
COPY . .
RUN npm ci && npm run build
FROM gcr.io/distroless/nodejs20
COPY --from=build /app/dist /app
CMD ["/app/server.js"]Cas d'usage : Réduire la surface d'attaque en production en éliminant tout outil exploitable.
Outil pour définir et orchestrer des applications multi-conteneurs via un fichier YAML. Gère réseaux, volumes et dépendances entre services.
Le chef d'orchestre qui dit à chaque musicien (conteneur) quand jouer et comment se synchroniser.
services:
api:
build: .
ports: ["3000:3000"]
depends_on: [db]
db:
image: postgres:16
volumes: ["pgdata:/var/lib/postgresql/data"]Cas d'usage : Environnement de développement local reproduisant la stack complète en une commande.
Instance exécutable d'une image Docker, isolée du système hôte grâce aux namespaces et cgroups Linux. Léger, démarrage en secondes.
Un appartement meublé dans un immeuble : chaque locataire (conteneur) a son espace privé mais partage les fondations (le kernel).
docker run -d --name api -p 3000:3000 mon-app:1.0
docker ps
docker logs api
docker exec -it api sh
docker stop api && docker rm apiCas d'usage : Exécuter des applications isolées avec des dépendances propres sans conflits système.
Template immuable contenant le code, les dépendances et la config nécessaires pour créer un conteneur. Construite couche par couche via un Dockerfile.
Un moule à gâteau : le moule (image) est toujours le même, mais chaque gâteau produit (conteneur) vit sa propre vie.
# Lister les images locales
docker images
# Télécharger une image
docker pull node:20-alpine
# Construire une image
docker build -t mon-app:1.0 .Cas d'usage : Base de tout déploiement conteneurisé, garantit la reproductibilité entre dev et prod.
Réseau virtuel isolé permettant la communication entre conteneurs. Bridge par défaut, overlay pour le multi-host.
Un réseau WiFi privé : seuls les appareils connectés au même réseau peuvent se parler.
docker network create mon-reseau
docker run --network mon-reseau --name api app
docker run --network mon-reseau --name db postgres
# api peut joindre db par son nomCas d'usage : Isoler les communications entre services tout en permettant la découverte par nom DNS.
Service de stockage et distribution d'images Docker. Docker Hub est le registry public par défaut, mais on peut héberger le sien.
Une bibliothèque de livres (images) où chacun peut emprunter (pull) ou déposer (push) des ouvrages.
docker tag mon-app:1.0 registry.io/mon-app:1.0
docker push registry.io/mon-app:1.0
docker pull registry.io/mon-app:1.0Cas d'usage : Stocker les images de manière centralisée pour que le CI/CD et tous les environnements y accèdent.
Outil d'analyse de sécurité intégré à Docker qui scanne les images pour détecter les vulnérabilités CVE dans les dépendances.
Un détecteur de métaux à l'entrée d'un aéroport : il scanne tout ce qui passe pour trouver les menaces.
docker scout cves mon-app:1.0
docker scout recommendations mon-app:1.0Cas d'usage : Intégrer le scan de vulnérabilités dans le pipeline CI pour bloquer les images dangereuses.
Mécanisme de persistance des données indépendant du cycle de vie du conteneur. Géré par Docker et monté dans le filesystem du conteneur.
Un disque dur externe : on le branche sur n'importe quel PC (conteneur) et les données restent.
docker volume create mydata
docker run -v mydata:/app/data mon-app
# Bind mount pour le dev
docker run -v $(pwd):/app mon-appCas d'usage : Persister les données de bases de données entre les redémarrages de conteneurs.
Fichier texte décrivant les instructions pour construire une image Docker couche par couche. Chaque instruction crée un layer cacheable.
Une recette de cuisine étape par étape : chaque ligne ajoute un ingrédient ou une action au plat final.
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]Cas d'usage : Automatiser la construction d'images reproductibles pour le CI/CD.
Unite de base de stockage dans MongoDB, equivalent d'une ligne en SQL. C'est un objet BSON (JSON binaire) compose de paires cle-valeur, pouvant contenir des sous-documents et des tableaux.
Une fiche client dans un classeur : chaque fiche peut avoir des champs differents, contrairement aux lignes figees d'un tableur.
db.users.insertOne({
name: "Alice",
age: 30,
address: { city: "Paris" },
hobbies: ["code", "cafe"]
});Cas d'usage : Stocker des donnees semi-structurees ou le schema peut varier d'un enregistrement a l'autre.
Les Document middlewares (save, validate, remove) ont this = le document. Les Query middlewares (find, update, delete) ont this = la query. Important pour savoir quoi modifier.
Document middleware = le chirurgien qui opere directement le patient. Query middleware = le pharmacien qui modifie l'ordonnance.
// Document: this = document
schema.pre('save', function() {
console.log(this.name);
});
// Query: this = query
schema.pre('find', function() {
this.where({ deleted: false });
});Cas d'usage : Implementer du soft-delete en filtrant automatiquement les documents supprimes sur chaque find.
Evenement significatif qui s'est produit dans le domaine metier. Nomme au passe (OrderPlaced, PaymentReceived). Declenche des reactions dans d'autres contextes.
L'annonce au micro dans un magasin : 'Nouveau produit disponible en rayon 3' — tous les interesses reagissent.
class OrderPlaced extends DomainEvent {
constructor(public orderId: string, public total: number) {
super('OrderPlaced');
}
}
order.addEvent(new OrderPlaced(order.id, order.total));Cas d'usage : Decoupler les side effects (emails, analytics) de la logique metier principale.
Service stateless qui encapsule une logique metier qui ne rentre naturellement dans aucune entite ou value object. Opere sur plusieurs agregats.
Un notaire : il ne possede rien mais orchestre une transaction entre acheteur et vendeur.
class TransferService {
transfer(from: Account, to: Account, amount: Money) {
from.debit(amount);
to.credit(amount);
}
}Cas d'usage : Operations metier impliquant plusieurs agregats qui ne peuvent pas etre attribuees a un seul.
Informaticien americain, auteur de 'The Art of Computer Programming', reference absolue en algorithmique. Il a aussi cree TeX, le systeme de composition typographique utilise dans le monde academique.
L'encyclopediste de l'algorithmique : son oeuvre est si complete que certains la comparent a une bible.
% TeX — cree par Donald Knuth
\documentclass{article}
\begin{document}
Hello, \TeX{} World!
\end{document}
% Utilise par tout le monde academiqueCas d'usage : Reference incontournable pour l'analyse d'algorithmes et la rigueur en programmation.
Fichiers de configuration commencant par un point (.bashrc, .gitconfig, .zshrc). Versionnes dans un repo Git, ils permettent de reproduire son environnement sur n'importe quelle machine.
Comme emporter ses preferences personnelles (siege, miroir, thermostat) d'un bureau a l'autre : votre confort vous suit.
# Structure typique d'un repo dotfiles
# ~/.dotfiles/
# .gitconfig
# .zshrc
# .vimrc
# install.sh -> symlink tout
# GitHub Codespaces utilise automatiquement
# votre repo dotfiles si configure dans
# Settings > Codespaces > DotfilesCas d'usage : Pour reproduire son environnement de dev sur un nouveau poste ou dans un Codespace en quelques secondes.
Informaticien americain, inventeur de JSON et auteur de 'JavaScript: The Good Parts'. Il a montre que JavaScript avait un bon langage cache sous ses defauts.
Le geologue qui a trouve un diamant dans une mine de charbon — JSON est devenu le format d'echange universel.
// JSON — Douglas Crockford, 2001
{
"name": "World",
"greeting": "Hello!",
"year": 2001
}
// Format d'echange le plus utilise au mondeCas d'usage : JSON est partout : APIs REST, fichiers de config, bases NoSQL. Comprendre son origine est fondamental.
API native du navigateur qui permet de rendre des éléments déplaçables via draggable='true'. Les événements dragstart, dragover et drop orchestrent le transfert de données.
Comme déplacer des fichiers sur un bureau : on attrape, on glisse, et on lâche à destination.
<div draggable="true"
ondragstart="e.dataTransfer.setData('text', e.target.id)">
Glisse-moi
</div>
<div ondrop="drop(e)" ondragover="e.preventDefault()">
Zone de dépôt
</div>Cas d'usage : Implémenter des interfaces de réorganisation (kanban, tri de listes) ou d'upload de fichiers.
Chaque piece de connaissance doit avoir une representation unique et non ambigue dans le systeme. Evite la duplication de logique.
Une source unique de verite : un seul calendrier familial, pas un par personne qui divergent.
// Mauvais: validation email dupliquee partout
// Bon:
const isValidEmail = (e) => /^[^@]+@[^@]+$/.test(e);
// Reutilise dans form, API, importCas d'usage : Centraliser les regles metier, validations et transformations pour eviter les incoherences.
import() en tant qu'expression retourne une Promise du module. Permet le chargement conditionnel et le code splitting a l'execution, contrairement aux imports statiques.
Commander un plat a la carte au lieu du menu complet : tu ne charges que ce dont tu as besoin, quand tu en as besoin.
const loadChart = async () => {
const { Chart } = await import('./chart.js');
return new Chart(data);
};
// Conditionnel
if (user.isAdmin) {
const { AdminPanel } = await import('./admin.js');
}Cas d'usage : Code splitting dans les SPA, chargement lazy de routes/composants lourds, chargement conditionnel.
Module configurable via une methode statique (forRoot/forRootAsync) qui retourne un DynamicModule. Permet de passer des options de configuration a l'import.
Comme un abonnement telephonique : le meme operateur mais tu choisis ton forfait (options) a la souscription.
@Module({})
export class MailModule {
static forRoot(config: MailConfig): DynamicModule {
return {
module: MailModule,
providers: [{ provide: 'MAIL_CONFIG', useValue: config }, MailService],
exports: [MailService],
};
}
}Cas d'usage : Creer des modules reutilisables comme les modules de config, cache ou mail avec des parametres variables.
Tests end-to-end qui simulent de vraies requetes HTTP via la librairie supertest. Testent le pipeline complet du request au response.
Comme un client mystere qui teste le restaurant de A a Z : de la reservation au dessert.
const app = moduleFixture.createNestApplication();
await app.init();
await request(app.getHttpServer())
.post('/users')
.send({ email: 'test@test.com', password: '12345678' })
.expect(201)
.expect(res => expect(res.body.email).toBe('test@test.com'));Cas d'usage : Valider que les endpoints, la validation, les guards et la serialisation fonctionnent ensemble.
Test de bout en bout qui simule le parcours reel d'un utilisateur a travers l'application complete (navigateur, API, BDD). Valide le systeme dans son ensemble.
Comme un client mystere qui entre dans un restaurant, commande, mange et paye pour verifier toute l'experience.
// checkout.spec.ts (Playwright)
test('user can complete checkout', async ({ page }) => {
await page.goto('/products');
await page.click('[data-testid="add-to-cart"]');
await page.click('[data-testid="checkout"]');
await page.fill('#email', 'test@mail.com');
await page.click('button:text("Pay")');
await expect(page.locator('.success')).toBeVisible();
});Cas d'usage : Pour valider les parcours utilisateurs critiques (inscription, achat, paiement) avant chaque release.
Exécution de code côté serveur au plus près de l'utilisateur sur un réseau distribué de points de présence (PoP). Réduit la latence de 100-300ms à 10-50ms.
Des guichets de banque dans chaque quartier au lieu d'un seul siège en centre-ville.
// Cloudflare Worker
export default {
async fetch(request) {
const country = request.cf?.country;
const cached = await caches.default.match(request);
if (cached) return cached;
const response = await fetch(request);
return response;
},
};Cas d'usage : Personnalisation géographique, auth validation, A/B testing et cache API au plus près des utilisateurs.
Fichier de configuration standardise (.editorconfig) qui definit les regles basiques d'edition (indentation, fin de ligne, charset) pour tous les editeurs et IDE.
Comme une regle commune pour toute la classe : que vous utilisiez un stylo bleu ou noir, tout le monde ecrit sur les memes lignes.
# .editorconfig
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = trueCas d'usage : Pour garantir des bases communes (tabs vs spaces, LF vs CRLF) dans une equipe avec differents editeurs.
Informaticien neerlandais, pionnier de l'algorithmique et de la programmation structuree. Son algorithme du plus court chemin est utilise partout, de Google Maps aux protocoles reseau.
Le GPS de l'informatique : il a trouve le chemin le plus court avant meme que les GPS n'existent.
// Algorithme de Dijkstra (1956)
// Trouver le plus court chemin dans un graphe
function dijkstra(graph, source) {
// dist[v] = Infinity pour tout v
// dist[source] = 0
// Pour chaque voisin, relacher l'arete
// Complexite : O((V+E) log V)
}Cas d'usage : Algorithme fondamental pour les parcours de graphes, utilise en entretien technique et en production (routage reseau, navigation).
Moteur de recherche distribué basé sur Lucene, optimisé pour la recherche full-text, l'analyse de logs et l'agrégation de données à grande échelle.
Un bibliothécaire surpuissant qui retrouve n'importe quel livre en millisecondes parmi des millions.
const results = await client.search({
index: 'products',
body: {
query: { multi_match: {
query: 'chaussure running',
fields: ['name^3', 'description'],
fuzziness: 'AUTO'
}}
}
});Cas d'usage : Recherche produit e-commerce, analyse de logs (ELK stack), moteur de suggestions.
Suite Elasticsearch + Logstash + Kibana pour la collecte, l'indexation et la visualisation des logs. Souvent remplacé par EFK (Fluentd) ou Loki.
Un système de classement automatique : Logstash trie le courrier, Elasticsearch le range, Kibana permet de chercher.
// Filebeat -> Logstash -> Elasticsearch
// Recherche dans Kibana :
// level:error AND service:api AND @timestamp > now-1hCas d'usage : Centraliser les logs de tous les services pour le debugging et l'audit.
Frameworks pour créer des emails HTML responsives. MJML utilise un langage de balisage dédié, React Email utilise des composants React transpilés en HTML compatible email.
Un moule à gâteau pour emails : vous choisissez la forme, le contenu s'adapte automatiquement à tous les fours (clients email).
// React Email component
import { Html, Button, Text } from '@react-email/components';
export function WelcomeEmail({ name, url }) {
return (
<Html>
<Text>Bienvenue {name} !</Text>
<Button href={url}>Confirmer</Button>
</Html>
);
}Cas d'usage : Créer des emails professionnels responsives compatibles Outlook, Gmail et Apple Mail.
Choix de design fondamental en MongoDB : embarquer les donnees liees dans le meme document (denormalisation) ou stocker une reference (ObjectId) vers un autre document (normalisation).
Coller la photo dans le passeport (embedding) ou noter un numero de dossier renvoyant a la photo (referencing).
// Embedding
{ name: 'Alice', address: { city: 'Paris' } }
// Referencing
{ name: 'Alice', addressId: ObjectId('...') }Cas d'usage : Embedding pour les relations 1:1 et 1:few lues ensemble. Referencing pour les relations 1:many ou many:many.
Librairie CSS-in-JS performante offrant deux APIs : styled (comme styled-components) et css prop (styles inline avec typage). Souvent plus rapide que styled-components.
Le couteau suisse du CSS-in-JS : plusieurs outils (styled, css prop) dans un seul package.
/** @jsxImportSource @emotion/react */
import { css } from '@emotion/react'
import styled from '@emotion/styled'
const style = css`color: red; font-size: 1.2rem;`
<div css={style}>Emotion css prop</div>
const Box = styled.div`padding: 1rem;`Cas d'usage : Alternative performante a styled-components avec l'avantage du css prop pour du styling inline.
Principe OOP qui restreint l'acces direct aux donnees internes d'un objet via des modificateurs de visibilite (public, protected, private).
Comme un distributeur de billets : tu interagis via l'ecran et le clavier, pas en ouvrant le coffre.
class BankAccount {
private float $balance = 0;
public function deposit(float $amount): void {
if ($amount <= 0) throw new \InvalidArgumentException();
$this->balance += $amount;
}
public function getBalance(): float { return $this->balance; }
}Cas d'usage : Pour proteger l'etat interne des objets et garantir que les modifications passent par des methodes controlees.
Objet du domaine defini par son identite unique plutot que par ses attributs. Deux entites avec les memes attributs mais des IDs differents sont distinctes.
Deux jumeaux identiques : meme apparence, mais ce sont deux personnes distinctes avec des identites differentes.
class User {
constructor(public readonly id: string, public name: string) {}
equals(other: User) { return this.id === other.id; }
}Cas d'usage : Modeliser des concepts metier qui ont un cycle de vie et une identite persistante.
Utilitaire RTK qui genere un ensemble de reducers et selecteurs pour gerer des collections normalisees (ids + entities) avec operations CRUD pre-construites.
Comme un classeur a fiches avec index : ajout, suppression et recherche sont automatises et optimises.
const usersAdapter = createEntityAdapter();
const usersSlice = createSlice({
name: 'users',
initialState: usersAdapter.getInitialState(),
reducers: {
addUser: usersAdapter.addOne,
removeUser: usersAdapter.removeOne,
}
});Cas d'usage : Collections d'entites (utilisateurs, produits, commentaires) necessitant des operations CRUD normalisees.
Type introduit en PHP 8.1 qui represente un ensemble fini de valeurs possibles. Les enums peuvent etre pures ou backed (avec valeur string/int).
Comme les feux de signalisation : il n'existe que rouge, orange et vert, rien d'autre.
enum Status: string {
case Draft = 'draft';
case Published = 'published';
case Archived = 'archived';
}
$post->status = Status::Published;Cas d'usage : Pour remplacer les constantes de classe et garantir qu'une valeur appartient a un ensemble defini.
Type personnalise definissant un ensemble fixe de valeurs autorisees. Plus performant et type-safe qu'une contrainte CHECK sur un VARCHAR.
Un menu deroulant avec des options figees : tu ne peux choisir que ce qui est propose.
CREATE TYPE mood AS ENUM (
'happy', 'sad', 'neutral'
);
CREATE TABLE entries (
id SERIAL PRIMARY KEY,
feeling mood NOT NULL
);Cas d'usage : Definir des statuts, roles ou categories avec un nombre fini de valeurs connues a l'avance.
Trois facons de modeliser un ensemble fini: enum (objet runtime), const enum (inline a la compilation, efface), union de litteraux (zero runtime). Chacune avec ses compromis.
Enum: un panneau permanent. Const enum: un post-it qu'on retire apres lecture. Union: une regle orale connue de tous.
enum Dir { Up, Down } // objet JS emis
const enum Fast { A, B } // inline, pas d'objet
type Clean = "up" | "down"; // zero runtimeCas d'usage : Preferer les unions de litteraux pour la legerete. Enum pour l'iteration. Const enum pour la performance (avec precaution).
Auteur et consultant americain, createur du Domain-Driven Design (DDD). Son livre 'the Blue Book' a defini les concepts d'Aggregate, Entity, Value Object, Bounded Context.
Le traducteur entre les developpeurs et les experts metier : DDD est le langage commun.
// Domain-Driven Design — Eric Evans
// Bounded Contexts
class Order { // Contexte Vente
customerId: string;
total: Money;
}
class Order { // Contexte Livraison
address: Address;
weight: number;
} // Meme nom, contextes differentsCas d'usage : DDD est essentiel pour les architectures microservices et les systemes complexes. Sujet courant en entretien senior.
Expert CSS americain, auteur de 'CSS: The Definitive Guide' et co-createur du reset CSS. Il est l'une des references mondiales en CSS depuis les annees 2000.
Le maitre zen du CSS : quand tu as un doute sur une propriete, c'est probablement son livre qui a la reponse.
/* Reset CSS — Eric Meyer */
html, body, div, span, h1, h2, h3,
p, a, img, ul, li {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
}Cas d'usage : Le reset CSS et ses ecrits sont des fondamentaux pour comprendre le modele de boite et la cascade.
Programmeur et essayiste americain, auteur de 'The Cathedral and the Bazaar'. Cet essai a convaincu Netscape de liberer son code source et a popularise le modele open source.
Le philosophe du bazar open source : il a prouve qu'un millier de devs desorganises font mieux qu'une equipe fermee.
// La loi de Linus (par Raymond) :
// 'Given enough eyeballs,
// all bugs are shallow'
//
// Plus il y a de gens qui lisent le code,
// plus les bugs sont trouves rapidement.
// Fondement de l'open sourceCas d'usage : Comprendre la philosophie open source et pourquoi les entreprises adoptent ce modele de developpement.
Composant classe qui intercepte les erreurs JavaScript dans son sous-arbre et affiche un UI de secours au lieu de crasher toute l'application.
Comme un fusible electrique : il saute pour proteger le reste du circuit.
class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError() { return { hasError: true }; }
render() {
if (this.state.hasError) return <p>Oups!</p>;
return this.props.children;
}
}Cas d'usage : Encapsuler des sections critiques pour que le reste de l'app continue de fonctionner en cas d'erreur.
JS a des types d'erreurs built-in : TypeError (mauvais type), ReferenceError (variable inconnue), SyntaxError, RangeError, URIError. On peut creer des erreurs custom via extends Error.
Differents codes d'alerte dans un hopital : chaque type indique immediatement la nature du probleme.
class AppError extends Error {
constructor(message, code) {
super(message);
this.name = 'AppError';
this.code = code;
}
}
throw new AppError('Not found', 404);Cas d'usage : Creer des erreurs metier typees pour un meilleur handling et des messages clairs.
Bundler et transpileur JavaScript ecrit en Go, 10 a 100x plus rapide que les alternatives JavaScript. Utilise en interne par Vite pour le dev server.
Comme un TGV face a un train regional : meme destination, mais la vitesse est dans une autre categorie.
// En CLI
// esbuild src/index.ts --bundle --outfile=out.js
// En API
import { build } from 'esbuild';
await build({
entryPoints: ['src/index.ts'],
bundle: true,
outfile: 'dist/out.js',
minify: true,
});Cas d'usage : Pour les outils CLI, les librairies ou comme transpileur rapide dans la toolchain de dev.
Fonctions d'echappement WordPress adaptees au contexte de sortie : esc_html pour le contenu, esc_attr pour les attributs HTML, esc_url pour les URLs.
Comme des combinaisons de protection differentes selon l'environnement : labo, chantier, ou cuisine.
<a href="<?php echo esc_url($link); ?>">
<?php echo esc_html($title); ?>
</a>
<input value="<?php echo esc_attr($value); ?>">
<?php echo wp_kses_post($html_content); ?>Cas d'usage : A chaque affichage de donnees dynamiques dans les templates WordPress, selon le contexte.
Linter JavaScript/TypeScript qui analyse statiquement le code pour detecter les erreurs, les mauvaises pratiques et les violations de style. Entierement configurable par regles et plugins.
Comme un correcteur orthographique pour le code : il souligne les erreurs avant que vous ne les envoyiez.
// eslint.config.js (flat config)
import js from '@eslint/js';
export default [
js.configs.recommended,
{
rules: {
'no-unused-vars': 'error',
'no-console': 'warn',
},
},
];Cas d'usage : Dans chaque projet JS/TS pour attraper les bugs et maintenir un style de code coherent dans l'equipe.
Mecanisme de cache HTTP : le serveur renvoie un ETag (hash du contenu), le client le renvoie dans If-None-Match. Si inchange, 304 Not Modified.
Un numero de version sur un document : si tu as deja la derniere version, pas besoin de retelecharger.
// Reponse serveur
res.setHeader('ETag', '"abc123"');
// Requete client suivante
// If-None-Match: "abc123"
// Serveur: 304 Not Modified (pas de body)Cas d'usage : Reduire la bande passante et la charge serveur pour les ressources rarement modifiees.
Developpeur chinois-americain, createur de Vue.js et Vite. Vue.js est le 3e framework front-end le plus populaire. Vite a revolutionne le tooling front-end avec un bundler ultra-rapide.
L'artisan independant qui a construit un framework rival de ceux de Facebook et Google — seul au depart.
<!-- Vue.js — Evan You, 2014 -->
<template>
<h1>Hello, {{ name }}!</h1>
</template>
<script setup>
import { ref } from 'vue'
const name = ref('World')
</script>Cas d'usage : Vue.js est tres adopte en France et en Asie. Vite est devenu le build tool par defaut de nombreux frameworks.
Deux phases de propagation des evenements DOM. Capturing descend du document vers la cible, bubbling remonte de la cible vers le document. Par defaut, les listeners ecoutent en phase bubbling.
Capturing = le facteur descend l'escalier pour trouver la bonne porte. Bubbling = la nouvelle remonte de voisin en voisin jusqu'au concierge.
// Bubbling (defaut)
el.addEventListener('click', handler);
// Capturing
el.addEventListener('click', handler, true);
// Ou avec options
el.addEventListener('click', handler, {
capture: true
});Cas d'usage : Intercepter des evenements avant qu'ils n'atteignent leur cible (capture), ou deleguer apres (bubbling).
Canal central de communication par evenements au sein d'une application. Les composants publient et s'abonnent sans se connaitre mutuellement.
Le tableau d'affichage d'une entreprise : n'importe qui peut y poster une annonce, n'importe qui peut la lire.
class EventBus {
#handlers = {};
on(event, fn) { (this.#handlers[event] ??= []).push(fn); }
emit(event, data) { this.#handlers[event]?.forEach(fn => fn(data)); }
}Cas d'usage : Communication entre modules d'un monolithe modulaire ou composants UI decouples.
Attacher un seul event listener sur un parent au lieu d'un sur chaque enfant. Exploite le bubbling pour capturer les evenements des descendants via event.target.
Un standardiste unique qui recoit tous les appels de l'immeuble et les redirige vers le bon bureau.
document.getElementById('list')
.addEventListener('click', (e) => {
if (e.target.matches('li.item')) {
handleClick(e.target.dataset.id);
}
});Cas d'usage : Listes dynamiques, tableaux avec beaucoup de lignes, elements ajoutes apres le chargement.
Pattern publish/subscribe ou un emetteur envoie des evenements nommes et des listeners s'y abonnent. Base de EventTarget (DOM) et EventEmitter (Node.js).
Une radio : l'emetteur diffuse sur une frequence (evenement) et tous les recepteurs branches sur cette frequence captent le message.
class Emitter {
#events = {};
on(evt, fn) {
(this.#events[evt] ??= []).push(fn);
}
emit(evt, ...args) {
this.#events[evt]?.forEach(fn => fn(...args));
}
}
const bus = new Emitter();
bus.on('data', console.log);Cas d'usage : Communication decouple entre composants, bus d'evenements, architecture event-driven.
Mecanisme central qui gere l'execution asynchrone en JS. Il surveille la call stack et, quand elle est vide, depile les callbacks des queues (microtask d'abord, puis macrotask).
Un serveur de restaurant qui sert les plats quand le client a fini de manger : il attend que la table soit libre avant d'apporter le suivant.
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// 1, 4, 3, 2Cas d'usage : Comprendre l'ordre d'execution du code asynchrone et debugger les problemes de timing.
Stocke l'etat comme une sequence immuable d'evenements plutot que comme l'etat courant. L'etat se reconstruit en rejouant les evenements.
Un releve bancaire : tu ne stockes pas le solde, mais l'historique de toutes les transactions.
const events = [
{ type: 'AccountOpened', balance: 0 },
{ type: 'MoneyDeposited', amount: 100 },
{ type: 'MoneyWithdrawn', amount: 30 },
];
const balance = events.reduce(applyEvent, 0); // 70Cas d'usage : Audit trail complet, systemes financiers, undo/redo, debug temporel.
Architecture ou les composants communiquent par production et consommation d'evenements asynchrones. Decouplage temporel et spatial.
Un systeme de sonnettes dans un restaurant : le cuisinier sonne quand le plat est pret, le serveur reagit.
// Producer
await broker.publish('order.created', order);
// Consumer
broker.subscribe('order.created', async (order) => {
await inventory.reserve(order.items);
});Cas d'usage : Systemes reactifs, microservices decouples, traitement temps reel de flux de donnees.
Module pour la communication asynchrone intra-application via evenements. Les services emettent des evenements et les listeners les traitent de facon decouple.
Comme un systeme de haut-parleurs dans un batiment : un message est diffuse et ceux concernes reagissent.
// Emission
this.eventEmitter.emit('order.created', new OrderCreatedEvent(order));
// Listener
@OnEvent('order.created')
async handleOrderCreated(event: OrderCreatedEvent) {
await this.emailService.sendConfirmation(event.order);
}Cas d'usage : Decoupler les effets de bord (email, notifications) de la logique metier principale.
Modèle de cohérence où les répliques convergent vers le même état après un délai, sans garantie de lecture immédiate de la dernière écriture.
Mettre à jour son adresse à la poste : tous les facteurs finiront par avoir la nouvelle adresse, mais pas tous en même temps.
// Écriture confirmée sur le primaire
await dynamo.put({ TableName: 'users', Item: user });
// Lecture éventuellement consistante (plus rapide)
await dynamo.get({ ConsistentRead: false, ... });
// Lecture fortement consistante (plus lente)
await dynamo.get({ ConsistentRead: true, ... });Cas d'usage : Systèmes distribués géographiquement où la latence réseau empêche la cohérence forte.
Classe decoree @Catch qui intercepte les exceptions non gerees et les transforme en reponses HTTP structurees. Centralise la gestion d'erreurs.
Comme un filet de securite sous un trapeziste : il attrape les chutes et les transforme en atterrissage controle.
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
response.status(exception.getStatus()).json({
message: exception.message,
});
}
}Cas d'usage : Formater toutes les erreurs API de maniere coherente avec des codes d'erreur et messages standardises.
Utility type qui retire d'une union T tous les membres assignables a U. Fonctionne sur les unions de types, pas sur les proprietes d'objets.
Comme un filtre a cafe qui retient le marc — seul le liquide (les types voulus) passe.
type AllEvents = "click" | "focus" | "blur" | "scroll";
type UIEvents = Exclude<AllEvents, "scroll">;
// "click" | "focus" | "blur"Cas d'usage : Filtrer des unions pour creer des sous-ensembles de types (evenements, statuts, permissions).
Environnement abstrait dans lequel le code JS est evalue. Contient le Variable Environment, le Lexical Environment et la valeur de this. Cree pour chaque appel de fonction et le scope global.
La fiche d'identite d'un appel de fonction : qui elle est (this), ce qu'elle connait (variables), et d'ou elle vient (scope).
// Global EC cree au demarrage
const x = 1;
function foo() {
// Nouveau EC pour foo()
const y = 2;
console.log(x + y); // accede au parent EC
}
foo();Cas d'usage : Comprendre en profondeur le comportement de this, le hoisting et la scope chain.
Technique utilisant le type never pour garantir que tous les cas d'une union sont traites. Si un cas est oublie, le compilateur genere une erreur.
Comme une checklist de securite en aviation — chaque point doit etre coche, aucun oubli n'est tolere.
type Shape = "circle" | "square";
function area(s: Shape) {
switch (s) {
case "circle": return 1;
case "square": return 2;
default: const _: never = s; return _;
}
}Cas d'usage : Garantir a la compilation que tout ajout a une union est gere partout dans le code.
EXPLAIN montre le plan d'execution prevu d'une requete. EXPLAIN ANALYZE execute reellement la requete et montre les temps reels. Essentiel pour l'optimisation.
EXPLAIN = le GPS qui te montre l'itineraire prevu. EXPLAIN ANALYZE = le GPS avec le temps reel du trajet.
EXPLAIN ANALYZE
SELECT u.name, COUNT(o.id)
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.name;Cas d'usage : Diagnostiquer les requetes lentes, verifier l'utilisation des index et optimiser les jointures.
Methode qui retourne le plan d'execution d'une requete, montrant quels index sont utilises, le nombre de documents scannes et le temps d'execution.
Le GPS qui te montre l'itineraire prevu avant de partir, pour que tu choisisses le plus rapide.
db.users.find({ age: { $gt: 25 } })
.explain('executionStats');
// Verifier totalDocsExamined
// vs totalKeysExaminedCas d'usage : Diagnostiquer les requetes lentes et verifier que les index sont correctement utilises.
Proposition TC39 Stage 3+ avec le mot-cle using qui appelle automatiquement [Symbol.dispose]() a la sortie du scope. Equivalent du try-with-resources de Java ou using de C#.
Un robinet auto-coupant : il se ferme tout seul quand tu quittes la piece, pas besoin de penser a le fermer.
class FileHandle {
[Symbol.dispose]() {
console.log('File closed');
}
}
{
using file = new FileHandle();
// utiliser file...
} // [Symbol.dispose]() appele automatiquementCas d'usage : Gestion de connexions DB, handles fichier, locks, tout ce qui necessite un cleanup garanti.
Index cree sur une expression ou une fonction plutot que sur une colonne brute. Permet d'indexer des transformations comme LOWER(), des extractions de date ou des calculs.
Un index de livre qui classe les titres sans accents ni majuscules pour une recherche simplifiee.
CREATE INDEX idx_users_lower_email
ON users (LOWER(email));
-- La requete doit utiliser la meme expression
SELECT * FROM users
WHERE LOWER(email) = 'alice@mail.com';Cas d'usage : Optimiser les recherches case-insensitive ou les filtres sur des champs transformes.
Creer un nouveau styled component base sur un existant avec styled(BaseComponent). Le nouveau composant herite de tous les styles et peut en ajouter/overrider.
Un enfant qui herite des traits de ses parents et ajoute ses propres caracteristiques.
const Base = styled.button`
padding: 0.5rem 1rem;
border-radius: 4px;
font-weight: bold;
`
const Primary = styled(Base)`
background: blue;
color: white;
`
const Danger = styled(Base)`
background: red;
color: white;
`Cas d'usage : Creer des variantes de composants qui partagent une base de styles commune.
Utility type qui extrait d'une union T les membres assignables a U. Inverse d'Exclude — garde uniquement les types correspondants.
Comme un aimant dans un tas de billes — il n'attrape que celles en metal.
type Mixed = string | number | boolean | null;
type Primitives = Extract<Mixed, string | number>;
// string | numberCas d'usage : Extraire les types specifiques d'une large union pour un traitement specialise.
Fournit une interface simplifiee a un sous-systeme complexe. Cache la complexite derriere une API unifiee et facile a utiliser.
Le bouton 'demarrer' d'une voiture : un geste simple qui declenche demarreur, injection, allumage.
class OrderFacade {
async placeOrder(cart) {
await this.payment.charge(cart.total);
await this.inventory.reserve(cart.items);
await this.shipping.schedule(cart.address);
}
}Cas d'usage : Simplifier l'utilisation d'un sous-systeme avec plusieurs classes interdependantes.
Système de filtrage dynamique qui affiche les catégories disponibles avec leur nombre de résultats, permettant un affinage progressif de la recherche.
Les filtres sur un site immobilier (prix, surface, ville) qui se mettent à jour selon les résultats disponibles.
const results = await index.search('laptop', {
facets: ['brand', 'price_range', 'ram'],
});
// Returns: { brand: { Apple: 42, Dell: 38 }, ... }Cas d'usage : Navigation produit e-commerce avec filtres dynamiques (marque, prix, taille, couleur).
Fonction qui genere des objets de test avec des valeurs par defaut sensibles et la possibilite de surcharger certains champs. Plus flexible que les fixtures statiques.
Comme un moule a gateau avec des options : le moule donne la forme de base, mais vous choisissez la garniture pour chaque gateau.
// factories/user.ts
export const createUser = (overrides = {}) => ({
id: faker.string.uuid(),
name: faker.person.fullName(),
email: faker.internet.email(),
role: 'user',
...overrides,
});
// Usage: createUser({ role: 'admin' })Cas d'usage : Pour generer des donnees de test variees sans dupliquer la creation d'objets dans chaque test.
Pattern de creation qui delegue l'instanciation d'objets a une methode ou classe dediee, plutot que d'appeler new directement.
Comme une commande au restaurant : tu choisis le plat, la cuisine decide comment le preparer.
class NotificationFactory {
public static function create(string $type): Notifier {
return match($type) {
'email' => new EmailNotifier(),
'sms' => new SmsNotifier(),
'push' => new PushNotifier(),
};
}
}Cas d'usage : Pour centraliser la logique de creation et decoupler le code appelant des classes concretes.
Definit une interface pour creer un objet, mais laisse les sous-classes decider quelle classe instancier. Permet de deleguer la logique de creation.
Un restaurant avec une carte : tu choisis 'pizza' et la cuisine decide quelle recette exacte preparer.
class NotifFactory {
create(type) {
if (type === 'email') return new EmailNotif();
if (type === 'sms') return new SmsNotif();
throw new Error('Unknown type');
}
}Cas d'usage : Quand la logique de creation varie selon le contexte et qu'on veut eviter les if/else dans le code client.
Detecter et signaler les erreurs le plus tot possible plutot que de les propager silencieusement. Reduit le temps de debug et les effets de bord.
Le voyant moteur : mieux vaut s'arreter au premier signal que rouler jusqu'a la panne totale.
function createUser(data) {
if (!data.email) throw new Error('Email required');
if (!isValid(data.email)) throw new Error('Invalid email');
// ... logique seulement si tout est valide
}Cas d'usage : Validation d'entrees, assertions en debut de fonction, guard clauses.
Implementation de HMR specifique a React par Meta. Preserve l'etat des hooks (useState, useRef) lors des modifications de composants, meme en cas d'erreur de syntaxe.
Comme un peintre qui retouche un tableau en direct : les couleurs changent instantanement sans avoir a reposer le cadre.
// Fast Refresh est actif automatiquement
// dans Next.js, Vite + React, CRA
// Regles pour que ca marche:
// 1. Un composant par fichier
// 2. Exports nommes (pas default + named)
// 3. Les fichiers non-React causent un
// rechargement complet (full reload)Cas d'usage : Actif par defaut dans les projets React modernes pour un feedback instantane lors du developpement.
Moment où le navigateur affiche le premier contenu visible (texte, image, SVG). Indique quand l'utilisateur perçoit que la page commence à charger.
Le moment où la première image apparaît quand on allume une vieille télévision à tube.
// Performance Observer for FCP
new PerformanceObserver((entries) => {
const fcp = entries.getEntriesByName('first-contentful-paint')[0];
console.log(`FCP: ${fcp.startTime}ms`); // Target: < 1.8s
}).observe({ type: 'paint', buffered: true });Cas d'usage : Mesurer le temps de perception initial et identifier les blocages de rendu (CSS/JS bloquants).
Toggle permettant d'activer/désactiver une fonctionnalité sans redéployer. Permet le trunk-based development et le progressive rollout.
Un interrupteur sur ton tableau électrique : tu allumes ou éteins une pièce (feature) sans toucher à la maison.
if (featureFlags.isEnabled('new-checkout', { userId })) {
return <NewCheckout />;
}
return <OldCheckout />;Cas d'usage : Déployer du code inactif en prod et l'activer progressivement par audience.
Informaticienne sino-americaine, creatrice d'ImageNet (le dataset qui a lance la revolution du deep learning en 2012). Professeure a Stanford et pionniere de la vision par ordinateur.
La bibliothcaire qui a etiquete 14 millions d'images pour apprendre aux machines a voir — sans ce travail, pas de revolution IA.
# ImageNet — Fei-Fei Li, 2009
# 14 millions d'images, 20 000 categories
# ImageNet Challenge (ILSVRC) 2012 :
# AlexNet = 15.3% erreur (vs 26% avant)
# -> Debut de la revolution deep learning
# Tout a commence par un datasetCas d'usage : Comprendre l'importance des donnees en IA : sans bon dataset, pas de bon modele.
API moderne de requetes HTTP basee sur les Promises, remplacant XMLHttpRequest. Retourne une Response avec des methodes pour parser le body (json, text, blob, etc.).
Un service de livraison moderne : tu passes commande (fetch), tu recois un bon de livraison (Response), puis tu ouvres le colis (.json()).
const res = await fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Alice' })
});
if (!res.ok) throw new Error(res.status);
const data = await res.json();Cas d'usage : Toute communication HTTP : appels API REST, upload de fichiers, telechargement de ressources.
Attribut fetchpriority qui indique au navigateur la priorité relative d'une ressource (high, low, auto). Permet d'optimiser le LCP en priorisant l'image hero ou en dépriorisant les ressources secondaires.
Comme marquer un colis 'URGENT' à la poste : il passe devant les autres dans la file de traitement.
<!-- Image LCP prioritaire -->
<img src="hero.jpg" fetchpriority="high" alt="Hero">
<!-- Image carousel non critique -->
<img src="slide3.jpg" fetchpriority="low" alt="Slide">
<!-- Script non critique -->
<script src="analytics.js" fetchpriority="low"></script>Cas d'usage : Accélérer le LCP en priorisant le chargement de l'image principale au-dessus du fold.
Primitive de concurrence introduite en PHP 8.1 permettant de suspendre et reprendre l'execution d'un bloc de code. Base des frameworks asynchrones comme Revolt.
Comme mettre un livre en pause avec un marque-page pour en lire un autre, puis reprendre exactement ou on s'etait arrete.
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('paused');
echo "Repris avec: $value";
});
$result = $fiber->start(); // 'paused'
$fiber->resume('hello');Cas d'usage : Pour construire des bibliotheques asynchrones ou des event loops sans callbacks imbriques.
Chiffrement cote client de champs individuels avant envoi au serveur. Le serveur ne voit jamais les donnees en clair, meme un admin DB ne peut pas les lire.
Envoyer une lettre dans une enveloppe scellee : le facteur (le serveur) la transporte sans pouvoir la lire.
const client = new MongoClient(uri, {
autoEncryption: {
keyVaultNamespace: 'enc.__keys',
kmsProviders: { local: { key: masterKey } },
schemaMap: encryptedFieldsMap
}
});Cas d'usage : Proteger les donnees sensibles (PII, donnees medicales) meme en cas de compromission du serveur.
Hook qui permet de modifier une valeur avant qu'elle soit utilisee. Le callback recoit la valeur, la transforme et la retourne modifiee.
Comme un filtre Instagram : la photo passe dedans et ressort transformee.
add_filter('the_content', function(string $content): string {
if (is_single()) {
$content .= '<div class="cta">Abonnez-vous!</div>';
}
return $content;
});Cas d'usage : Pour modifier dynamiquement les titres, contenus, requetes, URLs sans toucher aux templates.
API qui permet d'enregistrer un callback de nettoyage appele quand un objet observe est garbage-collecte. Companion de WeakRef pour le cleanup de ressources.
Un notaire qui execute le testament (cleanup) quand la personne (objet) n'est plus la.
const registry = new FinalizationRegistry((heldValue) => {
console.log(`Cleaned up: ${heldValue}`);
});
let obj = { heavy: new ArrayBuffer(1e6) };
registry.register(obj, 'heavy-buffer');
obj = null; // callback sera appele au GCCas d'usage : Liberation de ressources externes (handles fichier, connexions) quand l'objet JS associe est GC.
Methode de lecture qui retourne un curseur sur les documents correspondant au filtre. Sans filtre, retourne tous les documents de la collection.
Chercher tous les livres d'un rayon qui correspondent a tes criteres, tu obtiens un panier a parcourir.
const cursor = db.collection('users')
.find({ age: { $gte: 18 } })
.sort({ name: 1 })
.limit(10);
const users = await cursor.toArray();Cas d'usage : Recuperer une liste filtree de documents pour un affichage pagine ou un export.
Methode qui retourne le premier document correspondant au filtre, ou null si aucun resultat. Plus efficace que find().limit(1) car elle ne cree pas de curseur.
Demander au bibliothecaire de te trouver UN livre precis au lieu de parcourir tout le rayon.
const user = await db.collection('users')
.findOne({ email: 'alice@mail.com' });Cas d'usage : Recuperer un document unique par son identifiant ou un champ unique comme l'email.
Modèle mathématique avec un nombre fini d'états, de transitions entre ces états et d'événements déclencheurs. Le système ne peut être que dans un seul état à la fois.
Un feu tricolore : vert, orange ou rouge, jamais deux à la fois, et les transitions suivent un ordre strict.
// Simple FSM
const transitions = {
green: { TIMER: 'yellow' },
yellow: { TIMER: 'red' },
red: { TIMER: 'green' },
};
function next(state, event) {
return transitions[state]?.[event] ?? state;
}Cas d'usage : Modéliser tout processus séquentiel avec des règles de transition strictes (UI, protocoles, workflows).
Jeff Delaney, createur de la chaine YouTube Fireship. Ses videos '100 seconds' expliquent des concepts tech complexes en moins de 2 minutes. Plus de 3 millions d'abonnes.
Le TikTok de la tech : il compresse un cours de 2 heures en 100 secondes — et tu comprends quand meme.
// Style Fireship — '100 Seconds of X'
// Etape 1 : Qu'est-ce que c'est ?
// Etape 2 : Pourquoi c'est utile ?
// Etape 3 : Code minimal
console.log('But first, mass extinction');
// Sa phrase signatureCas d'usage : Ses videos sont ideales pour decouvrir rapidement une techno avant de plonger dans la doc officielle.
Donnees de test predefinies utilisees pour mettre en place un etat initial connu et reproductible avant chaque test. Peut etre un fichier JSON, un seed de base de donnees, etc.
Comme les decors d'une scene de theatre : mis en place avant chaque representation pour un contexte identique.
// fixtures/users.json
// [{ "id": 1, "name": "Alice", "role": "admin" }]
beforeEach(async () => {
await db.seed(require('./fixtures/users.json'));
});
afterEach(async () => {
await db.cleanup();
});Cas d'usage : Pour les tests d'integration necessitant un etat de base de donnees connu et reproductible.
Test non deterministe qui passe ou echoue de maniere aleatoire sans changement de code. Causes frequentes : timing, ordre d'execution, etat partage, dependances externes.
Comme un detecteur de fumee qui sonne parfois sans raison : on finit par l'ignorer, meme quand il y a un vrai incendie.
// FLAKY: depend du timing
test('shows notification', async () => {
triggerNotification();
// Mauvais: delai fixe fragile
await sleep(500);
expect(screen.getByText('Done')).toBeVisible();
});
// FIX: utiliser waitFor
await waitFor(() => {
expect(screen.getByText('Done')).toBeVisible();
});Cas d'usage : Pour identifier et corriger les tests instables qui minent la confiance de l'equipe dans la CI.
Ensemble de classes utilitaires pour controler les layouts flexbox : direction, alignement, justification, wrap et grow/shrink.
Un chef d'orchestre qui place les musiciens en ligne, les espace et les aligne comme il veut.
<div class="flex flex-col md:flex-row
items-center justify-between gap-4
flex-wrap">
<div class="flex-1">A</div>
<div class="flex-shrink-0">B</div>
</div>Cas d'usage : Creer des layouts flexibles et responsifs (navbars, cards, formulaires) sans CSS custom.
Modèle de layout unidimensionnel qui distribue l'espace entre les items d'un conteneur sur un axe principal. Parfait pour l'alignement, la distribution et le reordonnancement d'éléments.
Comme des passagers dans un bus : ils se répartissent sur une rangée, avec plus ou moins d'espace entre eux.
.container {
display: flex;
justify-content: space-between;
align-items: center;
gap: 1rem;
}
.item { flex: 1; }Cas d'usage : Aligner des éléments dans une navbar, centrer du contenu, ou distribuer des cartes sur une ligne.
Librairie de composants Tailwind avec du JavaScript interactif inclus. Disponible en version vanilla, React, Vue et Svelte.
Un catalogue de meubles avec la notice de montage et les outils fournis.
<div data-dial-init class="fixed end-6 bottom-6">
<button data-dial-toggle="speed-dial"
class="btn btn-primary rounded-full p-4">
+
</button>
</div>Cas d'usage : Ajouter des composants interactifs (dropdowns, modals, carousels) dans un projet Tailwind.
Application de clamp() aux marges, paddings et gaps pour un espacement qui varie fluidement avec le viewport. Crée un rythme visuel cohérent sur toutes les tailles d'écran.
Comme un accordéon : l'espace entre les plis s'adapte naturellement quand on l'étire ou le compresse.
:root {
--space-s: clamp(0.75rem, 0.5rem + 1vw, 1rem);
--space-m: clamp(1.5rem, 1rem + 2vw, 2.5rem);
--space-l: clamp(2rem, 1.5rem + 3vw, 4rem);
}
section { padding: var(--space-l); gap: var(--space-m); }Cas d'usage : Appliquer un système d'espacement proportionnel qui élimine la majorité des breakpoints de layout.
Technique qui fait varier la taille du texte de manière fluide entre un minimum et un maximum en utilisant clamp() et des unités viewport, sans breakpoints.
Comme un élastique qui s'étire proportionnellement sans jamais être trop court ni trop long.
h1 {
font-size: clamp(2rem, 1rem + 3vw, 4rem);
}
p {
font-size: clamp(1rem, 0.875rem + 0.5vw, 1.25rem);
}
/* Échelle fluide sans aucune media query */Cas d'usage : Avoir une typographie qui s'adapte parfaitement à tous les viewports sans sauts brusques entre breakpoints.
Partage efficacement des objets a grain fin pour economiser la memoire. Separe l'etat intrinseque (partage) de l'etat extrinseque (contextuel).
Les caracteres d'imprimerie : chaque lettre 'A' utilise le meme bloc metallique, seule la position sur la page change.
const icons = new Map();
function getIcon(name) {
if (!icons.has(name)) icons.set(name, loadIcon(name));
return icons.get(name);
}Cas d'usage : Rendu de milliers d'elements similaires (arbres dans un jeu, caracteres dans un editeur).
Fast Node Manager, gestionnaire de versions Node.js ecrit en Rust. Plus rapide que nvm, supporte .node-version et .nvmrc. Leger et cross-platform.
Comme nvm mais avec un moteur turbo : meme fonction, mais le switch de version est instantane.
# Installation et usage
fnm install 20
fnm use 20
fnm default 20
# Auto-switch avec .node-version
echo "20" > .node-version
# fnm use --install-if-missing
# Shell integration (.zshrc)
eval "$(fnm env --use-on-cd)"Cas d'usage : Comme alternative rapide a nvm pour gerer les versions Node.js avec auto-switch par projet.
Techniques d'optimisation des polices web : subsetting (garder seulement les caractères utilisés), font-display:swap, preload et formats modernes (woff2).
Ne mettre dans sa valise que les vêtements qu'on va porter au lieu d'emporter toute la garde-robe.
@font-face {
font-family: 'Inter';
src: url('/fonts/inter-latin.woff2') format('woff2');
font-display: swap;
unicode-range: U+0000-00FF; /* Latin subset only */
}
/* Preload in HTML */
/* <link rel="preload" href="/fonts/inter-latin.woff2" as="font"> */Cas d'usage : Réduire le FOUT/FOIT et le poids des polices pour améliorer le LCP et le CLS.
Classes pour controler la police (font-sans/serif/mono), le poids (font-bold), la taille (text-sm/lg/xl) et le style (italic, antialiased).
Les reglages d'un traitement de texte : police, taille, gras, italique.
<h1 class="font-display text-4xl font-extrabold
tracking-tight leading-tight">
Titre Principal
</h1>
<p class="font-sans text-base font-normal
text-gray-600 leading-relaxed">Contenu</p>Cas d'usage : Appliquer une typographie coherente sur l'ensemble du projet via des classes utilitaires.
for...of itere sur les valeurs des iterables (Array, Map, Set, String). for...in itere sur les cles enumerables d'un objet, y compris la prototype chain.
for...of = lire chaque page d'un livre. for...in = lire la table des matieres (et potentiellement celles des annexes heritees).
const arr = ['a', 'b', 'c'];
for (const val of arr) console.log(val); // a, b, c
for (const idx in arr) console.log(idx); // 0, 1, 2
const obj = { x: 1, y: 2 };
for (const key in obj) console.log(key); // x, yCas d'usage : for...of pour les tableaux et iterables, for...in pour les proprietes d'objets (avec hasOwnProperty).
Contrainte referentielle qui garantit qu'une valeur dans une table existe dans la table reference. Supporte ON DELETE CASCADE, SET NULL et RESTRICT.
Un lien hypertexte garanti : il est impossible de pointer vers une page qui n'existe pas.
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL
REFERENCES users(id)
ON DELETE CASCADE
);Cas d'usage : Maintenir l'integrite referentielle entre les tables, comme les commandes liees aux utilisateurs.
Fonction utilitaire qui resout les dependances circulaires en retardant la resolution de la reference. Utilise un wrapper de fonction pour differer l'evaluation.
Comme dire 'je te presenterai mon collegue quand il arrivera' plutot que d'exiger sa presence immediate.
@Injectable()
export class CatService {
constructor(
@Inject(forwardRef(() => DogService))
private dogService: DogService,
) {}
}Cas d'usage : Resoudre les dependances circulaires entre deux services ou modules qui se referent mutuellement.
Conteneur invisible qui permet de retourner plusieurs elements sans ajouter de noeud DOM supplementaire.
Comme un trombone pour regrouper des feuilles : il les tient ensemble sans ajouter de page vide.
function Info() {
return (
<>
<h1>Titre</h1>
<p>Description</p>
</>
);
}Cas d'usage : Eviter les divs inutiles qui cassent le layout CSS ou la semantique HTML.
Paradigme WordPress 5.9+ ou tout le site (header, footer, templates) est editable via des blocs Gutenberg. Remplace le Customizer classique.
Comme passer d'un papier peint fixe a un mur de LEGO : chaque element du site est deplacable et modifiable.
// theme.json active FSE
// templates/single.html
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:post-content /-->
<!-- wp:template-part {"slug":"footer"} /-->Cas d'usage : Pour les themes modernes permettant aux utilisateurs de personnaliser tout le layout sans code.
Technique de recherche qui analyse le contenu textuel complet des documents, avec tokenisation, stemming et scoring de pertinence, contrairement au simple LIKE SQL.
Chercher un livre non par son titre exact mais par les idées qu'il contient, même formulées différemment.
-- PostgreSQL full-text search
SELECT title, ts_rank(search_vector, query) AS rank
FROM articles,
to_tsquery('french', 'développement & web') AS query
WHERE search_vector @@ query
ORDER BY rank DESC;Cas d'usage : Recherche dans des articles, documentation ou descriptions produits avec pertinence linguistique.
Fonctions custom qui calculent et retournent une valeur via @return. Contrairement aux mixins, elles ne generent pas de CSS mais produisent des valeurs.
Une calculatrice : tu lui donnes des chiffres, elle te rend un resultat, pas un objet.
@use 'sass:math';
@function rem($px) {
@return math.div($px, 16) * 1rem;
}
h1 { font-size: rem(32); } // => 2rem
p { font-size: rem(16); } // => 1remCas d'usage : Creer des conversions (px->rem), calculs de grille, ou manipulations de couleurs reutilisables.
Recherche approximative tolérant les fautes de frappe en calculant la distance d'édition (Levenshtein) entre le terme saisi et les termes indexés.
Un ami qui comprend 'javscript' quand vous vouliez dire 'javascript' grâce au contexte.
// Meilisearch fuzzy by default
const results = await index.search('javscrpt');
// Returns: 'JavaScript' (1 typo tolerance)
// Elasticsearch
{ query: { fuzzy: { name: { value: 'javscrpt', fuzziness: 2 } } } }Cas d'usage : Offrir une expérience de recherche indulgente sur un site e-commerce ou une documentation.
Processus automatique de liberation de la memoire non referencee. V8 utilise un GC generationnel : minor GC (young generation) frequent et major GC (old generation) moins souvent.
Un service de nettoyage qui ramasse les objets abandonnes dans un parc : si personne ne les reclame, ils sont jetes.
let obj = { data: new Array(1000000) };
// obj est referencee, pas GC
obj = null;
// Plus de reference -> eligible au GC
// WeakRef pour reference faible
const weak = new WeakRef(someObj);Cas d'usage : Comprendre les fuites memoire, optimiser l'allocation, choisir entre Map/WeakMap.
Fonction speciale (function*) qui peut se suspendre via yield et reprendre. Retourne un iterateur. Permet la generation paresseuse de sequences potentiellement infinies.
Un livre dont tu tournes les pages une par une (yield) : l'histoire ne se deroule que quand tu le demandes.
function* fibonacci() {
let [a, b] = [0, 1];
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
const fib = fibonacci();
fib.next().value; // 0, 1, 1, 2...Cas d'usage : Sequences paresseuses, pagination, flux de donnees, implementation de iterables custom.
Restriction appliquee a un parametre generique via extends pour garantir qu'il possede certaines proprietes. Limite les types acceptables.
Comme un casting de film — tout le monde peut postuler, mais il faut au minimum savoir chanter.
function getLength<T extends { length: number }>(x: T) {
return x.length;
}
getLength("hello"); // OK
getLength([1, 2]); // OK
// getLength(42); // Erreur: pas de lengthCas d'usage : Garantir qu'un generique possede les proprietes necessaires avant de les utiliser.
Fonction parametree par un ou plusieurs types qui sont resolus a l'appel. Permet d'ecrire du code reutilisable tout en conservant la securite des types.
Comme un moule a gateau adaptable — meme forme de base mais le resultat s'adapte a l'ingredient (chocolat, vanille).
function first<T>(arr: T[]): T | undefined {
return arr[0];
}
const n = first([1, 2, 3]); // number
const s = first(["a", "b"]); // stringCas d'usage : Creer des fonctions utilitaires (map, filter, fetch wrapper) qui preservent les types d'entree/sortie.
Capacite de TS a deduire automatiquement les parametres generiques a partir des arguments passes. Evite de specifier explicitement les types a chaque appel.
Comme un traducteur qui detecte automatiquement la langue source sans qu'on lui dise.
function wrap<T>(value: T): { value: T } {
return { value };
}
const r = wrap(42); // T infere comme number
const s = wrap("hi"); // T infere comme stringCas d'usage : Concevoir des APIs generiques ergonomiques ou l'utilisateur n'a pas a specifier les types manuellement.
Informaticien britannico-canadien, surnomme le 'parrain du deep learning'. Ses travaux sur les reseaux de neurones (backpropagation, deep belief networks) ont lance la revolution IA moderne. Prix Nobel de physique 2024.
Le parrain de l'IA : pendant 30 ans, personne ne croyait aux reseaux de neurones — sauf lui. Il avait raison.
# Backpropagation — Geoffrey Hinton
import torch.nn as nn
model = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10)
)
# Les reseaux profonds qu'il a rendu possiblesCas d'usage : Comprendre les fondations du deep learning et pourquoi l'IA a explose apres 2012 (AlexNet).
Index 2dsphere ou 2d pour les requetes geographiques. Permet de chercher des points proches, dans un polygone ou dans un rayon donne.
Un GPS integre a ta base de donnees : 'Trouve-moi tous les restaurants a moins de 2 km.'
db.stores.createIndex({ location: '2dsphere' });
db.stores.find({
location: {
$near: {
$geometry: { type: 'Point', coordinates: [2.35, 48.86] },
$maxDistance: 2000
}
}
});Cas d'usage : Applications de geolocalisation : trouver les magasins, restaurants ou livreurs les plus proches.
Generalized Inverted Index, optimise pour les valeurs composites comme les arrays, JSONB et le full-text search. Indexe chaque element individuel du contenu.
L'index d'un livre de recettes : chaque ingredient pointe vers toutes les recettes qui l'utilisent.
CREATE INDEX idx_posts_tags
ON posts USING gin (tags);
CREATE INDEX idx_events_data
ON events USING gin (data jsonb_path_ops);Cas d'usage : Accelerer les recherches dans des colonnes JSONB, des arrays ou du texte avec tsvector.
Generalized Search Tree, index polyvalent pour les donnees geometriques, les ranges et le full-text. Supporte les requetes de proximite, d'inclusion et de chevauchement.
Un plan de quartier qui sait repondre a 'quels batiments sont dans ce perimetre ?'.
CREATE INDEX idx_locations
ON places USING gist (location);
-- Avec PostGIS
SELECT * FROM places
WHERE ST_DWithin(location, point, 1000);Cas d'usage : Requetes geospatiales avec PostGIS ou recherche dans des plages de valeurs (ranges).
Outil de recherche dichotomique dans l'historique Git pour identifier le commit ayant introduit un bug. Logarithmique en complexité.
Chercher une page dans un dictionnaire en ouvrant au milieu et en éliminant une moitié à chaque fois.
git bisect start
git bisect bad # commit actuel est bugué
git bisect good v1.0.0 # cette version marchait
# Git checkout un commit, tu testes, puis :
git bisect good # ou bad
git bisect resetCas d'usage : Trouver en quelques minutes parmi 1000 commits lequel a introduit une régression.
Scripts exécutés automatiquement lors d'événements Git (pre-commit, pre-push, commit-msg). Permettent d'automatiser les vérifications.
Un videur à l'entrée d'un club : il vérifie que tu respectes le dress code avant de te laisser entrer.
#!/bin/sh
# .git/hooks/pre-commit
npm run lint
npm run test:unitCas d'usage : Bloquer les commits qui ne passent pas le lint ou les tests unitaires.
Extension Git pour gérer les fichiers volumineux (images, vidéos, modèles ML). Stocke des pointeurs dans Git et les fichiers sur un serveur dédié.
Au lieu de stocker les meubles chez toi, tu gardes un ticket de consigne et les meubles sont dans un garde-meuble.
git lfs install
git lfs track "*.psd"
git add .gitattributes
git add design.psd
git commit -m "add design file"Cas d'usage : Versionner des assets binaires volumineux sans exploser la taille du dépôt Git.
Journal local de tous les déplacements de HEAD et des refs. Permet de retrouver des commits perdus après un reset, rebase ou drop.
L'historique de navigation de ton navigateur : même si tu fermes un onglet, tu peux retrouver la page.
git reflog
# abc1234 HEAD@{0}: reset: moving to HEAD~3
# def5678 HEAD@{1}: commit: feat: add auth
git checkout def5678 # récupérer le commit perduCas d'usage : Récupérer un commit perdu après un rebase raté ou un reset --hard accidentel.
Met de côté temporairement les modifications en cours sans les commiter. Permet de changer de branche proprement.
Mettre son travail dans un tiroir pour libérer son bureau, puis le ressortir plus tard.
git stash
git checkout hotfix-branch
# ... travail sur le hotfix
git checkout feature-branch
git stash popCas d'usage : Sauvegarder rapidement du travail en cours pour traiter une urgence sur une autre branche.
Plateforme CI/CD intégrée à GitHub. Les workflows sont définis en YAML dans .github/workflows et déclenchés par des événements GitHub.
Un assistant personnel intégré à ton bureau (GitHub) qui exécute automatiquement tes instructions.
name: CI
on:
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci && npm testCas d'usage : CI/CD natif pour les projets hébergés sur GitHub, gratuit pour l'open source.
Système CI/CD intégré à GitLab, configuré via .gitlab-ci.yml. Supporte les pipelines multi-stages, les environnements et le Auto DevOps.
Une usine intégrée à l'entrepôt (GitLab) : tout se fait sous le même toit.
stages: [build, test, deploy]
build:
stage: build
script: npm run build
artifacts:
paths: [dist/]Cas d'usage : Pipeline CI/CD tout-en-un pour les organisations utilisant GitLab comme forge.
Format de description des tests issu du BDD : Given (contexte initial), When (action), Then (resultat attendu). Equivalent de AAA en langage metier.
Comme raconter une histoire : 'Etant donne que... Quand... Alors...' — meme votre PO peut comprendre le test.
// Given-When-Then en Gherkin
// Given un panier avec 3 articles
// When l'utilisateur applique le code PROMO10
// Then le total est reduit de 10%
test('PROMO10 reduces total by 10%', () => {
const cart = createCart({ items: 3, total: 100 });
const result = applyPromo(cart, 'PROMO10');
expect(result.total).toBe(90);
});Cas d'usage : Pour les tests d'acceptance et BDD ou le langage metier doit etre comprehensible par les non-techniques.
Technique pour ajouter des declarations au scope global via declare global dans un module. Permet d'etendre Window, globalThis ou les prototypes.
Comme un decret national qui ajoute une loi applicable partout — la modification est globale.
export {};
declare global {
interface Window {
analytics: { track(e: string): void };
}
}Cas d'usage : Declarer des variables globales injectees (analytics, config, feature flags) avec un typage correct.
Module decore avec @Global() dont les providers sont accessibles dans toute l'application sans import explicite. A utiliser avec parcimonie.
Comme le WiFi dans un hotel : disponible partout sans avoir a le demander a chaque etage.
@Global()
@Module({
providers: [ConfigService],
exports: [ConfigService],
})
export class ConfigModule {}Cas d'usage : Exposer des services transversaux comme la configuration ou le logging sans imports repetitifs.
Informaticienne et amiral de la marine americaine, pionniere des compilateurs. Elle a concu le premier compilateur (A-0) et contribue a la creation du langage COBOL.
La traductrice universelle qui a permis aux humains de parler aux machines dans un langage presque humain.
* COBOL — inspire par Grace Hopper
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY 'Hello, World!'.
STOP RUN.Cas d'usage : Comprendre l'evolution des langages de programmation, du code machine aux langages de haut niveau.
Capacité d'un système à continuer de fonctionner avec des fonctionnalités réduites quand un composant est en panne, plutôt que de tomber entièrement.
Un restaurant dont le four tombe en panne : il sert des plats froids plutôt que de fermer complètement.
async function getRecommendations(userId) {
try {
return await recommendationService.get(userId);
} catch (e) {
logger.warn('Reco service down, fallback');
return getPopularItems(); // fallback
}
}Cas d'usage : Maintenir le service principal même quand des services secondaires (recommandations, analytics) sont en panne.
Langage de requete pour APIs ou le client specifie exactement les donnees souhaitees. Un seul endpoint, schema type, pas d'over/under-fetching.
Commander a la carte au restaurant : tu choisis exactement chaque plat et garniture, rien de plus.
query {
user(id: 42) {
name
email
orders(last: 5) {
total
status
}
}
}Cas d'usage : Frontends avec des besoins de donnees varies (mobile vs web), dashboards complexes.
Decorateur pour definir des abonnements temps reel via WebSocket dans GraphQL. Permet au client de recevoir des mises a jour en push.
Comme un flux d'actualites en direct : tu t'abonnes une fois et les nouvelles arrivent automatiquement.
@Subscription(() => Comment, {
filter: (payload, variables) =>
payload.commentAdded.postId === variables.postId,
})
commentAdded(@Args('postId') postId: string) {
return this.pubSub.asyncIterator('commentAdded');
}Cas d'usage : Implementer des notifications temps reel comme les nouveaux commentaires ou messages.
Classe decoree @Resolver qui definit les operations GraphQL (queries, mutations, subscriptions) en approche code-first avec des decorateurs TypeScript.
Comme un serveur de restaurant avec un menu a la carte : le client choisit exactement ce qu'il veut recevoir.
@Resolver(() => User)
export class UserResolver {
constructor(private userService: UserService) {}
@Query(() => [User])
users() { return this.userService.findAll(); }
@Mutation(() => User)
createUser(@Args('input') input: CreateUserInput) {
return this.userService.create(input);
}
}Cas d'usage : Exposer une API GraphQL code-first avec typage automatique du schema depuis TypeScript.
Informaticien canadien, createur de Rust chez Mozilla. Rust garantit la securite memoire sans garbage collector grace au systeme d'ownership et de borrowing.
L'architecte qui a construit une maison anti-incendie : avec Rust, les bugs memoire ne peuvent tout simplement pas exister.
// Rust — Graydon Hoare, 2010
fn main() {
let name = String::from("World");
println!("Hello, {}!", name);
}
// Ownership + Borrowing = zero segfaultCas d'usage : Rust est adopte pour les outils de dev (SWC, Turbopack, Biome), les navigateurs et les systemes critiques.
Système de layout bidimensionnel qui organise le contenu en lignes et colonnes simultanément. Plus puissant que Flexbox pour les layouts de page complexes avec zones nommées.
Comme un tableau Excel : on définit lignes et colonnes, puis on place le contenu dans les cellules.
.layout {
display: grid;
grid-template: "header header" auto
"sidebar main" 1fr
"footer footer" auto / 250px 1fr;
}
.header { grid-area: header; }Cas d'usage : Créer des layouts de page complets, dashboards ou galeries avec placement précis en deux dimensions.
Classes pour creer des grilles CSS : nombre de colonnes, placement, gaps et zones. Simplifie les layouts complexes en quelques classes.
Un tableur Excel : tu definis colonnes et lignes, puis places tes contenus dans les cellules.
<div class="grid grid-cols-3 gap-6">
<div class="col-span-2">Large</div>
<div class="row-span-2">Haut</div>
<div>Normal</div>
</div>Cas d'usage : Construire des grilles de cards, galleries photo, ou dashboards avec un layout precis.
Librairie CSS-in-JS de Microsoft (utilisee dans Fluent UI) qui genere du CSS atomique. Supporte l'ahead-of-time compilation et le merge intelligent de styles.
Le systeme de style de Microsoft Office : industriel, performant, atomique.
import { makeStyles } from '@griffel/react'
const useStyles = makeStyles({
root: {
display: 'flex',
padding: '8px',
':hover': { backgroundColor: '#f0f0f0' },
}
})
// const styles = useStyles(); <div className={styles.root}>Cas d'usage : Projet Microsoft/Fluent UI necessitant du CSS atomique avec compilation AOT.
Modificateurs qui permettent de styler un enfant (group-hover:) ou un element frere (peer-checked:) en fonction de l'etat d'un autre element.
Quand papa sourit (group), les enfants changent de couleur. Quand ton voisin coche (peer), tu apparais.
<div class="group p-4 hover:bg-blue-50">
<h3 class="group-hover:text-blue-600">Titre</h3>
</div>
<input type="checkbox" class="peer" />
<p class="hidden peer-checked:block">Visible si coche</p>Cas d'usage : Creer des interactions parent-enfant ou frere-frere sans JavaScript.
Framework RPC haute performance utilisant Protocol Buffers et HTTP/2. NestJS supporte gRPC comme transport pour les microservices.
Comme un langage signe standardise entre machines : ultra-rapide et compact, mais moins lisible pour les humains.
@GrpcMethod('UserService', 'FindOne')
findOne(data: { id: number }): User {
return this.userService.findOne(data.id);
}
// .proto: service UserService {
// rpc FindOne (UserById) returns (User);
// }Cas d'usage : Communiquer entre microservices avec des performances superieures a REST et un contrat strict.
Framework RPC haute performance de Google utilisant Protocol Buffers pour la serialisation et HTTP/2 pour le transport. Supporte le streaming bidirectionnel.
Un talkie-walkie numerique : communication directe, rapide, avec un protocole strict que les deux cotes comprennent.
// user.proto
service UserService {
rpc GetUser (UserRequest) returns (UserResponse);
rpc ListUsers (Empty) returns (stream UserResponse);
}
message UserRequest { int32 id = 1; }Cas d'usage : Communication inter-microservices performante, streaming temps reel, APIs internes.
Classe @Injectable implementant CanActivate qui decide si une requete peut continuer. Ideal pour l'authentification et l'autorisation.
Comme un videur de boite de nuit : il verifie si tu as le droit d'entrer avant de te laisser passer.
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
return !!request.headers.authorization;
}
}Cas d'usage : Proteger des routes avec authentification JWT, verifier les roles RBAC ou valider des permissions.
Informaticien neerlandais, createur de Python. Il a ete le 'Benevolent Dictator For Life' (BDFL) du projet jusqu'en 2018. Python est devenu le langage le plus populaire au monde.
Le chef cuisinier qui a invente une recette si simple que tout le monde peut cuisiner — meme les debutants.
# Python — Guido van Rossum, 1991
def hello(name: str) -> str:
return f'Hello, {name}!'
print(hello('World'))
# Lisibilite = philosophie PythonCas d'usage : Python domine en data science, IA, scripting et enseignement. Langage incontournable a connaitre.
Entrepreneur argentino-americain, fondateur de Vercel et createur de Next.js et Socket.io. Vercel a popularise le deploiement serverless et le Jamstack pour les applications React.
Le chef qui a mis React sur des rails avec Next.js — et offert un restaurant 5 etoiles (Vercel) pour le servir.
// Next.js — Guillermo Rauch
// app/page.tsx
export default async function Home() {
const data = await fetch('https://api.example.com');
return <h1>Hello, Next.js!</h1>;
}
// SSR + SSG + ISR + App RouterCas d'usage : Next.js est le framework React le plus populaire. Vercel est la reference du deploiement front-end.
Unite de contenu de l'editeur Gutenberg. Chaque bloc est un composant React avec une interface d'edition et un rendu front. Base du Full Site Editing.
Comme des briques de construction modulaires : chacune a sa forme et sa fonction, on les assemble librement.
// block.json
{
"name": "myplugin/cta",
"title": "Call to Action",
"category": "design",
"editorScript": "file:./index.js",
"render": "file:./render.php"
}Cas d'usage : Pour creer des composants de contenu reutilisables avec une experience d'edition visuelle.
Informaticien norvegien, co-createur de CSS avec Bert Bos. Il a propose CSS en 1994 au CERN pour separer le contenu (HTML) de la presentation.
L'inventeur du vestiaire du web : grace a CSS, le HTML peut changer de tenue sans changer de corps.
/* CSS — Hakon Wium Lie, 1996 */
body {
font-family: Arial, sans-serif;
color: #333;
margin: 0;
}
/* Separation contenu / presentation */Cas d'usage : CSS est fondamental pour tout developpeur web. Comprendre ses origines aide a saisir la cascade et la specificite.
Hypermedia As The Engine Of Application State. Niveau 3 de Richardson : les reponses contiennent des liens vers les actions possibles, rendant l'API auto-decouvrable.
Un site web : chaque page contient des liens vers les pages suivantes — tu n'as pas besoin de deviner les URLs.
{
"id": 42, "name": "Alice",
"_links": {
"self": { "href": "/users/42" },
"orders": { "href": "/users/42/orders" },
"delete": { "href": "/users/42", "method": "DELETE" }
}
}Cas d'usage : APIs publiques auto-documentees ou le client n'a pas besoin de hardcoder les URLs.
Composants qui fournissent la logique et l'accessibilite sans imposer de style ni de markup. L'utilisateur controle entierement le rendu.
Comme un moteur de voiture vendu sans carrosserie : tu choisis la forme, il fournit la puissance.
// Headless UI Combobox
<Combobox value={selected} onChange={setSelected}>
<Combobox.Input onChange={e => setQuery(e.target.value)} />
<Combobox.Options>
{filtered.map(item => (
<Combobox.Option key={item.id} value={item}>{item.name}</Combobox.Option>
))}
</Combobox.Options>
</Combobox>Cas d'usage : Design systems, librairies UI (Headless UI, Radix, Downshift) qui doivent etre stylisables sans contrainte.
Librairie de composants accessibles et sans style par defaut, concue par l'equipe Tailwind. Fournit la logique (modals, menus, tabs) sans imposer de design.
Un mannequin nu : il a la structure, tu choisis les vetements (les styles).
import { Menu } from '@headlessui/react'
<Menu>
<Menu.Button className="px-4 py-2">Options</Menu.Button>
<Menu.Items className="absolute mt-2 bg-white shadow-lg">
<Menu.Item>{({ active }) =>
<a className={active ? 'bg-blue-100' : ''}>Edit</a>
}</Menu.Item>
</Menu.Items>
</Menu>Cas d'usage : Implementer des composants accessibles (ARIA) avec un style 100% custom en Tailwind.
Endpoint HTTP renvoyant l'état de santé d'un service et ses dépendances (DB, cache, APIs). Utilisé par les load balancers et orchestrateurs.
Le check-up médical annuel : vérifier que le coeur (DB), les poumons (cache) et le cerveau (API) fonctionnent.
app.get('/health', async (req, res) => {
const dbOk = await db.ping().catch(() => false);
const redisOk = await redis.ping().catch(() => false);
const status = dbOk && redisOk ? 200 : 503;
res.status(status).json({ db: dbOk, redis: redisOk });
});Cas d'usage : Permettre au load balancer de retirer automatiquement les instances défaillantes.
Gestionnaire de packages Kubernetes. Un Chart est un bundle de templates YAML paramétrables pour déployer une application complète.
Un kit IKEA avec notice : tout est emballé ensemble avec des instructions configurables.
helm repo add bitnami https://charts.bitnami.com
helm install my-db bitnami/postgresql \
--set auth.postgresPassword=secret \
--namespace stagingCas d'usage : Standardiser et versionner les déploiements Kubernetes avec des valeurs par environnement.
Middleware qui securise les headers HTTP (X-Frame-Options, CSP, HSTS, etc.). Protege contre les attaques web courantes comme le clickjacking.
Comme un casque de moto : protection basique mais indispensable contre les dangers les plus courants.
// main.ts
import helmet from 'helmet';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(helmet());
await app.listen(3000);
}Cas d'usage : Ajouter les headers de securite HTTP standard a toute API NestJS en production.
Middleware Express qui configure automatiquement une dizaine d'en-têtes de sécurité HTTP (CSP, HSTS, X-Frame-Options, etc.) avec des valeurs saines par défaut.
Un casque de protection tout-en-un qui protège la tête sous tous les angles sans effort.
import helmet from 'helmet';
app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'nonce-abc'"],
},
},
}));Cas d'usage : Appliquer les bonnes pratiques de sécurité HTTP en une seule ligne sur toute app Express.
Mecanisme OOP permettant a une classe enfant d'heriter des proprietes et methodes d'une classe parente. PHP ne supporte que l'heritage simple.
Comme un enfant qui herite des caracteristiques de ses parents mais peut developper les siennes.
class Animal {
public function breathe(): string { return 'respire'; }
}
class Dog extends Animal {
public function bark(): string { return 'wouf'; }
}
// Dog peut breathe() ET bark()Cas d'usage : Quand il existe une vraie relation 'est un' entre deux classes (un Chien EST un Animal).
Tests completement auto-contenus sans aucune dependance externe (reseau, API tierces, horloge systeme). Tout est controle et reproductible a 100%.
Comme un laboratoire en salle blanche : l'environnement est totalement controle, rien de l'exterieur ne peut influencer le resultat.
// Hermetique : controle du temps
vi.useFakeTimers();
vi.setSystemTime(new Date('2024-01-01'));
// Hermetique : mock reseau
const server = setupServer(
http.get('/api/data', () => HttpResponse.json({}))
);
// Aucune requete reelle ne sortCas d'usage : Pour les tests en CI/CD qui doivent fonctionner identiquement sur n'importe quelle machine sans acces reseau.
Architecture Ports & Adapters ou le domaine expose des ports (interfaces) et les adaptateurs connectent le monde exterieur. Isole le coeur metier.
Une prise universelle : le port est le standard, l'adaptateur change selon le pays (DB, API, UI).
// Port (interface)
interface UserPort { findById(id): User; }
// Adapter
class MongoUserAdapter implements UserPort {
findById(id) { return mongo.find({ _id: id }); }
}Cas d'usage : Remplacer facilement une base de donnees ou un service externe sans toucher au domaine.
Technologie qui remplace les modules modifies dans le navigateur sans recharger la page, preservant l'etat de l'application. Accelere considerablement le cycle de developpement.
Comme changer une roue sur une voiture en mouvement : vous remplacez la piece sans arreter le moteur ni perdre votre position.
// Vite: HMR natif, rien a configurer
// Modifiez un fichier -> mise a jour instantanee
// React Fast Refresh preserve l'etat
// des hooks et composants
// Webpack: necessite config + plugin HMR
// Vite: marche out-of-the-boxCas d'usage : Pendant le developpement pour voir instantanement les changements sans perdre l'etat de l'app (formulaires, navigation).
Fonction qui prend un composant et retourne un nouveau composant enrichi. Pattern classique de reutilisation de logique, largement remplace par les hooks.
Comme un cadre photo qui embellit toute photo qu'on y met : le HOC ajoute des fonctionnalites a tout composant.
function withAuth(Component) {
return function AuthWrapper(props) {
const { user } = useAuth();
if (!user) return <Redirect to="/login" />;
return <Component {...props} user={user} />;
};
}
const ProtectedPage = withAuth(Dashboard);Cas d'usage : Ajouter de la logique transverse (auth, logging, theming) a plusieurs composants.
Mecanisme par lequel les declarations de variables (var) et fonctions sont remontees en haut de leur scope durant la phase de compilation. Les let/const sont hoistees mais restent dans la Temporal Dead Zone.
Comme un prof qui note tous les noms au tableau avant le debut du cours, mais ne remplit les notes qu'au fur et a mesure.
console.log(a); // undefined (var hoiste)
var a = 5;
sayHi(); // OK, declaration hoistee
function sayHi() { console.log('Hi'); }
console.log(b); // ReferenceError (TDZ)
let b = 10;Cas d'usage : Comprendre pourquoi une variable vaut undefined au lieu de lancer une erreur, debugger l'ordre d'execution.
Don't call us, we'll call you. Les composants de haut niveau appellent ceux de bas niveau via des callbacks ou des hooks, pas l'inverse.
Un casting Hollywood : l'acteur laisse ses coordonnees, c'est le studio qui rappelle — pas l'inverse.
// Framework appelle ton code (IoC)
app.get('/users', (req, res) => {
res.json(users); // Tu ne geres pas le serveur HTTP
});
// Express t'appelle quand la route matcheCas d'usage : Fondement de l'Inversion of Control dans les frameworks et le pattern Template Method.
Systeme central de WordPress base sur le pattern Observer. Les hooks permettent aux plugins et themes de modifier le comportement sans toucher au core. Il en existe deux types : Actions et Filtres.
Comme des prises electriques dans une maison : tu branches ce que tu veux, ou tu veux, sans refaire l'installation.
// Action : executer du code a un moment
add_action('wp_footer', function() {
echo '<script>console.log("loaded")</script>';
});
// Filtre : modifier une valeur
add_filter('the_title', 'strtoupper');Cas d'usage : Mecanisme fondamental pour toute extension WordPress : plugins, themes, customisations.
Vertical = plus de CPU/RAM sur une machine. Horizontal = plus de machines. Le horizontal est quasi illimité mais nécessite des apps stateless.
Vertical = acheter un plus gros camion. Horizontal = acheter plus de camions.
# Vertical : upgrader l'instance
aws ec2 modify-instance --type m5.2xlarge
# Horizontal : ajouter des instances
kubectl scale deployment api --replicas=10Cas d'usage : Horizontal scaling pour les apps stateless derrière un load balancer.
Ressource qui ajuste automatiquement le nombre de réplicas d'un Deployment selon des métriques (CPU, mémoire, custom metrics).
Un manager qui embauche des intérimaires quand l'affluence augmente et les libère quand ça se calme.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
scaleTargetRef:
kind: Deployment
name: api
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource: { name: cpu, target: { averageUtilization: 70 } }Cas d'usage : Adapter automatiquement la capacité aux pics de trafic sans surprovisionnement permanent.
Élément <template> dont le contenu est parsé mais pas rendu ni exécuté. On le clone via JS pour instancier des fragments de DOM à la demande, de manière performante.
Comme un patron de couture : il n'est pas un vêtement en soi, mais on peut en fabriquer autant qu'on veut.
<template id="card-tpl">
<div class="card"><slot name="title"></slot></div>
</template>
<script>
const tpl = document.getElementById('card-tpl');
const clone = tpl.content.cloneNode(true);
document.body.appendChild(clone);
</script>Cas d'usage : Définir des structures réutilisables côté HTML pour les Web Components ou le rendu dynamique.
Version majeure du protocole HTTP avec multiplexage (plusieurs requêtes sur une connexion), compression des headers (HPACK) et server push. Élimine le besoin de concaténation.
Une autoroute à plusieurs voies au lieu d'une route à voie unique avec feu de circulation.
// Nginx HTTP/2 config
server {
listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
}
// Node.js
import http2 from 'node:http2';
const server = http2.createSecureServer({ cert, key });Cas d'usage : Améliorer la performance de chargement en parallélisant les requêtes sans overhead de connexion.
Dernière version du protocole HTTP basée sur QUIC (UDP) au lieu de TCP. Élimine le head-of-line blocking, offre des handshakes 0-RTT et une meilleure performance mobile.
Passer de la route (TCP) à l'avion (QUIC) : plus de bouchons, connexion plus rapide et changement de réseau fluide.
// Nginx HTTP/3 (experimental)
server {
listen 443 quic reuseport;
listen 443 ssl;
http3 on;
add_header Alt-Svc 'h3=":443"; ma=86400';
}Cas d'usage : Améliorer la latence sur les connexions mobiles instables et les réseaux à forte perte de paquets.
Protocole de chiffrement des communications web utilisant TLS. Garantit la confidentialité, l'intégrité et l'authenticité des échanges entre client et serveur.
Une enveloppe scellée et signée : personne ne peut lire le contenu ni le modifier en chemin.
// Force HTTPS redirect (Express)
app.use((req, res, next) => {
if (req.header('x-forwarded-proto') !== 'https') {
return res.redirect(301, `https://${req.hostname}${req.url}`);
}
next();
});Cas d'usage : Obligatoire pour toute application en production, requis pour les cookies Secure et HTTP/2.
Outil npm pour gérer facilement les Git hooks dans un projet. Configure les hooks via le package.json ou des fichiers dédiés.
Un système de sécurité automatique : une fois installé, il se déclenche tout seul à chaque commit.
npx husky init
# .husky/pre-commit
npx lint-stagedCas d'usage : Garantir que tous les membres de l'équipe exécutent les mêmes vérifications avant chaque commit.
Husky execute des git hooks (pre-commit, pre-push) et lint-staged applique des commandes (lint, format) uniquement sur les fichiers stages. Ensemble, ils garantissent la qualite avant chaque commit.
Comme un vigile a l'entree d'un club : il verifie la tenue de chaque personne (fichier) avant de la laisser entrer (commiter).
// package.json
{
"lint-staged": {
"*.{js,ts}": ["eslint --fix", "prettier --write"],
"*.css": ["prettier --write"]
}
}
// .husky/pre-commit
// npx lint-stagedCas d'usage : Pour bloquer automatiquement les commits contenant des erreurs de lint ou de formatage.
Application NestJS qui combine un serveur HTTP et un ou plusieurs microservices dans le meme processus. Ecoute sur plusieurs transports simultanement.
Comme un restaurant avec salle et livraison : le meme service cuisine mais repond a deux canaux differents.
const app = await NestFactory.create(AppModule);
app.connectMicroservice({ transport: Transport.REDIS,
options: { host: 'localhost', port: 6379 } });
await app.startAllMicroservices();
await app.listen(3000);Cas d'usage : Migrer progressivement vers une architecture microservices en gardant l'API HTTP existante.
Service de gestion des identités et des permissions cloud. Définit qui peut faire quoi sur quelles ressources via des policies JSON.
Le système de badges d'une entreprise : chaque badge (role) ouvre certaines portes (permissions) et pas d'autres.
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::my-bucket/*"
}Cas d'usage : Appliquer le principe du moindre privilège pour chaque service et utilisateur.
Chercheur americain en IA, inventeur des GANs (Generative Adversarial Networks). Les GANs ont revolutionne la generation d'images, de texte et de contenu synthetique.
L'inventeur du duel creatif : un reseau cree, l'autre critique, et ensemble ils produisent des images bluffantes.
# GAN — Ian Goodfellow, 2014
# Generateur vs Discriminateur
generator = build_generator()
discriminator = build_discriminator()
# G genere de fausses images
# D essaie de les detecter
# G s'ameliore pour tromper D
# -> Images de plus en plus realistesCas d'usage : Les GANs sont a la base de la generation d'images IA (deepfakes, art generation, data augmentation).
Informaticien britannico-suisse, editeur principal de la specification HTML5 au WHATWG. Il a aussi cree le test Acid2 pour les navigateurs.
Le grammairien du web : il a ecrit les regles que chaque navigateur doit suivre pour afficher du HTML.
<!-- HTML5 — specification editee par Ian Hickson -->
<!DOCTYPE html>
<html lang="fr">
<head><meta charset="utf-8"></head>
<body>
<canvas id="c"></canvas>
<video src="v.mp4" controls></video>
</body>
</html>Cas d'usage : HTML5 a apporte canvas, video, audio, localStorage et les APIs modernes du web.
Une operation idempotente produit le meme resultat qu'elle soit executee une ou plusieurs fois. Essentiel pour les retries et la fiabilite des APIs.
Appuyer sur le bouton d'un ascenseur deja allume : le resultat est le meme, qu'on appuie 1 ou 10 fois.
// Idempotency key pour eviter les doublons
app.post('/payments', async (req, res) => {
const existing = await db.findByIdempotencyKey(req.headers['idempotency-key']);
if (existing) return res.json(existing);
const payment = await processPayment(req.body);
res.json(payment);
});Cas d'usage : Paiements, creation de ressources, toute operation qui peut etre retentee par le client.
Pattern garantissant qu'un message traité plusieurs fois produit le même résultat. Essentiel avec les systèmes at-least-once delivery.
Appuyer 10 fois sur le bouton d'un ascenseur ne l'appelle pas 10 fois.
async function processPayment(msg) {
const exists = await db.findOne({ idempotencyKey: msg.id });
if (exists) return; // déjà traité
await db.insert({ idempotencyKey: msg.id });
await chargeCustomer(msg.data);
}Cas d'usage : Éviter les doubles paiements ou doubles envois dans un système distribué.
Immediately Invoked Function Expression : fonction anonyme executee immediatement a sa declaration. Cree un scope isole pour eviter la pollution globale. Moins utile depuis les modules ESM.
Un feu d'artifice a usage unique : tu l'allumes et il s'execute immediatement, sans laisser de trace.
const result = (() => {
const secret = 42;
return secret * 2;
})();
// secret n'existe pas ici
console.log(result); // 84Cas d'usage : Isolation de scope dans du code legacy, initialisation immediate, eviter les collisions globales.
Conversion des images vers des formats modernes (WebP, AVIF) avec redimensionnement responsive. AVIF offre 50% de compression en plus que JPEG à qualité égale.
Compresser une valise avec des sacs sous vide : même contenu, moitié de place.
import sharp from 'sharp';
await sharp(inputBuffer)
.resize(800, 600, { fit: 'inside' })
.avif({ quality: 60 })
.toFile('output.avif');
// Fallback chain: AVIF > WebP > JPEGCas d'usage : Réduire le poids des images de 60-80% pour améliorer le LCP et la bande passante.
Principe de ne jamais modifier les donnees existantes mais de creer de nouvelles copies avec les changements. Object.freeze() pour une immutabilite superficielle en JS natif.
Un livre publie : pour corriger une erreur, tu publies une nouvelle edition au lieu de rayer l'ancienne.
// Immutable update
const user = { name: 'Alice', age: 30 };
const updated = { ...user, age: 31 };
// Array
const arr = [1, 2, 3];
const added = [...arr, 4];
// Freeze
const frozen = Object.freeze({ x: 1 });Cas d'usage : State management (Redux, React state), historique undo/redo, detection de changements performante.
API navigateur via <script type='importmap'> qui mappe des specifiers de modules a des URLs. Permet d'utiliser des bare imports sans bundler.
Un annuaire qui traduit les noms (lodash) en adresses reelles (https://cdn.../lodash.js).
<script type="importmap">
{ "imports": { "lodash": "/libs/lodash.js" } }
</script>
<script type="module">
import _ from 'lodash';
</script>Cas d'usage : Prototypage rapide sans bundler, migration progressive vers ESM natif dans le navigateur.
Système de notifications intégré à l'application (cloche, badge, toasts) avec centre de notifications persistant. Utilise souvent WebSocket ou SSE pour le temps réel.
La boîte de réception interne d'un bureau avec un voyant lumineux qui s'allume quand un nouveau message arrive.
// Notification center pattern
const [notifications, setNotifications] = useState([]);
useEffect(() => {
const es = new EventSource('/api/notifications/stream');
es.onmessage = (e) => {
setNotifications(prev => [JSON.parse(e.data), ...prev]);
};
return () => es.close();
}, []);Cas d'usage : Informer l'utilisateur d'événements (mentions, mises à jour, tâches) sans quitter l'application.
Option (incremental: true) qui sauvegarde un cache (.tsbuildinfo) pour ne recompiler que les fichiers modifies. Accelere drastiquement les rebuilds.
Comme un cuisinier qui ne recoupe que les legumes manquants au lieu de tout reprendre a zero.
// tsconfig.json
{
"compilerOptions": {
"incremental": true,
"tsBuildInfoFile": "./.tsbuildinfo"
}
}Cas d'usage : Tout projet de taille moyenne+ devrait activer l'incremental pour des temps de build reduits.
Mongoose permet de definir les index directement dans le schema avec index: true, unique: true ou via schema.index(). Les index sont synchronises au demarrage de l'app.
Declarer les index dans le plan (schema) pour que l'architecte (MongoDB) les construise automatiquement.
userSchema.index(
{ email: 1 },
{ unique: true }
);
userSchema.index(
{ lastName: 1, firstName: 1 }
);Cas d'usage : Gerer les index dans le code applicatif pour les versionner avec Git.
Structures de données accélérant les recherches en base. B-tree pour les ranges, Hash pour l'égalité, Composite pour les requêtes multi-colonnes.
L'index d'un livre : au lieu de lire toutes les pages, tu vas directement au bon chapitre.
-- B-tree (par défaut, ranges)
CREATE INDEX idx_users_email ON users(email);
-- Composite
CREATE INDEX idx_orders_user_date
ON orders(user_id, created_at);
-- Covering
CREATE INDEX idx_cover ON orders(user_id)
INCLUDE (total, status);Cas d'usage : Passer une requête de 2 secondes à 2 millisecondes sur une table de millions de lignes.
Pattern TanStack Query pour le scroll infini ou le 'charger plus'. useInfiniteQuery gere automatiquement les pages, le curseur et la concatenation des resultats.
Comme un rouleau de papier toilette : tu en deroules plus quand tu en as besoin, page apres page.
const { data, fetchNextPage, hasNextPage } = useInfiniteQuery({
queryKey: ['posts'],
queryFn: ({ pageParam = 0 }) => fetchPosts(pageParam),
getNextPageParam: (lastPage) => lastPage.nextCursor,
});
// data.pages contient toutes les pages chargeesCas d'usage : Feeds sociaux, listes de produits, tout contenu pagine avec scroll infini ou bouton 'charger plus'.
Ressource Kubernetes gérant l'accès HTTP/HTTPS externe vers les Services internes. Supporte le routage par host et path, le TLS.
Le portier d'un hôtel : il dirige chaque visiteur vers la bonne chambre (service) selon sa réservation (URL).
apiVersion: networking.k8s.io/v1
kind: Ingress
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
backend:
service: { name: api-svc, port: { number: 80 } }Cas d'usage : Point d'entrée unique HTTPS pour router le trafic vers plusieurs services backend.
Definit le cycle de vie d'un provider : DEFAULT (singleton), REQUEST (par requete) ou TRANSIENT (nouvelle instance a chaque injection).
Comme un bureau : partage (singleton), un par client (request) ou jetable apres chaque usage (transient).
@Injectable({ scope: Scope.REQUEST })
export class RequestLogger {
private requestId = randomUUID();
log(msg: string) {
console.log(`[${this.requestId}] ${msg}`);
}
}Cas d'usage : Utiliser REQUEST scope pour des services qui doivent stocker des donnees specifiques a chaque requete.
Optimisation V8 qui cache l'emplacement memoire d'une propriete apres le premier acces. Monomorphique (1 type) = rapide, polymorphique (2-4) = OK, megamorphique (5+) = lent.
Se souvenir exactement ou tu as range tes cles (toujours la meme poche) au lieu de fouiller partout a chaque fois.
// Monomorphique (rapide)
function getX(obj) { return obj.x; }
getX({ x: 1 }); getX({ x: 2 }); // meme forme
// Megamorphique (lent)
getX({ x: 1 });
getX({ x: 1, y: 2 });
getX({ x: 1, z: 3 });
getX({ a: 0, x: 1 }); // formes differentesCas d'usage : Garder des formes d'objets coherentes dans les hot paths pour maximiser les performances V8.
Verification systematique des donnees entrantes (formulaires, API, fichiers) contre un format attendu. Premiere ligne de defense contre les attaques.
Comme le controle de securite a l'aeroport : on verifie tout ce qui entre avant de laisser passer.
$email = filter_input(
INPUT_POST, 'email', FILTER_VALIDATE_EMAIL
);
if ($email === false) {
throw new ValidationException('Email invalide');
}Cas d'usage : A chaque point d'entree de donnees externes : formulaires, API, imports de fichiers.
Methode qui insere plusieurs documents en une seule operation. Par defaut, l'insertion est ordonnee et s'arrete a la premiere erreur.
Deposer un paquet de lettres d'un coup au lieu de faire des allers-retours un par un.
await db.collection('logs').insertMany(
[
{ level: 'info', msg: 'start' },
{ level: 'error', msg: 'fail' }
],
{ ordered: false }
);Cas d'usage : Importer des donnees en masse ou inserer des logs par batch pour reduire les allers-retours reseau.
Methode qui insere un seul document dans une collection. Retourne un objet contenant l'insertedId du document cree.
Deposer une seule lettre dans la boite aux lettres.
const result = await db.collection('users')
.insertOne({ name: 'Bob', age: 25 });
console.log(result.insertedId);Cas d'usage : Creer un nouvel enregistrement unique comme un utilisateur apres inscription.
Utility type qui extrait le type d'instance d'un constructeur de classe. Utile quand on travaille avec typeof Class.
Comme connaitre le plat final en voyant la recette — le constructeur est la recette, l'instance est le plat.
class Logger { log(msg: string) {} }
type LoggerInstance = InstanceType<typeof Logger>;
function inject(cls: typeof Logger): LoggerInstance {
return new cls();
}Cas d'usage : Typer des instances dans des systemes d'injection de dependances ou factories generiques.
Test qui verifie que plusieurs modules ou services fonctionnent correctement ensemble. Il valide les interactions entre composants reels (API, base de donnees, etc.).
Comme verifier que le moteur, la boite de vitesse et les roues fonctionnent ensemble, pas juste chacun separement.
// user.integration.test.js
test('creates user and retrieves it', async () => {
const res = await request(app)
.post('/users')
.send({ name: 'Alice' });
expect(res.status).toBe(201);
const user = await db.users.findById(res.body.id);
expect(user.name).toBe('Alice');
});Cas d'usage : Pour valider que l'API, le service metier et la base de donnees collaborent correctement.
Mode rebase permettant de réorganiser, squasher, modifier ou supprimer des commits avant de les publier. Nettoie l'historique.
Réécrire un brouillon : tu réorganises les paragraphes et corriges les fautes avant de publier.
git rebase -i HEAD~3
# pick abc1234 feat: add login
# squash def5678 fix: typo
# reword ghi9012 feat: add logoutCas d'usage : Nettoyer une série de commits WIP en un historique cohérent avant la code review.
Permet d'intercepter une route pour afficher son contenu dans le layout actuel (ex: modale) au lieu de naviguer vers la page complete.
Comme un apercu rapide au survol : tu vois le contenu sans quitter ta page, mais l'URL directe montre la version complete.
// app/@modal/(.)photo/[id]/page.tsx
// Le (.) intercepte /photo/[id]
export default function PhotoModal({ params }) {
return (
<Modal>
<Photo id={params.id} />
</Modal>
);
}
// URL directe /photo/123 -> page completeCas d'usage : Photos en modale (Instagram-like), apercu de produit, detail de notification sans quitter le feed.
Classe implementant NestInterceptor qui enveloppe l'execution du handler via RxJS. Peut transformer la reponse, ajouter du logging ou gerer le cache.
Comme un emballeur cadeau : le produit (reponse) passe par lui avant et apres pour etre transforme.
@Injectable()
export class TransformInterceptor implements NestInterceptor {
intercept(ctx: ExecutionContext, next: CallHandler) {
return next.handle().pipe(
map(data => ({ data, timestamp: Date.now() })),
);
}
}Cas d'usage : Wrapper toutes les reponses dans un format standard, mesurer le temps de reponse ou implementer du cache.
Contrat qui definit les methodes qu'une classe doit implementer, sans fournir d'implementation. Permet le polymorphisme et le decouplage.
Comme une prise electrique standard : tout appareil qui respecte le format peut se brancher.
interface PaymentGateway {
public function charge(float $amount): bool;
public function refund(string $txId): bool;
}
class StripeGateway implements PaymentGateway {
public function charge(float $amount): bool { /* ... */ }
public function refund(string $txId): bool { /* ... */ }
}Cas d'usage : Pour definir des contrats entre composants et permettre de changer d'implementation sans modifier le code appelant.
Les clients ne doivent pas etre forces d'implementer des interfaces qu'ils n'utilisent pas. Privilegier plusieurs petites interfaces a une grande interface generale.
Comme un menu a la carte vs un menu fixe : on choisit uniquement ce qu'on veut manger.
// Mauvais: interface grasse
// interface Worker { work(); eat(); sleep(); }
// Bon: interfaces segregees
interface Workable { public function work(): void; }
interface Feedable { public function eat(): void; }
class Robot implements Workable {
public function work(): void { /* ... */ }
}Cas d'usage : Quand differentes classes n'ont besoin que d'un sous-ensemble du comportement d'une interface.
Un client ne doit pas etre force de dependre d'interfaces qu'il n'utilise pas. Preferer plusieurs interfaces specifiques a une seule interface generale.
Une telecommande par appareil plutot qu'une telecommande universelle avec 200 boutons dont tu n'en utilises que 5.
// Mauvais: interface Animal { fly(); swim(); run(); }
// Bon:
interface Flyable { fly(): void; }
interface Swimmable { swim(): void; }
class Duck implements Flyable, Swimmable { }Cas d'usage : Eviter les implementations vides ou les throws 'not supported' dans les classes.
Packages partagés au sein d'un monorepo sans publication sur NPM. Référencés via le protocole workspace, ils permettent le partage de code typé entre applications.
Des recettes maison partagées entre restaurants du même groupe, jamais publiées dans un livre de cuisine.
// packages/ui/package.json
{ "name": "@myorg/ui", "main": "./src/index.ts" }
// apps/web/package.json
{ "dependencies": { "@myorg/ui": "workspace:*" } }
// Usage
import { Button } from '@myorg/ui';Cas d'usage : Partager des composants UI, utils ou types entre le frontend et le backend d'un monorepo.
Syntaxe #{} qui insere la valeur d'une variable dans un selecteur, un nom de propriete, ou une chaine. Necessaire la ou Sass n'attend pas une expression.
Un trou dans un texte a trous : tu inseres dynamiquement le mot qui manque.
$side: 'left';
$component: 'card';
.#{$component} {
margin-#{$side}: 1rem;
background: url('/img/#{$component}.png');
}Cas d'usage : Generer dynamiquement des selecteurs ou proprietes dans des boucles et des mixins.
Definit une representation grammaticale pour un langage et un interpreteur pour evaluer ses expressions. Utilisee pour les DSL.
Un traducteur humain : il comprend la grammaire de la langue source et produit l'equivalent dans la langue cible.
class NumberExpr {
constructor(val) { this.val = val; }
interpret() { return this.val; }
}
class AddExpr {
constructor(l, r) { this.l = l; this.r = r; }
interpret() { return this.l.interpret() + this.r.interpret(); }
}Cas d'usage : Moteurs de regles metier, parseurs d'expressions mathematiques, langages de requetes.
API qui observe de maniere asynchrone la visibilite d'un element par rapport a un ancetre ou au viewport. Remplace les calculs manuels de getBoundingClientRect dans un scroll listener.
Un vigile qui te previent automatiquement quand quelqu'un entre dans la zone de surveillance, sans que tu doives regarder constamment.
const observer = new IntersectionObserver(
(entries) => entries.forEach(e => {
if (e.isIntersecting) loadImage(e.target);
}),
{ threshold: 0.1 }
);
document.querySelectorAll('img[data-src]')
.forEach(img => observer.observe(img));Cas d'usage : Lazy loading d'images, infinite scroll, animations au scroll, tracking d'impressions.
Philosophie de layout où les composants s'adaptent à leur contenu et leur contexte grâce à Grid, Flexbox et fonctions intrinsèques (min(), max(), clamp()) plutôt que des breakpoints fixes.
Comme de l'eau qui prend naturellement la forme de son récipient, sans qu'on ait besoin de la mouler.
.grid {
display: grid;
grid-template-columns:
repeat(auto-fit, minmax(min(300px, 100%), 1fr));
gap: clamp(1rem, 3vw, 2rem);
}Cas d'usage : Créer des layouts qui fonctionnent partout sans écrire de media queries, en exploitant la flexibilité native de CSS.
Methode TanStack Query qui marque des requetes en cache comme perimees, declenchant un refetch automatique si elles sont actuellement utilisees.
Comme tirer la chasse d'eau du cache : les donnees perimees sont evacuees et de nouvelles arrivent.
const queryClient = useQueryClient();
// Invalider toutes les requetes 'users'
queryClient.invalidateQueries({ queryKey: ['users'] });
// Invalider un user specifique
queryClient.invalidateQueries({ queryKey: ['users', userId] });Cas d'usage : Apres une mutation reussie, forcer le rechargement des donnees affectees dans le cache.
Structure de données qui associe chaque terme à la liste des documents le contenant. Fondement de tous les moteurs de recherche full-text pour des requêtes en O(1).
L'index alphabétique à la fin d'un livre : au lieu de lire tout le livre, on cherche le mot et on trouve les pages.
// Simplified inverted index
const index = {
'javascript': [docId1, docId3, docId7],
'react': [docId1, docId2],
'node': [docId3, docId5, docId7],
};Cas d'usage : Comprendre le fonctionnement interne d'Elasticsearch, Meilisearch et des moteurs de recherche.
Le conteneur d'Inversion de Controle de NestJS qui gere la creation, la resolution et le cycle de vie de tous les providers enregistres.
Comme un annuaire professionnel : tu demandes un plombier et l'annuaire te fournit le bon contact.
// NestJS resout automatiquement le graphe de dependances
// UserController -> UserService -> UserRepository
// Il suffit de declarer les types dans le constructeur
@Injectable()
export class UserService {
constructor(private repo: UserRepository) {}
}Cas d'usage : Laisser le framework gerer la creation et l'injection de toutes les instances de l'application.
Flag tsconfig qui garantit que chaque fichier peut etre transpile isolement (compatible Babel, esbuild, SWC). Interdit les constructions qui necessitent une analyse multi-fichiers.
Comme une regle qui dit que chaque chapitre d'un livre doit etre comprehensible seul, sans lire les autres.
// tsconfig.json
{ "compilerOptions": { "isolatedModules": true } }
// Interdit: export { Type } from "./types"
// OK: export type { Type } from "./types"Cas d'usage : Obligatoire quand on utilise des transpileurs non-TS (Babel, esbuild, Vite) pour garantir la compatibilite.
Combine SSG et SSR : les pages sont generees statiquement mais regenerees en arriere-plan apres un delai configurable (revalidate). Introduit par Next.js.
Comme un menu du jour affiche a l'entree : il est pre-imprime mais le serveur le remplace discretement chaque jour.
// Next.js App Router
export const revalidate = 3600; // regenere toutes les heures
export default async function Products() {
const products = await getProducts();
return <ProductGrid products={products} />;
}Cas d'usage : Pages e-commerce, catalogues : contenu relativement stable mais qui doit se mettre a jour sans rebuild complet.
Inverted Triangle CSS : architecture qui organise le CSS en couches de spécificité croissante (Settings, Tools, Generic, Elements, Objects, Components, Utilities). Élimine les guerres de spécificité.
Comme un entonnoir inversé : on part du plus générique (reset) pour aller vers le plus spécifique (utilities).
/* 1. Settings */ /* Variables */
/* 2. Tools */ /* Mixins */
/* 3. Generic */ /* Reset, box-sizing */
/* 4. Elements */ /* h1, a, p (sans classes) */
/* 5. Objects */ /* Layout patterns */
/* 6. Components */ /* .card, .btn */
/* 7. Utilities */ /* .u-hidden, .u-flex */Cas d'usage : Architecturer le CSS d'un projet conséquent pour une maintenabilité à long terme.
Architecture CSS en triangle inverse : du plus generique (settings, tools) au plus specifique (utilities). Chaque couche a une specificite croissante.
Un entonnoir : en haut le general (variables), en bas le specifique (overrides) avec une specificite croissante.
// Ordre d'import ITCSS
// 1. Settings ($variables)
// 2. Tools (mixins, functions)
// 3. Generic (reset, normalize)
// 4. Elements (h1, p, a)
// 5. Objects (.container, .grid)
// 6. Components (.card, .btn)
// 7. Utilities (.hidden, .mt-4)Cas d'usage : Eviter les guerres de specificite dans les grands projets en structurant le CSS par couches.
Fournit un moyen de parcourir sequentiellement les elements d'une collection sans exposer sa structure interne.
Une playlist musicale : tu appuies sur 'suivant' sans savoir si c'est un tableau, un arbre ou une API.
class Range {
constructor(start, end) { this.s = start; this.e = end; }
*[Symbol.iterator]() {
for (let i = this.s; i <= this.e; i++) yield i;
}
}Cas d'usage : Parcourir des structures de donnees complexes (arbres, graphes) avec une interface uniforme.
Convention definissant comment un objet produit une sequence de valeurs. Un objet est iterable s'il a une methode [Symbol.iterator]() retournant un iterateur avec next() -> {value, done}.
Un distributeur de tickets : chaque appel a next() te donne le ticket suivant, et done te dit quand il n'y en a plus.
const range = {
from: 1, to: 3,
[Symbol.iterator]() {
let n = this.from;
return { next: () => n <= this.to
? { value: n++, done: false }
: { done: true } };
}
};
for (const n of range) console.log(n);Cas d'usage : Rendre des objets custom utilisables dans for...of, spread, et destructuring.
Entrepreneur americain, fondateur de Netscape avec Marc Andreessen et de Silicon Graphics. La sortie en bourse de Netscape en 1995 a lance la bulle Internet.
Le financier qui a transforme un navigateur etudiant en fusee boursiere — et lance la fievre Internet.
<!-- Netscape Navigator — 1994 -->
<!-- Premier navigateur commercial -->
<!-- A introduit : -->
<!-- - JavaScript (Brendan Eich) -->
<!-- - Cookies -->
<!-- - SSL (HTTPS) -->
<!-- La guerre des navigateurs commence -->Cas d'usage : Comprendre la premiere guerre des navigateurs et comment elle a faconne le web moderne.
Informaticien canadien, createur de Java. Le slogan 'Write Once, Run Anywhere' a revolutionne le developpement d'applications grace a la machine virtuelle Java (JVM).
L'inventeur de l'esperanto des langages : un code qui tourne partout sans traduction.
// Java — James Gosling, 1995
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}Cas d'usage : Java reste dominant dans l'entreprise, Android (historiquement) et les systemes distribues.
Entrepreneur americain, fondateur d'Amazon et d'AWS. AWS a invente le cloud computing commercial et reste le leader mondial. Sa culture des 'two-pizza teams' a influence l'industrie.
Le libraire en ligne qui a accidentellement invente l'infrastructure sur laquelle tourne la moitie d'Internet.
// Le memo Bezos (2002) — API Mandate
// 1. Toutes les equipes exposent leurs
// donnees via des API
// 2. Pas d'autre forme de communication
// 3. Toute API doit etre externalisable
// -> Naissance d'AWSCas d'usage : Le memo API de Bezos est un cas d'etude en architecture microservices et culture d'entreprise tech.
Designer et auteur americain, fondateur d'A List Apart et pionnier des Web Standards. Son livre 'Designing with Web Standards' a pousse l'industrie a abandonner les layouts en tables.
L'evangeliste qui a converti le web du chaos des tables et frames vers les standards CSS et HTML semantique.
<!-- Avant Zeldman : layout en tables -->
<table><tr><td>Menu</td><td>Contenu</td></tr></table>
<!-- Apres : standards web -->
<nav>Menu</nav>
<main>Contenu</main>
<!-- Semantique + CSS = victoire -->Cas d'usage : Comprendre l'evolution du web design et l'importance des standards pour l'accessibilite et le SEO.
Designer et developpeuse americaine chez Apple (WebKit). Pionniere du 'Intrinsic Web Design', elle a pousse l'adoption de CSS Grid et des layouts modernes.
L'urbaniste du web qui a libere les designers de la grille a 12 colonnes en leur donnant CSS Grid.
/* Intrinsic Web Design — Jen Simmons */
.layout {
display: grid;
grid-template-columns:
minmax(200px, 1fr) 3fr;
grid-template-rows: auto 1fr auto;
}
/* Layouts fluides et adaptatifs */Cas d'usage : Ses videos et articles ont demystifie CSS Grid et Flexbox pour des milliers de developpeurs.
Entrepreneur taiwano-americain, co-fondateur et CEO de NVIDIA. Sous sa direction, NVIDIA est passe du GPU gaming au leader mondial du calcul IA avec CUDA.
Le roi du GPU : il a transforme des cartes graphiques pour jeux video en cerveaux de l'intelligence artificielle.
// CUDA — NVIDIA, pousse par Jensen Huang
__global__ void add(int *a, int *b, int *c) {
int i = threadIdx.x;
c[i] = a[i] + b[i];
}
// Calcul parallele sur GPU
// Base de tout le deep learning moderneCas d'usage : Comprendre pourquoi les GPU NVIDIA sont essentiels pour l'IA et le machine learning.
Framework de test JavaScript par Meta, tout-en-un avec runner, assertions, mocking et coverage integres. Standard de facto pour les projets React.
Comme une boite a outils complete : vous avez le marteau, le tournevis et le metre dans le meme kit, sans rien installer de plus.
// math.test.js
describe('Math utils', () => {
test('multiply', () => {
expect(multiply(3, 4)).toBe(12);
});
test('async fetch', async () => {
const data = await fetchUser(1);
expect(data).toHaveProperty('name');
});
});Cas d'usage : Pour tout projet React ou Node.js necessitant un framework de test complet et bien documente.
Entrepreneur americain, co-fondateur de Wikipedia. Il a cree la plus grande encyclopedie libre du monde, basee sur le wiki de Ward Cunningham.
L'homme qui a prouve que des millions de benevoles peuvent creer une encyclopedie meilleure que Britannica — gratuitement.
<!-- MediaWiki — propulse Wikipedia -->
== Titre de section ==
'''Texte en gras'''
[[Lien interne]]
[https://example.com Lien externe]
<!-- Syntaxe wiki — simple et puissante -->Cas d'usage : Wikipedia est la preuve que la collaboration ouverte fonctionne a grande echelle.
Compilation Just-In-Time : V8 interprete d'abord le bytecode (Ignition), puis compile en code machine optimise (TurboFan) les fonctions chaudes. Peut desoptimiser si les hypotheses sont invalides.
Un cuisinier qui improvise la premiere fois (interpretation), puis ecrit la recette (compilation) quand il a assez d'experience avec le plat.
// V8 pipeline:
// 1. Parser -> AST
// 2. Ignition -> Bytecode (interprete)
// 3. Profiling (quelles fonctions sont chaudes?)
// 4. TurboFan -> Code machine optimise
// 5. Deopt si les types changentCas d'usage : Comprendre pourquoi le code JS est rapide malgre le typage dynamique, et comment eviter les deoptimisations.
Compilation Just-In-Time ajoutee en PHP 8.0 qui compile le bytecode en code machine natif a l'execution. Ameliore surtout les taches CPU-intensives.
Comme un traducteur simultane qui finit par parler directement dans la langue cible sans passer par la traduction.
; php.ini
opcache.jit=1255
opcache.jit_buffer_size=256MCas d'usage : Pour les applications CPU-bound (calculs, traitement d'images). Peu d'impact sur les apps web classiques IO-bound.
Mode Just-In-Time qui genere les classes a la volee au lieu de tout pre-generer. Actif par defaut depuis Tailwind 3, il rend le build quasi instantane.
Un restaurant a la carte au lieu d'un buffet : on prepare uniquement ce que tu commandes.
// Avant JIT : build lourd de tout le CSS
// Avec JIT : seules les classes utilisees sont generees
// Active les valeurs arbitraires
<div class="top-[117px] grid-cols-[1fr_auto]">
</div>Cas d'usage : Avoir un build rapide et un fichier CSS minimal meme avec des milliers de variantes possibles.
Unité de travail dans un pipeline CI/CD, exécutée dans un runner/agent isolé. Plusieurs jobs peuvent tourner en parallèle dans un même stage.
Un employé qui fait une tâche précise sur la chaîne de montage.
jobs:
lint:
runs-on: ubuntu-latest
steps: [{ run: 'npm run lint' }]
test:
runs-on: ubuntu-latest
steps: [{ run: 'npm test' }]Cas d'usage : Paralléliser lint, tests unitaires et tests e2e pour accélérer le feedback.
Job exécute un Pod jusqu'à complétion. CronJob planifie des Jobs selon une expression cron. Pour les tâches batch et récurrentes.
Job = un plombier appelé pour une réparation unique. CronJob = le passage hebdomadaire du jardinier.
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup-tool:1.0Cas d'usage : Backups planifiés, nettoyage de données, envoi de rapports périodiques.
Informaticien americain, createur de Lisp et inventeur du terme 'intelligence artificielle'. Lisp a introduit le garbage collection, les fonctions de premiere classe et la recursion.
Le philosophe qui a non seulement nomme l'IA mais aussi cree le langage qui a permis d'en rever.
;; Lisp — John McCarthy, 1958
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
(factorial 10) ; => 3628800Cas d'usage : Comprendre les origines de la programmation fonctionnelle et de l'intelligence artificielle.
Developpeur americain, createur de jQuery. jQuery a simplifie la manipulation du DOM et les requetes AJAX, dominant le web de 2006 a 2015.
Le pont entre le chaos du DOM natif et les frameworks modernes — jQuery a appris au web a marcher.
// jQuery — John Resig, 2006
$(document).ready(function() {
$('#btn').click(function() {
$.ajax('/api/data', {
success: function(data) {
$('#result').html(data);
}
});
});
});Cas d'usage : Comprendre l'evolution du front-end et pourquoi les frameworks modernes ont remplace jQuery.
Mathematicien hungaro-americain qui a defini l'architecture des ordinateurs modernes (architecture von Neumann). Memoire, unite de calcul, unite de controle et I/O — tous nos PC suivent encore ce modele.
L'inventeur du plan d'urbanisme que chaque ville (ordinateur) suit encore aujourd'hui.
// Architecture von Neumann
// CPU <-> Memoire (instructions + donnees)
// | |
// Controle I/O
// Un seul bus = goulot de Von NeumannCas d'usage : Comprendre pourquoi la RAM, le CPU et le bus memoire sont organises comme ils le sont dans chaque machine.
Operations de jointure entre tables. INNER retourne les correspondances. LEFT garde toutes les lignes gauches. RIGHT garde toutes les lignes droites. FULL garde tout.
INNER = invites presents aux deux fetes. LEFT = tous les invites de la fete A, avec ceux aussi a la fete B. FULL = tous les invites des deux fetes.
SELECT u.name, o.total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.total > 100;Cas d'usage : Combiner des donnees de plusieurs tables pour des rapports, des APIs ou des dashboards.
Designer britannique, ancien Chief Design Officer d'Apple. Il a dessine l'iMac, l'iPod, l'iPhone et l'iPad. Son minimalisme a defini l'esthetique tech des 20 dernieres annees.
Le sculpteur d'Apple : chaque courbe d'iPhone, chaque pixel d'iOS porte sa marque.
/* Design System — philosophie Jony Ive */
/* Principes Apple Human Interface : */
/* - Clarte : le contenu est roi */
/* - Deference : l'UI s'efface */
/* - Profondeur : layers et mouvement */
/* Flat design = son heritage */Cas d'usage : Comprendre l'importance du design system et de la coherence visuelle dans les produits tech.
Ingenieur americain chez Facebook, createur de React. Inspire par XHP (PHP) et les concepts fonctionnels, il a cree la bibliotheque UI la plus influente de la derniere decennie.
L'architecte qui a impose l'idee folle que le HTML devait vivre DANS le JavaScript — et le monde a fini par lui donner raison.
// React — Jordan Walke, 2013
function Hello({ name }) {
return <h1>Hello, {name}!</h1>;
}
// JSX + Virtual DOM = revolution UICas d'usage : React domine le front-end. Comprendre son origine aide a saisir le paradigme declaratif et composant.
Developpeur bresilien, createur d'Elixir. Il a construit Elixir sur la machine virtuelle Erlang (BEAM) pour combiner la fiabilite des telecoms avec une syntaxe moderne inspiree de Ruby.
Celui qui a pris le moteur d'un char d'assaut (Erlang/BEAM) et l'a mis dans une voiture de sport elegante.
# Elixir — Jose Valim, 2011
defmodule Hello do
def greet(name) do
IO.puts("Hello, #{name}!")
end
end
Hello.greet("World")Cas d'usage : Elixir excelle dans les systemes temps reel et concurrents (chat, IoT, fintech). Phoenix LiveView est son framework phare.
Gestion d'etat atomique pour React. Chaque atome est une unite de state independante, composable et reactive, sans Provider obligatoire.
Comme des briques LEGO : chaque brique (atome) est independante et tu les assembles pour construire ton state.
const countAtom = atom(0);
const doubleAtom = atom((get) => get(countAtom) * 2);
function Counter() {
const [count, setCount] = useAtom(countAtom);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}Cas d'usage : State atomique granulaire quand chaque composant n'a besoin que d'une fraction de l'etat global.
Type de donnees binaire JSON dans PostgreSQL. Contrairement a JSON (texte brut), JSONB est parse et stocke en binaire, permettant l'indexation et les requetes performantes.
JSON compile : tu perds la mise en forme originale mais tu gagnes la vitesse de recherche d'un index.
CREATE TABLE events (
id SERIAL PRIMARY KEY,
data JSONB NOT NULL
);
SELECT * FROM events
WHERE data->>'type' = 'click'
AND (data->'meta'->>'count')::int > 5;Cas d'usage : Stocker des donnees semi-structurees (logs, config, metadonnees) dans une base relationnelle.
Syntaxe qui permet d'ecrire du HTML dans du JavaScript. Le compilateur le transforme en appels React.createElement().
C'est comme un moule a gateau : tu dessines la forme en HTML, et React coule le JavaScript dedans.
// JSX compile en createElement
const el = <h1 className="title">Bonjour</h1>;
// equivalent a :
const el2 = React.createElement('h1', { className: 'title' }, 'Bonjour');Cas d'usage : Utilise dans chaque composant React pour decrire l'interface de maniere declarative.
Token auto-contenu composé de 3 parties (header, payload, signature) encodé en Base64. Permet l'authentification stateless sans interroger la base de données à chaque requête.
Un badge visiteur avec photo, nom et tampon de sécurité : toutes les infos sont sur le badge, pas besoin de vérifier un registre.
import jwt from 'jsonwebtoken';
const accessToken = jwt.sign(
{ userId: user.id, role: 'admin' },
process.env.JWT_SECRET,
{ expiresIn: '15m' }
);Cas d'usage : Authentification API stateless avec access token court (15min) et refresh token long (7j).
Strategie Passport qui valide les tokens JWT extraits du header Authorization. Decode le payload et l'attache a request.user.
Comme un scanner de badge electronique : il lit le badge (token), verifie sa validite et identifie la personne.
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(config: ConfigService) {
super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: config.get('JWT_SECRET') });
}
validate(payload: any) { return { id: payload.sub, email: payload.email }; }
}Cas d'usage : Proteger les endpoints API avec authentification stateless par token JWT.
Stratégie où le refresh token est à usage unique : chaque utilisation génère une nouvelle paire access/refresh. Détecte le vol de token par réutilisation.
Un ticket de vestiaire à usage unique : si quelqu'un l'a déjà utilisé, le vestiaire sait qu'il y a fraude.
async function rotateTokens(refreshToken) {
const stored = await db.findToken(refreshToken);
if (stored.used) {
await db.revokeFamily(stored.familyId); // Compromis!
throw new Error('Token reuse detected');
}
await db.markUsed(refreshToken);
return generateTokenPair(stored.userId, stored.familyId);
}Cas d'usage : Sécuriser les sessions longue durée en détectant automatiquement le vol de refresh token.
Ingenieur americain, ancien Developer Advocate chez Google Cloud et expert Kubernetes. Ses demos live et son projet 'Kubernetes the Hard Way' sont des references en DevOps.
Le maestro de Kubernetes : il peut deployer un cluster les yeux fermes et expliquer pourquoi en meme temps.
# Kubernetes the Hard Way — Kelsey Hightower
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello
spec:
replicas: 3
template:
spec:
containers:
- name: hello
image: hello:1.0Cas d'usage : 'Kubernetes the Hard Way' est LA ressource pour comprendre Kubernetes en profondeur, sans abstractions.
Informaticien americain, co-createur d'Unix et du langage B (predecesseur du C). Il a aussi co-cree le langage Go chez Google et l'encodage UTF-8.
Le couteau suisse de l'informatique : chaque outil qu'il touche devient un standard.
// UTF-8 — co-invente par Ken Thompson
// Compatible ASCII, encodage variable
// 'A' = 0x41 (1 octet)
// 'e' = 0xC3 0xA9 (2 octets)
// Utilise par 98% du webCas d'usage : Comprendre les origines d'Unix, de Go et de l'encodage de caracteres universel UTF-8.
Developpeur americain, createur du TDD (Test-Driven Development), de l'Extreme Programming (XP) et co-signataire du Manifeste Agile. Il a aussi cree le framework de test JUnit.
Le coach sportif du dev : il t'oblige a ecrire le test AVANT le code, comme un plan d'entrainement avant le match.
// TDD — Kent Beck
// 1. Red : ecrire un test qui echoue
// 2. Green : ecrire le minimum pour passer
// 3. Refactor : nettoyer le code
test('add', () => {
expect(add(1, 2)).toBe(3);
});
const add = (a, b) => a + b;Cas d'usage : TDD et Agile sont des pratiques standard en entreprise. Question classique d'entretien.
Developpeur americain, createur de Testing Library (React Testing Library) et d'EpicWeb.dev. Il a popularise les bonnes pratiques de test front-end : 'test the way your users use your app'.
Le coach de test React : grace a lui, on ne teste plus les details d'implementation mais le comportement utilisateur.
// React Testing Library — Kent C. Dodds
import { render, screen } from '@testing-library/react';
test('greets the user', () => {
render(<Hello name="World" />);
expect(screen.getByText('Hello, World!'))
.toBeInTheDocument();
});Cas d'usage : Testing Library est le standard de test React. Sa pyramide de test (integration > unit) est largement adoptee.
Hacker americain, autrefois le plus recherche par le FBI. Apres sa prison, il est devenu consultant en securite. Decede en 2023, il reste une figure emblematique du social engineering.
Le cambrioleur devenu serrurier : il a prouve que le maillon faible de la securite est toujours l'humain.
// Social Engineering — Kevin Mitnick
// Les 4 phases :
// 1. Recherche (OSINT sur la cible)
// 2. Pretexte (construire une histoire)
// 3. Exploitation (obtenir l'acces)
// 4. Fuite (ne pas laisser de traces)
// La meilleure defense = la formationCas d'usage : Comprendre que la securite n'est pas que technique : le facteur humain est souvent le plus vulnerable.
Attribut special qui aide React a identifier chaque element dans une liste. Permet une reconciliation efficace sans reconstruire tout le DOM.
Comme les numeros de dossards dans une course : React sait qui est qui meme si l'ordre change.
// Correct: identifiant unique
items.map(item => <li key={item.id}>{item.name}</li>)
// Anti-pattern: index comme key
items.map((item, i) => <li key={i}>{item.name}</li>)Cas d'usage : Obligatoire dans toute liste dynamique pour eviter des bugs de rendu et ameliorer les performances.
Possibilite dans un mapped type de renommer les cles via la clause as. Permet de filtrer, transformer ou prefixer les cles d'un type.
Comme un rebranding — meme produit, mais chaque nom est transforme selon une nouvelle convention.
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K]
};
type UserGetters = Getters<{ name: string }>;
// { getName: () => string }Cas d'usage : Generer automatiquement des noms de getters/setters ou filtrer des cles par type.
Helper keyframes qui genere un nom d'animation unique pour eviter les collisions globales. S'utilise comme une animation CSS classique dans un styled component.
Un pas de danse avec un nom unique : personne d'autre ne peut le confondre avec le sien.
import styled, { keyframes } from 'styled-components'
const fadeIn = keyframes`
from { opacity: 0; transform: translateY(-10px); }
to { opacity: 1; transform: translateY(0); }
`
const Box = styled.div`
animation: ${fadeIn} 0.3s ease-in-out;
`Cas d'usage : Definir des animations CSS scopes dans styled-components sans collision de noms.
Configuration des keyframes CSS dans tailwind.config.js pour creer des animations custom utilisables via la classe animate-*.
Ecrire le script d'une scene de film, puis dire a l'acteur de la jouer avec animate-*.
// tailwind.config.js
theme: {
extend: {
keyframes: {
fadeIn: {
'0%': { opacity: '0' },
'100%': { opacity: '1' }
}
},
animation: { fadeIn: 'fadeIn 0.5s ease-in-out' }
}
}Cas d'usage : Creer des animations d'entree/sortie custom pour les modals, toasts, et notifications.
La simplicite doit etre un objectif cle du design. La complexite inutile est le pire ennemi de la maintenabilite.
Un interrupteur on/off vs un panneau de controle de centrale nucleaire — choisis la simplicite adaptee.
// Over-engineered:
class UserValidatorStrategyFactory { ... }
// KISS:
function validateUser(u) {
return u.name?.length > 0 && isValidEmail(u.email);
}Cas d'usage : Choisir la solution la plus simple qui resout le probleme actuel.
Régions de page identifiées par des balises sémantiques (<header>, <nav>, <main>, <footer>) ou des rôles ARIA. Les lecteurs d'écran permettent de naviguer directement entre ces repères.
Comme les chapitres d'un livre : on peut sauter directement au chapitre voulu via la table des matières.
<header><!-- banner --></header>
<nav><!-- navigation --></nav>
<main><!-- main --></main>
<aside><!-- complementary --></aside>
<footer><!-- contentinfo --></footer>Cas d'usage : Structurer chaque page pour que les utilisateurs de technologies d'assistance puissent s'orienter rapidement.
Informaticien americain, co-fondateur de Google avec Sergey Brin. L'algorithme PageRank a revolutionne la recherche web en classant les pages par leur popularite (liens entrants).
L'inventeur du systeme de vote du web : plus une page recoit de liens, plus elle est pertinente.
// PageRank — Larry Page, 1998
// PR(A) = (1-d) + d * SUM(PR(Ti)/C(Ti))
// d = facteur d'amortissement (~0.85)
// Ti = pages qui pointent vers A
// C(Ti) = nombre de liens sortants de Ti
// Le web comme un graphe de citationsCas d'usage : Comprendre les bases du SEO et comment les moteurs de recherche classent les pages web.
Linguiste et programmeur americain, createur de Perl. Il a defini les trois vertus du programmeur : paresse, impatience et orgueil (hubris).
Le poete de la programmation : Perl, c'est comme ecrire un haiku — puissant mais souvent incomprehensible pour les autres.
#!/usr/bin/perl
# Perl — Larry Wall, 1987
use strict;
use warnings;
my $name = 'World';
print "Hello, $name!\n";
# 'There is more than one way to do it'Cas d'usage : Comprendre l'ere pre-Python/Ruby du scripting et l'influence de Perl sur les regex et le web des annees 90.
Mecanisme (static:: vs self::) qui resout la reference a la classe au moment de l'execution, pas de la definition. Permet aux methodes heritees de referencer la classe enfant.
Comme un formulaire generique qui s'adapte au logo de l'entreprise qui l'utilise, pas celle qui l'a cree.
class Model {
public static function create(array $data): static {
return new static($data); // static = classe enfant
}
}
class User extends Model {}
$user = User::create(['name' => 'Alice']); // retourne UserCas d'usage : Dans les classes de base (ORM, factories) ou les methodes heritees doivent retourner le type de la sous-classe.
JOIN ou la sous-requete droite peut referencer des colonnes de la table gauche. Permet des sous-requetes correlees dans le FROM, comme un forEach SQL.
Pour chaque client, ouvrir son dossier et y chercher ses 3 dernieres commandes.
SELECT u.name, recent.title
FROM users u
LATERAL (
SELECT title FROM orders
WHERE user_id = u.id
ORDER BY created_at DESC
LIMIT 3
) recent;Cas d'usage : Recuperer les N derniers elements par groupe sans window function complexe.
Un objet ne devrait parler qu'a ses amis proches, pas aux amis de ses amis. Evite les chaines d'appels (train wreck) qui creent du couplage profond.
Au restaurant, tu parles au serveur, pas directement au cuisinier ni au fournisseur du cuisinier.
// Mauvais (train wreck):
user.getAddress().getCity().getZipCode()
// Bon:
user.getZipCode() // delegation interneCas d'usage : Reduire le couplage entre objets et rendre le code plus resilient aux changements.
Mécanisme de cache Docker où chaque instruction Dockerfile crée un layer réutilisable. Si un layer change, tous les suivants sont reconstruits.
Un château de cartes : si tu modifies une carte en bas, tout ce qui est au-dessus tombe et doit être reconstruit.
# Bon ordre pour le cache
COPY package*.json ./
RUN npm ci
# Code copié APRÈS les dépendances
COPY . .Cas d'usage : Réduire le temps de build CI de minutes à secondes en exploitant le cache des dépendances.
Chercheuse et developpeuse greco-americaine, experte CSS et membre du W3C TAG. Elle est connue pour ses demos CSS innovantes et son livre 'CSS Secrets'.
La magicienne du CSS : elle fait des choses avec des proprietes CSS que personne ne pensait possibles.
/* Astuce CSS — style Lea Verou */
.gradient-text {
background: linear-gradient(45deg, #f00, #00f);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
/* CSS peut tout faire (ou presque) */Cas d'usage : Ses contributions au W3C et ses techniques CSS avancees sont des references pour les devs front-end.
Methode qui retourne des objets JavaScript bruts au lieu d'instances Mongoose. 2 a 5x plus rapide car elle saute l'hydratation, les getters et les virtuals.
Commander un plat a emporter sans assiette ni couverts : plus leger et plus rapide a servir.
const users = await User
.find({ status: 'active' })
.lean();
// users[0].save() -> Error (pas un doc Mongoose)Cas d'usage : API en lecture seule ou les donnees sont serialisees en JSON sans modification.
Outil historique de gestion de monorepos JS pour le versioning et la publication de packages NPM. Désormais maintenu par Nx avec cache et graphe de tâches intégrés.
Un éditeur de livres qui gère les versions et la publication coordonnée de toute une collection.
// lerna.json
{
"version": "independent",
"npmClient": "pnpm",
"command": {
"publish": { "conventionalCommits": true }
}
}Cas d'usage : Publier et versionner des packages NPM interdépendants depuis un monorepo avec changelog automatique.
Le scope d'une variable est determine par l'endroit ou elle est ecrite dans le code source, pas par l'endroit ou la fonction est appelee. C'est la base des closures en JS.
Ton adresse postale depend d'ou tu habites, pas d'ou tu te trouves quand tu recois le courrier.
const x = 'global';
function foo() {
console.log(x); // 'global' (scope lexical)
}
function bar() {
const x = 'bar';
foo(); // affiche 'global', pas 'bar'
}Cas d'usage : Predire le comportement des closures et comprendre pourquoi JS n'utilise pas le dynamic scoping.
Interfaces (OnModuleInit, OnModuleDestroy, OnApplicationBootstrap, OnApplicationShutdown) qui permettent d'executer du code a des moments cles du cycle de vie.
Comme les etapes d'ouverture et fermeture d'un magasin : mise en place le matin, rangement le soir.
@Injectable()
export class DbService implements OnModuleInit, OnModuleDestroy {
async onModuleInit() {
await this.connect();
}
async onModuleDestroy() {
await this.disconnect();
}
}Cas d'usage : Initialiser des connexions base de donnees au demarrage et les fermer proprement a l'arret.
Le Light DOM est le contenu enfant visible dans le markup HTML principal. Le Shadow DOM est l'arbre encapsulé interne du composant. Les slots projettent le Light DOM dans le Shadow DOM.
Le Light DOM c'est le courrier qu'on met dans la boîte aux lettres (visible), le Shadow DOM c'est le mécanisme interne de tri.
<!-- Light DOM (écrit par l'utilisateur) -->
<my-tabs>
<div slot="tab">Onglet 1</div>
<div slot="panel">Contenu 1</div>
</my-tabs>
<!-- Shadow DOM (interne au composant) -->
<!-- <div class="tabs"><slot name="tab"></slot></div> -->Cas d'usage : Comprendre la composition des Web Components pour correctement styliser et accéder aux éléments.
Fonction CSS qui retourne la première valeur en mode clair et la seconde en mode sombre. Nécessite color-scheme: light dark sur l'élément pour fonctionner.
Comme un interrupteur jour/nuit qui bascule automatiquement l'éclairage de la pièce.
:root {
color-scheme: light dark;
}
body {
background: light-dark(#fff, #1a1a1a);
color: light-dark(#111, #eee);
}Cas d'usage : Implémenter un thème clair/sombre sans media query ni classes JS pour les valeurs de couleur.
Outil Google d'audit automatisé mesurant performance, accessibilité, SEO et bonnes pratiques d'une page web. Disponible dans Chrome DevTools et en CI.
Un contrôle technique automobile qui inspecte tous les aspects de votre véhicule et donne une note.
// Lighthouse CI
npx lhci autorun --collect.url=https://myapp.com
// lighthouse.config.js
{ ci: { assert: {
assertions: {
'categories:performance': ['error', { minScore: 0.9 }],
'categories:accessibility': ['warn', { minScore: 0.95 }],
}
}}}Cas d'usage : Auditer automatiquement les pages en CI pour détecter les régressions de performance et accessibilité.
Outil Rust ultra-rapide (ex-Parcel CSS) qui parse, transforme, prefixe et minifie le CSS. Alternative tout-en-un a PostCSS + Autoprefixer + CSSNano, 100x plus rapide.
Un robot cuisinier qui fait tout (couper, mixer, cuire) a la vitesse de l'eclair.
// vite.config.js
export default {
css: {
transformer: 'lightningcss',
lightningcss: {
targets: browserslistToTargets(
browserslist('>= 0.25%')
)
}
}
}Cas d'usage : Remplacer la stack PostCSS/Autoprefixer/CSSNano par un outil unique bien plus rapide.
limit(n) restreint le nombre de documents retournes. skip(n) saute les n premiers resultats. Ensemble, ils permettent la pagination.
Dans un livre de 500 pages, skip(100) te place page 101 et limit(10) te fait lire 10 pages.
// Page 3, 20 items par page
const page = 3, size = 20;
db.users.find({})
.sort({ _id: 1 })
.skip((page - 1) * size)
.limit(size);Cas d'usage : Implementer la pagination dans une API REST ou une interface utilisateur.
Librairie CSS-in-JS zero-runtime avec une syntaxe tagged template literals (comme styled-components). Le CSS est extrait au build, zero JS en prod.
styled-components qui fait un regime : meme syntaxe, mais sans le poids JavaScript en production.
import { styled } from '@linaria/react'
import { css } from '@linaria/core'
const title = css`font-size: 2rem; color: blue;`
const Box = styled.div`
padding: 1rem;
background: ${() => 'white'};
`Cas d'usage : Migrer depuis styled-components vers du zero-runtime sans changer la syntaxe.
Outil qui exécute des linters uniquement sur les fichiers staged (git add). Évite de linter tout le projet à chaque commit.
Un contrôle qualité qui ne vérifie que les nouveaux produits, pas tout l'entrepôt.
// package.json
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"],
"*.css": ["stylelint --fix"]
}Cas d'usage : Accélérer les pre-commit hooks en ne traitant que les fichiers modifiés.
Ingenieur finno-americain, createur du noyau Linux et du systeme de controle de version Git. Linux fait tourner la majorite des serveurs, smartphones (Android) et supercalculateurs du monde.
Le gars qui a construit le moteur de 90% des serveurs du monde... puis a invente l'outil pour gerer le code de tout le monde.
# Premier message de Linus (1991)
# 'I'm doing a (free) operating system
# (just a hobby, won't be big)'
$ git init
$ git add .
$ git commit -m 'Initial commit'
# Git — Linus Torvalds, 2005Cas d'usage : Linux et Git sont les deux outils les plus utilises dans le developpement moderne. Incontournable.
Toute instance d'une classe parente doit pouvoir etre remplacee par une instance de classe enfant sans casser le programme. Les sous-types doivent respecter le contrat du parent.
Comme un remplacant au football : il doit pouvoir jouer au meme poste sans changer les regles du jeu.
class Rectangle {
public function setWidth(int $w): void { $this->w = $w; }
public function setHeight(int $h): void { $this->h = $h; }
public function area(): int { return $this->w * $this->h; }
}
// Square qui override setWidth/setHeight viole LSP
// car le comportement change de facon inattendueCas d'usage : Lors de la conception de hierarchies d'heritage pour eviter les bugs subtils lies aux sous-classes.
Systeme de pub/sub integre a PostgreSQL. LISTEN s'abonne a un canal, NOTIFY envoie un message. Permet la communication asynchrone entre processus sans polling.
Un talkie-walkie integre a la base de donnees : un service parle, les autres ecoutent sur le meme canal.
-- Session 1
LISTEN order_created;
-- Session 2
NOTIFY order_created, '{"id": 42}';
-- Session 1 recoit la notificationCas d'usage : Notifier un service en temps reel quand une commande est creee, sans message broker externe.
Types qui representent une valeur exacte plutot qu'une categorie. Permet de restreindre une variable a des valeurs precises comme "GET" | "POST".
Comme un menu fixe au restaurant — vous ne pouvez choisir que parmi les plats proposes, pas inventer le votre.
type Method = "GET" | "POST" | "PUT";
const req = (method: Method) => fetch("/", { method });
req("GET"); // OK
// req("PATCH"); // ErreurCas d'usage : Restreindre les parametres de configuration aux seules valeurs valides.
Zones de page qui annoncent automatiquement leurs changements aux lecteurs d'écran via aria-live. 'polite' attend une pause, 'assertive' interrompt immédiatement.
Comme un fil d'actualités en direct à la radio : les infos urgentes interrompent le programme, les autres attendent la pause.
<!-- Notifications non-urgentes -->
<div aria-live="polite">3 résultats trouvés</div>
<!-- Alertes urgentes -->
<div role="alert">Erreur : email invalide</div>
<!-- Équivalent à aria-live="assertive" -->Cas d'usage : Annoncer les résultats de recherche dynamiques, messages d'erreur ou confirmations sans rechargement de page.
Composant réseau distribuant le trafic entrant entre plusieurs instances d'un service. Algorithmes : round-robin, least connections, IP hash.
L'hôtesse d'accueil d'un restaurant qui répartit les clients entre les tables disponibles.
# Nginx load balancer
upstream api {
least_conn;
server api1:3000;
server api2:3000;
server api3:3000;
}
server {
location / { proxy_pass http://api; }
}Cas d'usage : Distribuer le trafic uniformément et assurer la haute disponibilité.
Test qui simule une charge utilisateur realiste sur le systeme pour mesurer ses performances (temps de reponse, debit, utilisation des ressources) sous conditions normales et pics.
Comme tester un pont en y faisant passer progressivement de plus en plus de camions pour verifier sa charge maximale.
// k6 load test
import http from 'k6/http';
export const options = {
vus: 100, // 100 utilisateurs virtuels
duration: '30s',
};
export default function () {
http.get('https://api.myapp.com/products');
}Cas d'usage : Avant un lancement ou un evenement marketing pour verifier que l'infrastructure tient la charge prevue.
Fonction associee a une route qui charge les donnees avant le rendu du composant. Les donnees sont accessibles via useLoaderData().
Comme un serveur qui prepare ta table avant que tu arrives : tout est pret quand tu t'assois.
// Definition
export async function userLoader({ params }) {
return fetch(`/api/users/${params.id}`);
}
// Route: { path: 'users/:id', loader: userLoader, element: <User /> }
// Composant
function User() {
const user = useLoaderData();
return <p>{user.name}</p>;
}Cas d'usage : Pre-charger les donnees d'une page avant le rendu pour eviter les waterfalls de fetching.
Attribut loading='lazy' sur <img> et <iframe> qui diffère le chargement jusqu'à ce que l'élément approche du viewport. Natif, sans JS, il réduit le temps de chargement initial.
Comme un serveur de restaurant qui ne prépare le dessert que quand le client a fini le plat principal.
<!-- Images sous le fold : lazy -->
<img src="photo.jpg" loading="lazy" alt="Photo">
<!-- Image hero : eager (par défaut) -->
<img src="hero.jpg" loading="eager" alt="Hero">
<!-- Iframe lazy -->
<iframe src="video.html" loading="lazy"></iframe>Cas d'usage : Sur toutes les images en dessous du fold pour réduire le poids initial de la page.
Strategie Passport qui authentifie via email/mot de passe. Valide les credentials contre la base de donnees et retourne l'utilisateur.
Comme presenter sa carte d'identite et son mot de passe a un guichet pour prouver son identite.
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private authService: AuthService) { super(); }
async validate(username: string, password: string) {
const user = await this.authService.validateUser(username, password);
if (!user) throw new UnauthorizedException();
return user;
}
}Cas d'usage : Implementer le login classique par email et mot de passe avant d'emettre un JWT.
Fichier (package-lock.json, pnpm-lock.yaml, yarn.lock) qui enregistre les versions exactes de toutes les dependances installees. Garantit des installations reproductibles.
Comme une photo de votre etagere d'ingredients avec les marques et dates exactes : la prochaine fois, vous achetez exactement la meme chose.
// TOUJOURS commiter le lock file
git add package-lock.json
// En CI: utiliser npm ci (pas npm install)
// npm ci = install exactement le lock file
// npm install = peut modifier le lock file
// Ne JAMAIS .gitignore le lock fileCas d'usage : Pour garantir que tous les devs et la CI installent exactement les memes versions de dependances.
Logs au format JSON structuré avec des champs standardisés (timestamp, level, message, context). Facilite le parsing et la recherche.
Un rapport de police avec des champs standardisés vs un texte libre : le premier est triable et cherchable.
import pino from 'pino';
const logger = pino({ level: 'info' });
logger.info({ userId: '123', action: 'login', duration: 42 },
'User logged in successfully'
);Cas d'usage : Débugger en production en cherchant par userId, requestId ou level dans un outil comme ELK.
Operateurs &&=, ||= et ??= qui combinent affectation et logique. a ??= b assigne b a a seulement si a est null/undefined. Court-circuitage preserve.
Remplir un formulaire pre-rempli : tu n'ecris que dans les cases vides (??=), pas celles deja remplies.
let opts = {};
opts.timeout ??= 5000; // assigne si null/undefined
opts.debug ||= false; // assigne si falsy
opts.verbose &&= true; // assigne si truthyCas d'usage : Initialiser des options/configurations avec des valeurs par defaut de maniere concise.
Propriétés CSS basées sur le flux de lecture (inline/block) au lieu de la direction physique (left/right/top/bottom). margin-inline-start remplace margin-left et s'adapte automatiquement aux langues RTL.
Comme dire 'devant' et 'derrière' au lieu de 'nord' et 'sud' : ça s'adapte selon l'orientation.
.element {
margin-block: 1rem; /* haut/bas */
padding-inline: 2rem; /* gauche/droite en LTR */
border-inline-start: 3px solid;
inset-inline: 0; /* left + right */
}Cas d'usage : Construire des interfaces internationalisables qui supportent les langues RTL (arabe, hébreu) sans CSS additionnel.
Technique où le client envoie une requête HTTP et le serveur la garde ouverte jusqu'à avoir de nouvelles données. Simule du temps réel sans WebSocket.
Appeler un restaurant pour demander si une table est libre et rester en ligne jusqu'à ce qu'une se libère.
async function longPoll() {
const res = await fetch('/api/updates?timeout=30000');
const data = await res.json();
processUpdate(data);
longPoll(); // Immediately reconnect
}Cas d'usage : Fallback temps réel quand WebSocket ou SSE ne sont pas disponibles (firewalls, proxies).
Methodes speciales prefixees par __ (__construct, __get, __set, __toString, etc.) appelees automatiquement par PHP dans certaines situations.
Comme les reflexes du corps : ils se declenchent automatiquement en reaction a un stimulus, sans y penser.
class Config {
private array $data = [];
public function __get(string $key): mixed {
return $this->data[$key] ?? null;
}
public function __set(string $key, mixed $val): void {
$this->data[$key] = $val;
}
}Cas d'usage : Pour creer des APIs fluides, du lazy loading ou des wrappers dynamiques.
Collection cle-valeur ordonnee ou les cles peuvent etre de n'importe quel type (objets, fonctions, primitives). Plus performante qu'un objet pour les ajouts/suppressions frequents.
Un casier de vestiaire ou chaque casier a une cle unique de n'importe quelle forme, pas juste une etiquette texte.
const cache = new Map();
const key = { id: 1 };
cache.set(key, 'data');
cache.get(key); // 'data'
cache.has(key); // true
cache.size; // 1Cas d'usage : Cache en memoire, compteurs de frequences, lookup tables avec des cles non-string.
Fonctions pour lire (map.get) et fusionner (map.merge) des Sass Maps. map.deep-merge fusionne recursivement les maps imbriquees.
map.get c'est chercher dans le dictionnaire, map.merge c'est coller deux dictionnaires ensemble.
@use 'sass:map';
$theme: (colors: (primary: blue, secondary: green));
$override: (colors: (primary: red));
$merged: map.deep-merge($theme, $override);
// => (colors: (primary: red, secondary: green))Cas d'usage : Creer des themes configurables en fusionnant un theme de base avec des overrides.
Types qui transforment chaque propriete d'un type existant via une iteration sur ses cles. Base de Partial, Required, Readonly et autres utility types.
Comme une chaine de montage qui applique la meme transformation a chaque piece — chaque propriete passe par le meme moule.
type Optional<T> = {
[K in keyof T]?: T[K];
};
interface User { name: string; age: number }
type PartialUser = Optional<User>;
// { name?: string; age?: number }Cas d'usage : Creer des variantes de types existants (formulaires partiels, versions readonly, DTOs).
Entrepreneur americain, co-createur de Mosaic (premier navigateur graphique) et de Netscape. Il a popularise le web aupres du grand public et co-fonde Andreessen Horowitz (a16z).
Celui qui a mis une interface graphique sur Internet — avant lui, le web ressemblait a un terminal noir.
<!-- Mosaic — Marc Andreessen, 1993 -->
<!-- Premier navigateur a afficher les images -->
<!-- inline avec le texte -->
<img src="photo.gif">
<!-- La balise <img> vient de Mosaic -->Cas d'usage : Comprendre comment le web est passe d'un outil academique a un phenomene grand public.
Informaticienne americaine, directrice du software engineering pour le programme Apollo de la NASA. Son code a permis l'alunissage d'Apollo 11. Elle a invente le terme 'software engineering'.
La femme qui a code l'alunissage — son logiciel a sauve Apollo 11 d'un crash a 3 minutes de la Lune.
// Apollo 11 — Margaret Hamilton
// Le systeme de priorite des taches
// a sauve l'alunissage en 1969
// Quand l'ordinateur a ete surcharge,
// son code a priorise l'atterrissage
// et ignore les taches secondaires.
// Premier 'graceful degradation'Cas d'usage : Pionniere du genie logiciel et de la gestion des erreurs. Son travail a inspire les systemes critiques modernes.
Entrepreneur americain, fondateur de Facebook (Meta). Au-dela du reseau social, Meta a cree React, GraphQL, et investi massivement dans le metaverse et l'IA.
L'etudiant de Harvard qui a connecte 3 milliards de personnes — et dont l'equipe a cree React en bonus.
// Technologies Meta (Facebook)
// React — UI declarative
// GraphQL — query language pour APIs
// Relay — client GraphQL
// Jest — testing framework
// Flow — type checker JS
// Contributions open source majeuresCas d'usage : Meta est un contributeur majeur a l'open source (React, GraphQL, PyTorch). Son ecosysteme est incontournable.
Algorithme de GC utilise par V8 : phase Mark parcourt le graphe d'objets depuis les racines (global, stack) et marque les atteignables. Phase Sweep libere les non-marques.
Un inventaire d'entrepot : tu coches (mark) tout ce qui est sur la liste de commandes, puis tu jettes (sweep) le reste.
// Racines GC: global, stack, registres
// Atteignable = survit
window.app = { data: [1,2,3] }; // atteignable via window
// Non atteignable = GC
function leak() {
const huge = new Array(1e6);
// huge est GC apres retour de leak()
}Cas d'usage : Comprendre pourquoi certains objets ne sont pas collectes et diagnostiquer les fuites memoire.
Auteur et consultant britannique, expert en architecture logicielle et patterns. Ses livres 'Refactoring' et 'Patterns of Enterprise Application Architecture' sont des classiques.
Le dictionnaire vivant des bonnes pratiques en architecture logicielle — quand il ecrit un article, l'industrie ecoute.
// Refactoring — Martin Fowler
// Avant : code smell
function price(order) {
return order.qty * order.item.price -
Math.max(0, order.qty - 500) * order.item.price * 0.05;
}
// Apres : Extract Method, noms clairsCas d'usage : Ses patterns et pratiques de refactoring sont des references en entretien et en architecture.
Cryptographe americain, co-inventeur de la cryptographie a cle publique avec Whitfield Diffie. Leur publication de 1976 a revolutionne la cryptographie et rendu le commerce en ligne possible.
Le co-inventeur du secret partage a distance — sans lui, pas de commerce en ligne securise.
// Publication historique (1976)
// 'New Directions in Cryptography'
// Diffie & Hellman
// Concepts introduits :
// - Echange de cles publiques
// - Signatures numeriques
// Base de HTTPS, SSH, PGPCas d'usage : Comprendre les fondations de la cryptographie moderne et de la securite des communications.
Expression PHP 8.0 similaire a switch mais avec comparaison stricte, pas de fall-through, et qui retourne une valeur. Plus sure et concise que switch.
Comme un distributeur automatique : tu inseres le code exact, tu recois le produit correspondant, pas d'ambiguite.
$label = match($status) {
'draft' => 'Brouillon',
'published' => 'Publie',
'archived' => 'Archive',
default => 'Inconnu',
};Cas d'usage : Pour remplacer les switch/case simples qui retournent une valeur en fonction d'une condition.
Vues precalculees et stockees physiquement, optimisees pour la lecture. Mises a jour a partir des evenements ou des changements de donnees sources.
Un tableau de bord affiche en permanence : les chiffres sont precalcules, pas recalcules a chaque regard.
// PostgreSQL
CREATE MATERIALIZED VIEW order_stats AS
SELECT user_id, COUNT(*), SUM(total)
FROM orders GROUP BY user_id;
-- REFRESH MATERIALIZED VIEW order_stats;Cas d'usage : Dashboards, rapports, requetes complexes cote lecture en CQRS.
Fonction du module sass:math qui remplace l'operateur / pour la division. L'usage de / pour diviser est deprecie dans Dart Sass.
Utiliser un couteau a pain au lieu de dechirer : meme resultat, mais la bonne methode.
@use 'sass:math';
// DEPRECIE : $half: 100% / 2;
// CORRECT :
$half: math.div(100%, 2); // 50%
$third: math.div(100%, 3); // 33.333%
$rem: math.div(16px, 16) * 1rem; // 1remCas d'usage : Effectuer des divisions dans Sass sans declencer de warnings de depreciation.
Developpeur americain, co-createur de WordPress et fondateur d'Automattic. WordPress propulse plus de 43% de tous les sites web dans le monde.
L'homme dont le projet perso fait tourner presque la moitie du web — le roi discret d'Internet.
<?php
// WordPress — Matt Mullenweg, 2003
add_action('init', function() {
register_post_type('product', [
'public' => true,
'label' => 'Products',
]);
});
?>Cas d'usage : WordPress est incontournable pour les sites vitrines, blogs et e-commerce. Enorme marche de l'emploi.
Definit un objet qui encapsule les interactions entre un ensemble d'objets. Reduit le couplage en empechant les objets de se referer directement.
La tour de controle d'un aeroport : les avions ne se parlent pas entre eux, ils passent tous par la tour.
class ChatRoom {
send(msg, from, to) {
to.receive(msg, from.name);
}
}
// Les users ne se connaissent pas directementCas d'usage : Coordonner des composants UI interdependants, chat rooms, systemes de workflow.
Moteur de recherche open-source ultra-rapide et simple à configurer. Alternative à Algolia avec typo-tolerance, filtres et tri, déployable on-premise.
Un Algolia gratuit que vous pouvez héberger chez vous, aussi rapide mais sans la facture SaaS.
import { MeiliSearch } from 'meilisearch';
const client = new MeiliSearch({ host: 'http://localhost:7700' });
await client.index('movies').addDocuments(movies);
const results = await client.index('movies').search('avenger', {
filter: ['year > 2015'],
});Cas d'usage : Recherche instantanée sur un projet avec contraintes budget/données sensibles nécessitant du self-hosted.
Capture et externalise l'etat interne d'un objet sans violer l'encapsulation, pour pouvoir le restaurer plus tard.
La sauvegarde dans un jeu video : tu captures l'etat complet pour pouvoir y revenir si tu meurs.
class Editor {
save() { return { content: this.content }; }
restore(memento) { this.content = memento.content; }
}
const history = [editor.save()];Cas d'usage : Undo/redo dans un editeur, snapshots d'etat, point de restauration transactionnel.
Technique de cache qui stocke le resultat d'un appel de fonction base sur ses arguments. Si les memes arguments sont repasses, le resultat est retourne du cache sans recalcul.
Un carnet de notes : avant de recalculer, tu verifies si tu as deja note la reponse.
function memoize(fn) {
const cache = new Map();
return function(...args) {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key);
const result = fn.apply(this, args);
cache.set(key, result);
return result;
};
}Cas d'usage : Fonctions de calcul couteux appelees frequemment avec les memes parametres (fibonacci, selectors Redux).
Patterns courants de fuites memoire : event listeners non retires, closures retenant de gros objets, references DOM detachees, timers oublies, caches non bornes.
Des robinets qui fuient dans la maison : individuellement c'est rien, mais au bout d'un mois la facture d'eau explose.
// Fuite: listener jamais retire
window.addEventListener('resize', handler);
// Fuite: closure retient tout le scope
function init() {
const bigData = new Array(1e6);
return () => console.log(bigData.length);
}
// Fix: retirer les listeners, nullifier les refsCas d'usage : Debugger les apps qui ralentissent avec le temps, onglets qui consomment de plus en plus de RAM.
Protocole de push temps réel basé sur SSE avec un hub central. Le serveur publie des updates vers le hub qui les distribue aux clients abonnés via SSE.
Un bureau de poste central qui reçoit les lettres des expéditeurs et les distribue aux boîtes aux lettres des abonnés.
// Publish from server
await fetch('https://hub.example.com/.well-known/mercure', {
method: 'POST',
headers: { Authorization: `Bearer ${jwt}` },
body: new URLSearchParams({
topic: '/orders/42', data: JSON.stringify(order)
}),
});Cas d'usage : Push temps réel dans un écosystème Symfony/API Platform sans gérer l'infrastructure WebSocket.
Message broker (RabbitMQ) : routage push vers des consommateurs, message supprimé après consommation. Event broker (Kafka) : log append-only, multiple consumers, replay possible.
Message broker = courrier postal (une lettre, un destinataire). Event broker = journal télévisé (tout le monde peut regarder et revoir).
// Message broker : un consumer traite le message
// -> RabbitMQ, BullMQ
// Event broker : N consumers lisent le même event
// -> Kafka, Redis StreamsCas d'usage : Message broker pour les tâches (1 worker). Event broker pour les événements (N consumers).
@MessagePattern attend une reponse (request-reply) tandis que @EventPattern est fire-and-forget (event-based). Deux paradigmes de communication inter-services.
Comme envoyer un recommande avec accuse de reception (message) vs jeter une bouteille a la mer (event).
// Request-reply: l'appelant attend une reponse
@MessagePattern('get_user')
getUser(data: { id: number }) {
return this.userService.findOne(data.id);
}
// Fire-and-forget: pas de reponse attendue
@EventPattern('user_created')
handleUserCreated(data: UserCreatedEvent) {
this.emailService.sendWelcome(data.email);
}Cas d'usage : Utiliser MessagePattern pour les queries et EventPattern pour les notifications asynchrones.
Données numériques agrégées mesurant la performance d'un système (latence, throughput, error rate, saturation). Les 4 golden signals de Google.
Le tableau de bord d'une voiture : vitesse, température, niveau d'essence en un coup d'oeil.
// Prometheus client
const httpDuration = new Histogram({
name: 'http_request_duration_seconds',
help: 'Duration of HTTP requests',
labelNames: ['method', 'route', 'status']
});
app.use((req, res, next) => {
const end = httpDuration.startTimer();
res.on('finish', () => end({ method: req.method }));
});Cas d'usage : Alerter quand la latence p99 dépasse le SLO ou quand le taux d'erreur augmente.
Style architectural ou l'application est decomposee en services independants, deployables separement, communiquant via API ou messages.
Une equipe de specialistes independants : chacun fait son metier, ils communiquent par telephone.
// Service autonome
const app = express();
app.get('/users/:id', userController.findById);
app.listen(3001);
// Deploye independamment, sa propre DBCas d'usage : Grandes equipes, scaling independant, polyglottisme technologique.
File prioritaire qui contient les callbacks de Promises (.then/.catch/.finally), MutationObserver et queueMicrotask. Videe entierement avant chaque macrotask.
Les clients VIP qui passent devant tout le monde a chaque tour de service.
queueMicrotask(() => console.log('micro 1'));
setTimeout(() => console.log('macro'), 0);
queueMicrotask(() => console.log('micro 2'));
// micro 1, micro 2, macroCas d'usage : Executer du code juste apres l'operation courante mais avant le prochain rendu ou timer.
Fonction ou classe executee avant le route handler, avec acces a request, response et next(). Compatible avec les middlewares Express/Fastify.
Comme un agent de securite a l'entree d'un immeuble : il verifie ton badge avant de te laisser monter.
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log(`${req.method} ${req.url}`);
next();
}
}Cas d'usage : Logger les requetes, parser des headers custom ou modifier la requete avant qu'elle atteigne le controller.
Fonction intermediaire inseree dans un pipeline de traitement. Chaque middleware peut modifier la requete/reponse ou court-circuiter la chaine.
Les controles de securite a l'aeroport : chaque etape verifie quelque chose avant de te laisser passer.
const auth = (req, res, next) => {
if (!req.headers.token) return res.status(401).end();
req.user = verify(req.headers.token);
next();
};Cas d'usage : Authentification, logging, compression, CORS dans Express/Koa/NestJS.
Fonctions executees avant (pre) ou apres (post) certaines operations comme save, validate, remove ou find. Permettent d'injecter de la logique transversale.
Les controles de securite a l'aeroport (pre) et le tapis a bagages (post) : ils s'executent automatiquement autour de ton vol.
userSchema.pre('save', async function() {
if (this.isModified('password')) {
this.password = await bcrypt.hash(
this.password, 10
);
}
});Cas d'usage : Hasher les mots de passe avant sauvegarde, logger les operations ou mettre a jour des timestamps.
Gestionnaire polyglotte de versions d'outils (ex-rtx, successeur d'asdf en Rust). Gere Node, Python, Go, Rust et 400+ outils avec un seul fichier .mise.toml.
Comme un couteau suisse pour les versions d'outils : un seul outil remplace nvm, pyenv, goenv et tous les autres.
# .mise.toml
[tools]
node = "20.11"
python = "3.12"
[env]
DATABASE_URL = "postgres://localhost/myapp"
# Terminal
mise install # installe tout
mise use node@20 # switch versionCas d'usage : Pour les equipes polyglotte qui veulent un seul outil pour gerer toutes les versions de runtime.
Developpeur slovaco-americain chez Google, createur d'AngularJS puis co-createur d'Angular. Plus recemment, il a cree Qwik, un framework base sur la resumabilite.
L'eternel reinventeur du front-end : il a cree Angular, puis l'a detruit pour le reconstruire, puis a invente Qwik.
// Angular — Misko Hevery
@Component({
selector: 'app-hello',
template: '<h1>Hello, {{name}}!</h1>'
})
export class HelloComponent {
name = 'World';
}Cas d'usage : Angular est le framework front-end de reference pour les grandes entreprises. Qwik explore le futur du SSR.
Entrepreneur americain, co-fondateur de HashiCorp. Createur de Vagrant, Terraform, Vault, Consul et Nomad — des outils qui ont defini l'infrastructure moderne.
L'outilleur de l'infrastructure cloud : chaque outil HashiCorp resout un probleme precis que tout le monde avait.
# Terraform — Mitchell Hashimoto
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = {
Name = "HelloWorld"
}
}Cas d'usage : Terraform est devenu le standard de l'Infrastructure as Code. Indispensable pour tout profil DevOps.
Blocs de styles reutilisables qui acceptent des arguments. Definis avec @mixin, utilises avec @include. Generent du CSS a chaque utilisation (contrairement aux placeholders).
Une recette parametrable : meme technique de base, mais tu choisis les ingredients a chaque fois.
@mixin respond-to($bp) {
@if $bp == 'md' { @media (min-width: 768px) { @content; } }
@if $bp == 'lg' { @media (min-width: 1024px) { @content; } }
}
.grid {
display: block;
@include respond-to('md') { display: grid; }
}Cas d'usage : Factoriser des patterns CSS repetitifs comme les media queries, les prefixes vendeur, les animations.
Approche de design qui commence par le layout mobile puis ajoute de la complexité via min-width media queries pour les écrans plus grands. Le CSS de base sert le mobile.
Comme construire une maison en commençant par les fondations solides (mobile) avant d'ajouter les étages (desktop).
/* Base : mobile */
.grid { display: flex; flex-direction: column; }
/* Tablette */
@media (min-width: 768px) {
.grid { flex-direction: row; flex-wrap: wrap; }
}
/* Desktop */
@media (min-width: 1024px) {
.grid { flex-wrap: nowrap; }
}Cas d'usage : Tout projet web moderne, vu que la majorité du trafic vient du mobile.
Mocha est un runner de tests flexible pour Node.js, et Chai une librairie d'assertions expressive. Ensemble ils forment un duo classique plus modulaire que Jest.
Comme acheter son moteur et sa carrosserie separement : plus de flexibilite mais plus de choix a faire.
const { expect } = require('chai');
describe('User', () => {
it('should have a name', () => {
const user = new User('Alice');
expect(user.name).to.equal('Alice');
expect(user).to.have.property('email');
});
});Cas d'usage : Pour les projets Node.js backend qui preferent une approche modulaire avec choix des plugins.
Le stub fournit des reponses predefinies sans verifier les appels. Le mock verifie en plus que les interactions attendues ont bien eu lieu (nombre d'appels, arguments).
Le stub est un distributeur automatique (il donne la reponse), le mock est un serveur de restaurant qui note ce que vous commandez ET verifie que vous avez bien commande.
// Stub : on ne verifie pas l'appel
vi.spyOn(api, 'fetch').mockReturnValue({ data: 'ok' });
// Mock : on verifie l'interaction
const sendEmail = vi.fn();
await registerUser('alice@mail.com');
expect(sendEmail).toHaveBeenCalledWith('alice@mail.com');
expect(sendEmail).toHaveBeenCalledTimes(1);Cas d'usage : Utiliser des stubs pour les queries (get data) et des mocks pour les commands (send email, write DB).
Classe construite a partir d'un Schema qui fournit l'interface CRUD pour interagir avec une collection MongoDB. Chaque instance d'un Model est un document.
Le moule a gateau (Model) cree a partir du plan (Schema) : chaque gateau (document) a la meme forme.
const User = mongoose.model('User', userSchema);
const alice = new User({ name: 'Alice' });
await alice.save();Cas d'usage : Creer le point d'entree pour toutes les operations sur une collection dans une app Node.js.
Monolithe organise en modules bien decouples avec des frontieres claires. Combine la simplicite du monolithe et la modularite des microservices.
Un immeuble d'appartements : un seul batiment, mais chaque appartement est independant avec ses propres murs.
// Modules avec interfaces publiques
import { UserModule } from './modules/user';
import { OrderModule } from './modules/order';
// Communication via interfaces, pas d'acces DB croisesCas d'usage : Equipe moyenne qui veut de la modularite sans la complexite operationnelle des microservices.
Classe annotee @Module qui organise l'application en blocs fonctionnels cohesifs. Chaque module declare ses controllers, providers, imports et exports.
Comme un departement dans une entreprise : chaque departement a ses employes, ses outils et ses responsabilites bien definies.
@Module({
imports: [DatabaseModule],
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule {}Cas d'usage : Structurer chaque domaine metier en module dedie pour maintenir la separation des responsabilites.
Technique pour ajouter des declarations a un module existant via declare module. Permet d'etendre les types d'une lib tierce.
Comme ajouter une extension a une maison existante — la structure originale reste intacte mais gagne de nouvelles pieces.
// Etendre express
declare module "express" {
interface Request {
userId?: string;
}
}Cas d'usage : Ajouter des proprietes typees aux objets de frameworks (Request express, Session, Window).
Systeme de modules base sur @use/@forward qui remplace @import. Chaque fichier est un module avec son propre scope, evitant les collisions de noms.
Des appartements dans un immeuble : chacun a ses affaires, tu sonnes pour emprunter quelque chose.
// @use charge le module une seule fois
@use 'sass:math';
@use 'sass:color';
@use './config' as cfg;
.box {
width: math.div(100%, 3);
color: color.adjust(cfg.$primary, $lightness: 10%);
}Cas d'usage : Structurer un projet Sass en modules encapsules sans effets de bord globaux.
Service cloud manage de MongoDB qui gere automatiquement le deploiement, le scaling, les backups et la securite. Disponible sur AWS, Azure et GCP.
Un hotel pour ta base de donnees : tu arrives, ta chambre est prete, le menage et la securite sont inclus.
// Connection string Atlas
mongoose.connect(
'mongodb+srv://user:pass@cluster.mongodb.net/mydb'
);Cas d'usage : Deployer une base MongoDB en production sans gerer l'infrastructure serveur.
Interface graphique officielle de MongoDB pour explorer les donnees, construire des requetes visuellement et analyser les performances via les plans d'execution.
L'equivalent de phpMyAdmin mais pour MongoDB, avec des graphiques en bonus.
// Pas de code : outil GUI
// Lancer depuis le terminal :
// mongodb-compassCas d'usage : Visualiser la structure des documents et debugger les requetes sans ecrire de code.
Interface pour interagir avec une collection MongoDB, injectee via @InjectModel. Fournit les methodes CRUD (find, create, updateOne, deleteMany).
Comme un guichet dedie a une collection : il sait lire, ecrire et supprimer les documents de sa collection.
@Injectable()
export class CatService {
constructor(
@InjectModel(Cat.name) private catModel: Model<Cat>,
) {}
create(dto: CreateCatDto) {
return new this.catModel(dto).save();
}
}Cas d'usage : Effectuer les operations CRUD sur les collections MongoDB dans un service NestJS.
Mecanisme pour charger automatiquement les documents references depuis d'autres collections. Equivalent des jointures SQL pour MongoDB.
Comme des liens hypertexte dans un document : cliquer dessus charge le contenu reference.
async findWithOwner(id: string) {
return this.catModel
.findById(id)
.populate('owner')
.exec();
}Cas d'usage : Charger les documents lies sans faire plusieurs requetes manuelles.
Definition de la structure d'un document MongoDB via @Schema et @Prop de @nestjs/mongoose. Genere le schema Mongoose a partir des decorateurs TypeScript.
Comme un formulaire avec des champs obligatoires et optionnels : il definit ce qu'un document doit contenir.
@Schema({ timestamps: true })
export class Cat {
@Prop({ required: true })
name: string;
@Prop()
age: number;
@Prop({ type: Types.ObjectId, ref: 'Owner' })
owner: Owner;
}Cas d'usage : Definir la structure des documents MongoDB avec validation et typage TypeScript.
Routeur de requetes dans une architecture shardee. Il recoit les requetes des clients et les redirige vers le(s) shard(s) concerne(s) en consultant les config servers.
Le standard telephonique d'une grande entreprise : il redirige chaque appel vers le bon departement.
// Se connecter via mongos
mongosh 'mongodb://mongos-host:27017/mydb'Cas d'usage : Point d'entree unique pour les applications dans une architecture MongoDB shardee.
Shell interactif moderne de MongoDB qui remplace l'ancien mongo shell. Il offre la coloration syntaxique, l'auto-completion et un support complet de JavaScript/Node.js.
Le terminal de commande de ta base de donnees, comme psql pour PostgreSQL mais avec du JavaScript sous le capot.
mongosh "mongodb://localhost:27017/mydb"
db.users.find({ age: { $gt: 25 } });Cas d'usage : Explorer et administrer rapidement une base MongoDB en ligne de commande.
Application deployee comme une seule unite ou tous les composants partagent le meme processus et la meme base de donnees. Simple mais limitant a l'echelle.
Un couteau suisse : tout est integre dans un seul outil, pratique au debut mais difficile a reparer piece par piece.
// Tout dans un seul projet
app.use('/users', userRoutes);
app.use('/orders', orderRoutes);
app.use('/payments', paymentRoutes);
// Un seul deploy, une seule DBCas d'usage : MVP, startups early-stage, equipes reduites ou le monolithe est le choix rationnel.
Stratégie de dépôt unique contenant plusieurs projets/packages. Outils comme Nx, Turborepo ou Lerna gèrent les dépendances et les builds.
Un centre commercial : tous les magasins (projets) sous le même toit avec des infrastructures partagées.
// turbo.json
{
"pipeline": {
"build": { "dependsOn": ["^build"] },
"test": { "dependsOn": ["build"] }
}
}Cas d'usage : Partager du code entre frontend, backend et libs avec des dépendances atomiques.
Outils pour gerer plusieurs packages/apps dans un seul repo (Turborepo, Nx, Lerna). Offrent caching, parallelisme et graphes de dependances intelligents.
Comme un chef de chantier qui coordonne plusieurs equipes sur un meme site : il optimise l'ordre des travaux et evite les doublons.
// turbo.json (Turborepo)
{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"test": {
"dependsOn": ["build"]
}
}
}Cas d'usage : Pour les organisations avec plusieurs packages partageant du code (design system, shared utils, apps).
Mock Service Worker intercepte les requetes reseau au niveau du Service Worker (navigateur) ou de Node.js pour simuler des API sans modifier le code applicatif.
Comme un standardiste qui intercepte les appels et repond a la place du destinataire, sans que l'appelant ne le sache.
// handlers.js
import { http, HttpResponse } from 'msw';
export const handlers = [
http.get('/api/users', () => {
return HttpResponse.json([
{ id: 1, name: 'Alice' }
]);
}),
];Cas d'usage : Pour mocker les API externes dans les tests frontend et le developpement local sans backend disponible.
Outil qui intercepte les requetes reseau au niveau du Service Worker pour les mocker, sans modifier le code applicatif. Fonctionne en test et en dev.
Comme un doubleur de voix au cinema : le vrai acteur (API) est absent mais la scene (test) se joue quand meme.
import { http, HttpResponse } from 'msw';
import { setupServer } from 'msw/node';
const server = setupServer(
http.get('/api/users', () => HttpResponse.json([
{ id: 1, name: 'Alice' }
]))
);
beforeAll(() => server.listen());Cas d'usage : Mocker les API dans les tests et pendant le developpement frontend sans backend disponible.
Plugin charge automatiquement avant tous les autres, sans possibilite de desactivation via l'admin. Place dans wp-content/mu-plugins/.
Comme un systeme de securite integre dans les murs de la maison : on ne peut pas le debrancher.
// wp-content/mu-plugins/security.php
add_action('init', function() {
// Forcer HTTPS
if (!is_ssl()) {
wp_redirect('https://' . $_SERVER['HTTP_HOST']
. $_SERVER['REQUEST_URI'], 301);
exit;
}
});Cas d'usage : Pour du code critique qui ne doit jamais etre desactive : securite, configuration, performance.
Transaction ACID qui garantit l'atomicite sur plusieurs documents et collections. Introduite en MongoDB 4.0 pour les replica sets et 4.2 pour les clusters shardes.
Un virement bancaire : le debit ET le credit doivent reussir ensemble, sinon rien ne se passe.
const session = client.startSession();
session.startTransaction();
await accounts.updateOne(
{ _id: 'A' }, { $inc: { bal: -100 } }, { session }
);
await accounts.updateOne(
{ _id: 'B' }, { $inc: { bal: 100 } }, { session }
);
await session.commitTransaction();Cas d'usage : Operations financieres ou tout scenario ou plusieurs documents doivent etre modifies de facon atomique.
Technique Dockerfile utilisant plusieurs FROM pour séparer build et runtime. L'image finale ne contient que les artefacts nécessaires.
Construire un meuble en atelier puis ne livrer que le meuble fini, pas les outils ni les copeaux.
FROM node:20 AS build
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM node:20-alpine
COPY --from=build /app/dist ./dist
CMD ["node", "dist/server.js"]Cas d'usage : Réduire la taille des images de production de 1 Go à moins de 100 Mo.
Technique de découpage d'un fichier volumineux en plusieurs parties uploadées en parallèle. Permet la reprise en cas d'erreur et optimise le débit réseau.
Déménager en envoyant les cartons par plusieurs camions en parallèle plutôt qu'un seul gros camion.
const upload = new Upload({
client: s3,
params: {
Bucket: 'videos', Key: 'movie.mp4', Body: fileStream,
},
partSize: 10 * 1024 * 1024, // 10MB parts
leavePartsOnError: false,
});
await upload.done();Cas d'usage : Upload de fichiers volumineux (vidéos, datasets) avec barre de progression et reprise sur erreur.
Operation d'ecriture (POST, PUT, DELETE) geree par useMutation avec callbacks onSuccess/onError et possibilite de mises a jour optimistes.
Comme un formulaire de La Poste : tu le remplis (mutate), tu sais si c'est envoye (onSuccess) ou perdu (onError).
const mutation = useMutation({
mutationFn: (newUser) => api.post('/users', newUser),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['users'] });
},
});
mutation.mutate({ name: 'Alice' });Cas d'usage : Toute operation d'ecriture vers le serveur avec invalidation automatique du cache apres succes.
Technique qui modifie volontairement le code source (mutations) pour verifier que les tests detectent bien ces changements. Si un mutant survit, les tests sont insuffisants.
Comme verifier qu'un detecteur de fumee fonctionne en allumant une petite flamme : s'il ne sonne pas, il est defaillant.
// Stryker mutation testing
// Original: return a + b;
// Mutant 1: return a - b; // test doit echouer
// Mutant 2: return a * b; // test doit echouer
// Si un mutant SURVIT => test manquant
// npx stryker runCas d'usage : Pour evaluer la qualite reelle des tests au-dela du simple code coverage qui peut donner un faux sentiment de securite.
API qui observe les changements du DOM (attributs, enfants, texte) de maniere asynchrone et performante. Remplace les deprecated Mutation Events.
Une camera de surveillance qui enregistre chaque modification dans une piece et te fait un rapport groupe.
const observer = new MutationObserver((mutations) => {
mutations.forEach(m => console.log(m.type));
});
observer.observe(document.body, {
childList: true,
subtree: true,
attributes: true
});Cas d'usage : Detecter des modifications DOM par des scripts tiers, synchroniser un etat externe avec le DOM.
Pattern architectural separant Model (donnees/logique), View (affichage) et Controller (orchestration). Base de la majorite des frameworks PHP.
Comme un restaurant : le cuisinier (Model), la presentation du plat (View), le serveur (Controller) qui coordonne.
class UserController {
public function show(int $id): Response {
$user = $this->userRepo->find($id); // Model
return $this->render('user/show', [
'user' => $user // View
]);
}
}Cas d'usage : Structure de base pour toute application web PHP avec separation des responsabilites.
Multi-Version Concurrency Control : mecanisme ou chaque transaction voit un snapshot coherent de la base. Les lectures ne bloquent jamais les ecritures et vice-versa.
Chaque client du restaurant recoit sa propre copie du menu, meme si le chef met a jour les plats en cuisine.
-- Transaction A lit des donnees
BEGIN;
SELECT * FROM accounts WHERE id = 1;
-- Transaction B modifie en parallele
-- A ne voit pas les changements de B
COMMIT;Cas d'usage : Comprendre pourquoi PostgreSQL gere si bien la concurrence sans verrouillage pessimiste.
Fonctionnalite PHP 8.0 permettant de passer des arguments par nom plutot que par position. Ameliore la lisibilite et permet de sauter les parametres optionnels.
Comme remplir un formulaire ou chaque champ a une etiquette, au lieu de deviner l'ordre des cases.
function createUser(
string $name,
string $email,
string $role = 'user'
): User { /* ... */ }
createUser(name: 'Alice', email: 'a@b.com');Cas d'usage : Pour les fonctions avec beaucoup de parametres optionnels, ou la lisibilite est cruciale.
Espace de noms qui organise le code en groupes logiques et evite les collisions de noms entre classes. Introduit en PHP 5.3, c'est la base de l'autoloading moderne.
Comme les noms de famille : deux personnes peuvent s'appeler Marie, mais Marie Dupont et Marie Martin sont distinctes.
namespace App\Services;
use App\Models\User;
class UserService {
public function find(int $id): User {
return User::findOrFail($id);
}
}Cas d'usage : Dans tout projet PHP moderne pour organiser le code et permettre l'autoloading PSR-4 via Composer.
Partition logique d'un cluster Kubernetes pour isoler les ressources entre équipes ou environnements. Permet des quotas et des RBAC distincts.
Les étages d'un immeuble de bureaux : chaque équipe a son étage avec ses propres règles d'accès.
kubectl create namespace staging
kubectl get pods -n staging
kubectl apply -f deploy.yaml -n stagingCas d'usage : Séparer dev, staging et prod sur le même cluster avec des quotas de ressources.
Routes imbriquees ou les routes enfants s'affichent a l'interieur du layout de leur route parent via Outlet, permettant des layouts partages et une navigation hierarchique.
Comme des poupees russes : chaque layout contient le suivant, et seul le contenu le plus interne change.
// /dashboard -> Layout + DashboardHome
// /dashboard/settings -> Layout + Settings
<Route path="dashboard" element={<DashLayout />}>
<Route index element={<DashHome />} />
<Route path="settings" element={<Settings />} />
</Route>Cas d'usage : Applications avec des layouts hierarchiques (sidebar fixe, breadcrumbs dynamiques, multi-step wizards).
Possibilite d'imbriquer les selecteurs pour refleter la hierarchie HTML. Le caractere & reference le selecteur parent.
Des poupees russes : chaque niveau contient le suivant, et & c'est la poupee dans laquelle tu te trouves.
.card {
padding: 1rem;
&__title { font-size: 1.5rem; }
&:hover { box-shadow: 0 4px 6px #0002; }
&.is-active { border-color: blue; }
}Cas d'usage : Organiser le CSS en suivant la structure des composants et la convention BEM.
Syntaxe CSS native permettant d'imbriquer les sélecteurs enfants directement dans leur parent, comme en Sass. Utilise & pour référencer le sélecteur parent.
Comme des poupées russes : chaque règle est contenue dans sa parente, reflétant la structure HTML.
.card {
padding: 1rem;
& .title { font-size: 1.5rem; }
&:hover { box-shadow: 0 2px 8px #0003; }
@media (width > 768px) {
padding: 2rem;
}
}Cas d'usage : Écrire du CSS organisé et lisible sans préprocesseur, en groupant les styles liés.
Operateur qui cree une instance : 1) cree un objet vide, 2) lie son [[Prototype]] au .prototype du constructeur, 3) execute le constructeur avec this = nouvel objet, 4) retourne l'objet.
Un moule a gateau : new prend le moule (constructeur), verse la pate (proprietes), et te donne un gateau (instance).
function User(name) {
this.name = name;
}
User.prototype.hi = function() { return this.name; };
const u = new User('Alice');
u.hi(); // 'Alice'Cas d'usage : Instancier des objets a partir de constructeurs ou de classes ES6.
Systeme de routage Next.js base sur le filesystem avec Server Components par defaut, layouts imbriques, et conventions de fichiers (page, layout, loading, error).
Comme un immeuble ou chaque dossier est un etage et chaque fichier est une piece avec un role precis.
// app/users/[id]/page.tsx
export default async function UserPage({ params }) {
const { id } = await params;
const user = await getUser(id);
return <h1>{user.name}</h1>;
}
// app/users/[id]/loading.tsx -> Suspense automatique
// app/users/[id]/error.tsx -> Error Boundary autoCas d'usage : Applications React full-stack avec SSR, RSC, routing et API integres.
Code qui s'execute avant chaque requete dans Next.js, au niveau Edge. Permet la redirection, la reecriture d'URL, l'ajout de headers et l'auth.
Comme un vigile a l'entree d'un batiment : il verifie ton badge avant de te laisser entrer dans n'importe quelle piece.
// middleware.ts (racine du projet)
import { NextResponse } from 'next/server';
export function middleware(request) {
const token = request.cookies.get('token');
if (!token) return NextResponse.redirect(new URL('/login', request.url));
return NextResponse.next();
}
export const config = { matcher: ['/dashboard/:path*'] };Cas d'usage : Auth, redirection A/B testing, geolocalisation, rate limiting au niveau Edge.
Informaticien suisse, createur de Pascal et de plusieurs autres langages (Modula, Oberon). Il a formule la loi de Wirth : les logiciels ralentissent plus vite que le materiel n'accelere.
Le prof de discipline qui voulait que les programmeurs ecrivent du code propre et structure — Pascal etait son outil pedagogique.
program HelloWorld;
begin
writeln('Hello, World!');
end.
{ Pascal — Niklaus Wirth, 1970 }Cas d'usage : Comprendre l'evolution des langages structures et l'importance de la simplicite en conception logicielle.
Dossier contenant toutes les dependances installees d'un projet Node.js. Peut devenir tres volumineux (facilement 500Mo+). Toujours dans le .gitignore.
Comme un entrepot geant rempli de toutes les pieces necessaires a votre usine : enorme mais indispensable.
# .gitignore (OBLIGATOIRE)
node_modules/
# Taille typique
# du -sh node_modules => 500M+ facilement
# Alternatives sans node_modules:
# - Yarn PnP (Plug'n'Play)
# - pnpm (liens symboliques vers store global)Cas d'usage : Structure par defaut pour stocker les dependances npm, utilisee par tous les outils Node.js.
Token de securite WordPress (number used once) qui protege contre les CSRF et les acces non autorises. Valide 24h, lie a l'action et a l'utilisateur.
Comme un ticket d'entree a usage unique qui prouve que c'est bien toi qui as demande l'acces.
// Generation
$nonce = wp_create_nonce('delete_post_42');
// Verification
if (!wp_verify_nonce($_POST['_nonce'], 'delete_post_42')) {
wp_die('Securite : requete non autorisee');
}Cas d'usage : Sur tout formulaire et lien d'action dans l'admin et le front-end WordPress.
Utility type qui retire null et undefined d'une union. Garantit qu'une valeur existe reellement.
Comme un controle qualite qui rejette les boites vides — seuls les produits reels passent.
type Maybe = string | null | undefined;
type Sure = NonNullable<Maybe>; // stringCas d'usage : Nettoyer les types apres une verification de nullite pour travailler avec des valeurs garanties.
Node Package Manager, le gestionnaire de paquets par defaut de Node.js. Gere les dependances, les scripts et le registre de packages le plus vaste au monde.
Comme un supermarche geant ou vous trouvez tous les ingredients (packages) pour votre recette (projet).
npm init -y # creer package.json
npm install express # ajouter une dep
npm install -D jest # dep de dev
npm run test # lancer un script
npm ci # install propre en CI
npm audit # scanner les vulnsCas d'usage : Comme gestionnaire de paquets standard pour tout projet Node.js, surtout en CI avec npm ci.
npx execute des packages binaires sans les installer globalement, en les telechargant temporairement. npm exec est l'equivalent moderne integre a npm depuis v7.
Comme louer un outil pour un jour au lieu de l'acheter : vous l'utilisez une fois et il disparait.
# Execute sans installer
npx create-react-app my-app
npx eslint --init
# Equivalent moderne
npm exec -- create-react-app my-app
# Avec pnpm
pnpm dlx create-next-appCas d'usage : Pour executer des CLI ponctuels (scaffolding, init) sans polluer les dependances globales.
Remplace les verifications null par un objet neutre qui implemente l'interface attendue avec un comportement par defaut (no-op).
Un chauffeur fantome dans un taxi autonome : le siege conducteur est occupe par quelque chose qui ne fait rien mais le systeme fonctionne.
class NullLogger {
log() {} // no-op
error() {} // no-op
}
// Au lieu de: if (logger) logger.log(...)Cas d'usage : Eviter les verifications null repetitives pour des dependances optionnelles.
Operateur ?-> de PHP 8.0 qui court-circuite la chaine d'appels si une valeur intermediaire est null, retournant null au lieu de lancer une erreur.
Comme un GPS qui s'arrete de calculer l'itineraire si la destination n'existe pas, au lieu de planter.
// Avant
$country = $user->getAddress()
? $user->getAddress()->getCountry()
: null;
// Apres
$country = $user?->getAddress()?->getCountry();Cas d'usage : Pour naviguer dans des chaines d'objets potentiellement null sans multiples verifications if/null.
Operateur ?? qui retourne la valeur de droite uniquement si celle de gauche est null ou undefined (pas pour 0, '' ou false, contrairement a ||).
Un filet de securite qui ne se declenche que si le trapeziste est vraiment absent (null/undefined), pas s'il est juste petit (0) ou silencieux ('').
const port = config.port ?? 3000;
// vs ||
0 || 3000; // 3000 (bug!)
0 ?? 3000; // 0 (correct)
'' ?? 'default'; // '' (correct)Cas d'usage : Definir des valeurs par defaut en preservant les valeurs falsy legitimes comme 0, '' ou false.
Node Version Manager, le gestionnaire de versions Node.js historique en bash. Permet d'installer et switcher entre plusieurs versions de Node.js. Lent mais universellement connu.
Comme le veterane fiable : tout le monde le connait, il fait le job, mais les jeunes (fnm, volta) sont plus rapides.
# Usage
nvm install 20
nvm use 20
nvm alias default 20
# .nvmrc pour fixer par projet
echo "20" > .nvmrc
nvm use # lit .nvmrc
# Lenteur au demarrage du shell
# -> preferer fnm ou voltaCas d'usage : Pour gerer les versions Node.js sur les systemes Unix, surtout quand l'equipe l'utilise deja.
Framework de monorepo avec graphe de dépendances intelligent, cache distribué et générateurs de code. Supporte React, Angular, Node et plus avec des plugins dédiés.
Un architecte de chantier qui connaît toutes les dépendances entre bâtiments et ne rénove que ce qui est impacté.
// nx.json - affected commands
npx nx affected --target=test // Only test changed
npx nx affected --target=build // Only build changed
npx nx graph // Visualize dependency graphCas d'usage : Gérer un monorepo d'entreprise multi-frameworks avec des dizaines de projets interdépendants.
Protocole d'autorisation déléguée permettant à une app d'accéder aux ressources d'un utilisateur sans connaître son mot de passe. Définit plusieurs flows selon le contexte.
Donner un passe limité au plombier pour accéder à la salle de bain sans lui donner les clés de toute la maison.
// Authorization Code flow (redirect)
const authUrl = `https://auth.example.com/authorize
?response_type=code
&client_id=${CLIENT_ID}
&redirect_uri=${REDIRECT}
&scope=read:profile
&state=${csrfToken}`;Cas d'usage : Permettre le 'Login with Google/GitHub' ou accéder aux APIs tierces au nom de l'utilisateur.
Extension OAuth2 (Proof Key for Code Exchange) qui protège le flow Authorization Code contre l'interception. Utilise un code_verifier et code_challenge.
Envoyer un cadenas ouvert avec la demande, puis prouver qu'on a la clé en l'ouvrant lors de l'échange.
const verifier = generateRandomString(128);
const challenge = base64url(sha256(verifier));
// Step 1: Send challenge
`&code_challenge=${challenge}&code_challenge_method=S256`
// Step 2: Send verifier to get token
`&code_verifier=${verifier}`Cas d'usage : Sécuriser le flow OAuth2 dans les SPA et apps mobiles qui ne peuvent pas garder un client_secret.
Strategie Passport pour l'authentification via providers tiers (Google, GitHub, Facebook). Gere le flow d'autorisation OAuth2 avec callback.
Comme se connecter a un hotel avec sa carte de membre d'une chaine : un tiers de confiance confirme ton identite.
@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
constructor(cfg: ConfigService) {
super({ clientID: cfg.get('GOOGLE_ID'),
clientSecret: cfg.get('GOOGLE_SECRET'),
callbackURL: '/auth/google/callback',
scope: ['email', 'profile'] });
}
validate(token, refresh, profile) { return profile; }
}Cas d'usage : Proposer le 'Login with Google/GitHub' pour simplifier l'onboarding utilisateur.
Cache en memoire persistant (Redis, Memcached) qui remplace le cache objet non-persistant par defaut. Accelere drastiquement les requetes repetees.
Comme une memoire vive ultra-rapide a cote d'un disque dur lent : les donnees frequentes y sont stockees.
// wp-config.php
define('WP_REDIS_HOST', '127.0.0.1');
// Usage dans le code
wp_cache_set('user_42', $userData, 'users', 3600);
$cached = wp_cache_get('user_42', 'users');Cas d'usage : Sur les sites a fort trafic pour reduire les requetes base de donnees de 60-80%.
Maintient un ensemble d'objets reinitialises prets a l'emploi pour eviter le cout de creation/destruction repetee. Gere le cycle de vie acquire/release.
Les caddies au supermarche : tu en prends un disponible, tu l'utilises, puis tu le rends.
class Pool {
#available = [];
acquire() { return this.#available.pop() ?? create(); }
release(obj) { obj.reset(); this.#available.push(obj); }
}Cas d'usage : Pool de connexions DB, threads, ou objets graphiques dans un moteur de jeu.
Methodes statiques cles : Object.keys/values/entries (enumeration), Object.assign (copie shallow), Object.freeze/seal (immutabilite), Object.fromEntries (reconstruction), Object.create (prototype).
La boite a outils officielle pour manipuler les objets : chaque outil a un usage precis.
const obj = { a: 1, b: 2 };
Object.keys(obj); // ['a', 'b']
Object.entries(obj); // [['a',1], ['b',2]]
const copy = Object.assign({}, obj);
const fromMap = Object.fromEntries(new Map([['x',1]]));Cas d'usage : Transformer, copier, geler ou iterer sur les proprietes d'un objet de maniere standard.
Identifiant unique de 12 octets genere automatiquement par MongoDB pour le champ _id. Il encode un timestamp, un identifiant machine, un PID et un compteur incremental.
Un numero de serie sur un produit : unique au monde, et en le lisant tu peux deviner quand et ou il a ete fabrique.
const id = new ObjectId();
console.log(id.getTimestamp());
// 2024-01-15T10:30:00.000ZCas d'usage : Identifier de maniere unique chaque document sans compteur central, ideal pour les systemes distribues.
Definit une dependance un-a-plusieurs : quand un objet change d'etat, tous ses dependants sont notifies automatiquement.
S'abonner a une chaine YouTube : tu es notifie a chaque nouvelle video sans verifier manuellement.
class EventEmitter {
#subs = new Map();
on(event, fn) { this.#subs.set(event, [...(this.#subs.get(event) ?? []), fn]); }
emit(event, data) { this.#subs.get(event)?.forEach(fn => fn(data)); }
}Cas d'usage : Systemes de notifications, reactive UI (React state), EventEmitter Node.js.
Pattern ou un sujet notifie automatiquement ses observateurs quand son etat change. Base du systeme d'evenements en PHP et du Hook System WordPress.
Comme une chaine YouTube : quand une video est publiee, tous les abonnes sont notifies automatiquement.
interface Observer {
public function update(Event $event): void;
}
class EventDispatcher {
public function dispatch(Event $event): void {
foreach ($this->listeners[$event::class] as $listener) {
$listener->update($event);
}
}
}Cas d'usage : Pour decoupler les actions : apres la creation d'un compte, envoyer un email, creer un log, notifier l'admin.
Espace colorimétrique perceptuellement uniforme basé sur la luminosité (L), la chrominance (C) et la teinte (H). Modifier une dimension ne change pas la perception des autres, contrairement à HSL.
Comme un nuancier professionnel où chaque crayon a exactement la même luminosité perçue, contrairement à HSL.
:root {
--primary: oklch(0.6 0.2 250); /* bleu */
--success: oklch(0.6 0.2 145); /* vert, même luminosité */
--danger: oklch(0.6 0.2 25); /* rouge, même luminosité */
}Cas d'usage : Construire une palette de couleurs harmonieuse avec une luminosité perçue constante entre teintes.
Utility type qui cree un nouveau type en excluant certaines proprietes. Inverse de Pick — on retire au lieu de selectionner.
Comme un menu sans allergenes — on retire les ingredients problematiques et on garde le reste.
interface User { id: string; name: string; password: string }
type SafeUser = Omit<User, "password">;
// { id: string; name: string }Cas d'usage : Exclure des champs sensibles (password, token) des types de reponse API.
Utility type qui retire le parametre this d'une signature de fonction. Produit une fonction callable sans contexte specifique.
Comme detacher un badge nominatif d'un uniforme — la fonction devient anonyme et utilisable par tous.
function greet(this: { name: string }) {
return this.name;
}
type Plain = OmitThisParameter<typeof greet>;
// () => string
const fn: Plain = greet.bind({ name: "A" });Cas d'usage : Exposer des methodes liees (bound) qui n'ont plus besoin de contexte this explicite.
Variante de Clean Architecture avec des couches concentriques : Domain Model, Domain Services, Application Services, Infrastructure. Dependances vers le centre.
Les couches d'un oignon : chaque couche ne connait que celle juste en dessous, le coeur est pur.
// Couches de l'interieur vers l'exterieur
// 1. Domain: Entity, ValueObject
// 2. Domain Services: business rules
// 3. Application: use cases, orchestration
// 4. Infrastructure: DB, HTTP, messagingCas d'usage : Applications enterprise avec logique metier complexe et multiple integrations.
Types dont la structure interne est masquee aux consommateurs. Seul le module createur peut construire et inspecter la valeur. Variante plus stricte des branded types.
Comme une boite noire scellée — on sait ce qu'elle represente mais seul le fabricant peut l'ouvrir.
declare const __opaque: unique symbol;
type Opaque<T, K> = T & { [__opaque]: K };
type Token = Opaque<string, "Token">;
const createToken = (s: string): Token => s as Token;Cas d'usage : Encapsuler des tokens, identifiants ou valeurs validees pour empecher la manipulation directe.
Extension native qui met en cache le bytecode compile des scripts PHP en memoire partagee, eliminant la recompilation a chaque requete. Gain de 30-70% de performance.
Comme memoriser une recette au lieu de la relire a chaque fois qu'on cuisine le meme plat.
; php.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0 ; prod onlyCas d'usage : Obligatoire en production, c'est le premier levier de performance PHP.
Les entites logicielles doivent etre ouvertes a l'extension mais fermees a la modification. On ajoute du comportement sans toucher au code existant.
Comme une multiprise : on peut brancher de nouveaux appareils sans modifier l'installation electrique.
interface Discount {
public function calculate(float $price): float;
}
class StudentDiscount implements Discount {
public function calculate(float $price): float {
return $price * 0.8;
}
}
// Ajout sans modifier le code existantCas d'usage : Quand un systeme doit evoluer frequemment : nouveaux types de paiement, nouvelles regles metier.
Couche d'identité construite sur OAuth2 qui ajoute l'authentification. Retourne un ID Token (JWT) contenant les informations de l'utilisateur en plus de l'access token.
OAuth2 dit 'cette personne a le droit d'entrer', OpenID Connect ajoute 'et voici sa carte d'identité'.
// ID Token decoded payload
{
"sub": "user-123",
"name": "Alice Martin",
"email": "alice@example.com",
"iss": "https://auth.example.com",
"aud": "my-app-client-id",
"exp": 1700000000
}Cas d'usage : Implémenter un SSO (Single Sign-On) d'entreprise avec identification fiable de l'utilisateur.
Operations Log, collection cappee speciale qui enregistre chronologiquement toutes les operations de modification. Les secondaries la repliquent pour rester synchronises avec le primary.
Un journal de bord du capitaine : chaque manoeuvre est notee pour que l'equipage suivant puisse reproduire le trajet.
// Consulter l'oplog
use local;
db.oplog.rs.find().sort({ $natural: -1 }).limit(5);Cas d'usage : Implementer des Change Streams, debugger la replication ou faire du point-in-time recovery.
Pattern combinant useOptimistic et useFormStatus pour afficher immediatement le resultat d'une soumission de formulaire avant la confirmation serveur.
Comme un tchat ou ton message s'affiche instantanement avec une horloge, puis la coche de confirmation arrive du serveur.
function TodoForm({ addTodo }) {
const [optimistic, setOptimistic] = useOptimistic(todos);
async function action(formData) {
setOptimistic(prev => [...prev, { text: formData.get('text'), pending: true }]);
await addTodo(formData);
}
return <form action={action}><input name="text" /><SubmitBtn /></form>;
}Cas d'usage : Formulaires ou la latence percue nuit a l'UX : chat, commentaires, listes de taches.
Technique qui met a jour l'UI immediatement avant la confirmation serveur, puis annule en cas d'echec. Ameliore la perception de vitesse.
Comme celebrer un but avant la validation VAR : si le but est annule, on revient a l'etat precedent.
useMutation({
mutationFn: updateTodo,
onMutate: async (newTodo) => {
await queryClient.cancelQueries({ queryKey: ['todos'] });
const prev = queryClient.getQueryData(['todos']);
queryClient.setQueryData(['todos'], old => [...old, newTodo]);
return { prev };
},
onError: (_, __, ctx) => queryClient.setQueryData(['todos'], ctx.prev),
});Cas d'usage : Actions utilisateur frequentes (like, toggle, reorder) ou la latence reseau degrade l'UX.
Depuis ES2019, le parametre du catch est optionnel. Utile quand l'erreur n'est pas necessaire dans le traitement.
Savoir qu'il y a eu un probleme sans avoir besoin de lire le rapport detaille.
try {
JSON.parse(input);
} catch {
// pas besoin de (err)
return defaultValue;
}Cas d'usage : Cas ou on veut juste ignorer l'erreur et fournir un fallback sans logger.
Operateur ?. qui court-circuite a undefined si la valeur a gauche est null/undefined. Fonctionne sur les proprietes, methodes et acces dynamiques.
Frapper a une porte : si personne ne repond (?.), tu passes ton chemin au lieu de defoncer la porte (TypeError).
const city = user?.address?.city;
const result = obj?.method?.();
const val = arr?.[0]?.name;Cas d'usage : Acceder a des proprietes de donnees API incertaines sans multiplier les verifications if.
Dependances marquees @Optional() qui ne causent pas d'erreur si elles ne sont pas enregistrees. Le provider recoit undefined si absent.
Comme commander un burger avec 'fromage en option' : si y'en a pas, tu recois quand meme ton burger.
@Injectable()
export class NotificationService {
constructor(
@Optional() @Inject('SMS_SERVICE')
private sms?: SmsService,
) {}
}Cas d'usage : Implementer des fonctionnalites optionnelles comme les notifications SMS qui ne sont pas toujours configurees.
Systeme de stockage cle-valeur dans la table wp_options. Sert pour les reglages du site, des plugins et des themes. Les options autoload=yes sont chargees a chaque requete.
Comme un fichier de configuration central ou chaque plugin note ses preferences.
// Stocker
update_option('mon_plugin_api_key', $key);
// Recuperer
$key = get_option('mon_plugin_api_key', 'default');
// Supprimer
delete_option('mon_plugin_api_key');Cas d'usage : Pour stocker les parametres de configuration du site, des plugins et des themes.
Ecrit les evenements dans une table outbox dans la meme transaction que les donnees metier. Un processus separe lit et publie ces evenements.
La boite 'courrier depart' au bureau : tu deposes ta lettre, et le facteur passe la relever plus tard.
await db.transaction(async (tx) => {
await tx.insert('orders', order);
await tx.insert('outbox', {
event: 'OrderCreated', payload: order
});
});Cas d'usage : Garantir la coherence entre l'etat local et les evenements publies en microservices.
Composant React Router qui rend la route enfant correspondante dans un layout parent, permettant des layouts imbriques partageant du UI commun.
Comme un cadre photo dans un salon : le salon (layout) reste, mais la photo (enfant) change selon la page.
function Layout() {
return (
<div>
<Navbar />
<main><Outlet /></main> {/* route enfant ici */}
<Footer />
</div>
);
}Cas d'usage : Layouts partages (sidebar, header, footer) avec du contenu qui change selon la route active.
Echappement des donnees au moment de l'affichage selon le contexte (HTML, attribut, URL, JS). Derniere ligne de defense contre le XSS.
Comme emballer un colis fragile avant l'envoi : on protege le contenu en fonction de la destination.
// Contexte HTML
echo htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
// Contexte URL
echo urlencode($data);
// Contexte JS
echo json_encode($data);Cas d'usage : A chaque affichage de donnees dynamiques, adapte au contexte de sortie.
Plusieurs signatures de fonction declarees avant l'implementation pour decrire differentes combinaisons d'arguments/retours. L'implementation doit etre compatible avec toutes.
Comme un restaurant avec differents menus selon le nombre de convives — meme cuisine, mais offres distinctes.
function parse(input: string): number;
function parse(input: number): string;
function parse(input: string | number) {
return typeof input === "string"
? parseInt(input) : input.toString();
}Cas d'usage : APIs avec des relations precises entre types d'entree et de sortie (createElement, addEventListener).
Methode du TestingModule pour remplacer un guard par une implementation permissive dans les tests. Permet de tester les handlers sans authentification.
Comme desactiver le badge d'acces pendant les tests incendie pour que tout le monde puisse circuler.
const module = await Test.createTestingModule({
imports: [AppModule],
}).overrideGuard(AuthGuard)
.useValue({ canActivate: () => true })
.compile();Cas d'usage : Tester les endpoints proteges sans avoir a generer de vrais tokens JWT.
Methode du TestingModule pour remplacer un provider par un mock ou une implementation alternative dans les tests.
Comme remplacer un acteur par sa doublure pour une scene dangereuse : le role est le meme, l'implementation change.
const module = await Test.createTestingModule({
imports: [UserModule],
}).overrideProvider(UserService)
.useValue({ findAll: jest.fn().mockResolvedValue([]) })
.compile();Cas d'usage : Mocker les services de base de donnees ou les APIs externes dans les tests d'integration.
Classification des 10 risques de sécurité web les plus critiques, mise à jour régulièrement. Inclut injection, broken auth, XSS, SSRF, etc.
Le top 10 des erreurs les plus courantes au code de la route : les connaître évite 90% des accidents.
// A03:2021 Injection - Prevention
const user = await db.query(
'SELECT * FROM users WHERE id = $1', // Parameterized
[userId] // Never concatenate!
);Cas d'usage : Checklist de sécurité obligatoire lors de l'audit ou de la revue de code d'une application web.
Classes p-* et m-* pour controler le padding et la marge. Variantes directionnelles (px, py, pt, pr, pb, pl) et valeurs negatives (-m-*).
Le padding c'est le rembourrage dans un colis, la marge c'est l'espace entre les colis sur l'etagere.
<div class="p-6 m-4">
<div class="px-4 py-2 mt-2 -ml-1">
Padding horizontal 1rem, vertical 0.5rem
</div>
</div>Cas d'usage : Controler l'espacement interne et externe de chaque element dans le layout.
Pattern pour retourner les resultats par pages via offset/limit ou cursor-based. Evite de charger des milliers d'enregistrements en une seule requete.
Comme un livre avec des pages : tu lis page par page au lieu de tout le livre d'un coup.
async findAll(page = 1, limit = 10) {
const [items, total] = await this.repo.findAndCount({
skip: (page - 1) * limit,
take: limit,
});
return { items, total, page, lastPage: Math.ceil(total / limit) };
}Cas d'usage : Toute API de liste doit etre paginee pour eviter les reponses massives et les timeouts.
Framework CSS-in-JS zero-runtime avec une DX proche de Chakra UI. Genere du CSS atomique au build a partir d'une syntaxe objet. Supporte les patterns et recipes.
Le successeur spirituel de Chakra UI mais sans poids JavaScript : meme confort, zero runtime.
import { css } from '../styled-system/css'
const styles = css({
display: 'flex',
bg: 'blue.500',
p: '4',
_hover: { bg: 'blue.600' },
md: { p: '8' },
})
<div className={styles}>Panda CSS</div>Cas d'usage : Alternative zero-runtime a Chakra UI avec des tokens, patterns et recipes au build.
Fonctionnalite Next.js App Router qui permet de rendre plusieurs pages simultanement dans le meme layout via des slots nommes (@slot).
Comme un ecran divise en deux sur ta TV : tu regardes deux chaines en meme temps dans le meme cadre.
// app/layout.tsx
export default function Layout({ children, analytics, team }) {
return (
<div>
{children}
{analytics} {/* @analytics/page.tsx */}
{team} {/* @team/page.tsx */}
</div>
);
}Cas d'usage : Dashboards avec plusieurs panneaux independants, modales comme routes, vues conditionnelles.
Utility type qui extrait les types des parametres d'une fonction sous forme de tuple. Permet de reutiliser la signature d'une fonction.
Comme photographier les ingredients d'un chef pour reproduire sa recette exactement.
function greet(name: string, age: number) {}
type Args = Parameters<typeof greet>;
// [string, number]
const args: Args = ["Alice", 30];Cas d'usage : Wrapper des fonctions existantes ou creer des decorateurs qui preservent la signature.
Fixer un ou plusieurs arguments d'une fonction pour creer une nouvelle fonction avec moins de parametres. Contrairement au currying, on peut fixer plusieurs arguments d'un coup.
Pre-remplir une partie d'un formulaire : les champs fixes ne changent plus, tu ne remplis que le reste.
const multiply = (a, b) => a * b;
const double = multiply.bind(null, 2);
double(5); // 10
// Ou sans bind
const partial = (fn, ...fixed) =>
(...args) => fn(...fixed, ...args);Cas d'usage : Creer des variantes de fonctions utilitaires (logger avec prefix, requetes avec base URL).
Index cree avec une clause WHERE qui n'indexe qu'un sous-ensemble des lignes de la table. Plus petit et plus rapide qu'un index complet.
Un annuaire qui ne liste que les medecins de garde, pas tous les medecins de la ville.
CREATE INDEX idx_active_users
ON users (email)
WHERE status = 'active';Cas d'usage : Optimiser les requetes qui filtrent toujours sur la meme condition, comme les utilisateurs actifs.
Fonctionnalite Next.js experimentale combinant une coquille statique (servie depuis le CDN) avec des trous dynamiques remplis en streaming. Le meilleur des deux mondes.
Comme un journal avec des encarts pub personnalises : le journal est imprime d'avance, mais les pubs changent par lecteur.
// La coquille statique est pre-rendue
// Les parties dynamiques sont wrappees dans Suspense
export default function Page() {
return (
<StaticHeader />
<Suspense fallback={<CartSkeleton />}>
<DynamicCart /> {/* stream dynamique */}
</Suspense>
);
}Cas d'usage : Pages e-commerce avec header statique rapide et panier/prix dynamiques streames.
Utility type qui rend toutes les proprietes d'un type optionnelles. Equivalent a ajouter ? a chaque propriete.
Comme un formulaire ou aucun champ n'est obligatoire — remplissez ce que vous voulez.
interface User { name: string; age: number }
function update(id: string, data: Partial<User>) {
// data.name et data.age sont optionnels
}
update("1", { name: "Alice" }); // OKCas d'usage : Fonctions de mise a jour partielle (PATCH) ou options de configuration avec des valeurs par defaut.
Fichiers Sass prefixes par _ qui ne sont pas compiles individuellement. Ils sont importes dans un fichier principal pour organiser le code en modules.
Des chapitres d'un livre : chacun existe separement mais ils sont assembles dans un volume final.
// _variables.scss
$primary: #3498db;
// _buttons.scss
.btn { background: $primary; }
// main.scss
@use 'variables';
@use 'buttons';Cas d'usage : Organiser un projet CSS en fichiers thematiques (variables, mixins, composants).
Standard d'authentification sans mot de passe utilisant la cryptographie asymétrique. La clé privée reste sur l'appareil de l'utilisateur, seule la clé publique est stockée côté serveur.
Un verrou qui ne reconnaît que votre empreinte digitale : impossible à copier, rien à retenir.
const credential = await navigator.credentials.create({
publicKey: {
challenge: serverChallenge,
rp: { name: 'MyApp' },
user: { id: userId, name: email, displayName: name },
pubKeyCredParams: [{ alg: -7, type: 'public-key' }],
}
});Cas d'usage : Remplacer les mots de passe par une authentification résistante au phishing sur mobile et desktop.
Librairie d'authentification integree via @nestjs/passport. Fournit un systeme de strategies (JWT, Local, OAuth2) avec des guards dedies.
Comme un systeme de verification d'identite multi-documents : passeport, carte d'identite ou badge selon le contexte.
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}
@Controller('profile')
export class ProfileController {
@UseGuards(JwtAuthGuard)
@Get()
getProfile(@Request() req) { return req.user; }
}Cas d'usage : Implementer l'authentification avec support multi-strategies dans une API NestJS.
Fonctions natives PHP pour hasher et verifier des mots de passe de maniere securisee. Utilise bcrypt par defaut avec salt automatique.
Comme une empreinte digitale : on peut verifier que c'est la bonne personne sans stocker son doigt.
// Stockage
$hash = password_hash($password, PASSWORD_DEFAULT);
// Verification
if (password_verify($inputPassword, $hash)) {
echo 'Mot de passe correct';
}Cas d'usage : Pour tout systeme d'authentification qui stocke des mots de passe.
Limites maximales définies pour les métriques de performance (taille JS < 200KB, LCP < 2.5s). Bloque le build ou alerte quand les budgets sont dépassés.
Un budget financier pour les courses : si vous dépassez, vous devez retirer un article avant de passer en caisse.
// bundlesize config or CI check
{
"budgets": [
{ "path": "dist/*.js", "maxSize": "200kB" },
{ "path": "dist/*.css", "maxSize": "50kB" },
{ "metric": "LCP", "max": 2500 }
]
}Cas d'usage : Empêcher la régression de performance en intégrant des garde-fous dans le pipeline CI/CD.
API qui observe les entrees de la Performance Timeline (paint, navigation, resource, longtask, etc.). Permet de collecter les metriques Web Vitals de maniere non-bloquante.
Un chronometre automatique qui enregistre les temps de chaque etape d'une course sans que les coureurs s'arretent.
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach(entry => {
console.log(entry.name, entry.duration);
});
});
observer.observe({ type: 'largest-contentful-paint',
buffered: true });Cas d'usage : Mesurer LCP, FID, CLS en production, monitoring RUM (Real User Monitoring).
Framework de test PHP moderne construit sur PHPUnit, avec une syntaxe expressive inspiree de Jest. Offre arch testing, parallel testing et une DX superieure.
Comme PHPUnit avec un lifting : meme moteur puissant, mais un interieur plus agreable et moderne.
test('cart total applies discount', function () {
$cart = new Cart();
$cart->add(new Product(price: 100));
$cart->applyDiscount(10);
expect($cart->total())->toBe(90);
});Cas d'usage : Pour les equipes qui veulent une syntaxe de test plus lisible et productive.
pg_dump exporte une base en SQL ou en format custom. pg_restore reimporte un dump au format custom. Ensemble, ils permettent les backups et les migrations.
pg_dump = photocopier tous les dossiers du bureau. pg_restore = reclasser les photocopies dans un nouveau bureau.
pg_dump -Fc -U postgres mydb > backup.dump
pg_restore -U postgres -d newdb backup.dumpCas d'usage : Sauvegarder une base avant une migration, cloner un environnement de production en staging.
Extension qui collecte les statistiques d'execution de toutes les requetes SQL : nombre d'appels, temps moyen, lignes retournees. Essentielle pour le monitoring en prod.
Un compteur de performances pour chaque requete, comme un tableau de bord de Formule 1.
CREATE EXTENSION pg_stat_statements;
SELECT query, calls, mean_exec_time,
rows
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;Cas d'usage : Identifier les requetes les plus lentes ou les plus frequentes pour optimiser la base en production.
Extension qui fournit la recherche par similarite basee sur les trigrammes. Permet la recherche floue (fuzzy matching) et le LIKE/ILIKE rapide grace aux index GIN ou GiST.
Un correcteur orthographique integre a ta base de donnees : il trouve 'PostgreSQL' meme si tu tapes 'Postgre'.
CREATE EXTENSION pg_trgm;
CREATE INDEX idx_trgm ON users
USING gin (name gin_trgm_ops);
SELECT * FROM users
WHERE name % 'Alic'
ORDER BY similarity(name, 'Alic') DESC;Cas d'usage : Implementer une barre de recherche tolerante aux fautes de frappe sans Elasticsearch.
Extension fournissant des fonctions de chiffrement : gen_random_uuid(), crypt() pour le hashing de mots de passe, pgp_sym_encrypt/decrypt pour le chiffrement symetrique.
Un coffre-fort integre directement dans la base de donnees.
CREATE EXTENSION pgcrypto;
-- UUID
SELECT gen_random_uuid();
-- Hash password
SELECT crypt('password', gen_salt('bf'));Cas d'usage : Generer des UUIDs ou hasher des mots de passe directement dans la base sans code applicatif.
Types parametriques dont le parametre generique n'est pas utilise dans la structure mais sert de marqueur compile-time. Ajoutent de l'information de type sans cout runtime.
Comme un tampon invisible sur un billet — l'oeil nu ne le voit pas mais le scanner le detecte.
type Validated = { __validated: true };
type Raw = { __raw: true };
type Email<T> = string & { __phantom: T };
function validate(e: Email<Raw>): Email<Validated> {
if (!e.includes("@")) throw Error("Invalid");
return e as Email<Validated>;
}Cas d'usage : Marquer les etapes de validation (raw -> sanitized -> validated) au niveau du systeme de types.
Cryptographe americain, createur de PGP (Pretty Good Privacy). Il a ete poursuivi par le gouvernement americain pour avoir rendu le chiffrement fort accessible au grand public.
Le Robin des Bois de la crypto : il a donne au peuple le droit de chiffrer ses messages, au grand dam des gouvernements.
# PGP — Phil Zimmermann, 1991
# Chiffrement asymetrique pour tous
$ gpg --gen-key
$ gpg --encrypt --recipient bob@mail.com secret.txt
$ gpg --decrypt secret.txt.gpg
# Vie privee = droit fondamentalCas d'usage : PGP et GPG sont toujours utilises pour signer des commits Git et chiffrer des emails.
Analyseur statique qui detecte les bugs sans executer le code. Verifie les types, les appels de methodes, les proprietes inexistantes et plus selon le niveau configure (0-9).
Comme un correcteur orthographique pour le code : il repere les erreurs avant la publication.
# phpstan.neon
parameters:
level: 8
paths:
- src
# Commande
# vendor/bin/phpstan analyseCas d'usage : En CI/CD pour detecter les bugs de type et les erreurs logiques avant le deploiement.
Framework de tests unitaires standard en PHP. Fournit assertions, mocks, data providers, couverture de code et integration CI.
Comme un laboratoire de controle qualite qui verifie chaque piece avant l'assemblage final.
class CartTest extends TestCase {
public function test_total_with_discount(): void {
$cart = new Cart();
$cart->add(new Product(price: 100));
$cart->applyDiscount(10);
$this->assertEquals(90, $cart->total());
}
}Cas d'usage : Pour tester toute logique metier et garantir la non-regression a chaque changement.
Utility type qui extrait un sous-ensemble de proprietes d'un type existant. Cree un nouveau type avec seulement les cles specifiees.
Comme choisir des ingredients dans un buffet — on ne prend que ce dont on a besoin.
interface User { id: string; name: string; email: string }
type UserPreview = Pick<User, "id" | "name">;
// { id: string; name: string }Cas d'usage : Creer des DTOs legers pour les listes ou les reponses API partielles.
L'élément <picture> avec <source> permet de servir différentes images selon le format supporté, la taille d'écran ou la densité de pixels. Le navigateur choisit la meilleure option automatiquement.
Comme un restaurant qui adapte la taille des portions selon l'appétit du client.
<picture>
<source srcset="img.avif" type="image/avif">
<source srcset="img.webp" type="image/webp">
<source media="(min-width: 800px)" srcset="lg.jpg">
<img src="fallback.jpg" alt="Description">
</picture>Cas d'usage : Servir des images modernes (AVIF, WebP) avec fallback et adapter la résolution au viewport.
Classe implementant PipeTransform qui valide ou transforme les donnees entrantes avant qu'elles atteignent le handler. Fonctionne avec class-validator.
Comme un filtre a eau : l'eau (donnees) passe a travers et seule l'eau propre (valide) continue.
@Injectable()
export class ParseIntPipe implements PipeTransform {
transform(value: string): number {
const val = parseInt(value, 10);
if (isNaN(val)) throw new BadRequestException('Not a number');
return val;
}
}Cas d'usage : Valider les DTOs entrants avec class-validator ou transformer les parametres de route.
Suite automatisée d'étapes (build, test, deploy) déclenchée par un événement (push, PR). CI = intégration continue, CD = déploiement/livraison continue.
Une chaîne de montage automobile : chaque poste vérifie et ajoute quelque chose avant le contrôle final.
# GitHub Actions
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
- run: npm run buildCas d'usage : Automatiser les tests et le déploiement à chaque commit pour livrer plus vite et plus sûrement.
Option TanStack Query qui fournit des donnees temporaires pendant le chargement initial, sans les stocker dans le cache. Evite le flash de loading.
Comme une maquette de vitrine : elle montre la disposition avant que les vrais produits arrivent.
useQuery({
queryKey: ['user', userId],
queryFn: () => fetchUser(userId),
placeholderData: (previousData) => previousData,
// ou: placeholderData: { name: 'Chargement...', email: '' }
});Cas d'usage : Afficher les donnees precedentes pendant une transition entre pages ou profils utilisateur.
Selecteurs virtuels prefixes par % qui ne sont compiles que s'ils sont etendus via @extend. Evitent de generer du CSS inutile contrairement aux classes classiques.
Un plan d'architecte : il n'existe pas physiquement, mais tout batiment qui l'utilise herite de sa structure.
%flex-center {
display: flex;
align-items: center;
justify-content: center;
}
.hero { @extend %flex-center; height: 100vh; }
.modal { @extend %flex-center; }Cas d'usage : Partager des styles communs entre selecteurs sans generer de classe CSS inutilisee.
Framework de test E2E par Microsoft supportant Chromium, Firefox et WebKit avec auto-wait, traces et parallelisme natif. Plus puissant que Cypress pour le multi-navigateur.
Comme un pilote automatique polyglotte : il conduit sur Chrome, Firefox et Safari avec la meme aisance.
// login.spec.ts
import { test, expect } from '@playwright/test';
test('login flow', async ({ page }) => {
await page.goto('/login');
await page.fill('#email', 'alice@test.com');
await page.fill('#password', 'secret');
await page.click('button[type=submit]');
await expect(page).toHaveURL('/dashboard');
});Cas d'usage : Pour les tests E2E necessitant du multi-navigateur, du parallelisme avance ou de la capture de traces.
Fonction reutilisable qui ajoute des fonctionnalites a un schema ou a tous les schemas globalement. Permet d'encapsuler des comportements comme le soft-delete, la pagination ou l'audit.
Une extension pour navigateur : tu l'installes une fois et tous tes onglets en beneficient.
function timestampPlugin(schema) {
schema.add({ createdAt: Date, updatedAt: Date });
schema.pre('save', function() {
this.updatedAt = new Date();
});
}
mongoose.plugin(timestampPlugin);Cas d'usage : Partager des comportements communs entre plusieurs schemas sans dupliquer le code.
Ensemble de fonctions et conventions permettant de creer des extensions WordPress. Inclut l'activation, la desactivation, les hooks, les settings et les shortcodes.
Comme le kit de developpement d'une console de jeux : il fournit les outils pour creer des jeux compatibles.
/*
* Plugin Name: Mon Plugin
* Version: 1.0
*/
register_activation_hook(__FILE__, function() {
// Setup: tables, options, roles
});
add_action('init', 'mon_plugin_init');Cas d'usage : Pour etendre WordPress avec des fonctionnalites personnalisees de facon maintenable et upgradable.
Systeme d'extension qui permet d'ajouter de nouvelles utilitaires, composants ou variantes a Tailwind. Les plugins officiels incluent typography, forms, aspect-ratio.
Des extensions de navigateur : elles ajoutent des fonctionnalites sans modifier le coeur du logiciel.
// Plugin custom
const plugin = require('tailwindcss/plugin')
module.exports = plugin(({ addUtilities }) => {
addUtilities({
'.text-shadow': {
textShadow: '2px 2px 4px rgba(0,0,0,0.1)'
}
})
})Cas d'usage : Ajouter des utilitaires manquantes ou integrer un systeme de design custom dans Tailwind.
Gestionnaire de paquets rapide et economique en espace disque grace a un store global et des liens symboliques. Strict par defaut, empechant l'acces aux dependances fantomes.
Comme une bibliotheque municipale : un seul exemplaire de chaque livre, et chaque habitant y accede par reference plutot que par copie.
pnpm install # install deps
pnpm add express # ajouter une dep
pnpm add -D vitest # dep de dev
pnpm run test # lancer un script
pnpm dlx create-next-app # equivalent npx
pnpm --filter @app/web test # monorepoCas d'usage : Pour les monorepos et les projets avec beaucoup de dependances, offrant rapidite et rigueur.
Fonctionnalité native de pnpm pour gérer un monorepo avec symlinks et content-addressable store. Économise l'espace disque en partageant les dépendances identiques.
Une bibliothèque partagée où chaque bureau a un raccourci vers le livre au lieu d'une copie complète.
# pnpm-workspace.yaml
packages:
- 'apps/*'
- 'packages/*'
# Using workspace protocol
{ "dependencies": { "@myorg/ui": "workspace:*" } }Cas d'usage : Structurer un monorepo avec gestion efficace des dépendances partagées et résolution rapide.
Plus petite unité déployable dans Kubernetes, regroupant un ou plusieurs conteneurs partageant réseau et stockage. Éphémère par nature.
Une cabine de bateau partagée : les occupants (conteneurs) partagent la même adresse (IP) et le même espace de rangement.
apiVersion: v1
kind: Pod
metadata:
name: mon-api
spec:
containers:
- name: api
image: mon-app:1.0
ports:
- containerPort: 3000Cas d'usage : Unité de base gérée par les Deployments, jamais créée directement en prod.
Composants qui peuvent changer leur element HTML racine via une prop 'as' ou 'component', tout en conservant un typage TypeScript correct.
Comme un costume transformable : le meme vetement peut devenir veste, gilet ou manteau selon le bouton presse.
function Box<C extends React.ElementType = 'div'>(
{ as, children, ...props }: { as?: C } & React.ComponentPropsWithoutRef<C>
) {
const Component = as || 'div';
return <Component {...props}>{children}</Component>;
}
<Box as="section">...</Box>
<Box as="a" href="/">Lien</Box>Cas d'usage : Design systems ou un meme composant stylise doit s'adapter a differents elements HTML semantiques.
Capacite d'objets de types differents a repondre au meme message (methode). Permet de traiter des objets differents de maniere uniforme via une interface commune.
Comme la touche Play : que ce soit Spotify, YouTube ou un CD, le resultat est de la musique.
interface Notifier {
public function send(string $msg): void;
}
class EmailNotifier implements Notifier { /* ... */ }
class SmsNotifier implements Notifier { /* ... */ }
function notify(Notifier $n, string $msg): void {
$n->send($msg); // fonctionne pour tout Notifier
}Cas d'usage : Pour ecrire du code generique qui fonctionne avec n'importe quelle implementation d'une interface.
API native HTML via l'attribut popover qui gère les popups, tooltips et menus sans JS. Le navigateur gère le positionnement dans la top layer, la fermeture au clic extérieur et l'accessibilité.
Comme une bulle de dialogue dans une BD : elle apparaît au-dessus de tout et disparaît quand on passe à la case suivante.
<button popovertarget="info">Aide</button>
<div id="info" popover>
<p>Informations utiles ici</p>
</div>
<!-- S'ouvre/ferme automatiquement, -->
<!-- se ferme au clic extérieur -->Cas d'usage : Créer des tooltips, dropdowns et menus contextuels sans dépendance JS ni bibliothèque de positionnement.
Methode qui remplace les ObjectId references par les documents complets de la collection liee. Equivalent d'un JOIN automatique gere par Mongoose.
Cliquer sur un lien hypertexte pour voir le contenu complet au lieu de juste le numero de reference.
const order = await Order
.findById(id)
.populate('customer', 'name email')
.populate('products');Cas d'usage : Charger les donnees liees (auteur d'un article, produits d'une commande) en une seule requete logique.
Permet de rendre un composant enfant dans un noeud DOM situe en dehors de la hierarchie du parent. Les evenements remontent toujours dans l'arbre React.
Comme un tunnel secret : le composant vit dans la maison React mais sort par une porte cachee dans un autre endroit du DOM.
import { createPortal } from 'react-dom';
function Modal({ children }) {
return createPortal(
<div className="modal">{children}</div>,
document.getElementById('modal-root')
);
}Cas d'usage : Modales, tooltips, menus deroulants qui doivent echapper au overflow:hidden du parent.
Outil de transformation CSS via plugins. Autoprefixer (ajout de prefixes vendeur) et Tailwind CSS sont ses plugins les plus connus. Babel equivalent pour le CSS.
Comme une chaine de montage pour le CSS : chaque plugin ajoute une transformation specifique a votre feuille de style.
// postcss.config.js
module.exports = {
plugins: [
require('tailwindcss'),
require('autoprefixer'),
require('cssnano')({ preset: 'default' }),
],
};Cas d'usage : Pour ajouter automatiquement les prefixes vendeur et optimiser le CSS en production.
Outil de transformation CSS via plugins. Pas un preprocesseur mais un pipeline : chaque plugin transforme le CSS (autoprefixer, nesting, custom properties). Tailwind est un plugin PostCSS.
Une chaine de montage : chaque poste (plugin) ajoute une transformation au CSS brut.
// postcss.config.js
module.exports = {
plugins: [
require('tailwindcss'),
require('autoprefixer'),
require('cssnano')({ preset: 'default' }),
]
}Cas d'usage : Configurer le pipeline de transformation CSS : prefixes, minification, Tailwind, nesting.
Extension qui ajoute le support des donnees geospatiales a PostgreSQL. Fournit des types (geometry, geography), des fonctions (ST_Distance, ST_Contains) et des index spatiaux.
Transformer PostgreSQL en GPS intelligent capable de calculer des distances et des zones sur une carte.
CREATE EXTENSION postgis;
SELECT name FROM restaurants
WHERE ST_DWithin(
location,
ST_MakePoint(2.35, 48.86)::geography,
1000
);Cas d'usage : Applications de cartographie, calcul de zones de livraison ou analyse geospatiale.
Fichier template (.github/pull_request_template.md) qui pre-remplit la description de chaque PR avec des sections standardisees (description, tests, screenshots, checklist).
Comme un formulaire medical pre-imprime : le medecin remplit les champs au lieu de partir d'une page blanche.
<!-- .github/pull_request_template.md -->
## Description
<!-- Quoi et pourquoi -->
## Type of change
- [ ] Bug fix
- [ ] New feature
## Tests
- [ ] Tests unitaires ajoutes
- [ ] Tests E2E mis a jourCas d'usage : Pour standardiser les PR et garantir que les reviewers ont toutes les informations necessaires.
Middleware execute avant chaque appel a document.save(). Permet de modifier le document (hashing, timestamps, validation custom) avant sa persistence en base.
Le dernier controle qualite sur la chaine de montage avant de mettre le produit en boite.
schema.pre('save', function(next) {
if (!this.slug) {
this.slug = this.title
.toLowerCase()
.replace(/\s+/g, '-');
}
next();
});Cas d'usage : Generer automatiquement un slug, un hash de mot de passe ou un timestamp a chaque sauvegarde.
Hook filter qui permet de modifier la requete principale de WordPress AVANT son execution. Le moyen le plus performant de personnaliser les listings.
Comme modifier la commande au restaurant avant qu'elle parte en cuisine, plutot que de renvoyer le plat.
add_action('pre_get_posts', function(WP_Query $query) {
if (!is_admin() && $query->is_main_query()) {
if ($query->is_home()) {
$query->set('posts_per_page', 6);
$query->set('post_type', ['post', 'tutorial']);
}
}
});Cas d'usage : Pour modifier le nombre de posts, le tri, les types affiches sur les pages d'archive et la home.
Methode de TanStack Query pour pre-charger des donnees en cache avant qu'elles ne soient necessaires, eliminant le temps de chargement visible.
Comme prechauffer le four avant d'enfourner : quand tu en as besoin, tout est deja pret.
// Prefetch au hover d'un lien
<Link
onMouseEnter={() => {
queryClient.prefetchQuery({
queryKey: ['user', userId],
queryFn: () => fetchUser(userId),
});
}}
/>Cas d'usage : Pre-charger les donnees de la prochaine page au survol d'un lien ou pendant un formulaire multi-etapes.
Option de config qui ajoute un prefixe a toutes les classes Tailwind generees. Evite les conflits avec du CSS existant ou d'autres frameworks.
Mettre une etiquette sur tes affaires a l'ecole pour ne pas les confondre avec celles des autres.
// tailwind.config.js
module.exports = {
prefix: 'tw-',
}
// Usage: <div class="tw-flex tw-p-4 tw-bg-blue-500">Cas d'usage : Integrer Tailwind dans un projet existant avec du CSS legacy sans conflits de noms.
Requetes SQL parametrees ou les valeurs sont envoyees separement du code SQL. Protection native contre les injections SQL.
Comme un formulaire pre-imprime avec des cases vides : la structure est fixe, seules les donnees changent.
$stmt = $pdo->prepare(
'INSERT INTO users (name, email) VALUES (:name, :email)'
);
$stmt->execute([
'name' => $name,
'email' => $email,
]);Cas d'usage : Pour CHAQUE requete SQL qui inclut des donnees variables, sans exception.
URL temporaire signée cryptographiquement qui donne un accès limité dans le temps à un objet S3. Permet l'upload/download direct sans exposer les credentials.
Un ticket de vestiaire avec date d'expiration : il donne accès à un seul casier pendant un temps limité.
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
const url = await getSignedUrl(s3, new PutObjectCommand({
Bucket: 'uploads',
Key: `docs/${fileId}`,
ContentType: 'application/pdf',
}), { expiresIn: 300 }); // 5 minCas d'usage : Permettre l'upload direct du navigateur vers S3 sans passer par votre serveur backend.
Formateur de code opinionne qui reformate automatiquement JS, TS, CSS, JSON, HTML et Markdown. Elimine les debats de style en imposant un format unique.
Comme un repasseur automatique pour vos vetements : peu importe comment vous les pliez, ils ressortent tous identiques.
// .prettierrc
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5"
}
// npx prettier --write .Cas d'usage : Pour standardiser automatiquement le formatage du code et eliminer les discussions de style en code review.
Contrainte qui garantit l'unicite et la non-nullite d'une ou plusieurs colonnes. Cree automatiquement un index B-tree unique. Chaque table ne peut avoir qu'une seule PK.
Le numero de securite sociale d'une ligne : unique, obligatoire et jamais vide.
CREATE TABLE users (
id SERIAL PRIMARY KEY
);
-- Composite
CREATE TABLE order_items (
order_id INT, product_id INT,
PRIMARY KEY (order_id, product_id)
);Cas d'usage : Identifier de maniere unique chaque ligne d'une table.
Methode de Prisma Client pour executer plusieurs operations en transaction atomique. Supporte le mode batch (tableau) et le mode interactif (callback).
Comme un contrat notarie : toutes les clauses s'appliquent ensemble ou le contrat est annule.
await this.prisma.$transaction(async (tx) => {
const user = await tx.user.create({ data: userData });
await tx.account.create({
data: { userId: user.id, balance: 0 },
});
});Cas d'usage : Garantir l'atomicite lors de la creation d'entites liees comme user + compte.
Client auto-genere et type-safe pour interagir avec la base de donnees. Fournit une API fluide avec autocompletion complete en TypeScript.
Comme un assistant personnel qui connait parfaitement ta base de donnees et te corrige en temps reel.
@Injectable()
export class UserService {
constructor(private prisma: PrismaService) {}
findAll() {
return this.prisma.user.findMany({
include: { posts: true },
});
}
}Cas d'usage : Effectuer des requetes type-safe avec autocompletion et validation au compile-time.
Systeme de migration genere automatiquement a partir des changements du schema Prisma. Cree des fichiers SQL versiones pour chaque modification.
Comme un photographe qui capture chaque modification de la maison pour pouvoir les rejouer ou annuler.
// Terminal
// npx prisma migrate dev --name add-user-role
// Genere: migrations/20240101_add_user_role/migration.sql
// ALTER TABLE "User" ADD COLUMN "role" TEXT DEFAULT 'user';Cas d'usage : Versionner et deployer les changements de schema en production avec Prisma.
Fichier schema.prisma qui definit les modeles, relations et source de donnees en SDL (Schema Definition Language). Genere le client type-safe.
Comme un plan de construction : tu dessines la structure et Prisma genere toute la plomberie automatiquement.
// schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
author User @relation(fields: [authorId], references: [id])
authorId Int
}Cas d'usage : Definir le schema de donnees de facon declarative et generer un client ORM type-safe.
Champs de classe prefixes par # veritablement prives (hard private). Non accessibles en dehors de la classe, meme par les sous-classes. Contrairement aux conventions _prefix.
Un coffre-fort dans ta chambre : meme les membres de ta famille ne peuvent pas l'ouvrir.
class Counter {
#count = 0;
increment() { this.#count++; }
get value() { return this.#count; }
}
const c = new Counter();
c.increment();
c.value; // 1
// c.#count; // SyntaxErrorCas d'usage : Encapsulation stricte dans les classes, protection des invariants internes.
Vérifications de santé Kubernetes. Liveness redémarre les Pods bloqués, Readiness retire du trafic les Pods non prêts, Startup gère les démarrages lents.
Liveness = vérifier que quelqu'un respire. Readiness = vérifier qu'il est habillé et prêt à travailler.
livenessProbe:
httpGet: { path: /health, port: 3000 }
periodSeconds: 10
readinessProbe:
httpGet: { path: /ready, port: 3000 }
initialDelaySeconds: 5Cas d'usage : Éviter d'envoyer du trafic à des Pods en cours de démarrage ou bloqués.
Composant React et onglet DevTools qui mesurent le cout de rendu d'un sous-arbre : frequence, duree et raison des re-rendus.
Comme un chronometre pour chaque coureur dans un relais : tu identifies qui ralentit l'equipe.
<Profiler id="Navigation" onRender={(id, phase, duration) => {
console.log(`${id} ${phase}: ${duration.toFixed(1)}ms`);
}}>
<Nav items={items} />
</Profiler>Cas d'usage : Identifier les composants les plus lents pour cibler les optimisations de performance.
Principe ou l'application fonctionne sans JavaScript (formulaires HTML natifs, liens) puis s'ameliore progressivement avec JS pour une meilleure UX.
Comme un escalier avec un escalator a cote : ca marche a pied (sans JS), mais c'est mieux avec le moteur (JS).
// Le formulaire fonctionne meme sans JS
<form action={serverAction} method="POST">
<input name="email" required />
<SubmitButton /> {/* desactive pendant l'envoi si JS actif */}
</form>Cas d'usage : Applications critiques (e-commerce, admin) qui doivent rester fonctionnelles meme si le JS echoue.
Systeme permettant de decomposer un gros projet en sous-projets TS avec des dependances explicites. Chaque sous-projet se compile independamment.
Comme un immeuble modulaire — chaque etage est construit separement puis assemble.
// tsconfig.json
{
"references": [
{ "path": "./packages/core" },
{ "path": "./packages/api" }
]
}
// Build: tsc --buildCas d'usage : Monorepos et gros projets ou la compilation complete est trop lente — chaque module compile isolement.
Mecanisme pour selectionner les champs a inclure ou exclure dans les resultats d'une requete. Reduit la quantite de donnees transferees du serveur au client.
Demander au serveur de ne te montrer que les colonnes 'nom' et 'prix' du menu, pas toute la carte.
db.users.find(
{ status: 'active' },
{ name: 1, email: 1, _id: 0 }
);Cas d'usage : Optimiser les performances en ne recuperant que les champs necessaires a l'affichage.
Objet representant le resultat futur d'une operation asynchrone. Peut etre pending, fulfilled ou rejected. Chainable via .then() et .catch().
Un ticket de pressing : tu deposes ton vetement, tu recois un ticket, et tu reviens le chercher quand c'est pret (ou on te previent si c'est perdu).
const getData = () => new Promise((resolve, reject) => {
setTimeout(() => resolve('data'), 100);
});
getData()
.then(data => console.log(data))
.catch(err => console.error(err));Cas d'usage : Gerer toute operation asynchrone : appels API, lecture de fichiers, timers.
Les rejections de Promise doivent etre catchees avec .catch() ou try/catch avec await. Les rejections non gerees declenchent unhandledrejection et peuvent crasher en Node.js.
Un filet sous le trapeze : sans lui (catch), la moindre chute (rejection) est fatale.
// Avec async/await
try {
const data = await fetchData();
} catch (err) {
handleError(err);
}
// Global fallback
window.addEventListener('unhandledrejection', (e) => {
reportError(e.reason);
});Cas d'usage : Toute chaine de promesses doit avoir un catch terminal pour eviter les rejections silencieuses.
Combinateurs de promesses : all (toutes reussies ou 1 echec), allSettled (toutes terminees), race (la premiere terminee), any (la premiere reussie). Essentiels pour le parallelisme.
all = tous les invites doivent arriver pour manger. race = on mange des que le premier arrive. any = on mange des qu'un invite avec le dessert arrive. allSettled = on attend que tout le monde ait repondu, oui ou non.
const [a, b] = await Promise.all([fetchA(), fetchB()]);
const results = await Promise.allSettled([p1, p2]);
const fastest = await Promise.race([p1, p2]);
const first = await Promise.any([p1, p2]);Cas d'usage : Paralleliser des appels API independants (all), tolerant aux echecs (allSettled), timeout (race).
Pattern qui fournit des fonctions (getInputProps, getToggleProps) retournant les props necessaires pour un element, fusionnant les props utilisateur avec celles du composant.
Comme un styliste qui te donne un ensemble complet : tu peux ajouter tes accessoires, il gere l'harmonie du tout.
function useSelect() {
const [isOpen, setOpen] = useState(false);
const getToggleProps = (userProps = {}) => ({
'aria-expanded': isOpen,
onClick: () => { userProps.onClick?.(); setOpen(!isOpen); },
...userProps,
});
return { isOpen, getToggleProps };
}
<button {...getToggleProps({ className: 'btn' })}>Toggle</button>Cas d'usage : Composants headless et librairies qui doivent gerer l'accessibilite tout en restant flexibles.
Approche de test ou au lieu de cas specifiques, on definit des proprietes que le code doit toujours respecter, et le framework genere automatiquement des centaines d'entrees aleatoires.
Comme dire a un crash-test 'la voiture doit proteger le passager peu importe l'angle de l'impact' plutot que tester 3 angles specifiques.
// fast-check
import fc from 'fast-check';
test('sort is idempotent', () => {
fc.assert(
fc.property(fc.array(fc.integer()), (arr) => {
const sorted = arr.sort();
expect(sorted.sort()).toEqual(sorted);
})
);
});Cas d'usage : Pour les fonctions pures et les algorithmes ou les edge cases sont difficiles a anticiper manuellement.
Donnees passees d'un composant parent a un composant enfant, en lecture seule. C'est le mecanisme principal de communication descendante.
Comme les ingredients donnes a un cuisinier : il les utilise mais ne les modifie pas pour le fournisseur.
function Card({ title, children }) {
return (
<div className="card">
<h2>{title}</h2>
{children}
</div>
);
}
<Card title="Bienvenue">Contenu ici</Card>Cas d'usage : Rendre un composant reutilisable en parametrant son comportement et son contenu.
Technique utilisant les props du composant pour modifier dynamiquement les styles. Permet de creer des variantes sans classes CSS supplementaires.
Commander un cafe : tu dis 'grand, lait, sans sucre' et le barista adapte la recette.
const Button = styled.button`
padding: ${({ $size }) => $size === 'lg' ? '1rem 2rem' : '0.5rem 1rem'};
background: ${({ $variant }) =>
$variant === 'danger' ? 'red' : 'blue'};
opacity: ${({ disabled }) => disabled ? 0.5 : 1};
`
// <Button $size="lg" $variant="danger" />Cas d'usage : Creer des composants avec plusieurs variantes (taille, couleur, etat) pilotees par les props.
Modele d'heritage de JS ou les objets heritent directement d'autres objets via la prototype chain, contrairement a l'heritage classique par classes. Les classes ES6 sont du sucre syntaxique dessus.
Photocopier un document et modifier la copie : l'original reste intact, et tu peux toujours te referer a lui.
function Vehicle(type) { this.type = type; }
Vehicle.prototype.describe = function() {
return `I am a ${this.type}`;
};
const car = new Vehicle('car');
car.describe(); // 'I am a car'Cas d'usage : Creer des hierarchies d'objets legeres sans le cout d'un systeme de classes complet.
Cree de nouveaux objets en clonant une instance existante plutot qu'en la construisant from scratch. Utile quand la creation est couteuse.
Photocopier un document modele puis modifier juste le nom et la date sur chaque copie.
const baseConfig = { theme: 'dark', lang: 'fr' };
const userConfig = { ...baseConfig, lang: 'en' };
// Ou: structuredClone(baseConfig);Cas d'usage : Cloner des objets de configuration ou des entites de jeu avec des etats precalcules.
Chaine de prototypes par laquelle JS recherche les proprietes et methodes. Chaque objet a un [[Prototype]] interne qui pointe vers un autre objet, jusqu'a null.
L'arbre genealogique : si tu ne sais pas cuisiner, tu demandes a ta mere, puis a ta grand-mere, en remontant les generations.
const animal = { eat() { return true; } };
const dog = Object.create(animal);
dog.bark = () => 'Woof';
dog.eat(); // true (remonte la chaine)
dog.bark(); // 'Woof' (propre)Cas d'usage : Comprendre l'heritage en JS, le fonctionnement de class/extends, et optimiser la recherche de proprietes.
Toute classe injectable dans le systeme DI de NestJS via @Injectable. Les services, repositories, factories et helpers sont tous des providers.
Comme un artisan dans une cooperative : il offre ses competences et peut etre appele par quiconque en a besoin.
@Injectable()
export class LoggerService {
log(message: string) {
console.log(`[LOG] ${message}`);
}
}Cas d'usage : Encapsuler la logique metier, l'acces aux donnees ou tout service reutilisable dans l'application.
Pattern qui utilise Context.Provider pour fournir des donnees ou des services a un sous-arbre de composants, sans prop drilling.
Comme le Wi-Fi d'un batiment : tous les appareils dans la zone y accedent sans cable direct.
function ThemeProvider({ children }) {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
);
}
// Usage: <ThemeProvider><App /></ThemeProvider>Cas d'usage : Fournir des services globaux (theme, i18n, auth, feature flags) a toute l'application.
Objet qui encapsule un autre objet et intercepte les operations fondamentales (get, set, has, delete, etc.) via des traps. Base de la reactivite dans Vue 3 et des ORMs modernes.
Un secretaire personnel qui intercepte tous tes appels et courriers, et peut les modifier avant de te les transmettre.
const handler = {
get(target, key) {
console.log(`Reading ${key}`);
return target[key];
},
set(target, key, value) {
console.log(`Setting ${key}=${value}`);
target[key] = value;
return true;
}
};
const proxy = new Proxy({}, handler);Cas d'usage : Systemes reactifs (Vue 3), validation automatique, logging transparent, mocking en tests.
Fournit un substitut ou un intermediaire controlant l'acces a un objet. Peut ajouter lazy loading, cache, logging ou controle d'acces.
Un agent immobilier : il represente le proprietaire et filtre les visiteurs avant de leur donner acces.
const handler = {
get(target, prop) {
console.log(`Access: ${prop}`);
return target[prop];
}
};
const proxy = new Proxy(obj, handler);Cas d'usage : Lazy loading d'images, cache transparent, protection d'acces, logging d'appels API.
Client en ligne de commande officiel de PostgreSQL. Permet d'executer des requetes SQL, d'administrer la base et d'utiliser des meta-commandes comme \dt, \d, \l.
Le terminal de commande de PostgreSQL, comme mongosh pour MongoDB.
psql -U postgres -d mydb
\dt -- lister les tables
\d users -- decrire une table
\conninfo -- infos de connexionCas d'usage : Administrer et debugger une base PostgreSQL en ligne de commande.
PHP Standards Recommendations : normes communautaires du PHP-FIG definissant autoloading (PSR-4), coding style (PSR-12), logging (PSR-3), HTTP (PSR-7/15), container (PSR-11).
Comme le code de la route : des regles communes pour que tous les developpeurs circulent dans le meme sens.
// PSR-4 : App\Models\User -> src/Models/User.php
// PSR-12 : coding style
// PSR-3 : LoggerInterface
// PSR-7 : RequestInterface / ResponseInterface
// PSR-11 : ContainerInterfaceCas d'usage : Pour l'interoperabilite entre frameworks et libraries, et un code lisible par tous.
Modele de messagerie ou les emetteurs (publishers) envoient des messages a des canaux sans connaitre les recepteurs (subscribers). Decouplage total.
Un journal : l'editeur publie sans savoir qui lit, les abonnes recoivent sans connaitre l'editeur personnellement.
// Redis Pub/Sub
await redis.publish('orders', JSON.stringify(order));
// Subscriber
redis.subscribe('orders', (msg) => {
processOrder(JSON.parse(msg));
});Cas d'usage : Communication inter-services dans les microservices, notifications temps reel, event streaming.
Outil IaC utilisant des langages de programmation réels (TypeScript, Python, Go) au lieu d'un DSL. Même concept que Terraform mais avec du vrai code.
Terraform te donne un formulaire à remplir, Pulumi te laisse écrire une lettre dans ta propre langue.
import * as aws from '@pulumi/aws';
const bucket = new aws.s3.Bucket('my-bucket', {
website: { indexDocument: 'index.html' }
});
export const url = bucket.websiteEndpoint;Cas d'usage : Équipes de devs préférant TypeScript/Python au HCL pour gérer l'infrastructure.
Fonction qui retourne toujours le meme resultat pour les memes arguments et ne produit aucun effet de bord. Deterministe et sans mutation d'etat externe.
Une calculatrice : 2+3 donne toujours 5, peu importe quand ou ou tu fais le calcul.
// Pure
const add = (a, b) => a + b;
const upper = (s) => s.toUpperCase();
// Impure
let count = 0;
const increment = () => ++count; // mutation externeCas d'usage : Reducers Redux, fonctions de transformation, tests unitaires faciles, memoization possible.
Mecanisme de tree-shaking qui elimine les classes CSS non utilisees du build final. Renomme de purge a content dans Tailwind 3.
Le tri dans un dressing : tu gardes ce que tu portes, tu jettes le reste.
// Tailwind 2 (ancien)
purge: ['./src/**/*.html']
// Tailwind 3+ (actuel)
content: ['./src/**/*.{js,tsx,html}']Cas d'usage : Reduire le CSS final de plusieurs Mo a quelques Ko en production.
Messages envoyés depuis un serveur vers l'appareil de l'utilisateur via APNs (Apple) ou FCM (Google), même quand l'application est fermée. Requiert un Service Worker sur le web.
Un facteur qui sonne à votre porte pour livrer un message urgent, même si vous n'attendiez rien.
// Web Push API
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: VAPID_PUBLIC_KEY,
});
// Server-side
await webpush.sendNotification(subscription, JSON.stringify({
title: 'New message', body: 'Alice sent you a photo',
}));Cas d'usage : Réengager les utilisateurs avec des alertes pertinentes (messages, commandes, promotions ciblées).
PersistentVolume (PV) est un stockage provisionné dans le cluster. PersistentVolumeClaim (PVC) est une demande de stockage par un Pod.
PV = un entrepôt disponible. PVC = le bon de commande pour réserver de l'espace dans cet entrepôt.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db-storage
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 20GiCas d'usage : Fournir du stockage persistant aux bases de données dans Kubernetes.
API chainable de Mongoose pour construire des requetes incrementalement avec where(), equals(), gt(), sort(), limit(), etc. La requete n'est executee qu'a l'appel de exec() ou await.
Un panier de courses : tu ajoutes des articles au fur et a mesure, et tu payes (exec) seulement a la fin.
const users = await User
.where('age').gte(18)
.where('status').equals('active')
.sort('-createdAt')
.limit(10)
.exec();Cas d'usage : Construire des requetes dynamiques en fonction des parametres de filtre d'une API.
Plugin de debugging WordPress qui affiche les requetes SQL, hooks, erreurs PHP, requetes HTTP et temps d'execution en temps reel dans une barre admin.
Comme un tableau de bord medical qui affiche tous les signes vitaux du site en temps reel.
// Pas de code : c'est un plugin a installer
// Affiche dans la barre admin :
// - Nombre et temps des requetes SQL
// - Hooks executes et leur temps
// - Erreurs PHP et notices
// - Scripts/styles chargesCas d'usage : En developpement pour identifier les requetes lentes, les plugins gourmands et les hooks problematiques.
Operateurs prefixes par $ utilises dans les filtres de requete : $eq, $gt, $lt, $gte, $lte, $in, $nin, $regex, $exists, $and, $or, $not. Ils permettent des requetes complexes sans SQL.
Les symboles mathematiques de tes requetes : au lieu de dire 'superieur a 18', tu ecris $gt: 18.
db.users.find({
age: { $gte: 18, $lte: 65 },
role: { $in: ['admin', 'editor'] },
email: { $exists: true }
});Cas d'usage : Filtrer les documents avec des conditions complexes combinant comparaisons, ensembles et existence de champs.
Identifiant unique d'une requete dans TanStack Query, utilise pour le cache, la deduplication et l'invalidation. Generalement un tableau hierarchique.
Comme l'etiquette d'un tiroir de rangement : elle dit exactement ce qu'il y a dedans et permet de le retrouver.
// Hierarchique pour une invalidation fine
useQuery({ queryKey: ['users'] });
useQuery({ queryKey: ['users', userId] });
useQuery({ queryKey: ['users', userId, 'posts'] });
// Invalider tout ce qui commence par 'users'
queryClient.invalidateQueries({ queryKey: ['users'] });Cas d'usage : Structurer les cles de facon hierarchique pour pouvoir invalider a differents niveaux de granularite.
Fonction globale qui ajoute un callback a la microtask queue. Plus leger que Promise.resolve().then() pour planifier une microtask.
Glisser un post-it urgent sur la pile 'a traiter immediatement' au lieu de creer un ticket formel (Promise).
console.log('1');
queueMicrotask(() => console.log('2'));
console.log('3');
// 1, 3, 2Cas d'usage : Differer une action apres le code synchrone courant mais avant le prochain rendu.
Message broker AMQP pour la communication asynchrone entre services. Supporte les queues, exchanges, routing et dead letter queues.
Un bureau de poste : il reçoit les lettres (messages), les trie et les distribue dans les bonnes boîtes aux lettres (queues).
// Publisher
channel.publish('orders', 'order.created',
Buffer.from(JSON.stringify(order)));
// Consumer
channel.consume('order-processing', (msg) => {
const order = JSON.parse(msg.content);
processOrder(order);
channel.ack(msg);
});Cas d'usage : Découpler les services pour absorber les pics de charge sans perdre de messages.
Developpeuse et auteure britannique, experte CSS Grid et membre du CSS Working Group. Elle a joue un role cle dans la vulgarisation et l'adoption de CSS Grid Layout.
La cartographe de CSS Grid : elle a dessine les plans pour que les devs puissent enfin faire des layouts sans hacks.
/* CSS Grid — vulgarise par Rachel Andrew */
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
/* Fini les float hacks ! */Cas d'usage : CSS Grid est devenu le standard pour les layouts web. Ses articles et cours sont des references.
Programmeur dano-groenlandais, createur de PHP. Initialement un ensemble de scripts pour sa 'Personal Home Page', PHP est devenu le langage serveur le plus deploye au monde.
Le bricoleur du dimanche dont le projet perso fait tourner 77% des sites web du monde.
<?php
// PHP — Rasmus Lerdorf, 1995
function greet(string $name): string {
return "Hello, {$name}!";
}
echo greet('World');
?>Cas d'usage : PHP propulse WordPress (43% du web), Laravel, Symfony. Incontournable pour le dev web.
Mecanisme qui limite le nombre de requetes par client dans une fenetre de temps. Implementable via @nestjs/throttler pour proteger contre les abus.
Comme un portillon de metro : il ne laisse passer qu'un certain nombre de personnes par minute.
@Module({
imports: [ThrottlerModule.forRoot([{
ttl: 60000,
limit: 10,
}])],
})
export class AppModule {}
@UseGuards(ThrottlerGuard)
@Controller('auth')
export class AuthController {}Cas d'usage : Proteger les endpoints de login ou d'API publique contre le brute force et les abus.
Mécanisme limitant le nombre de requêtes par client/IP sur une période donnée. Protège contre les abus, DDoS et la surcharge.
Le nombre maximum de cafés qu'une machine peut servir par minute : au-delà, il faut attendre.
// express-rate-limit
const limiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 100,
message: 'Too many requests'
});
app.use('/api', limiter);Cas d'usage : Protéger les APIs publiques contre les abus et garantir un service équitable.
Mécanisme qui limite le nombre de requêtes qu'un client peut faire dans une fenêtre de temps. Protège contre les abus, DDoS et scraping.
Un distributeur de tickets qui ne donne qu'un ticket par minute par personne pour éviter la bousculade.
import rateLimit from 'express-rate-limit';
app.use('/api/', rateLimit({
windowMs: 15 * 60 * 1000, // 15 min
max: 100, // 100 requests per window
standardHeaders: true,
message: 'Too many requests',
}));Cas d'usage : Protéger les endpoints d'authentification et les API publiques contre les abus automatisés.
Role-Based Access Control : systeme d'autorisation ou les permissions sont attribuees a des roles (admin, user, editor) plutot qu'a des individus.
Comme les cles d'un immeuble : le gardien a le passe-partout, les residents ont la cle de leur etage.
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(ctx: ExecutionContext) {
const roles = this.reflector.get<string[]>('roles', ctx.getHandler());
if (!roles) return true;
const user = ctx.switchToHttp().getRequest().user;
return roles.includes(user.role);
}
}Cas d'usage : Restreindre l'acces aux endpoints admin ou moderateur selon le role de l'utilisateur.
Architecture interne de React (depuis v16) qui decoupe le rendu en unites de travail interruptibles. Permet le rendu concurrent et la priorisation des mises a jour.
Comme un chef cuisinier qui peut interrompre la preparation d'un plat pour servir un client urgent, puis reprendre ou il en etait.
// Fiber permet les priorites
// Haute priorite: saisie utilisateur
// Basse priorite: mise a jour d'une liste
const [query, setQuery] = useState('');
const [results, setResults] = useTransition();Cas d'usage : Fondation du concurrent rendering, permet a React de rester reactif meme avec des rendus lourds.
Librairie de formulaires performante basee sur les refs (uncontrolled). Minimise les re-rendus et offre une validation integree avec support de Zod, Yup, etc.
Comme un formulaire papier : tu remplis tout d'un coup et la validation se fait a la soumission, pas a chaque lettre.
const { register, handleSubmit, formState: { errors } } = useForm();
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register('email', { required: true })} />
{errors.email && <span>Email requis</span>}
<button type="submit">Envoyer</button>
</form>Cas d'usage : Formulaires complexes avec beaucoup de champs ou la performance est critique.
Librairie de routage standard pour React avec routes imbriquees, loaders de donnees, actions de mutation et navigation declarative.
Comme le plan d'un centre commercial avec les fleches directionnelles : chaque URL mene a la bonne boutique (composant).
const router = createBrowserRouter([
{
path: '/',
element: <Layout />,
children: [
{ index: true, element: <Home /> },
{ path: 'users/:id', element: <User />, loader: userLoader },
]
}
]);Cas d'usage : SPA React sans framework (Vite + React) qui a besoin de navigation multi-pages.
Composants qui s'executent uniquement sur le serveur, avec acces direct aux bases de donnees et fichiers. Leur code n'est pas envoye au client, reduisant le bundle JS.
Comme la cuisine d'un restaurant : le client ne voit que le plat (HTML), pas les ustensiles (code serveur).
// Server Component (par defaut dans Next.js App Router)
export default async function UserList() {
const users = await db.query('SELECT * FROM users');
return (
<ul>
{users.map(u => <li key={u.id}>{u.name}</li>)}
</ul>
);
}Cas d'usage : Composants qui affichent des donnees sans interactivite : listes, articles, dashboards de lecture.
Librairie de test qui encourage les tests du point de vue de l'utilisateur. On interagit via roles, labels et texte visible, pas via les details d'implementation.
Comme un testeur mystere dans un restaurant : il teste l'experience client, pas la recette du chef.
import { render, screen, fireEvent } from '@testing-library/react';
test('incremente le compteur', () => {
render(<Counter />);
fireEvent.click(screen.getByRole('button', { name: /incrementer/i }));
expect(screen.getByText('1')).toBeInTheDocument();
});Cas d'usage : Tests unitaires et d'integration de composants React, focus sur le comportement utilisateur.
HOC qui memoize un composant : il ne se re-rend que si ses props changent (comparaison shallow par defaut).
Comme un videur de boite de nuit qui ne laisse passer que les nouvelles tetes : memes props = on ne re-rend pas.
const ExpensiveList = React.memo(function List({ items }) {
return items.map(i => <Item key={i.id} {...i} />);
});
// Avec comparateur custom
const MemoComp = React.memo(Comp, (prev, next) => {
return prev.id === next.id;
});Cas d'usage : Composants enfants couteux qui re-rendent inutilement a cause du re-rendu du parent.
Determine vers quel membre du replica set les lectures sont dirigees : primary, primaryPreferred, secondary, secondaryPreferred ou nearest.
Choisir a quel guichet faire la queue : le principal (toujours a jour) ou un secondaire (plus rapide mais potentiellement en retard).
const db = client.db('mydb', {
readPreference: 'secondaryPreferred'
});Cas d'usage : Lire depuis les secondaires pour les rapports analytiques, reduisant la charge sur le primary.
Copie en lecture seule d'une base de données primaire, répliquée de manière asynchrone. Distribue la charge des requêtes SELECT.
Des copies d'un même livre dans une bibliothèque : plusieurs lecteurs peuvent lire simultanément.
// Routing des requêtes
const db = query.isRead
? replicaPool.connect()
: primaryPool.connect();
await db.query(query.sql);Cas d'usage : Absorber le trafic de lecture (rapports, dashboards) sans surcharger la base primaire.
Proprietes PHP 8.1 qui ne peuvent etre initialisees qu'une seule fois, puis deviennent immutables. PHP 8.2 etend cela aux classes entieres avec readonly class.
Comme un tatouage : une fois fait, on ne peut plus le modifier.
readonly class UserDTO {
public function __construct(
public string $name,
public string $email,
) {}
}Cas d'usage : Pour les DTOs et Value Objects ou l'immutabilite garantit l'integrite des donnees.
Utility type qui rend toutes les proprietes en lecture seule. Toute tentative de mutation genere une erreur a la compilation.
Comme un document sous verre dans un musee — on peut le regarder mais pas le toucher.
interface State { count: number; name: string }
const state: Readonly<State> = { count: 0, name: "A" };
// state.count = 1; // Erreur: readonlyCas d'usage : Proteger l'etat dans Redux/stores immutables ou les parametres de fonctions pures.
Merge crée un commit de fusion préservant l'historique. Rebase rejoue les commits sur la branche cible pour un historique linéaire.
Merge = coller deux routes avec un carrefour. Rebase = redessiner une route pour qu'elle continue tout droit.
# Merge : préserve l'historique
git merge feature/login
# Rebase : historique linéaire
git checkout feature/login
git rebase main
git checkout main && git merge feature/loginCas d'usage : Rebase pour un historique propre sur les feature branches, merge pour les branches partagées.
API de Vanilla Extract pour creer des composants a variantes (comme les CVA). Definit base, variants, compoundVariants et defaultVariants avec du typage complet.
Un formulaire de commande : tu coches les options (taille, couleur) et le systeme genere la classe.
import { recipe } from '@vanilla-extract/recipes'
export const button = recipe({
base: { borderRadius: '4px' },
variants: {
color: { primary: { bg: 'blue' }, danger: { bg: 'red' } },
size: { sm: { padding: '4px' }, lg: { padding: '16px' } },
},
defaultVariants: { color: 'primary', size: 'sm' },
})Cas d'usage : Creer des composants avec des variantes combinables de facon type-safe au build-time.
Algorithme de diffing qui compare deux arbres Virtual DOM pour determiner les changements minimaux a appliquer au vrai DOM. Complexite O(n) grace a des heuristiques.
Comme un jeu des 7 differences : React compare les deux images et ne corrige que les pixels differents.
// React compare par type d'element et key
// Si le type change: detruit et recree le sous-arbre
// Si le type est identique: met a jour les props
<ul>
<li key="a">A</li> {/* key aide la reconciliation */}
<li key="b">B</li>
</ul>Cas d'usage : Comprendre la reconciliation aide a ecrire du code performant et a bien utiliser les keys.
Utility type qui construit un type objet dont les cles sont de type K et les valeurs de type V. Alternative typee aux objets indexe.
Comme un tableau Excel avec des colonnes predefinies — chaque ligne a exactement les memes champs.
type Role = "admin" | "user" | "guest";
const permissions: Record<Role, string[]> = {
admin: ["read", "write", "delete"],
user: ["read", "write"],
guest: ["read"]
};Cas d'usage : Creer des dictionnaires/maps types pour des lookups, configurations par cle ou traductions.
Outil de refactoring automatique qui modernise le code PHP en appliquant des regles de transformation. Peut migrer entre versions PHP et frameworks.
Comme un traducteur automatique qui met a jour un vieux livre dans un langage moderne.
// rector.php
return RectorConfig::configure()
->withPhpSets(php83: true)
->withPreparedSets(
deadCode: true,
codeQuality: true,
);Cas d'usage : Pour migrer un projet vers PHP 8.x ou moderniser du code legacy automatiquement.
Types conditionnels qui se referencent eux-memes pour traiter des structures de profondeur variable. Permettent des transformations profondes sur les types.
Comme une equipe de nettoyage qui descend etage par etage dans un immeuble — chaque niveau est traite avant de passer au suivant.
type DeepReadonly<T> = T extends object
? { readonly [K in keyof T]: DeepReadonly<T[K]> }
: T;
type Nested = { a: { b: { c: string } } };
type R = DeepReadonly<Nested>;Cas d'usage : Creer des transformations profondes (DeepPartial, DeepReadonly, flatten) sur des structures imbriquees.
Types qui se referencent eux-memes, permettant de modeliser des structures arborescentes ou imbriquees comme du JSON, un DOM ou un systeme de fichiers.
Comme des poupees russes — chaque poupee contient potentiellement une autre poupee identique.
type Json =
| string
| number
| boolean
| null
| Json[]
| { [key: string]: Json };Cas d'usage : Modeliser des structures de donnees naturellement recursives (arbres, JSON, menus imbriques).
Base de données clé-valeur en mémoire, ultra-rapide. Supporte strings, hashes, lists, sets, streams. Utilisé comme cache, broker, et store de sessions.
Un post-it géant ultra-rapide : tu écris, tu lis, c'est instantané, mais ça tient en mémoire.
await redis.set('session:abc', JSON.stringify(user), 'EX', 3600);
const session = await redis.get('session:abc');
await redis.del('session:abc');Cas d'usage : Cache applicatif, sessions, rate limiting, queues (BullMQ), leaderboards.
Système de messagerie fire-and-forget de Redis. Les publishers envoient sur des channels, les subscribers écoutent en temps réel. Pas de persistance.
Une radio en direct : si tu n'es pas branché au moment de la diffusion, tu rates le message.
// Publisher
await redis.publish('notifications', JSON.stringify(notif));
// Subscriber
const sub = redis.duplicate();
await sub.subscribe('notifications', (msg) => {
console.log(JSON.parse(msg));
});Cas d'usage : Notifications temps réel, invalidation de cache distribuée entre instances.
Boite a outils officielle de Redux qui simplifie la configuration du store, la creation de reducers et la gestion de la logique asynchrone.
Comme un kit de montage IKEA pour Redux : tout est pre-configure, plus besoin de 200 fichiers boilerplate.
const counterSlice = createSlice({
name: 'counter',
initialState: { value: 0 },
reducers: {
increment: (state) => { state.value += 1; },
add: (state, action) => { state.value += action.payload; }
}
});Cas d'usage : Etat global complexe necessitant de la predictibilite, du time-travel debugging et du middleware.
Objet built-in fournissant des methodes statiques pour les operations interceptables par Proxy. Miroir 1:1 des traps de Proxy avec des retours booleens au lieu d'exceptions.
Le mode d'emploi officiel des operations JS : au lieu de bidouiller, tu utilises la methode standard.
const obj = { x: 1 };
Reflect.get(obj, 'x'); // 1
Reflect.set(obj, 'y', 2); // true
Reflect.has(obj, 'x'); // true
Reflect.ownKeys(obj); // ['x', 'y']Cas d'usage : Toujours utiliser Reflect dans les traps de Proxy pour le comportement par defaut correct.
Le reflow recalcule la géométrie de tous les éléments affectés (layout). Le repaint redessine les pixels sans changer la géométrie. Le reflow est bien plus coûteux car il déclenche aussi un repaint.
Repaint = repeindre un mur (couleur). Reflow = abattre un mur et réaménager toute la pièce.
/* Déclenche REFLOW (coûteux) */
element.style.width = '200px'; // layout change
element.style.margin = '10px'; // layout change
/* Déclenche REPAINT seulement */
element.style.color = 'red'; // visuel seulement
element.style.opacity = '0.5'; // visuel seulementCas d'usage : Déboguer les animations lentes en identifiant si le problème vient du reflow ou du repaint.
Test qui verifie qu'une modification du code n'a pas casse une fonctionnalite existante. La suite de tests existante sert naturellement de filet de regression.
Comme verifier que la reparation de la plomberie dans la cuisine n'a pas provoque une fuite dans la salle de bain.
// Apres fix du bug #423
test('regression: prix negatif ne crash plus', () => {
const result = calculateTotal(-5, 2);
expect(result).toBe(0); // fix applique
});
// Ce test empeche le bug de reapparaitreCas d'usage : A chaque bug fixe, ajouter un test de regression pour garantir qu'il ne reviendra jamais.
Framework React full-stack qui embrasse les standards web (fetch, FormData, Response). Routes = fichiers, chaque route a loader/action/component co-localises.
Comme un restaurant local bio : il utilise les ingredients natifs (standards web) au lieu d'importer des produits exotiques.
// app/routes/users.tsx
export async function loader() {
return json(await getUsers());
}
export async function action({ request }) {
const form = await request.formData();
return createUser(Object.fromEntries(form));
}
export default function Users() {
const users = useLoaderData<typeof loader>();
}Cas d'usage : Applications full-stack privilegiant les standards web, l'accessibilite et le progressive enhancement.
Pattern ou un composant recoit une fonction en prop qui retourne du JSX, permettant de partager de la logique tout en laissant le controle du rendu a l'appelant.
Comme un cours de peinture 'apporte ta toile' : le professeur (composant) guide, mais tu decides du resultat.
function MouseTracker({ render }) {
const [pos, setPos] = useState({ x: 0, y: 0 });
return (
<div onMouseMove={e => setPos({ x: e.clientX, y: e.clientY })}>
{render(pos)}
</div>
);
}
<MouseTracker render={({ x, y }) => <p>{x}, {y}</p>} />Cas d'usage : Partager de la logique reutilisable entre composants (souvent remplace par les custom hooks aujourd'hui).
Bots qui creent automatiquement des PR pour mettre a jour les dependances. Renovate est plus configurable, Dependabot est integre nativement dans GitHub.
Comme un assistant qui verifie chaque jour si vos fournisseurs ont de nouvelles versions et vous prepare les bons de commande.
// renovate.json
{
"extends": ["config:recommended"],
"packageRules": [
{
"matchUpdateTypes": ["minor", "patch"],
"automerge": true
}
],
"schedule": ["every weekend"]
}Cas d'usage : Pour maintenir les dependances a jour automatiquement et eviter l'accumulation de dette technique de securite.
Remplace entierement un document par un nouveau, en conservant le meme _id. Contrairement a updateOne, ne prend pas d'operateurs mais un document complet.
Jeter l'ancienne fiche et en ecrire une toute nouvelle avec le meme numero de dossier.
await db.collection('users').replaceOne(
{ _id: userId },
{ name: 'Bob', age: 31, role: 'admin' }
);Cas d'usage : Quand un document est entierement recalcule et doit etre remplace en bloc.
Groupe de processus mongod qui maintiennent le meme jeu de donnees. Compose d'un Primary (ecritures) et de Secondaries (copies). Offre la haute disponibilite et le failover automatique.
Un groupe de musiciens jouant la meme partition : si le chanteur principal perd sa voix, un autre prend le relais.
// Config replica set
rs.initiate({
_id: 'myRS',
members: [
{ _id: 0, host: 'srv1:27017' },
{ _id: 1, host: 'srv2:27017' },
{ _id: 2, host: 'srv3:27017' }
]
});Cas d'usage : Garantir la disponibilite en production avec failover automatique en cas de panne serveur.
Contrôleur Kubernetes garantissant qu'un nombre spécifié de réplicas de Pods sont en cours d'exécution. Géré automatiquement par un Deployment.
Un thermostat : il maintient toujours la température (nombre de Pods) au niveau configuré.
# Géré via Deployment, rarement créé directement
kubectl get replicasets
kubectl scale deployment api --replicas=5Cas d'usage : Assurer la haute disponibilité en maintenant le nombre de Pods désiré.
Abstrait l'acces aux donnees en encapsulant la logique de persistance derriere une interface de collection. Le domaine ignore la source de donnees.
Une bibliothecaire : tu demandes un livre par titre, elle sait ou le trouver sans que tu connaisses le systeme de classement.
class UserRepo {
async findById(id) { return db.users.findOne({ id }); }
async save(user) { return db.users.upsert(user); }
async findByEmail(e) { return db.users.findOne({ email: e }); }
}Cas d'usage : Decoupler le domaine metier du framework ORM ou de la base de donnees.
Couche d'abstraction entre la logique metier et l'acces aux donnees. Le repository expose des methodes metier et masque les details de persistence.
Comme un bibliothecaire : tu lui demandes un livre par titre, il sait ou le trouver dans les rayons.
interface UserRepository {
public function findByEmail(string $email): ?User;
public function save(User $user): void;
}
class DoctrineUserRepository implements UserRepository {
// Implementation avec Doctrine ORM
}Cas d'usage : Pour decoupler la logique metier de la base de donnees et faciliter les tests unitaires.
API qui planifie un callback avant le prochain repaint du navigateur (~60fps). Synchronise les animations avec le cycle de rendu pour des animations fluides.
Attendre le signal du metronome avant de jouer la note suivante : tout reste synchronise avec le rythme d'affichage.
function animate(timestamp) {
element.style.transform =
`translateX(${timestamp / 10}px)`;
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);Cas d'usage : Animations JS fluides, canvas rendering, synchronisation avec le cycle de repaint.
API qui planifie un callback pendant les periodes d'inactivite du navigateur. Recoit un IdleDeadline indiquant le temps restant. Ideal pour les taches non-urgentes.
Faire le menage pendant les pubs a la tele : tu profites des pauses naturelles sans interrompre le programme.
requestIdleCallback((deadline) => {
while (deadline.timeRemaining() > 0 && tasks.length) {
processTask(tasks.pop());
}
if (tasks.length) requestIdleCallback(cb);
}, { timeout: 2000 });Cas d'usage : Analytics, prefetching, taches de fond non-critiques, warm-up de cache.
Utility type qui rend toutes les proprietes obligatoires. Inverse de Partial — supprime tous les modificateurs optionnels (?).
Comme un formulaire administratif ou chaque champ est marque d'un asterisque rouge — tout est obligatoire.
interface Config {
host?: string;
port?: number;
}
type FullConfig = Required<Config>;
// { host: string; port: number }Cas d'usage : Garantir qu'un objet de configuration est complet apres la fusion avec les valeurs par defaut.
API qui observe les changements de taille d'un element DOM. Appelle le callback quand les dimensions changent, sans dependre du resize de la fenetre.
Un metre automatique colle sur un meuble qui t'alerte des que les dimensions changent.
const observer = new ResizeObserver((entries) => {
for (const entry of entries) {
const { width, height } = entry.contentRect;
console.log(`${width}x${height}`);
}
});
observer.observe(document.querySelector('.chart'));Cas d'usage : Graphiques responsifs, conteneurs flexibles, composants qui s'adaptent a leur taille.
Directives HTML (preload, prefetch, preconnect, dns-prefetch) qui informent le navigateur des ressources à charger en priorité ou à préparer en avance.
Commander l'entrée et le plat en même temps au restaurant pour que le plat arrive plus vite après l'entrée.
<!-- Critical resource -->
<link rel="preload" href="/fonts/inter.woff2" as="font" crossorigin>
<!-- Next page -->
<link rel="prefetch" href="/dashboard">
<!-- Third-party -->
<link rel="preconnect" href="https://api.example.com">
<link rel="dns-prefetch" href="https://cdn.example.com">Cas d'usage : Accélérer le chargement des fonts critiques, des pages suivantes probables et des APIs tierces.
Strategie mobile-first ou les styles de base ciblent le mobile, et les prefixes de breakpoint ajoutent des styles pour les ecrans plus larges.
Construire un batiment du rez-de-chaussee vers le haut : chaque etage ajoute de l'espace.
<!-- Mobile: stack, Tablet: 2 cols, Desktop: 3 cols -->
<div class="flex flex-col sm:flex-row sm:flex-wrap">
<div class="w-full sm:w-1/2 lg:w-1/3 p-2">
Card
</div>
</div>Cas d'usage : Adapter automatiquement le layout a toutes les tailles d'ecran sans media queries manuelles.
Syntaxe objet pour definir des valeurs responsives dans les librairies CSS-in-JS (Chakra, Panda, Theme UI). Chaque breakpoint est une cle de l'objet.
Un emploi du temps par jour de la semaine : chaque jour (breakpoint) a une activite differente.
// Chakra UI / Panda CSS
<Box
p={{ base: '4', md: '8', lg: '12' }}
display={{ base: 'block', md: 'flex' }}
fontSize={{ base: 'sm', lg: 'xl' }}
/>Cas d'usage : Definir des styles responsifs de facon declarative sans media queries manuelles.
Prefixes (sm, md, lg, xl, 2xl) qui appliquent une classe uniquement a partir d'un breakpoint donne. L'approche est mobile-first par defaut.
Des vetements adaptatifs : un manteau que tu enfiles seulement quand il fait froid (a partir d'une certaine temperature).
<div class="grid grid-cols-1 sm:grid-cols-2
md:grid-cols-3 lg:grid-cols-4">
<!-- Responsive grid -->
</div>Cas d'usage : Creer des layouts responsifs sans media queries manuelles, directement dans le markup.
Style architectural pour APIs web base sur les ressources, les verbes HTTP et l'hypermedia. Le modele de Richardson definit 4 niveaux de maturite (0 a 3).
Un plan de ville : les rues sont les URLs, les panneaux sont les methodes HTTP, les liens sont les directions vers d'autres lieux.
// Niveau 2: resources + verbes HTTP
GET /api/users // Liste
GET /api/users/42 // Detail
POST /api/users // Creation
PUT /api/users/42 // Mise a jour
DELETE /api/users/42 // SuppressionCas d'usage : APIs web standard, communication inter-services, APIs publiques.
Data Transfer Object : classe qui definit la structure des donnees entrantes/sortantes. Utilisee avec class-validator pour la validation automatique.
Comme un formulaire officiel : il definit les champs attendus et rejette les soumissions invalides.
export class CreateUserDto {
@IsEmail()
email: string;
@IsString()
@MinLength(8)
password: string;
@IsOptional()
@IsString()
name?: string;
}Cas d'usage : Valider et typer les donnees entrantes de l'API avant qu'elles atteignent la logique metier.
Stratégie de retry augmentant le délai exponentiellement entre chaque tentative (1s, 2s, 4s, 8s...) avec jitter aléatoire pour éviter le thundering herd.
Rappeler quelqu'un qui ne répond pas : attendre 1 min, puis 5 min, puis 15 min au lieu de spammer.
async function retryWithBackoff(fn, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try { return await fn(); }
catch (e) {
const delay = Math.pow(2, i) * 1000 + Math.random() * 1000;
await sleep(delay);
}
}
throw new Error('Max retries exceeded');
}Cas d'usage : Appels réseau vers des services externes pouvant avoir des indisponibilités temporaires.
Retente automatiquement une operation echouee avec un delai croissant (backoff exponentiel). Gere les erreurs transitoires.
Rappeler quelqu'un qui ne repond pas : tu attends 1 min, puis 5 min, puis 15 min avant de reessayer.
async function retry(fn, attempts = 3) {
for (let i = 0; i < attempts; i++) {
try { return await fn(); }
catch(e) { await sleep(2 ** i * 1000); }
}
throw new Error('Max retries reached');
}Cas d'usage : Appels reseau, envoi d'emails, operations cloud avec erreurs transitoires.
Configuration qui définit comment Temporal retente une Activity en échec : intervalle initial, backoff, nombre max de tentatives et erreurs non-retentables.
Rappeler un ami qui ne répond pas : d'abord après 1 min, puis 5 min, puis 30 min, avec un maximum de 5 essais.
const retryPolicy = {
initialInterval: '1s',
backoffCoefficient: 2,
maximumAttempts: 5,
nonRetryableErrorTypes: ['InvalidInputError'],
};Cas d'usage : Configurer des retries intelligents sur les appels API externes pour absorber les erreurs transitoires.
Utility type qui extrait le type de retour d'une fonction. Utile pour inferer des types sans les redeclarer.
Comme lire l'etiquette de sortie d'une machine sans devoir regarder ses rouages internes.
function createUser() {
return { id: "1", name: "Alice", active: true };
}
type User = ReturnType<typeof createUser>;
// { id: string; name: string; active: boolean }Cas d'usage : Inferer le type de retour de fonctions factory ou de hooks React sans duplication.
Serveur intermédiaire recevant les requêtes client et les transférant aux serveurs backend. Gère TLS, caching, compression, et sécurité.
Un secrétaire qui filtre les appels, prend les messages et redirige vers le bon interlocuteur.
# Nginx reverse proxy
server {
listen 443 ssl;
location /api { proxy_pass http://backend:3000; }
location / { root /var/www/html; }
}Cas d'usage : Point d'entrée unique HTTPS devant les services backend, avec caching et rate limiting.
Developpeur britannique chez Vercel, createur de Svelte et SvelteKit. Svelte compile les composants en JavaScript vanille sans virtual DOM, offrant des performances superieures.
Le rebelle du front-end : il a dit 'le virtual DOM est un overhead' et a prouve qu'on peut faire mieux sans.
<!-- Svelte — Rich Harris -->
<script>
let name = 'World';
</script>
<h1>Hello, {name}!</h1>
<style>
h1 { color: purple; }
</style>Cas d'usage : Svelte est une alternative legere a React/Vue avec une approche radicalement differente (compilation vs runtime).
Developpeur americain, createur de Clojure, un Lisp moderne sur la JVM. Ses conferences ('Simple Made Easy', 'Are We There Yet?') sont des references en architecture logicielle.
Le philosophe de la simplicite : pour lui, la complexite accidentelle est l'ennemi numero un du developpeur.
;; Clojure — Rich Hickey, 2007
(defn greet [name]
(str "Hello, " name "!"))
(println (greet "World"))
;; Immutabilite par defaut, data-drivenCas d'usage : Ses idees sur l'immutabilite et la simplicite ont influence Redux, Immer et la programmation fonctionnelle en JS.
Programmeur et activiste americain, fondateur du projet GNU et de la Free Software Foundation (FSF). Il a cree la licence GPL et le concept de logiciel libre (free as in freedom).
Le militant des libertes numeriques : pour lui, un logiciel non-libre est une prison, meme si elle est confortable.
/* GNU/Linux — Richard Stallman */
/* Les 4 libertes du logiciel libre : */
/* 0. Executer le programme */
/* 1. Etudier le code source */
/* 2. Redistribuer des copies */
/* 3. Distribuer des versions modifiees */Cas d'usage : Comprendre les licences open source (GPL, MIT, Apache) est essentiel pour tout developpeur professionnel.
Informaticien canadien, co-createur de Go (avec Ken Thompson et Robert Griesemer) et de UTF-8. Ancien de Bell Labs et de Google.
L'ingenieur qui a cree un langage aussi simple qu'un marteau — et aussi efficace.
// Go — Rob Pike et al., 2009
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}Cas d'usage : Go domine dans le cloud-native (Docker, Kubernetes). Connaitre ses createurs aide a comprendre sa philosophie minimaliste.
Developpeur et auteur americain, createur des principes SOLID et auteur de 'Clean Code'. Figure controversee mais influente, ses idees sur la qualite du code sont omnipresentes.
Le sergent-instructeur du code propre : ses regles sont strictes mais tes coequipiers te remercieront de les suivre.
// SOLID — Robert C. Martin
// S - Single Responsibility
// O - Open/Closed
// L - Liskov Substitution
// I - Interface Segregation
// D - Dependency Inversion
// 5 principes, 1000 entretiens d'embaucheCas d'usage : SOLID et Clean Code sont des sujets classiques en entretien. Connaitre ces principes est attendu de tout dev.
Informaticien suisse, co-createur de Go avec Rob Pike et Ken Thompson. Il a aussi travaille sur la V8 JavaScript engine de Google Chrome.
Le troisieme mousquetaire de Go — celui qui a aussi accelere JavaScript pour tout le monde avec V8.
// Generics en Go 1.18 — contribution majeure
func Map[T, U any](s []T, f func(T) U) []U {
r := make([]U, len(s))
for i, v := range s {
r[i] = f(v)
}
return r
}Cas d'usage : Comprendre l'evolution de Go et le moteur V8 qui propulse Chrome et Node.js.
Stratégie de mise à jour remplaçant les instances une par une. À tout moment, un mix de l'ancienne et nouvelle version tourne. Stratégie par défaut de Kubernetes.
Changer les pneus d'un camion un par un pendant qu'il roule, au lieu de tout changer d'un coup à l'arrêt.
# Kubernetes rolling update (défaut)
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0Cas d'usage : Mise à jour standard des Deployments Kubernetes sans interruption de service.
Bundler JavaScript specialise dans la generation de librairies avec un excellent tree-shaking. Produit des bundles ESM et CJS propres. Utilise par Vite pour le build de production.
Comme un couturier sur mesure : il taille le tissu au plus juste sans gaspillage, parfait pour les librairies.
// rollup.config.js
export default {
input: 'src/index.ts',
output: [
{ file: 'dist/index.cjs', format: 'cjs' },
{ file: 'dist/index.mjs', format: 'es' },
],
plugins: [typescript(), terser()],
};Cas d'usage : Pour bundler des librairies JavaScript avec un tree-shaking optimal et des sorties multi-formats.
Dossiers parentheses (group) dans App Router qui organisent les routes sans affecter l'URL. Permettent des layouts differents pour des sections de l'app.
Comme des dossiers de classement invisibles : ils organisent les papiers mais ne changent pas l'adresse postale.
// app/(marketing)/about/page.tsx -> /about
// app/(marketing)/layout.tsx -> layout marketing
// app/(dashboard)/admin/page.tsx -> /admin
// app/(dashboard)/layout.tsx -> layout dashboardCas d'usage : Separer les layouts (public vs dashboard) ou organiser le code sans impacter les URLs.
Solution de data fetching et caching integree a Redux Toolkit. Genere automatiquement les hooks, gere le cache, l'invalidation et les requetes optimistes.
Comme un assistant personnel qui passe les commandes, gere le stock et previent quand il faut reapprovisionner.
const api = createApi({
baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
endpoints: (build) => ({
getUsers: build.query({ query: () => '/users' }),
addUser: build.mutation({ query: (body) => ({ url: '/users', method: 'POST', body }) })
})
});Cas d'usage : Applications Redux avec beaucoup de data fetching, en alternative a React Query dans l'ecosysteme Redux.
Runtime (styled-components, Emotion) genere le CSS dans le navigateur. Zero-runtime (Vanilla Extract, Linaria) extrait le CSS au build, zero JS en prod pour le styling.
Runtime c'est cuisiner sur place (frais mais lent), zero-runtime c'est un plat pre-cuisine (rapide a servir).
// Runtime : CSS genere dans le navigateur
const Box = styled.div`color: red;`
// Zero-runtime : CSS extrait au build
// box.css.ts
import { style } from '@vanilla-extract/css'
export const box = style({ color: 'red' })
// => .box_abc123 { color: red } en .cssCas d'usage : Choisir zero-runtime pour les apps critiques en performance, runtime pour la flexibilite.
Developpeur americain, createur de Node.js et de Deno. Node.js a rendu possible l'execution de JavaScript cote serveur, unifiant front-end et back-end en un seul langage.
Celui qui a libere JavaScript de la prison du navigateur et l'a lache sur les serveurs du monde entier.
// Node.js — Ryan Dahl, 2009
const http = require('http');
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello, World!');
}).listen(3000);
// JS cote serveur — revolutionCas d'usage : Node.js est incontournable en dev web full-stack. Deno est son successeur avec TypeScript natif et securite par defaut.
Service de stockage objet cloud d'AWS. Stockage illimité, hautement durable (99.999999999%), accessible par API HTTP. Standard de facto du stockage cloud.
Un entrepôt infini avec une adresse URL pour chaque objet stocké.
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
const s3 = new S3Client({ region: 'eu-west-1' });
await s3.send(new PutObjectCommand({
Bucket: 'my-bucket',
Key: 'uploads/photo.jpg',
Body: fileBuffer
}));Cas d'usage : Stocker fichiers uploadés, backups, assets statiques, data lake.
Stockage objet accessible via l'API S3 d'Amazon, devenu un standard. Compatible avec MinIO, Cloudflare R2, DigitalOcean Spaces pour éviter le vendor lock-in.
Un entrepôt de stockage standardisé : les cartons (fichiers) se rangent de la même façon quel que soit l'entrepôt.
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
const s3 = new S3Client({ region: 'eu-west-1' });
await s3.send(new PutObjectCommand({
Bucket: 'my-uploads',
Key: `avatars/${userId}.webp`,
Body: fileBuffer,
}));Cas d'usage : Stocker les fichiers uploadés (images, documents, vidéos) hors du serveur applicatif.
Liste de classes a toujours inclure dans le build, meme si elles ne sont pas detectees dans le code source. Utile pour les classes generees dynamiquement.
Une liste VIP : ces invites entrent toujours, peu importe s'ils sont sur la liste principale.
// tailwind.config.js
module.exports = {
safelist: [
'bg-red-500',
'bg-green-500',
{ pattern: /bg-(red|green|blue)-(100|500)/ }
]
}Cas d'usage : Garantir que des classes construites dynamiquement (bg-${color}-500) sont presentes en production.
Gere les transactions distribuees via une sequence d'etapes locales avec des actions compensatoires en cas d'echec. Alternative a 2PC.
Organiser un voyage : reserver vol, hotel, voiture. Si l'hotel est indisponible, tu annules le vol deja reserve.
const saga = [
{ exec: bookFlight, comp: cancelFlight },
{ exec: bookHotel, comp: cancelHotel },
];
// Execute chaque etape; en cas d'echec, compense en ordre inverseCas d'usage : Transactions multi-services dans les microservices (commande, paiement, livraison).
Pattern de gestion de transactions distribuées où chaque étape a une action compensatoire. En cas d'échec, les compensations sont exécutées en ordre inverse.
Annuler une réservation de vacances : d'abord l'hôtel, puis le vol, puis la voiture, dans l'ordre inverse des réservations.
const compensations = [];
try {
await chargeCard(order); compensations.push(() => refund(order));
await reserveStock(order); compensations.push(() => releaseStock(order));
await shipOrder(order);
} catch (err) {
for (const comp of compensations.reverse()) await comp();
}Cas d'usage : Gérer des transactions multi-services (paiement + stock + livraison) sans verrou distribué.
Entrepreneur americain, CEO d'OpenAI. Il a lance ChatGPT (2022), l'application la plus rapidement adoptee de l'histoire, et dirige le developpement des modeles GPT.
L'homme qui a mis l'IA dans les mains de tout le monde — ChatGPT est le 'iPhone moment' de l'intelligence artificielle.
// OpenAI API — Sam Altman
import OpenAI from 'openai';
const openai = new OpenAI();
const response = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: 'Hello!' }]
});Cas d'usage : ChatGPT et les LLMs transforment le developpement logiciel. Comprendre cet ecosysteme est devenu essentiel.
Auteur et consultant britannique, reference en architecture microservices. Son livre 'Building Microservices' est le guide de reference pour decomposer un monolithe.
Le chirurgien du monolithe : il t'apprend a decouper une grosse app en petits services sans qu'elle meure sur la table.
// Microservices — Sam Newman
// Monolithe -> Services independants
// [User Service] -> API Gateway
// [Order Service] -> API Gateway
// [Payment Service] -> API Gateway
// Chaque service = deploy independantCas d'usage : Comprendre quand et comment passer aux microservices — et surtout quand ne PAS le faire.
Standard XML d'authentification fédérée principalement utilisé en entreprise. L'Identity Provider émet des assertions XML signées pour authentifier l'utilisateur auprès du Service Provider.
Un passeport diplomatique émis par un pays (IdP) et reconnu à la frontière d'un autre (SP).
// SAML config (passport-saml)
{
entryPoint: 'https://idp.corp.com/saml/sso',
issuer: 'my-app',
cert: idpCertificate,
callbackUrl: 'https://app.com/auth/saml/callback',
}Cas d'usage : Intégrer une app SaaS avec l'Active Directory ou le SSO d'une grande entreprise.
Famille de fonctions WordPress (sanitize_text_field, sanitize_email, sanitize_url) qui nettoient les donnees entrantes en supprimant les caracteres dangereux.
Comme un filtre a eau qui retire les impuretes avant de boire : on ne fait jamais confiance a l'eau brute.
$name = sanitize_text_field($_POST['name']);
$email = sanitize_email($_POST['email']);
$url = sanitize_url($_POST['website']);
$html = wp_kses_post($_POST['content']);Cas d'usage : A chaque reception de donnees utilisateur dans WordPress : formulaires, AJAX, REST API.
Developpeuse et consultante libanaise, experte en SVG, CSS et accessibilite web. Elle est une reference mondiale pour les animations SVG et le design inclusif.
L'artiste du web qui dessine avec du code SVG tout en s'assurant que tout le monde peut voir ses oeuvres.
<!-- SVG inline — specialite de Sara Soueidan -->
<svg viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40"
fill="none" stroke="#333" stroke-width="2">
<animate attributeName="r"
values="40;45;40" dur="2s" repeatCount="indefinite"/>
</circle>
</svg>Cas d'usage : Ses articles sur SVG et l'accessibilite sont des references pour creer des interfaces inclusives.
Developpeuse et directrice d'ingenierie americaine chez Google. Core team Vue.js, experte en animations web et SVG. Auteure de 'SVG Animations' et ancienne VP DX chez Netlify.
L'artiste-ingenieuse du web : elle fait danser les SVG et les animations CSS comme une choregraphe du navigateur.
<!-- Animation SVG — Sarah Drasner -->
<svg viewBox="0 0 200 200">
<circle cx="100" cy="100" r="50">
<animate attributeName="r"
values="50;70;50" dur="1s"
repeatCount="indefinite" />
</circle>
</svg>Cas d'usage : Ses articles et conferences sur les animations web et la DX (Developer Experience) sont des references.
Structures cle-valeur en Sass, similaires aux objets JS. Manipulables avec map-get, map-merge, map-keys, map-values. Ideales pour les systemes de tokens.
Un dictionnaire : tu cherches un mot (cle) et tu obtiens sa definition (valeur).
@use 'sass:map';
$breakpoints: (sm: 640px, md: 768px, lg: 1024px);
@mixin respond($bp) {
@media (min-width: map.get($breakpoints, $bp)) {
@content;
}
}
.grid { @include respond('md') { display: grid; } }Cas d'usage : Stocker des systemes de tokens (couleurs, breakpoints, z-index) et les iterer avec @each.
Operateur qui verifie qu'une valeur est conforme a un type sans elargir le type infere. Combine la validation de type avec la preservation du type litteral.
Comme un controle qualite qui valide la conformite sans changer l'etiquette du produit.
type Colors = Record<string, [number, number, number]>;
const palette = {
red: [255, 0, 0],
green: [0, 255, 0],
} satisfies Colors;
palette.red; // type [number, number, number], pas ColorsCas d'usage : Valider une configuration tout en gardant l'autocompletion sur les cles et valeurs exactes.
Dirigeant indo-americain, CEO de Microsoft depuis 2014. Il a transforme Microsoft en adoptant le cloud (Azure), l'open source (achat de GitHub) et l'IA (partenariat OpenAI).
Le medecin qui a ressuscite Microsoft : il a remplace le 'Windows everywhere' par 'Cloud + IA + Open Source'.
// Transformation Microsoft sous Nadella
// - Azure (cloud #2 mondial)
// - GitHub (acquisition 2018)
// - VS Code (open source)
// - TypeScript (open source)
// - WSL (Linux dans Windows)
// Microsoft <3 Open SourceCas d'usage : Comprendre la transformation digitale d'une entreprise et l'importance strategique du cloud et de l'IA.
Module pour planifier des taches periodiques via des decorateurs cron (@Cron), interval (@Interval) ou timeout (@Timeout).
Comme un reveil programme : il execute automatiquement des actions a des heures definies.
@Injectable()
export class TaskService {
@Cron('0 0 * * *') // Chaque jour a minuit
async dailyCleanup() {
await this.sessionService.deleteExpired();
}
@Interval(30000) // Toutes les 30 secondes
checkHealth() { this.logger.log('Health check'); }
}Cas d'usage : Executer des taches de maintenance comme le nettoyage de sessions expirees ou l'envoi de rapports.
Definition de la structure d'un document Mongoose : types de champs, validations, valeurs par defaut et options. Le schema est la base pour creer un Model.
Le plan d'architecte d'une maison : il definit chaque piece avant meme de poser la premiere brique.
const userSchema = new Schema({
name: { type: String, required: true },
email: { type: String, unique: true },
age: { type: Number, min: 0 },
role: { type: String, enum: ['user', 'admin'] }
});Cas d'usage : Definir une structure stricte pour les documents MongoDB dans une application Node.js.
Ensemble de patterns eprouves pour modeler les donnees en MongoDB : Bucket (regrouper par intervalles), Outlier (gerer les documents anormalement gros), Computed (pre-calculer), Subset (charger un sous-ensemble).
Des recettes de cuisine pour architecte de donnees : chaque pattern resout un probleme recurrent.
// Bucket Pattern : IoT data
{
sensorId: 'A1',
date: '2024-01-15',
readings: [
{ t: '10:00', val: 22 },
{ t: '10:05', val: 23 }
],
count: 2
}Cas d'usage : Optimiser les schemas MongoDB pour des cas d'usage specifiques comme l'IoT, les reseaux sociaux ou le e-commerce.
Regles de validation JSON Schema appliquees au niveau de la collection pour garantir la structure et les types des documents inseres. Peut etre strict ou warning.
Un formulaire papier avec des champs obligatoires : impossible de le soumettre incomplet.
db.createCollection('users', {
validator: {
$jsonSchema: {
required: ['name', 'email'],
properties: {
email: { bsonType: 'string' }
}
}
}
});Cas d'usage : Garantir la qualite des donnees sans ORM, directement au niveau de la base.
Options de configuration par champ dans un Schema : type, required, default, unique, index, lowercase, uppercase, trim, minlength, maxlength, enum, validate.
Les attributs d'un champ de formulaire HTML : requis, longueur max, format email, etc.
{
email: {
type: String,
required: [true, 'Email requis'],
lowercase: true,
trim: true,
match: /^\S+@\S+$/
}
}Cas d'usage : Definir les contraintes et transformations de chaque champ directement dans le schema.
Chaine de references entre les scopes imbriques qui permet a une fonction d'acceder aux variables de ses scopes parents. La recherche remonte la chaine jusqu'au scope global.
Chercher un livre dans ta chambre, puis le salon, puis la bibliotheque municipale : tu remontes les niveaux jusqu'a trouver.
const global = 'G';
function outer() {
const mid = 'M';
function inner() {
const local = 'L';
console.log(global, mid, local); // G M L
}
inner();
}Cas d'usage : Comprendre la resolution des variables et eviter les collisions de noms entre scopes imbriques.
La structure des dossiers doit crier le domaine metier, pas le framework. On devrait deviner le metier en regardant l'arborescence.
Un plan de maison : on voit 'cuisine', 'chambre', 'salon' — pas 'mur', 'tuyau', 'cable electrique'.
// Mauvais: controllers/, services/, repositories/
// Bon:
src/
ordering/ // Feature metier
inventory/ // Feature metier
shipping/ // Feature metierCas d'usage : Rendre le code navigable par concept metier plutot que par pattern technique.
Logiciel qui lit le contenu de l'écran à voix haute en s'appuyant sur l'arbre d'accessibilité. NVDA, JAWS (Windows) et VoiceOver (macOS/iOS) sont les plus répandus.
Comme un guide audio dans un musée qui décrit chaque oeuvre pour les visiteurs qui ne peuvent pas les voir.
<!-- Bien : texte alt descriptif -->
<img src="graph.png" alt="Ventes en hausse de 20% au T3">
<!-- Mal : alt vide ou générique -->
<img src="graph.png" alt="image">Cas d'usage : Tester l'accessibilité en activant VoiceOver ou NVDA pour vérifier que le parcours utilisateur est compréhensible.
Propriétés CSS qui forcent le scroll à s'arrêter sur des points précis. Le conteneur définit scroll-snap-type et les enfants définissent scroll-snap-align.
Comme un carrousel de diapositives qui clique en place sur chaque slide au lieu de s'arrêter n'importe où.
.carousel {
display: flex; overflow-x: auto;
scroll-snap-type: x mandatory;
scroll-padding: 1rem;
}
.slide {
scroll-snap-align: start;
flex: 0 0 100%;
}Cas d'usage : Créer des carrousels, galeries horizontales ou sections plein écran avec accrochage natif sans JS.
API CSS qui lie une animation au défilement (scroll timeline) ou à la visibilité d'un élément (view timeline) sans JavaScript. Remplace les libraries de scroll-animation.
Comme un livre pop-up dont les éléments se déploient au fur et à mesure qu'on tourne les pages.
@keyframes reveal { from { opacity: 0; } }
.element {
animation: reveal linear both;
animation-timeline: view();
animation-range: entry 0% entry 100%;
}Cas d'usage : Créer des animations de révélation au scroll, barres de progression de lecture, ou parallaxe sans JS.
Developpeur australien, createur de Babel (transpileur JS) et de Rome/Biome (linter+formatter). Babel a permis d'utiliser ES6+ des 2015 dans tous les navigateurs.
Le traducteur simultanee de JavaScript : grace a Babel, les devs pouvaient parler le JS du futur des aujourd'hui.
// Avant Babel : code ES5 obligatoire
var greet = function(name) {
return 'Hello, ' + name;
};
// Apres Babel : ES6+ partout
const greet = (name) => `Hello, ${name}!`;Cas d'usage : Babel a ete essentiel a la modernisation de JavaScript. Biome represente la nouvelle generation d'outils.
Objet Kubernetes pour stocker des données sensibles (mots de passe, tokens, clés). Encodé en base64, pas chiffré par défaut.
Un coffre-fort au bureau : accès restreint, mais si la porte est ouverte tout le monde peut lire.
apiVersion: v1
kind: Secret
metadata:
name: db-creds
type: Opaque
data:
password: cGFzc3dvcmQxMjM=Cas d'usage : Injecter des credentials de base de données ou des clés API dans les Pods.
Pratiques et outils (Vault, AWS Secrets Manager, doppler) pour stocker, distribuer et rotationner les secrets applicatifs hors du code source.
Un coffre-fort numérique centralisé dont seuls les employés autorisés connaissent la combinaison, changée régulièrement.
// Using AWS Secrets Manager
const secret = await secretsManager.getSecretValue({
SecretId: 'prod/db/credentials'
}).promise();
const { username, password } = JSON.parse(secret.SecretString);Cas d'usage : Centraliser et sécuriser tous les secrets (DB, API, clés) avec rotation automatique en production.
Firewall virtuel au niveau instance contrôlant le trafic entrant (inbound) et sortant (outbound) par port, protocole et source/destination.
Le vigile d'un immeuble avec une liste d'invités : seuls ceux sur la liste (règles) peuvent entrer par la bonne porte (port).
resource "aws_security_group" "api" {
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}Cas d'usage : Restreindre l'accès aux bases de données uniquement depuis les serveurs applicatifs.
Processus de remplissage de la base de donnees avec des donnees initiales ou de test. Execute via des scripts ou des modules dedies au demarrage.
Comme meubler un appartement temoin : tu prepares des donnees de demo pour que tout soit fonctionnel.
@Injectable()
export class SeedService implements OnModuleInit {
constructor(private userService: UserService) {}
async onModuleInit() {
const count = await this.userService.count();
if (count === 0) {
await this.userService.create({ email: 'admin@app.com', role: 'admin' });
}
}
}Cas d'usage : Initialiser les roles, permissions ou comptes admin lors du premier deploiement.
Methode de query qui specifie les champs a inclure ou exclure du resultat. Equivalent de la projection MongoDB mais avec une syntaxe Mongoose.
Cocher les colonnes que tu veux voir dans un tableur avant d'exporter.
const user = await User
.findById(id)
.select('name email -_id');Cas d'usage : Ne retourner que les champs necessaires dans une reponse API pour reduire la bande passante.
Utilisation de balises HTML qui décrivent le sens du contenu plutôt que son apparence. Les éléments comme <article>, <nav>, <aside> communiquent la structure aux navigateurs, lecteurs d'écran et moteurs de recherche.
Comme les panneaux de signalisation routière : un panneau 'hôpital' dit ce que c'est, pas juste 'bâtiment bleu'.
<article>
<header><h1>Titre</h1></header>
<section><p>Contenu</p></section>
<footer><time>2024</time></footer>
</article>Cas d'usage : Sur chaque page web pour améliorer le SEO, l'accessibilité et la maintenabilité du code.
Outil qui automatise entierement le versioning semantique (semver) et la publication npm a partir des messages de commit conventionnels. Zero intervention manuelle.
Comme un robot comptable qui analyse vos factures et genere automatiquement le bilan : pas d'erreur humaine possible.
// .releaserc.json
{
"branches": ["main"],
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/npm",
"@semantic-release/github"
]
}
// feat: => minor, fix: => patch, BREAKING: => majorCas d'usage : Pour les librairies publiees sur npm qui veulent un versioning 100% automatise et fiable.
Convention de versionnement MAJOR.MINOR.PATCH. Major = breaking change, Minor = nouvelle feature rétrocompatible, Patch = correction de bug.
L'adresse d'un immeuble : numéro de rue (major), étage (minor), numéro d'appartement (patch).
// 1.0.0 -> 1.0.1 (bugfix)
// 1.0.1 -> 1.1.0 (new feature)
// 1.1.0 -> 2.0.0 (breaking change)
npm version patch // 1.0.0 -> 1.0.1
npm version minor // 1.0.1 -> 1.1.0
npm version major // 1.1.0 -> 2.0.0Cas d'usage : Communiquer clairement l'impact d'une mise à jour aux consommateurs d'une lib/API.
Decoupe un programme en sections distinctes, chacune traitant une preoccupation specifique. Minimise le chevauchement de responsabilites.
Les rayons d'un supermarche : fruits, viande, boissons — chaque rayon a sa specialite.
// Separe: route, validation, business, persistence
router.post('/users', validate(schema), async (req, res) => {
const user = await userService.create(req.body);
res.json(user);
});Cas d'usage : Fondement de toute architecture en couches : UI, logique, donnees.
Informaticien russo-americain, co-fondateur de Google avec Larry Page. Il a co-developpe PageRank et dirige les projets innovants de Google (Google X, Google Glass).
Le co-pilote de Google : pendant que Page organisait, Brin explorait les frontieres de l'innovation.
// Google Search — Brin & Page, 1998
// Architecture MapReduce (2004)
// map(key, value) -> [(k2, v2)]
// reduce(k2, [v2]) -> [v3]
// A permis de traiter le web entier
// Inspire Hadoop et le Big DataCas d'usage : Comprendre l'echelle de Google et les bases du traitement distribue des donnees (MapReduce, Big Data).
SERIAL est un entier auto-incremente (1, 2, 3...). UUID est un identifiant unique universel de 128 bits. SERIAL est simple mais previsible, UUID est unique mondialement.
SERIAL = numero de ticket dans une file d'attente. UUID = numero de passeport, unique dans le monde entier.
CREATE TABLE orders (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
seq SERIAL
);Cas d'usage : UUID pour les systemes distribues ou la securite. SERIAL pour la simplicite et la lisibilite.
Transformation des objets en reponse JSON via ClassSerializerInterceptor et class-transformer. Permet d'exclure des champs sensibles avec @Exclude.
Comme un filtre photo qui masque les informations sensibles avant de publier.
export class UserEntity {
id: number;
email: string;
@Exclude()
password: string;
constructor(partial: Partial<UserEntity>) {
Object.assign(this, partial);
}
}Cas d'usage : Masquer les mots de passe, tokens internes et donnees sensibles des reponses API.
Fonctions asynchrones cote serveur invoquees directement depuis des composants client, typiquement via l'attribut action d'un formulaire. Remplacent les routes API manuelles.
Comme commander par telephone : tu passes l'ordre (client) et la cuisine (serveur) execute, sans aller au comptoir (API route).
// action.ts
'use server';
export async function addTodo(formData: FormData) {
await db.todos.create({ text: formData.get('text') });
revalidatePath('/todos');
}
// component.tsx
<form action={addTodo}><input name="text" /><button>Add</button></form>Cas d'usage : Soumission de formulaires, CRUD, toute mutation serveur avec revalidation automatique.
Protocole HTTP unidirectionnel serveur vers client pour le streaming d'événements. Plus simple que WebSocket quand la communication bidirectionnelle n'est pas nécessaire.
Une radio FM : le serveur diffuse et les clients écoutent, sans pouvoir répondre par le même canal.
// Server (Node.js)
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
setInterval(() => {
res.write(`data: ${JSON.stringify(getUpdate())}\n\n`);
}, 1000);Cas d'usage : Notifications serveur, flux d'actualités, suivi de progression d'un traitement long.
Validation des donnees cote serveur en complement du client, car la validation client est contournable. Avec Server Actions, le meme schema Zod peut valider des deux cotes.
Comme un double controle de securite : le portique (client) puis la fouille (serveur). Le portique seul ne suffit pas.
'use server';
const schema = z.object({ email: z.string().email() });
export async function createUser(formData: FormData) {
const result = schema.safeParse(Object.fromEntries(formData));
if (!result.success) return { errors: result.error.flatten() };
await db.users.create(result.data);
}Cas d'usage : Toute mutation de donnees : la validation client est UX, la validation serveur est securite.
Modele ou le cloud gere l'infrastructure. Le code s'execute en fonctions ephemeres declenchees par des evenements, facturees a l'execution.
Un taxi : tu paies la course, pas la voiture. Pas de parking, pas d'entretien.
// AWS Lambda
export const handler = async (event) => {
const body = JSON.parse(event.body);
const result = await processOrder(body);
return { statusCode: 200, body: JSON.stringify(result) };
};Cas d'usage : Workloads imprevisibles, APIs legeres, traitement d'evenements, prototypage rapide.
Modèle d'exécution où le cloud provider gère l'infrastructure. Le code s'exécute en fonctions éphémères, facturées à l'exécution. Ex : AWS Lambda, Vercel Functions.
Un taxi : tu paies la course (exécution) sans acheter ni entretenir de voiture (serveur).
// AWS Lambda handler
export const handler = async (event) => {
const body = JSON.parse(event.body);
const result = await processOrder(body);
return { statusCode: 200, body: JSON.stringify(result) };
};Cas d'usage : APIs à trafic variable, traitement d'événements, webhooks, cron jobs.
Provider dedie a la logique metier, annote @Injectable. Il encapsule les operations de domaine et est injecte dans les controllers ou autres services.
Comme le chef cuisinier d'un restaurant : le serveur (controller) prend la commande mais c'est le chef qui cuisine.
@Injectable()
export class UserService {
constructor(private repo: UserRepository) {}
async findAll(): Promise<User[]> {
return this.repo.find();
}
}Cas d'usage : Centraliser la logique metier pour qu'elle soit testable independamment des controllers.
Abstraction réseau stable exposant un ensemble de Pods via une IP fixe et un DNS interne. Types : ClusterIP, NodePort, LoadBalancer.
Un standard téléphonique : un seul numéro (Service) redirige vers le bon employé disponible (Pod).
apiVersion: v1
kind: Service
metadata:
name: api-svc
spec:
selector: { app: api }
ports:
- port: 80
targetPort: 3000
type: ClusterIPCas d'usage : Permettre la communication inter-services sans connaître les IPs éphémères des Pods.
Registre central qui gere la creation et la resolution des dependances. C'est le coeur des frameworks modernes (Laravel, Symfony) pour l'injection de dependances.
Comme un annuaire d'entreprise : quand tu as besoin d'un service, tu demandes au standard qui te met en relation.
// Enregistrement
$container->bind(Logger::class, FileLogger::class);
// Resolution automatique
$service = $container->make(OrderService::class);
// Les dependances sont resolues automatiquementCas d'usage : Dans tout framework PHP moderne pour gerer les dependances et leur cycle de vie.
Registre central qui fournit des services a la demande. Considere comme un anti-pattern car il cache les dependances au lieu de les rendre explicites.
Les Pages Jaunes : tu cherches un plombier sans savoir lequel tu auras. Le probleme : tu ne vois pas les dependances.
class ServiceLocator {
static #services = new Map();
static register(name, svc) { this.#services.set(name, svc); }
static get(name) { return this.#services.get(name); }
}Cas d'usage : Legacy code ou l'injection de dependances n'est pas disponible.
Proxy programmable entre l'app et le reseau, tournant en arriere-plan. Intercepte les requetes fetch pour implementer du cache offline, des push notifications et la synchronisation en arriere-plan.
Un concierge d'hotel qui intercepte ton courrier : il peut te le remettre du stock (cache) sans appeler le facteur (reseau).
// sw.js
self.addEventListener('fetch', (e) => {
e.respondWith(
caches.match(e.request)
.then(cached => cached || fetch(e.request))
);
});
// Registration
navigator.serviceWorker.register('/sw.js');Cas d'usage : PWA offline-first, cache intelligent, push notifications, background sync.
Attaque ou l'attaquant fixe l'ID de session d'un utilisateur avant qu'il se connecte, puis utilise cet ID pour usurper sa session.
Comme donner une cle de chambre d'hotel a quelqu'un et attendre qu'il s'y installe pour entrer apres lui.
// Apres login reussi, TOUJOURS regenerer
session_regenerate_id(true);
// Configuration stricte
ini_set('session.use_strict_mode', 1);
ini_set('session.use_only_cookies', 1);Cas d'usage : Apres chaque changement de niveau de privilege (login, elevation de droits).
Sessions stockent l'état côté serveur (cookie + store), tokens sont stateless (JWT côté client). Sessions offrent révocation facile, tokens offrent scalabilité horizontale.
Session = badge gardé au registre de l'accueil. Token = badge avec toutes les infos imprimées dessus.
// Session: server stores state
req.session.userId = user.id; // Stored in Redis
// Token: client stores state
const token = jwt.sign({ userId: user.id }, secret);
res.json({ accessToken: token });Cas d'usage : Choisir sessions pour les apps monolithiques classiques, tokens pour les API/microservices.
Collection de valeurs uniques de n'importe quel type. L'ajout d'un doublon est silencieusement ignore. Iterable et ordonnee par ordre d'insertion.
Un tampon encreur qui marque les invites a l'entree : meme si tu te representes, tu n'es compte qu'une fois.
const unique = new Set([1, 2, 2, 3]);
unique.size; // 3
unique.add(4);
unique.has(2); // true
// Deduplication rapide
[...new Set(array)];Cas d'usage : Deduplication de tableaux, tracking d'elements uniques, verification d'appartenance O(1).
Collection de composants React copies dans le projet (pas un npm package). Base sur Radix UI + Tailwind, entierement personnalisable car le code est dans ton repo.
Un livre de recettes ou tu photographies chaque recette : tu peux modifier les ingredients a volonte.
// npx shadcn-ui@latest add button
import { Button } from '@/components/ui/button'
<Button variant="destructive" size="lg">
Supprimer
</Button>Cas d'usage : Bootstrapper une UI React avec des composants accessibles et personnalisables sans dependance npm lourde.
Sous-arbre DOM encapsulé attaché à un élément hôte. Le CSS et le JS internes sont isolés du document principal, évitant les conflits de styles et de noms.
Comme un appartement dans un immeuble : chaque logement a sa propre décoration sans affecter les voisins.
class MyCard extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
shadow.innerHTML = `
<style>p { color: blue; }</style>
<p><slot></slot></p>`;
}
}Cas d'usage : Créer des composants UI réutilisables avec encapsulation totale des styles dans un design system.
Champ (ou index compose) utilise pour distribuer les documents entre les shards. Le choix de la shard key est irreversible et determine la repartition et les performances du cluster.
Le critere de tri pour repartir les eleves entre les classes : par age, par nom, par niveau.
sh.shardCollection(
'mydb.orders',
{ customerId: 'hashed' }
);Cas d'usage : Distribuer les donnees sur plusieurs serveurs quand une seule machine ne suffit plus.
Partitionnement horizontal des données sur plusieurs instances de base de données. Chaque shard contient un sous-ensemble des données.
Diviser un annuaire téléphonique en volumes A-M et N-Z pour que deux personnes cherchent en parallèle.
// Shard key basée sur userId
const shardId = hash(userId) % NUM_SHARDS;
const db = shardConnections[shardId];
await db.query('INSERT INTO orders ...', [order]);Cas d'usage : Dépasser les limites d'une seule machine quand la base atteint des téraoctets.
Hashed sharding distribue les documents uniformement via un hash de la shard key (bon pour l'ecriture). Range sharding les repartit par plages de valeurs (bon pour les requetes par intervalle).
Hashed = distribuer les cartes au hasard entre les joueurs. Range = donner les cartes 1-10 au joueur 1, 11-20 au joueur 2.
// Hashed
sh.shardCollection('db.users', { _id: 'hashed' });
// Range
sh.shardCollection('db.logs', { timestamp: 1 });Cas d'usage : Hashed pour les ecritures haute frequence. Range pour les requetes temporelles ou par intervalles.
Configuration qui filtre les props passees au DOM. Empeche les props custom de generer des attributs HTML invalides et des warnings React.
Un videur de boite : il laisse passer les props HTML valides et refuse les custom.
import styled from 'styled-components'
import isPropValid from '@emotion/is-prop-valid'
const Box = styled('div').withConfig({
shouldForwardProp: (prop) =>
isPropValid(prop) && prop !== 'color',
})`
color: ${({ color }) => color};
`Cas d'usage : Eviter les warnings React 'Unknown prop' quand des props custom sont utilisees pour le styling.
Toute modification d'etat observable en dehors de la fonction : mutation de variable globale, ecriture DOM, appel reseau, console.log, modification d'arguments. L'oppose d'une pure function.
Laisser des miettes sur la table en mangeant : tu as fait ton action (manger) mais tu as aussi change l'environnement.
// Side effects
let total = 0;
function addToTotal(n) {
total += n; // mutation globale
console.log(total); // I/O
document.title = n; // DOM
}Cas d'usage : Necessaires en pratique (I/O, DOM, API), mais a isoler et controler dans des couches dediees.
Code execute a l'import d'un module (polyfills, CSS imports, enregistrement global). Le champ sideEffects dans package.json indique au bundler quels fichiers ont des effets de bord.
Un colis piege : juste en l'ouvrant (import), quelque chose se declenche automatiquement.
// polyfill.js (side effect)
import 'core-js/stable';
// package.json
{
"sideEffects": ["*.css", "./src/polyfills.js"]
}
// false = aucun side effect, tree shaking totalCas d'usage : Declarer correctement sideEffects pour permettre un tree shaking optimal par le bundler.
Deploie des fonctionnalites annexes dans un processus ou conteneur separe, attache au service principal. Decouple les concerns transversaux.
Le side-car d'une moto : un passager (le proxy) voyage a cote sans modifier la moto elle-meme.
# docker-compose.yml
services:
app:
image: my-app
envoy-sidecar:
image: envoyproxy/envoy
network_mode: 'service:app'Cas d'usage : Service mesh (Istio/Envoy), logging, monitoring, mTLS sans modifier le code applicatif.
Primitives reactives a grain fin qui mettent a jour le DOM directement sans re-rendu de composant. Popularises par Preact/SolidJS, en discussion pour React.
Comme un tableau d'affichage electronique : seule la case qui change se met a jour, pas tout le panneau.
// Avec @preact/signals-react
import { signal, computed } from '@preact/signals-react';
const count = signal(0);
const double = computed(() => count.value * 2);
function App() {
return <p>{count} x 2 = {double}</p>;
}Cas d'usage : Performance maximale avec des mises a jour granulaires sans reconciliation de tout le sous-arbre.
Commits signés cryptographiquement avec GPG ou SSH pour prouver l'identité de l'auteur. Badge Verified sur GitHub.
Un courrier recommandé avec signature : tu prouves que c'est bien toi qui l'as envoyé.
git config --global commit.gpgsign true
git config --global user.signingkey ABC123
git commit -S -m "feat: signed commit"
git log --show-signatureCas d'usage : Prouver l'authenticité des commits dans les projets critiques et open source.
Developpeur norvegien, auteur de plus de 1000 packages npm (got, globby, p-limit, execa, etc.). Il milite pour les ES modules et le small modules pattern dans l'ecosysteme Node.js.
Le recordman de npm : avec plus de 1000 packages, il est a lui seul une usine a briques Lego pour JavaScript.
// Packages de Sindre Sorhus
import got from 'got';
import pLimit from 'p-limit';
const limit = pLimit(5);
const results = await Promise.all(
urls.map(url => limit(() => got(url).json()))
);Cas d'usage : Ses packages sont des dependances de milliers de projets. Comprendre le 'small modules' pattern de npm.
Index cree sur un seul champ d'une collection. Accelere les requetes qui filtrent ou trient sur ce champ. MongoDB cree automatiquement un index sur _id.
L'index alphabetique a la fin d'un livre : tu trouves le mot sans lire toutes les pages.
db.users.createIndex({ email: 1 });
// 1 = ascendant, -1 = descendantCas d'usage : Optimiser les requetes frequentes sur un champ comme email, username ou createdAt.
Une classe ne doit avoir qu'une seule raison de changer. Chaque classe se concentre sur une seule responsabilite metier.
Comme un employe specialise : le cuisinier cuisine, le serveur sert, le caissier encaisse.
// Mauvais: une classe qui fait tout
// class User { save(), sendEmail(), generatePDF() }
// Bon: responsabilites separees
class UserRepository { public function save(User $u) {} }
class UserMailer { public function welcome(User $u) {} }
class UserExporter { public function toPDF(User $u) {} }Cas d'usage : Toujours : chaque classe creee doit avoir une responsabilite claire et unique.
Pattern qui garantit qu'une classe n'a qu'une seule instance et fournit un point d'acces global. Souvent considere comme un anti-pattern en contexte d'injection de dependances.
Le president d'un pays : il n'y en a qu'un seul a la fois, et tout le monde sait comment le contacter.
class DB {
static #instance;
static getInstance() {
if (!DB.#instance) DB.#instance = new DB();
return DB.#instance;
}
}Cas d'usage : Connexion base de donnees ou logger quand on ne dispose pas de conteneur DI.
Pattern qui garantit qu'une classe n'a qu'une seule instance et fournit un point d'acces global. Souvent considere comme un anti-pattern en PHP moderne.
Comme le president d'un pays : il n'y en a qu'un seul a la fois, accessible par tous.
class Database {
private static ?self $instance = null;
private function __construct() {}
public static function getInstance(): self {
return self::$instance ??= new self();
}
}Cas d'usage : Rarement justifie en PHP moderne : le service container gere deja les instances uniques.
SLI = métrique mesurée (latence p99). SLO = objectif interne (p99 < 200ms). SLA = engagement contractuel client avec pénalités (99.9% uptime).
SLI = le thermomètre. SLO = la température souhaitée. SLA = la garantie du chauffagiste avec remboursement si pas atteint.
// SLI : latence p99 mesurée
// SLO : p99 < 200ms, disponibilité > 99.95%
// SLA : 99.9% uptime, sinon crédit client
// Error budget = 100% - SLO = 0.05% de marge d'erreurCas d'usage : Définir des objectifs de fiabilité et savoir quand investir en stabilité vs features.
Point d'insertion dans le Shadow DOM où le contenu externe (Light DOM) est projeté. Les slots nommés permettent de distribuer plusieurs blocs de contenu à des emplacements précis.
Comme les espaces réservés dans un cadre photo : chaque emplacement accueille une image différente.
<!-- Shadow DOM du composant -->
<slot name="header">Titre par défaut</slot>
<slot>Contenu par défaut</slot>
<!-- Utilisation -->
<my-card>
<h2 slot="header">Mon Titre</h2>
<p>Mon contenu projeté</p>
</my-card>Cas d'usage : Permettre la personnalisation du contenu d'un Web Component tout en gardant le style encapsulé.
Pattern qui permet au parent de passer du contenu JSX dans des emplacements nommes du composant enfant, via des props ou children specifiques.
Comme un formulaire administratif avec des cases a remplir : chaque case (slot) attend un contenu specifique.
function Layout({ header, sidebar, children }) {
return (
<div className="layout">
<header>{header}</header>
<aside>{sidebar}</aside>
<main>{children}</main>
</div>
);
}
<Layout header={<Nav />} sidebar={<Menu />}>Contenu</Layout>Cas d'usage : Composants de layout configurables avec plusieurs zones de contenu (header, footer, sidebar).
Scalable and Modular Architecture for CSS. Categorise les styles en 5 types : Base, Layout (l-), Module, State (is-), Theme. Aide a la maintenabilite.
Un code de rangement par couleur : chaque type de vetement a sa couleur d'etiquette.
/* Base */
body { font: 16px/1.5 sans-serif; }
/* Layout */
.l-sidebar { width: 250px; }
/* Module */
.card { border: 1px solid #ddd; }
/* State */
.is-active { display: block; }
/* Theme */
.theme-dark .card { background: #333; }Cas d'usage : Structurer un CSS legacy ou un projet sans framework composant (multi-page apps).
Test rapide et superficiel qui verifie que les fonctionnalites principales de l'application fonctionnent apres un deploiement. Ne teste pas en profondeur.
Comme tourner la cle de contact pour verifier que le moteur demarre, sans faire un tour complet du circuit.
// smoke.test.js
test('homepage loads', async () => {
const res = await fetch('https://myapp.com');
expect(res.status).toBe(200);
});
test('API health check', async () => {
const res = await fetch('https://api.myapp.com/health');
expect(res.ok).toBe(true);
});Cas d'usage : Apres chaque deploiement pour detecter immediatement si quelque chose de fondamental est casse.
Test qui capture la sortie d'un composant (HTML, JSON) et la compare a une reference enregistree. Toute difference inattendue fait echouer le test.
Comme prendre une photo de votre salon et comparer chaque jour : si un meuble a bouge, vous le detectez immediatement.
// Button.test.jsx
import { render } from '@testing-library/react';
test('Button matches snapshot', () => {
const { container } = render(
<Button variant="primary">Click</Button>
);
expect(container).toMatchSnapshot();
});Cas d'usage : Pour detecter les changements involontaires dans le rendu des composants UI.
Architecture ou les fonctionnalites sont exposees comme des services reutilisables communiquant via des protocoles standardises. Predecesseur des microservices.
Les services publics d'une ville : poste, mairie, hopital — chacun rend un service specifique accessible a tous.
// Service SOAP classique (legacy)
<wsdl:service name="UserService">
<wsdl:port binding="tns:UserBinding">
<soap:address location="http://api/users"/>
</wsdl:port>
</wsdl:service>Cas d'usage : Entreprises avec systemes heterogenes necessitant interoperabilite via ESB.
Bibliothèque temps réel au-dessus de WebSocket avec fallback automatique. Les Rooms groupent les clients, les Namespaces séparent les canaux logiques.
Un immeuble (namespace) avec des appartements (rooms) : chaque message va à la bonne pièce du bon étage.
const chat = io.of('/chat');
chat.on('connection', (socket) => {
socket.join('room-42');
chat.to('room-42').emit('message', {
user: socket.id, text: 'Hello!'
});
});Cas d'usage : Construire un chat multi-salons avec reconnexion automatique et support des anciens navigateurs.
Cinq principes de conception OO : Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion. Fondamentaux du code maintenable.
Les cinq regles d'or de la construction : chacune empeche un type de defaut structurel.
// S: une classe, une raison de changer
// O: ouvert a l'extension, ferme a la modification
// L: les sous-types substituent le type parent
// I: interfaces specifiques > interface generale
// D: dependre des abstractions, pas des concretionsCas d'usage : Guide de design pour ecrire du code flexible, testable et maintenable.
Entrepreneur franco-americain, createur de Docker. Docker a demystifie les conteneurs Linux et revolutionne le deploiement logiciel.
L'inventeur du container maritime du logiciel : empaqueter une app avec tout ce dont elle a besoin, deployable partout.
# Dockerfile — Solomon Hykes, 2013
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]Cas d'usage : Docker est devenu le standard du deploiement. Comprendre son createur aide a saisir la revolution DevOps.
Plateforme d'analyse continue de la qualite du code qui detecte les bugs, vulnerabilites, code smells et la dette technique. Fournit un quality gate configurable.
Comme un bilan de sante complet pour votre codebase : il analyse tout et vous donne un rapport detaille avec un score global.
// sonar-project.properties
sonar.projectKey=my-app
sonar.sources=src
sonar.tests=tests
sonar.coverage.exclusions=**/*.test.ts
// Quality Gate: Coverage > 80%
// Duplications < 3%
// No new bugsCas d'usage : Pour suivre la qualite du code en continu et bloquer les PR qui degradent les metriques definies.
Methode de curseur qui trie les resultats selon un ou plusieurs champs. 1 pour ascendant, -1 pour descendant.
Demander au bibliothecaire de ranger les livres par date de publication avant de te les presenter.
db.users.find({})
.sort({ age: -1, name: 1 });Cas d'usage : Afficher les resultats dans un ordre precis comme les articles les plus recents en premier.
Fichiers .map qui relient le code minifie/bundle au code source original. Permettent de debugger en production avec les fichiers originaux dans le navigateur.
Comme un plan de correspondance entre les noms de code et les vrais noms : quand une erreur survient, vous retrouvez le vrai fichier.
// vite.config.ts
export default defineConfig({
build: {
sourcemap: true, // genere .js.map
},
});
// Les source maps NE doivent PAS
// etre servies en public (securite)
// Les uploader vers Sentry/Datadog a la placeCas d'usage : Pour debugger les erreurs en production avec les numeros de ligne et fichiers originaux.
Utilitaires space-x et space-y qui ajoutent un espacement entre les enfants d'un conteneur via des marges automatiques. Alternative a gap pour les anciens navigateurs.
Des separateurs automatiques entre les livres sur une etagere.
<div class="space-y-4">
<p>Premier</p>
<p>Deuxieme (margin-top: 1rem auto)</p>
<p>Troisieme</p>
</div>Cas d'usage : Espacer uniformement les enfants d'une liste verticale ou horizontale.
Index qui n'indexe que les documents ou le champ existe. Les documents sans le champ ne sont pas dans l'index, ce qui le rend plus compact.
Un annuaire qui ne liste que les gens ayant un telephone, pas ceux sans numero.
db.users.createIndex(
{ phone: 1 },
{ sparse: true, unique: true }
);Cas d'usage : Creer un index unique sur un champ optionnel comme le numero de telephone.
Encapsule une regle metier dans un objet reutilisable et composable. Les specifications peuvent etre combinees avec AND, OR, NOT.
Les filtres d'une recherche immobiliere : 3 chambres ET jardin ET moins de 300k — chaque critere est un filtre composable.
class ActiveUserSpec {
isSatisfiedBy(user) { return user.active && !user.banned; }
}
class AndSpec {
constructor(a, b) { this.a = a; this.b = b; }
isSatisfiedBy(x) { return this.a.isSatisfiedBy(x) && this.b.isSatisfiedBy(x); }
}Cas d'usage : Regles metier complexes reutilisees dans les requetes, validations et autorisations.
L'operateur ... sert de spread (etaler un iterable) ou rest (collecter les arguments restants). Spread copie superficiellement, rest regroupe dans un tableau.
Spread = etaler les cartes sur la table. Rest = ramasser toutes les cartes restantes en un paquet.
// Spread
const merged = { ...obj1, ...obj2 };
const copy = [...array];
// Rest
function sum(...nums) {
return nums.reduce((a, b) => a + b, 0);
}Cas d'usage : Copier/fusionner objets et tableaux de maniere immutable, collecter des arguments variadiques.
API de Vanilla Extract qui genere des utilitaires atomiques type-safe (similaire a Tailwind mais avec du TypeScript). Cree un ensemble fini de classes utilitaires au build.
Un set d'epices pre-dosees : tu combines celles que tu veux, tout est type-safe.
import { defineProperties, createSprinkles } from
'@vanilla-extract/sprinkles'
const props = defineProperties({
properties: {
padding: { sm: '4px', md: '8px', lg: '16px' },
display: ['flex', 'grid', 'block'],
}
})
export const sprinkles = createSprinkles(props)Cas d'usage : Creer un systeme d'utilitaires CSS atomiques type-safe et zero-runtime.
Vulnerabilite ou un attaquant injecte du code SQL malveillant via des entrees utilisateur non assainies. L'une des failles les plus critiques et frequentes.
Comme un intrus qui ajoute des instructions sur un bon de commande pour se faire livrer gratuitement.
// DANGEREUX
$sql = "SELECT * FROM users WHERE id = $id";
// SECURISE
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $id]);Cas d'usage : Prevention obligatoire sur TOUTE requete SQL utilisant des donnees externes.
Server-Sent Events : protocole HTTP unidirectionnel du serveur vers le client. Plus simple que WebSocket quand le flux est unidirectionnel.
Comme une radio : le serveur diffuse et les clients ecoutent, sans possibilite de repondre via le meme canal.
@Controller('events')
export class EventController {
@Sse('stream')
stream(): Observable<MessageEvent> {
return interval(1000).pipe(
map(i => ({ data: { count: i } } as MessageEvent)),
);
}
}Cas d'usage : Streamer des mises a jour de progression, logs temps reel ou notifications sans WebSocket.
Les pages HTML sont generees au moment du build, pas a la requete. Resultat ultra-rapide puisque le CDN sert des fichiers statiques pre-generes.
Comme imprimer des flyers a l'avance : pas besoin de les creer a la demande, ils sont deja prets a distribuer.
// Next.js - page statique par defaut dans App Router
export default async function Blog() {
const posts = await getPosts(); // execute au build
return posts.map(p => <article key={p.id}>{p.title}</article>);
}
// export const dynamic = 'force-static';Cas d'usage : Blogs, documentation, pages marketing dont le contenu ne change pas a chaque requete.
Le serveur genere le HTML complet a chaque requete. Le navigateur affiche la page immediatement puis l'hydrate avec React pour la rendre interactive.
Comme un plat prepare au restaurant (serveur) vs un kit a assembler chez soi (CSR) : le client recoit un plat deja pret.
// Next.js App Router
export default async function Page() {
const data = await fetch('https://api.example.com/data');
const posts = await data.json();
return <PostList posts={posts} />;
}Cas d'usage : Pages publiques necessitant un bon SEO et un premier affichage rapide (e-commerce, blogs, landing pages).
Mecanisme pour extraire les styles generes cote serveur et les injecter dans le HTML initial. Evite le flash of unstyled content (FOUC) en SSR/SSG.
Preparer les vetements la veille pour ne pas sortir en pyjama le matin (FOUC).
import { ServerStyleSheet } from 'styled-components'
const sheet = new ServerStyleSheet()
try {
const html = renderToString(
sheet.collectStyles(<App />)
)
const styles = sheet.getStyleTags()
// Injecter styles dans le <head>
} finally { sheet.seal() }Cas d'usage : Integrer styled-components avec Next.js ou tout framework SSR pour eviter le FOUC.
Groupe logique d'étapes dans un pipeline (build, test, deploy). Les stages s'exécutent séquentiellement, les jobs dans un stage en parallèle.
Les étapes d'un examen : écrit d'abord, puis oral. Tu passes à l'oral seulement si l'écrit est réussi.
stages:
- build
- test
- deploy
build-job:
stage: build
script: npm run buildCas d'usage : Organiser le pipeline pour fail fast : pas de deploy si les tests échouent.
Donnees internes et mutables d'un composant. Quand le state change, React re-rend le composant pour refleter la nouvelle valeur.
Comme le score dans un jeu video : il change au fil du temps et l'affichage se met a jour automatiquement.
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(c => c + 1)}>
Clics: {count}
</button>
);Cas d'usage : Stocker des donnees dynamiques propres a un composant (formulaires, toggles, compteurs).
Permet a un objet de modifier son comportement quand son etat interne change. L'objet semble changer de classe.
Un distributeur de boissons : son comportement change selon qu'il attend une piece, a recu le paiement ou est en rupture.
class Order {
setState(state) { this.state = state; }
next() { this.state.next(this); }
}
class PendingState {
next(order) { order.setState(new PaidState()); }
}Cas d'usage : Machine a etats pour workflows (commande, paiement), connexions reseau, UI.
Bibliothèque JavaScript pour modéliser la logique applicative comme des machines à états finis. Garantit que seules les transitions valides sont possibles.
Un distributeur automatique qui ne peut être que dans un état à la fois : en attente, en paiement, en distribution.
import { createMachine } from 'xstate';
const orderMachine = createMachine({
initial: 'pending',
states: {
pending: { on: { PAY: 'processing' } },
processing: { on: { SUCCESS: 'shipped', FAIL: 'pending' } },
shipped: { on: { DELIVER: 'delivered' } },
delivered: { type: 'final' },
},
});Cas d'usage : Modéliser des workflows complexes (commande, formulaire multi-étapes, lecteur vidéo) sans bugs d'état.
Pattern qui permet au consommateur d'un composant de personnaliser les transitions d'etat en fournissant son propre reducer, fusionnant avec le comportement par defaut.
Comme un pilote automatique avec override : l'avion vole seul mais le pilote peut reprendre le controle a tout moment.
function useToggle({ reducer = defaultReducer } = {}) {
const [state, dispatch] = useReducer(reducer, { on: false });
const toggle = () => dispatch({ type: 'TOGGLE' });
return { ...state, toggle };
}
// L'utilisateur peut injecter son reducer custom
const { on, toggle } = useToggle({
reducer: (state, action) => action.type === 'TOGGLE' && tooMany ? state : defaultReducer(state, action)
});Cas d'usage : Librairies/composants generiques ou l'utilisateur doit pouvoir overrider le comportement interne.
Prefixes conditionnels (hover:, focus:, active:, disabled:, etc.) qui appliquent un style uniquement dans un etat specifique de l'element.
Comme un cameleon qui change de couleur selon la situation : touche, survole, presse.
<button class="bg-blue-500 hover:bg-blue-700
focus:ring-2 focus:ring-blue-300
active:scale-95 disabled:opacity-50">
Action
</button>Cas d'usage : Gerer les interactions utilisateur (survol, focus, clic) sans ecrire de pseudo-selectors CSS.
Extension des FSM avec états hiérarchiques (imbriqués), parallèles et historiques. Permet de modéliser des systèmes complexes tout en gardant la rigueur des FSM.
Un organigramme d'entreprise avec des départements (états parents) contenant des équipes (sous-états) travaillant en parallèle.
const machine = createMachine({
type: 'parallel',
states: {
player: { initial: 'paused',
states: { paused: {}, playing: {} } },
volume: { initial: 'normal',
states: { muted: {}, normal: {}, loud: {} } },
},
});Cas d'usage : Modéliser des interfaces complexes avec plusieurs sous-systèmes indépendants (lecteur média, formulaires).
Contrôleur pour applications stateful nécessitant une identité réseau stable et un stockage persistant. Les Pods ont des noms ordonnés (app-0, app-1).
Des places de parking numérotées : chaque voiture (Pod) a toujours la même place et le même numéro.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongo
spec:
serviceName: mongo
replicas: 3
volumeClaimTemplates:
- metadata: { name: data }
spec: { resources: { requests: { storage: 10Gi } } }Cas d'usage : Déployer des bases de données (MongoDB, PostgreSQL) ou des systèmes distribués (Kafka).
Statics sont des methodes sur le Model (niveau classe). Methods sont des methodes sur l'instance du document. Permettent d'ajouter de la logique metier au modele.
Statics = methode de classe ('User.findByEmail'). Methods = methode d'instance ('alice.comparePassword').
// Static (sur le Model)
userSchema.statics.findByEmail = function(email) {
return this.findOne({ email });
};
// Method (sur le document)
userSchema.methods.isAdmin = function() {
return this.role === 'admin';
};Cas d'usage : Encapsuler la logique metier dans le modele au lieu de la disperser dans les services.
Entrepreneur americain, co-fondateur d'Apple. Il a revolutionne l'informatique personnelle (Mac), la musique (iPod/iTunes), le telephone (iPhone) et la tablette (iPad) par son obsession du design.
Le chef d'orchestre qui ne jouait d'aucun instrument mais faisait jouer les autres comme personne.
// Philosophie Steve Jobs
// 'Design is not just what it looks like.
// Design is how it works.'
//
// UX > Features
// Simplicite > Complexite
// 'One more thing...'Cas d'usage : Comprendre l'importance du design, de l'experience utilisateur et de la vision produit dans la tech.
Ingenieur americain, co-fondateur d'Apple avec Steve Jobs. Il a concu seul l'Apple I et l'Apple II, des machines qui ont lance la revolution de l'informatique personnelle.
Le genie du garage : pendant que Jobs vendait, Woz construisait les ordinateurs a la main, circuit par circuit.
// Apple II — Steve Wozniak, 1977
// 6502 Assembly
// Le premier ordinateur grand public
// avec couleur, son et slots d'extension
// Woz a concu le hardware ET le software
// Tout seul. Dans un garage.Cas d'usage : Comprendre que derriere chaque grande entreprise tech, il y a un ingenieur brillant.
stopPropagation empeche l'evenement de remonter/descendre aux parents mais execute les autres listeners du meme element. stopImmediatePropagation arrete aussi les listeners suivants sur le meme element.
stopPropagation = fermer la porte de ta chambre (les voisins n'entendent plus). stopImmediate = aussi couper le son dans ta chambre (meme toi tu n'entends plus).
el.addEventListener('click', (e) => {
e.stopPropagation(); // parent ne recoit pas
});
el.addEventListener('click', (e) => {
e.stopImmediatePropagation();
// les listeners suivants sur el sont aussi stoppes
});Cas d'usage : Empecher un modal de se fermer quand on clique a l'interieur, isoler des composants.
Blocs de code PL/pgSQL stockes et executes cote serveur. Les fonctions retournent une valeur, les procedures (depuis PG 11) supportent les transactions internes.
Des macros Excel stockees dans le serveur : un appel declenche toute la logique sans transfert de donnees.
CREATE FUNCTION get_user_orders(uid INT)
RETURNS TABLE (id INT, total NUMERIC) AS $$
BEGIN
RETURN QUERY
SELECT o.id, o.total
FROM orders o WHERE o.user_id = uid;
END;
$$ LANGUAGE plpgsql;Cas d'usage : Encapsuler de la logique metier complexe cote serveur pour reduire les allers-retours reseau.
Outil de developpement et documentation de composants UI en isolation. Chaque 'story' montre un etat du composant avec ses variantes.
Comme un catalogue IKEA : chaque meuble (composant) est photographie dans tous ses coloris et configurations.
// Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
const meta: Meta<typeof Button> = { component: Button };
export default meta;
export const Primary: StoryObj = { args: { variant: 'primary', children: 'Click' } };
export const Disabled: StoryObj = { args: { disabled: true, children: 'Off' } };Cas d'usage : Developper, tester visuellement et documenter les composants UI d'un design system.
Outil de developpement isole pour composants UI. Permet de documenter, visualiser et tester chaque composant independamment dans un catalogue interactif.
Comme un showroom de meubles : chaque piece est exposee individuellement pour etre examinee sous tous les angles.
// Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';
const meta: Meta<typeof Button> = { component: Button };
export default meta;
export const Primary: StoryObj = {
args: { variant: 'primary', children: 'Click' },
};Cas d'usage : Pour developper et documenter un design system avec un catalogue vivant de tous les composants.
Migre progressivement un systeme legacy en remplacant ses fonctionnalites piece par piece derriere une facade, jusqu'a ce que l'ancien systeme soit elimine.
Un figuier etrangleur qui pousse autour d'un arbre : le nouveau systeme grandit autour de l'ancien jusqu'a le remplacer.
app.use('/api/users', (req, res) => {
if (featureFlag('new-users-service'))
return proxy(req, newService);
return proxy(req, legacyService);
});Cas d'usage : Migration d'un monolithe vers des microservices sans big-bang risque.
Definit une famille d'algorithmes interchangeables encapsules separement. Le client choisit l'algorithme a utiliser au runtime.
Choisir son moyen de transport : velo, bus ou voiture — la destination est la meme, la strategie change.
const strategies = {
credit: (amount) => chargeCard(amount),
paypal: (amount) => paypalCheckout(amount),
};
const pay = strategies[method];Cas d'usage : Algorithmes de tri, strategies de paiement, politiques de retry configurables.
Pattern qui definit une famille d'algorithmes interchangeables. Le client choisit la strategie a utiliser a l'execution sans modifier le code consommateur.
Comme choisir son moyen de transport : bus, velo ou taxi, la destination reste la meme.
interface ShippingStrategy {
public function calculate(Order $order): float;
}
class ExpressShipping implements ShippingStrategy { }
class StandardShipping implements ShippingStrategy { }
$order->setShipping(new ExpressShipping());Cas d'usage : Quand un comportement peut varier selon le contexte : calcul de prix, tri, notification.
Protocoles de streaming adaptatif qui découpent la vidéo en segments et ajustent la qualité selon la bande passante. HLS (Apple) et DASH (standard ouvert) dominent le marché.
Un robinet qui ajuste automatiquement le débit d'eau selon la pression disponible dans les tuyaux.
// Video.js HLS player
import Hls from 'hls.js';
const hls = new Hls();
hls.loadSource('https://cdn.example.com/video/master.m3u8');
hls.attachMedia(videoElement);
hls.on(Hls.Events.MANIFEST_PARSED, () => {
videoElement.play();
});Cas d'usage : Diffuser du contenu vidéo à grande échelle avec adaptation automatique à la qualité réseau.
Le serveur envoie le HTML en flux continu (stream) au lieu d'attendre que toute la page soit generee. Les parties lentes arrivent au fur et a mesure.
Comme regarder un match en streaming : tu vois l'action en direct au lieu d'attendre que l'enregistrement soit complet.
// Next.js App Router avec Suspense
export default function Page() {
return (
<main>
<Header /> {/* envoye immediatement */}
<Suspense fallback={<Skeleton />}>
<SlowDataSection /> {/* stream quand pret */}
</Suspense>
</main>
);
}Cas d'usage : Pages avec des sections de vitesses differentes : le header s'affiche vite, les donnees arrivent en stream.
API pour traiter des donnees en flux (ReadableStream, WritableStream, TransformStream). Permet de consommer des donnees chunk par chunk sans tout charger en memoire.
Un tuyau d'arrosage : l'eau (donnees) coule en continu au lieu d'etre livree en citerne entiere.
const response = await fetch('/big-file');
const reader = response.body.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
process(value); // Uint8Array chunk
}Cas d'usage : Telecharger des gros fichiers avec progression, streaming SSE/LLM, traitement video/audio.
Test qui pousse le systeme au-dela de ses limites normales pour identifier le point de rupture et verifier son comportement en degradation gracieuse.
Comme remplir un ascenseur au maximum et au-dela pour voir a quel moment il refuse de fermer les portes plutot que de tomber.
// k6 stress test
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 1000 }, // pic extreme
{ duration: '2m', target: 2000 }, // au-dela
{ duration: '5m', target: 0 }, // recovery
],
};Cas d'usage : Pour connaitre les limites reelles du systeme et planifier le scaling avant qu'un incident ne se produise.
Mode d'execution plus strict active par 'use strict' ou implicitement dans les modules ESM. Interdit les variables non declarees, les doublons de params, et rend this undefined dans les fonctions simples.
Le mode examen : plus de copier-coller, plus de brouillon, chaque erreur est signalee immediatement.
'use strict';
x = 5; // ReferenceError
delete Object.prototype; // TypeError
function f() { return this; } // undefinedCas d'usage : Actif par defaut dans les modules ESM et les classes. Attrape les erreurs silencieuses tot.
Ensemble de flags dans tsconfig (strict: true) qui activent toutes les verifications strictes: strictNullChecks, noImplicitAny, strictFunctionTypes, etc.
Comme passer le controle technique en mode strict — plus de verifications mais vehicule plus fiable.
// tsconfig.json
{
"compilerOptions": {
"strict": true
// Active: strictNullChecks, noImplicitAny,
// strictBindCallApply, strictFunctionTypes...
}
}Cas d'usage : Toujours activer strict en debut de projet pour maximiser la securite du typage des le depart.
Composant de developpement qui active des verifications supplementaires et double les rendus pour detecter les effets de bord impurs.
Comme un professeur qui fait refaire l'exercice deux fois pour verifier que le resultat est toujours le meme.
<React.StrictMode>
<App />
</React.StrictMode>
// En dev, useEffect s'execute 2 fois pour detecter les bugsCas d'usage : Activer en developpement pour detecter les effets de bord, les API depreciees et les problemes de cleanup.
Systeme de typage ou la compatibilite est basee sur la structure (proprietes/methodes) et non sur le nom du type. Deux types avec la meme forme sont compatibles.
Comme un recruteur qui juge sur les competences reelles plutot que sur le diplome — si tu sais faire le job, tu es accepte.
interface Point { x: number; y: number }
const p = { x: 1, y: 2, z: 3 };
const accept = (pt: Point) => pt.x;
accept(p); // OK: p a x et yCas d'usage : Permet l'interoperabilite entre modules sans couplage fort sur les noms de types.
API globale structuredClone() qui cree une copie profonde d'un objet, supportant les types complexes (Date, Map, Set, ArrayBuffer, etc.). Remplace JSON.parse(JSON.stringify()).
Une photocopieuse couleur haute fidelite qui reproduit chaque detail, contrairement a une photocopie noir et blanc (JSON).
const original = {
date: new Date(),
data: new Map([['a', 1]]),
nested: { arr: [1, 2] }
};
const clone = structuredClone(original);
clone.nested.arr.push(3);
// original.nested.arr inchangeCas d'usage : Deep clone d'etats complexes, transfert de donnees entre workers, copie d'objets avec types speciaux.
JSON.parse(JSON.stringify()) perd les Date, Map, Set, undefined, fonctions et references circulaires. structuredClone gere tout sauf les fonctions et le DOM. Toujours preferer structuredClone.
JSON = scanner un document en noir et blanc (perd les couleurs). structuredClone = photocopier en couleur haute fidelite.
const obj = { d: new Date(), m: new Map([['a',1]]) };
// JSON perd tout
JSON.parse(JSON.stringify(obj));
// { d: '2024-...', m: {} }
// structuredClone preserve
structuredClone(obj);
// { d: Date, m: Map }Cas d'usage : Deep clone d'etats complexes avec des types non-JSON.
Outil d'Amazon pour transformer des design tokens JSON en variables pour chaque plateforme (CSS, Sass, JS, iOS, Android). Pipeline configurable avec des transformers.
Un traducteur automatique qui convertit un livre dans toutes les langues simultanement.
// config.json
{
"source": ["tokens/**/*.json"],
"platforms": {
"css": {
"transformGroup": "css",
"buildPath": "build/",
"files": [{ "format": "css/variables" }]
}
}
}Cas d'usage : Generer automatiquement les variables CSS, Sass et JS a partir d'une source unique de tokens.
Fonction principale qui cree un composant React avec des styles scopes. styled.div cree un div style, styled(Component) etend un composant existant.
Un decorateur qui habille un element HTML ou un composant existant avec de nouveaux vetements.
const Card = styled.div`
padding: 1rem;
border-radius: 8px;
`
// Extend un composant existant
const PrimaryCard = styled(Card)`
background: blue;
color: white;
`Cas d'usage : Creer des composants React avec du CSS scope et extensible via l'heritage de styles.
Linter CSS/Sass/CSS-in-JS configurable avec des regles de qualite et de convention. Detecte les erreurs, enforce un style coherent et empeche les anti-patterns.
Un correcteur orthographique mais pour le CSS : il souligne les fautes et propose des corrections.
// .stylelintrc.json
{
"extends": ["stylelint-config-standard"],
"rules": {
"selector-class-pattern": "^[a-z][a-zA-Z0-9]+$",
"no-duplicate-selectors": true,
"color-no-invalid-hex": true
}
}Cas d'usage : Enforcer des conventions CSS dans l'equipe et detecter les erreurs avant la review.
Composant qui configure ou les styles sont injectes (target), active/desactive les prefixes vendeur, et controle le comportement global du styling.
Le controleur aerien qui dirige ou chaque avion (style) doit atterrir.
import { StyleSheetManager } from 'styled-components'
<StyleSheetManager
target={iframeRef.current.contentDocument.head}
enableVendorPrefixes
>
<App />
</StyleSheetManager>Cas d'usage : Injecter les styles dans un iframe, un Shadow DOM, ou configurer les prefixes vendeur.
Valeur grid-template-rows/columns: subgrid qui permet à un item Grid d'hériter les pistes de son parent. Les enfants imbriqués s'alignent sur la grille parente, résolvant l'alignement cross-card.
Comme des étagères imbriquées qui s'alignent parfaitement sur la structure du meuble parent.
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.card {
display: grid;
grid-row: span 3;
grid-template-rows: subgrid;
}Cas d'usage : Aligner les titres, contenus et footers de cartes sur une même grille, même si les contenus varient.
Requete imbriquee dans une autre requete, utilisable dans SELECT, FROM, WHERE ou HAVING. Peut etre correlee (reference la requete externe) ou non-correlee (independante).
Une question dans une question : 'Qui gagne plus que la moyenne des salaires ?'
SELECT name FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees
);
-- Ou dans FROM
SELECT * FROM (
SELECT name, COUNT(*) as cnt
FROM orders GROUP BY name
) sub WHERE cnt > 5;Cas d'usage : Filtrer sur un resultat agrege ou creer des tables derivees pour des requetes complexes.
Dirigeant indo-americain, CEO de Google et Alphabet. Il a dirige le developpement de Chrome, ChromeOS et supervise les projets IA de Google (Bard/Gemini, DeepMind).
Le pilote de Google qui a lance Chrome (devenu le navigateur #1) puis pris les commandes de tout l'avion.
// Chrome V8 — sous la direction de Pichai
// Le moteur JS le plus rapide du monde
// JIT compilation
// Permet Node.js et Deno
// Chrome = 65% de part de marche
// Chromium = base d'Edge, Brave, OperaCas d'usage : Chrome et V8 sont au coeur de l'ecosysteme web et JS moderne (Node.js, Electron).
Librairie de test HTTP pour Node.js qui permet de tester les endpoints d'une API Express/Fastify sans demarrer un vrai serveur.
Comme tester un interphone sans sortir de l'immeuble : vous simulez l'appel de l'exterieur depuis l'interieur.
const request = require('supertest');
const app = require('../app');
test('GET /users returns 200', async () => {
const res = await request(app)
.get('/users')
.expect(200);
expect(res.body).toHaveLength(3);
});Cas d'usage : Pour tester rapidement les routes d'une API Node.js dans les tests d'integration sans serveur reel.
Composant qui affiche un fallback pendant que ses enfants chargent des donnees ou du code asynchrone. Pilier du rendu concurrent.
Comme un ecran 'Chargement...' au cinema pendant que le projectionniste change de bobine.
const LazyPage = React.lazy(() => import('./Page'));
<Suspense fallback={<Spinner />}>
<LazyPage />
</Suspense>Cas d'usage : Afficher un loader pendant le chargement paresseux de composants ou de donnees avec React Query.
Module @nestjs/swagger qui genere automatiquement la documentation API OpenAPI a partir des decorateurs, DTOs et controllers.
Comme un menu de restaurant genere automatiquement a partir des plats disponibles en cuisine.
const config = new DocumentBuilder()
.setTitle('My API')
.setVersion('1.0')
.addBearerAuth()
.build();
const doc = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, doc);Cas d'usage : Fournir une documentation API interactive et toujours a jour pour les developpeurs frontend.
Compilateur JavaScript/TypeScript ecrit en Rust, alternative ultra-rapide a Babel. Utilise par Next.js et peut servir de transpileur dans Vite ou Jest.
Comme remplacer un traducteur humain par un traducteur IA instantane : meme resultat, vitesse decuplee.
// .swcrc
{
"jsc": {
"parser": { "syntax": "typescript", "tsx": true },
"transform": {
"react": { "runtime": "automatic" }
},
"target": "es2022"
}
}Cas d'usage : Pour remplacer Babel dans les projets ou le temps de transpilation est un goulot d'etranglement.
Librairie de fetching de Vercel basee sur la strategie stale-while-revalidate : affiche les donnees en cache immediatement, puis revalide en arriere-plan.
Comme un journal du matin : tu lis celui d'hier (cache) en attendant que le facteur apporte le nouveau (revalidation).
import useSWR from 'swr';
const fetcher = (url) => fetch(url).then(r => r.json());
function Profile() {
const { data, error, isLoading } = useSWR('/api/user', fetcher);
if (isLoading) return <Spinner />;
return <p>{data.name}</p>;
}Cas d'usage : Alternative plus legere a TanStack Query pour des cas de fetching simples.
Type primitif unique et immutable cree par Symbol(). Utilise comme cle de propriete pour eviter les collisions. Les well-known symbols (Symbol.iterator, etc.) customisent le comportement du langage.
Un numero de serie unique grave sur une cle : meme si deux cles se ressemblent, leurs numeros sont differents.
const id = Symbol('id');
const user = { [id]: 123, name: 'Alice' };
user[id]; // 123
Object.keys(user); // ['name'] (symbol invisible)
// Well-known
class Range {
*[Symbol.iterator]() { yield 1; yield 2; }
}Cas d'usage : Creer des proprietes privees-like, definir des protocoles (iterator), eviter les collisions de noms en libs.
Mécanisme qui contrôle l'ordre de navigation au clavier. tabindex='0' rend un élément focusable dans l'ordre du DOM, tabindex='-1' permet le focus programmatique uniquement.
Comme les numéros de file d'attente : ils déterminent dans quel ordre chaque personne sera servie.
<!-- Focusable dans l'ordre du DOM -->
<div tabindex="0" role="button">Action</div>
<!-- Focus programmatique seulement -->
<div tabindex="-1" id="modal-title">Titre</div>
<!-- JAMAIS : tabindex positif -->
<!-- <div tabindex="5"> NE PAS FAIRE -->Cas d'usage : Gérer le focus dans les modales, menus déroulants et composants interactifs custom.
Structure de donnees relationnelle composee de lignes et colonnes avec un schema fixe. Chaque colonne a un type defini et chaque ligne represente un enregistrement.
Un tableau Excel avec des colonnes figees : impossible d'ajouter une cellule d'un type different.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);Cas d'usage : Stocker des donnees structurees avec des relations fortes et des contraintes d'integrite.
Syntaxe JavaScript utilisant les backticks (styled.div`...`) qui permet d'ecrire du CSS reel dans JS. Le tag styled interprete le template et genere un composant React style.
Un traducteur simultanee : tu parles CSS, il convertit en composant React en temps reel.
import styled from 'styled-components'
const Button = styled.button`
padding: 0.5rem 1rem;
background: ${({ $primary }) => $primary ? 'blue' : 'gray'};
color: white;
border-radius: 4px;
&:hover { opacity: 0.9; }
`Cas d'usage : Ecrire du CSS scope au composant directement dans le fichier JS/TS.
Fonction appelee avec un template literal comme argument. Recoit les parties statiques et les valeurs interpolees separement, permettant un traitement personnalise.
Un traducteur qui recoit la phrase avec des trous et les mots a inserer, et peut modifier chaque mot avant de reconstruire la phrase.
function highlight(strings, ...values) {
return strings.reduce((acc, str, i) =>
`${acc}${str}<b>${values[i] ?? ''}</b>`, '');
}
const name = 'Alice';
highlight`Hello ${name}!`;
// 'Hello <b>Alice</b>!'Cas d'usage : Sanitisation HTML (lit-html), CSS-in-JS (styled-components), SQL securise, i18n.
Pattern ou un champ commun (type, kind) distingue les variantes d'un objet. Permet un pattern matching exhaustif et du code type-safe. Fondamental en TypeScript.
Des colis avec une etiquette de couleur : bleu = fragile, rouge = urgent. L'etiquette determine le traitement.
function handle(action) {
switch (action.type) {
case 'add': return state + action.value;
case 'reset': return 0;
default: throw new Error(`Unknown: ${action.type}`);
}
}
handle({ type: 'add', value: 5 });Cas d'usage : Reducers Redux, state machines, gestion d'evenements, API responses.
Librairie qui fusionne intelligemment les classes Tailwind en resolvant les conflits. p-4 + p-2 donne p-2 au lieu de garder les deux.
Un arbitre qui tranche quand deux regles se contredisent : la derniere gagne proprement.
import { twMerge } from 'tailwind-merge'
twMerge('px-4 py-2 bg-blue-500', 'px-6 bg-red-500')
// => 'py-2 px-6 bg-red-500'Cas d'usage : Permettre l'override propre de styles dans des composants qui acceptent className en prop.
Plugin communautaire ajoutant des classes d'animation avancees a Tailwind (motion-safe, motion-reduce, et des presets d'animation plus riches).
Un pack d'effets speciaux pour tes films : fondu, zoom, rotation, tout pret a l'emploi.
<div class="motion-safe:animate-fadeIn
motion-reduce:animate-none">
Respecte les preferences d'accessibilite
</div>Cas d'usage : Ajouter des animations respectant prefers-reduced-motion sans code CSS custom.
Fichier de configuration central de Tailwind. Definit le theme (couleurs, tailles), les content paths, les plugins et les personnalisations du framework.
Le tableau de bord de ta voiture : tu regles tout depuis un seul endroit.
module.exports = {
content: ['./src/**/*.{js,tsx}'],
theme: {
extend: {
colors: { brand: '#FF6B35' },
},
},
plugins: [require('@tailwindcss/typography')],
}Cas d'usage : Personnaliser les couleurs, fonts et breakpoints du projet pour matcher la charte graphique.
Librairie de gestion de l'etat serveur (fetching, caching, synchronisation). Gere automatiquement le cache, la revalidation, le retry et les mises a jour optimistes.
Comme un concierge d'hotel : il anticipe tes besoins, garde tes affaires en cache et les rafraichit discretement.
const { data, isLoading } = useQuery({
queryKey: ['users', userId],
queryFn: () => fetch(`/api/users/${userId}`).then(r => r.json()),
staleTime: 5 * 60 * 1000,
gcTime: 10 * 60 * 1000,
});Cas d'usage : Toute application qui consomme une API REST/GraphQL et a besoin de cache intelligent et de revalidation.
Terme generique pour la file de macrotasks (setTimeout, setInterval, I/O). Synonyme de Callback Queue dans la spec HTML. Un seul macrotask est traite par tour d'event loop.
La liste des corvees a faire une par une : apres chaque corvee, tu verifies s'il y a un message urgent (microtask).
// Un macrotask par tour de boucle
setTimeout(() => console.log('task 1'), 0);
setTimeout(() => console.log('task 2'), 0);
// Entre task 1 et task 2, les microtasks sont videesCas d'usage : Decomposer un traitement lourd en petits morceaux via setTimeout pour ne pas bloquer le thread principal.
Developpeur americain, createur de Laravel, le framework PHP le plus populaire. Laravel a modernise PHP avec une syntaxe elegante et un ecosysteme complet (Forge, Vapor, Nova).
Le chef etoile qui a transforme PHP — considere comme du fast-food — en gastronomie.
// Laravel — Taylor Otwell, 2011
Route::get('/hello/{name}', function ($name) {
return view('greeting', ['name' => $name]);
});
// Eloquent, Blade, Artisan, Forge...Cas d'usage : Laravel est le framework le plus productif pour creer des applications web PHP rapidement.
Test-Driven Development : methodologie ou on ecrit le test AVANT le code, en cycle Red-Green-Refactor. Force a designer l'API avant l'implementation.
Comme ecrire la liste de courses avant de cuisiner : vous savez exactement ce dont vous avez besoin avant de commencer.
// 1. RED: ecrire un test qui echoue
test('isPalindrome returns true', () => {
expect(isPalindrome('kayak')).toBe(true);
});
// 2. GREEN: code minimal pour passer
const isPalindrome = (s) => s === s.split('').reverse().join('');
// 3. REFACTOR: ameliorer sans casserCas d'usage : Pour le code metier complexe (algorithmes, regles de gestion) ou le design emerge naturellement des tests.
Dis a un objet ce qu'il doit faire au lieu de lui demander son etat puis decider a sa place. Favorise l'encapsulation du comportement.
Dire au taxi 'emmene-moi a l'aeroport' au lieu de lui demander la carte et conduire toi-meme.
// Ask (mauvais):
if (account.getBalance() >= amount) account.setBalance(...);
// Tell (bon):
account.withdraw(amount); // la logique est interneCas d'usage : Eliminer les Anemic Domain Models en mettant la logique dans les objets du domaine.
Systeme de resolution de templates ou WordPress cherche le fichier le plus specifique d'abord (single-product.php) puis remonte vers le plus generique (index.php).
Comme un GPS qui cherche la route la plus precise d'abord, puis une route plus generale si la precise n'existe pas.
// Pour un post de type 'product' :
// 1. single-product.php
// 2. single.php
// 3. singular.php
// 4. index.phpCas d'usage : Pour comprendre quel fichier template sera utilise et ou placer ses customisations.
Technique de parsing de chaines au niveau des types via template literals et infer. Permet d'extraire des parties de routes, selectors CSS ou patterns.
Comme un scanner qui lit un code-barres et en extrait chaque segment d'information automatiquement.
type ParseRoute<T> = T extends `/${infer Seg}/${infer Rest}`
? Seg | ParseRoute<`/${Rest}`>
: T extends `/${infer Last}` ? Last : never;
type R = ParseRoute<"/users/123/posts">;
// "users" | "123" | "posts"Cas d'usage : Extraire des parametres de route, parser des DSL ou valider des formats de chaines a la compilation.
Types construits via des template strings qui combinent des types litteraux. Permettent de generer dynamiquement des types a partir de patterns de chaines.
Comme un generateur de noms compose — prenom + nom donne toutes les combinaisons possibles automatiquement.
type Event = "click" | "focus";
type Handler = `on${Capitalize<Event>}`;
// "onClick" | "onFocus"
type Locale = `${"en" | "fr"}-${"US" | "FR"}`;
// "en-US" | "en-FR" | "fr-US" | "fr-FR"Cas d'usage : Typer des cles CSS, des routes API ou des noms d'evenements generes dynamiquement.
Chaines delimitees par des backticks (`) supportant l'interpolation ${expression}, le multi-ligne et les tagged templates. Remplacent la concatenation classique.
Un formulaire avec des champs a remplir : les ${} sont les cases vides ou JS insere les valeurs.
const name = 'World';
const greeting = `Hello, ${name}!`;
const multiline = `
Line 1
Line 2
`;Cas d'usage : Construire des chaines dynamiques, des requetes SQL parametrees (via tagged templates), du HTML.
Definit le squelette d'un algorithme dans une methode, en deleguant certaines etapes aux sous-classes. Structure sans rigidite.
Une recette de cuisine : les etapes sont fixes (preparer, cuire, servir) mais chaque chef personnalise les details.
class Report {
generate() {
this.fetchData();
this.format();
this.export();
}
// sous-classes implementent fetchData, format, export
}Cas d'usage : Pipelines de traitement, generation de rapports, tests avec setup/teardown.
Unité de travail exécutée par un Worker Temporal, représentant une action avec effets de bord (appel API, écriture DB). Les Activities peuvent être retentées indépendamment.
Les étapes individuelles d'une recette de cuisine : chacune peut être refaite sans recommencer tout le plat.
// Activity definition
async function sendEmail(to, subject, body) {
const result = await mailer.send({ to, subject, body });
return result.messageId;
}
// Registered in worker
const activities = { sendEmail, chargeCard };Cas d'usage : Encapsuler chaque appel externe (paiement, email, API tierce) pour bénéficier du retry automatique.
Zone entre le debut du scope et la declaration let/const ou la variable existe mais est inaccessible. Toute tentative d'acces lance un ReferenceError.
Un colis en transit : il a ete expedie (hoiste) mais tu ne peux pas l'ouvrir tant qu'il n'est pas livre (declaration).
{
// TDZ pour x commence ici
console.log(x); // ReferenceError!
// TDZ pour x finit ici
let x = 42;
console.log(x); // 42
}Cas d'usage : Comprendre pourquoi let/const est plus sur que var et debugger les ReferenceError.
Mécanisme synchrone pour lire l'état interne d'un Workflow en cours sans le modifier. Retourne une valeur immédiatement.
Regarder par la vitre d'un four pour vérifier la cuisson sans ouvrir la porte.
const statusQuery = defineQuery('getStatus');
setHandler(statusQuery, () => ({
step: currentStep,
progress: completedSteps / totalSteps,
}));Cas d'usage : Exposer la progression d'un processus long dans une UI sans interférer avec l'exécution.
Planification native de Temporal pour lancer des Workflows à intervalles réguliers (cron-like). Gère les chevauchements, les pauses et les rattrappages.
Un réveil programmable qui sonne chaque jour à la même heure, même si vous dormez encore quand il sonne.
await client.schedule.create({
scheduleId: 'daily-report',
spec: { cronExpressions: ['0 8 * * *'] },
action: {
type: 'startWorkflow',
workflowType: 'generateReport',
},
});Cas d'usage : Remplacer les cron jobs fragiles par des schedules durables avec retry et monitoring intégrés.
Mécanisme pour envoyer des données à un Workflow en cours d'exécution depuis l'extérieur. Le Signal est asynchrone et modifie l'état interne du Workflow.
Glisser un post-it sous la porte d'un collègue occupé pour lui transmettre une info sans l'interrompre.
// Define signal
const approveSignal = defineSignal('approve');
// Handle in workflow
setHandler(approveSignal, (data) => {
approved = true;
approver = data.userId;
});Cas d'usage : Permettre une approbation humaine ou un événement externe d'influencer un Workflow en cours.
Pause durable dans un Workflow Temporal qui survit aux redémarrages du Worker. Peut durer de secondes à des mois sans consommer de ressources.
Un minuteur de cuisine qui continue de tourner même si vous quittez la maison et revenez.
import { sleep } from '@temporalio/workflow';
// Wait 7 days for payment
await sleep('7 days');
if (!paymentReceived) {
await cancelOrder(orderId);
}Cas d'usage : Implémenter des délais métier (période d'essai, rappels, expiration) de manière fiable.
Système de recherche et filtrage des Workflows Temporal via des attributs personnalisés. Permet de lister et monitorer les exécutions en cours ou terminées.
Le tableau de bord d'un centre logistique montrant l'état de tous les colis en temps réel.
// Search workflows
const results = await client.workflow.list({
query: `WorkflowType='OrderWorkflow'
AND ExecutionStatus='Running'
AND CustomField='vip'`,
});Cas d'usage : Construire des dashboards opérationnels pour suivre les processus métier en production.
Processus qui écoute une Task Queue Temporal et exécute les Workflows et Activities assignés. Plusieurs Workers peuvent partager la même queue pour la scalabilité.
Un employé de bureau qui prend des dossiers dans une pile partagée et les traite un par un.
import { Worker } from '@temporalio/worker';
const worker = await Worker.create({
workflowsPath: require.resolve('./workflows'),
activities,
taskQueue: 'order-queue',
});
await worker.run();Cas d'usage : Déployer des Workers scalables horizontalement pour absorber les pics de charge sur les tâches asynchrones.
Fonction durable orchestrée par Temporal qui survit aux pannes et redémarrages. Le code s'exécute de manière déterministe et reprend automatiquement là où il s'est arrêté.
Un GPS qui recalcule automatiquement l'itinéraire après chaque détour, sans jamais oublier la destination finale.
// Temporal Workflow
async function orderWorkflow(order) {
await validatePayment(order);
await reserveStock(order);
await shipOrder(order);
await notifyCustomer(order);
return { status: 'completed' };
}Cas d'usage : Orchestrer des processus métier longs (commandes, onboarding) nécessitant fiabilité et traçabilité.
Module de health checks via @nestjs/terminus. Expose un endpoint /health qui verifie la base de donnees, Redis, disque et services externes.
Comme un bilan de sante : le medecin verifie chaque organe et donne un bulletin de sante global.
@Controller('health')
export class HealthController {
constructor(private health: HealthCheckService,
private db: TypeOrmHealthIndicator) {}
@Get()
check() {
return this.health.check([
() => this.db.pingCheck('database'),
]);
}
}Cas d'usage : Fournir un endpoint de sante pour les load balancers et orchestrateurs comme Kubernetes.
Outil IaC (Infrastructure as Code) de HashiCorp. Déclare l'infrastructure en HCL, planifie les changements et les applique de manière idempotente.
Un architecte avec un plan : tu dessines l'infrastructure souhaitée et Terraform construit ou modifie pour correspondre.
resource "aws_instance" "api" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = { Name = "api-server" }
}
# terraform plan -> terraform applyCas d'usage : Gérer toute l'infrastructure cloud de manière versionnée, reproductible et auditable.
Alternative a la pyramide qui met l'accent sur les tests d'integration. Forme de losange : peu de unit tests, beaucoup d'integration, peu d'E2E. Adapte aux architectures microservices.
Comme tester surtout les connexions entre les pieces d'un puzzle plutot que chaque piece individuellement.
// Distribution diamant
// E2E: ~10%
// /\
// / \
// Integration: ~60% <- focus ici
// \ /
// \/
// Unit: ~30%Cas d'usage : Pour les systemes distribues ou les bugs surviennent surtout aux frontieres entre services.
Terme generique pour tout objet utilise a la place d'une dependance reelle dans un test. Comprend 5 types : Dummy, Stub, Spy, Mock et Fake.
Comme une doublure au cinema : elle remplace l'acteur principal pour les scenes dangereuses, chaque type de doublure a un role precis.
// Dummy: juste pour remplir un parametre
const dummyLogger = { log() {} };
// Stub: retourne une valeur fixe
const stubApi = { getUser: () => ({ name: 'Alice' }) };
// Spy: enregistre les appels
const spy = vi.fn();
// Mock: spy + comportement programme
// Fake: implementation simplifiee (in-memory DB)Cas d'usage : Pour isoler l'unite testee de ses dependances (API, DB, services) et rendre les tests deterministes.
Principe ou chaque test est completement independant des autres : il setup son propre etat, s'execute seul et nettoie apres lui. Aucun test ne depend de l'ordre d'execution.
Comme des cabines d'essayage individuelles : chacune a son propre miroir, ses propres vetements, et est nettoyee apres chaque utilisation.
// Bonne isolation
beforeEach(() => {
db = createFreshDatabase();
});
afterEach(() => {
db.destroy();
});
// Chaque test a sa propre DB
// Pas de leaking d'etat entre testsCas d'usage : Pour garantir que les tests sont reproductibles et peuvent etre executes dans n'importe quel ordre.
Modele de strategie de test en pyramide : beaucoup de tests unitaires (base), moins de tests d'integration (milieu), et peu de tests E2E (sommet). Optimise le rapport cout/fiabilite.
Comme une pyramide alimentaire : les legumes (unit tests) en grande quantite a la base, les sucreries (E2E) en petite quantite au sommet.
// Proportions recommandees
// E2E: ~10% (lents, fragiles)
// /\
// / \
// Integration: ~20% (moderement rapides)
// / \
// / \
// Unit: ~70% (rapides, stables)
// ============Cas d'usage : Comme guide strategique pour equilibrer les differents types de tests dans un projet.
Modele de Kent C. Dodds en forme de trophee : static analysis en base, puis unit, puis integration (le plus gros), puis E2E au sommet. Privilegie les tests d'integration.
Comme un trophee sportif : la base fine (linting), le corps large (integration) et la coupe fine en haut (E2E).
// Distribution trophee
// E2E: ~5% (sommet)
// Integration: ~40% (le gros du trophee)
// Unit: ~25% (tige)
// Static: ~30% (base: ESLint, TS)
// Plus de confiance par dollar investiCas d'usage : Pour les applications React/frontend ou les tests d'integration avec Testing Library offrent le meilleur ROI.
Famille de librairies (React, Vue, DOM) qui encourage a tester les composants comme un utilisateur les utilise, en ciblant les elements par role, label ou texte plutot que par selecteur CSS.
Comme tester une telecommande en appuyant sur les boutons comme un utilisateur, sans demonter le boitier pour verifier les circuits.
import { render, screen, fireEvent } from '@testing-library/react';
test('shows greeting on click', () => {
render(<Greeter />);
fireEvent.click(screen.getByRole('button', { name: /say hi/i }));
expect(screen.getByText('Hello!')).toBeInTheDocument();
});Cas d'usage : Pour tester les composants React/Vue en se concentrant sur le comportement utilisateur plutot que l'implementation.
Index special pour la recherche full-text sur des champs textuels. Supporte le stemming, les stop words et les poids par champ. Une seule text index par collection.
Un moteur de recherche interne qui comprend les variantes des mots comme un humain.
db.articles.createIndex(
{ title: 'text', body: 'text' },
{ weights: { title: 10, body: 1 } }
);
db.articles.find({ $text: { $search: 'mongo' } });Cas d'usage : Implementer une barre de recherche sur un blog ou un catalogue de produits.
Classes pour controler l'alignement (text-center), la couleur (text-gray-600), la decoration (underline), le truncate et le line-clamp du texte.
Les outils de mise en forme dans un editeur : aligner, colorer, souligner, couper.
<p class="text-center text-gray-600 uppercase
tracking-wide truncate">
Texte tronque si trop long...
</p>
<p class="line-clamp-3">Limite a 3 lignes...</p>Cas d'usage : Formater le texte (alignement, couleur, coupure) directement dans le markup.
Boucle principale de WordPress qui itere sur les posts de la requete courante. Utilise have_posts() et the_post() pour afficher le contenu.
Comme un presentoir de magazines : on les feuillette un par un dans l'ordre prevu.
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<h2><?php the_title(); ?></h2>
<div><?php the_content(); ?></div>
<?php endwhile; ?>
<?php endif; ?>Cas d'usage : Dans tout template WordPress pour afficher les posts correspondant a la page courante.
Systeme de theming WordPress gerant template hierarchy, theme supports, customizer, menus, sidebars et widgets. Separe la presentation de la logique.
Comme les habits d'une personne : ils changent l'apparence sans changer la personnalite.
// functions.php
add_action('after_setup_theme', function() {
add_theme_support('post-thumbnails');
add_theme_support('title-tag');
register_nav_menus(['primary' => 'Menu Principal']);
});Cas d'usage : Pour creer des themes WordPress qui respectent les standards et sont compatibles avec l'ecosysteme.
Section extend dans la config qui ajoute de nouvelles valeurs au theme sans ecraser les valeurs par defaut de Tailwind.
Ajouter des pages a un dictionnaire sans arracher les existantes.
// tailwind.config.js
theme: {
extend: {
spacing: { '128': '32rem' },
colors: { primary: { 500: '#6366f1' } },
fontFamily: { display: ['Inter', 'sans-serif'] },
}
}Cas d'usage : Ajouter des couleurs de marque, des tailles custom tout en conservant les utilitaires existants.
Valeurs de design abstraites (couleurs, espacements, ombres) stockees comme tokens et consommees par le systeme de style. Forment le vocabulaire du design system.
Les ingredients de base d'une cuisine : sel, poivre, huile. Tu les combines pour chaque recette.
const tokens = {
colors: { primary: '#3498db', danger: '#e74c3c' },
spacing: { xs: '0.25rem', sm: '0.5rem', md: '1rem' },
radii: { sm: '4px', md: '8px', full: '9999px' },
shadows: { sm: '0 1px 3px rgba(0,0,0,0.1)' },
}Cas d'usage : Centraliser toutes les valeurs de design pour garantir la coherence visuelle du projet.
Fichier de configuration central des themes blocs WordPress (5.8+). Definit les couleurs, typographies, espacements et styles globaux en JSON.
Comme un guide de style visuel numerique : il definit les regles de design pour tout le site.
{
"version": 3,
"settings": {
"color": {
"palette": [
{ "slug": "primary", "color": "#0073aa" }
]
},
"typography": { "fluid": true }
}
}Cas d'usage : Pour tout theme bloc moderne : centralise la configuration visuelle et genere le CSS automatiquement.
Composant context React qui injecte un objet theme accessible dans tous les styled components enfants via la prop theme ou le hook useTheme.
Le thermostat central d'un batiment : tu regles la temperature une fois, toutes les pieces en beneficient.
import { ThemeProvider } from 'styled-components'
const theme = { primary: '#3498db', radius: '8px' }
<ThemeProvider theme={theme}>
<App />
</ThemeProvider>
const Btn = styled.button`
background: ${({ theme }) => theme.primary};
`Cas d'usage : Centraliser les tokens de design et supporter les themes clair/sombre.
Developpeur et createur de contenu americain, fondateur de Ping.gg et createur du T3 Stack (Next.js, tRPC, Tailwind, Prisma, NextAuth). Figure influente de la communaute TypeScript moderne.
Le curateur de la stack TypeScript moderne : il a assemble les meilleurs outils en un kit pret a l'emploi.
// T3 Stack — Theo Browne
// create-t3-app
// Next.js + TypeScript
// tRPC (API type-safe)
// Tailwind CSS
// Prisma (ORM)
// NextAuth.js
$ npx create-t3-app@latestCas d'usage : Le T3 Stack est une reference pour demarrer un projet TypeScript full-stack rapidement et proprement.
Michael Paulson, aka ThePrimeagen, developpeur americain et createur de contenu. Ancien ingenieur senior Netflix, il est connu pour ses streams sur Vim/Neovim, Rust, Go et les algorithmes.
Le prof de sport du code : il rend les data structures et Vim aussi excitants qu'un match de foot.
-- Neovim config — style ThePrimeagen
vim.keymap.set('n', '<leader>pv', vim.cmd.Ex)
vim.keymap.set('v', 'J', ":m '>+1<CR>gv=gv")
vim.keymap.set('v', 'K', ":m '<-2<CR>gv=gv")
-- 'Blazingly fast' est son expression culteCas d'usage : Ses cours sur les algorithmes (Frontend Masters) et ses streams educatifs sont des ressources populaires.
Reference au contexte d'execution courant. Sa valeur depend de comment la fonction est appelee : methode (objet), constructeur (nouvelle instance), arrow function (this lexical), ou appel simple (undefined en strict).
Le pronom 'je' : sa signification change selon qui parle, pas selon ou la phrase est ecrite.
const obj = {
name: 'Alice',
greet() { return this.name; }, // 'Alice'
arrow: () => this.name, // undefined (this lexical)
};
const fn = obj.greet;
fn(); // undefined (contexte perdu)Cas d'usage : Acceder aux proprietes de l'objet courant dans les methodes de classe ou les callbacks.
Utility type qui extrait le type du parametre this d'une fonction. Retourne unknown si pas de parametre this explicite.
Comme identifier le proprietaire d'un outil en regardant l'etiquette sur la poignee.
function greet(this: { name: string }) {
return `Hello ${this.name}`;
}
type Ctx = ThisParameterType<typeof greet>;
// { name: string }Cas d'usage : Extraire le contexte this pour le reutiliser dans des decorateurs ou des wrappers de methodes.
Limite l'execution d'une fonction a maximum une fois par intervalle de temps. Contrairement au debounce, garantit une execution reguliere pendant une rafale d'appels.
Un robinet a debit controle : meme si tu l'ouvres a fond, l'eau coule toujours a la meme vitesse.
function throttle(fn, ms) {
let last = 0;
return function(...args) {
const now = Date.now();
if (now - last >= ms) {
last = now;
fn.apply(this, args);
}
};
}Cas d'usage : Scroll handler, mousemove tracking, rate limiting d'appels API cote client.
Informaticien britannique, inventeur du World Wide Web (HTML, HTTP, URL) en 1989 au CERN. Il a rendu le web gratuit et ouvert, refusant de le breveter.
L'homme qui a offert le web au monde entier — litteralement, il aurait pu etre le plus riche du monde mais a choisi le libre.
<!-- La premiere page web — Tim Berners-Lee -->
<html>
<head>
<title>World Wide Web</title>
</head>
<body>
<h1>World Wide Web</h1>
<a href="http://info.cern.ch">Premier lien</a>
</body>
</html>Cas d'usage : Comprendre les fondations du web et l'importance des standards ouverts.
Editeur et entrepreneur americain, fondateur d'O'Reilly Media. Il a popularise les termes 'open source' et 'Web 2.0'. Ses livres avec les animaux sur la couverture sont iconiques.
Le bibliothecaire en chef de l'informatique — si tu as appris a coder avec un livre a couverture animale, c'est grace a lui.
// O'Reilly Media — Tim O'Reilly
// Livres iconiques :
// - 'JavaScript: The Good Parts' (papillon)
// - 'Learning Python' (rat)
// - 'Design Patterns' (pas O'Reilly mais meme esprit)
// Les animaux = marque de fabriqueCas d'usage : O'Reilly Media reste une reference pour l'apprentissage technique. Sa plateforme en ligne est utilisee par les entreprises.
Option de schema qui ajoute automatiquement createdAt et updatedAt sur chaque document. updatedAt est mis a jour automatiquement a chaque modification.
Le tampon dateur du bureau de poste : chaque lettre recoit la date d'envoi et de reception.
const schema = new Schema(
{ name: String },
{ timestamps: true }
);
// Cree createdAt et updatedAt automatiquementCas d'usage : Tracer quand chaque document a ete cree et modifie pour l'audit et le debug.
Developpeur canadien, createur d'Express.js, Koa, Mocha, Commander.js et de dizaines d'autres packages npm. Il a quasiment construit l'ecosysteme Node.js a lui seul avant de passer a Go.
Le batisseur solitaire de npm : il a cree plus de packages essentiels que certaines equipes entieres.
// Express.js — TJ Holowaychuk, 2010
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000);Cas d'usage : Express.js reste le framework Node.js le plus utilise. Comprendre ses origines aide a saisir l'ecosysteme Node.
Options de schema qui permettent de transformer la sortie JSON d'un document. Utile pour supprimer des champs sensibles ou renommer _id en id.
Un filtre photo automatique : chaque fois que tu exportes la photo, le filtre s'applique sans effort.
schema.set('toJSON', {
virtuals: true,
transform: (doc, ret) => {
ret.id = ret._id;
delete ret._id;
delete ret.__v;
delete ret.password;
}
});Cas d'usage : Formater automatiquement les reponses API en supprimant _id, __v et les champs sensibles.
Informaticien britannique, inventeur de l'algorithme Quicksort et du concept de null reference, qu'il a lui-meme qualifie de 'billion-dollar mistake'.
L'inventeur du tri le plus rapide... et de la plus couteuse erreur de l'histoire du logiciel.
// Quicksort — Tony Hoare, 1960
function quicksort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[0];
const left = arr.slice(1).filter(x => x <= pivot);
const right = arr.slice(1).filter(x => x > pivot);
return [...quicksort(left), pivot, ...quicksort(right)];
}Cas d'usage : Comprendre le tri le plus utilise en pratique et les dangers de null/undefined en programmation.
Permet d'utiliser await directement au niveau module (ESM) sans wrapper async. Le module devient asynchrone et les modules qui l'importent attendent sa resolution.
Pouvoir commander directement au drive-in sans devoir d'abord entrer dans le restaurant (la fonction async).
// config.mjs (ESM)
const res = await fetch('/config.json');
export const config = await res.json();
// app.mjs
import { config } from './config.mjs';
// config est deja resolue iciCas d'usage : Charger une configuration ou initialiser une connexion BD au demarrage d'un module ESM.
Mecanisme de reutilisation de code dans les langages a heritage simple. Un trait permet d'injecter des methodes dans plusieurs classes sans heritage.
Comme un kit d'accessoires qu'on peut ajouter a n'importe quelle voiture, peu importe la marque.
trait Timestampable {
public function getCreatedAt(): DateTime {
return $this->createdAt;
}
}
class Article {
use Timestampable;
}Cas d'usage : Pour partager du comportement commun (logging, timestamps, soft delete) entre classes non liees par heritage.
Email déclenché par une action utilisateur (confirmation, facture, reset password) via un service dédié (SendGrid, Resend, SES). Distinct de l'email marketing.
Le reçu que la caissière vous imprime automatiquement après chaque achat.
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
from: 'noreply@myapp.com',
to: user.email,
subject: 'Confirm your account',
react: <ConfirmEmail url={confirmUrl} />,
});Cas d'usage : Envoyer des emails de confirmation, reset password et factures avec un taux de délivrabilité élevé.
Transformations composables et independantes du type de collection. Combine map, filter, reduce en un seul passage sans creer de tableaux intermediaires.
Un ouvrier polyvalent sur une chaine de montage qui fait tri + transformation + emballage en un seul passage au lieu de trois passages separes.
const map = f => step => (acc, x) => step(acc, f(x));
const filter = pred => step => (acc, x) =>
pred(x) ? step(acc, x) : acc;
const xform = [filter(x => x % 2), map(x => x * 10)];
const transduce = xform.reduceRight(
(s, fn) => fn(s), (acc, x) => [...acc, x]
);Cas d'usage : Traitement de grands jeux de donnees en un seul passage, eviter les allocations intermediaires.
Animer avec transform (translate, scale, rotate) utilise le GPU et évite le reflow, contrairement à top/left qui déclenche un recalcul de layout coûteux à chaque frame.
Comme glisser une photo sur un bureau (transform) vs déplacer tous les meubles pour faire de la place (top/left).
/* BON : animé par le GPU, 60fps */
.element {
transition: transform 0.3s;
}
.element:hover { transform: translateX(100px); }
/* MAUVAIS : déclenche reflow à chaque frame */
.element:hover { left: 100px; }Cas d'usage : Toute animation de position, taille ou rotation pour garantir 60fps sans janking.
Systeme de cache temporaire natif stockant des donnees avec expiration. Utilise la table options par defaut, ou un object cache externe si disponible.
Comme un post-it avec une date de peremption : l'info est disponible rapidement mais disparait apres un temps.
$data = get_transient('api_data');
if ($data === false) {
$data = wp_remote_get('https://api.example.com/data');
set_transient('api_data', $data, HOUR_IN_SECONDS);
}Cas d'usage : Pour cacher les resultats d'appels API externes, de requetes couteuses ou de calculs lourds.
Props prefixees par $ qui ne sont pas passees au DOM. Solution simple au probleme de shouldForwardProp introduite dans styled-components v5.1.
Un post-it sur un colis : le livreur le lit (pour le style) mais ne le colle pas sur la porte.
const Box = styled.div`
background: ${({ $bg }) => $bg};
padding: ${({ $size }) =>
$size === 'lg' ? '2rem' : '1rem'};
`
// $bg et $size ne sont PAS passes au DOM
<Box $bg="blue" $size="lg">Contenu</Box>Cas d'usage : Passer des props de styling sans polluer le DOM avec des attributs HTML invalides.
Couche d'abstraction de NestJS pour la communication entre microservices. Supporte TCP, Redis, NATS, MQTT, RabbitMQ, Kafka et gRPC.
Comme choisir entre la poste, le coursier ou le mail : le message est le meme, seul le moyen de transport change.
// main.ts
const app = await NestFactory.createMicroservice(AppModule, {
transport: Transport.REDIS,
options: { host: 'localhost', port: 6379 },
});
await app.listen();Cas d'usage : Connecter des microservices NestJS via differents brokers de messages selon les besoins.
Elimination du code mort par les bundlers (Webpack, Rollup, esbuild) basee sur l'analyse statique des imports ESM. Seuls les exports effectivement importes sont inclus dans le bundle final.
Secouer un arbre pour ne garder que les fruits murs (code utilise) et laisser tomber les feuilles mortes (code inutilise).
// utils.js
export const used = () => 'kept';
export const unused = () => 'removed';
// app.js
import { used } from './utils';
// unused est elimine du bundleCas d'usage : Reduire la taille des bundles en production, surtout avec de grosses librairies comme lodash.
Fonctions executees automatiquement en reponse a un evenement (INSERT, UPDATE, DELETE) sur une table. Peuvent etre BEFORE ou AFTER et operent par ligne (FOR EACH ROW) ou par instruction.
Un detecteur de mouvement qui declenche automatiquement une alarme quand quelqu'un entre.
CREATE FUNCTION update_timestamp()
RETURNS trigger AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER set_timestamp
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION update_timestamp();Cas d'usage : Mettre a jour automatiquement un timestamp, maintenir un audit log ou propager des modifications.
Instructions speciales en commentaire (/// <reference ...>) en haut des fichiers pour inclure des types ou des fichiers de declaration. Usage rare avec les modules modernes.
Comme une note en marge d'un manuscrit qui dit 'voir aussi le chapitre X' — une reference croisee.
/// <reference types="node" />
/// <reference path="./legacy.d.ts" />
// Charge les types node et le fichier legacyCas d'usage : Inclure des types globaux (DOM, Node) ou referencer des fichiers .d.ts dans des projets sans bundler.
Stratégie de branchement où tous les devs commitent sur main (trunk) via des branches courtes (<1 jour). Favorise l'intégration continue.
Un seul cahier partagé où chacun écrit sa partie rapidement plutôt que chacun son cahier fusionné une fois par mois.
git checkout -b feat/login
# ... code pendant quelques heures
git push origin feat/login
# PR review rapide puis merge dans mainCas d'usage : Équipes pratiquant le CI/CD avec des déploiements fréquents (plusieurs fois par jour).
@ts-expect-error supprime l'erreur suivante mais echoue si aucune erreur n'existe. @ts-ignore supprime silencieusement toute erreur. Preferer expect-error.
ts-expect-error: un parapluie qu'on range s'il ne pleut pas. ts-ignore: un mur anti-bruit permanent, meme en silence.
// @ts-expect-error: test avec mauvais type intentionnel
const result = fn("wrong");
// @ts-ignore: supprime toute erreur (dangereux)
const risky = badCode();Cas d'usage : Tests ou le but est de verifier le comportement avec des types invalides — expect-error est preferable.
Fichier de configuration central du projet TypeScript. Definit les options du compilateur, les fichiers a inclure/exclure et les chemins de resolution.
Comme le tableau de bord d'une voiture — tous les reglages du moteur TypeScript en un seul endroit.
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"strict": true,
"outDir": "dist"
},
"include": ["src"]
}Cas d'usage : Tout projet TypeScript commence par un tsconfig qui definit les regles de compilation.
Standard de documentation pour TypeScript base sur JSDoc avec des tags normalises (@param, @returns, @example). Supporte par les IDEs et generateurs de docs.
Comme les notices d'utilisation standardisees — meme format partout pour une comprehension universelle.
/**
* Calcule la TVA d'un montant.
* @param amount - Le montant HT
* @param rate - Le taux (defaut 0.2)
* @returns Le montant TTC
*/
function withTax(amount: number, rate = 0.2) {}Cas d'usage : Documenter les APIs publiques pour que les IDEs affichent l'aide contextuelle et generer la doc.
Temps entre la requête HTTP et la réception du premier octet de réponse. Mesure la latence serveur incluant DNS, connexion TLS et traitement backend.
Le temps entre la commande au restaurant et le moment où le serveur commence à apporter le plat.
// Measure TTFB
const { responseStart, requestStart } = performance.getEntriesByType('navigation')[0];
const ttfb = responseStart - requestStart;
console.log(`TTFB: ${ttfb}ms`); // Target: < 800msCas d'usage : Diagnostiquer les problèmes de latence serveur (DB lente, absence de cache, serveur éloigné).
Index Time-To-Live qui supprime automatiquement les documents apres un delai defini. Fonctionne sur un champ de type Date et est verifie par un processus d'arriere-plan toutes les 60 secondes.
Un yaourt avec une date de peremption : passe le delai, il est automatiquement jete du frigo.
db.sessions.createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 3600 }
);Cas d'usage : Gerer l'expiration automatique des sessions, tokens temporaires ou logs ephemeres.
Bundler incremental ecrit en Rust par Vercel, successeur spirituel de Webpack. Optimise pour les tres grands projets avec du caching granulaire au niveau des fonctions.
Comme un Webpack avec un moteur de Formule 1 : meme philosophie de bundling mais avec une performance brute incomparable.
// next.config.js (Next.js 15+)
module.exports = {
// Turbopack active par defaut en dev
// next dev --turbopack
};
// Pas de config separee:
// Turbopack est integre a Next.jsCas d'usage : Pour les projets Next.js de grande taille ou le dev server Webpack est devenu trop lent.
Outil de build incrémental pour monorepos qui cache les résultats de build et n'exécute que les tâches affectées par les changements. Créé par Vercel.
Un chef cuisinier qui ne recuit que les plats dont les ingrédients ont changé, servant les autres depuis le frigo.
// turbo.json
{
"pipeline": {
"build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
"test": { "dependsOn": ["build"] },
"lint": {},
"dev": { "cache": false, "persistent": true }
}
}Cas d'usage : Accélérer les builds CI/CD d'un monorepo en ne rebuild que les packages modifiés.
Expression qui affine le type dans une branche conditionnelle. Inclut typeof, instanceof, in et les predicats de type personnalises (is).
Comme un vigile a l'entree qui verifie votre badge — une fois passe, on sait exactement qui vous etes.
function isString(val: unknown): val is string {
return typeof val === "string";
}
if (isString(input)) {
input.toUpperCase(); // type string garanti
}Cas d'usage : Creer des gardes personnalises pour valider des donnees externes (API, formulaires) avec typage garanti.
Capacite de TypeScript a deduire automatiquement le type d'une variable a partir de sa valeur. Evite de declarer explicitement chaque type.
Comme un serveur qui devine que vous voulez de l'eau en voyant votre verre vide, sans que vous le demandiez.
const name = "Alice"; // string infere
const nums = [1, 2, 3]; // number[] infere
const double = (x: number) => x * 2; // retour number infereCas d'usage : Laisser TS inferer les types evidents pour garder le code concis sans perdre la securite.
Processus de reduction d'un type large vers un type plus specifique via des conditions. TS analyse le flux de controle pour affiner les types.
Comme un entonnoir qui filtre progressivement — on part d'un grand ensemble pour arriver a un element precis.
function show(val: string | number) {
if (typeof val === "string") {
console.log(val.toUpperCase()); // string
} else {
console.log(val.toFixed(2)); // number
}
}Cas d'usage : Manipuler des union types en toute securite dans les branches conditionnelles.
Annotation de retour de fonction (param is Type) qui indique au compilateur qu'un narrowing a lieu. Permet de creer des type guards personnalises.
Comme un certificat d'authenticite — la fonction garantit l'identite du type en sortie.
interface Fish { swim(): void }
interface Bird { fly(): void }
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}Cas d'usage : Valider des donnees complexes (API responses, events) avec un typage garanti apres la verification.
Mecanisme ou TS elargit automatiquement un type litteral vers un type plus general. Une variable let initialisee a "hello" devient string, pas "hello".
Comme un cadre photo extensible qui s'adapte a toutes les tailles au lieu de rester fixe sur une seule dimension.
let x = "hello"; // type: string (widened)
const y = "hello"; // type: "hello" (literal)
let z: "hello" = "hello"; // type: "hello" (explicite)Cas d'usage : Comprendre le widening pour eviter les erreurs avec les types litteraux dans les fonctions.
Technique avancee consistant a ecrire de la logique (conditions, boucles, pattern matching) entierement dans le systeme de types TS, sans code runtime.
Comme resoudre des equations sur un tableau blanc — tout se passe dans la theorie, rien n'est execute.
type IsString<T> = T extends string ? true : false;
type A = IsString<"hello">; // true
type B = IsString<42>; // false
type Length<T extends any[]> =
T extends { length: infer L } ? L : never;Cas d'usage : Creer des validations de types complexes dans les bibliotheques (zod, tRPC, Prisma).
Pattern d'event emitter ou les noms d'evenements et leurs payloads sont types statiquement. Garantit la correspondance emit/on a la compilation.
Comme un standard telephonique type — chaque extension a un format de message predefini, pas de mauvaise connexion.
type Events = { login: { userId: string }; logout: void };
class Emitter<T extends Record<string, any>> {
on<K extends keyof T>(event: K, fn: (data: T[K]) => void) {}
emit<K extends keyof T>(event: K, data: T[K]) {}
}
const bus = new Emitter<Events>();Cas d'usage : Systemes event-driven (WebSocket, pub/sub, bus d'evenements) avec garantie de type sur les payloads.
Classe decoree @Entity qui represente une table de base de donnees. Chaque propriete decoree (@Column, @PrimaryGeneratedColumn) correspond a une colonne.
Comme un plan d'architecte : il decrit la structure exacte de la table a construire.
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ unique: true })
email: string;
@Column({ default: true })
isActive: boolean;
}Cas d'usage : Definir le schema de la base de donnees directement dans le code TypeScript avec TypeORM.
Fichier versionne qui decrit les modifications de schema de base de donnees (up/down). Permet de gerer l'evolution du schema de facon reproductible.
Comme un historique Git mais pour la structure de ta base de donnees.
export class AddUserAge1234567890 implements MigrationInterface {
async up(qr: QueryRunner) {
await qr.addColumn('user',
new TableColumn({ name: 'age', type: 'int', isNullable: true }));
}
async down(qr: QueryRunner) {
await qr.dropColumn('user', 'age');
}
}Cas d'usage : Deployer des changements de schema en production de maniere securisee et reversible.
API fluide pour construire des requetes SQL complexes avec TypeORM. Supporte les jointures, sous-requetes, groupements et requetes paginee.
Comme assembler une requete en Lego : tu ajoutes chaque piece (clause) une par une pour construire la requete finale.
const users = await this.repo
.createQueryBuilder('user')
.leftJoinAndSelect('user.orders', 'order')
.where('user.isActive = :active', { active: true })
.orderBy('user.createdAt', 'DESC')
.take(10)
.getMany();Cas d'usage : Construire des requetes complexes avec jointures, filtres dynamiques et pagination.
Decorateurs (@OneToMany, @ManyToOne, @ManyToMany, @OneToOne) qui definissent les relations entre entites. Permettent le chargement eager ou lazy.
Comme les liens de parente dans un arbre genealogique : chaque relation a un type et une direction.
@Entity()
export class User {
@OneToMany(() => Order, order => order.user)
orders: Order[];
}
@Entity()
export class Order {
@ManyToOne(() => User, user => user.orders)
user: User;
}Cas d'usage : Modeliser les associations entre tables et naviguer le graphe d'objets en TypeScript.
Pattern d'acces aux donnees qui fournit des methodes CRUD (find, save, delete) pour une entite. Injecte via @InjectRepository dans les services.
Comme un bibliothecaire specialise : il sait exactement comment chercher, ranger et preter les livres de sa section.
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private repo: Repository<User>,
) {}
findAll() { return this.repo.find(); }
}Cas d'usage : Effectuer les operations CRUD sur les entites sans ecrire de SQL brut.
Mecanisme pour executer plusieurs operations de base de donnees de facon atomique. Soit toutes reussissent, soit toutes sont annulees.
Comme un virement bancaire : le debit ET le credit doivent passer ensemble, sinon rien ne bouge.
async transfer(from: string, to: string, amount: number) {
await this.dataSource.transaction(async (manager) => {
await manager.decrement(Account, { id: from }, 'balance', amount);
await manager.increment(Account, { id: to }, 'balance', amount);
});
}Cas d'usage : Garantir la coherence des donnees lors d'operations multi-tables comme les paiements.
Langage commun partage entre developpeurs et experts metier dans un Bounded Context. Le code utilise les memes termes que le metier.
Parler la meme langue dans une equipe internationale : pas de traduction, pas de malentendu.
// Mauvais: class DataProcessor { handleItem() {} }
// Bon: class InvoiceGenerator { issueInvoice() {} }
// Les termes metier sont dans le codeCas d'usage : Reduire les malentendus entre devs et metier, rendre le code auto-documentant.
Union (A|B) accepte l'un OU l'autre type (PHP 8.0). Intersection (A&B) exige que la valeur implemente TOUS les types (PHP 8.1). Renforce le typage statique.
Union : un billet accepte en euros OU en dollars. Intersection : un candidat qui parle francais ET anglais.
// Union
function parse(string|int $input): string { }
// Intersection
function save(Countable&Iterator $items): void { }Cas d'usage : Pour exprimer des contraintes de type precises et reduire les erreurs a l'execution.
Index qui garantit l'unicite des valeurs d'un champ dans la collection. Toute tentative d'insertion d'un doublon leve une erreur E11000.
Un registre d'etat civil ou chaque numero de securite sociale est unique.
db.users.createIndex(
{ email: 1 },
{ unique: true }
);Cas d'usage : Garantir qu'un email, un username ou un code produit est unique dans la base.
Maintient une liste d'objets modifies pendant une transaction et coordonne l'ecriture des changements en une seule operation atomique.
Un panier d'achat : tu ajoutes/supprimes des articles, et tout est valide en une seule fois au passage en caisse.
class UnitOfWork {
#changes = [];
track(entity) { this.#changes.push(entity); }
async commit() {
await db.transaction(tx => this.#changes.forEach(e => tx.save(e)));
}
}Cas d'usage : Sauvegarder plusieurs entites modifiees en une transaction atomique (ORM comme EF Core).
Test qui verifie le comportement d'une seule unite de code (fonction, methode, composant) de maniere isolee. C'est la base de toute strategie de test automatise.
Comme verifier chaque ingredient individuellement avant de cuisiner : le sel est bien du sel, la farine n'est pas perimee.
// sum.test.js
import { sum } from './sum';
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
test('handles negatives', () => {
expect(sum(-1, 1)).toBe(0);
});Cas d'usage : Pour valider chaque fonction metier independamment lors du developpement quotidien.
Quatre types speciaux: any desactive le typage, unknown force la verification avant usage, never represente l'impossible, void l'absence de retour.
any: joker sans regles. unknown: colis suspect a inspecter. never: porte muree. void: accusé de reception sans contenu.
function fail(): never { throw new Error(); }
function log(): void { console.log("ok"); }
function parse(x: unknown) {
if (typeof x === "string") x.trim(); // OK
}Cas d'usage : Utiliser unknown pour les donnees externes (API), void pour les callbacks, never pour l'exhaustivite.
Met a jour tous les documents correspondant au filtre. Retourne le nombre de documents modifies dans modifiedCount.
Envoyer un memo a tous les employes d'un departement pour mettre a jour leur titre de poste.
const result = await db.collection('users')
.updateMany(
{ status: 'inactive' },
{ $set: { archived: true } }
);
console.log(result.modifiedCount);Cas d'usage : Appliquer une migration de donnees ou une correction en masse sur un sous-ensemble de documents.
Met a jour le premier document correspondant au filtre avec les operateurs de modification specifies ($set, $inc, $push, etc.).
Corriger une seule faute sur une fiche sans reecrire toute la fiche.
await db.collection('users').updateOne(
{ _id: userId },
{ $set: { name: 'Alice V2' }, $inc: { version: 1 } }
);Cas d'usage : Modifier un champ precis d'un document identifie, comme changer le mot de passe d'un utilisateur.
Utility types integres qui transforment les types litteraux de chaines. Uppercase met en majuscules, Lowercase en minuscules, Capitalize la premiere lettre.
Comme les boutons de mise en forme dans un traitement de texte, mais appliques directement aux types.
type A = Uppercase<"hello">; // "HELLO"
type B = Lowercase<"HELLO">; // "hello"
type C = Capitalize<"hello">; // "Hello"
type D = Uncapitalize<"Hello">; // "hello"Cas d'usage : Transformer des cles de types dans des mapped types ou template literals (getters, event handlers).
Nouvelle API React 19 qui permet de lire une Promise ou un Context directement dans le rendu, meme de maniere conditionnelle contrairement aux autres hooks.
Comme un lecteur universel : qu'on lui donne un CD (Promise) ou une cle USB (Context), il lit les deux.
function UserProfile({ userPromise }) {
const user = use(userPromise);
return <p>{user.name}</p>;
}
// Peut etre utilise conditionnellement
if (showDetails) { const data = use(promise); }Cas d'usage : Lire des donnees asynchrones dans les Server Components ou consommer un Context conditionnellement.
Hook qui memoize une fonction pour conserver la meme reference entre les rendus. Equivalent a useMemo(() => fn, deps).
Comme donner toujours le meme numero de telephone a un contact : il n'a pas besoin de mettre a jour son carnet a chaque fois.
const handleClick = useCallback((id) => {
setItems(prev => prev.filter(i => i.id !== id));
}, []); // reference stable
<MemoizedList onDelete={handleClick} />Cas d'usage : Passer un callback a un composant enfant memoize avec React.memo pour eviter ses re-rendus inutiles.
Hook qui lit la valeur du Context le plus proche dans l'arbre. Evite le prop drilling en partageant des donnees entre composants distants.
Comme la radio FM : tout le monde dans la zone capte le meme signal sans cable direct.
const ThemeCtx = createContext('light');
function App() {
return (
<ThemeCtx.Provider value="dark">
<Toolbar />
</ThemeCtx.Provider>
);
}
function Button() { const theme = useContext(ThemeCtx); }Cas d'usage : Partager des donnees globales (theme, langue, user) sans passer par chaque niveau de props.
Hook qui retourne une version differee d'une valeur, permettant a React de prioriser les mises a jour urgentes et de differer le re-rendu du contenu non critique.
Comme un echo : ta voix (valeur originale) arrive d'abord, puis l'echo (valeur differee) suit avec un leger decalage.
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
// L'input reste reactif, la liste se met a jour en differe
<input value={query} onChange={e => setQuery(e.target.value)} />
<HeavyList filter={deferredQuery} />Cas d'usage : Alternative a useTransition quand tu ne controles pas le setter de l'etat (props venant du parent).
Hook pour synchroniser un composant avec un systeme externe (API, DOM, timer). S'execute apres le rendu, avec un tableau de dependances pour controler quand il se relance.
Comme un abonnement a un journal : tu t'abonnes (setup), tu recois les numeros (re-runs), et tu te desabonnes (cleanup) en partant.
useEffect(() => {
const ctrl = new AbortController();
fetch('/api/data', { signal: ctrl.signal })
.then(r => r.json())
.then(setData);
return () => ctrl.abort(); // cleanup
}, [userId]); // re-run si userId changeCas d'usage : Appels API, abonnements WebSocket, synchronisation avec le DOM ou des librairies externes.
Hook qui donne l'etat de soumission du formulaire parent (pending, data, method, action). Doit etre utilise dans un composant enfant du <form>.
Comme un indicateur lumineux sur une machine a cafe : il te dit si elle est en train de preparer (pending) ou prete.
function SubmitButton() {
const { pending } = useFormStatus();
return (
<button disabled={pending}>
{pending ? 'Envoi...' : 'Envoyer'}
</button>
);
}Cas d'usage : Desactiver le bouton submit et afficher un spinner pendant la soumission d'un formulaire avec Server Actions.
Hook qui genere un identifiant unique stable entre serveur et client, utile pour les attributs d'accessibilite comme htmlFor et aria-describedby.
Comme un tampon officiel : le meme numero est attribue que tu sois au guichet (serveur) ou en ligne (client).
function Input({ label }) {
const id = useId();
return (
<>
<label htmlFor={id}>{label}</label>
<input id={id} />
</>
);
}Cas d'usage : Generer des IDs pour les associations label/input sans risque de collision en SSR.
Hook qui personnalise la valeur exposee par un ref forwarde. Permet de n'exposer que certaines methodes d'un composant enfant au parent.
Comme un interphone d'immeuble : tu choisis quels boutons exposer, pas toutes les cles de l'appartement.
const FancyInput = forwardRef((props, ref) => {
const inputRef = useRef();
useImperativeHandle(ref, () => ({
focus: () => inputRef.current.focus(),
clear: () => { inputRef.current.value = ''; }
}));
return <input ref={inputRef} />;
});Cas d'usage : Exposer une API imperative limitee a un composant enfant (focus, scroll, reset).
Hook qui s'execute avant toute mutation DOM, concu pour les librairies CSS-in-JS qui doivent injecter des balises <style> avant le layout.
Comme poser le papier peint avant d'installer les meubles : les styles sont prets avant que le DOM n'existe.
// Reserve aux auteurs de libs CSS-in-JS
useInsertionEffect(() => {
const style = document.createElement('style');
style.textContent = '.btn { color: red; }';
document.head.appendChild(style);
return () => style.remove();
}, []);Cas d'usage : Exclusivement reserve aux librairies CSS-in-JS (styled-components, Emotion) pour injecter du CSS.
Identique a useEffect mais s'execute de maniere synchrone apres les mutations DOM et avant que le navigateur ne peigne. Bloque le rendu visuel.
Comme repositionner les meubles avant de prendre la photo : tout est en place avant que l'utilisateur ne voie.
useLayoutEffect(() => {
const { height } = ref.current.getBoundingClientRect();
setTooltipPos(height + 10);
}, []);Cas d'usage : Mesurer le DOM (position, taille) ou corriger un layout avant l'affichage pour eviter un flash visuel.
Hook qui memoize le resultat d'un calcul couteux et ne le recalcule que si ses dependances changent.
Comme mettre un plat au frigo : tu ne recuisines pas si les ingredients n'ont pas change, tu ressers le meme plat.
const sortedItems = useMemo(
() => items.sort((a, b) => a.price - b.price),
[items]
);
// Ne retrie que si 'items' changeCas d'usage : Calculs couteux (tri, filtrage, transformations) qui ralentissent le rendu si recalcules a chaque fois.
Hook experimental qui permet d'afficher un etat optimiste pendant une action asynchrone, automatiquement annule en cas d'erreur.
Comme cocher 'lu' sur un message avant que le serveur confirme : si ca echoue, la coche disparait.
const [optimisticLikes, addOptimistic] = useOptimistic(
likes,
(state, newLike) => [...state, newLike]
);
async function handleLike() {
addOptimistic({ id: 'temp', user: 'moi' });
await saveLike();
}Cas d'usage : Likes, commentaires, toggles : feedback instantane a l'utilisateur pendant la requete serveur.
Hook alternatif a useState pour gerer un etat complexe avec une logique de type action/reducer, inspire de Redux.
Comme un standard telephonique : tu envoies un message (action) et l'operateur (reducer) decide quoi faire.
const reducer = (state, action) => {
switch(action.type) {
case 'increment': return { count: state.count + 1 };
case 'reset': return { count: 0 };
default: return state;
}
};
const [state, dispatch] = useReducer(reducer, { count: 0 });Cas d'usage : Etats complexes avec plusieurs sous-valeurs interdependantes ou quand la logique de transition est elaboree.
Hook qui retourne un objet mutable {current} persistant entre les rendus, sans declencher de re-rendu quand il change. Sert a referencer des elements DOM ou stocker des valeurs.
Comme un tiroir secret dans un bureau : tu y ranges des choses sans que personne ne le remarque (pas de re-rendu).
const inputRef = useRef(null);
const timerRef = useRef(null);
useEffect(() => {
inputRef.current.focus();
timerRef.current = setInterval(tick, 1000);
return () => clearInterval(timerRef.current);
}, []);Cas d'usage : Acceder au DOM (focus, scroll), stocker des IDs de timer, garder la valeur precedente d'un state.
Hook qui ajoute un etat local a un composant fonctionnel. Retourne la valeur courante et une fonction pour la mettre a jour.
Comme un post-it sur le frigo : tu lis la valeur et tu la remplaces quand elle change.
const [name, setName] = useState('');
// Mise a jour fonctionnelle (recommandee)
setCount(prev => prev + 1);
// Initialisation couteuse avec lazy init
const [data, setData] = useState(() => expensiveCalc());Cas d'usage : Tout etat local simple : champs de formulaire, toggles, compteurs, donnees UI.
Hook pour s'abonner a un store externe (non-React) de maniere compatible avec le rendu concurrent, evitant les tearing (desynchro visuelle).
Comme un ecran d'aeroport synchronise : tous les passagers voient les memes horaires, pas de version perimee.
const width = useSyncExternalStore(
(cb) => { window.addEventListener('resize', cb); return () => window.removeEventListener('resize', cb); },
() => window.innerWidth,
() => 1024 // server snapshot
);Cas d'usage : Integration avec des stores externes (Zustand, Redux interne) ou des API navigateur (resize, online).
Hook qui marque une mise a jour comme non urgente, permettant a React de la differer pour garder l'interface reactive pendant les operations lourdes.
Comme un panneau 'en cours de renovation' : les clients voient l'ancien decor pendant que tu renoves en arriere-plan.
const [isPending, startTransition] = useTransition();
function handleSearch(query) {
startTransition(() => {
setFilteredResults(heavyFilter(query));
});
}
// isPending = true pendant le calculCas d'usage : Filtrage de longues listes, navigation entre onglets, tout ce qui peut bloquer l'interface.
Approche ou le style est applique via des classes utilitaires atomiques directement dans le HTML. Chaque classe fait une seule chose (couleur, marge, taille).
Des briques LEGO : chaque piece a une fonction unique, et tu construis ce que tu veux en les combinant.
<div class="flex items-center gap-4 p-6 bg-white rounded-lg shadow-md">
<h2 class="text-xl font-bold text-gray-900">Titre</h2>
</div>Cas d'usage : Prototyper rapidement des interfaces sans quitter le HTML ni gerer de fichiers CSS separes.
Approche qui compose les styles via des classes atomiques à usage unique directement dans le HTML. Tailwind CSS est le framework le plus populaire de cette approche.
Comme des briques Lego standardisées : on assemble des petites pièces pour construire n'importe quoi.
<!-- Tailwind utility classes -->
<button class="bg-blue-500 text-white px-4 py-2
rounded-lg hover:bg-blue-600
transition-colors duration-200">
Envoyer
</button>Cas d'usage : Prototypage rapide et projets avec design system bien défini qui bénéficient du co-location styles/markup.
VACUUM recupere l'espace des lignes mortes (MVCC). ANALYZE met a jour les statistiques du planificateur de requetes. VACUUM ANALYZE fait les deux. Autovacuum les execute automatiquement.
VACUUM = le ramasse-miettes qui recycle les pages usees. ANALYZE = le recensement qui met a jour les cartes du quartier.
VACUUM ANALYZE users;
-- Verifier autovacuum
SELECT relname, last_vacuum, last_analyze
FROM pg_stat_user_tables;Cas d'usage : Maintenir les performances de la base en recuperant l'espace et en mettant a jour les statistiques.
State management base sur des proxies JavaScript. L'etat est mutable directement et Valtio detecte les changements automatiquement via Proxy.
Comme un miroir magique : tu modifies l'objet original et le reflet (composant) se met a jour automatiquement.
const state = proxy({ count: 0, text: 'hello' });
function Counter() {
const snap = useSnapshot(state);
return (
<button onClick={() => { state.count++; }}>
{snap.count}
</button>
);
}Cas d'usage : Developpeurs preferant la mutation directe d'objets, prototypage rapide, migration depuis MobX.
Objet immutable defini par ses attributs, sans identite propre. Deux value objects avec les memes attributs sont egaux. Pas de setter.
Un billet de 20 euros : tu ne te soucies pas de QUEL billet c'est, seule la valeur compte.
class Money {
constructor(readonly amount: number, readonly currency: string) {}
add(other: Money) {
if (this.currency !== other.currency) throw Error('Mismatch');
return new Money(this.amount + other.amount, this.currency);
}
}Cas d'usage : Modeliser des concepts sans identite : Money, Email, Address, DateRange.
Framework CSS-in-JS zero-runtime avec typage TypeScript complet. Les styles sont ecrits en .css.ts et extraits en CSS statique au build. Zero JavaScript en production.
Un architecte qui dessine les plans (TypeScript) et le batiment est construit a l'avance (build-time).
// button.css.ts
import { style } from '@vanilla-extract/css'
export const button = style({
padding: '0.5rem 1rem',
background: 'blue',
':hover': { background: 'darkblue' },
})
// Usage: <button className={button}>Cas d'usage : Projets ou la performance est critique et le typage TypeScript des styles est souhaite.
Valeurs reutilisables prefixees par $ qui stockent couleurs, tailles, fonts, etc. Compilees en valeurs statiques (contrairement aux CSS custom properties).
Des etiquettes sur des pots d'epices : au lieu de decrire l'epice, tu utilises son nom.
$primary: #3498db;
$spacing-lg: 2rem;
$font-stack: 'Inter', sans-serif;
.button {
background: $primary;
padding: $spacing-lg;
font-family: $font-stack;
}Cas d'usage : Centraliser les valeurs de design pour les modifier en un seul endroit.
Extension des tuples permettant d'utiliser des spreads generiques (...T) dans les types tuple. Permet de composer et manipuler des tuples de longueur variable.
Comme des wagons de train modulaires — on peut inserer, retirer ou combiner des sections librement.
type Concat<A extends any[], B extends any[]> = [...A, ...B];
type R = Concat<[1, 2], [3, 4]>; // [1, 2, 3, 4]
function head<T, U extends any[]>(arr: [T, ...U]): T {
return arr[0];
}Cas d'usage : Typer des fonctions avec des arguments variadiques (pipe, compose, curry) de maniere precise.
Annotations explicites sur les parametres generiques pour declarer la covariance (out), la contravariance (in) ou l'invariance. Ajoutees en TS 4.7.
Comme des panneaux 'entree' et 'sortie' sur un parking — ils precisent dans quel sens circule le type.
interface Producer<out T> { get(): T }
interface Consumer<in T> { accept(val: T): void }
// Producer<Dog> assignable a Producer<Animal>
// Consumer<Animal> assignable a Consumer<Dog>Cas d'usage : Documenter et verifier la variance des types generiques dans les APIs de bibliotheques complexes.
Systeme de versioning d'API integre supportant URI (/v1/), header, media type et custom. Permet d'evoluer l'API sans casser les clients existants.
Comme les editions d'un livre : la v2 existe mais la v1 reste disponible pour ceux qui l'utilisent.
app.enableVersioning({ type: VersioningType.URI });
@Controller({ path: 'users', version: '1' })
export class UserV1Controller {}
@Controller({ path: 'users', version: '2' })
export class UserV2Controller {}Cas d'usage : Maintenir la retrocompatibilite tout en deployant de nouvelles versions d'endpoints.
Organise le code par feature (tranche verticale) plutot que par couche technique. Chaque slice contient tout : handler, logique, persistance.
Couper un gateau verticalement : chaque part contient toutes les couches (genoise, creme, glaçage).
// features/create-user/
// handler.ts - HTTP handler
// command.ts - business logic
// repository.ts - data access
// test.ts - testsCas d'usage : Equipes feature qui veulent minimiser les conflits de merge et le couplage inter-features.
API qui anime automatiquement les transitions entre deux états du DOM (SPA) ou entre pages (MPA). Le navigateur capture un snapshot avant/après et anime la différence.
Comme un fondu enchaîné au cinéma entre deux scènes : le navigateur gère le morphing automatiquement.
/* Déclencher une transition */
document.startViewTransition(() => updateDOM());
/* Personnaliser l'animation */
::view-transition-old(hero) { animation: fade-out 0.3s; }
::view-transition-new(hero) { animation: fade-in 0.3s; }
.hero { view-transition-name: hero; }Cas d'usage : Animer les changements de page ou les transitions de composants pour une UX fluide type app native.
Une View est une requete nommee (virtuelle, recalculee a chaque appel). Une Materialized View stocke physiquement le resultat et doit etre rafraichie manuellement.
View = regarder par la fenetre en temps reel. Materialized View = une photo de la vue, rapide a consulter mais a actualiser.
CREATE MATERIALIZED VIEW monthly_sales AS
SELECT date_trunc('month', created_at) as m,
SUM(total) as revenue
FROM orders GROUP BY m;
REFRESH MATERIALIZED VIEW CONCURRENTLY
monthly_sales;Cas d'usage : Materialized views pour des dashboards lourds a calculer, Views pour simplifier des requetes complexes.
Informaticien americain, co-inventeur de TCP/IP avec Bob Kahn. Souvent appele 'pere de l'Internet', il a concu le protocole qui connecte tous les appareils du monde.
L'inventeur du langage universel que parlent tous les ordinateurs pour communiquer entre eux.
// TCP/IP — Vint Cerf & Bob Kahn, 1974
// Modele en 4 couches :
// 4. Application (HTTP, FTP, DNS)
// 3. Transport (TCP, UDP)
// 2. Internet (IP)
// 1. Acces reseau (Ethernet, WiFi)Cas d'usage : TCP/IP est la base de tout Internet. Comprendre ce protocole est fondamental pour tout developpeur.
Representation legere du DOM reel en memoire. React compare l'ancien et le nouveau Virtual DOM pour ne modifier que ce qui a change.
Comme un brouillon avant d'envoyer un email : tu fais tes corrections sur le brouillon, puis tu envoies seulement la version finale.
// React cree un arbre virtuel
// Ancien: <p>Bonjour</p>
// Nouveau: <p>Salut</p>
// React ne change que le texte du <p>, pas tout le DOMCas d'usage : Mecanisme interne qui optimise les mises a jour du DOM sans intervention manuelle.
Permet de populer une relation sans stocker de reference dans le document parent. Utilise un champ du document enfant comme foreignField pour la jointure.
Trouver tous les colis livres a une adresse sans que l'adresse ait une liste de colis.
authorSchema.virtual('books', {
ref: 'Book',
localField: '_id',
foreignField: 'author'
});
await Author.findById(id).populate('books');Cas d'usage : Creer une relation one-to-many sans tableau de references dans le parent, evitant les documents trop gros.
Proprietes calculees qui n'existent pas en base mais sont disponibles sur le document Mongoose. Definies via des getters et setters sur le schema.
L'age d'une personne : il n'est pas stocke, il est calcule a partir de la date de naissance.
userSchema.virtual('fullName').get(function() {
return `${this.firstName} ${this.lastName}`;
});
const user = await User.findById(id);
console.log(user.fullName);Cas d'usage : Creer des champs derives comme fullName, age ou un URL complete sans les stocker en base.
Technique de rendu qui n'affiche que les elements visibles dans le viewport, meme pour des listes de milliers d'items. Les elements hors ecran ne sont pas montes.
Comme un ascenseur panoramique : tu ne vois que les etages devant toi, pas les 100 etages en meme temps.
import { useVirtualizer } from '@tanstack/react-virtual';
const virtualizer = useVirtualizer({
count: 10000,
getScrollElement: () => parentRef.current,
estimateSize: () => 35,
});
// Ne rend que ~20 items visibles au lieu de 10000Cas d'usage : Listes ou tableaux de plus de quelques centaines d'elements (logs, contacts, produits).
Separe un algorithme de la structure d'objets sur laquelle il opere. Permet d'ajouter de nouvelles operations sans modifier les classes existantes.
Un inspecteur qui visite differents types de batiments : meme demarche, mais le rapport differe selon le batiment.
class TaxVisitor {
visitBook(b) { return b.price * 0.05; }
visitFood(f) { return f.price * 0.10; }
}
// item.accept(visitor)Cas d'usage : Calculs sur un AST (compilateur), serialisation polymorphe, rapports multi-formats.
Test qui compare des captures d'ecran pixel par pixel pour detecter les changements visuels involontaires dans l'interface. Utilise des outils comme Chromatic ou Percy.
Comme superposer deux photos d'un tableau et chercher la moindre difference de couleur ou de position.
// Avec Storybook + Chromatic
// 1. Ecrire les stories
export const Primary = () => <Button primary>OK</Button>;
// 2. Chromatic capture automatiquement
// 3. Toute diff visuelle => review requise
// npx chromatic --project-token=xxxCas d'usage : Pour les design systems et applications ou la coherence visuelle pixel-perfect est critique.
Outil de build nouvelle generation par Evan You (createur de Vue). Dev server ultra-rapide base sur ESM natif, build de production avec Rollup. Standard moderne.
Comme passer d'un four traditionnel a un micro-ondes : le resultat est le meme, mais la vitesse est incomparable.
// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
server: { port: 3000 },
build: { sourcemap: true },
});Cas d'usage : Pour tout nouveau projet frontend (React, Vue, Svelte) necessitant un dev server rapide et un build optimise.
Framework de test ultra-rapide compatible avec l'API Jest, propulse par Vite. Support natif d'ESM, TypeScript et JSX sans configuration supplementaire.
Comme Jest mais avec un moteur turbo : meme volant, memes pedales, mais ca va beaucoup plus vite.
// vite.config.ts
export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
},
});
// API identique a Jest
// test, expect, vi.fn(), vi.mock()Cas d'usage : Pour tout nouveau projet utilisant Vite comme bundler, offrant une DX superieure a Jest.
Gestionnaire de versions Node.js ecrit en Rust, ultra-rapide. Epingle la version Node.js et npm dans package.json pour toute l'equipe automatiquement.
Comme un thermostat qui ajuste la temperature automatiquement dans chaque piece : chaque projet a sa version Node.js sans intervention.
// Installation + pin
volta install node@20
volta pin node@20.11.0
volta pin npm@10
// package.json (automatique)
"volta": {
"node": "20.11.0",
"npm": "10.2.0"
}Cas d'usage : Pour garantir que toute l'equipe utilise la meme version Node.js sans configuration manuelle.
Réseau virtuel isolé dans le cloud, avec des sous-réseaux publics/privés, des tables de routage et des passerelles Internet. Fondation de toute architecture cloud.
Un terrain clôturé avec des bâtiments (sous-réseaux), un portail (Internet Gateway) et un gardien (Security Group).
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
resource "aws_subnet" "private" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
}Cas d'usage : Isoler les ressources cloud et contrôler finement le trafic réseau entrant/sortant.
Modèles d'interaction standardisés par le W3C pour les widgets complexes (onglets, menus, combobox). Chaque pattern définit les rôles, propriétés et gestion clavier attendus.
Comme des recettes de cuisine normalisées : tout le monde utilise les mêmes étapes pour que le résultat soit prévisible.
<div role="combobox" aria-expanded="false"
aria-haspopup="listbox">
<input aria-autocomplete="list">
<ul role="listbox" hidden>
<li role="option">Option 1</li>
</ul>
</div>Cas d'usage : Quand on construit un composant interactif custom pour garantir une UX clavier et lecteur d'écran cohérente.
Journal de pre-ecriture ou chaque modification est enregistree avant d'etre appliquee aux fichiers de donnees. Garantit la durabilite et permet la replication et le point-in-time recovery.
Le brouillon du comptable : chaque operation est notee dans le journal avant d'etre reportee dans le grand livre.
-- Verifier la taille du WAL
SELECT pg_size_pretty(
pg_wal_lsn_diff(
pg_current_wal_lsn(),
'0/0'
)
);Cas d'usage : Comprendre la durabilite des donnees, configurer la replication streaming ou le PITR.
Developpeur americain, inventeur du concept de wiki (WikiWikiWeb, 1995) et de la metaphore de 'dette technique'. Co-signataire du Manifeste Agile.
L'inventeur du wiki ET de la metaphore qui explique pourquoi ton projet ralentit — la dette technique.
// Dette technique — Ward Cunningham
// 'Shipping first time code is like
// going into debt'
// - Raccourcis = emprunts
// - Refactoring = remboursement
// - Si tu ne rembourses jamais...
// les interets t'ecrasentCas d'usage : Le concept de dette technique est utilise quotidiennement en gestion de projet et en planning technique.
Map dont les cles sont obligatoirement des objets et sont tenues faiblement : si plus aucune reference forte n'existe vers la cle, l'entree est garbage-collectee. Non iterable.
Des post-it colles sur des objets : quand l'objet part a la poubelle, le post-it disparait avec.
const metadata = new WeakMap();
let user = { name: 'Alice' };
metadata.set(user, { visits: 0 });
// user = null -> l'entree est GC-eeCas d'usage : Stocker des metadonnees privees sur des objets sans empecher leur garbage collection.
Reference faible vers un objet qui n'empeche pas sa garbage collection. Acces via .deref() qui retourne l'objet ou undefined s'il a ete GC.
Prendre une photo d'un objet au lieu de le garder : tu peux regarder la photo, mais l'objet peut avoir ete jete entre-temps.
let obj = { data: 'important' };
const ref = new WeakRef(obj);
obj = null; // eligible au GC
// Plus tard
const derefed = ref.deref();
if (derefed) console.log(derefed.data);
else console.log('GC collected');Cas d'usage : Caches non-bloquants, observateurs legers, references optionnelles a des objets DOM.
Set dont les valeurs sont obligatoirement des objets tenus faiblement. Non iterable, non denombraable. Utile pour marquer des objets sans empecher leur GC.
Une liste noire invisible : tu sais si quelqu'un y est, mais tu ne peux pas la consulter en entier.
const visited = new WeakSet();
function process(obj) {
if (visited.has(obj)) return;
visited.add(obj);
// traitement...
}Cas d'usage : Detecter les references circulaires, marquer les noeuds DOM deja traites.
API de communication bidirectionnelle persistante entre client et serveur via le protocole ws://. Permet l'envoi et la reception de messages en temps reel sans polling.
Un telephone : une fois la ligne ouverte, les deux cotes peuvent parler quand ils veulent, sans raccrocher et rappeler.
const ws = new WebSocket('wss://api.example.com');
ws.onopen = () => ws.send('Hello');
ws.onmessage = (e) => console.log(e.data);
ws.onerror = (e) => console.error(e);
ws.onclose = () => console.log('Closed');Cas d'usage : Chat en temps reel, notifications live, trading, jeux multijoueur, dashboards temps reel.
API permettant d'executer du JS dans un thread separe du thread principal. Communiquent via postMessage/onmessage. N'ont pas acces au DOM.
Un assistant dans un bureau separe : tu lui envoies du travail par pneumatique (postMessage), il te renvoie le resultat.
// main.js
const worker = new Worker('worker.js');
worker.postMessage({ data: bigArray });
worker.onmessage = (e) => console.log(e.data);
// worker.js
onmessage = (e) => {
const result = heavyCompute(e.data);
postMessage(result);
};Cas d'usage : Calculs lourds (crypto, parsing), traitement d'images, operations qui bloqueraient le thread UI.
Bundler JavaScript historique et ultra-configurable. Transforme les modules, assets et dependances en bundles optimises pour le navigateur. Ecosysteme de plugins et loaders tres riche.
Comme une usine d'assemblage automobile : extremement flexible et puissante, mais complexe a configurer et maintenir.
// webpack.config.js
module.exports = {
entry: './src/index.js',
output: { filename: 'bundle.[contenthash].js' },
module: {
rules: [
{ test: /\.tsx?$/, use: 'ts-loader' },
{ test: /\.css$/, use: ['style-loader', 'css-loader'] }
]
},
};Cas d'usage : Pour les projets legacy ou les cas necessitant une configuration fine du bundling avec des plugins specifiques.
API navigateur pour la communication peer-to-peer en temps réel (audio, vidéo, données) sans passer par un serveur central. Utilise STUN/TURN pour la traversée NAT.
Un talkie-walkie numérique qui connecte deux personnes directement sans passer par un standard téléphonique.
const pc = new RTCPeerConnection({ iceServers });
const stream = await navigator.mediaDevices.getUserMedia({
video: true, audio: true
});
stream.getTracks().forEach(t => pc.addTrack(t, stream));
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);Cas d'usage : Visioconférence, partage d'écran, transfert de fichiers P2P dans le navigateur.
Protocole de communication bidirectionnelle persistante entre client et serveur sur une seule connexion TCP. Idéal pour les données temps réel.
Un appel téléphonique ouvert en continu plutôt que d'envoyer des SMS un par un.
const ws = new WebSocket('wss://api.example.com');
ws.onopen = () => ws.send(JSON.stringify({ type: 'subscribe', channel: 'prices' }));
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
updateUI(data);
};Cas d'usage : Chat en temps réel, cours de bourse, notifications live, jeux multijoueurs.
Classe decoree @WebSocketGateway qui gere les connexions WebSocket bidirectionnelles. Utilise Socket.IO ou ws pour la communication temps reel.
Comme un talkie-walkie : la communication est instantanee dans les deux sens, sans besoin de 'rappeler'.
@WebSocketGateway({ cors: true })
export class ChatGateway {
@WebSocketServer() server: Server;
@SubscribeMessage('message')
handleMessage(@MessageBody() data: string) {
this.server.emit('message', data);
}
}Cas d'usage : Implementer un chat en temps reel, des notifications push ou un tableau de bord live.
Informaticien neerlandais, CTO d'Amazon et d'AWS depuis 2005. Il a popularise le concept 'You build it, you run it' et influence l'adoption massive du cloud computing.
Le maitre d'oeuvre du cloud : quand il parle a re:Invent, les architectes du monde entier prennent des notes.
// Philosophie Werner Vogels
// 'Everything fails, all the time'
// Design for failure :
// - Multi-AZ
// - Auto-scaling
// - Eventual consistency
// - Chaos engineeringCas d'usage : Comprendre la philosophie AWS et les principes de conception pour des systemes distribues resilients.
Developpeur et formateur canadien, createur de cours web (JavaScript30, React for Beginners, Fullstack Advanced React). Co-host du podcast Syntax.fm.
Le prof cool de JavaScript : ses cours sont comme des tutos de cuisine — tu codes en meme temps et ca marche.
// JavaScript30 — Wes Bos
// 30 projets JS vanille en 30 jours
const audio = document.querySelector(
`audio[data-key="${e.keyCode}"]`
);
audio.currentTime = 0;
audio.play();
// Apprendre en construisantCas d'usage : Ses cours gratuits et payants sont des references pour apprendre JavaScript et React de facon pratique.
Cryptographe americain, co-inventeur de la cryptographie a cle publique avec Martin Hellman. L'echange de cles Diffie-Hellman est utilise dans TLS/HTTPS, protegeant chaque connexion web.
L'inventeur du cadenas a combinaison d'Internet : deux inconnus peuvent communiquer en secret sans jamais s'etre rencontres.
// Diffie-Hellman Key Exchange
// Alice et Bob choisissent p, g publics
// Alice: A = g^a mod p (a secret)
// Bob: B = g^b mod p (b secret)
// Cle partagee: B^a mod p = A^b mod p
// Magie : cle secrete sans la transmettreCas d'usage : Diffie-Hellman est a la base de HTTPS. Comprendre ce principe est essentiel pour la securite web.
Librairie de debugging qui alerte dans la console quand un composant se re-rend inutilement (memes props mais nouvelle reference).
Comme un detecteur de fuite d'eau : il te montre exactement ou tu perds des performances.
// wdyr.js (importer en premier)
import React from 'react';
import whyDidYouRender from '@welldone-software/why-did-you-render';
whyDidYouRender(React);
// Sur un composant specifique
MyComponent.whyDidYouRender = true;Cas d'usage : Debugger les re-rendus excessifs pendant le developpement pour trouver les fuites de performance.
Classes w-* et h-* pour definir la largeur et hauteur. Inclut les valeurs fractionnelles (w-1/2), min/max (min-w-0, max-h-screen) et speciales (w-full, h-screen, h-dvh).
Comme regler la taille d'une fenetre : largeur, hauteur, et des limites min/max.
<div class="w-full max-w-lg mx-auto h-screen">
<img class="w-1/2 h-auto" />
<div class="min-h-[50vh] size-16"></div>
</div>Cas d'usage : Dimensionner des elements de facon responsive avec des contraintes min/max.
Index qui couvre tous les champs d'un document ou d'un sous-document, y compris les champs dynamiques inconnus a l'avance. Utile pour les schemas flexibles.
Un detective qui met sous surveillance tout le batiment au lieu d'un seul appartement.
db.products.createIndex(
{ 'attributes.$**': 1 }
);Cas d'usage : Indexer des metadonnees ou attributs dynamiques dont les noms de champs varient selon les documents.
Propriété CSS qui informe le navigateur qu'une propriété va changer, lui permettant d'optimiser le rendu à l'avance (promotion en couche composite). À utiliser avec parcimonie.
Comme prévenir un serveur qu'on va commander un plat complexe : il peut commencer la préparation.
.animated {
will-change: transform;
transition: transform 0.3s;
}
.animated:hover {
transform: scale(1.05);
}
/* Retirer après animation si ajouté via JS */Cas d'usage : Optimiser les animations qui saccadent en promouvant l'élément sur sa propre couche composite.
Fonctions qui operent sur un ensemble de lignes (fenetre) lie a la ligne courante sans reduire le nombre de resultats. Incluent ROW_NUMBER, RANK, LAG, LEAD, SUM OVER, etc.
Un coureur qui voit son classement en temps reel pendant la course, sans que la course s'arrete.
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) as rank,
salary - LAG(salary) OVER (ORDER BY salary DESC)
as diff_with_prev
FROM employees;Cas d'usage : Calculer des classements, des moyennes mobiles ou comparer chaque ligne avec la precedente/suivante.
Technique Temporal pour déployer de nouvelles versions de code Workflow sans casser les exécutions en cours. Utilise patching ou Task Queue versioning.
Changer le moteur d'un avion en vol : les anciens passagers gardent l'ancien moteur, les nouveaux ont le nouveau.
import { patched } from '@temporalio/workflow';
if (patched('new-validation')) {
await newValidation(order);
} else {
await oldValidation(order);
}Cas d'usage : Déployer des changements de logique métier en production sans interrompre les processus en cours.
API RESTful native de WordPress exposant les contenus en JSON. Permet le headless WordPress, les SPA et l'integration avec des applications externes.
Comme un guichet de service qui fournit les informations dans un format standard que tout le monde peut lire.
register_rest_route('myplugin/v1', '/items', [
'methods' => 'GET',
'callback' => function(WP_REST_Request $req) {
return new WP_REST_Response($data, 200);
},
'permission_callback' => '__return_true',
]);Cas d'usage : Pour les architectures headless, les apps mobiles ou les integrations tierces avec WordPress.
Systeme de taches planifiees de WordPress, declenche par les visites des utilisateurs (pseudo-cron). Peut etre remplace par un vrai cron systeme pour plus de fiabilite.
Comme un reveil qui ne sonne que quand quelqu'un passe devant : il n'est pas fiable si personne ne vient.
// Planifier
if (!wp_next_scheduled('daily_cleanup')) {
wp_schedule_event(time(), 'daily', 'daily_cleanup');
}
add_action('daily_cleanup', function() {
// Nettoyage quotidien
});Cas d'usage : Pour les taches recurrentes : nettoyage, envoi d'emails, synchronisation de donnees.
Methode standard pour charger CSS et JS dans WordPress. Gere les dependances, le versioning, le placement header/footer et evite les doublons.
Comme un chef d'orchestre qui decide quels musiciens jouent, dans quel ordre et a quel moment.
add_action('wp_enqueue_scripts', function() {
wp_enqueue_style('main', get_stylesheet_uri(), [], '1.0');
wp_enqueue_script(
'app', get_theme_file_uri('js/app.js'),
['jquery'], '1.0', true
);
});Cas d'usage : Pour tout chargement de CSS/JS dans un theme ou plugin WordPress.
Classe PHP pour construire des requetes de posts personnalisees. Permet de filtrer par type, taxonomie, meta, date, avec pagination et cache.
Comme un moteur de recherche interne ultra precis : tu definis tes criteres, il trouve les contenus.
$query = new WP_Query([
'post_type' => 'product',
'posts_per_page' => 12,
'tax_query' => [[
'taxonomy' => 'category',
'terms' => 'featured',
]],
]);
wp_reset_postdata();Cas d'usage : Pour afficher des listes de contenus personnalisees (produits vedettes, articles recents d'une categorie).
Interface en ligne de commande officielle de WordPress. Permet de gerer plugins, themes, base de donnees, utilisateurs et plus sans navigateur.
Comme un tableau de bord textuel pour piloter WordPress a la vitesse de la lumiere.
# Mise a jour
wp core update && wp plugin update --all
# Rechercher/remplacer
wp search-replace 'http://old.com' 'https://new.com'
# Export base
wp db export backup.sqlCas d'usage : Pour l'automatisation, les deploiements, la maintenance et les migrations WordPress.
Write Concern definit combien de noeuds doivent confirmer une ecriture (w:1, w:majority). Read Concern definit le niveau d'isolation des lectures (local, majority, snapshot).
Write concern = combien de temoins doivent signer un contrat. Read concern = le niveau de certitude que tu exiges avant de lire un document officiel.
db.orders.insertOne(
{ item: 'laptop' },
{ writeConcern: { w: 'majority', j: true } }
);Cas d'usage : Ajuster le compromis entre performances et durabilite des donnees selon la criticite de l'operation.
Stratégie où les écritures vont d'abord dans le cache, puis sont flush vers la DB de manière asynchrone/batchée. Très performant mais risque de perte.
Prendre des notes sur un brouillon puis recopier au propre plus tard : rapide mais risque de perdre le brouillon.
async function updateUser(id, data) {
await cache.set(`user:${id}`, data);
await cache.sadd('dirty-keys', `user:${id}`);
// Un worker flush les dirty keys vers la DB
}Cas d'usage : Compteurs temps réel, analytics haute fréquence où la perte ponctuelle est acceptable.
Stratégie où chaque écriture met à jour simultanément le cache et la base de données. Garantit la cohérence cache/DB au prix d'écritures plus lentes.
Écrire dans ton agenda ET dans le calendrier mural en même temps : toujours synchronisés.
async function updateUser(id, data) {
await db.updateUser(id, data);
await cache.set(`user:${id}`, data, 'EX', 300);
return data;
}Cas d'usage : Données critiques nécessitant une cohérence forte entre cache et DB.
Propriété writing-mode qui définit la direction du flux de texte : horizontal (horizontal-tb), vertical de droite à gauche (vertical-rl) ou de gauche à droite (vertical-lr).
Comme choisir d'écrire sur une page de gauche à droite, de haut en bas, ou en colonnes verticales comme en japonais.
.vertical-label {
writing-mode: vertical-rl;
text-orientation: mixed;
}
.japanese-text {
writing-mode: vertical-rl;
}Cas d'usage : Supporter du contenu en japonais/chinois vertical ou créer des labels verticaux dans des graphiques.
Extension PHP de debugging et profilage. Permet le step debugging, le stack trace detaille, la couverture de code et le profilage de performance.
Comme une camera au ralenti qui permet de voir chaque etape de l'execution en detail.
; php.ini
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9003Cas d'usage : En developpement pour debugger pas-a-pas, analyser les performances et generer la couverture de code.
Vulnerabilite permettant l'injection de scripts malveillants dans une page web vue par d'autres utilisateurs. Vole des sessions, redirige, defigure.
Comme quelqu'un qui colle un faux panneau dans un magasin pour tromper les clients.
// DANGEREUX
echo "Bonjour $username";
// SECURISE
echo 'Bonjour ' . htmlspecialchars($username, ENT_QUOTES, 'UTF-8');Cas d'usage : A chaque affichage de donnees dynamiques dans du HTML, sans exception.
Ne pas implementer une fonctionnalite tant qu'elle n'est pas reellement necessaire. Les besoins futurs imagines se materialisent rarement tels quels.
Ne pas construire un garage pour 4 voitures quand tu n'en as qu'une — et tu demenageras peut-etre.
// YAGNI violé:
class User {
// 'au cas ou on aurait besoin de multi-tenant'
tenantId?: string;
// 'au cas ou on supporterait l'i18n'
locale?: string;
}Cas d'usage : Eviter le code mort et la complexite prematuree en se concentrant sur le besoin actuel.
Informaticien francais, pionnier des reseaux convolutifs (CNN) et Chief AI Scientist chez Meta. Ses travaux sur LeNet ont permis la reconnaissance d'images et de texte.
Le Francais qui a appris aux ordinateurs a voir — ses CNN lisent les cheques bancaires depuis les annees 90.
# CNN — Yann LeCun, LeNet (1998)
import torch.nn as nn
class LeNet(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16*5*5, 120)Cas d'usage : Les CNN sont la base de la vision par ordinateur : reconnaissance faciale, OCR, conduite autonome.
Gestionnaire de paquets alternatif a npm. Yarn Classic (v1) a popularise le lock file. Yarn Berry (v3+) utilise Plug'n'Play (PnP) sans node_modules.
Comme un concurrent d'Amazon qui a innove avec la livraison rapide, forcant l'original a s'ameliorer.
yarn install # install deps
yarn add express # ajouter une dep
yarn add -D vitest # dep de dev
yarn test # lancer un script
yarn dlx create-next-app # equivalent npx
yarn workspaces foreach test # monorepoCas d'usage : Pour les equipes ayant investi dans l'ecosysteme Yarn, notamment avec PnP pour des installs plus rapides.
Informaticien japonais, createur de Ruby. Sa philosophie : optimiser le bonheur du developpeur. Ruby on Rails (DHH) a popularise Ruby dans le web.
Le designer qui a cree un langage pour que les devs sourient en codant — la Marie Kondo du code.
# Ruby — Yukihiro Matsumoto, 1995
class Greeter
def hello(name)
puts "Hello, #{name}!"
end
end
Greeter.new.hello('World')Cas d'usage : Comprendre la philosophie 'developer happiness' et l'influence de Ruby sur les frameworks web modernes.
Integration de Zod (validation de schemas) avec React Hook Form via @hookform/resolvers pour une validation typesafe partageable entre client et serveur.
Comme un contrat notarie pour un formulaire : les regles sont definies une fois et appliquees partout.
const schema = z.object({
email: z.string().email('Email invalide'),
age: z.number().min(18, 'Minimum 18 ans'),
});
type FormData = z.infer<typeof schema>;
const { register, handleSubmit } = useForm<FormData>({
resolver: zodResolver(schema),
});Cas d'usage : Formulaires avec validation complexe et types TypeScript inferes automatiquement depuis le schema.
Librairie de state management minimaliste sans boilerplate. Un store = une fonction, pas de Provider requis, compatible avec le rendu concurrent.
Comme un carnet de notes partage au bureau : tout le monde y accede directement, sans passer par un secretaire (Provider).
const useStore = create((set) => ({
count: 0,
increment: () => set((s) => ({ count: s.count + 1 })),
}));
function Counter() {
const count = useStore((s) => s.count);
return <span>{count}</span>;
}Cas d'usage : Etat global simple a moyen sans la complexite de Redux, ideal pour les projets de toute taille.