Lexique Dev — +1171 définitions

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

1171+Définitions
19Stacks
3Niveaux
Advanced Ecosystem Architecture CSS-in-JS DevOps HTML / CSS JavaScript MongoDB Mongoose NestJS Personalities PHP PostgreSQL React Sass Styled-Components Tailwind CSS Testing TypeScript WordPress

1171 termes affichés

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

:has()

HTML / CSS 🟡 Mid

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

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

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

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

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

:is()

HTML / CSS 🟡 Mid

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

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

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

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

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

:where()

HTML / CSS 🟡 Mid

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

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

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

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

#interview

!default / !global

Sass 🟡 Mid

!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.

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

.attrs()

Styled-Components 🟡 Mid

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.

#styling#css-in-js

.dockerignore

DevOps 🟢 Junior

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

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

node_modules
.git
.env
dist
*.md
.DS_Store

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

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

'use client'

React 🟡 Mid

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.

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

'use server'

React 🟡 Mid

Directive qui marque une fonction 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.

Anti-pattern : Mettre de la logique sensible cote client en oubliant que 'use server' cree un endpoint public.
#rendering#react19#nextjs

@apply

Tailwind CSS 🟡 Mid

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.

Anti-pattern : Abuser de @apply pour tout, annulant l'interet de l'approche utility-first.
#styling#interview#tailwind

@at-root

Sass 🔴 Senior

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.

#styling#sass

@Body

NestJS 🟢 Junior

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.

#core#interview

@each / @for / @while

Sass 🟡 Mid

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.

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

@extend

Sass 🟡 Mid

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.

Anti-pattern : Enchainer les @extend cree des selecteurs CSS enormes et imprevisibles. Preferer les mixins.
#styling#interview#sass

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

NestJS 🟢 Junior

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.

Anti-pattern : Utiliser @Post pour des operations de lecture ou @Get avec un body de requete.
#core#interview

@Headers

NestJS 🟢 Junior

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.

#core

@Inject

NestJS 🟡 Mid

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.

#core

@Injectable

NestJS 🟢 Junior

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.

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

@layer

Tailwind CSS 🟡 Mid

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.

#styling#tailwind

@media (prefers-*)

HTML / CSS 🟡 Mid

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.

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

@Param

NestJS 🟢 Junior

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.

#core

@property

HTML / CSS 🔴 Senior

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

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

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

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

#interview

@Query

NestJS 🟢 Junior

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.

#core

@scope

HTML / CSS 🔴 Senior

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.

#interview

@SetMetadata

NestJS 🟡 Mid

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.

#core#security

@starting-style

HTML / CSS 🔴 Senior

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.

#interview

@supports

HTML / CSS 🟡 Mid

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

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

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

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

#core#interview

@tailwindcss/typography (Prose)

Tailwind CSS 🟡 Mid

Plugin officiel qui ajoute la classe prose pour styler 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.

#styling#interview#tailwind

@use / @forward

Sass 🟡 Mid

@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 *; // => $primary

Cas d'usage : Remplacer @import (deprecie) par un systeme de modules avec namespaces et encapsulation.

Anti-pattern : Continuer a utiliser @import qui sera retire de Sass et qui pollue le scope global.
#styling#interview#sass

@UseFilters

NestJS 🟡 Mid

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.

#core

@UseGuards

NestJS 🟡 Mid

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.

#core#security

@UseInterceptors

NestJS 🟡 Mid

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.

#core

@UsePipes

NestJS 🟡 Mid

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.

#core

$addFields

MongoDB 🟡 Mid

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.

#sgbd#interview#database#mongodb

$bucket

MongoDB 🔴 Senior

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.

#sgbd#interview#database#mongodb

$facet

MongoDB 🔴 Senior

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.

#sgbd#interview#database#mongodb

$group

MongoDB 🟡 Mid

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.

#sgbd#interview#database#mongodb

$lookup

MongoDB 🟡 Mid

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.

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

$match

MongoDB 🟡 Mid

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.

#sgbd#interview#database#mongodb

$project

MongoDB 🟡 Mid

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.

#sgbd#interview#database#mongodb

$unwind

MongoDB 🟡 Mid

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.

Anti-pattern : Appliquer $unwind sur des tableaux de milliers d'elements, multipliant la memoire utilisee.
#sgbd#interview#database#mongodb

$wpdb->prepare

WordPress 🟡 Mid

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.

Anti-pattern : Concatener des variables dans la requete : $wpdb->query("DELETE FROM ... WHERE id = $id").
#core#interview#security#wordpress

12-Factor App

DevOps 🟡 Mid

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

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

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

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

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

2FA / MFA

Advanced Ecosystem 🟡 Mid

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

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

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

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

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

7-1 Pattern

Sass 🟡 Mid

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

Un classeur avec 7 intercalaires et une table des 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.

#styling#interview#sass

A/B Test

Testing 🟡 Mid

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).

Anti-pattern : Arreter le test trop tot sans signifiance statistique, menant a des conclusions fausses.
#testing#product#frontend

AAA (Arrange-Act-Assert)

Testing 🟢 Junior

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.

Anti-pattern : Melanger Act et Assert dans la meme ligne ou avoir plusieurs Act dans un seul test.
#testing#interview#principle

Aaron Swartz

Personalities 🟡 Mid

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.

#personalities#history#interview

ABAC

NestJS 🔴 Senior

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'.

#security

AbortController

JavaScript 🟡 Mid

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.

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

Abstract Class

PHP 🟡 Mid

Classe qui ne peut pas 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.

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

Abstract Factory

PHP 🔴 Senior

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).

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

Abstract Factory

Architecture 🟡 Mid

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.

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

Acceptance Test

Testing 🟡 Mid

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 cree

Cas d'usage : Pour formaliser et automatiser les criteres d'acceptation du Product Owner en tests executables.

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

Accessibility Tree

HTML / CSS 🟡 Mid

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

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

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

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

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

ACID

DevOps 🟡 Mid

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

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

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

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

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

ACID in MongoDB

MongoDB 🔴 Senior

Depuis la version 4.0, MongoDB supporte les 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.

#sgbd#interview#database#mongodb

Action (React Router)

React 🟡 Mid

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.

#routing#forms

Action Hook

WordPress 🟢 Junior

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.

Anti-pattern : Accrocher du code lourd (requetes API) sur des hooks frequents comme 'init' sans condition.
#core#interview#wordpress

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.

Anti-pattern : Utiliser Active Record sur un domaine complexe et finir avec des modeles de 1000 lignes melangeant metier et persistence.
#core#interview#architecture

Ada Lovelace

Personalities 🟢 Junior

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'electricite

Cas d'usage : Connaitre les origines de la programmation et comprendre que l'informatique a des racines bien anterieures aux ordinateurs electroniques.

Anti-pattern : Penser qu'elle n'etait qu'une theoricienne : son algorithme etait concret et executable.
#personalities#history#interview

Adapter

Architecture 🟢 Junior

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

Un adaptateur de prise 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.

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

Adrian Cockcroft

Personalities 🔴 Senior

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-native

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

#personalities#history#interview

Advisory Locks

PostgreSQL 🔴 Senior

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.

#sgbd#interview#database#postgresql

Aggregate

Architecture 🔴 Senior

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.

Anti-pattern : Agregats trop gros qui verrouillent trop de donnees — contention en prod.
#architecture#interview#ddd

Aggregate Root

Architecture 🔴 Senior

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.

Anti-pattern : Acceder directement aux entites internes de l'agregat depuis l'exterieur.
#architecture#interview#ddd

Aggregation Pipeline

MongoDB 🟡 Mid

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.

Anti-pattern : Mettre un $match apres un $group non filtre, traitant des millions de documents inutilement.
#sgbd#interview#database#mongodb

Alan Turing

Personalities 🟢 Junior

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 programme

Cas d'usage : Comprendre les fondements theoriques de l'informatique : calculabilite, decidabilite et les limites de ce qu'un ordinateur peut resoudre.

Anti-pattern : Reduire Turing au test de Turing (IA) alors que sa contribution majeure est la theorie de la calculabilite.
#personalities#history#interview

Algolia

Advanced Ecosystem 🟢 Junior

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.

Anti-pattern : Indexer des millions de records sans optimiser les attributs searchable, explosant les coûts.
#search#saas

Alternatives (Emotion, Stitches, etc.)

Styled-Components 🟡 Mid

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).

#styling#interview#css-in-js

Ambassador

Architecture 🔴 Senior

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.

Anti-pattern : Implementer retry/circuit breaker dans chaque service au lieu de les centraliser.
#architecture#interview#microservices#cloud

Ambient Declarations (.d.ts)

TypeScript 🟡 Mid

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 import

Cas d'usage : Typer des bibliotheques JavaScript, des variables globales injectees ou du code legacy.

Anti-pattern : Ecrire des .d.ts quand on peut simplement ecrire du .ts — les declarations ne sont utiles que pour du JS pur.
#core#tooling

Anchor Positioning

HTML / CSS 🔴 Senior

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.

#interview

Anders Hejlsberg

Personalities 🟡 Mid

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.

#personalities#history#interview

Andrej Karpathy

Personalities 🟡 Mid

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.

#personalities#history#interview

Andrew Ng

Personalities 🟡 Mid

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 theta

Cas d'usage : Son cours Coursera est LE point d'entree recommande pour apprendre le machine learning.

#personalities#history#interview

Animate & Transition

Tailwind CSS 🟢 Junior

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).

#styling#tailwind

Anonymous Classes

PHP 🟡 Mid

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.

Anti-pattern : Utiliser des classes anonymes en production pour de la logique complexe qui merite une vraie classe nommee.
#advanced#php8

Ansible

DevOps 🟡 Mid

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=started

Cas d'usage : Configurer des serveurs, déployer des applications, orchestrer des tâches multi-machines.

Anti-pattern : Scripts shell ad-hoc sur chaque serveur : non reproductible, non versionné.
#devops#iac#tooling

Anti-Corruption Layer

Architecture 🔴 Senior

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.

Anti-pattern : Laisser les champs legacy (USR_ID, FNAME) se propager dans tout votre domaine.
#architecture#interview#ddd

Apache Kafka

DevOps 🔴 Senior

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.

Anti-pattern : Utiliser Kafka pour des queues simples : surcharge opérationnelle pour un cas trivial.
#devops#messaging#interview

API Gateway

Architecture 🟡 Mid

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-service

Cas d'usage : Entree unifiee pour les microservices avec concerns transversaux centralises.

Anti-pattern : Gateway trop intelligente avec de la logique metier — doit rester un passe-plat.
#architecture#interview#microservices

API Key Management

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Stocker les clés API en clair dans la base de données ou les committer dans le code source.
#security#api

API Pagination (Cursor vs Offset)

Architecture 🟡 Mid

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.

Anti-pattern : Offset sur des millions de lignes — performances catastrophiques avec OFFSET 100000.
#architecture#interview#api#best-practice

API Rate Limiting

Architecture 🟡 Mid

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.

Anti-pattern : Rate limit global sans distinction par client — un client gourmand bloque tout le monde.
#architecture#interview#api#security

API Versioning

Architecture 🟡 Mid

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=2

Cas d'usage : APIs publiques avec des clients que vous ne controlez pas et qui ne migrent pas en meme temps.

Anti-pattern : Breaking changes sans versioning — les clients en production cassent.
#architecture#interview#api#best-practice

Application Service

Architecture 🟡 Mid

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.

Anti-pattern : Mettre de la logique metier dans le service applicatif au lieu du domaine.
#architecture#interview#ddd

Arbitrary Values [...]

Tailwind CSS 🟡 Mid

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.

Anti-pattern : Abuser des valeurs arbitraires au lieu d'etendre le theme pour des valeurs reutilisees.
#styling#interview#tailwind

ARIA Roles

HTML / CSS 🟡 Mid

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.

Anti-pattern : Ajouter role='button' sur un <div> au lieu d'utiliser un vrai <button>.
#core#interview#accessibility

Array Methods

JavaScript 🟢 Junior

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.

Anti-pattern : Utiliser forEach pour construire un nouveau tableau au lieu de map.
#core#fondamental#interview

Array Type

PostgreSQL 🟡 Mid

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.

Anti-pattern : Utiliser des arrays pour des relations complexes au lieu d'une table many-to-many.
#sgbd#interview#database#postgresql

ArrayBuffer

JavaScript 🔴 Senior

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 differente

Cas d'usage : Traitement d'images, audio, fichiers binaires, communication avec WebGL ou WASM.

#core#avance#performance

Arrow Function

JavaScript 🟢 Junior

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.

Anti-pattern : Utiliser une arrow function comme methode d'objet literal : this ne pointe pas vers l'objet.
#core#ES6#fondamental

Arrow Functions

PHP 🟢 Junior

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.

Anti-pattern : Ecrire des arrow functions complexes multi-logique au lieu d'utiliser une closure classique.
#core#php8

Artifact

DevOps 🟢 Junior

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.

#devops#cicd

as Prop (Polymorphism)

Styled-Components 🟡 Mid

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).

#styling#css-in-js

Aspect Ratio

HTML / CSS 🟢 Junior

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.

Anti-pattern : Utiliser le hack padding-bottom: 56.25% alors que aspect-ratio est supporté partout.
#core#interview

Assertion Function

TypeScript 🔴 Senior

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 ici

Cas d'usage : Validation stricte en debut de fonction qui narrowe les types pour tout le reste du bloc.

Anti-pattern : Oublier le throw dans l'assertion — la fonction ne lance pas et le narrowing est incorrect.
#advanced#safety

Async/Await

JavaScript 🟢 Junior

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.

Anti-pattern : Oublier le try/catch autour d'un await, laissant les rejections non gerees crasher silencieusement.
#core#interview#async#fondamental

AsyncGenerator

JavaScript 🔴 Senior

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.

#core#async#avance

AsyncIterator

JavaScript 🔴 Senior

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.

#core#async#avance

Atomic CSS

HTML / CSS 🟡 Mid

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.

#interview

Atomic CSS

CSS-in-JS 🟡 Mid

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.

#styling#interview#css-in-js

Atomics

JavaScript 🔴 Senior

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); // 50

Cas d'usage : Synchronisation entre workers, compteurs partages, mutex software.

#core#avance#concurrence

Attributes

PHP 🟡 Mid

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.

Anti-pattern : Surcharger les classes d'attributs au point de rendre le code illisible.
#core#interview#php8

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.

Anti-pattern : Deployer MongoDB sans authentification activee, exposant toute la base.
#sgbd#interview#database#mongodb#security

Autoload Options Piege

WordPress 🔴 Senior

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.

Anti-pattern : Stocker des logs, des caches ou des donnees volumineuses dans wp_options avec autoload.
#interview#wordpress#performance

Automatic Batching

React 🟡 Mid

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+.

Anti-pattern : Utiliser flushSync pour forcer des rendus synchrones sans raison valable.
#core#performance#react18

Autoprefixer

CSS-in-JS 🟢 Junior

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.

#styling#css-in-js

Awaited<T>

TypeScript 🟡 Mid

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>; // string

Cas d'usage : Obtenir le type resolu d'une fonction async ou d'une chaine de Promises pour le typage correct.

#core#utility-types

B-tree Index

PostgreSQL 🟡 Mid

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.

#sgbd#interview#database#postgresql

Babel

Testing 🟡 Mid

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.

Anti-pattern : Utiliser Babel pour un nouveau projet quand SWC ou esbuild font le meme travail 20x plus vite.
#build#tooling#legacy

Backdrop Filter

HTML / CSS 🟡 Mid

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.

Anti-pattern : Appliquer backdrop-filter sur de nombreux éléments superposés, causant des problèmes de performance GPU.
#interview

Barbara Liskov

Personalities 🟡 Mid

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.

#personalities#history#interview

Barrel Files

JavaScript 🟡 Mid

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.

Anti-pattern : Barrel files dans chaque sous-dossier qui forcent le bundler a parser des centaines de modules.
#core#modules#architecture

Barrel Files (piege)

Testing 🟡 Mid

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 source

Cas d'usage : Acceptable pour les librairies publiees, mais a eviter dans le code applicatif pour les performances.

Anti-pattern : Creer des barrels partout dans le code applicatif, degradant le tree-shaking et les temps de build.
#tooling#performance#piege

BASE

DevOps 🔴 Senior

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 ms

Cas d'usage : Systèmes à très haute disponibilité où un léger délai de cohérence est acceptable.

#devops#database#interview

BDD

Testing 🟡 Mid

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.

Anti-pattern : Ecrire les specs Gherkin sans implication du PO, les reduisant a du test technique deguise.
#testing#agile#methode

BEM

HTML / CSS 🟢 Junior

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.

Anti-pattern : Imbriquer des blocks dans des elements (.card__header__title) au lieu de créer un nouveau block.
#core#interview

BEM + Sass

Sass 🟡 Mid

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.

Anti-pattern : Imbriquer les elements BEM trop profond (.card__header__title__icon au lieu de .card__icon).
#styling#interview#sass

Bert Bos

Personalities 🔴 Senior

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.

#personalities#history#interview

BFF (Backend for Frontend)

Architecture 🟡 Mid

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.

Anti-pattern : Un seul backend pour tous les clients avec des if/else par plateforme.
#architecture#interview#microservices

BigInt

JavaScript 🟡 Mid

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.

Anti-pattern : Melanger BigInt et Number sans conversion explicite, provoquant un TypeError.
#core#ES2020

Bill Gates

Personalities 🟢 Junior

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 PC

Cas d'usage : Comprendre l'histoire de Microsoft et comment le modele de licence logicielle a faconne l'industrie.

Anti-pattern : Oublier que Gates etait un vrai programmeur : il a ecrit le premier interpreteur BASIC de Microsoft.
#personalities#history#interview

bind / call / apply

JavaScript 🟡 Mid

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.

#core#interview

Bjarne Stroustrup

Personalities 🟡 Mid

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, 1985

Cas d'usage : Comprendre les fondations de la POO et pourquoi C++ reste dominant dans la performance critique (jeux, finance, systemes).

#personalities#history#interview

Blue-Green Deployment

DevOps 🟡 Mid

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 green

Cas d'usage : Déploiement zero-downtime avec rollback instantané en cas de problème.

Anti-pattern : Pas de test sur green avant le switch : le bug arrive directement en prod.
#devops#scaling#interview

Bob Kahn

Personalities 🟡 Mid

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 perte

Cas d'usage : Comprendre les fondations d'Internet et du protocole qui garantit la fiabilite des communications.

#personalities#history#interview

Bounded Context

Architecture 🟡 Mid

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 separees

Cas d'usage : Decomposer un systeme complexe en sous-domaines autonomes avec des frontieres claires.

Anti-pattern : Un modele unique partage entre tous les contextes — Big Ball of Mud.
#architecture#interview#ddd

Branch Protection

Testing 🟡 Mid

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 administrators

Cas d'usage : Pour proteger les branches de production contre les pushes directs, les force pushes et les merges sans review.

Anti-pattern : Exclure les admins des branch protections, permettant des pushes directs 'en urgence' qui contournent le process.
#qualite#git#securite

Branded / Nominal Types

TypeScript 🔴 Senior

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)); // Erreur

Cas d'usage : Distinguer des IDs, devises ou unites de mesure qui sont structurellement des strings/numbers.

Anti-pattern : Utiliser des types simples (string, number) pour des IDs de domaines differents — un userId passe en orderId compile sans erreur.
#advanced#pattern#safety

Breakpoints

HTML / CSS 🟢 Junior

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.

Anti-pattern : Créer des breakpoints pour chaque modèle d'appareil (iPhone 12, Galaxy S21) au lieu de se baser sur le contenu.
#core#interview

Brendan Eich

Personalities 🟢 Junior

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 depuis

Cas d'usage : JavaScript est LE langage du web. Le connaitre est obligatoire pour tout developpeur front-end et full-stack.

Anti-pattern : Mepriser JS pour ses bizarreries (typeof null === 'object') sans reconnaitre son evolution massive (ES6+).
#personalities#history#interview

Brian Kernighan

Personalities 🟡 Mid

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.

#personalities#history#interview

Bridge

Architecture 🔴 Senior

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.

Anti-pattern : Heriter pour chaque combinaison : RedCircle, BlueCircle, RedSquare...
#architecture#interview#gof#structural

BRIN Index

PostgreSQL 🔴 Senior

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.

Anti-pattern : Utiliser BRIN sur des colonnes dont les valeurs ne sont pas correlees a l'ordre physique des lignes.
#sgbd#interview#database#postgresql

Broadcast Channel

JavaScript 🟡 Mid

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.

#core#navigateur#communication

Bruce Schneier

Personalities 🟡 Mid

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 siens

Cas d'usage : Comprendre les principes de securite et pourquoi il ne faut JAMAIS creer sa propre cryptographie.

#personalities#history#interview

Brute Force Protection

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Verrouiller le compte indéfiniment après N échecs, permettant un déni de service ciblé.
#security#authentication

BSON

MongoDB 🟡 Mid

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.

#sgbd#interview#database#mongodb

Builder

Architecture 🟢 Junior

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.

Anti-pattern : Constructeur avec 10+ parametres positionnels au lieu d'un builder lisible.
#architecture#interview#gof#creational

Builder Pattern Type

TypeScript 🔴 Senior

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.

Anti-pattern : Builder sans typage progressif — rien n'empeche d'appeler build() avant d'avoir configure les champs requis.
#advanced#pattern

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); // a

Cas d'usage : Manipuler couleurs, nombres, listes et maps sans dependances externes.

#styling#interview#sass

Built-in Validators

Mongoose 🟢 Junior

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.

Anti-pattern : Desactiver la validation avec validateBeforeSave: false pour 'gagner en perf'.
#sgbd#interview#database#mongoose

Bulkhead Pattern

DevOps 🔴 Senior

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 disponible

Cas d'usage : Empêcher qu'un service lent consomme toutes les connexions et bloque les autres.

#devops#resilience

bulkWrite

MongoDB 🟡 Mid

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.

#sgbd#interview#database#mongodb

BullModule

NestJS 🟡 Mid

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.

Anti-pattern : Traiter des taches longues de facon synchrone dans le request handler, bloquant la reponse.
#core

BullMQ

DevOps 🟡 Mid

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.

Anti-pattern : Traiter les tâches lourdes de manière synchrone dans le request handler.
#devops#messaging#tooling

Bundle Analysis

React 🟡 Mid

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 build

Cas d'usage : Diagnostiquer pourquoi le bundle est trop gros et prioriser les optimisations de taille.

#performance#devtools

Bundle Analysis

Testing 🟡 Mid

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.

Anti-pattern : Ne jamais analyser le bundle et decouvrir en production que l'app fait 5Mo a cause d'un import inutile.
#build#performance#optimisation

Cache Invalidation

DevOps 🔴 Senior

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.

Anti-pattern : Pas d'invalidation : les utilisateurs voient des données périmées pendant des heures.
#devops#caching#interview

Cache-aside (Lazy Loading)

DevOps 🟡 Mid

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.

Anti-pattern : Pas de TTL : les données en cache deviennent stales indéfiniment.
#devops#caching#interview

CacheModule

NestJS 🟡 Mid

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.

Anti-pattern : Cacher des donnees sensibles ou mutables sans strategie d'invalidation.
#core

Call Stack

JavaScript 🟢 Junior

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 -> global

Cas d'usage : Lire les stack traces d'erreurs et comprendre les depassements de pile (stack overflow).

Anti-pattern : Recursion infinie sans condition d'arret qui provoque un Maximum call stack size exceeded.
#core#interview#debug

Callback Queue

JavaScript 🟡 Mid

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, macro

Cas d'usage : Planifier des taches non-urgentes qui ne doivent pas bloquer le rendu ou les promesses en cours.

#core#interview#async

Canary Deployment

DevOps 🔴 Senior

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: 10

Cas d'usage : Déploiements à haut risque sur des systèmes critiques avec observation progressive.

Anti-pattern : Canary sans monitoring : on envoie du trafic sans vérifier si ça fonctionne.
#devops#scaling#interview

Canary Test

Testing 🔴 Senior

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: 5

Cas d'usage : Pour deployer en production avec un filet de securite, en limitant l'impact d'un bug a 5% des utilisateurs.

Anti-pattern : Deployer le canary sans metriques ni alertes automatiques pour detecter les anomalies.
#testing#devops#deployment

CAP Theorem

DevOps 🔴 Senior

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é.

#devops#database#interview

Capabilities & Roles

WordPress 🟡 Mid

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.

Anti-pattern : Verifier is_admin() au lieu de current_user_can() pour proteger les actions.
#core#interview#security#wordpress

Capabilities Check

WordPress 🟡 Mid

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.

Anti-pattern : Verifier seulement is_admin() ou le role au lieu de la capability specifique.
#core#interview#security#wordpress

Cascade Layers

HTML / CSS 🔴 Senior

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é.

Anti-pattern : Utiliser !important pour résoudre des conflits de spécificité au lieu de structurer les couches.
#core#interview

CASL

NestJS 🔴 Senior

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/false

Cas d'usage : Gerer des permissions granulaires avec des conditions sur les champs des entites.

#security

CDN (Content Delivery Network)

DevOps 🟢 Junior

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.

Anti-pattern : CDN sans stratégie d'invalidation : les utilisateurs voient l'ancien contenu.
#devops#caching#interview

CDN (Content Delivery Network)

Advanced Ecosystem 🟢 Junior

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.

Anti-pattern : Cacher du contenu dynamique personnalisé sur le CDN sans stratégie de cache-key appropriée.
#performance#infrastructure

Chain of Responsibility

Architecture 🟡 Mid

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).

Anti-pattern : Chaine trop longue sans handler par defaut — la requete tombe dans le vide.
#architecture#interview#gof#behavioral

Changesets

Testing 🔴 Senior

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 npm

Cas d'usage : Pour les librairies et design systems en monorepo necessitant un versioning et changelog automatises.

Anti-pattern : Bumper les versions manuellement en oubliant des packages dependants, cassant les compatibilites.
#tooling#package#automatisation

Chaos Engineering

Testing 🔴 Senior

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 Mesh

Cas d'usage : Pour les systemes distribues critiques afin de decouvrir les failles de resilience avant qu'elles ne causent des incidents reels.

Anti-pattern : Faire du chaos engineering sans monitoring ni observabilite, rendant impossible l'analyse des resultats.
#testing#devops#senior

CHECK Constraint

PostgreSQL 🟢 Junior

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.

#sgbd#interview#database#postgresql

Cherry-Pick

DevOps 🟡 Mid

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 abc1234

Cas d'usage : Appliquer un hotfix de prod sur main sans merger toute la branche de release.

Anti-pattern : Cherry-pick systématique au lieu de merge : commits dupliqués et historique confus.
#devops#git

Child Theme

WordPress 🟢 Junior

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.

Anti-pattern : Modifier directement les fichiers du theme parent, perdant les changements a chaque mise a jour.
#core#interview#wordpress

Child Workflow

Advanced Ecosystem 🔴 Senior

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é.

#orchestration#architecture

Choreography vs Orchestration

Advanced Ecosystem 🔴 Senior

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 independently

Cas d'usage : Choisir orchestration pour les workflows critiques avec compensation, chorégraphie pour le découplage maximal.

Anti-pattern : Mélanger les deux approches sans stratégie claire, créant un système ni centralisé ni décentralisé.
#architecture#distributed#microservices

Chris Lattner

Personalities 🟡 Mid

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/macOS

Cas d'usage : LLVM est l'infrastructure de compilation la plus utilisee au monde. Swift est essentiel pour le dev iOS.

#personalities#history#interview

Circuit Breaker

Architecture 🟡 Mid

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.

Anti-pattern : Retry infini sans circuit breaker — le service defaillant est submerge.
#architecture#interview#resilience#microservices

Circuit Breaker

DevOps 🔴 Senior

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.

Anti-pattern : Pas de circuit breaker : un service lent bloque toutes les requêtes en cascade.
#devops#resilience#interview

Circular Dependencies

JavaScript 🔴 Senior

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.

Anti-pattern : Ignorer les circular dependencies : elles causent des undefined mysterieux et du code fragile.
#core#modules#debug

Circular Dependency

NestJS 🟡 Mid

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.

Anti-pattern : Accepter les dependances circulaires comme normales au lieu de repenser l'architecture.
#core#interview

clamp()

HTML / CSS 🟢 Junior

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.

Anti-pattern : Utiliser des valeurs vw pures sans clamp, créant du texte illisible sur écrans très petits ou très grands.
#core#interview

Class Composition

Tailwind CSS 🟢 Junior

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.

#styling#interview#tailwind

Claude Shannon

Personalities 🟡 Mid

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, telecom

Cas d'usage : Comprendre les bases de la compression de donnees, de la cryptographie et des telecommunications.

#personalities#history#interview

Clean Architecture

Architecture 🟡 Mid

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.

Anti-pattern : Domaine qui depend du framework ORM ou du framework HTTP.
#architecture#interview#architecture-style

ClientProxy

NestJS 🔴 Senior

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.

#architecture

Clipboard API

HTML / CSS 🟡 Mid

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.

#interview

Closure

JavaScript 🟡 Mid

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(); // 1

Cas d'usage : Encapsuler un etat prive dans un module ou creer des fonctions factory avec configuration injectee.

Anti-pattern : Creer des closures dans une boucle var sans IIFE : toutes les callbacks partagent la meme variable.
#core#interview#fondamental

clsx / cn()

Tailwind CSS 🟡 Mid

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 isActive

Cas d'usage : Gerer proprement les classes conditionnelles dans les composants React avec Tailwind.

#styling#interview#tailwind

Code Coverage

Testing 🟢 Junior

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%).

Anti-pattern : Viser 100% de coverage en ecrivant des tests sans assertions utiles juste pour couvrir les lignes.
#testing#interview#qualite

Code Review

Testing 🟢 Junior

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 coherent

Cas d'usage : Pour chaque changement de code afin de maintenir la qualite et partager les connaissances dans l'equipe.

Anti-pattern : Approuver les PR sans les lire ('LGTM') ou bloquer les PR avec des nitpicks stylistiques non-automatisables.
#qualite#collaboration#equipe

Code Splitting

React 🟡 Mid

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.

Anti-pattern : Splitter des composants minuscules, augmentant le nombre de requetes HTTP sans gain significatif.
#performance#interview

CODEOWNERS

Testing 🟡 Mid

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/leads

Cas d'usage : Dans les equipes moyennes/grandes pour garantir que les bons experts sont automatiquement assignes en review.

Anti-pattern : Mettre un seul owner sur tout le repo, creant un goulot d'etranglement sur une personne.
#qualite#git#collaboration

Codespaces

Testing 🟡 Mid

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 main

Cas d'usage : Pour les contributions open source ou les equipes distribuees voulant un setup zero-config.

Anti-pattern : Utiliser des Codespaces haute puissance (32 cores) pour du dev simple, gaspillant le budget cloud.
#dx#cloud#collaboration

Collection

MongoDB 🟢 Junior

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.

Anti-pattern : Mettre tous les documents dans une seule collection 'data' au lieu de separer par entite.
#sgbd#interview#database#mongodb

color-mix()

HTML / CSS 🟡 Mid

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.

#core#interview

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.

#styling#sass

Command

Architecture 🟡 Mid

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.

Anti-pattern : Mettre la logique metier dans le command handler au lieu du domaine.
#architecture#interview#gof#behavioral

Commitlint

Testing 🟡 Mid

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 stuff

Cas d'usage : Pour automatiser le changelog et le semantic versioning a partir de messages de commit structures.

Anti-pattern : Imposer des regles trop strictes qui poussent les devs a ecrire des messages generiques pour satisfaire le linter.
#qualite#git#automatisation

CommonJS vs ESM

JavaScript 🟡 Mid

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.

Anti-pattern : Melanger require() et import dans le meme fichier sans comprendre l'interoperabilite.
#core#modules#interview

Component Extraction

Tailwind CSS 🟡 Mid

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.

Anti-pattern : Extraire trop tot : attendre d'avoir 3+ repetitions avant de creer un composant.
#styling#interview#tailwind

Component Lifecycle

React 🟢 Junior

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 change

Cas d'usage : Gerer les effets de bord comme les abonnements, les appels API ou les timers.

Anti-pattern : Oublier la fonction de cleanup, causant des fuites memoire avec des abonnements non annules.
#core#interview#hooks

Compose / Pipe

JavaScript 🟡 Mid

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.

#core#fonctionnel#pattern

Composer

PHP 🟢 Junior

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.

Anti-pattern : Committer le dossier vendor/ ou ne pas versionner composer.lock.
#core#interview#tool

Composite

Architecture 🟡 Mid

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.

Anti-pattern : Traiter differemment feuilles et noeuds partout dans le code client.
#architecture#interview#gof#structural

Composite Layers

HTML / CSS 🔴 Senior

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).

Anti-pattern : Promouvoir trop d'éléments en couches composites, épuisant la mémoire GPU du mobile.
#performance

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.

Anti-pattern : Creer des hierarchies d'heritage profondes de 4+ niveaux pour partager du comportement.
#core#interview#oop#solid

Composition over Inheritance

Architecture 🟡 Mid

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.

Anti-pattern : Hierarchies d'heritage profondes (5+ niveaux) — fragiles et impossibles a comprendre.
#architecture#interview#principle

Compound Components

React 🟡 Mid

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.

Anti-pattern : Utiliser ce pattern pour des composants simples ou une prop suffirait.
#patterns#interview#design

Compound Index

MongoDB 🟡 Mid

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 ESR

Cas d'usage : Optimiser des requetes qui filtrent et trient sur plusieurs champs simultanement.

Anti-pattern : Inverser l'ordre des champs dans l'index par rapport aux requetes reelles.
#sgbd#interview#database#mongodb

Compression (gzip, Brotli)

Advanced Ecosystem 🟢 Junior

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).

Anti-pattern : Compresser des fichiers déjà compressés (images, vidéos, archives) gaspillant du CPU pour zéro gain.
#performance#networking

Concurrent Rendering

React 🔴 Senior

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).

Anti-pattern : Utiliser ReactDOM.render() legacy qui ne beneficie pas du rendu concurrent.
#core#interview#performance

Conditional Types (infer)

TypeScript 🔴 Senior

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>;          // number

Cas d'usage : Extraire des types imbriques (retour de Promise, elements de tableau, props de composants React).

Anti-pattern : Imbriquer trop de conditional types — le code devient illisible et les erreurs cryptiques.
#advanced#interview#type-system

ConfigMap

DevOps 🟡 Mid

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: info

Cas d'usage : Externaliser la configuration pour pouvoir la changer sans reconstruire l'image.

Anti-pattern : Stocker des mots de passe dans un ConfigMap au lieu d'un Secret.
#devops#kubernetes

ConfigModule

NestJS 🟡 Mid

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.

Anti-pattern : Acceder directement a process.env partout au lieu d'utiliser ConfigService.
#core#interview

Connection

Mongoose 🟢 Junior

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.

Anti-pattern : Creer une nouvelle connexion a chaque requete HTTP au lieu de reutiliser le pool.
#sgbd#interview#database#mongoose

Connection Pooling

NestJS 🔴 Senior

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.

Anti-pattern : Creer une nouvelle connexion a chaque requete sans pool, saturant la base de donnees.
#database#interview

Connection Pooling

DevOps 🟡 Mid

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.

Anti-pattern : Pool trop grand : sature la base. Pool trop petit : requêtes en attente.
#devops#database

const assertion (as const)

TypeScript 🟡 Mid

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.

Anti-pattern : Oublier as const sur des tableaux utilises comme union — ["a", "b"] donne string[] au lieu de readonly ["a", "b"].
#core#interview#best-practice

Constructor Promotion

PHP 🟢 Junior

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.

Anti-pattern : Declarer les proprietes en double : en attribut de classe ET dans le constructeur.
#core#interview#php8

ConstructorParameters<T>

TypeScript 🟡 Mid

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.

#utility-types#advanced

contain

HTML / CSS 🔴 Senior

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).

#performance

Container

Tailwind CSS 🟢 Junior

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.

#styling#interview#tailwind

Container Queries

HTML / CSS 🟡 Mid

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.

Anti-pattern : Utiliser des media queries pour adapter un composant qui peut être placé dans des conteneurs de tailles différentes.
#core#interview

Container Queries

Tailwind CSS 🔴 Senior

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.

#styling#interview#tailwind

Container/Presentational

React 🟢 Junior

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.

#patterns#interview

Containment

HTML / CSS 🔴 Senior

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.

#performance

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.

#styling#sass

Content Negotiation

Architecture 🟡 Mid

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.

Anti-pattern : Ignorer le header Accept et toujours renvoyer JSON — mauvaise experience pour les clients non-JSON.
#architecture#interview#api

Content Paths

Tailwind CSS 🟡 Mid

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.

Anti-pattern : Oublier d'inclure les fichiers d'une librairie tierce, causant des styles manquants en prod.
#styling#interview#tailwind

Content Security Policy (CSP)

Advanced Ecosystem 🟡 Mid

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).

Anti-pattern : Utiliser 'unsafe-inline' et 'unsafe-eval' dans script-src, annulant toute la protection CSP.
#security#web

content-visibility

HTML / CSS 🔴 Senior

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.

Anti-pattern : Ne pas spécifier contain-intrinsic-size, causant des sauts de scroll quand le contenu apparaît.
#performance#interview

Context API

React 🟡 Mid

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.

Anti-pattern : Stocker du state frequemment mis a jour dans Context sans le decouper, causant des re-rendus en cascade.
#state#interview#core

Context Mapping

Architecture 🔴 Senior

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 Layer

Cas d'usage : Visualiser et planifier les integrations entre sous-domaines d'un systeme complexe.

Anti-pattern : Integrer des contextes sans definir la relation — couplage implicite non gere.
#architecture#interview#ddd

Continue-as-New

Advanced Ecosystem 🔴 Senior

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.

#orchestration#performance

Contract Test

Testing 🔴 Senior

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.

Anti-pattern : Remplacer les contract tests par des tests E2E massifs qui couplent tous les services au deploiement.
#testing#microservices#senior

Controlled vs Uncontrolled

React 🟢 Junior

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 lire

Cas d'usage : Controlled pour validation en temps reel, uncontrolled pour formulaires simples ou performance critique.

Anti-pattern : Passer de controlled a uncontrolled (ou inversement) pendant la vie du composant.
#forms#interview#fundamentals

Controller

NestJS 🟢 Junior

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.

Anti-pattern : Mettre de la logique metier dans le controller au lieu de la deleguer au service.
#core#interview

Convention over Configuration

Architecture 🟡 Mid

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.

Anti-pattern : Trop de magie implicite rend le debug difficile quand la convention ne convient pas.
#architecture#interview#principle

Conventional Commits

DevOps 🟢 Junior

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 endpoints

Cas d'usage : Automatiser le versionnement et le changelog dans le pipeline CI/CD.

Anti-pattern : Messages comme 'fix stuff' ou 'wip' : impossible de générer un changelog utile.
#devops#cicd#interview

Core Web Vitals (LCP, INP, CLS)

Advanced Ecosystem 🟡 Mid

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.1

Cas d'usage : Monitorer et optimiser l'UX mesurable pour améliorer le SEO et la satisfaction utilisateur.

Anti-pattern : Optimiser uniquement Lighthouse en lab sans mesurer les Core Web Vitals en conditions réelles (RUM).
#performance#seo#ux

CORS

NestJS 🟢 Junior

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.

Anti-pattern : Configurer origin: '*' avec credentials: true, ce qui est interdit par les navigateurs et insecurise.
#security#interview

CORS (Cross-Origin Resource Sharing)

Architecture 🟡 Mid

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.

Anti-pattern : Access-Control-Allow-Origin: * avec credentials — interdit par les navigateurs et insecure.
#architecture#interview#api#security

CORS (Preflight)

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Mettre origin: '*' avec credentials: true, ce qui est interdit par les navigateurs et masque un problème de config.
#security#web#networking

Covariance / Contravariance

TypeScript 🔴 Senior

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 OK

Cas d'usage : Comprendre pourquoi certaines assignations generiques echouent et concevoir des APIs correctement typees.

#advanced#interview#type-system

Covering Index (INCLUDE)

PostgreSQL 🔴 Senior

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.

#sgbd#interview#database#postgresql

CQRS

Architecture 🔴 Senior

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.

Anti-pattern : Appliquer CQRS a un simple CRUD — complexite injustifiee.
#architecture#interview#architecture-style

CQS (Command Query Separation)

Architecture 🟡 Mid

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.

Anti-pattern : Methodes qui modifient l'etat et retournent des resultats — effets de bord caches.
#architecture#interview#principle

createAsyncThunk

React 🟡 Mid

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.

Anti-pattern : Ignorer le rejectWithValue et laisser les erreurs non gerees dans les extra reducers.
#state#async

createGlobalStyle

Styled-Components 🟡 Mid

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 App

Cas d'usage : Definir le CSS reset, les styles globaux du body et les custom properties CSS.

#styling#css-in-js

createSelector (RTK)

React 🟡 Mid

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 change

Cas d'usage : Derivation de donnees couteuses depuis le store Redux (filtrage, tri, aggregation).

Anti-pattern : Creer un nouveau selecteur a chaque rendu en l'instanciant dans le composant.
#state#performance

createTestingModule

NestJS 🟡 Mid

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.

Anti-pattern : Tester les services sans TestingModule, instanciant manuellement avec new et perdant la DI.
#testing#interview

createTheme (Vanilla Extract)

CSS-in-JS 🔴 Senior

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).

#styling#css-in-js

Critical CSS

HTML / CSS 🟡 Mid

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.

Anti-pattern : Inliner tout le CSS du site au lieu de seulement le CSS above-the-fold.
#performance#core#interview

Critical CSS Extraction

CSS-in-JS 🔴 Senior

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.

#styling#interview#css-in-js

Critical Path CSS

HTML / CSS 🟡 Mid

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.

#performance#interview

CSR (Client-Side Rendering)

React 🟢 Junior

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.

Anti-pattern : Utiliser CSR pour un site public qui a besoin de SEO (blog, e-commerce).
#rendering#interview#architecture

CSRF

NestJS 🟡 Mid

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 mutation

Cas d'usage : Proteger les applications avec sessions/cookies contre les requetes forgees.

Anti-pattern : Desactiver la protection CSRF sur les endpoints de mutation par facilite.
#security

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).

Anti-pattern : Proteger seulement la page de login et oublier les autres formulaires sensibles.
#core#interview#security

CSS Modules

HTML / CSS 🟡 Mid

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.

Anti-pattern : Utiliser des sélecteurs globaux dans un CSS Module, annulant le bénéfice du scoping.
#core#interview

CSS Nano

CSS-in-JS 🟢 Junior

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.

#styling#css-in-js

CSS Parts

HTML / CSS 🔴 Senior

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.

#interview

css Prop (Emotion)

CSS-in-JS 🟡 Mid

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.

#styling#css-in-js

CSS Variables Bridge

CSS-in-JS 🔴 Senior

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.

#styling#interview#css-in-js

CSS-in-JS

HTML / CSS 🟡 Mid

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.

Anti-pattern : Utiliser CSS-in-JS runtime (styled-components) dans une app SSR sans extraction statique, impactant les performances.
#interview

css`` Helper

Styled-Components 🟡 Mid

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.

#styling#css-in-js

CTE (WITH)

PostgreSQL 🟡 Mid

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.

#sgbd#interview#database#postgresql

CUBE CSS

HTML / CSS 🟡 Mid

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.

#interview

Currying

JavaScript 🟡 Mid

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); // 6

Cas d'usage : Configuration progressive de fonctions, creation de variantes specialisees, composition fonctionnelle.

#core#fonctionnel#pattern

Cursor

MongoDB 🟡 Mid

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.

Anti-pattern : Garder un curseur ouvert trop longtemps sans le fermer, epuisant les ressources serveur.
#sgbd#interview#database#mongodb

Custom Decorator

NestJS 🟡 Mid

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.

Anti-pattern : Acceder a request.user directement partout au lieu de creer un decorateur reutilisable.
#core#interview

Custom Elements

HTML / CSS 🔴 Senior

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.

Anti-pattern : Ne pas utiliser de tiret dans le nom du tag, ce qui viole la spec et échoue silencieusement.
#core#interview

Custom Hook

React 🟡 Mid

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).

Anti-pattern : Creer un custom hook pour encapsuler du code qui ne contient aucun hook : une simple fonction suffit.
#hooks#interview#patterns

Custom Plugins

Tailwind CSS 🔴 Senior

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.

#styling#tailwind

Custom Post Type

WordPress 🟡 Mid

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.

Anti-pattern : Creer des CPT pour des donnees qui devraient etre en base custom ou en taxonomie.
#core#interview#wordpress

Custom Properties

HTML / CSS 🟢 Junior

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.

Anti-pattern : Créer une variable CSS pour chaque valeur au lieu de se limiter aux tokens du design system.
#core#interview

Custom Providers

NestJS 🟡 Mid

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.

Anti-pattern : Acceder directement a process.env dans les services au lieu d'injecter la configuration.
#core#interview

Custom Taxonomy

WordPress 🟡 Mid

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.

Anti-pattern : Utiliser des meta fields pour ce qui devrait etre une taxonomie (filtrage et requete moins performants).
#core#interview#wordpress

Custom Validators

Mongoose 🟡 Mid

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.

#sgbd#interview#database#mongoose

CVA (Class Variance Authority)

CSS-in-JS 🟡 Mid

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.

#styling#interview#css-in-js

Cypress

Testing 🟡 Mid

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.

Anti-pattern : Ecrire des centaines de tests E2E Cypress au lieu de tests unitaires plus rapides et stables.
#testing#tooling#frontend

Cypress Component Testing

React 🟡 Mid

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.

#testing#e2e

DaemonSet

DevOps 🔴 Senior

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:latest

Cas d'usage : Déployer des agents de monitoring, collecte de logs ou réseau sur chaque noeud.

#devops#kubernetes

DaisyUI

Tailwind CSS 🟢 Junior

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.

#styling#tailwind

Dan Abramov

Personalities 🟡 Mid

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.

Anti-pattern : Mettre Redux partout : pour la majorite des apps, useReducer ou Zustand suffisent largement.
#personalities#history#interview

Dan Kaminsky

Personalities 🔴 Senior

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'histoire

Cas d'usage : Comprendre l'importance de la securite DNS et de la divulgation responsable des vulnerabilites.

#personalities#history#interview

Dario Amodei

Personalities 🔴 Senior

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'Anthropic

Cas d'usage : Comprendre les enjeux de securite de l'IA et l'importance de l'alignement des modeles de langage.

#personalities#history#interview

Dark Mode (dark:)

Tailwind CSS 🟢 Junior

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.

#styling#interview#tailwind

Dart Sass vs Node Sass

Sass 🟡 Mid

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 @use

Cas d'usage : Toujours utiliser Dart Sass (package npm 'sass') pour avoir acces a @use, @forward et les built-in modules.

Anti-pattern : Rester sur Node Sass qui ne supporte pas les modules (@use/@forward) ni les nouvelles fonctions.
#styling#sass

Data Attributes

HTML / CSS 🟢 Junior

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.

Anti-pattern : Stocker des données volumineuses ou sensibles dans les data-attributes visibles dans le code source.
#core#interview

Database

MongoDB 🟢 Junior

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.

#sgbd#interview#database#mongodb

Database Migration

DevOps 🟡 Mid

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:latest

Cas d'usage : Synchroniser le schéma de base entre tous les environnements de manière automatisée.

Anti-pattern : Modifier le schéma en prod à la main : impossible à reproduire et source d'erreurs.
#devops#database

DataLoader

NestJS 🔴 Senior

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.

Anti-pattern : Charger les relations une par une dans chaque resolver sans DataLoader.
#communication#interview

DataLoader

Architecture 🟡 Mid

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 query

Cas d'usage : Resolvers GraphQL qui chargent des entites liees pour eviter N+1 requetes.

Anti-pattern : Un SELECT par resolver sans batching — 100 items = 100 requetes DB.
#architecture#interview#api#performance

Dead Letter Queue

DevOps 🟡 Mid

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 DLQ

Cas d'usage : Ne pas perdre les messages critiques (paiements, commandes) malgré les erreurs.

Anti-pattern : Ignorer la DLQ : les messages s'accumulent sans jamais être traités.
#devops#messaging#resilience

Debounce

JavaScript 🟡 Mid

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.

Anti-pattern : Debounce avec un delai trop long qui rend l'interface non-reactive.
#core#performance#pattern#interview

Declaration Maps

TypeScript 🔴 Senior

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.

#tooling#monorepo

Declaration Merging

TypeScript 🔴 Senior

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.

Anti-pattern : Abuser du merging pour patcher des types au lieu de creer des extensions propres — difficulte de traçabilité.
#advanced#interview

Declarative Shadow DOM

HTML / CSS 🔴 Senior

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é.

#performance

Decorator

Architecture 🟡 Mid

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.

Anti-pattern : Empiler trop de decorateurs rendant le debug et la trace d'erreurs impossibles.
#architecture#interview#gof#structural

Decorator (legacy + stage 3)

TypeScript 🔴 Senior

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.

Anti-pattern : Mixer les decorateurs legacy et stage 3 dans le meme projet — incompatibilite et confusion.
#advanced#pattern#framework

Default Generic

TypeScript 🟡 Mid

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.

#generics#api-design

deleteMany

MongoDB 🟢 Junior

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.

Anti-pattern : Utiliser deleteMany({}) en production sans backup prealable.
#sgbd#interview#database#mongodb

deleteOne

MongoDB 🟢 Junior

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); // 1

Cas d'usage : Supprimer un document precis comme un compte utilisateur apres demande RGPD.

Anti-pattern : Appeler deleteOne avec un filtre vide, supprimant un document aleatoire.
#sgbd#interview#database#mongodb

Dennis Ritchie

Personalities 🟢 Junior

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'histoire

Cas d'usage : Comprendre les racines de la quasi-totalite des langages modernes et des systemes d'exploitation.

Anti-pattern : Penser que le C est obsolete : les kernels, drivers et systemes embarques en dependent toujours.
#personalities#history#interview

Denormalization

MongoDB 🟡 Mid

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.

Anti-pattern : Denormaliser des donnees qui changent souvent, creant des incoherences entre les copies.
#sgbd#interview#database#mongodb

Dependency Injection

NestJS 🟢 Junior

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.

Anti-pattern : Instancier les dependances avec new directement dans la classe au lieu de les injecter.
#core#interview#architecture

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).

Anti-pattern : new StripePayment() directement dans le service au lieu d'injecter via l'interface.
#core#interview#solid

Dependency Inversion Principle

Architecture 🟡 Mid

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 FileLogger

Cas d'usage : Rendre le code testable en injectant des mocks et decoupler les couches.

Anti-pattern : import direct de l'implementation concrete dans le module de haut niveau.
#architecture#interview#principle

Deployment

DevOps 🟡 Mid

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.0

Cas d'usage : Déployer des applications stateless avec rolling updates et rollback automatique.

Anti-pattern : Modifier les Pods manuellement au lieu de mettre à jour le Deployment.
#devops#kubernetes#interview

Design Tokens

CSS-in-JS 🟡 Mid

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.

#styling#interview#css-in-js

Destructuring

JavaScript 🟢 Junior

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.

Anti-pattern : Destructurer trop profondement en une ligne, rendant le code illisible.
#core#ES6#syntaxe

Dev Containers

Testing 🟡 Mid

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.

Anti-pattern : Definir un devcontainer trop lourd (IDE complet + tous les services) qui met 10 minutes a demarrer.
#dx#tooling#onboarding

DHH (David Heinemeier Hansson)

Personalities 🟡 Mid

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
end

Cas d'usage : Rails a influence tous les frameworks MVC (Laravel, Django, NestJS). Ses conventions sont devenues des standards.

Anti-pattern : Suivre aveuglement ses opinions controversees (anti-TypeScript, anti-microservices) sans comprendre son contexte.
#personalities#history#interview

DI Container

PHP 🟡 Mid

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 automatiquement

Cas d'usage : Pour eliminer les new manuels et centraliser la configuration des services.

Anti-pattern : Injecter le container lui-meme dans les services (anti-pattern Service Locator).
#core#interview#architecture

Dialog Element

HTML / CSS 🟡 Mid

É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.

Anti-pattern : Recréer une modale avec des div et du JS custom quand <dialog> est supporté partout.
#core#interview

direnv

Testing 🟡 Mid

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 .envrc

Cas d'usage : Pour gerer automatiquement les variables d'environnement par projet sans .env global.

Anti-pattern : Commiter des .envrc avec des vrais secrets au lieu de .envrc.example avec des placeholders.
#dx#tooling#securite

Discriminated Union

TypeScript 🟡 Mid

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.

Anti-pattern : Utiliser des booleens multiples (isLoading, hasError) au lieu d'une union discriminee — etats impossibles deviennent possibles.
#core#interview#pattern

Discriminators

Mongoose 🔴 Senior

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.

#sgbd#interview#database#mongoose

Distributed Tracing

DevOps 🔴 Senior

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.

Anti-pattern : Pas de trace ID propagé : impossible de corréler les logs entre services.
#devops#monitoring#interview

Distributive Conditional Types

TypeScript 🔴 Senior

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).

Anti-pattern : Ne pas comprendre la distribution et obtenir des resultats inattendus — utiliser [T] extends [U] pour la desactiver.
#advanced#type-system

Distroless

DevOps 🔴 Senior

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.

Anti-pattern : Utiliser distroless en dev : impossible de debugger sans shell.
#devops#docker#sécurité

Docker Compose

DevOps 🟢 Junior

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.

Anti-pattern : Utiliser Compose en production sans orchestrateur : pas de haute disponibilité.
#devops#docker#interview

Docker Container

DevOps 🟢 Junior

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 api

Cas d'usage : Exécuter des applications isolées avec des dépendances propres sans conflits système.

Anti-pattern : Lancer des conteneurs en root sans restreindre les capabilities.
#devops#docker#interview

Docker Image

DevOps 🟢 Junior

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.

Anti-pattern : Utiliser latest en prod : impossible de savoir quelle version tourne réellement.
#devops#docker#interview

Docker Network

DevOps 🟡 Mid

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 nom

Cas d'usage : Isoler les communications entre services tout en permettant la découverte par nom DNS.

#devops#docker

Docker Registry

DevOps 🟡 Mid

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.0

Cas d'usage : Stocker les images de manière centralisée pour que le CI/CD et tous les environnements y accèdent.

Anti-pattern : Pousser des images contenant des secrets ou des credentials.
#devops#docker

Docker Scout

DevOps 🟡 Mid

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.0

Cas d'usage : Intégrer le scan de vulnérabilités dans le pipeline CI pour bloquer les images dangereuses.

#devops#docker#sécurité

Docker Volume

DevOps 🟢 Junior

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-app

Cas d'usage : Persister les données de bases de données entre les redémarrages de conteneurs.

Anti-pattern : Stocker des données critiques dans le layer du conteneur : perdues au docker rm.
#devops#docker

Dockerfile

DevOps 🟢 Junior

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.

Anti-pattern : COPY . . avant npm install : invalide le cache à chaque changement de code.
#devops#docker#interview

Document

MongoDB 🟢 Junior

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.

Anti-pattern : Creer des documents de plus de 16 Mo au lieu de splitter les donnees volumineuses dans GridFS.
#sgbd#interview#database#mongodb

Document vs Query Middleware

Mongoose 🔴 Senior

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.

#sgbd#interview#database#mongoose

Domain Event

Architecture 🟡 Mid

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.

Anti-pattern : Events nommes comme des commandes (CreateInvoice au lieu de OrderPlaced).
#architecture#interview#ddd

Domain Service

Architecture 🟡 Mid

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.

Anti-pattern : Domain service anemique qui ne fait que deleguer au repository — logique metier absente.
#architecture#interview#ddd

Donald Knuth

Personalities 🟡 Mid

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 academique

Cas d'usage : Reference incontournable pour l'analyse d'algorithmes et la rigueur en programmation.

Anti-pattern : Le citer sans l'avoir lu : 'Premature optimization is the root of all evil' est souvent sorti de son contexte.
#personalities#history#interview

dotfiles

Testing 🟡 Mid

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 > Dotfiles

Cas d'usage : Pour reproduire son environnement de dev sur un nouveau poste ou dans un Codespace en quelques secondes.

Anti-pattern : Stocker des secrets (tokens, cles SSH) dans les dotfiles publics au lieu d'un gestionnaire de secrets.
#dx#configuration#onboarding

Douglas Crockford

Personalities 🟡 Mid

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 monde

Cas d'usage : JSON est partout : APIs REST, fichiers de config, bases NoSQL. Comprendre son origine est fondamental.

Anti-pattern : Croire que JSON supporte les commentaires ou les trailing commas — c'est volontairement minimaliste.
#personalities#history#interview

Drag & Drop

HTML / CSS 🟡 Mid

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.

Anti-pattern : Oublier e.preventDefault() dans ondragover, ce qui empêche le drop de fonctionner.
#interview

DRY (Don't Repeat Yourself)

Architecture 🟢 Junior

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, import

Cas d'usage : Centraliser les regles metier, validations et transformations pour eviter les incoherences.

Anti-pattern : DRY premature : abstraire du code qui se ressemble mais n'a pas la meme raison de changer.
#architecture#interview#principle

Dynamic Import

JavaScript 🟡 Mid

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.

#core#performance#modules

Dynamic Module

NestJS 🟡 Mid

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.

Anti-pattern : Hardcoder la configuration directement dans le module au lieu de la rendre injectable.
#core#architecture#interview

E2E supertest

NestJS 🟡 Mid

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.

Anti-pattern : Ne tester que les services unitairement sans jamais verifier le pipeline HTTP complet.
#testing#interview

E2E Test

Testing 🟡 Mid

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.

Anti-pattern : Ecrire trop de tests E2E : ils sont lents et fragiles. Reserver aux flux critiques uniquement.
#testing#interview#frontend

Edge Computing

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Mettre de la logique avec état ou des requêtes DB distantes sur l'edge, annulant le gain de latence.
#performance#infrastructure#architecture

EditorConfig

Testing 🟢 Junior

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 = true

Cas d'usage : Pour garantir des bases communes (tabs vs spaces, LF vs CRLF) dans une equipe avec differents editeurs.

Anti-pattern : Ne pas avoir d'EditorConfig dans un projet multi-editeurs, causant des diffs inutiles (LF vs CRLF).
#qualite#tooling#dx

Edsger Dijkstra

Personalities 🟡 Mid

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).

Anti-pattern : Oublier que Dijkstra ne fonctionne pas avec des poids negatifs — utiliser Bellman-Ford dans ce cas.
#personalities#history#interview

Elasticsearch

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Utiliser Elasticsearch comme base de données primaire au lieu d'un complément de recherche.
#search#performance#backend

ELK Stack

DevOps 🟡 Mid

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-1h

Cas d'usage : Centraliser les logs de tous les services pour le debugging et l'audit.

Anti-pattern : Stocker tous les logs en debug en prod : coût de stockage explosif.
#devops#monitoring#tooling

Email Templates (MJML / React Email)

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Coder des emails en HTML/CSS classique, obtenant un rendu cassé sur la moitié des clients email.
#communication#frontend

Embedding vs Referencing

MongoDB 🟡 Mid

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.

Anti-pattern : Embarquer des tableaux qui grandissent indefiniment, depassant la limite de 16 Mo par document.
#sgbd#interview#database#mongodb

Emotion (@emotion/react)

CSS-in-JS 🟡 Mid

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.

#styling#interview#css-in-js

Encapsulation

PHP 🟢 Junior

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.

Anti-pattern : Mettre toutes les proprietes en public et les modifier directement depuis l'exterieur.
#core#interview#oop

Entity (DDD)

Architecture 🟡 Mid

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.

Anti-pattern : Comparer des entites par valeur au lieu de par identite.
#architecture#interview#ddd

EntityAdapter (RTK)

React 🟡 Mid

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.

#state#patterns

Enum

PHP 🟡 Mid

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.

Anti-pattern : Continuer a utiliser des constantes string ou int la ou un enum serait plus sur et expressif.
#core#interview#php8

Enum Type

PostgreSQL 🟢 Junior

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.

Anti-pattern : Creer un enum pour des valeurs qui changent souvent, car ajouter/supprimer des valeurs est lourd.
#sgbd#interview#database#postgresql

Enum vs const Enum vs Union

TypeScript 🟡 Mid

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 runtime

Cas d'usage : Preferer les unions de litteraux pour la legerete. Enum pour l'iteration. Const enum pour la performance (avec precaution).

Anti-pattern : Utiliser des enums numeriques sans valeur explicite — l'ajout d'un membre casse les valeurs persistees.
#core#interview#best-practice

Eric Evans

Personalities 🟡 Mid

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 differents

Cas d'usage : DDD est essentiel pour les architectures microservices et les systemes complexes. Sujet courant en entretien senior.

#personalities#history#interview

Eric Meyer

Personalities 🟡 Mid

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.

#personalities#history#interview

Eric S. Raymond

Personalities 🔴 Senior

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 source

Cas d'usage : Comprendre la philosophie open source et pourquoi les entreprises adoptent ce modele de developpement.

#personalities#history#interview

Error Boundary

React 🟡 Mid

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.

Anti-pattern : Ne pas logger l'erreur dans componentDidCatch, perdant des informations precieuses en production.
#core#interview#resilience

Error Types

JavaScript 🟢 Junior

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.

Anti-pattern : throw 'string' au lieu de throw new Error('string') : pas de stack trace.
#core#fondamental#best-practice

esbuild

Testing 🟡 Mid

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.

Anti-pattern : Utiliser esbuild seul pour des apps complexes necessitant du code-splitting avance ou du CSS modules.
#build#tooling#performance

esc_html / esc_attr / esc_url

WordPress 🟢 Junior

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.

Anti-pattern : Utiliser esc_html dans un attribut href (ne protege pas contre javascript: URLs).
#core#interview#security#wordpress

ESLint

Testing 🟢 Junior

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.

Anti-pattern : Desactiver les regles ESLint avec des commentaires // eslint-disable partout au lieu de corriger le code.
#qualite#tooling#dx

ETag / If-None-Match

Architecture 🟡 Mid

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.

Anti-pattern : Generer un ETag couteux (hash de tout le body) sur chaque requete — annule le gain.
#architecture#interview#api#performance

Evan You

Personalities 🟢 Junior

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.

#personalities#history#interview

Event Bubbling / Capturing

JavaScript 🟡 Mid

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).

#core#DOM

Event Bus

Architecture 🟡 Mid

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.

Anti-pattern : Event bus global sans typage — impossible de tracer quels events existent.
#architecture#interview#messaging

Event Delegation

JavaScript 🟢 Junior

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.

Anti-pattern : Attacher un listener a chaque element d'une liste de 1000 items au lieu de deleguer au parent.
#core#DOM#performance#interview

Event Emitter Pattern

JavaScript 🟡 Mid

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.

Anti-pattern : Ne jamais off() les listeners, causant des memory leaks et des callbacks zombies.
#core#pattern#architecture

Event Loop

JavaScript 🟡 Mid

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, 2

Cas d'usage : Comprendre l'ordre d'execution du code asynchrone et debugger les problemes de timing.

Anti-pattern : Croire que setTimeout(fn, 0) s'execute immediatement apres le code synchrone (les microtasks passent avant).
#core#interview#performance#fondamental

Event Sourcing

Architecture 🔴 Senior

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); // 70

Cas d'usage : Audit trail complet, systemes financiers, undo/redo, debug temporel.

Anti-pattern : Evenements mutables ou supprimes — on perd la propriete d'immutabilite.
#architecture#interview#architecture-style

Event-Driven Architecture

Architecture 🟡 Mid

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.

Anti-pattern : Event soup : trop d'evenements sans schema clair rendent le systeme impossible a debugger.
#architecture#interview#architecture-style

EventEmitterModule

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser des appels directs entre services pour des side-effects au lieu d'evenements.
#core#architecture

Eventual Consistency

DevOps 🔴 Senior

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.

#devops#database#interview

Exception Filter

NestJS 🟡 Mid

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.

Anti-pattern : Entourer chaque handler de try/catch au lieu d'utiliser un filtre d'exception global.
#core#interview

Exclude<T, U>

TypeScript 🟡 Mid

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).

#core#interview#utility-types

Execution Context

JavaScript 🔴 Senior

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.

#core#interview#avance

Exhaustive Check (never)

TypeScript 🟡 Mid

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.

Anti-pattern : Mettre un default generique qui ignore les nouveaux cas — les bugs passent en silence.
#core#interview#safety

EXPLAIN / EXPLAIN ANALYZE

PostgreSQL 🟡 Mid

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.

Anti-pattern : Utiliser EXPLAIN ANALYZE sur une requete DELETE ou UPDATE sans transaction, les donnees sont reellement modifiees.
#sgbd#interview#database#postgresql

explain()

MongoDB 🟡 Mid

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 totalKeysExamined

Cas d'usage : Diagnostiquer les requetes lentes et verifier que les index sont correctement utilises.

Anti-pattern : Deployer en prod sans jamais verifier les plans d'execution des requetes critiques.
#sgbd#interview#database#mongodb

Explicit Resource Management (using)

JavaScript 🔴 Senior

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 automatiquement

Cas d'usage : Gestion de connexions DB, handles fichier, locks, tout ce qui necessite un cleanup garanti.

#core#avance#ES2024

Expression Index

PostgreSQL 🟡 Mid

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.

#sgbd#interview#database#postgresql

Extending Styles

Styled-Components 🟢 Junior

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.

#styling#css-in-js

Extract<T, U>

TypeScript 🟡 Mid

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 | number

Cas d'usage : Extraire les types specifiques d'une large union pour un traitement specialise.

#core#utility-types

Facade

Architecture 🟢 Junior

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.

Anti-pattern : Transformer la facade en God Object qui fait tout au lieu de deleguer.
#architecture#interview#gof#structural

Factory (Test)

Testing 🟡 Mid

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.

Anti-pattern : Creer des factories trop complexes avec trop de logique conditionnelle, devenant elles-memes source de bugs.
#testing#pattern#data

Factory Method

PHP 🟡 Mid

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.

Anti-pattern : Creer des factories pour des objets simples qui n'ont pas de logique de creation.
#core#interview#pattern

Factory Method

Architecture 🟢 Junior

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.

Anti-pattern : Mettre toute la logique de creation dans le constructeur au lieu de la deleguer.
#architecture#interview#gof#creational

Fail Fast

Architecture 🟢 Junior

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.

Anti-pattern : Avaler les erreurs silencieusement avec un catch vide ou retourner des valeurs par defaut.
#architecture#interview#principle

Fast Refresh

Testing 🟢 Junior

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.

Anti-pattern : Mixer des exports de composants et de fonctions utilitaires dans un meme fichier, cassant Fast Refresh.
#dx#react#frontend

FCP (First Contentful Paint)

Advanced Ecosystem 🟡 Mid

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).

#performance#frontend

Feature Flag

DevOps 🟡 Mid

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.

Anti-pattern : Flags jamais nettoyés : le code se remplit de conditions mortes.
#devops#scaling#interview

Fei-Fei Li

Personalities 🔴 Senior

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 dataset

Cas d'usage : Comprendre l'importance des donnees en IA : sans bon dataset, pas de bon modele.

#personalities#history#interview

Fetch API

JavaScript 🟢 Junior

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.

Anti-pattern : Oublier de verifier res.ok : fetch ne rejette PAS sur les erreurs HTTP (404, 500, etc.).
#core#async#navigateur#fondamental

Fetchpriority

HTML / CSS 🟡 Mid

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.

#performance#interview

Fibers

PHP 🔴 Senior

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.

Anti-pattern : Utiliser les Fibers directement en application au lieu de passer par un framework async.
#advanced#php8

Field-Level Encryption

MongoDB 🔴 Senior

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.

#sgbd#interview#database#mongodb#security

Filter Hook

WordPress 🟢 Junior

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.

Anti-pattern : Oublier de retourner la valeur dans un filtre, ce qui retourne null et casse l'affichage.
#core#interview#wordpress

FinalizationRegistry

JavaScript 🔴 Senior

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 GC

Cas d'usage : Liberation de ressources externes (handles fichier, connexions) quand l'objet JS associe est GC.

Anti-pattern : Se baser sur FinalizationRegistry pour une logique critique : le callback peut ne jamais etre appele.
#core#avance#ES2021

find

MongoDB 🟢 Junior

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.

Anti-pattern : Appeler toArray() sur une collection de millions de documents sans limit, saturant la memoire.
#sgbd#interview#database#mongodb

findOne

MongoDB 🟢 Junior

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.

#sgbd#interview#database#mongodb

Finite State Machine

Advanced Ecosystem 🟡 Mid

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).

#architecture#computer-science

Fireship (Jeff Delaney)

Personalities 🟢 Junior

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 signature

Cas d'usage : Ses videos sont ideales pour decouvrir rapidement une techno avant de plonger dans la doc officielle.

#personalities#history#interview

Fixture

Testing 🟢 Junior

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.

Anti-pattern : Partager des fixtures mutables entre tests, creant des dependances et de l'ordre d'execution.
#testing#fondamental#data

Flaky Test

Testing 🟡 Mid

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.

Anti-pattern : Re-run automatique des flaky tests au lieu de les corriger, masquant des vrais problemes.
#testing#qualite#ci

Flex Utilities

Tailwind CSS 🟢 Junior

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.

#styling#interview#tailwind

Flexbox

HTML / CSS 🟢 Junior

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.

Anti-pattern : Utiliser Flexbox pour un layout 2D complet (lignes ET colonnes) au lieu de Grid.
#core#interview

Flowbite

Tailwind CSS 🟢 Junior

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.

#styling#tailwind

Fluid Spacing

HTML / CSS 🟡 Mid

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.

#core

Fluid Typography

HTML / CSS 🟡 Mid

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.

#core#interview

Flyweight

Architecture 🔴 Senior

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).

Anti-pattern : Creer une nouvelle instance pour chaque element alors que 90% de l'etat est identique.
#architecture#interview#gof#structural#performance

fnm

Testing 🟢 Junior

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.

Anti-pattern : Installer fnm ET nvm sur la meme machine, causant des conflits de PATH et de versions.
#dx#tooling#node

Font Optimization

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Charger Google Fonts en bloquant le rendu ou importer toutes les graisses d'une police.
#performance#frontend

Font Utilities

Tailwind CSS 🟢 Junior

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.

#styling#tailwind

for...of vs for...in

JavaScript 🟢 Junior

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, y

Cas d'usage : for...of pour les tableaux et iterables, for...in pour les proprietes d'objets (avec hasOwnProperty).

Anti-pattern : Utiliser for...in sur un tableau : parcourt aussi les proprietes du prototype et les index sont des strings.
#core#fondamental#interview

FOREIGN KEY

PostgreSQL 🟢 Junior

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.

Anti-pattern : Omettre les foreign keys pour 'gagner en perf', puis se retrouver avec des donnees orphelines.
#sgbd#interview#database#postgresql

forwardRef

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser forwardRef comme solution par defaut au lieu de repenser l'architecture pour eliminer les cycles.
#core#interview

Fragment

React 🟢 Junior

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.

#core#syntax

Full Site Editing (FSE)

WordPress 🔴 Senior

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.

Anti-pattern : Mixer FSE et templates PHP classiques sans strategie claire, creant de la confusion.
#core#wordpress

Functions

Sass 🟡 Mid

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); }  // => 1rem

Cas d'usage : Creer des conversions (px->rem), calculs de grille, ou manipulations de couleurs reutilisables.

#styling#interview#sass

Garbage Collection

JavaScript 🟡 Mid

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.

#core#performance#engine

Generator

JavaScript 🟡 Mid

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.

#core#ES6#avance

Generic Constraint (extends)

TypeScript 🟡 Mid

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 length

Cas d'usage : Garantir qu'un generique possede les proprietes necessaires avant de les utiliser.

Anti-pattern : Contraindre trop largement (extends object) ou pas assez — soit trop restrictif, soit pas assez sur.
#core#interview#generics

Generic Function

TypeScript 🟡 Mid

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"]); // string

Cas d'usage : Creer des fonctions utilitaires (map, filter, fetch wrapper) qui preservent les types d'entree/sortie.

Anti-pattern : Utiliser any au lieu de generics — on perd completement la securite de type en sortie.
#core#interview#generics

Generic Inference

TypeScript 🟡 Mid

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 string

Cas d'usage : Concevoir des APIs generiques ergonomiques ou l'utilisateur n'a pas a specifier les types manuellement.

#generics#core

Geoffrey Hinton

Personalities 🟡 Mid

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 possibles

Cas d'usage : Comprendre les fondations du deep learning et pourquoi l'IA a explose apres 2012 (AlexNet).

#personalities#history#interview

Geospatial Index

MongoDB 🔴 Senior

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.

#sgbd#interview#database#mongodb

GIN Index

PostgreSQL 🔴 Senior

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.

#sgbd#interview#database#postgresql

GiST Index

PostgreSQL 🔴 Senior

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).

#sgbd#interview#database#postgresql

Git Bisect

DevOps 🟡 Mid

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 reset

Cas d'usage : Trouver en quelques minutes parmi 1000 commits lequel a introduit une régression.

#devops#git#interview

Git Hooks

DevOps 🟡 Mid

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:unit

Cas d'usage : Bloquer les commits qui ne passent pas le lint ou les tests unitaires.

Anti-pattern : Hooks trop lents (>10s) : les devs les désactivent avec --no-verify.
#devops#git

Git LFS

DevOps 🟡 Mid

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.

Anti-pattern : Commiter des fichiers de +100 Mo sans LFS : clone extrêmement lent pour toute l'équipe.
#devops#git

Git Reflog

DevOps 🟡 Mid

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 perdu

Cas d'usage : Récupérer un commit perdu après un rebase raté ou un reset --hard accidentel.

#devops#git#interview

Git Stash

DevOps 🟢 Junior

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 pop

Cas d'usage : Sauvegarder rapidement du travail en cours pour traiter une urgence sur une autre branche.

Anti-pattern : Empiler des dizaines de stash sans nom : impossible de retrouver lequel est lequel.
#devops#git

GitHub Actions

DevOps 🟡 Mid

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 test

Cas d'usage : CI/CD natif pour les projets hébergés sur GitHub, gratuit pour l'open source.

Anti-pattern : Hardcoder des secrets dans le YAML au lieu d'utiliser GitHub Secrets.
#devops#cicd#tooling

GitLab CI

DevOps 🟡 Mid

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.

#devops#cicd#tooling

Given-When-Then

Testing 🟢 Junior

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.

Anti-pattern : Ecrire des Given-When-Then trop techniques qui perdent l'interet de la lisibilite metier.
#testing#agile#bdd

Global Augmentation

TypeScript 🔴 Senior

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.

Anti-pattern : Polluer le scope global au lieu d'utiliser des imports — retour aux problemes pre-modules.
#advanced#tooling

Global Module

NestJS 🟢 Junior

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.

Anti-pattern : Rendre tous les modules globaux, ce qui detruit l'encapsulation et rend les dependances implicites.
#core#architecture

Grace Hopper

Personalities 🟢 Junior

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.

Anti-pattern : Croire que COBOL est mort : il traite encore 95% des transactions bancaires mondiales.
#personalities#history#interview

Graceful Degradation

DevOps 🔴 Senior

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.

#devops#resilience#interview

GraphQL

Architecture 🟡 Mid

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.

Anti-pattern : Probleme N+1 : chaque field declenche une requete DB sans DataLoader.
#architecture#interview#api

GraphQL @Subscription

NestJS 🔴 Senior

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.

#communication

GraphQL Resolver

NestJS 🟡 Mid

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.

Anti-pattern : Mettre de la logique metier dans le resolver au lieu de la deleguer au service.
#communication#interview

Graydon Hoare

Personalities 🔴 Senior

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 segfault

Cas d'usage : Rust est adopte pour les outils de dev (SWC, Turbopack, Biome), les navigateurs et les systemes critiques.

#personalities#history#interview

Grid

HTML / CSS 🟡 Mid

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.

Anti-pattern : Utiliser des floats ou des marges négatives pour un layout qui serait trivial en Grid.
#core#interview

Grid Utilities

Tailwind CSS 🟢 Junior

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.

#styling#interview#tailwind

Griffel

CSS-in-JS 🔴 Senior

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.

#styling#css-in-js

Group / Peer Modifiers

Tailwind CSS 🟡 Mid

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.

#styling#interview#tailwind

gRPC

NestJS 🔴 Senior

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.

Anti-pattern : Utiliser gRPC pour une API publique consommee par des navigateurs au lieu de REST/GraphQL.
#communication#architecture

gRPC

Architecture 🟡 Mid

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.

Anti-pattern : Utiliser gRPC pour des APIs publiques consommees par des navigateurs — REST/GraphQL est plus adapte.
#architecture#interview#api

Guard

NestJS 🟡 Mid

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.

Anti-pattern : Verifier l'authentification dans chaque controller au lieu d'utiliser un guard reutilisable.
#core#security#interview

Guido van Rossum

Personalities 🟢 Junior

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 Python

Cas d'usage : Python domine en data science, IA, scripting et enseignement. Langage incontournable a connaitre.

Anti-pattern : Croire que Python est 'juste pour les debutants' : il propulse Instagram, YouTube et la majorite des projets IA.
#personalities#history#interview

Guillermo Rauch

Personalities 🟡 Mid

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 Router

Cas d'usage : Next.js est le framework React le plus populaire. Vercel est la reference du deploiement front-end.

#personalities#history#interview

Gutenberg Block

WordPress 🟡 Mid

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.

Anti-pattern : Creer des blocs complexes sans block.json ni support server-side rendering.
#core#interview#wordpress

Hakon Wium Lie

Personalities 🟡 Mid

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.

#personalities#history#interview

HATEOAS

Architecture 🔴 Senior

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.

Anti-pattern : Client qui hardcode toutes les URLs au lieu de suivre les liens — fragile au changement.
#architecture#interview#api

Headless Components

React 🔴 Senior

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.

#patterns#design-system#a11y

Headless UI

Tailwind CSS 🟡 Mid

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.

#styling#tailwind

Health Check

DevOps 🟢 Junior

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.

Anti-pattern : Health check qui retourne toujours 200 sans vérifier les dépendances.
#devops#resilience

Helm Chart

DevOps 🟡 Mid

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 staging

Cas d'usage : Standardiser et versionner les déploiements Kubernetes avec des valeurs par environnement.

Anti-pattern : Des dizaines de fichiers YAML dupliqués sans templating entre les environnements.
#devops#kubernetes#tooling

Helmet

NestJS 🟢 Junior

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.

Anti-pattern : Deployer en production sans Helmet, laissant les headers de securite absents.
#security#interview

Helmet.js

Advanced Ecosystem 🟢 Junior

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.

Anti-pattern : Désactiver tous les modules Helmet pour résoudre un bug au lieu de configurer finement.
#security#tool#web

Heritage

PHP 🟢 Junior

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).

Anti-pattern : Heriter pour reutiliser du code sans relation logique (God Object avec 5 niveaux d'heritage).
#core#interview#oop

Hermetic Tests

Testing 🔴 Senior

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 sort

Cas d'usage : Pour les tests en CI/CD qui doivent fonctionner identiquement sur n'importe quelle machine sans acces reseau.

Anti-pattern : Appeler de vraies API tierces dans les tests, les rendant dependants de la disponibilite externe.
#testing#principle#senior

Hexagonal Architecture

Architecture 🟡 Mid

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.

Anti-pattern : Le domaine qui importe directement mongoose ou prisma — violation du port.
#architecture#interview#architecture-style

HMR (Hot Module Replacement)

Testing 🟢 Junior

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-box

Cas d'usage : Pendant le developpement pour voir instantanement les changements sans perdre l'etat de l'app (formulaires, navigation).

Anti-pattern : Desactiver HMR et recharger la page manuellement, perdant du temps et de l'etat a chaque modification.
#dx#tooling#frontend

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.

Anti-pattern : Empiler trop de HOCs, creant un 'wrapper hell' et rendant le debugging difficile.
#patterns#interview

Hoisting

JavaScript 🟢 Junior

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.

Anti-pattern : Utiliser var et compter sur le hoisting au lieu de declarer les variables en haut du scope.
#core#interview#fondamental

Hollywood Principle

Architecture 🟡 Mid

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 matche

Cas d'usage : Fondement de l'Inversion of Control dans les frameworks et le pattern Template Method.

Anti-pattern : Code applicatif qui poll le framework au lieu d'etre appele par lui.
#architecture#interview#principle

Hook System

WordPress 🟢 Junior

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.

Anti-pattern : Modifier directement les fichiers core de WordPress au lieu d'utiliser les hooks.
#core#interview#wordpress

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=10

Cas d'usage : Horizontal scaling pour les apps stateless derrière un load balancer.

Anti-pattern : State en mémoire locale : impossible de scaler horizontalement.
#devops#scaling#interview

HPA (Horizontal Pod Autoscaler)

DevOps 🔴 Senior

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.

Anti-pattern : Configurer le HPA sans resource requests sur les Pods : métriques faussées.
#devops#kubernetes#interview

HTML Template

HTML / CSS 🟡 Mid

É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.

#core

HTTP/2

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Continuer à bundler tous les JS en un seul fichier sous HTTP/2, perdant l'avantage du cache granulaire.
#performance#networking

HTTP/3 QUIC

Advanced Ecosystem 🔴 Senior

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.

#performance#networking

HTTPS / TLS

Advanced Ecosystem 🟢 Junior

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.

Anti-pattern : Accepter du contenu mixte HTTP/HTTPS ou désactiver la vérification des certificats en production.
#security#networking

Husky

DevOps 🟢 Junior

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-staged

Cas d'usage : Garantir que tous les membres de l'équipe exécutent les mêmes vérifications avant chaque commit.

#devops#git#tooling

Husky + lint-staged

Testing 🟡 Mid

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-staged

Cas d'usage : Pour bloquer automatiquement les commits contenant des erreurs de lint ou de formatage.

Anti-pattern : Executer le lint sur tout le projet au lieu des fichiers stages, rendant le hook pre-commit trop lent.
#qualite#tooling#git

Hybrid Application

NestJS 🔴 Senior

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.

#architecture

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.

Anti-pattern : Action: "*" Resource: "*" : accès admin total, violation du least privilege.
#devops#cloud#sécurité#interview

Ian Goodfellow

Personalities 🔴 Senior

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 realistes

Cas d'usage : Les GANs sont a la base de la generation d'images IA (deepfakes, art generation, data augmentation).

#personalities#history#interview

Ian Hickson

Personalities 🔴 Senior

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.

#personalities#history#interview

Idempotency

Architecture 🟡 Mid

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.

Anti-pattern : POST qui cree un doublon a chaque retry — facturations multiples en production.
#architecture#interview#api#best-practice

Idempotent Consumer

DevOps 🔴 Senior

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é.

Anti-pattern : Pas de clé d'idempotence : un retry crée un doublon (double facturation).
#devops#messaging#interview

IIFE

JavaScript 🟢 Junior

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); // 84

Cas d'usage : Isolation de scope dans du code legacy, initialisation immediate, eviter les collisions globales.

#core#pattern#legacy

Image Optimization (WebP, AVIF)

Advanced Ecosystem 🟡 Mid

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 > JPEG

Cas d'usage : Réduire le poids des images de 60-80% pour améliorer le LCP et la bande passante.

Anti-pattern : Servir des images PNG/JPEG non compressées en taille originale sur mobile.
#performance#media

Immutability

JavaScript 🟡 Mid

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.

Anti-pattern : Croire que Object.freeze est profond : les objets imbriques restent mutables.
#core#fonctionnel#principe

Import Maps

JavaScript 🔴 Senior

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.

#core#modules#navigateur

In-app Notifications

Advanced Ecosystem 🟡 Mid

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.

#communication#ux

Incremental Compilation

TypeScript 🟡 Mid

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.

#tooling#performance

Indexes in Mongoose

Mongoose 🟡 Mid

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.

Anti-pattern : Laisser Mongoose recreer tous les index a chaque redemarrage en prod avec autoIndex: true.
#sgbd#interview#database#mongoose

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.

Anti-pattern : Indexer toutes les colonnes : ralentit les écritures et gaspille de l'espace.
#devops#database#interview

Infinite Query

React 🟡 Mid

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 chargees

Cas d'usage : Feeds sociaux, listes de produits, tout contenu pagine avec scroll infini ou bouton 'charger plus'.

#data-fetching#ux

Ingress

DevOps 🟡 Mid

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.

Anti-pattern : Un Ingress par service au lieu de consolider les règles de routage.
#devops#kubernetes#interview

Injection Scopes

NestJS 🔴 Senior

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.

Anti-pattern : Utiliser REQUEST scope partout, ce qui desactive le singleton et degrade les performances.
#core#interview

Inline Caching

JavaScript 🔴 Senior

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 differentes

Cas d'usage : Garder des formes d'objets coherentes dans les hot paths pour maximiser les performances V8.

#core#engine#performance

Input Validation

PHP 🟢 Junior

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.

Anti-pattern : Valider uniquement cote client (JavaScript) sans validation serveur.
#core#interview#security

insertMany

MongoDB 🟢 Junior

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.

Anti-pattern : Inserer plus de 100 000 documents sans option ordered:false, une seule erreur bloque tout.
#sgbd#interview#database#mongodb

insertOne

MongoDB 🟢 Junior

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.

Anti-pattern : Appeler insertOne en boucle au lieu d'utiliser insertMany pour les insertions en masse.
#sgbd#interview#database#mongodb

InstanceType<T>

TypeScript 🟡 Mid

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.

#utility-types

Integration Test

Testing 🟡 Mid

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.

Anti-pattern : Confondre integration test avec unit test en mockant toutes les dependances, ce qui ne teste plus rien de reel.
#testing#interview#backend

Interactive Rebase

DevOps 🟡 Mid

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 logout

Cas d'usage : Nettoyer une série de commits WIP en un historique cohérent avant la code review.

Anti-pattern : Rebase interactif sur des commits déjà pushés sur une branche partagée.
#devops#git#interview

Intercepting Routes

React 🔴 Senior

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 complete

Cas d'usage : Photos en modale (Instagram-like), apercu de produit, detail de notification sans quitter le feed.

#nextjs#routing#advanced

Interceptor

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser un interceptor pour de la validation de donnees au lieu d'un pipe.
#core#interview

Interface

PHP 🟢 Junior

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.

Anti-pattern : Creer des interfaces avec une seule implementation sans raison de decouplage.
#core#interview#oop#solid

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.

Anti-pattern : Une interface avec 15 methodes dont la plupart des classes n'en implementent que 3.
#core#interview#solid

Interface Segregation Principle

Architecture 🟡 Mid

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.

Anti-pattern : Fat interface avec 20 methodes dont la plupart des implementeurs n'en utilisent que 3.
#architecture#interview#principle

Internal Packages

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Publier sur NPM des packages utilisés uniquement en interne, ajoutant de la complexité inutile.
#monorepo#architecture

Interpolation #{$var}

Sass 🟡 Mid

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.

#styling#sass

Interpreter

Architecture 🔴 Senior

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.

Anti-pattern : Utiliser ce pattern pour un langage complexe — mieux vaut un vrai parser generator.
#architecture#interview#gof#behavioral

IntersectionObserver

JavaScript 🟡 Mid

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.

Anti-pattern : Utiliser un scroll event listener avec getBoundingClientRect pour detecter la visibilite.
#core#DOM#performance

Intrinsic Design

HTML / CSS 🔴 Senior

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.

#interview

invalidateQueries

React 🟡 Mid

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.

Anti-pattern : Invalider trop large (toutes les queries) au lieu de cibler les queryKeys specifiques.
#data-fetching

Inverted Index

Advanced Ecosystem 🟡 Mid

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.

#search#data-structure

IoC Container

NestJS 🟡 Mid

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.

#core#architecture#interview

isolatedModules

TypeScript 🟡 Mid

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.

Anti-pattern : Desactiver isolatedModules avec esbuild/Vite — des re-exports de types cassent silencieusement le build.
#tooling#best-practice

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.

#rendering#performance#nextjs

ITCSS

HTML / CSS 🔴 Senior

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.

#interview

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.

#styling#interview#sass

Iterator

Architecture 🟢 Junior

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.

Anti-pattern : Exposer la structure interne de la collection au code client.
#architecture#interview#gof#behavioral

Iterator Protocol

JavaScript 🟡 Mid

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.

#core#ES6#pattern

James Clark

Personalities 🔴 Senior

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.

#personalities#history#interview

James Gosling

Personalities 🟡 Mid

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.

Anti-pattern : Confondre Java et JavaScript : ce sont deux langages completement differents malgre le nom.
#personalities#history#interview

Jeff Bezos

Personalities 🟡 Mid

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'AWS

Cas d'usage : Le memo API de Bezos est un cas d'etude en architecture microservices et culture d'entreprise tech.

#personalities#history#interview

Jeffrey Zeldman

Personalities 🔴 Senior

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.

#personalities#history#interview

Jen Simmons

Personalities 🟡 Mid

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.

#personalities#history#interview

Jensen Huang

Personalities 🟡 Mid

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 moderne

Cas d'usage : Comprendre pourquoi les GPU NVIDIA sont essentiels pour l'IA et le machine learning.

#personalities#history#interview

Jest

Testing 🟢 Junior

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.

Anti-pattern : Utiliser Jest pour des projets Vite ou ESM pur : la compatibilite peut poser probleme, preferer Vitest.
#testing#tooling#react

Jimmy Wales

Personalities 🟡 Mid

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.

#personalities#history#interview

JIT Compilation

JavaScript 🔴 Senior

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 changent

Cas d'usage : Comprendre pourquoi le code JS est rapide malgre le typage dynamique, et comment eviter les deoptimisations.

#core#engine#performance

JIT Compiler

PHP 🔴 Senior

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=256M

Cas d'usage : Pour les applications CPU-bound (calculs, traitement d'images). Peu d'impact sur les apps web classiques IO-bound.

Anti-pattern : Activer le JIT en esperant accelerer une app web classique (les gains sont minimes sur du IO).
#advanced#performance#php8

JIT Mode

Tailwind CSS 🟡 Mid

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.

#styling#interview#tailwind

Job (CI/CD)

DevOps 🟢 Junior

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.

#devops#cicd

Job / CronJob

DevOps 🟡 Mid

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.0

Cas d'usage : Backups planifiés, nettoyage de données, envoi de rapports périodiques.

Anti-pattern : Utiliser un CronJob pour un service long-running au lieu d'un Deployment.
#devops#kubernetes

John McCarthy

Personalities 🔴 Senior

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) ; => 3628800

Cas d'usage : Comprendre les origines de la programmation fonctionnelle et de l'intelligence artificielle.

#personalities#history#interview

John Resig

Personalities 🟡 Mid

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.

Anti-pattern : Utiliser jQuery en 2024 pour un nouveau projet : les API natives (fetch, querySelector) suffisent.
#personalities#history#interview

John von Neumann

Personalities 🟡 Mid

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 Neumann

Cas d'usage : Comprendre pourquoi la RAM, le CPU et le bus memoire sont organises comme ils le sont dans chaque machine.

#personalities#history#interview

JOIN (INNER, LEFT, RIGHT, FULL)

PostgreSQL 🟢 Junior

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.

Anti-pattern : Faire un CROSS JOIN involontaire en oubliant la clause ON, produisant un produit cartesien.
#sgbd#interview#database#postgresql

Jony Ive

Personalities 🔴 Senior

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.

#personalities#history#interview

Jordan Walke

Personalities 🟡 Mid

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 UI

Cas d'usage : React domine le front-end. Comprendre son origine aide a saisir le paradigme declaratif et composant.

#personalities#history#interview

Jose Valim

Personalities 🔴 Senior

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.

#personalities#history#interview

Jotai

React 🟡 Mid

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.

#state#ecosystem

JSONB

PostgreSQL 🟡 Mid

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.

Anti-pattern : Utiliser JSONB pour tout au lieu de colonnes relationnelles, perdant les avantages du schema.
#sgbd#interview#database#postgresql

JSX

React 🟢 Junior

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.

Anti-pattern : Oublier que class s'ecrit className et for s'ecrit htmlFor en JSX.
#core#interview#syntax

JWT (JSON Web Token)

Advanced Ecosystem 🟡 Mid

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).

Anti-pattern : Stocker des données sensibles dans le payload JWT (il est seulement encodé, pas chiffré) ou utiliser un secret faible.
#security#authentication

JWT Strategy

NestJS 🟡 Mid

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.

Anti-pattern : Stocker des donnees sensibles (mot de passe, carte) dans le payload JWT.
#security#interview

JWT Token Rotation

Advanced Ecosystem 🔴 Senior

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.

Anti-pattern : Utiliser des refresh tokens réutilisables sans détection de réutilisation.
#security#authentication

Kelsey Hightower

Personalities 🟡 Mid

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.0

Cas d'usage : 'Kubernetes the Hard Way' est LA ressource pour comprendre Kubernetes en profondeur, sans abstractions.

Anti-pattern : Utiliser Kubernetes pour un petit projet : parfois un simple docker-compose suffit.
#personalities#history#interview

Ken Thompson

Personalities 🟡 Mid

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 web

Cas d'usage : Comprendre les origines d'Unix, de Go et de l'encodage de caracteres universel UTF-8.

#personalities#history#interview

Kent Beck

Personalities 🟡 Mid

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.

Anti-pattern : Ecrire les tests APRES le code en pretendant faire du TDD — ca rate l'essence de la methode.
#personalities#history#interview

Kent C. Dodds

Personalities 🟡 Mid

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.

#personalities#history#interview

Kevin Mitnick

Personalities 🟡 Mid

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 formation

Cas d'usage : Comprendre que la securite n'est pas que technique : le facteur humain est souvent le plus vulnerable.

#personalities#history#interview

Key Prop

React 🟢 Junior

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.

Anti-pattern : Utiliser l'index comme key dans une liste qui peut etre triee, filtree ou modifiee, causant des bugs d'etat.
#core#interview#performance

Key Remapping (as)

TypeScript 🔴 Senior

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.

#advanced#type-system

Keyframes (styled-components)

Styled-Components 🟡 Mid

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.

#styling#css-in-js

Keyframes Config

Tailwind CSS 🟡 Mid

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.

#styling#tailwind

KISS (Keep It Simple, Stupid)

Architecture 🟢 Junior

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.

Anti-pattern : Architecture enterprise pour un side-project de 3 pages.
#architecture#interview#principle

Landmark Roles

HTML / CSS 🟢 Junior

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.

Anti-pattern : Avoir plusieurs <main> ou aucun landmark, rendant la navigation par région impossible.
#core#accessibility

Larry Page

Personalities 🟡 Mid

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 citations

Cas d'usage : Comprendre les bases du SEO et comment les moteurs de recherche classent les pages web.

#personalities#history#interview

Larry Wall

Personalities 🔴 Senior

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.

#personalities#history#interview

Late Static Binding

PHP 🔴 Senior

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 User

Cas d'usage : Dans les classes de base (ORM, factories) ou les methodes heritees doivent retourner le type de la sous-classe.

Anti-pattern : Utiliser self:: dans une methode de base quand on veut que les enfants puissent la specialiser.
#advanced#interview#oop

LATERAL JOIN

PostgreSQL 🔴 Senior

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.

#sgbd#interview#database#postgresql

Law of Demeter

Architecture 🟡 Mid

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 interne

Cas d'usage : Reduire le couplage entre objets et rendre le code plus resilient aux changements.

Anti-pattern : Chaines de getters qui exposent la structure interne de tout le graphe d'objets.
#architecture#interview#principle

Layer Caching

DevOps 🟡 Mid

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.

Anti-pattern : Copier tout le code avant l'installation des dépendances.
#devops#docker#optimisation

Lea Verou

Personalities 🟡 Mid

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.

#personalities#history#interview

lean()

Mongoose 🟡 Mid

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.

Anti-pattern : Utiliser lean() puis essayer d'appeler .save() ou des methodes d'instance Mongoose.
#sgbd#interview#database#mongoose

Lerna

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Utiliser Lerna seul sans Nx ou Turborepo pour le caching, subissant des builds lents.
#tooling#monorepo#npm

Lexical Scope

JavaScript 🟡 Mid

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.

#core#interview

Lifecycle Hooks

NestJS 🟡 Mid

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.

Anti-pattern : Initialiser des ressources dans le constructeur au lieu de onModuleInit, bloquant la DI.
#core#interview

Light DOM vs Shadow DOM

HTML / CSS 🔴 Senior

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.

#interview

light-dark()

HTML / CSS 🟡 Mid

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.

#core#interview

Lighthouse

Advanced Ecosystem 🟢 Junior

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é.

Anti-pattern : Se fier uniquement au score Lighthouse local sans tester en conditions réseau réelles.
#performance#tooling

Lightning CSS

CSS-in-JS 🟡 Mid

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.

#styling#interview#css-in-js

limit / skip

MongoDB 🟢 Junior

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.

Anti-pattern : Utiliser skip avec des valeurs elevees (skip(100000)) : les performances se degradent. Preferer la pagination par curseur.
#sgbd#interview#database#mongodb

Linaria

CSS-in-JS 🔴 Senior

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.

#styling#css-in-js

lint-staged

DevOps 🟢 Junior

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.

#devops#git#tooling

Linus Torvalds

Personalities 🟢 Junior

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, 2005

Cas d'usage : Linux et Git sont les deux outils les plus utilises dans le developpement moderne. Incontournable.

Anti-pattern : Confondre Linux (le noyau) avec GNU/Linux (le systeme complet avec les outils GNU).
#personalities#history#interview

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 inattendue

Cas d'usage : Lors de la conception de hierarchies d'heritage pour eviter les bugs subtils lies aux sous-classes.

Anti-pattern : Un sous-type qui lance une exception dans une methode heritee ou change le comportement attendu.
#core#interview#solid

LISTEN / NOTIFY

PostgreSQL 🔴 Senior

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 notification

Cas d'usage : Notifier un service en temps reel quand une commande est creee, sans message broker externe.

#sgbd#interview#database#postgresql

Literal Types

TypeScript 🟢 Junior

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"); // Erreur

Cas d'usage : Restreindre les parametres de configuration aux seules valeurs valides.

Anti-pattern : Utiliser string la ou un ensemble fini de valeurs est attendu — aucune aide de l'autocompletion.
#core#interview#beginner

Live Regions

HTML / CSS 🟡 Mid

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.

Anti-pattern : Mettre aria-live='assertive' partout, ce qui bombarde l'utilisateur d'interruptions constantes.
#accessibility#interview

Load Balancer

DevOps 🟡 Mid

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é.

Anti-pattern : Load balancer sans health check : envoie du trafic vers des instances mortes.
#devops#scaling#interview

Load Test

Testing 🟡 Mid

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.

Anti-pattern : Ne faire des tests de charge qu'en pre-production sur une infra differente de la prod.
#testing#performance#devops

Loader (React Router)

React 🟡 Mid

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.

#routing#data-fetching

Loading Attribute

HTML / CSS 🟢 Junior

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.

Anti-pattern : Mettre loading='lazy' sur l'image hero/LCP qui doit charger immédiatement.
#performance#core#interview

Local Strategy

NestJS 🟡 Mid

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.

Anti-pattern : Comparer les mots de passe en clair au lieu d'utiliser bcrypt.
#security#interview

Lock File

Testing 🟢 Junior

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 file

Cas d'usage : Pour garantir que tous les devs et la CI installent exactement les memes versions de dependances.

Anti-pattern : Ajouter le lock file au .gitignore, rendant les builds non reproductibles et causant des bugs fantomes.
#tooling#package#fondamental

Logging (Structured)

DevOps 🟡 Mid

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.

Anti-pattern : console.log partout en prod : pas structuré, pas de niveaux, pas de contexte.
#devops#monitoring#interview

Logical Assignment

JavaScript 🟢 Junior

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 truthy

Cas d'usage : Initialiser des options/configurations avec des valeurs par defaut de maniere concise.

#core#ES2021#syntaxe

Logical Properties

HTML / CSS 🟡 Mid

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.

#core#interview

Long Polling

Advanced Ecosystem 🟢 Junior

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).

Anti-pattern : Faire du polling court (toutes les 100ms) au lieu du long polling, gaspillant bande passante et CPU.
#real-time#networking

Magic Methods

PHP 🟡 Mid

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.

Anti-pattern : Abuser de __get/__set pour tout rendre magique, rendant le code impredictible et non analysable par les IDE.
#core#interview#oop

Map

JavaScript 🟢 Junior

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;      // 1

Cas d'usage : Cache en memoire, compteurs de frequences, lookup tables avec des cles non-string.

Anti-pattern : Utiliser un objet plain comme map avec des cles utilisateur non sanitisees (risque de prototype pollution).
#core#ES6#performance

map-get / map-merge

Sass 🟡 Mid

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.

#styling#sass

Mapped Types

TypeScript 🟡 Mid

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).

Anti-pattern : Redefinir manuellement chaque variante d'un type au lieu d'utiliser un mapped type — duplication et desynchronisation.
#core#interview#type-system

Marc Andreessen

Personalities 🟡 Mid

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.

#personalities#history#interview

Margaret Hamilton

Personalities 🟡 Mid

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.

#personalities#history#interview

Mark Zuckerberg

Personalities 🟢 Junior

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 majeures

Cas d'usage : Meta est un contributeur majeur a l'open source (React, GraphQL, PyTorch). Son ecosysteme est incontournable.

#personalities#history#interview

Mark-and-Sweep

JavaScript 🔴 Senior

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.

#core#engine#performance

Martin Fowler

Personalities 🟡 Mid

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 clairs

Cas d'usage : Ses patterns et pratiques de refactoring sont des references en entretien et en architecture.

#personalities#history#interview

Martin Hellman

Personalities 🔴 Senior

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, PGP

Cas d'usage : Comprendre les fondations de la cryptographie moderne et de la securite des communications.

#personalities#history#interview

Match Expression

PHP 🟢 Junior

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.

Anti-pattern : Utiliser switch sans break, causant un fall-through involontaire.
#core#php8

Materialized Views

Architecture 🔴 Senior

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.

Anti-pattern : Ne pas rafraichir les vues — donnees perimees sans que personne ne le sache.
#architecture#interview#performance

math.div()

Sass 🟢 Junior

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; // 1rem

Cas d'usage : Effectuer des divisions dans Sass sans declencer de warnings de depreciation.

Anti-pattern : Continuer a utiliser / pour la division, qui sera completement retire dans une future version.
#styling#sass

Matt Mullenweg

Personalities 🟡 Mid

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.

#personalities#history#interview

Mediator

Architecture 🟡 Mid

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 directement

Cas d'usage : Coordonner des composants UI interdependants, chat rooms, systemes de workflow.

Anti-pattern : Le mediator devient un God Object qui contient toute la logique metier.
#architecture#interview#gof#behavioral

Meilisearch

Advanced Ecosystem 🟢 Junior

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.

#search#open-source

Memento

Architecture 🟡 Mid

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.

Anti-pattern : Stocker trop de mementos en memoire sans strategie de nettoyage.
#architecture#interview#gof#behavioral

Memoization

JavaScript 🟡 Mid

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).

Anti-pattern : Memoiser des fonctions avec des effets de bord ou des arguments non serialisables.
#core#performance#fonctionnel

Memory Leak Patterns

JavaScript 🔴 Senior

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 refs

Cas d'usage : Debugger les apps qui ralentissent avec le temps, onglets qui consomment de plus en plus de RAM.

Anti-pattern : Ignorer le cleanup dans useEffect (React) ou ngOnDestroy (Angular).
#core#performance#debug

Mercure Protocol

Advanced Ecosystem 🟡 Mid

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.

#real-time#protocol

Message Broker vs Event Broker

DevOps 🔴 Senior

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 Streams

Cas d'usage : Message broker pour les tâches (1 worker). Event broker pour les événements (N consumers).

#devops#messaging#interview

MessagePattern vs EventPattern

NestJS 🔴 Senior

@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.

Anti-pattern : Utiliser MessagePattern pour des events qui ne necessitent pas de reponse, bloquant inutilement.
#architecture#interview

Metrics

DevOps 🟡 Mid

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.

Anti-pattern : Collecter des métriques sans alertes ni dashboards : des données inutiles.
#devops#monitoring#interview

Microservices

Architecture 🟡 Mid

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 DB

Cas d'usage : Grandes equipes, scaling independant, polyglottisme technologique.

Anti-pattern : Distributed monolith : microservices fortement couples qui doivent etre deployes ensemble.
#architecture#interview#architecture-style

Microtask Queue

JavaScript 🟡 Mid

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, macro

Cas d'usage : Executer du code juste apres l'operation courante mais avant le prochain rendu ou timer.

Anti-pattern : Creer des microtasks en boucle infinie qui bloquent completement la macrotask queue et le rendu.
#core#interview#async

Middleware

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser un middleware pour de la logique metier specifique a une route au lieu d'un interceptor ou guard.
#core#interview

Middleware

Architecture 🟢 Junior

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.

Anti-pattern : Middleware qui fait trop de choses — il doit avoir une seule responsabilite.
#architecture#interview#best-practice

Middleware (Pre/Post Hooks)

Mongoose 🟡 Mid

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.

Anti-pattern : Oublier d'appeler next() dans un middleware pre, bloquant toute la chaine d'execution.
#sgbd#interview#database#mongoose

mise

Testing 🟡 Mid

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 version

Cas d'usage : Pour les equipes polyglotte qui veulent un seul outil pour gerer toutes les versions de runtime.

Anti-pattern : Utiliser un gestionnaire different par langage (nvm + pyenv + goenv) alors que mise les unifie tous.
#dx#tooling#polyglotte

Misko Hevery

Personalities 🟡 Mid

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.

#personalities#history#interview

Mitchell Hashimoto

Personalities 🟡 Mid

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.

#personalities#history#interview

Mixins (@mixin / @include)

Sass 🟢 Junior

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.

Anti-pattern : Utiliser un mixin sans argument quand un @extend ou un placeholder serait plus efficient.
#styling#interview#sass

Mobile-first

HTML / CSS 🟢 Junior

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.

Anti-pattern : Coder d'abord le layout desktop puis empiler des max-width queries pour 'adapter' au mobile.
#core#interview

Mocha + Chai

Testing 🟡 Mid

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.

Anti-pattern : Utiliser Mocha+Chai pour un nouveau projet frontend React alors que Jest ou Vitest sont mieux integres.
#testing#tooling#backend

Mocking vs Stubbing

Testing 🟡 Mid

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).

Anti-pattern : Sur-mocker en verifiant chaque appel interne, couplant les tests a l'implementation plutot qu'au comportement.
#testing#interview#fondamental

Model

Mongoose 🟢 Junior

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.

Anti-pattern : Appeler mongoose.model() plusieurs fois avec le meme nom, causant une erreur OverwriteModelError.
#sgbd#interview#database#mongoose

Modular Monolith

Architecture 🟡 Mid

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 croises

Cas d'usage : Equipe moyenne qui veut de la modularite sans la complexite operationnelle des microservices.

Anti-pattern : Modules qui accedent directement aux tables des autres modules — couplage cache.
#architecture#interview#architecture-style

Module

NestJS 🟢 Junior

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.

Anti-pattern : Mettre tous les providers dans AppModule au lieu de les repartir en modules fonctionnels.
#core#architecture#interview

Module Augmentation

TypeScript 🔴 Senior

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).

Anti-pattern : Augmenter des modules sans documenter pourquoi — les futurs developpeurs ne comprennent pas d'ou viennent les types.
#advanced#tooling

Modules (Sass Modules)

Sass 🟡 Mid

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.

#styling#interview#sass

MongoDB Atlas

MongoDB 🟢 Junior

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.

Anti-pattern : Laisser l'acces reseau ouvert a 0.0.0.0/0 en production au lieu de whitelister les IPs.
#sgbd#interview#database#mongodb

MongoDB Compass

MongoDB 🟢 Junior

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-compass

Cas d'usage : Visualiser la structure des documents et debugger les requetes sans ecrire de code.

#sgbd#interview#database#mongodb

Mongoose Model

NestJS 🟡 Mid

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.

#database

Mongoose Population

NestJS 🟡 Mid

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.

Anti-pattern : Populer toutes les references par defaut, causant des requetes excessives sur les grandes collections.
#database

Mongoose Schema

NestJS 🟡 Mid

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.

Anti-pattern : Stocker des documents sans schema defini, rendant les donnees incoherentes.
#database

mongos

MongoDB 🔴 Senior

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.

#sgbd#interview#database#mongodb

mongosh

MongoDB 🟢 Junior

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.

#sgbd#interview#database#mongodb

Monolith

Architecture 🟢 Junior

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 DB

Cas d'usage : MVP, startups early-stage, equipes reduites ou le monolithe est le choix rationnel.

Anti-pattern : Commencer en microservices quand un monolithe suffirait — complexite prematuree.
#architecture#interview#architecture-style

Monorepo

DevOps 🟡 Mid

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.

Anti-pattern : Monorepo sans outil de build incrémental : le CI rebuild tout à chaque commit.
#devops#git#interview

Monorepo Tools

Testing 🔴 Senior

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).

Anti-pattern : Utiliser un monorepo sans outil de gestion, rebuilder tout le repo a chaque changement.
#tooling#architecture#senior

MSW

Testing 🟡 Mid

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.

Anti-pattern : Mocker les API internes de son propre backend au lieu de les tester en integration reelle.
#testing#tooling#frontend

MSW (Mock Service Worker)

React 🟡 Mid

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.

#testing#mocking

mu-plugin (Must-Use Plugin)

WordPress 🟡 Mid

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.

Anti-pattern : Mettre de la logique metier dans un mu-plugin au lieu d'un plugin classique.
#core#wordpress

Multi-Document Transaction

MongoDB 🔴 Senior

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.

Anti-pattern : Utiliser des transactions pour tout au lieu de profiter du modele de document embarque de MongoDB.
#sgbd#interview#database#mongodb

Multi-stage Build

DevOps 🟡 Mid

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.

Anti-pattern : Inclure les devDependencies et le code source dans l'image finale.
#devops#docker#interview#optimisation

Multipart Upload

Advanced Ecosystem 🟡 Mid

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.

#storage#performance

Mutation (TanStack Query)

React 🟡 Mid

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.

#data-fetching

Mutation Testing

Testing 🔴 Senior

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 run

Cas d'usage : Pour evaluer la qualite reelle des tests au-dela du simple code coverage qui peut donner un faux sentiment de securite.

Anti-pattern : Viser 100% de mutants tues, ce qui est extremement couteux en temps pour un gain marginal.
#testing#qualite#senior

MutationObserver

JavaScript 🟡 Mid

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.

#core#DOM

MVC Pattern

PHP 🟢 Junior

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.

Anti-pattern : Mettre des requetes SQL dans les vues ou de la logique HTML dans les modeles.
#core#interview#architecture

MVCC

PostgreSQL 🔴 Senior

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.

#sgbd#interview#database#postgresql

Named Arguments

PHP 🟢 Junior

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.

Anti-pattern : Mixer arguments positionnels et nommes de facon confuse dans le meme appel.
#core#php8

Namespace

PHP 🟢 Junior

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.

Anti-pattern : Ne pas utiliser de namespace et prefixer manuellement les classes (MyPlugin_User_Service).
#core#interview#php8

Namespace

DevOps 🟡 Mid

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 staging

Cas d'usage : Séparer dev, staging et prod sur le même cluster avec des quotas de ressources.

Anti-pattern : Tout mettre dans le namespace default : aucune isolation ni gouvernance.
#devops#kubernetes

Nested Routes

React 🟡 Mid

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).

#routing

Nesting

Sass 🟢 Junior

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.

Anti-pattern : Imbriquer trop profondement (>3 niveaux) ce qui cree des selecteurs trop specifiques.
#styling#interview#sass

Nesting natif

HTML / CSS 🟡 Mid

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.

Anti-pattern : Imbriquer sur plus de 3 niveaux, créant des sélecteurs trop spécifiques et fragiles.
#core#interview

new keyword

JavaScript 🟡 Mid

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.

Anti-pattern : Oublier new devant un constructeur : this pointe alors vers global/undefined et les proprietes fuient.
#core#interview#OOP

Next.js App Router

React 🟡 Mid

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 auto

Cas d'usage : Applications React full-stack avec SSR, RSC, routing et API integres.

#nextjs#interview#framework

Next.js Middleware

React 🟡 Mid

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.

Anti-pattern : Mettre de la logique lourde (requetes DB) dans le middleware Edge qui a des limitations runtime.
#nextjs#auth#edge

Niklaus Wirth

Personalities 🔴 Senior

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.

#personalities#history#interview

node_modules

Testing 🟢 Junior

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.

Anti-pattern : Commiter node_modules dans git, gonflant le repo de centaines de Mo de fichiers inutiles.
#tooling#package#fondamental

Nonce WordPress

WordPress 🟡 Mid

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.

Anti-pattern : Utiliser un nonce generique ('mon_nonce') au lieu d'un nonce specifique a l'action.
#core#interview#security#wordpress

NonNullable<T>

TypeScript 🟢 Junior

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>; // string

Cas d'usage : Nettoyer les types apres une verification de nullite pour travailler avec des valeurs garanties.

#core#utility-types

npm

Testing 🟢 Junior

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 vulns

Cas d'usage : Comme gestionnaire de paquets standard pour tout projet Node.js, surtout en CI avec npm ci.

Anti-pattern : Utiliser npm install en CI au lieu de npm ci, risquant des installations non reproductibles.
#tooling#package#fondamental

npx vs npm exec

Testing 🟢 Junior

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-app

Cas d'usage : Pour executer des CLI ponctuels (scaffolding, init) sans polluer les dependances globales.

Anti-pattern : Installer globalement (npm i -g) des outils qui changent souvent de version, causant des conflits.
#tooling#package#dx

Null Object

Architecture 🟢 Junior

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.

Anti-pattern : Retourner null au lieu d'un objet neutre, forçant des checks partout.
#architecture#interview#behavioral

Null Safe Operator

PHP 🟢 Junior

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.

Anti-pattern : Utiliser ?-> partout sans se demander si null est vraiment un cas valide.
#core#php8

Nullish Coalescing

JavaScript 🟢 Junior

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.

#core#ES2020#syntaxe

nvm

Testing 🟢 Junior

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 volta

Cas d'usage : Pour gerer les versions Node.js sur les systemes Unix, surtout quand l'equipe l'utilise deja.

Anti-pattern : Garder nvm malgre la lenteur du shell startup alors que fnm ou volta sont des drop-in replacements.
#dx#tooling#node

Nx

Advanced Ecosystem 🟡 Mid

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 graph

Cas d'usage : Gérer un monorepo d'entreprise multi-frameworks avec des dizaines de projets interdépendants.

Anti-pattern : Utiliser Nx sans configurer le cache distribué en CI, perdant le principal avantage de performance.
#tooling#monorepo

OAuth2

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Utiliser le flow Implicit (déprécié) au lieu d'Authorization Code + PKCE pour les SPA.
#security#authentication

OAuth2 PKCE

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Utiliser le flow Implicit ou Authorization Code sans PKCE dans une application publique (SPA, mobile).
#security#authentication

OAuth2 Strategy

NestJS 🔴 Senior

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.

#security

Object Cache

WordPress 🔴 Senior

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%.

Anti-pattern : Mettre en cache des donnees qui changent a chaque requete, annulant tout benefice.
#advanced#wordpress#performance

Object Pool

Architecture 🟡 Mid

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.

Anti-pattern : Ne pas reinitialiser les objets avant de les remettre dans le pool — donnees residuelles.
#architecture#interview#gof#creational#performance

Object Static Methods

JavaScript 🟡 Mid

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.

#core#fondamental

ObjectId

MongoDB 🟢 Junior

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.000Z

Cas d'usage : Identifier de maniere unique chaque document sans compteur central, ideal pour les systemes distribues.

Anti-pattern : Comparer des ObjectId comme des strings sans les convertir, ce qui donne des resultats incoherents.
#sgbd#interview#database#mongodb

Observer

Architecture 🟢 Junior

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.

Anti-pattern : Oublier de se desabonner — fuite memoire classique.
#architecture#interview#gof#behavioral

Observer Pattern

PHP 🟡 Mid

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.

Anti-pattern : Creer des chaines d'observateurs qui se declenchent mutuellement (boucle infinie).
#core#interview#pattern

oklch()

HTML / CSS 🟡 Mid

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.

#interview

Omit<T, K>

TypeScript 🟢 Junior

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.

#core#interview#utility-types

OmitThisParameter<T>

TypeScript 🔴 Senior

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.

#advanced#utility-types

Onion Architecture

Architecture 🟡 Mid

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, messaging

Cas d'usage : Applications enterprise avec logique metier complexe et multiple integrations.

Anti-pattern : Infrastructure au centre qui force le domaine a dependre d'implementations concretes.
#architecture#interview#architecture-style

Opaque Types

TypeScript 🔴 Senior

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.

#advanced#pattern#safety

OPcache

PHP 🟡 Mid

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 only

Cas d'usage : Obligatoire en production, c'est le premier levier de performance PHP.

Anti-pattern : Desactiver validate_timestamps en developpement (les fichiers ne sont jamais recharges).
#core#performance

Open/Closed Principle

PHP 🟡 Mid

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 existant

Cas d'usage : Quand un systeme doit evoluer frequemment : nouveaux types de paiement, nouvelles regles metier.

Anti-pattern : Ajouter des if/elseif a chaque nouvelle fonctionnalite dans une methode existante.
#core#interview#solid

OpenID Connect

Advanced Ecosystem 🟡 Mid

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.

#security#authentication#identity

Oplog

MongoDB 🔴 Senior

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.

#sgbd#interview#database#mongodb

Optimistic UI Forms

React 🟡 Mid

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.

#forms#ux#react19

Optimistic Update

React 🟡 Mid

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.

#data-fetching#ux#patterns

Optional Catch Binding

JavaScript 🟢 Junior

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.

#core#ES2019#syntaxe

Optional Chaining

JavaScript 🟢 Junior

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.

Anti-pattern : En abuser sur des chemins qui ne devraient jamais etre nullish, masquant des bugs reels.
#core#ES2020#syntaxe

Optional Dependencies

NestJS 🟡 Mid

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.

#core

Options API

WordPress 🟢 Junior

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.

Anti-pattern : Stocker des donnees volumineuses ou temporaires dans les options avec autoload=yes.
#core#interview#wordpress

Outbox Pattern

Architecture 🔴 Senior

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.

Anti-pattern : Publier l'evenement apres le commit — si le publish echoue, l'etat est incoherent.
#architecture#interview#microservices#distributed

Outlet

React 🟡 Mid

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.

#routing

Output Escaping

PHP 🟢 Junior

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.

Anti-pattern : Utiliser htmlspecialchars pour un contexte JavaScript ou URL (echappement inadequat).
#core#interview#security

Overload Signatures

TypeScript 🟡 Mid

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).

Anti-pattern : Utiliser des overloads quand une simple union ou un generic suffirait — complexite inutile.
#core#interview#api-design

overrideGuard

NestJS 🟡 Mid

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.

#testing

overrideProvider

NestJS 🟡 Mid

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.

#testing

OWASP Top 10

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Construire des requêtes SQL par concaténation de chaînes avec des entrées utilisateur.
#security#best-practice

Padding & Margin

Tailwind CSS 🟢 Junior

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.

#styling#tailwind

Pagination

NestJS 🟡 Mid

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.

Anti-pattern : Retourner tous les enregistrements sans pagination, causant des timeouts avec les grosses tables.
#core#interview

Panda CSS

CSS-in-JS 🔴 Senior

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.

#styling#interview#css-in-js

Parallel Routes

React 🔴 Senior

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.

#nextjs#routing#advanced

Parameters<T>

TypeScript 🟡 Mid

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.

#core#utility-types

Partial Application

JavaScript 🟡 Mid

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).

#core#fonctionnel#pattern

Partial Index

PostgreSQL 🟡 Mid

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.

#sgbd#interview#database#postgresql

Partial Prerendering

React 🔴 Senior

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.

#rendering#nextjs#performance

Partial<T>

TypeScript 🟢 Junior

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" }); // OK

Cas d'usage : Fonctions de mise a jour partielle (PATCH) ou options de configuration avec des valeurs par defaut.

Anti-pattern : Utiliser Partial partout et perdre la garantie que les champs requis sont presents a la creation.
#core#interview#utility-types

Partials (_file)

Sass 🟢 Junior

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).

#styling#interview#sass

Passkeys / WebAuthn

Advanced Ecosystem 🔴 Senior

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.

Anti-pattern : Ne pas proposer de méthode de récupération quand l'utilisateur perd son appareil avec les passkeys.
#security#authentication

Passport

NestJS 🟡 Mid

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.

Anti-pattern : Reimplementer la logique d'authentification from scratch au lieu d'utiliser Passport.
#security#interview

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.

Anti-pattern : Utiliser md5() ou sha1() pour hasher les mots de passe (reversible, pas de salt).
#core#interview#security

Performance Budget

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Définir des budgets sans les enforcer automatiquement en CI, les rendant purement décoratifs.
#performance#ci-cd

PerformanceObserver

JavaScript 🔴 Senior

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).

#core#performance#monitoring

Pest

PHP 🟡 Mid

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.

Anti-pattern : Mixer Pest et PHPUnit classique dans le meme projet sans convention claire.
#tool#testing

pg_dump / pg_restore

PostgreSQL 🟢 Junior

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.dump

Cas d'usage : Sauvegarder une base avant une migration, cloner un environnement de production en staging.

Anti-pattern : Faire des dumps en texte SQL pour de grosses bases au lieu du format custom (-Fc), bien plus rapide a restaurer.
#sgbd#interview#database#postgresql

pg_stat_statements

PostgreSQL 🔴 Senior

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.

#sgbd#interview#database#postgresql

pg_trgm

PostgreSQL 🟡 Mid

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.

#sgbd#interview#database#postgresql

pgcrypto

PostgreSQL 🟡 Mid

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.

Anti-pattern : Stocker des mots de passe en clair ou avec MD5 au lieu d'utiliser bcrypt via crypt().
#sgbd#interview#database#postgresql#security

Phantom Types

TypeScript 🔴 Senior

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.

#advanced#pattern#safety

Phil Zimmermann

Personalities 🔴 Senior

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 fondamental

Cas d'usage : PGP et GPG sont toujours utilises pour signer des commits Git et chiffrer des emails.

#personalities#history#interview

PHPStan

PHP 🟡 Mid

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 analyse

Cas d'usage : En CI/CD pour detecter les bugs de type et les erreurs logiques avant le deploiement.

Anti-pattern : Rester au niveau 0 par confort et ignorer les erreurs remontes par les niveaux superieurs.
#core#tool#quality

PHPUnit

PHP 🟡 Mid

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.

Anti-pattern : Ecrire des tests qui testent l'implementation interne au lieu du comportement.
#core#interview#testing

Pick<T, K>

TypeScript 🟢 Junior

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.

#core#interview#utility-types

Picture/Source

HTML / CSS 🟢 Junior

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.

Anti-pattern : Servir une image 4K à tous les appareils sans adaptation, gaspillant la bande passante mobile.
#performance#core

Pipe

NestJS 🟡 Mid

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.

Anti-pattern : Valider manuellement les donnees dans le controller au lieu d'utiliser ValidationPipe avec des DTOs.
#core#interview

Pipeline CI/CD

DevOps 🟢 Junior

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 build

Cas d'usage : Automatiser les tests et le déploiement à chaque commit pour livrer plus vite et plus sûrement.

Anti-pattern : Pipeline sans tests : on automatise la livraison de bugs.
#devops#cicd#interview

placeholderData

React 🟡 Mid

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.

#data-fetching#ux

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.

Anti-pattern : Utiliser @extend avec des classes normales dans des media queries (cela ne fonctionne pas).
#styling#interview#sass

Playwright

Testing 🟡 Mid

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.

Anti-pattern : Ne tester que sur Chromium en ignorant les autres navigateurs, perdant l'avantage principal de Playwright.
#testing#tooling#frontend

Plugin

Mongoose 🟡 Mid

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.

#sgbd#interview#database#mongoose

Plugin API

WordPress 🟡 Mid

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.

Anti-pattern : Mettre toute la logique dans functions.php au lieu de creer un plugin reutilisable.
#core#interview#wordpress

Plugins

Tailwind CSS 🟡 Mid

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.

#styling#tailwind

pnpm

Testing 🟡 Mid

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 # monorepo

Cas d'usage : Pour les monorepos et les projets avec beaucoup de dependances, offrant rapidite et rigueur.

Anti-pattern : Mixer npm et pnpm dans le meme projet, causant des conflits de lock files et de node_modules.
#tooling#package#monorepo

pnpm Workspaces

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Utiliser npm/yarn classique dans un monorepo avec duplication massive des node_modules.
#tooling#monorepo

Pod

DevOps 🟡 Mid

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: 3000

Cas d'usage : Unité de base gérée par les Deployments, jamais créée directement en prod.

Anti-pattern : Créer des Pods nus sans contrôleur : pas de redémarrage automatique en cas de crash.
#devops#kubernetes#interview

Polymorphic Components

React 🔴 Senior

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.

#patterns#typescript#design-system

Polymorphisme

PHP 🟡 Mid

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.

Anti-pattern : Utiliser instanceof et des if/else en cascade au lieu de laisser le polymorphisme agir.
#core#interview#oop

Popover API

HTML / CSS 🟡 Mid

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.

#core

populate()

Mongoose 🟡 Mid

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.

Anti-pattern : Chainer plusieurs populate profonds (populate de populate) creant des dizaines de requetes.
#sgbd#interview#database#mongoose

Portal

React 🟡 Mid

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.

Anti-pattern : Utiliser un portal sans gerer le focus trapping pour l'accessibilite.
#core#advanced#a11y

PostCSS

Testing 🟡 Mid

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.

Anti-pattern : Empiler trop de plugins PostCSS custom au lieu d'utiliser des solutions natives CSS (nesting, variables).
#build#tooling#css

PostCSS

CSS-in-JS 🟡 Mid

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.

#styling#interview#css-in-js

PostGIS

PostgreSQL 🔴 Senior

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.

#sgbd#interview#database#postgresql

PR Template

Testing 🟢 Junior

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 jour

Cas d'usage : Pour standardiser les PR et garantir que les reviewers ont toutes les informations necessaires.

Anti-pattern : Un template trop long avec 20 sections que personne ne remplit, rendant le processus penible.
#qualite#git#collaboration

Pre Save Hook

Mongoose 🟡 Mid

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.

Anti-pattern : Modifier this dans un pre save avec une arrow function, qui ne lie pas le bon this.
#sgbd#interview#database#mongoose

pre_get_posts

WordPress 🟡 Mid

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.

Anti-pattern : Utiliser query_posts() ou creer un nouveau WP_Query quand pre_get_posts suffit.
#core#interview#wordpress#performance

prefetchQuery

React 🟡 Mid

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.

#data-fetching#performance

Prefix

Tailwind CSS 🟡 Mid

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.

#styling#tailwind

Prepared Statements

PHP 🟢 Junior

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.

Anti-pattern : Preparer la requete mais concatener les valeurs quand meme dans la string SQL.
#core#interview#security

Presigned URL

Advanced Ecosystem 🟡 Mid

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 min

Cas d'usage : Permettre l'upload direct du navigateur vers S3 sans passer par votre serveur backend.

Anti-pattern : Générer des presigned URLs avec une durée trop longue (jours) ou sans restriction de content-type.
#storage#security

Prettier

Testing 🟢 Junior

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.

Anti-pattern : Utiliser ESLint pour le formatage au lieu de Prettier, melangeant les responsabilites (qualite vs style).
#qualite#tooling#dx

PRIMARY KEY

PostgreSQL 🟢 Junior

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.

#sgbd#interview#database#postgresql

Prisma $transaction

NestJS 🔴 Senior

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.

#database

Prisma Client

NestJS 🟡 Mid

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.

Anti-pattern : Instancier PrismaClient dans chaque service au lieu de le wrapper dans un PrismaService singleton.
#database

Prisma Migration

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser prisma db push en production au lieu de prisma migrate deploy.
#database

Prisma Schema

NestJS 🟡 Mid

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.

Anti-pattern : Modifier manuellement les fichiers generes par Prisma au lieu du schema.
#database

Private Class Fields

JavaScript 🟡 Mid

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; // SyntaxError

Cas d'usage : Encapsulation stricte dans les classes, protection des invariants internes.

#core#ES2022#OOP

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: 5

Cas d'usage : Éviter d'envoyer du trafic à des Pods en cours de démarrage ou bloqués.

Anti-pattern : Liveness probe identique à readiness : un Pod lent à démarrer sera tué en boucle.
#devops#kubernetes#interview

Profiler API

React 🟡 Mid

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.

#performance#devtools

Progressive Enhancement

React 🟡 Mid

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.

#rendering#a11y#bestpractice

Project References

TypeScript 🔴 Senior

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 --build

Cas d'usage : Monorepos et gros projets ou la compilation complete est trop lente — chaque module compile isolement.

#tooling#performance#monorepo

Projection

MongoDB 🟢 Junior

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.

Anti-pattern : Melanger inclusion (1) et exclusion (0) dans la meme projection, sauf pour _id.
#sgbd#interview#database#mongodb

Promise

JavaScript 🟢 Junior

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.

Anti-pattern : Imbriquer les .then() au lieu de les chainer, recreant un callback hell avec des promesses.
#core#interview#async#fondamental

Promise Error Handling

JavaScript 🟡 Mid

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.

Anti-pattern : Chaine de .then() sans .catch() final, ou catch vide qui avale les erreurs.
#core#async#best-practice

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).

Anti-pattern : Utiliser await en serie pour des operations independantes au lieu de Promise.all.
#core#interview#async#performance

Prop Getter Pattern

React 🔴 Senior

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.

#patterns#advanced#a11y

Property-Based Testing

Testing 🔴 Senior

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.

Anti-pattern : Ecrire des proprietes triviales (ex: la longueur du resultat > 0) qui ne testent rien de significatif.
#testing#senior#avance

Props

React 🟢 Junior

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.

Anti-pattern : Passer trop de props (prop drilling) au lieu d'utiliser Context ou la composition.
#core#interview#fundamentals

Props-based Styling

Styled-Components 🟡 Mid

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.

Anti-pattern : Passer des props non-transient au DOM (sans $), causant des warnings React.
#styling#interview#css-in-js

Prototypal Inheritance

JavaScript 🟡 Mid

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.

#core#interview#OOP

Prototype

Architecture 🟡 Mid

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.

Anti-pattern : Copie superficielle quand l'objet contient des references imbriquees (shallow vs deep clone).
#architecture#interview#gof#creational

Prototype Chain

JavaScript 🟡 Mid

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.

Anti-pattern : Modifier Object.prototype directement, polluant tous les objets de l'application.
#core#interview#OOP

Provider

NestJS 🟢 Junior

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.

Anti-pattern : Creer des providers sans @Injectable ou oublier de les declarer dans le tableau providers du module.
#core#interview

Provider Pattern

React 🟡 Mid

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.

Anti-pattern : Creer un 'Provider Hell' avec 15 providers imbriques a la racine sans les composer.
#patterns#interview

Proxy

JavaScript 🔴 Senior

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.

Anti-pattern : Abuser des Proxy en hot path : l'overhead d'interception degrade les performances.
#core#ES6#avance#pattern

Proxy

Architecture 🟡 Mid

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.

Anti-pattern : Utiliser un proxy quand un simple appel de methode suffirait — complexite inutile.
#architecture#interview#gof#structural

psql

PostgreSQL 🟢 Junior

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 connexion

Cas d'usage : Administrer et debugger une base PostgreSQL en ligne de commande.

#sgbd#interview#database#postgresql

PSR Standards

PHP 🟡 Mid

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 : ContainerInterface

Cas d'usage : Pour l'interoperabilite entre frameworks et libraries, et un code lisible par tous.

Anti-pattern : Ignorer les PSR et inventer ses propres conventions dans un projet d'equipe.
#core#interview#bestpractice

Pub/Sub

Architecture 🟡 Mid

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.

Anti-pattern : Utiliser Pub/Sub pour des appels synchrones — pas de garantie d'ordre ni de livraison.
#architecture#interview#messaging

Pulumi

DevOps 🔴 Senior

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.

#devops#iac#tooling

Pure Function

JavaScript 🟢 Junior

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 externe

Cas d'usage : Reducers Redux, fonctions de transformation, tests unitaires faciles, memoization possible.

#core#fonctionnel#principe

Purge / Content

Tailwind CSS 🟡 Mid

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.

Anti-pattern : Construire des noms de classes dynamiquement (bg-${color}-500) sans safelist.
#styling#interview#tailwind

Push Notifications

Advanced Ecosystem 🟡 Mid

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).

Anti-pattern : Demander la permission de notification dès le chargement de la page, avant toute interaction.
#communication#engagement

PV / PVC

DevOps 🟡 Mid

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: 20Gi

Cas d'usage : Fournir du stockage persistant aux bases de données dans Kubernetes.

#devops#kubernetes

Query Builder

Mongoose 🟡 Mid

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.

#sgbd#interview#database#mongoose

Query Monitor

WordPress 🟡 Mid

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 charges

Cas d'usage : En developpement pour identifier les requetes lentes, les plugins gourmands et les hooks problematiques.

Anti-pattern : Laisser Query Monitor actif en production (expose des informations sensibles).
#core#tool#wordpress#performance

Query Operators

MongoDB 🟢 Junior

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.

Anti-pattern : Imbriquer trop de $or/$and rendant la requete illisible au lieu d'utiliser l'aggregation.
#sgbd#interview#database#mongodb

queryKey

React 🟡 Mid

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.

Anti-pattern : Utiliser des strings simples au lieu de tableaux hierarchiques, rendant l'invalidation partielle impossible.
#data-fetching

queueMicrotask

JavaScript 🟡 Mid

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, 2

Cas d'usage : Differer une action apres le code synchrone courant mais avant le prochain rendu.

Anti-pattern : Utiliser queueMicrotask en boucle recursive, bloquant la macrotask queue indefiniment.
#core#async

RabbitMQ

DevOps 🟡 Mid

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.

Anti-pattern : Ne pas ack les messages : ils restent en queue et saturent la mémoire.
#devops#messaging#interview

Rachel Andrew

Personalities 🟡 Mid

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.

#personalities#history#interview

Rasmus Lerdorf

Personalities 🟡 Mid

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.

Anti-pattern : Mepriser PHP en 2024 : PHP 8.x est un langage moderne avec types, JIT et fibers.
#personalities#history#interview

Rate Limiting

NestJS 🟡 Mid

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.

Anti-pattern : Ne pas limiter les endpoints sensibles comme /login, permettant les attaques par force brute.
#security#interview

Rate Limiting

DevOps 🟡 Mid

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.

Anti-pattern : Rate limit uniquement par IP : contournable par les proxies, insuffisant.
#devops#resilience#interview

Rate Limiting

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Rate limiter uniquement par IP sans tenir compte des utilisateurs authentifiés derrière un proxy.
#security#performance

RBAC

NestJS 🟡 Mid

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.

Anti-pattern : Hardcoder les verifications de role dans chaque handler au lieu d'utiliser un guard + metadata.
#security#interview

React Fiber

React 🔴 Senior

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.

#core#interview#architecture

React Hook Form

React 🟡 Mid

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.

Anti-pattern : Re-implementer la validation manuellement avec useState au lieu d'utiliser les resolvers integres.
#forms#interview#ecosystem

React Router v6

React 🟡 Mid

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.

Anti-pattern : Imbriquer des BrowserRouter au lieu d'utiliser des routes imbriquees avec Outlet.
#routing#interview#ecosystem

React Server Components

React 🔴 Senior

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.

Anti-pattern : Essayer d'utiliser useState ou onClick dans un Server Component : il faut 'use client' pour ca.
#rendering#interview#react19#nextjs

React Testing Library

React 🟡 Mid

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.

Anti-pattern : Tester les details d'implementation (state interne, nombre de re-rendus) au lieu du comportement.
#testing#interview#bestpractice

React.memo

React 🟡 Mid

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.

Anti-pattern : Utiliser React.memo sur tous les composants sans mesurer : le cout de comparaison peut depasser le gain.
#performance#interview

Read Preference

MongoDB 🔴 Senior

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.

Anti-pattern : Lire depuis un secondary pour des operations necessitant les donnees les plus recentes.
#sgbd#interview#database#mongodb

Read Replica

DevOps 🟡 Mid

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.

Anti-pattern : Lire depuis la replica juste après une écriture : données pas encore répliquées.
#devops#database#interview

Readonly Properties

PHP 🟡 Mid

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.

Anti-pattern : Rendre readonly des proprietes qui doivent legitimement changer apres l'initialisation.
#core#interview#php8

Readonly<T>

TypeScript 🟢 Junior

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: readonly

Cas d'usage : Proteger l'etat dans Redux/stores immutables ou les parametres de fonctions pures.

Anti-pattern : Oublier que Readonly est superficiel — les objets imbriques restent mutables.
#core#interview#utility-types

Rebase vs Merge

DevOps 🟡 Mid

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/login

Cas d'usage : Rebase pour un historique propre sur les feature branches, merge pour les branches partagées.

Anti-pattern : Rebase une branche publique partagée : réécrit l'historique des autres.
#devops#git#interview

Recipe (Vanilla Extract)

CSS-in-JS 🔴 Senior

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.

#styling#css-in-js

Reconciliation Algorithm

React 🟡 Mid

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.

Anti-pattern : Changer le type d'un composant parent inutilement, forcant React a detruire tout le sous-arbre.
#core#interview#performance

Record<K, V>

TypeScript 🟢 Junior

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.

Anti-pattern : Utiliser { [key: string]: any } au lieu de Record avec des cles precises — perte d'autocompletion.
#core#interview#utility-types

Rector

PHP 🔴 Senior

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.

Anti-pattern : Appliquer Rector sans review ni tests, generant des regressions non detectees.
#tool#quality

Recursive Conditional Types

TypeScript 🔴 Senior

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.

Anti-pattern : Recursion trop profonde sans limite — TS a une profondeur max (~50) et genere des erreurs cryptiques.
#advanced#type-system

Recursive Types

TypeScript 🔴 Senior

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).

Anti-pattern : Creer des recursions infinies sans condition d'arret — le compilateur plante ou devient tres lent.
#advanced#type-system

Redis

DevOps 🟡 Mid

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.

Anti-pattern : Utiliser Redis comme base de données primaire sans persistence : perte de données au redémarrage.
#devops#database#interview

Redis Pub/Sub

DevOps 🟡 Mid

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.

Anti-pattern : Utiliser Pub/Sub pour des messages critiques : pas de garantie de livraison.
#devops#messaging

Redux Toolkit

React 🟡 Mid

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.

Anti-pattern : Mettre TOUT l'etat dans Redux y compris le state UI local (open/close modal).
#state#interview#ecosystem

Reflect

JavaScript 🔴 Senior

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.

#core#ES6#avance

Reflow vs Repaint

HTML / CSS 🟡 Mid

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 seulement

Cas d'usage : Déboguer les animations lentes en identifiant si le problème vient du reflow ou du repaint.

Anti-pattern : Lire puis écrire des propriétés de layout en boucle (layout thrashing) qui force des reflows synchrones.
#performance#interview

Regression Test

Testing 🟢 Junior

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 reapparaitre

Cas d'usage : A chaque bug fixe, ajouter un test de regression pour garantir qu'il ne reviendra jamais.

Anti-pattern : Ne pas ajouter de test apres avoir corrige un bug, laissant la porte ouverte a sa reapparition.
#testing#interview#qualite

Remix Conventions

React 🟡 Mid

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.

#framework#fullstack

Render Props

React 🟡 Mid

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).

Anti-pattern : Imbriquer plusieurs render props creant un 'callback hell' illisible.
#patterns#interview

Renovate / Dependabot

Testing 🟡 Mid

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.

Anti-pattern : Activer l'automerge sur les mises a jour majeures sans tests suffisants, cassant le projet silencieusement.
#tooling#securite#automatisation

replaceOne

MongoDB 🟡 Mid

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.

Anti-pattern : Utiliser replaceOne pour modifier un seul champ, perdant tous les autres champs du document.
#sgbd#interview#database#mongodb

Replica Set

MongoDB 🟡 Mid

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.

Anti-pattern : Deployer un replica set avec un nombre pair de membres sans arbiter, empechant l'election d'un nouveau primary.
#sgbd#interview#database#mongodb

ReplicaSet

DevOps 🟡 Mid

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=5

Cas d'usage : Assurer la haute disponibilité en maintenant le nombre de Pods désiré.

Anti-pattern : Créer un ReplicaSet directement au lieu d'utiliser un Deployment.
#devops#kubernetes

Repository

Architecture 🟡 Mid

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.

Anti-pattern : Repository avec des methodes specifiques a l'ORM qui fuient dans le domaine.
#architecture#interview#ddd#best-practice

Repository Pattern

PHP 🟡 Mid

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.

Anti-pattern : Exposer des methodes query builder dans le repository, fuitant les details de persistence.
#core#interview#architecture

requestAnimationFrame

JavaScript 🟡 Mid

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.

Anti-pattern : Utiliser setInterval pour les animations : desynchronise du rendu, gaspille des frames.
#core#performance#animation

requestIdleCallback

JavaScript 🔴 Senior

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.

#core#performance

Required<T>

TypeScript 🟢 Junior

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.

#core#utility-types

ResizeObserver

JavaScript 🟡 Mid

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.

#core#DOM#responsive

Resource Hints

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Preloader trop de ressources, saturant la bande passante et retardant les ressources critiques.
#performance#frontend

Responsive Design (Tailwind)

Tailwind CSS 🟢 Junior

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.

#styling#interview#tailwind

Responsive Object Syntax

CSS-in-JS 🟡 Mid

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.

#styling#css-in-js

Responsive Prefixes

Tailwind CSS 🟢 Junior

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.

Anti-pattern : Utiliser max-width au lieu de min-width (Tailwind est mobile-first, pas desktop-first).
#styling#interview#tailwind

REST (Richardson Maturity Model)

Architecture 🟡 Mid

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    // Suppression

Cas d'usage : APIs web standard, communication inter-services, APIs publiques.

Anti-pattern : POST /api/getUsers avec le verbe dans l'URL — niveau 0 du modele de Richardson.
#architecture#interview#api

REST/DTO

NestJS 🟢 Junior

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.

Anti-pattern : Utiliser le type any ou l'entite base de donnees directement comme DTO d'entree.
#core#interview

Retry Exponential Backoff

DevOps 🟡 Mid

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.

Anti-pattern : Retry immédiat en boucle : amplifie la surcharge du service déjà en difficulté.
#devops#resilience#interview

Retry Pattern

Architecture 🟢 Junior

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.

Anti-pattern : Retry sans backoff ni limite — bombarder un service deja en difficulte.
#architecture#interview#resilience

Retry Policy

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Retry infini sans backoff exponentiel, causant un effet thundering herd sur le service cible.
#reliability#resilience

ReturnType<T>

TypeScript 🟡 Mid

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.

Anti-pattern : Declarer manuellement un type qui duplique le retour d'une fonction — desynchronisation garantie.
#core#interview#utility-types

Reverse Proxy

DevOps 🟡 Mid

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.

#devops#scaling

Rich Harris

Personalities 🟡 Mid

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).

#personalities#history#interview

Rich Hickey

Personalities 🔴 Senior

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-driven

Cas d'usage : Ses idees sur l'immutabilite et la simplicite ont influence Redux, Immer et la programmation fonctionnelle en JS.

#personalities#history#interview

Richard Stallman

Personalities 🟢 Junior

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.

Anti-pattern : Confondre 'free software' (liberte) et 'open source' (methode) — Stallman insiste sur la distinction.
#personalities#history#interview

Rob Pike

Personalities 🟡 Mid

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.

#personalities#history#interview

Robert C. Martin (Uncle Bob)

Personalities 🟢 Junior

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'embauche

Cas d'usage : SOLID et Clean Code sont des sujets classiques en entretien. Connaitre ces principes est attendu de tout dev.

Anti-pattern : Appliquer Clean Code de maniere dogmatique : parfois un fichier de 100 lignes est plus clair que 10 fichiers de 10 lignes.
#personalities#history#interview

Robert Griesemer

Personalities 🔴 Senior

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.

#personalities#history#interview

Rolling Update

DevOps 🟡 Mid

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: 0

Cas d'usage : Mise à jour standard des Deployments Kubernetes sans interruption de service.

Anti-pattern : Rolling update avec breaking changes d'API : les anciens et nouveaux Pods sont incompatibles.
#devops#scaling

Rollup

Testing 🟡 Mid

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.

Anti-pattern : Utiliser Rollup pour une app complete au lieu de Vite qui l'integre avec un dev server en plus.
#build#tooling#librairie

Route Groups

React 🟡 Mid

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 dashboard

Cas d'usage : Separer les layouts (public vs dashboard) ou organiser le code sans impacter les URLs.

#nextjs#routing

RTK Query

React 🟡 Mid

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.

#state#data-fetching

Runtime vs Zero-Runtime CSS-in-JS

CSS-in-JS 🔴 Senior

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 .css

Cas d'usage : Choisir zero-runtime pour les apps critiques en performance, runtime pour la flexibilite.

Anti-pattern : Utiliser du runtime CSS-in-JS dans une app avec des metriques Core Web Vitals strictes.
#styling#interview#css-in-js

Ryan Dahl

Personalities 🟢 Junior

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 — revolution

Cas d'usage : Node.js est incontournable en dev web full-stack. Deno est son successeur avec TypeScript natif et securite par defaut.

Anti-pattern : Croire que Node.js est monothread : il est single-threaded pour le JS mais utilise un pool de threads pour l'I/O.
#personalities#history#interview

S3 (Simple Storage Service)

DevOps 🟢 Junior

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.

Anti-pattern : Bucket public sans politique : fuite de données sensibles sur Internet.
#devops#cloud

S3-compatible Storage

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Stocker les fichiers uploadés sur le filesystem du serveur applicatif, perdant scalabilité et résilience.
#storage#cloud

Safelist

Tailwind CSS 🟡 Mid

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.

Anti-pattern : Mettre trop de classes en safelist au lieu de refactorer le code pour utiliser des classes completes.
#styling#tailwind

Saga

Architecture 🔴 Senior

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 inverse

Cas d'usage : Transactions multi-services dans les microservices (commande, paiement, livraison).

Anti-pattern : Transactions distribuees 2PC qui verrouillent les ressources trop longtemps.
#architecture#interview#microservices#distributed

Saga Pattern avec Temporal

Advanced Ecosystem 🔴 Senior

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é.

Anti-pattern : Oublier d'enregistrer les compensations ou les exécuter dans le mauvais ordre.
#architecture#reliability#distributed

Sam Altman

Personalities 🟢 Junior

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.

Anti-pattern : Croire que l'IA va remplacer les devs : elle augmente la productivite mais ne remplace pas la reflexion.
#personalities#history#interview

Sam Newman

Personalities 🔴 Senior

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 independant

Cas d'usage : Comprendre quand et comment passer aux microservices — et surtout quand ne PAS le faire.

#personalities#history#interview

SAML

Advanced Ecosystem 🔴 Senior

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.

Anti-pattern : Choisir SAML pour une nouvelle app grand public alors qu'OpenID Connect est plus simple et moderne.
#security#authentication#enterprise

sanitize_* Functions

WordPress 🟢 Junior

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.

Anti-pattern : Utiliser sanitize_text_field sur du HTML riche (il supprime toutes les balises).
#core#interview#security#wordpress

Sara Soueidan

Personalities 🔴 Senior

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.

#personalities#history#interview

Sarah Drasner

Personalities 🟡 Mid

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.

#personalities#history#interview

Sass Maps

Sass 🟡 Mid

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.

#styling#interview#sass

satisfies operator

TypeScript 🟡 Mid

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 Colors

Cas d'usage : Valider une configuration tout en gardant l'autocompletion sur les cles et valeurs exactes.

Anti-pattern : Utiliser un type annotation qui elargit le type et perd l'autocompletion sur les cles specifiques.
#core#interview#ts5

Satya Nadella

Personalities 🟡 Mid

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 Source

Cas d'usage : Comprendre la transformation digitale d'une entreprise et l'importance strategique du cloud et de l'IA.

#personalities#history#interview

ScheduleModule

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser setInterval natif au lieu de @nestjs/schedule, perdant le contexte DI.
#core

Schema

Mongoose 🟢 Junior

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.

Anti-pattern : Definir tous les champs comme Mixed ou SchemaTypes.Mixed, perdant tout l'interet de la validation.
#sgbd#interview#database#mongoose

Schema Patterns

MongoDB 🔴 Senior

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.

#sgbd#interview#database#mongodb

Schema Validation

MongoDB 🟡 Mid

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.

Anti-pattern : Mettre la validation en mode strict sur une collection existante sans migrer les documents non conformes.
#sgbd#interview#database#mongodb

SchemaType Options

Mongoose 🟢 Junior

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.

#sgbd#interview#database#mongoose

Scope Chain

JavaScript 🟡 Mid

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.

#core#interview#fondamental

Screaming Architecture

Architecture 🟡 Mid

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 metier

Cas d'usage : Rendre le code navigable par concept metier plutot que par pattern technique.

Anti-pattern : Dossiers par type technique (controllers, services, models) qui cachent le domaine.
#architecture#interview#best-practice

Screen Reader

HTML / CSS 🟢 Junior

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.

Anti-pattern : Ne jamais tester avec un lecteur d'écran et se fier uniquement aux audits automatisés.
#core#accessibility

Scroll Snap

HTML / CSS 🟡 Mid

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.

Anti-pattern : Utiliser scroll-snap-type: mandatory sur du contenu vertical long qui empêche le scroll libre.
#core#interview

Scroll-driven Animations

HTML / CSS 🔴 Senior

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.

#performance#interview

Sebastian McKenzie

Personalities 🔴 Senior

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.

#personalities#history#interview

Secret (K8s)

DevOps 🟡 Mid

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.

Anti-pattern : Croire que base64 = chiffrement. Activer le chiffrement at-rest etcd.
#devops#kubernetes#sécurité

Secret Management

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Mettre les secrets dans les variables d'environnement sans chiffrement ni contrôle d'accès.
#security#devops

Security Group

DevOps 🟡 Mid

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.

Anti-pattern : Ingress 0.0.0.0/0 sur le port 5432 : la base PostgreSQL est ouverte au monde.
#devops#cloud#sécurité

Seeding

NestJS 🟡 Mid

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.

Anti-pattern : Seeder en production sans verifier si les donnees existent deja, causant des doublons.
#database

select()

Mongoose 🟢 Junior

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.

#sgbd#interview#database#mongoose

Semantic HTML

HTML / CSS 🟢 Junior

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.

Anti-pattern : Utiliser uniquement des <div> et <span> pour structurer toute la page (divitis).
#core#interview#accessibility#seo

Semantic Release

Testing 🟡 Mid

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: => major

Cas d'usage : Pour les librairies publiees sur npm qui veulent un versioning 100% automatise et fiable.

Anti-pattern : Utiliser semantic-release sans conventional commits, rendant l'analyse des changements impossible.
#tooling#automatisation#ci

SemVer (Semantic Versioning)

DevOps 🟢 Junior

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.0

Cas d'usage : Communiquer clairement l'impact d'une mise à jour aux consommateurs d'une lib/API.

Anti-pattern : Publier des breaking changes en minor : les utilisateurs cassent leur code en mettant à jour.
#devops#cicd#interview

Separation of Concerns

Architecture 🟢 Junior

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.

Anti-pattern : Composant qui fait requete HTTP + validation + logique metier + rendu HTML.
#architecture#interview#principle

Sergey Brin

Personalities 🟡 Mid

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 Data

Cas d'usage : Comprendre l'echelle de Google et les bases du traitement distribue des donnees (MapReduce, Big Data).

#personalities#history#interview

Serial / UUID

PostgreSQL 🟢 Junior

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.

Anti-pattern : Exposer des ids SERIAL dans les URLs publiques, permettant l'enumeration des ressources.
#sgbd#interview#database#postgresql

Serialization

NestJS 🟡 Mid

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.

Anti-pattern : Retourner les entites brutes de la base de donnees sans filtrer les champs sensibles.
#core#security#interview

Server Actions

React 🟡 Mid

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.

#rendering#react19#nextjs

Server-Sent Events (SSE)

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Utiliser SSE quand le client doit aussi envoyer fréquemment des données au serveur.
#real-time#networking

Server-side Validation

React 🟡 Mid

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.

Anti-pattern : Se reposer uniquement sur la validation client, exposant l'app a des donnees malformees.
#forms#security#bestpractice

Serverless

Architecture 🟡 Mid

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.

Anti-pattern : Cold start ignore pour des APIs a faible latence — pas adapte aux appels synchrones critiques.
#architecture#interview#cloud

Serverless

DevOps 🟡 Mid

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.

Anti-pattern : Serverless pour un service à trafic constant élevé : cold starts + coût supérieur à un serveur dédié.
#devops#cloud#interview

Service

NestJS 🟢 Junior

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.

Anti-pattern : Acceder directement au repository depuis le controller en bypassant le service.
#core#interview

Service (K8s)

DevOps 🟡 Mid

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: ClusterIP

Cas d'usage : Permettre la communication inter-services sans connaître les IPs éphémères des Pods.

Anti-pattern : Exposer tous les services en LoadBalancer : coûteux et inutile pour le trafic interne.
#devops#kubernetes#interview

Service Container

PHP 🟡 Mid

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 automatiquement

Cas d'usage : Dans tout framework PHP moderne pour gerer les dependances et leur cycle de vie.

Anti-pattern : Acceder au container partout (Service Locator) au lieu de laisser l'injection de dependances faire son travail.
#core#interview#architecture

Service Locator

Architecture 🟡 Mid

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.

Anti-pattern : Ce pattern EST l'anti-pattern : dependances cachees, tests difficiles, couplage au locator.
#architecture#interview#anti-pattern

Service Workers

JavaScript 🔴 Senior

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.

Anti-pattern : Cacher agressivement sans strategie d'invalidation, affichant des donnees perimees a l'infini.
#core#PWA#performance#navigateur

Session Fixation

PHP 🟡 Mid

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).

Anti-pattern : Ne pas regenerer l'ID de session apres le login.
#interview#security

Session vs Token Auth

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Stocker des JWT dans localStorage (vulnérable XSS) au lieu de cookies httpOnly.
#security#authentication#architecture

Set

JavaScript 🟢 Junior

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).

#core#ES6#performance

shadcn/ui

Tailwind CSS 🟡 Mid

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.

#styling#interview#tailwind

Shadow DOM

HTML / CSS 🔴 Senior

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.

Anti-pattern : Utiliser le Shadow DOM pour un simple bouton quand une classe CSS suffirait.
#core#interview

Shard Key

MongoDB 🔴 Senior

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.

Anti-pattern : Choisir une shard key monotone comme _id ou createdAt, concentrant toutes les ecritures sur un seul shard.
#sgbd#interview#database#mongodb

Sharding

DevOps 🔴 Senior

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.

Anti-pattern : Mauvaise shard key (date) : un shard reçoit tout le trafic récent (hotspot).
#devops#database#interview

Sharding (Hashed vs Range)

MongoDB 🔴 Senior

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.

#sgbd#interview#database#mongodb

Shared Config Packages

Advanced Ecosystem 🟡 Mid

Packages monorepo contenant les configurations partagées (ESLint, TSConfig, Prettier, Tailwind). Centralisent les standards du projet en un seul endroit.

Un cahier des charges commun à tous les chantiers d'un groupe de construction.

// packages/eslint-config/index.js
module.exports = {
  extends: ['next', 'prettier'],
  rules: { 'no-console': 'warn' },
};
// apps/web/.eslintrc.js
module.exports = { extends: ['@myorg/eslint-config'] };

Cas d'usage : Garantir une configuration homogène de linting, formatting et compilation dans tout le monorepo.

Anti-pattern : Dupliquer les fichiers de config dans chaque app du monorepo, créant des incohérences.
#monorepo#tooling#best-practice

Shared Kernel

Architecture 🔴 Senior

Partie de code ou de modele partagee entre deux Bounded Contexts. Changee uniquement par accord mutuel des deux equipes.

Un mur mitoyen entre deux maisons : les deux proprietaires doivent se mettre d'accord avant de le modifier.

// shared-kernel/
//   types/Money.ts       - Partage entre Sales et Billing
//   types/CustomerId.ts  - ID commun
// Tout changement necessite accord des deux equipes

Cas d'usage : Partager des value objects ou des types communs entre deux contextes collaboratifs.

Anti-pattern : Shared kernel qui grossit et devient un monolithe deguise.
#architecture#interview#ddd

SharedArrayBuffer

JavaScript 🔴 Senior

ArrayBuffer partageable entre le thread principal et les Web Workers. Permet la memoire partagee mais necessite des Atomics pour eviter les race conditions.

Un tableau blanc partage entre collegues : tout le monde peut ecrire dessus, mais il faut un protocole pour ne pas se marcher dessus.

const sab = new SharedArrayBuffer(1024);
const arr = new Int32Array(sab);
// Envoyer au worker
worker.postMessage(sab);
// Dans le worker : meme memoire

Cas d'usage : Calculs paralleles lourds entre workers, applications temps reel, WASM multithread.

Anti-pattern : Lire/ecrire sans Atomics : race conditions et donnees corrompues.
#core#avance#performance

SharedWorker

JavaScript 🔴 Senior

Worker partage entre plusieurs contextes de navigation (onglets, iframes) de la meme origine. Communique via des ports MessagePort. Un seul thread pour tous les onglets.

Un serveur de chat partage : tous les onglets du meme site se connectent au meme salon.

// shared.js
onconnect = (e) => {
  const port = e.ports[0];
  port.onmessage = (ev) => {
    port.postMessage(`Echo: ${ev.data}`);
  };
};
// page.js
const sw = new SharedWorker('shared.js');
sw.port.postMessage('hello');

Cas d'usage : Etat partage entre onglets, connexion WebSocket unique, cache multi-onglets.

#core#avance#navigateur

shouldForwardProp

Styled-Components 🔴 Senior

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.

#styling#css-in-js

Side Effect

JavaScript 🟢 Junior

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.

#core#fonctionnel#principe

Side Effects in Modules

JavaScript 🔴 Senior

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 total

Cas d'usage : Declarer correctement sideEffects pour permettre un tree shaking optimal par le bundler.

Anti-pattern : Mettre sideEffects: false quand le module a vraiment des effets de bord (CSS, polyfills).
#core#modules#performance

Sidecar

Architecture 🔴 Senior

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.

Anti-pattern : Mettre trop de logique dans le sidecar — il doit rester un helper transparent.
#architecture#interview#microservices#cloud

Signals

React 🔴 Senior

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.

#state#advanced#future

Signed Commits

DevOps 🟡 Mid

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-signature

Cas d'usage : Prouver l'authenticité des commits dans les projets critiques et open source.

#devops#git#sécurité

Sindre Sorhus

Personalities 🔴 Senior

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.

#personalities#history#interview

Single Field Index

MongoDB 🟢 Junior

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 = descendant

Cas d'usage : Optimiser les requetes frequentes sur un champ comme email, username ou createdAt.

Anti-pattern : Creer un index sur chaque champ : chaque index ralentit les ecritures et consomme de la memoire.
#sgbd#interview#database#mongodb

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.

Anti-pattern : La God Class de 2000 lignes qui gere les donnees, l'affichage, les emails et les logs.
#core#interview#solid

Singleton

Architecture 🟢 Junior

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.

Anti-pattern : Etat global cache qui rend les tests unitaires impossibles et cree du couplage fort.
#architecture#interview#gof#creational

Singleton Pattern

PHP 🟢 Junior

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.

Anti-pattern : Utiliser des singletons partout au lieu de l'injection de dependances, rendant les tests impossibles.
#core#interview#pattern

Skip Navigation

HTML / CSS 🟢 Junior

Lien caché visuellement qui permet aux utilisateurs clavier de sauter directement au contenu principal. Il apparaît au premier Tab et évite de traverser tout le menu de navigation.

Comme un ascenseur express qui mène directement au bon étage sans s'arrêter à chaque palier.

<a href="#main" class="skip-link">Aller au contenu</a>
<nav><!-- ... menu --></nav>
<main id="main"><!-- contenu --></main>
<style>
.skip-link:not(:focus) { position: absolute; left: -9999px; }
</style>

Cas d'usage : Sur toute page ayant une navigation significative pour respecter le critère WCAG 2.4.1.

#accessibility#bestpractice

SLA / SLO / SLI

DevOps 🟡 Mid

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'erreur

Cas d'usage : Définir des objectifs de fiabilité et savoir quand investir en stabilité vs features.

Anti-pattern : SLA plus strict que le SLO : on promet plus qu'on ne vise.
#devops#monitoring#interview

Slot

HTML / CSS 🟡 Mid

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é.

#core

Slot Pattern

React 🟡 Mid

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).

#patterns#composition

SMACSS

Sass 🔴 Senior

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).

#styling#sass

Smoke Test

Testing 🟢 Junior

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.

Anti-pattern : Considerer les smoke tests comme suffisants et ne pas ecrire de tests plus approfondis.
#testing#devops#deployment

Snapshot Test

Testing 🟢 Junior

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.

Anti-pattern : Mettre a jour les snapshots en masse sans les relire (--update), ce qui valide des regressions sans le savoir.
#testing#frontend#react

SOA (Service-Oriented Architecture)

Architecture 🟡 Mid

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.

Anti-pattern : ESB qui devient un point central de logique metier — bottleneck organisationnel.
#architecture#interview#architecture-style

Socket.io (Rooms & Namespaces)

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Broadcaster à tous les clients au lieu d'utiliser les rooms, surchargeant le réseau inutilement.
#real-time#networking

SOLID

Architecture 🟢 Junior

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 concretions

Cas d'usage : Guide de design pour ecrire du code flexible, testable et maintenable.

Anti-pattern : God class qui fait tout — viole le S, et par effet domino tous les autres principes.
#architecture#interview#principle#best-practice

Solomon Hykes

Personalities 🟡 Mid

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.

#personalities#history#interview

SonarQube

Testing 🟡 Mid

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 bugs

Cas d'usage : Pour suivre la qualite du code en continu et bloquer les PR qui degradent les metriques definies.

Anti-pattern : Configurer SonarQube mais ignorer ses alertes systematiquement, le rendant inutile.
#qualite#tooling#ci

sort

MongoDB 🟢 Junior

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.

Anti-pattern : Trier sur un champ non indexe avec des millions de documents, provoquant un sort en memoire tres lent.
#sgbd#interview#database#mongodb

Source Maps

Testing 🟡 Mid

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 place

Cas d'usage : Pour debugger les erreurs en production avec les numeros de ligne et fichiers originaux.

Anti-pattern : Servir les source maps publiquement en production, exposant le code source aux utilisateurs.
#build#debug#securite

Space (Spacing)

Tailwind CSS 🟢 Junior

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.

Anti-pattern : Utiliser space-* quand gap est disponible (gap est plus fiable avec flex/grid).
#styling#tailwind

Sparse Index

MongoDB 🟡 Mid

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.

#sgbd#interview#database#mongodb

Specification

Architecture 🔴 Senior

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.

Anti-pattern : Dupliquer les regles metier dans le repository, le service et le controleur.
#architecture#interview#ddd

Spread / Rest

JavaScript 🟢 Junior

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.

Anti-pattern : Croire que spread fait une copie profonde (deep clone) : les objets imbriques restent par reference.
#core#ES6#syntaxe

Sprinkles (Vanilla Extract)

CSS-in-JS 🔴 Senior

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.

#styling#css-in-js

SQL Injection

PHP 🟢 Junior

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.

Anti-pattern : Concatener des variables directement dans les requetes SQL, meme 'juste pour un admin'.
#core#interview#security

SSE

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser WebSocket quand un flux unidirectionnel SSE suffit.
#communication

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.

Anti-pattern : Utiliser SSG pour du contenu tres dynamique necessitant des rebuilds frequents.
#rendering#interview#performance

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).

Anti-pattern : Faire du SSR pour des pages privees derriere authentification ou le SEO est inutile.
#rendering#interview#architecture

SSR (ServerStyleSheet)

Styled-Components 🔴 Senior

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.

#styling#interview#css-in-js

Stage (CI/CD)

DevOps 🟢 Junior

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 build

Cas d'usage : Organiser le pipeline pour fail fast : pas de deploy si les tests échouent.

#devops#cicd

State

React 🟢 Junior

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).

Anti-pattern : Muter le state directement (state.push()) au lieu d'utiliser le setter avec une nouvelle reference.
#core#interview#fundamentals

State

Architecture 🟡 Mid

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.

Anti-pattern : Gros switch/case sur l'etat au lieu d'encapsuler le comportement dans des classes d'etat.
#architecture#interview#gof#behavioral

State Machine (XState)

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Gérer des états complexes avec des booléens multiples (isLoading && !isError && isSubmitted).
#architecture#state-management

State Reducer Pattern

React 🔴 Senior

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.

#patterns#advanced

State Variants (hover/focus/active)

Tailwind CSS 🟢 Junior

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.

#styling#interview#tailwind

Statechart

Advanced Ecosystem 🔴 Senior

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).

#architecture#state-management

StatefulSet

DevOps 🔴 Senior

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).

Anti-pattern : Utiliser un StatefulSet pour une API stateless : surcomplication inutile.
#devops#kubernetes#interview

Statics vs Methods

Mongoose 🟡 Mid

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.

#sgbd#interview#database#mongoose

Steve Jobs

Personalities 🟢 Junior

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.

Anti-pattern : Croire que Jobs etait developpeur : son genie etait dans la vision produit, pas dans le code.
#personalities#history#interview

Steve Wozniak

Personalities 🟡 Mid

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.

#personalities#history#interview

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.

Anti-pattern : Utiliser stopPropagation partout, cassant l'event delegation et le tracking analytics.
#core#DOM

Stored Procedures / Functions

PostgreSQL 🟡 Mid

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.

Anti-pattern : Mettre toute la logique applicative en procedures stockees, rendant le debug et les tests tres difficiles.
#sgbd#interview#database#postgresql

Storybook

React 🟡 Mid

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.

#testing#documentation#design-system

Storybook

Testing 🟡 Mid

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.

Anti-pattern : Ecrire des stories sans les maintenir, creant un catalogue obsolete et trompeur.
#testing#tooling#design-system

Strangler Fig

Architecture 🟡 Mid

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.

Anti-pattern : Reecriture complete (big-bang) — projet risque qui echoue souvent.
#architecture#interview#migration

Strategy

Architecture 🟢 Junior

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.

Anti-pattern : if/else ou switch sur le type d'algorithme eparpilles dans tout le code.
#architecture#interview#gof#behavioral

Strategy Pattern

PHP 🟡 Mid

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.

Anti-pattern : Utiliser des switch/case ou des if/else pour choisir l'algorithme inline.
#core#interview#pattern

Streaming HLS/DASH

Advanced Ecosystem 🔴 Senior

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.

Anti-pattern : Servir des fichiers vidéo MP4 complets au lieu de streams adaptatifs, causant buffering sur connexions lentes.
#media#streaming

Streaming SSR

React 🔴 Senior

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.

#rendering#performance#advanced

Streams API

JavaScript 🔴 Senior

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.

#core#avance#performance

Stress Test

Testing 🔴 Senior

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.

Anti-pattern : Lancer un stress test directement en production sans prevenir l'equipe ops ni avoir de plan de rollback.
#testing#performance#senior

Strict Mode

JavaScript 🟢 Junior

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; } // undefined

Cas d'usage : Actif par defaut dans les modules ESM et les classes. Attrape les erreurs silencieuses tot.

#core#fondamental

Strict Mode Flags

TypeScript 🟡 Mid

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.

Anti-pattern : Desactiver strict pour faire compiler du code existant — repousse la dette technique en la multipliant.
#core#best-practice#tooling

StrictMode

React 🟢 Junior

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 bugs

Cas d'usage : Activer en developpement pour detecter les effets de bord, les API depreciees et les problemes de cleanup.

#core#debugging

Structural Typing

TypeScript 🟡 Mid

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 y

Cas d'usage : Permet l'interoperabilite entre modules sans couplage fort sur les noms de types.

Anti-pattern : Supposer que deux types avec le meme nom sont identiques — c'est la structure qui compte, pas le nom.
#core#interview#type-system

Structured Clone

JavaScript 🟡 Mid

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 inchange

Cas d'usage : Deep clone d'etats complexes, transfert de donnees entre workers, copie d'objets avec types speciaux.

Anti-pattern : Utiliser JSON.parse(JSON.stringify(obj)) qui perd les Date, Map, Set, undefined et les fonctions.
#core#ES2022#performance

structuredClone vs JSON

JavaScript 🟡 Mid

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.

#core#best-practice

Style Dictionary

CSS-in-JS 🔴 Senior

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.

#styling#css-in-js

styled() / styled.tag

Styled-Components 🟢 Junior

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.

#styling#interview#css-in-js

Stylelint

CSS-in-JS 🟡 Mid

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.

#styling#css-in-js

StyleSheetManager

Styled-Components 🔴 Senior

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.

#styling#css-in-js

Subgrid

HTML / CSS 🔴 Senior

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.

#interview

Subquery

PostgreSQL 🟡 Mid

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.

Anti-pattern : Utiliser des sous-requetes correlees dans le SELECT quand un JOIN serait plus performant.
#sgbd#interview#database#postgresql

Sundar Pichai

Personalities 🟡 Mid

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, Opera

Cas d'usage : Chrome et V8 sont au coeur de l'ecosysteme web et JS moderne (Node.js, Electron).

#personalities#history#interview

Supertest

Testing 🟢 Junior

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.

Anti-pattern : Utiliser Supertest pour des tests E2E complets alors qu'il ne teste que la couche HTTP.
#testing#tooling#backend

Suspense

React 🟡 Mid

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.

Anti-pattern : Entourer chaque composant avec Suspense individuellement au lieu de regrouper les limites logiques.
#core#interview#performance

Swagger/OpenAPI

NestJS 🟡 Mid

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.

Anti-pattern : Maintenir une documentation API manuelle qui se desynchronise du code.
#core#interview

SWC

Testing 🟡 Mid

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.

Anti-pattern : Migrer vers SWC en gardant des plugins Babel custom non portables, causant des incompatibilites.
#build#tooling#performance

SWR

React 🟡 Mid

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.

#data-fetching#ecosystem

Symbol

JavaScript 🟡 Mid

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.

#core#ES6#avance

Tab Index & Focus

HTML / CSS 🟡 Mid

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.

Anti-pattern : Utiliser tabindex > 0 qui casse l'ordre naturel de navigation et crée une UX imprévisible.
#core#interview#accessibility

Table

PostgreSQL 🟢 Junior

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.

Anti-pattern : Creer une table avec des centaines de colonnes au lieu de normaliser en plusieurs tables.
#sgbd#interview#database#postgresql

Tagged Template Literals

Styled-Components 🟡 Mid

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.

#styling#interview#css-in-js

Tagged Templates

JavaScript 🔴 Senior

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.

#core#avance#pattern

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.

#core#pattern#architecture

Tailwind Merge (tw-merge)

Tailwind CSS 🟡 Mid

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.

#styling#interview#tailwind

Tailwind Motion

Tailwind CSS 🟡 Mid

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.

#styling#tailwind

tailwind.config.js

Tailwind CSS 🟡 Mid

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.

Anti-pattern : Modifier le theme de base au lieu d'utiliser extend, ce qui ecrase les valeurs par defaut.
#styling#interview#tailwind

TanStack Query

React 🟡 Mid

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.

Anti-pattern : Stocker le resultat de useQuery dans un useState local, duplicant l'etat et perdant le cache.
#data-fetching#interview#ecosystem

Task Queue

JavaScript 🟡 Mid

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 videes

Cas d'usage : Decomposer un traitement lourd en petits morceaux via setTimeout pour ne pas bloquer le thread principal.

#core#async

Taylor Otwell

Personalities 🟡 Mid

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.

#personalities#history#interview

TDD

Testing 🟡 Mid

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 casser

Cas d'usage : Pour le code metier complexe (algorithmes, regles de gestion) ou le design emerge naturellement des tests.

Anti-pattern : Appliquer TDD dogmatiquement a du code CRUD simple ou l'overhead n'apporte aucune valeur.
#testing#interview#methode

Tell, Don't Ask

Architecture 🟡 Mid

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 interne

Cas d'usage : Eliminer les Anemic Domain Models en mettant la logique dans les objets du domaine.

Anti-pattern : Getters/setters partout avec la logique metier dans les services.
#architecture#interview#principle

Template Hierarchy

WordPress 🟡 Mid

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.php

Cas d'usage : Pour comprendre quel fichier template sera utilise et ou placer ses customisations.

Anti-pattern : Tout mettre dans index.php avec des if/else au lieu d'utiliser la hierarchie de templates.
#core#interview#wordpress

Template Literal Parsing

TypeScript 🔴 Senior

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.

#advanced#pattern#type-system

Template Literal Types

TypeScript 🔴 Senior

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.

Anti-pattern : Generer des unions trop larges avec des template literals — explosion combinatoire qui ralentit le compilateur.
#advanced#interview#type-system

Template Literals

JavaScript 🟢 Junior

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.

#core#ES6#syntaxe

Template Method

Architecture 🟡 Mid

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.

Anti-pattern : Trop d'etapes abstraites rendant les sous-classes impossible a implementer correctement.
#architecture#interview#gof#behavioral

Temporal Activity

Advanced Ecosystem 🔴 Senior

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.

Anti-pattern : Placer la logique d'Activity directement dans le Workflow, perdant ainsi la capacité de retry granulaire.
#orchestration#reliability

Temporal Dead Zone

JavaScript 🟡 Mid

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.

#core#interview#fondamental

Temporal Query

Advanced Ecosystem 🔴 Senior

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.

#orchestration#observability

Temporal Schedule

Advanced Ecosystem 🟡 Mid

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.

#orchestration#scheduling

Temporal Signal

Advanced Ecosystem 🔴 Senior

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.

#orchestration#async

Temporal Timer

Advanced Ecosystem 🔴 Senior

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.

#orchestration#reliability

Temporal Visibility

Advanced Ecosystem 🔴 Senior

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.

#observability#orchestration

Temporal Worker

Advanced Ecosystem 🔴 Senior

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.

#orchestration#scalability

Temporal Workflow

Advanced Ecosystem 🔴 Senior

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é.

Anti-pattern : Mettre de la logique non-déterministe (Math.random, Date.now) directement dans le workflow au lieu d'utiliser les API Temporal.
#orchestration#reliability#backend

TerminusModule

NestJS 🟡 Mid

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.

Anti-pattern : Retourner toujours 200 sur /health sans verifier reellement l'etat des dependances.
#core

Terraform

DevOps 🟡 Mid

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 apply

Cas d'usage : Gérer toute l'infrastructure cloud de manière versionnée, reproductible et auditable.

Anti-pattern : terraform apply sans plan ni review : modifications non contrôlées en prod.
#devops#iac#interview

Test Diamond

Testing 🟡 Mid

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.

Anti-pattern : Appliquer le diamant a une simple app monolithique ou la pyramide classique est plus adaptee.
#testing#strategie#microservices

Test Double

Testing 🟡 Mid

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.

Anti-pattern : Utiliser des mocks partout y compris pour le code qu'on controle, rendant les tests deconnectes de la realite.
#testing#interview#fondamental

Test Isolation

Testing 🟡 Mid

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 tests

Cas d'usage : Pour garantir que les tests sont reproductibles et peuvent etre executes dans n'importe quel ordre.

Anti-pattern : Utiliser une variable globale partagee entre tests qui accumule de l'etat d'un test a l'autre.
#testing#principle#fondamental

Test Pyramid

Testing 🟢 Junior

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.

Anti-pattern : La pyramide inversee (ice cream cone) : beaucoup de tests manuels/E2E et peu de tests unitaires.
#testing#interview#strategie

Test Trophy

Testing 🟡 Mid

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 investi

Cas d'usage : Pour les applications React/frontend ou les tests d'integration avec Testing Library offrent le meilleur ROI.

Anti-pattern : Ignorer la couche static analysis (TypeScript, ESLint) qui attrape beaucoup de bugs gratuitement.
#testing#strategie#frontend

Testing Library

Testing 🟢 Junior

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.

Anti-pattern : Utiliser container.querySelector au lieu des queries semantiques, perdant tout l'interet de la librairie.
#testing#tooling#react

Text Index

MongoDB 🟡 Mid

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.

Anti-pattern : Utiliser $regex pour la recherche textuelle au lieu du text index, bien plus lent.
#sgbd#interview#database#mongodb

Text Utilities

Tailwind CSS 🟢 Junior

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.

#styling#tailwind

The Loop

WordPress 🟢 Junior

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.

Anti-pattern : Appeler the_post() en dehors d'un while ou oublier wp_reset_postdata() apres une boucle custom.
#core#interview#wordpress

Theme API

WordPress 🟡 Mid

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.

Anti-pattern : Hardcoder des URLs et chemins au lieu d'utiliser les fonctions WordPress (get_template_directory_uri).
#core#interview#wordpress

Theme Extend

Tailwind CSS 🟡 Mid

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.

Anti-pattern : Placer les customisations dans theme au lieu de theme.extend, perdant toutes les valeurs par defaut.
#styling#interview#tailwind

Theme Tokens

CSS-in-JS 🟡 Mid

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.

#styling#interview#css-in-js

theme.json

WordPress 🟡 Mid

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.

Anti-pattern : Dupliquer les variables de style dans theme.json ET dans des feuilles CSS manuelles.
#core#interview#wordpress

ThemeProvider

Styled-Components 🟡 Mid

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.

#styling#interview#css-in-js

Theo Browne

Personalities 🟡 Mid

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@latest

Cas d'usage : Le T3 Stack est une reference pour demarrer un projet TypeScript full-stack rapidement et proprement.

#personalities#history#interview

ThePrimeagen

Personalities 🟡 Mid

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 culte

Cas d'usage : Ses cours sur les algorithmes (Frontend Masters) et ses streams educatifs sont des ressources populaires.

#personalities#history#interview

this keyword

JavaScript 🟡 Mid

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.

Anti-pattern : Passer une methode comme callback sans bind, perdant le contexte this.
#core#interview#fondamental

ThisParameterType<T>

TypeScript 🔴 Senior

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.

#advanced#utility-types

Throttle

JavaScript 🟡 Mid

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.

#core#performance#pattern#interview

Tim Berners-Lee

Personalities 🟢 Junior

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.

Anti-pattern : Confondre Internet (reseau, 1969) et le Web (application sur Internet, 1989).
#personalities#history#interview

Tim O'Reilly

Personalities 🔴 Senior

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 fabrique

Cas d'usage : O'Reilly Media reste une reference pour l'apprentissage technique. Sa plateforme en ligne est utilisee par les entreprises.

#personalities#history#interview

Timestamps

Mongoose 🟢 Junior

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 automatiquement

Cas d'usage : Tracer quand chaque document a ete cree et modifie pour l'audit et le debug.

#sgbd#interview#database#mongoose

TJ Holowaychuk

Personalities 🔴 Senior

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.

#personalities#history#interview

toJSON / toObject Transform

Mongoose 🟡 Mid

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.

#sgbd#interview#database#mongoose

Tony Hoare

Personalities 🔴 Senior

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.

Anti-pattern : Ignorer le probleme de null : TypeScript strict, Optional chaining et Rust Option<T> sont nes pour corriger cette erreur.
#personalities#history#interview

Top-level Await

JavaScript 🟡 Mid

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 ici

Cas d'usage : Charger une configuration ou initialiser une connexion BD au demarrage d'un module ESM.

Anti-pattern : L'utiliser dans un module importe par beaucoup d'autres : ca bloque le chargement de tous les dependants.
#core#ES2022#modules

Trait

PHP 🟡 Mid

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.

Anti-pattern : Abuser des traits pour tout partager au lieu de privilegier la composition ou les interfaces.
#core#interview#oop

Transactional Email

Advanced Ecosystem 🟢 Junior

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é.

Anti-pattern : Envoyer les emails transactionnels via le même domaine/IP que les newsletters marketing.
#communication#backend

Transducer

JavaScript 🔴 Senior

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.

#core#fonctionnel#avance#performance

transform vs top/left

HTML / CSS 🟡 Mid

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.

Anti-pattern : Animer width, height, top ou left au lieu de transform et opacity.
#performance#core#interview

Transient API

WordPress 🟡 Mid

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.

Anti-pattern : Stocker des transients sans expiration (ils ne sont jamais nettoyes automatiquement dans la table options).
#core#interview#wordpress#performance

Transient Props ($prefix)

Styled-Components 🟡 Mid

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.

#styling#interview#css-in-js

Transport Layer

NestJS 🔴 Senior

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.

Anti-pattern : Coupler les services directement via HTTP au lieu d'utiliser un transport asynchrone.
#architecture

Tree Shaking

JavaScript 🟡 Mid

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 bundle

Cas d'usage : Reduire la taille des bundles en production, surtout avec de grosses librairies comme lodash.

Anti-pattern : import * as lib ou re-exports via barrel files qui empechent le tree shaking.
#core#performance#modules

Triggers

PostgreSQL 🟡 Mid

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.

Anti-pattern : Creer des cascades de triggers qui se declenchent mutuellement, rendant le flux imprevisible.
#sgbd#interview#database#postgresql

Triple-Slash Directives

TypeScript 🔴 Senior

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 legacy

Cas d'usage : Inclure des types globaux (DOM, Node) ou referencer des fichiers .d.ts dans des projets sans bundler.

Anti-pattern : Utiliser des triple-slash au lieu d'imports ES modules — methode obsolete dans les projets modernes.
#tooling#legacy

Trunk-Based Development

DevOps 🟡 Mid

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 main

Cas d'usage : Équipes pratiquant le CI/CD avec des déploiements fréquents (plusieurs fois par jour).

Anti-pattern : Branches vivant des semaines : merge hell et conflits géants.
#devops#git#interview

ts-expect-error vs ts-ignore

TypeScript 🟡 Mid

@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.

Anti-pattern : Utiliser ts-ignore pour faire compiler du code — masque les vrais bugs et empeche la detection de regressions.
#best-practice#tooling

tsconfig.json

TypeScript 🟢 Junior

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.

Anti-pattern : Copier un tsconfig generique sans comprendre les options — des conflits subtils emergent.
#core#tooling#beginner

TSDoc

TypeScript 🟢 Junior

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.

Anti-pattern : Documenter chaque ligne triviale — le code devrait etre auto-explicatif, les docs pour les cas complexes.
#tooling#best-practice#beginner

TTFB (Time to First Byte)

Advanced Ecosystem 🟡 Mid

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: < 800ms

Cas d'usage : Diagnostiquer les problèmes de latence serveur (DB lente, absence de cache, serveur éloigné).

Anti-pattern : Ignorer le TTFB élevé en pensant que le CDN suffit, alors que le problème est côté serveur.
#performance#backend

TTL Index

MongoDB 🟡 Mid

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.

Anti-pattern : Mettre un TTL sur une collection importante sans backup, les donnees sont supprimees definitivement.
#sgbd#interview#database#mongodb

Turbopack

Testing 🔴 Senior

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.js

Cas d'usage : Pour les projets Next.js de grande taille ou le dev server Webpack est devenu trop lent.

Anti-pattern : Essayer d'utiliser Turbopack hors de Next.js alors qu'il n'est pas encore un bundler standalone stable.
#build#tooling#performance

Turborepo

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Tout rebuilder à chaque commit sans exploiter le cache distant Turborepo.
#tooling#monorepo#performance

Type Guard

TypeScript 🟡 Mid

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.

Anti-pattern : Ecrire un type guard qui ne verifie pas reellement le type — le compilateur fait confiance au predicat.
#core#interview#safety

Type Inference

TypeScript 🟢 Junior

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 infere

Cas d'usage : Laisser TS inferer les types evidents pour garder le code concis sans perdre la securite.

Anti-pattern : Annoter explicitement chaque variable triviale (const x: number = 5) alourdit le code inutilement.
#core#interview#beginner

Type Narrowing

TypeScript 🟢 Junior

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.

Anti-pattern : Utiliser des cast (as) au lieu de narrowing propre — on perd la verification du compilateur.
#core#interview#type-system

Type Predicate

TypeScript 🟡 Mid

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.

Anti-pattern : Ecrire un predicat incorrect (retourne true mais le type est faux) — le compilateur fait confiance aveugle.
#core#interview#safety

Type Widening

TypeScript 🟡 Mid

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.

Anti-pattern : Utiliser let partout et perdre les types litteraux necessaires pour les discriminated unions.
#core#interview#type-system

Type-level Programming

TypeScript 🔴 Senior

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).

Anti-pattern : Ecrire du type-level programming complexe pour des cas simples — maintenance cauchemardesque.
#advanced#type-system

Type-safe Event Emitter

TypeScript 🔴 Senior

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.

#advanced#pattern#real-world

TypeORM Entity

NestJS 🟡 Mid

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.

Anti-pattern : Ajouter de la logique metier dans l'entite au lieu de la garder comme simple mapping.
#database#interview

TypeORM Migration

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser synchronize: true en production au lieu de migrations versionees.
#database#interview

TypeORM QueryBuilder

NestJS 🔴 Senior

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.

Anti-pattern : Concatener du SQL brut au lieu d'utiliser les parametres bindables, ouvrant la porte aux injections SQL.
#database#interview

TypeORM Relations

NestJS 🟡 Mid

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.

Anti-pattern : Charger les relations en eager par defaut, causant des requetes N+1 massives.
#database#interview

TypeORM Repository

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser le repository directement dans le controller au lieu de passer par un service.
#database#interview

TypeORM Transactions

NestJS 🔴 Senior

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.

Anti-pattern : Effectuer des operations liees sans transaction, risquant un etat incoherent en cas d'erreur.
#database#interview

Ubiquitous Language

Architecture 🟡 Mid

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 code

Cas d'usage : Reduire les malentendus entre devs et metier, rendre le code auto-documentant.

Anti-pattern : Termes techniques dans le code metier (DataManager, Helper, Processor).
#architecture#interview#ddd

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.

Anti-pattern : Utiliser des unions trop larges (string|int|float|array|null) qui perdent tout interet de typage.
#core#interview#php8

Unique Index

MongoDB 🟢 Junior

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.

Anti-pattern : Creer un unique index sur un champ qui contient deja des doublons, l'operation echoue.
#sgbd#interview#database#mongodb

Unit of Work

Architecture 🔴 Senior

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).

Anti-pattern : Sauvegarder chaque entite individuellement sans transactionnalite.
#architecture#interview#ddd

Unit Test

Testing 🟢 Junior

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.

Anti-pattern : Tester les details d'implementation plutot que le comportement observable, rendant les tests fragiles au refactoring.
#testing#interview#fondamental

unknown vs any vs never vs void

TypeScript 🟡 Mid

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.

Anti-pattern : Utiliser any pour 'faire compiler' — masque les bugs au lieu de les prevenir.
#core#interview#safety

updateMany

MongoDB 🟢 Junior

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.

Anti-pattern : Utiliser updateMany sans filtre precis, modifiant accidentellement toute la collection.
#sgbd#interview#database#mongodb

updateOne

MongoDB 🟢 Junior

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.

Anti-pattern : Oublier les operateurs et passer un objet brut, ce qui remplace tout le document (utiliser replaceOne pour ca).
#sgbd#interview#database#mongodb

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).

#utility-types#type-system

use() Hook

React 🟡 Mid

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.

#hooks#react19

useCallback

React 🟡 Mid

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.

Anti-pattern : Utiliser useCallback sans React.memo sur l'enfant : la memoisation ne sert alors a rien.
#hooks#interview#performance

useContext

React 🟢 Junior

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.

Anti-pattern : Mettre trop de donnees dans un seul contexte, causant des re-rendus inutiles de tous les consommateurs.
#hooks#interview#state

useDeferredValue

React 🟡 Mid

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).

Anti-pattern : Utiliser sur des valeurs primitives simples qui ne causent pas de rendu lourd.
#hooks#performance#react18

useEffect

React 🟢 Junior

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 change

Cas d'usage : Appels API, abonnements WebSocket, synchronisation avec le DOM ou des librairies externes.

Anti-pattern : Omettre des dependances pour 'eviter les re-runs', causant des stale closures avec des valeurs perimees.
#hooks#interview#fundamentals

useFormStatus

React 🟡 Mid

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.

Anti-pattern : Utiliser useFormStatus dans le meme composant que le <form> : il doit etre dans un enfant.
#hooks#react19#forms

useId

React 🟢 Junior

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.

Anti-pattern : Utiliser useId pour generer des keys de liste : il n'est pas prevu pour ca.
#hooks#a11y#react18

useImperativeHandle

React 🟡 Mid

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).

Anti-pattern : Abuser de ce pattern pour recreer de la communication parent-enfant imperative au lieu du flux declaratif.
#hooks#advanced

useInsertionEffect

React 🔴 Senior

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.

#hooks#advanced#css

useLayoutEffect

React 🟡 Mid

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.

Anti-pattern : Utiliser useLayoutEffect par defaut au lieu de useEffect, bloquant inutilement le rendu.
#hooks#performance#dom

useMemo

React 🟡 Mid

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' change

Cas d'usage : Calculs couteux (tri, filtrage, transformations) qui ralentissent le rendu si recalcules a chaque fois.

Anti-pattern : Utiliser useMemo partout par defaut : le cout de la memoisation peut depasser celui du recalcul pour des operations simples.
#hooks#interview#performance

useOptimistic

React 🟡 Mid

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.

#hooks#react19#ux

useReducer

React 🟡 Mid

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.

Anti-pattern : Utiliser useReducer pour un simple toggle booleen : useState est plus simple et lisible.
#hooks#interview#state

useRef

React 🟢 Junior

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.

Anti-pattern : Utiliser useRef pour stocker du state qui devrait declencher un re-rendu (utiliser useState a la place).
#hooks#interview#dom

useState

React 🟢 Junior

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.

Anti-pattern : Appeler le setter dans le corps du composant sans condition, causant une boucle infinie de re-rendus.
#hooks#interview#fundamentals

useSyncExternalStore

React 🔴 Senior

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).

#hooks#advanced#react18

useTransition

React 🟡 Mid

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 calcul

Cas d'usage : Filtrage de longues listes, navigation entre onglets, tout ce qui peut bloquer l'interface.

Anti-pattern : Envelopper des mises a jour urgentes (saisie de texte) dans startTransition, rendant l'input laggy.
#hooks#interview#performance#react18

Utility-First

Tailwind CSS 🟢 Junior

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.

Anti-pattern : Creer des classes semantiques pour tout (.card-title) au lieu d'utiliser les utilitaires directement.
#styling#interview#tailwind

Utility-first/Tailwind

HTML / CSS 🟡 Mid

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.

Anti-pattern : Écrire des dizaines de classes sur chaque élément sans extraire les composants réutilisables.
#core#interview

V8 Hidden Classes

JavaScript 🔴 Senior

Structure interne de V8 pour optimiser l'acces aux proprietes. Les objets avec la meme forme (memes proprietes, meme ordre) partagent une hidden class, permettant un acces rapide.

Des formulaires pre-imprimes identiques : si tout le monde remplit les memes champs dans le meme ordre, le traitement est ultra rapide.

// Meme hidden class (optimise)
function Point(x, y) { this.x = x; this.y = y; }
const p1 = new Point(1, 2);
const p2 = new Point(3, 4);
// Hidden class differente (desoptimise)
const a = {}; a.x = 1; a.y = 2;
const b = {}; b.y = 2; b.x = 1; // ordre different!

Cas d'usage : Ecrire du code monomorphique pour maximiser les optimisations JIT de V8.

Anti-pattern : Ajouter des proprietes dynamiquement dans un ordre different ou supprimer des proprietes avec delete.
#core#engine#performance

VACUUM / ANALYZE

PostgreSQL 🔴 Senior

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.

Anti-pattern : Desactiver autovacuum pour 'gagner en perf', causant un bloat progressif de la table.
#sgbd#interview#database#postgresql

Valtio

React 🟡 Mid

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.

#state#ecosystem

Value Object

Architecture 🟡 Mid

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.

Anti-pattern : Value object mutable — perd sa garantie d'egalite structurelle et d'immutabilite.
#architecture#interview#ddd

Vanilla Extract

CSS-in-JS 🔴 Senior

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.

#styling#interview#css-in-js

Variables ($var)

Sass 🟢 Junior

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.

Anti-pattern : Utiliser des variables Sass pour des valeurs qui devraient etre des CSS custom properties (dynamiques au runtime).
#styling#interview#sass

Variadic Tuple Types

TypeScript 🔴 Senior

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.

#advanced#type-system

Variance Annotations (in/out)

TypeScript 🔴 Senior

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.

#advanced#type-system

Versioning

NestJS 🟡 Mid

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.

Anti-pattern : Modifier les endpoints existants sans versioning, cassant les clients en production.
#core

Vertical Slice Architecture

Architecture 🟡 Mid

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       - tests

Cas d'usage : Equipes feature qui veulent minimiser les conflits de merge et le couplage inter-features.

Anti-pattern : Partager trop de code entre slices — revient a creer des couches deguisees.
#architecture#interview#architecture-style

View Transitions

HTML / CSS 🔴 Senior

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.

#interview

Views / Materialized Views

PostgreSQL 🟡 Mid

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.

Anti-pattern : Oublier de rafraichir la materialized view, affichant des donnees obsoletes.
#sgbd#interview#database#postgresql

Vint Cerf

Personalities 🟡 Mid

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.

#personalities#history#interview

Virtual DOM

React 🟢 Junior

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 DOM

Cas d'usage : Mecanisme interne qui optimise les mises a jour du DOM sans intervention manuelle.

Anti-pattern : Manipuler le DOM directement avec document.querySelector au lieu de laisser React gerer.
#core#interview#performance

Virtual Populate

Mongoose 🔴 Senior

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.

#sgbd#interview#database#mongoose

Virtual Properties

Mongoose 🟡 Mid

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.

Anti-pattern : Oublier { toJSON: { virtuals: true } } dans le schema, les virtuals n'apparaissent pas dans les reponses API.
#sgbd#interview#database#mongoose

Virtualization

React 🟡 Mid

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 10000

Cas d'usage : Listes ou tableaux de plus de quelques centaines d'elements (logs, contacts, produits).

Anti-pattern : Virtualiser une liste de 20 elements : l'overhead de la virtualisation n'en vaut pas la peine.
#performance#interview

Visitor

Architecture 🔴 Senior

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.

Anti-pattern : Ajouter de nouveaux types de noeuds frequemment — le visitor doit etre modifie a chaque fois.
#architecture#interview#gof#behavioral

Visual Regression

Testing 🟡 Mid

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=xxx

Cas d'usage : Pour les design systems et applications ou la coherence visuelle pixel-perfect est critique.

Anti-pattern : Se fier uniquement aux snapshot tests DOM qui ne detectent pas les regressions CSS pures.
#testing#frontend#design-system

Vite

Testing 🟢 Junior

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.

Anti-pattern : Surcharger Vite avec des plugins Webpack portabilises au lieu d'utiliser les alternatives natives Vite.
#build#tooling#moderne

Vitest

Testing 🟢 Junior

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.

Anti-pattern : Migrer un gros projet Jest vers Vitest juste pour la performance sans evaluer les incompatibilites.
#testing#tooling#moderne

volta

Testing 🟢 Junior

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.

Anti-pattern : Utiliser la version Node.js systeme globale, causant des bugs 'ca marche chez moi' entre devs.
#dx#tooling#node

VPC (Virtual Private Cloud)

DevOps 🟡 Mid

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.

Anti-pattern : Tout mettre dans un sous-réseau public : la base de données est exposée à Internet.
#devops#cloud

WAI-ARIA Patterns

HTML / CSS 🟡 Mid

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.

#interview#accessibility

WAL (Write-Ahead Log)

PostgreSQL 🔴 Senior

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.

#sgbd#interview#database#postgresql

Ward Cunningham

Personalities 🔴 Senior

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'ecrasent

Cas d'usage : Le concept de dette technique est utilise quotidiennement en gestion de projet et en planning technique.

#personalities#history#interview

WeakMap

JavaScript 🔴 Senior

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-ee

Cas d'usage : Stocker des metadonnees privees sur des objets sans empecher leur garbage collection.

Anti-pattern : Essayer d'iterer une WeakMap ou compter ses elements (impossible by design).
#core#ES6#avance#performance

WeakRef

JavaScript 🔴 Senior

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.

Anti-pattern : Utiliser WeakRef pour la logique metier critique : le timing du GC est non-deterministe.
#core#avance#ES2021

WeakSet

JavaScript 🔴 Senior

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.

#core#ES6#avance

Web Sockets API

JavaScript 🟡 Mid

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.

Anti-pattern : Utiliser WebSocket pour des requetes request/response classiques ou REST suffit.
#core#async#navigateur

Web Workers

JavaScript 🟡 Mid

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.

Anti-pattern : Creer un worker pour chaque petite operation : le cout de creation et de communication depasse le gain.
#core#performance#navigateur

Webpack

Testing 🟡 Mid

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.

Anti-pattern : Demarrer un nouveau projet avec Webpack alors que Vite offre une meilleure DX et des performances superieures.
#build#tooling#bundler

WebRTC

Advanced Ecosystem 🔴 Senior

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.

Anti-pattern : Ignorer le serveur TURN de fallback, rendant la connexion impossible derrière certains NAT.
#real-time#p2p#media

WebSocket

Advanced Ecosystem 🟡 Mid

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.

Anti-pattern : Utiliser WebSocket pour des requêtes simples request/response où HTTP suffirait.
#real-time#networking

WebSocket Gateway

NestJS 🟡 Mid

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.

Anti-pattern : Utiliser du polling HTTP pour des fonctionnalites temps reel au lieu de WebSocket.
#communication#interview

Werner Vogels

Personalities 🔴 Senior

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 engineering

Cas d'usage : Comprendre la philosophie AWS et les principes de conception pour des systemes distribues resilients.

#personalities#history#interview

Wes Bos

Personalities 🟡 Mid

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 construisant

Cas d'usage : Ses cours gratuits et payants sont des references pour apprendre JavaScript et React de facon pratique.

#personalities#history#interview

Whitfield Diffie

Personalities 🔴 Senior

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 transmettre

Cas d'usage : Diffie-Hellman est a la base de HTTPS. Comprendre ce principe est essentiel pour la securite web.

#personalities#history#interview

why-did-you-render

React 🟡 Mid

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.

#performance#devtools#debugging

Width & Height

Tailwind CSS 🟢 Junior

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.

#styling#tailwind

Wildcard Index

MongoDB 🔴 Senior

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.

Anti-pattern : Utiliser un wildcard index comme remplacement de compound index, il ne supporte pas les tris multi-champs.
#sgbd#interview#database#mongodb

will-change

HTML / CSS 🟡 Mid

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.

Anti-pattern : Mettre will-change sur tous les éléments ou sur des propriétés qui ne changent jamais, gaspillant la mémoire GPU.
#performance#interview

Window Functions

PostgreSQL 🔴 Senior

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.

Anti-pattern : Utiliser des sous-requetes correlees pour simuler des window functions, beaucoup plus lent.
#sgbd#interview#database#postgresql

Workflow Versioning

Advanced Ecosystem 🔴 Senior

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.

#orchestration#deployment

WP REST API

WordPress 🟡 Mid

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.

Anti-pattern : Exposer des endpoints sans permission_callback, laissant les donnees accessibles a tous.
#core#interview#wordpress

WP_Cron

WordPress 🟡 Mid

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.

Anti-pattern : Compter sur WP_Cron pour des taches critiques sans configurer DISABLE_WP_CRON + cron systeme.
#core#wordpress

wp_enqueue_script

WordPress 🟢 Junior

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.

Anti-pattern : Inserer des balises <script> et <link> directement dans le header au lieu d'utiliser le systeme d'enqueue.
#core#interview#wordpress

WP_Query

WordPress 🟡 Mid

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).

Anti-pattern : Utiliser query_posts() qui ecrase la requete globale au lieu de creer un nouveau WP_Query.
#core#interview#wordpress

WP-CLI

WordPress 🟡 Mid

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.sql

Cas d'usage : Pour l'automatisation, les deploiements, la maintenance et les migrations WordPress.

Anti-pattern : Faire des operations massives (search-replace) depuis l'interface web au lieu de WP-CLI.
#core#tool#wordpress

Write Concern / Read Concern

MongoDB 🔴 Senior

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.

Anti-pattern : Utiliser w:0 (fire-and-forget) pour des donnees financieres critiques.
#sgbd#interview#database#mongodb

Write-back Cache

DevOps 🔴 Senior

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.

Anti-pattern : Utiliser write-back pour des données financières : risque de perte si Redis crashe.
#devops#caching

Write-through Cache

DevOps 🟡 Mid

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.

Anti-pattern : Écriture lente sous forte charge : chaque write touche deux systèmes.
#devops#caching

Writing Modes

HTML / CSS 🔴 Senior

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.

#interview

Xdebug

PHP 🟡 Mid

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=9003

Cas d'usage : En developpement pour debugger pas-a-pas, analyser les performances et generer la couverture de code.

Anti-pattern : Laisser Xdebug actif en production (ralentit enormement l'application).
#core#tool

XSS (Cross-Site Scripting)

PHP 🟢 Junior

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.

Anti-pattern : Echapper seulement en entree et afficher en confiance, ou oublier le charset UTF-8.
#core#interview#security

YAGNI (You Aren't Gonna Need It)

Architecture 🟢 Junior

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.

Anti-pattern : Ajouter des abstractions 'au cas ou' qui ne servent jamais et alourdissent le code.
#architecture#interview#principle

Yann LeCun

Personalities 🟡 Mid

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.

#personalities#history#interview

Yarn

Testing 🟡 Mid

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 # monorepo

Cas d'usage : Pour les equipes ayant investi dans l'ecosysteme Yarn, notamment avec PnP pour des installs plus rapides.

Anti-pattern : Rester sur Yarn Classic (v1) qui n'est plus maintenu au lieu de migrer vers Yarn Berry ou pnpm.
#tooling#package#monorepo

Yukihiro Matsumoto (Matz)

Personalities 🟡 Mid

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.

#personalities#history#interview

Zod + React Hook Form

React 🟡 Mid

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.

#forms#typescript#validation

Zustand

React 🟡 Mid

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.

Anti-pattern : Ne pas utiliser de selecteurs, souscrivant a tout le store et causant des re-rendus inutiles.
#state#interview#ecosystem