Module 3 · L'oral

L'entrevue frontend

Les modules précédents t'ont donné de la matière : le navigateur, le CSS, les formulaires, les Server Components, les tests. Celui-ci ne t'apprend presque aucune technique nouvelle — il t'apprend à parler de ce que tu sais déjà, la compétence qui décide de la plupart des stages. Bonne nouvelle : contrairement à la connaissance technique, qui met des années à s'accumuler, la manière de répondre s'améliore en quelques heures de préparation ciblée.

💡 Le concept

Une entrevue technique de stage n'est pas un examen de connaissances, c'est un échantillonnage de ton raisonnement. L'intervieweur n'a ni le temps ni le moyen de vérifier tout ce que tu sais ; il prend deux ou trois sondages et en déduit comment tu réfléchis, comment tu réagis quand tu ne sais pas, et à quelle vitesse tu apprends. Le contenu de tes réponses compte moins que leur forme, parce que la forme se généralise à toutes les questions qu'il n'aura pas le temps de poser.

Conséquence libératrice : tu n'as pas besoin de tout savoir, mais d'une méthode de réponse qui tienne debout même sur un sujet que tu n'as jamais touché.

🧭 Comment lire ce module

C'est le chapeau stratégique du guide. Chaque module a déjà son encadré « 🎤 En entrevue » avec les questions techniques de son sujet ; ici, on ne refait pas la technique, on installe la méthode qui les relie toutes. Quand un tradeoff — un arbitrage entre deux options qui ont chacune un coût — est cité plus bas, la théorie complète est dans son module d'origine ; je te renvoie systématiquement.

Ce qu'on évalue vraiment chez un stagiaire

Démontons une croyance répandue : l'idée qu'on serait évalué sur l'étendue de ses connaissances. C'est faux pour un stage, pour une raison pragmatique : la personne en face sait que tu ne connais pas grand-chose, c'est écrit sur l'offre. Elle ne cherche pas un senior au rabais, mais quelqu'un qu'elle pourra encadrer sans que ça lui coûte trop cher et qui produira de la valeur dans trois mois. Elle regarde donc trois choses.

Un — est-ce que tu raisonnes à voix haute ? Puis-je voir ton processus de pensée, ou seulement un résultat qui sort d'une boîte noire ? Encadrer un stagiaire, c'est discuter de problèmes non résolus : s'il répond par un silence puis une phrase définitive, on ne sait pas où il s'est perdu. S'il dit « je vois deux directions possibles, la première serait de… », on corrige sa trajectoire en une phrase. Un stagiaire qui pense fort est encadrable, donc embauchable.

Deux — est-ce que tu sais dire « je ne sais pas » proprement ? Il y a une manière catastrophique de le dire (« euh… non, je sais pas », silence) et une excellente :

« Je n'ai pas utilisé cette bibliothèque directement. Ce que je comprends, c'est
qu'elle résout le problème de [X] — sinon on doit le faire à la main avec [Y].
Si je devais l'intégrer, je commencerais par lire sa doc pour voir quelle forme
elle donne aux données, et je ferais un petit exemple isolé avant de la brancher
dans le vrai projet. »

Trois mouvements : j'admets, je situe le problème que ça résout, je décris comment je m'y prendrais.

Cette réponse démontre trois compétences que la bonne réponse toute faite ne démontrerait pas. L'honnêteté, qui est une donnée opérationnelle : ton futur maître de stage doit pouvoir croire ton « ça va me prendre deux jours ». La capacité à raisonner par problèmes plutôt que par outils. Et l'autonomie d'apprentissage : tu viens de décrire ta méthode pour absorber du neuf.

Le bluff échoue toujours au deuxième niveau, parce que la question suivante creuse systématiquement : l'intervieweur enchaîne sur ce que tu viens d'affirmer. Si tu as dit « oui, j'ai utilisé React Query », la question d'après sera « et comment tu gérais l'invalidation du cache après une mutation ? » — aucune sortie honorable. Alors que « je ne l'ai pas utilisé, mais je sais que ça enlève le triptyque loading / error / data qu'on réécrit dans chaque composant » marque des points et te laisse le contrôle.

Trois — à quelle vitesse apprends-tu ? Le seul critère qui compte vraiment sur six mois, et il n'est pas directement observable : on le mesure par des indices. Poses-tu des questions de clarification avant de foncer ? Reformules-tu ce qu'on vient de t'expliquer ? Sais-tu dire « ah tiens, je n'avais pas vu ça comme ça » ? Un candidat qui change d'avis en cours d'entrevue, en expliquant pourquoi, marque énormément de points.

🔗 Pont — les encadrés « En entrevue » et ce module

Tu as croisé un encadré rose « 🎤 En entrevue » à la fin de presque chaque module, ici comme dans le guide sur Halterofit. Chacun te donne le contenu d'une réponse sur un sujet précis : le modèle de boîte, pourquoi une key ne doit pas être un index, ce que fait une Server Action. Ce module-ci te donne la forme commune à toutes.

La distinction explique comment réviser : relire les encadrés roses te donne de la matière, relire ce module te donne le moule. Et quand une question tombe sur un sujet dont aucun encadré ne parle — ça arrivera — c'est le moule qui te sauve, pas la matière.

Le déroulé typique d'un processus de stage frontend

Les processus varient, mais l'ossature est stable. Savoir quelle question chaque étape cherche à trancher te permet de calibrer ton effort au lieu de tout donner partout.

ÉtapeCe qu'on cherche à savoirCe qui te fait échouer
Premier appel (20–30 min, RH ou responsable) Est-ce que la personne est réelle, motivée, disponible aux bonnes dates, et à peu près alignée avec ce qu'on fait ? Ne rien savoir de l'entreprise. Être flou sur ses disponibilités. Réciter une lettre de motivation.
Test technique à la maison (2 à 6 h) Est-ce que ce candidat sait produire du code qui marche, lisible, dans un temps contraint ? Rendre quelque chose qui ne démarre pas. Ignorer une exigence explicite de l'énoncé. Sur-ingénierie.
Présentation du code (30–45 min) Est-ce que le candidat comprend le code qu'il a rendu, et sait le défendre ? Lire le code ligne par ligne. Ne pas savoir pourquoi on a fait un choix. Dire « c'est la best practice ».
Entrevue technique (45–60 min) Quelle est la profondeur réelle des fondamentaux, et comment réagit-il devant l'inconnu ? Bluffer. S'effondrer sur une question hors sujet. Répondre par oui/non sans développer.
Live coding (parfois, 30–45 min) Comment travaille-t-il vraiment, en direct, sous un peu de pression ? Coder en silence. Se jeter sur le clavier sans avoir compris l'énoncé. Chercher l'élégance avant que ça marche.

Deux remarques. La première : la colonne du milieu n'est jamais « est-ce qu'il connaît tout » — pas une seule ligne. C'est la confirmation, étape par étape, de la section précédente.

La seconde est stratégique. L'étape la plus décisive, et de loin la plus sous-préparée, c'est la présentation du code : tout le monde s'épuise sur le test technique puis arrive à la présentation en se disant « je connais mon code, ça va aller ». Or connaître son code et savoir le raconter sont deux compétences différentes, et un test moyen bien présenté passe souvent devant un test excellent mal présenté — logique dès qu'on considère que le métier consiste à construire quelque chose avec d'autres gens.

🧭 Un test technique non retenu n'est pas un verdict

Si tu as déjà rendu un test sans que ça aboutisse, la conclusion utile n'est presque jamais « je ne suis pas assez bon ». La cause la plus fréquente chez un junior est l'étape de présentation : le code tenait la route, mais les réponses aux « pourquoi » n'étaient pas encore construites. Lacune de préparation, pas de niveau — elle se comble avec ce module et deux répétitions à voix haute. Ce n'est pas la partie difficile qui t'a manqué, c'est la partie qu'on ne t'avait jamais dit de préparer.

La grammaire de la réponse technique

Le patron le plus rentable de toute ta préparation. Il répond à toutes les questions qui commencent par « pourquoi », qu'elles portent sur un découpage de composants, un choix d'outil, une structure de données ou une approche de rendu :

« J'ai choisi X parce que [raison liée au contexte].
  L'alternative était Y, qui a l'avantage de [Z],
  mais ici [pourquoi X gagne dans ce contexte précis]. »

Quatre morceaux : le choix, sa raison, l'alternative honnêtement créditée, l'arbitrage.

Comprends le mécanisme et tu n'auras plus besoin de mémoriser la formule. « J'ai choisi X parce que c'est bien » prouve une seule chose : que tu connais X. La question qui intéresse ton interlocuteur reste entière — connais-tu autre chose que X ? Peut-être que X est le seul outil que tu saches utiliser, peut-être que c'est ce que disait le tutoriel. Il ne peut pas trancher, donc il pose une question de plus.

En nommant Y et en lui reconnaissant un avantage réel, tu réponds avant qu'on demande, et tu prouves quatre choses : tu connais les deux options ; tu sais évaluer celle que tu n'as pas retenue ; tu as fait un choix délibéré ; tu sais le rattacher à un contexte, définition de l'ingénierie. Ce dernier point est le plus souvent raté : un choix technique n'est jamais bon dans l'absolu, il est bon pour ce projet, cette taille, cette équipe, ce délai. Le mot « ici » n'est pas décoratif.

Le crédit sincère accordé à l'alternative distingue une vraie réponse d'une récitation. « Y mais c'est nul », ce n'est pas arbitrer : une bonne phrase sur Y doit être une phrase qu'un défenseur de Y signerait.

Trois illustrations

Cas 1 — un découpage de composants. La question : « pourquoi avoir séparé le sélecteur et le formulaire au lieu d'un seul composant ? »

« J'ai séparé les deux parce qu'ils ont des responsabilités différentes : le
sélecteur choisit un service, le formulaire rend des fields et collecte des
réponses. L'alternative, un seul composant, aurait été plus simple à lire au
début — un seul fichier, aucun passage de props. Mais dès que le formulaire a
eu plusieurs types de fields, le fichier a dépassé 150 lignes et je devais
scroller pour comprendre. Là, chaque fichier fait moins de 80 lignes, et si on
remplace le sélecteur par une barre de recherche demain, le formulaire n'a même
pas besoin d'être touché : il reçoit une config, il ne sait pas d'où elle vient. »

Remarque le crédit honnête à l'alternative : « plus simple à lire au début » est vrai.

Cas 2 — un choix de rendu. La question : « pourquoi cette page est-elle un Server Component ? »

« Parce qu'elle ne fait qu'afficher des données : elle n'a ni état, ni
gestionnaire d'événement. En la laissant serveur, les données sont déjà dans le
HTML au premier affichage et son code ne part pas dans le bundle du navigateur.
L'alternative aurait été un composant client avec un useEffect et un fetch —
c'est ce que j'aurais fait il y a six mois, et l'avantage c'est que c'est un
seul modèle mental à tenir. Mais ici ça coûtait un aller-retour réseau de plus
après l'affichage, donc un spinner visible. J'ai juste extrait le bouton de
réservation en composant client, parce que lui a besoin d'un onClick. »

Le détail « c'est ce que j'aurais fait il y a six mois » est un aveu de progression : il raconte un apprentissage, pas seulement un choix.

Cas 3 — une absence de bibliothèque. La question : « pourquoi ne pas avoir utilisé une bibliothèque de formulaires ? »

« Le formulaire a cinq fields et une seule règle de validation, donc du
useState et une fonction de validation faisaient l'affaire — et je voulais que
le code reste lisible sans connaître une API de plus. L'alternative, react-hook-form,
a un vrai avantage : elle évite un re-render à chaque frappe en passant par des
refs, et elle branche la validation proprement. Sur un formulaire de trente
fields avec des règles conditionnelles, j'y serais allé sans hésiter. Ici,
l'ajouter aurait ajouté une dépendance pour un problème que je n'avais pas. »

« Un problème que je n'avais pas » : c'est la phrase qui referme proprement un débat d'outil.

✍️ Exercice de lecture

Deux candidats répondent à la même question : « pourquoi as-tu extrait ce composant de champ de formulaire ? »

CANDIDAT A
« Parce que c'est une bonne pratique de découper ses composants. Le principe de
responsabilité unique dit qu'un composant doit faire une seule chose, donc j'ai
appliqué ça. Ça rend le code plus maintenable et plus réutilisable. »

CANDIDAT B
« Au départ tout était dans le formulaire. Quand j'ai ajouté le troisième type
de champ, je me suis rendu compte que je copiais-collais le même bloc label +
input + message d'erreur pour la troisième fois. C'est là que je l'ai sorti.
Aujourd'hui il est utilisé à trois endroits ; si je change la façon d'afficher
les errors, je le fais une fois. J'aurais pu l'extraire dès le premier champ,
mais je ne savais pas encore de quoi il aurait besoin comme props. »

Questions : (1) Laquelle des deux convainc, et pourquoi précisément ? (2) Qu'est-ce que la réponse B prouve que la réponse A ne prouve pas ? (3) Quelle question l'intervieweur va-t-il forcément poser après la réponse A ?

Voir le corrigé

(1) B convainc, largement — et pas parce qu'il « connaît mieux React » : les deux savent découper un composant. A décrit une règle, B décrit un événement. Les phrases de A pourraient être prononcées par quelqu'un qui n'a jamais ouvert le projet ; celles de B ne peuvent venir que de quelqu'un qui a écrit ce code — « le troisième type de champ », « label + input + message d'erreur », « trois endroits ». La spécificité est la signature de l'expérience vécue.

(2) B prouve trois choses de plus. Qu'il a un déclencheur concret (la troisième répétition), donc un critère réutilisable et pas un dogme. Qu'il mesure le bénéfice après coup (« je le fais une fois »). Et, avec sa dernière phrase, qu'il connaît le risque inverse : extraire trop tôt, avant de savoir de quoi l'abstraction aura besoin. Reconnaître qu'une bonne pratique a un coût est un signe de maturité rare chez un junior.

(3) Après A, la question suivante tombe à coup sûr : « d'accord, mais concrètement, qu'est-ce que ça t'a apporté ici ? », ou sa version plus tranchante, « et à quel moment tu décides de ne pas extraire ? ». A devra refaire sa réponse, cette fois sous pression. Leçon générale : une réponse qui ne contient aucun détail propre à ton projet est une réponse qu'il faudra redonner.

🧠 Quiz éclair

Cette réponse est vraie, précise et bien construite. Il lui manque pourtant un des quatre morceaux de la grammaire — lequel, et quelle question va-t-elle déclencher ?

« J'ai fait des fields contrôlés, parce que j'avais besoin d'afficher les
errors pendant la saisie et de remettre le formulaire à zéro après l'envoi.
Les deux supposent que React connaisse les values à tout moment. »

Il manque l'alternative honnêtement créditée, et avec elle le mot « ici ». La réponse dit ce que tu as choisi et pourquoi ; elle laisse entière la seule question qui intéresse ton interlocuteur : connaît-il autre chose ? Peut-être que les champs contrôlés sont la seule façon que tu saches faire, peut-être que c'est ce que disait le tutoriel — il ne peut pas trancher.

Donc il pose la question suivante, à coup sûr : « et l'approche non contrôlée, tu connais ? » ou « dans quel cas tu ne l'aurais pas fait ? ». Tu vas devoir donner cette réponse de toute façon — mais improvisée, sous pression, et après avoir donné l'impression d'avoir été rattrapé.

La version complète tient en deux phrases de plus : « L'alternative non contrôlée est plus économique — un rendu au lieu d'un par frappe, et FormData récupère tout d'un coup à la soumission. Mais ici, le formulaire fait cinq champs : l'économie de rendus ne se voit pas, alors que la validation en direct, elle, se voit. » Nommer Y et lui reconnaître un avantage réel, c'est répondre avant qu'on demande.

Les six tradeoffs à savoir défendre

Les arbitrages qui reviennent le plus souvent en entrevue frontend junior. Pour chacun : le contexte en trois lignes, puis la phrase de réponse prête à adapter. La théorie complète est dans le module indiqué — ce qui suit n'est que la version orale.

a. Contrôlé ou non contrôlé

Un champ contrôlé a sa valeur dans l'état React (value + onChange) : React est la source de vérité, ce qui rend triviaux le reset, la validation en temps réel et la persistance, au prix d'un rendu par frappe. Un champ non contrôlé laisse la valeur dans le DOM et on la lit à la soumission (ref ou FormData) : moins de rendus, moins de code, mais tout ce qui doit réagir pendant la saisie devient compliqué. Détail dans « Formulaires 1 ».

« J'ai fait des fields contrôlés parce que j'avais besoin de deux choses
pendant la saisie : afficher les errors au fur et à mesure et pouvoir remettre
le formulaire à zéro après l'envoi. Les deux supposent que React connaisse les
values à tout moment. L'alternative non contrôlée est plus économique — un
rendu au lieu d'un par frappe, et FormData récupère tout d'un coup à la
soumission — mais ici le formulaire fait cinq fields, donc l'économie de rendus
ne se voit pas, alors que la validation en direct, elle, se voit. »

b. useState ou useReducer

useState est fait pour des morceaux d'état indépendants et des mises à jour directes. useReducer devient meilleur quand plusieurs morceaux changent ensemble, quand la valeur suivante dépend de la précédente, ou quand tu veux des transitions nommées (dispatch({ type: 'SUBMIT' })) plutôt qu'une rafale de setters. Voir « Formulaires 2 » et useState & useEffect.

« J'ai gardé useState parce que mon état, c'est un objet de values qui change
d'une seule façon : l'utilisateur tape, on remplace un champ. Il n'y a pas de
transition métier à nommer. Si j'avais eu les errors par champ, l'état
d'envoi en cours et l'état de succès à faire bouger ensemble, je serais passé
à useReducer — l'avantage étant que les trois setters éparpillés deviennent un
seul dispatch, et qu'on peut relire toutes les transitions possibles au même
endroit. Avec un seul type d'opération, ça n'aurait ajouté que de la cérémonie. »

c. CSS vanilla, CSS Modules ou Tailwind

CSS vanilla : aucune configuration, tout le monde sait le lire, mais les noms de classes sont globaux — donc collisions quand le projet grossit, qu'on limite par une convention de nommage. CSS Modules : le build rend chaque nom unique, donc scoping automatique sans dépendance. Tailwind : des classes utilitaires dans le JSX, très rapide à écrire, au prix d'un balisage plus chargé. Détail dans « CSS 1 » et « CSS 2 ».

« Le projet imposait du CSS vanilla, donc j'ai suivi, et j'ai adopté une
convention de nommage par blocs pour éviter les collisions. Sur un projet
libre, j'irais vers les CSS Modules : on garde exactement la même syntaxe CSS
mais le scoping est automatique, sans dépendance à ajouter. Je connais aussi
Tailwind — je l'utilise dans mon app mobile via NativeWind — et c'est très
efficace pour aller vite ; le compromis, c'est que le JSX devient plus lourd
à lire quand il y a quinze classes sur une balise. »

d. Server Component ou Client Component

Le tradeoff du moment : il a remplacé l'ancienne discussion « client-side / SSR / SSG », non pas parce qu'elle était fausse mais parce que la question ne se pose plus au niveau de la page — elle se pose composant par composant : ce bout d'interface a-t-il besoin du navigateur ? Un Server Component ne part pas dans le bundle, peut lire une base de données et livre ses données dès le premier affichage ; un Client Component peut avoir de l'état, des événements et window, mais son code voyage. Détail dans « Server et Client Components » et « Rendu & data fetching » pour le cache.

« Par défaut je laisse tout en Server Component, et je ne bascule en client que
là où il y a vraiment de l'état ou un événement — ici, uniquement le bouton et
le formulaire. L'avantage du client, c'est qu'on n'a qu'un seul modèle mental
et que tout est interactif partout ; l'inconvénient, c'est que 'use client' est
viral vers le bas le long des imports, donc mettre la directive en haut de la
page ferait descendre toute la page dans le bundle. Donc je pousse la frontière
le plus bas possible, vers les feuilles de l'arbre. »

Si on te pose l'ancienne question — « c'est quoi la différence entre SSR et SSG ? » — réponds franchement (SSG rend au build, SSR à chaque requête, l'ISR régénère en arrière-plan après un délai), puis reformule dans le vocabulaire d'aujourd'hui : ces trois modes existent toujours, mais dans l'App Router on ne les choisit plus par des fonctions comme getStaticProps, on les obtient par la façon de demander les données et les options de cache. Connaître les deux générations de vocabulaire prouve que tu as compris le mécanisme, pas seulement mémorisé la mode actuelle.

e. Route Handler ou Server Action

Un Route Handler est une vraie URL HTTP : appelable depuis n'importe quoi (autre service, application mobile, webhook), avec maîtrise des codes de statut et des en-têtes. Une Server Action est une fonction serveur que le composant client appelle comme une fonction locale : moins de code, pas d'URL à inventer, intégration naturelle avec les formulaires — mais c'est un détail interne, pas une interface publique. Détail dans « Route Handlers & Server Actions ».

« Pour la soumission du formulaire j'ai pris une Server Action : c'est une
mutation déclenchée depuis ma propre interface, personne d'autre n'a besoin de
l'appeler, et ça m'évite d'écrire une route, un fetch et la sérialisation des
deux côtés. J'aurais pris un Route Handler si l'endpoint devait être consommé
par autre chose que cette page — une app mobile, un service tiers, un webhook —
ou si j'avais besoin de contrôler finement le status HTTP et les en-têtes. La
validation côté serveur, elle, est obligatoire dans les deux cas. »

f. À la main ou avec une bibliothèque

La vraie question n'est pas « connais-tu react-hook-form ? » mais « sais-tu quand une dépendance vaut son coût ? ». Une bibliothèque achète du temps et de la robustesse ; elle coûte une API à apprendre, du poids, un lien à entretenir. La bonne réponse fait toujours référence à la taille du problème.

BibliothèqueLe problème qu'elle résoutTa phrase si tu ne l'as pas utilisée
react-hook-form Les gros formulaires : elle passe par des refs, donc pas de rendu à chaque frappe, et branche la validation. « Je sais qu'elle évite les rendus à chaque frappe en gardant les valeurs hors de l'état React. Avec cinq champs, je n'avais pas ce problème. »
Zod Garder la validation à l'exécution et les types TypeScript synchronisés : un seul schéma produit les deux. « C'est un schéma qui valide à l'exécution et qui donne le type TypeScript par inférence, donc on ne décrit la forme des données qu'une fois. C'est ce que j'ajouterais en premier pour la validation serveur. »
TanStack Query Le cache, les nouvelles tentatives et l'invalidation des données serveur, au lieu du triptyque manuel dans chaque composant. « Elle enlève le loading / error / data qu'on réécrit partout, et elle gère le cache. Avec des Server Components, une bonne partie de ce besoin disparaît côté serveur. »
Zustand Partager de l'état entre beaucoup de composants sans la cérémonie de Redux ni les rendus en cascade d'un Context large. « Je l'utilise dans mon application mobile pour l'état global. Ici, l'état ne dépassait pas deux niveaux, donc des props suffisaient. »
« Je ne l'ai pas utilisée sur ce projet. Ce qu'elle résout, c'est [le problème].
Comme mon cas était petit — [chiffre concret] —, le faire à la main tenait en
[quelques lignes] et ça évitait une dépendance de plus. À partir du moment où
[le seuil], j'irais la chercher, et c'est un outil que je serais curieux
d'utiliser sur un vrai projet. »

Le gabarit universel. Le « chiffre concret » est ce qui empêche la réponse de sonner creuse.

🧠 Quiz éclair

L'intervieweur ouvre ce fichier de ton rendu et demande : « pourquoi cette page est-elle cliente ? ». Tu ne peux pas répondre « parce qu'il y a un useState ». Que dis-tu ?

'use client';
import { useState } from 'react';

export default function PageServices({ services }: { services: Service[] }) {
  const [query, setQuery] = useState('');
  const visibles = services.filter((s) => s.nom.includes(query));

  return (
    <section>
      <input value={query} onChange={(e) => setQuery(e.target.value)} />
      {/* ... 180 lignes de contenu parfaitement statique ... */}
    </section>
  );
}

Tu dis la vérité, et tu la dis en premier : la frontière est trop haute. La directive n'est pas un interrupteur local, elle marque le début d'un sous-arbre client ; posée en tête de page pour un seul champ de recherche, elle envoie les cent quatre-vingts lignes statiques dans le paquet du navigateur et fait perdre le rendu serveur de tout le reste.

Puis tu crédites l'alternative, parce qu'elle existe : une page entièrement cliente, c'est un seul modèle mental, et sur une page de cette taille personne ne verra la différence. Ensuite tu tranches par le contexte : ici le contenu statique est l'essentiel de la page, donc j'extrairais le champ de recherche et la liste filtrée dans leur propre composant client, et je laisserais la page en Server Component. La frontière descend vers les feuilles.

Ce que cette réponse accomplit est plus important que le correctif : reconnaître spontanément un défaut de son propre rendu, avec la correction précise, te fait passer d'interrogé à relecteur de ton code. Défendre l'indéfendable, à l'inverse, est le seul vrai piège de cette question.

Les questions pièges, et comment ne pas y tomber

Une question piège n'est presque jamais malveillante : sa réponse évidente est mauvaise, et la bonne demande de repérer ce qu'on te demande vraiment. En voici quatre, par fréquence.

« C'est quoi la best practice pour X ? »

Le piège est dans le mot : il t'invite à réciter, et une récitation s'entend — le débit change, les phrases deviennent trop rondes, le vocabulaire est celui des tutoriels. Le réflexe qui sauve : transformer la question générale en question contextuelle. Il n'existe pas de meilleure pratique hors contexte, seulement des choix qui dépendent de la taille, de l'équipe et de l'échéance.

« Ça dépend de deux ou trois choses, je dirais. Sur un projet de la taille du
mien, l'approche par défaut c'est [X], parce que [raison]. Ce qui me ferait
changer d'avis, c'est [le facteur] : à partir de là, [Y] devient meilleur. Est-ce
que dans votre contexte vous êtes plutôt dans le premier cas ou dans le second ? »

La question finale n'est pas une esquive : c'est ce qu'un développeur expérimenté ferait spontanément, et elle transforme l'interrogatoire en conversation — toujours plus favorable au candidat.

« Pourquoi n'as-tu pas fait X ? »

Le piège est émotionnel : la question sonne comme un reproche, donc le réflexe est de se justifier, voire de s'excuser. Or on te demande comment tu as priorisé : dans un test de quatre heures, tout ce qui n'a pas été fait est un arbitrage, et l'intervieweur veut voir si tu l'as fait consciemment. Structure en trois temps : je l'ai vu — voici ce que j'ai fait passer avant et pourquoi — voici ce que ça coûterait de l'ajouter.

« J'y ai pensé, et je l'ai mis de côté volontairement. Avec le temps que j'avais,
j'ai priorisé [ce qui était explicitement demandé] et [ce qui casse l'expérience
si c'est absent]. X est important, mais il n'aurait rien fait tomber si je
l'avais raté, alors que [l'autre chose], oui. Concrètement, l'ajouter serait
une heure : [ce que tu ferais, précisément]. »

Note ce que cette réponse accomplit : elle ne s'excuse pas, elle expose un critère de priorisation. Et le critère « ce qui casse l'expérience si c'est absent » avant « ce qui serait mieux » est exactement celui qu'on applique dans une équipe qui livre.

« Quelle est la complexité de ton algorithme ? »

Le piège est la panique : le mot « complexité » évoque les grandes entrevues d'algorithmique, et beaucoup de juniors se figent en cherchant un souvenir de cours qu'ils n'ont jamais eu. Pour un stage frontend, l'attente est modeste : sais-tu compter tes boucles et dire si ça pose un problème à l'échelle de tes données ?

Quatre repères suffisent. O(1) — accès direct par clé (objet, Map) : le temps ne dépend pas de la taille. O(n) — un parcours : map, filter, find. O(n²) — une boucle dans une boucle sur le même tableau, ça grimpe très vite. O(n×m) — une boucle sur une liste, avec une recherche dans une autre à l'intérieur.

« Ma fonction parcourt la liste des services une fois, et pour chacun elle
regarde si la spécialité est dans le tableau du praticien. C'est donc une boucle
avec une recherche dedans — de l'ordre de n fois m. Avec les tailles réelles,
trois services et cinq spécialités, c'est instantané. Si on passait à des
milliers d'entrées, je construirais un index une seule fois — un objet ou une
Map dont la clé est l'identifiant — et la recherche redeviendrait directe. »

On décrit ce que le code fait, on rattache à la taille réelle des données, on donne le plan B. Aucun jargon obligatoire.

La phrase la plus importante de cette réponse est « avec les tailles réelles, c'est instantané » : elle prouve que tu sais qu'une optimisation sans mesure et sans échelle est du gaspillage — un réflexe que beaucoup mettent des années à acquérir.

« Qu'est-ce qui ne va pas dans ton code ? »

La plus importante du module. Le piège est de répondre « rien, je suis assez content ». Pire réponse possible, pour deux raisons. D'abord c'est faux, et tout le monde le sait — aucun code écrit en quatre heures n'est sans défaut, donc soit tu ne les vois pas, soit tu les caches. Ensuite, cette question n'est pas un test de modestie mais de capacité de revue de code, activité qui occupe une part énorme du travail en équipe : on t'offre l'occasion la plus directe de la démontrer.

C'est donc la question où on marque des points, à condition de la préparer. Deux ou trois faiblesses réelles, hiérarchisées, chacune avec sa correction — et choisies d'architecture ou de robustesse, pas des coquetteries : « j'aurais pu mieux nommer une variable » sonne comme une esquive, « je valide côté client mais pas côté serveur » comme quelqu'un qui comprend où sont les vrais risques.

« Trois choses, dans l'ordre où je les corrigerais.

Un : je valide les fields côté client seulement. Quelqu'un qui appelle
l'endpoint directement passerait à travers. C'est le vrai trou, et c'est ce que
je ferais en premier — un schéma de validation côté serveur avant l'écriture.

Deux : mon composant de page fait 140 lignes. Il mélange la récupération des
données et l'affichage. J'en sortirais la logique de sélection dans un hook, ce
qui le rendrait aussi testable sans monter tout le rendu.

Trois : mes messages d'erreur sont génériques. L'utilisateur voit "une erreur
est survenue" sans savoir quel champ reprendre. »

Trois défauts, classés par gravité, chacun avec sa correction. C'est une revue de code, pas une confession.

Relis la première des trois, découpée : « je valide les fields côté client seulement » (le fait), « quelqu'un qui appelle l'endpoint directement passerait à travers » (la conséquence concrète), « un schéma de validation côté serveur avant l'écriture » (la piste). C'est La critique en trois temps du module Lire et critiquer du code frontend, retournée vers ton propre code. Le seul temps qui change de forme est le troisième : devant ton rendu à toi, la proposition n'a plus besoin d'être posée en question, elle devient un plan.

🔗 Pont — la critique de code, des autres à soi

Le module « Lire et critiquer du code frontend » t'a donné une grille : lire le code d'autrui dans un ordre précis, repérer les odeurs classiques — le composant qui fait trop de choses, l'état dérivé stocké, la key qui est un index, l'effet qui n'a pas besoin d'exister, la validation qui n'existe que côté client. Tu croyais peut-être que cet outil servait à commenter les pull requests de tes futurs collègues ; son usage le plus rentable à court terme, c'est sur ton propre code, la veille de l'entrevue.

Applique la grille à ton rendu comme un relecteur extérieur, note les trois premières choses qui accrochent, écris pour chacune une phrase de correction. Tu viens de préparer la réponse à « qu'est-ce qui ne va pas dans ton code ? » — et, effet secondaire, celle à « que ferais-tu avec plus de temps ? », qui est la même liste vue par l'autre bout.

✍️ Exercice de lecture

Un candidat répond ceci à la question « pourquoi avoir mis l'état dans le composant parent plutôt que dans le sélecteur ? »

« Parce que c'est la best practice en React. On dit qu'il faut faire remonter
l'état — le lifting state up — et que les composants doivent être le plus purs
possible. C'est recommandé dans la documentation officielle. »

Questions : (1) Qu'est-ce qui cloche, sachant que tout ce qu'il dit est techniquement exact ? (2) Que devrait-il dire à la place ?

Voir le corrigé

(1) Rien n'est faux, et c'est ce qui rend l'exemple instructif. Le problème n'est pas l'exactitude : la réponse ne contient aucune information sur ce projet-ci. Elle cite une règle et une autorité (« la documentation officielle ») au lieu d'un raisonnement, ce qui la rend indistinguable de la réponse de quelqu'un qui aurait copié un tutoriel sans comprendre. L'intervieweur doit donc creuser, et le candidat va improviser ce qu'il aurait pu dire calmement du premier coup.

Deuxième défaut, plus subtil : invoquer une autorité, c'est déléguer la décision. La question posée était « pourquoi toi », la réponse dit « parce qu'on recommande ». Le sujet de la phrase a changé, et avec lui la responsabilité du choix.

(2) Il devrait remplacer la règle par le mécanisme, en une phrase vérifiable dans son code :

« Parce que deux composants dépendent de cette valeur : le sélecteur, qui la
change, et le formulaire, qui doit changer de fields quand elle change. Si je
la gardais dans le sélecteur, le formulaire n'aurait aucun moyen d'être au
courant — il faudrait que le sélecteur lui parle, alors qu'ils sont côte à côte.
Donc elle vit dans leur parent commun, et chacun reçoit ce dont il a besoin en
props. C'est ce qu'on appelle faire remonter l'état, mais concrètement c'est
juste : la donnée vit au plus bas endroit d'où tous ceux qui en ont besoin
peuvent la voir. »

Note le dernier mouvement : le terme technique arrive après l'explication, immédiatement traduit en français simple. Le jargon posé en premier sert à impressionner ; posé en dernier, il nomme une chose qu'on vient de comprendre ensemble. Et il te protège : si tu ne sais plus le nom exact, ton explication tient debout seule.

🧠 Quiz éclair

« Quelle est la complexité de ce bout de code ? » Réponds comme on l'attend d'un stagiaire frontend — à voix haute, en trois phrases.

const rows = appointments.map((appointment) => ({
  ...appointment,
  serviceLabel:
    services.find((s) => s.id === appointment.serviceId)?.label ?? '—',
}));

Décris, rattache, propose un plan B. « Je parcours une fois la liste des rendez-vous, et pour chacun je fais une recherche dans la liste des services : c'est une boucle avec une recherche dedans, de l'ordre de n fois m. Avec les tailles réelles — quelques dizaines de rendez-vous et sept services — c'est instantané. Si on passait à des milliers de rendez-vous, je construirais d'abord un index une seule fois, un objet ou une Map dont la clé est l'identifiant de service ; la recherche redeviendrait directe et on repasserait à un simple n plus m. »

Le piège de cette question n'est pas l'arithmétique, c'est la panique : le mot « complexité » évoque des entrevues d'algorithmique et beaucoup de juniors se figent en cherchant un souvenir de cours. Personne n'attend une démonstration : on veut savoir si tu sais compter tes boucles et si tu rapportes le coût à la taille réelle de tes données. La phrase « avec les tailles réelles, c'est instantané » vaut d'ailleurs autant que le reste — elle prouve que tu n'optimises pas contre un problème imaginaire.

⚠️ Piège fréquent

Réciter au lieu de raisonner. Le symptôme n'est pas dans le contenu mais dans le son : le débit s'accélère, les phrases sont trop bien construites pour de l'oral, le vocabulaire devient celui des tutoriels — « maintenable », « scalable », « best practice » — et plus rien n'est propre à ton projet. Personne ne t'accusera ; on posera une sous-question hors script, et le contraste entre la fluidité d'avant et l'hésitation d'après en dira plus que le blanc.

Gonfler ce qu'on sait. Le mécanisme est le même que celui des quatre questions ci-dessus : on enchaîne sur le fil le plus prometteur, et c'est celui que tu viens d'ouvrir. Chaque affirmation choisit donc le terrain sur lequel tu seras testé.

Le réflexe de diagnostic, commun aux deux : est-ce que ma réponse contient un détail que moi seul peux connaître ? Si non, c'est une phrase apprise, et elle appelle la sous-question. Prépare des structures, jamais des phrases — et devant un sujet survolé, « je ne connais pas, mais voici ce que je comprends du problème » ramène sur un terrain solide au lieu d'en choisir un mauvais.

Parler de soi sans expérience professionnelle

L'angoisse numéro un des candidats autodidactes, sur une prémisse fausse : « pas d'expérience professionnelle » ne veut pas dire « rien à raconter ». Tu as construit une application mobile complète — base de données locale, synchronisation vers le nuage, tests, couche d'analyse, décisions d'architecture tranchées seul. C'est de l'expérience. Ce qui te manque, ce n'est pas la matière, c'est sa traduction dans le vocabulaire d'une équipe.

Levier principal : arrête de présenter ton projet comme une liste de technologies, présente-le comme une suite de problèmes résolus. Personne ne s'émeut d'entendre « c'est fait en React Native avec Expo, WatermelonDB et Supabase ». Tout le monde écoute quand tu dis « le problème, c'est qu'une application de suivi d'entraînement doit marcher au sous-sol d'un gym, sans réseau. Donc tout est écrit d'abord dans une base locale, et la synchronisation se rattrape quand la connexion revient. Ce qui rend le sujet difficile, c'est le conflit : qu'est-ce qui gagne si la même donnée a changé des deux côtés ? »

Même projet, deux phrases. Mais la seconde démontre que tu as compris un problème d'architecture distribuée, alors que la première ne démontre que ta capacité à lire un package.json.

🏋️ Ton projet, converti en arguments

Voici quatre traductions à avoir prêtes. Chacune part d'une caractéristique de ton application et arrive à une compétence que le poste utilise.

  • « Hors-ligne d'abord » → tu sais penser les états intermédiaires. Une application qui marche sans réseau force à traiter tous les cas que le web bâcle : l'écriture pas encore partie, l'échec silencieux, la reprise. Même muscle que les états chargement / erreur / vide, en plus exigeant.
  • « Base locale + synchronisation » → tu sais où vit une donnée. C'est la question posée par les Server Components (« où ce code s'exécute-t-il ? ») et par le cache (« cette donnée est-elle fraîche ? »). Tu l'as déjà dans les mains, tu ne l'appelais pas comme ça.
  • « Analytique déterministe » → tu sais isoler de la logique pure. Calculer des tendances t'a obligé à séparer le calcul de l'affichage : la condition même de la testabilité, et ce qu'on cherche derrière « comment tu testerais ça ? ».
  • « Solo, sur du long terme » → tu sais te relire. Tu as forcément rouvert du code écrit trois mois plus tôt et pesté contre son auteur. Cette expérience est l'argument en faveur du code lisible, bien plus convaincante qu'une citation de principe.

Troisième levier, sous-estimé : le parcours autodidacte est un argument, pas une excuse. Formule-le une fois, calmement. Un diplômé a suivi un programme qu'on lui a donné ; toi, tu as choisi d'apprendre alors que personne ne t'y obligeait, décidé seul quoi apprendre et dans quel ordre, buté sur des problèmes sans professeur à qui les poser — donc développé la compétence la plus utile en poste : trouver l'information toi-même et savoir quand tu es bloqué. Dis-le comme un fait, pas comme une compensation.

Les trois questions comportementales, et un patron pour toutes

Quel que soit le sujet, la structure gagnante est la même : Situation → Action → Résultat → Ce que j'en ai tiré. Les trois premiers temps font le récit, le quatrième fait la différence — c'est lui qui transforme une anecdote en preuve d'apprentissage, et c'est celui dont l'intervieweur se souviendra.

« Parle-moi d'un bug difficile. » On cherche ta méthode de diagnostic, pas la difficulté du bug. Choisis un bug dont la cause était surprenante mais explicable — pas le plus obscur de ta carrière.

SITUATION — « Un réglage de l'utilisateur revenait à sa valeur par défaut à
chaque redémarrage de l'app. Pas toujours : seulement ce réglage-là. »

ACTION — « J'ai d'abord vérifié que l'écriture partait bien — elle partait. Donc
le problème était après. J'ai relu ce qui se passait au chargement, et j'ai
trouvé : les données persistées passent par un schéma de validation, et ce champ
n'y avait pas été ajouté. Le schéma le retirait silencieusement à la lecture,
puis on réécrivait l'objet nettoyé par-dessus. »

RÉSULTAT — « Ajouté au schéma, plus un test qui échoue si un champ existe d'un
côté et pas de l'autre. »

CE QUE J'EN AI TIRÉ — « Que je cherchais au mauvais endroit : je regardais
l'écriture parce que le symptôme était "ça ne se sauvegarde pas", alors que la
perte avait lieu à la lecture. Depuis, devant un bug de persistance, je vérifie
les deux bouts avant de choisir un camp. »

La dernière phrase vaut les trois autres : elle montre une règle que tu as extraite de l'incident.

« Comment apprends-tu une nouvelle technologie ? » On cherche si ta méthode existe et si elle est réaliste. Une réponse crédible cite des étapes et avoue un coût.

« Je commence par la documentation officielle, mais pas en entier : je cherche
d'abord le modèle mental — qu'est-ce que cet outil croit être vrai du monde. Une
fois que j'ai ça, le reste des pages devient lisible. Ensuite je fais le plus
petit exemple qui marche, isolé, hors du vrai projet, pour ne pas mélanger mes
bugs avec les siens. Et je ne branche dans le projet qu'à la troisième étape.
Ce qui me ralentit le plus, c'est quand je saute la première étape : je copie un
exemple qui marche, et je suis incapable de le débugger quand il dévie. »

« Raconte-moi un désaccord technique. » C'est la plus délicate quand on travaille seul, et elle a une variante honnête : le désaccord avec toi-même, ou avec un conseil reçu en ligne. On cherche si tu peux argumenter sans t'entêter et changer d'avis sans t'écraser.

« Je travaille seul, donc mon vrai cas c'est un désaccord avec une convention
que j'avais adoptée. J'avais lu qu'il fallait mémoïser agressivement tous les
calculs dans les composants, et j'en mettais partout par réflexe. En relisant
mon code, je me suis rendu compte que ça alourdissait la lecture sans que
j'aie jamais mesuré quoi que ce soit. J'ai retiré ce qui n'était pas justifié
et je me suis donné une règle : pas d'optimisation sans un chiffre avant et
après. Ce que j'en tire, c'est que "recommandé" et "nécessaire ici" sont deux
choses différentes, et que la deuxième se vérifie. »

Une position tenue, un argument entendu, un changement d'avis motivé : c'est exactement la mécanique qu'on veut voir dans une revue de code.

🧠 Quiz éclair

« Tu n'as jamais travaillé en équipe. » C'est vrai : aucun poste, aucun collègue. Tu contribues en revanche à des projets ouverts. Comment réponds-tu sans nier le fait ?

Tu accordes le fait en une phrase — « c'est exact, je n'ai jamais travaillé dans une équipe salariée » — puis tu nommes ce que la contribution à un projet ouvert fait réellement faire, parce que c'est ce que la question cherche derrière ses mots :

lire une base de code qu'on n'a pas écrite avant d'y toucher ; respecter des conventions qu'on n'a pas choisies et qui ne sont pas toujours écrites ; faire relire son code par des inconnus qui n'ont aucune raison d'être indulgents ; et voir une proposition refusée ou renvoyée à retravailler, sans le prendre personnellement. C'est vérifiable : l'historique est public, tu peux même l'ouvrir pendant l'entrevue.

Puis tu fermes par ce qui manque encore, parce que c'est ce qui rend le reste crédible : le rythme quotidien, la négociation d'une conception à plusieurs, les échéances communes, le fait de reprendre un travail commencé par quelqu'un d'autre. « C'est précisément ce que je viens chercher. » Un fait accordé, une expérience nommée avec précision, un manque assumé : la même mécanique que pour n'importe quelle question « tu n'as pas fait X ? ».

Présenter son test technique à l'oral

L'étape décisive. Une seule règle domine tout le reste : ne lis jamais ton code ligne par ligne. C'est le réflexe naturel — écran partagé, premier fichier, on commence par les imports — et la manière la plus sûre de perdre ton auditoire en quatre-vingt-dix secondes : ton interlocuteur ne peut pas lire du code inconnu à la vitesse où tu le commentes, il décroche, puis pose des questions au hasard pour reprendre la main.

La solution : raconter l'architecture, et ne descendre dans le code qu'une fois, sur un chemin choisi. D'où le plan qui suit.

📖 La formule

Le plan de présentation en 5 temps

1. Le problème    — « On devait construire X, avec les contraintes Y. »
2. L'architecture — « J'ai découpé en A, B, C ; l'état vit dans A parce que… »
3. Une trace      — « Voici ce qui se passe quand l'utilisateur clique ici,
                     jusqu'au serveur. »
4. Un choix       — « J'ai pris X plutôt que Y parce que… »
5. La suite       — « Avec une journée de plus : validation serveur, tests,
                     accessibilité. »

Le même plan tient en cinq minutes comme en trente : chaque temps se dilate ou se comprime sans que la structure change. Et il évite le récit ligne par ligne, qui perd tout le monde — y compris toi.

Pour voir ce plan rempli avec du vrai contenu plutôt qu'avec des crochets, le module Étude de cas : la solution disséquée le déroule de bout en bout sur le projet de prise de rendez-vous. Chaque temps a son piège propre.

1. Le problème, en une phrase. Reformule l'énoncé avec tes mots, contraintes comprises. Ça paraît inutile — « ils connaissent leur énoncé » — mais ça vérifie que vous parlez de la même chose : si tu as mal compris une exigence, tout le monde le sait dans les dix premières secondes plutôt qu'à la fin. Et ça montre que tu sais résumer. Le piège : réciter l'énoncé mot pour mot.

2. L'architecture, en une phrase par pièce. Nomme les trois ou quatre morceaux et dis où vit l'état. Pas de fichiers, pas de noms de fonctions : des rôles. « Il y a la page, qui charge les données et tient l'état de sélection ; le sélecteur, qui remonte un choix ; le formulaire, qui reçoit une configuration et rend des champs ; et un composant de champ, réutilisé pour les trois types. » En quatre phrases, ton interlocuteur a une carte mentale à laquelle raccrocher la suite. Le piège : commencer par l'arborescence des dossiers — personne n'a jamais compris une application en écoutant la liste de ses dossiers.

Ce « composant de champ, réutilisé pour les trois types » porte un nom, et le nommer vaut mieux que le décrire : c'est Le traducteur unique du module Étude de cas : la solution disséquée — un seul endroit du projet traduit le vocabulaire des données ("dropdown", "phone") vers celui du HTML (<select>, type="tel"), et partout ailleurs on parle « config ». Poser un nom de patron à l'oral fait ce que fait un bon nom de variable : ton interlocuteur sait immédiatement où ranger ce que tu viens de dire, et il n'a plus besoin de te demander pourquoi ce composant existe.

3. Une trace, de bout en bout. Le cœur, et ce que presque personne ne fait. Choisis une action utilisateur et suis-la complètement : le clic, le gestionnaire, le changement d'état, le nouveau rendu, l'appel réseau, le traitement serveur, le retour, l'affichage. Une seule trace bien racontée démontre plus de compréhension que dix fichiers survolés, parce qu'elle prouve que tu as le système entier en tête. Le piège : en choisir deux par crainte que la première ne suffise pas. Une seule, complète.

4. Un choix assumé, avec son alternative. Ici tu ressors la grammaire de la section « La grammaire de la réponse technique ». Choisis d'avance lequel — le plus discutable, pas le plus évident. Présenter spontanément un choix contestable désamorce la question qu'on allait te poser et change ton statut : tu n'es plus interrogé, tu exposes. Le piège : choisir un point trivial pour éviter le débat. On le sent, et la vraie question tombe juste après.

5. La suite. Deux ou trois choses concrètes, calibrées au temps du test. Après quatre heures, ne promets pas l'authentification, le déploiement continu et une refonte : promets la validation côté serveur, deux tests sur la logique de sélection, le passage au clavier. Le piège : la liste trop ambitieuse, qui signale qu'on ne sait pas estimer.

La gestion du temps

Si on t'annonce trente minutes, vise dix à douze minutes de présentation et laisse le reste aux questions. Contre-intuitif — on a envie de tout montrer — mais les questions sont la partie où tu apprends ce qui les intéresse, et où l'exposé devient un échange. Une présentation qui déborde force l'intervieweur à te couper.

Répète à voix haute au moins une fois, chronomètre en main. Pas dans ta tête : les deux ne prennent pas le même temps et ne produisent pas les mêmes phrases. C'est probablement l'heure de préparation la plus rentable du processus.

✍️ Exercice de lecture

Question posée : « as-tu géré l'accessibilité ? ». Le candidat n'a rien fait de particulier. Voici sa réponse.

« Non, je n'ai pas eu le temps. Désolé, c'est vrai que j'aurais dû. »

Questions : (1) Qu'est-ce qui manque à cette réponse, sachant qu'elle est honnête et que l'honnêteté est une bonne chose ? (2) Comment la rendre bonne, sans mentir sur ce qui a été fait ?

Voir le corrigé

(1) L'honnêteté est acquise, et c'est mieux qu'inventer. Ce qui manque, c'est tout le reste : la réponse ne montre pas que le candidat sait ce que serait l'accessibilité s'il l'avait faite — or c'est exactement ce que la question cherchait. Personne n'attend un audit complet sur un test de quatre heures ; on veut savoir si le sujet existe dans ta tête. Là, l'intervieweur ne peut rien conclure : tu connais peut-être le sujet à fond, ou tu n'en as jamais entendu parler. Deux profils très différents, indistinguables.

Le « désolé » aggrave les choses : il transforme un arbitrage en faute. Un arbitrage s'explique, une faute s'excuse. Tu veux être dans le premier registre.

(2) La bonne version garde l'aveu, mais l'entoure : ce que je sais du sujet, ce que j'ai fait sans y penser, ce que je ferais en premier.

« Pas complètement, non. Ce que j'ai fait par défaut, c'est d'utiliser des
balises natives — de vrais <button>, un vrai <form>, des <label> associés à
leurs fields par htmlFor. Ça donne gratuitement le focus, la navigation au
clavier et l'annonce correcte par un lecteur d'écran, et c'est 80 % du travail.

Ce qui manque, et c'est ce que je ferais en premier : les messages d'erreur ne
sont reliés à leur champ que visuellement — il faudrait aria-describedby et
aria-invalid pour qu'un lecteur d'écran les annonce. Ensuite, après la
soumission, le focus reste où il était : il devrait aller sur le message de
confirmation. Et je vérifierais les contrastes, je ne les ai pas mesurés. »

Cette réponse dit exactement la même vérité que la première, mais elle démontre au passage la connaissance du HTML natif, la hiérarchie des priorités et deux points techniques précis. Elle sera perçue comme meilleure en accessibilité que celle de quelqu'un qui aurait saupoudré trois attributs aria sans savoir les expliquer. Détail complet dans « HTML sémantique & accessibilité ».

Retiens le patron, il vaut pour n'importe quelle question « as-tu fait X ? » à laquelle la réponse est non : ce que je sais du sujet → ce qui est déjà là sans que je l'aie forcé → ce que je ferais en premier, précisément.

🧠 Quiz éclair

Ton test technique affichait un formulaire piloté par un fichier de configuration. Pour le temps 3 — la trace — tu hésites entre (a) « l'utilisateur remplit le formulaire et l'envoie » et (b) « l'utilisateur choisit un service qui n'a aucune configuration à son nom ». Laquelle racontes-tu ?

(b), et c'est un choix qui se prépare la veille. Le chemin nominal existe dans tous les rendus : le raconter démontre que ta plomberie fonctionne, ce dont personne ne doutait puisque l'application démarre. Le cas de repli, lui, ne peut être traité que par quelqu'un qui a ouvert les données avant de coder et remarqué qu'un service n'était couvert par aucune configuration.

Une seule trace te fait donc démontrer trois choses à la fois : que tu as lu la matière première, que tu as vu le cas limite, et que tu l'as traité exprès plutôt que par accident. En prime, elle t'amène naturellement sur ton terrain — « et si aucune des deux recherches ne trouve rien ? » — au lieu de te laisser subir la question.

La règle reste : une trace, complète, du clic jusqu'à ce que l'écran affiche. Deux traces à moitié racontées par peur que la première ne suffise pas, c'est le piège de ce temps-là.

Le live coding

Tout le monde le redoute, pour une mauvaise raison : on croit qu'on est évalué sur le résultat. On ne l'est pas, ou très peu. Un exercice de live coding est calibré pour être un peu trop long ; il est fréquent que personne ne le finisse. Ce qu'on observe, c'est comment tu travailles quand on te regarde — le seul moment du processus où l'on voit ton processus en direct au lieu de son résultat déjà propre. Quatre comportements font la différence.

Un — clarifie l'énoncé avant de taper. Une minute, reformule, pose deux questions. « Est-ce que la liste peut être vide ? » « Les identifiants sont-ils uniques ? » « Tu veux que je gère l'échec de la requête, ou je me concentre sur le chemin nominal ? » Chacune est un point marqué, pour une raison sans rapport avec l'exercice : en équipe, celui qui clarifie avant de coder est celui qui ne perd pas deux jours à construire la mauvaise chose. Et une bonne question révèle souvent que l'énoncé était volontairement ambigu — c'était l'épreuve.

Deux — pense à voix haute, tout le temps. Le silence est ton pire ennemi : quand tu te tais, ton évaluateur n'a plus rien à évaluer et commence à imaginer le pire. Dis ce que tu fais même quand c'est trivial (« je commence par une fonction qui prend le tableau et rend le tableau filtré, je m'occupe du rendu après »), et surtout ce que tu envisages (« je pourrais faire une boucle imbriquée mais ça va être lent si la liste grossit, donc je vais plutôt construire un index »). Second bénéfice : quand tu penses fort et que tu pars dans la mauvaise direction, on te rattrape. En silence, on te laisse aller au bout.

Trois — fais marcher avant de faire beau. Écris la version bête qui fonctionne, dis explicitement que c'est la version bête, améliore si le temps le permet. « Là je fais un double parcours, c'est du n fois m ; ça marche, et si on a le temps je le remplacerai par une Map. » Tu as du code qui tourne — le socle le plus rassurant qui soit — et tu as prouvé que tu voyais le problème. Chercher l'élégance d'emblée finit souvent en écran à moitié écrit qui ne s'exécute pas.

Quatre — termine en disant ce que tu testerais. Même sans écrire de test, nommer trois cas prend quinze secondes : « le cas nominal, le tableau vide, et le cas où aucun élément ne correspond — c'est celui-là qui casse le plus souvent, parce que ça renvoie undefined et que le rendu explose plus loin. » Tu montres que tu penses aux cas limites sans qu'on te les demande.

🧭 Si tu bloques vraiment

Ça arrive, y compris à des gens très compétents — le stress consomme la mémoire de travail, c'est physiologique. La sortie n'est pas de te taire en fixant l'écran, c'est de rendre ton blocage explicite : « je bloque sur la façon de relier ces deux morceaux. Voici ce que j'ai essayé, voici pourquoi ça ne marche pas. Est-ce que je peux repartir d'un exemple plus petit ? »

Trois raisons d'y aller : tu montres que tu sais nommer un blocage (en équipe, ça économise des journées entières), tu donnes à l'intervieweur l'occasion de t'aider — et il le fera presque toujours, parce que travailler ensemble sur un problème est ce qu'il cherche à simuler —, et tu redescends en pression, ce qui débloque souvent la solution dans la minute.

Les 48 heures avant, et le jour même

La règle qui gouverne tout : à ce stade, on relit, on n'apprend pas. Un savoir frais est un savoir fragile, et un savoir fragile sous stress devient un savoir faux. Pire, il t'incitera à en parler — et c'est toujours sur les sujets à moitié digérés qu'on se fait démonter. À quarante-huit heures, le rendement est entièrement dans la consolidation.

  • Relis tes propres notes, pas des tutoriels. Tes notes sont organisées selon ta tête ; un cours neuf ne l'est pas. Ici, la relecture la plus rentable est celle des encadrés « À retenir » et « 🎤 En entrevue ».
  • Prépare trois histoires de projet réutilisables — un bug difficile, une décision d'architecture, un apprentissage. Les mêmes trois répondent à une dizaine de questions, à condition de savoir les raconter en deux minutes. Écris-les au format Situation → Action → Résultat → Ce que j'en ai tiré, et dis-les une fois à voix haute.
  • Relis ton propre rendu avec la grille de critique : trois faiblesses, trois corrections. Une heure, et deux questions fréquentes sont couvertes.
  • La logistique, la veille : caméra, micro, partage d'écran testé pour de vrai, projet qui démarre sans erreur, éditeur en gros caractères, connexion de secours, de l'eau à portée de main, et cinq minutes d'avance le jour J.
  • Écris tes trois questions de fin. Sur papier, à côté de toi. Sous pression, on oublie même celles qu'on avait trouvées excellentes.
  • Dors plus que tu ne révises. Pas un conseil de bien-être, un calcul : les deux capacités qui te serviront le plus — mémoire de travail et vitesse de récupération d'un souvenir — sont celles que la fatigue détruit en premier. Une heure de révision à minuit coûte plus qu'elle ne rapporte.

Le jour même : relis tes notes une seule fois, le matin, puis referme tout. Et si tu as le droit à des notes (en visioconférence, tu l'as toujours), garde une seule feuille visible : le plan en cinq temps, tes trois histoires en trois mots chacune, tes trois questions. Pas plus — une feuille dense, on la lit au lieu de parler.

🎤 En entrevue

« Pourquoi le frontend ? »

« Parce que c'est la partie du système dont l'effet est immédiatement visible : je change une ligne, et quelqu'un voit quelque chose de différent. Ça a l'air anecdotique mais pour moi c'est déterminant — j'apprends beaucoup plus vite quand la boucle de retour est courte, et c'est comme ça que j'ai appris tout ce que je sais.

Ce qui m'intéresse aussi, c'est que le frontend est l'endroit où les contraintes se rencontrent : il faut que ce soit rapide, que ce soit compréhensible, que ça marche au clavier, que ça résiste à un mauvais réseau, et que ça reste maintenable. Sur mon application mobile, la contrainte du hors-ligne m'a forcé à réfléchir à des états auxquels je n'aurais jamais pensé autrement — l'écriture pas encore synchronisée, l'échec silencieux, la reprise. J'ai trouvé ça beaucoup plus riche que ce que j'imaginais du métier au départ. »

« Où te vois-tu dans un an ? »

« Honnêtement, à un an, mon objectif est assez concret : être autonome sur une fonctionnalité de bout en bout dans une vraie base de code — comprendre l'existant, faire mes choix, les défendre en revue de code, et livrer sans qu'on doive tout reprendre derrière moi.

Ce que je cherche surtout, c'est ce que je ne peux pas obtenir seul : travailler sur du code que je n'ai pas écrit, et me faire relire. J'ai appris en autodidacte, ce qui veut dire que j'ai développé de bons réflexes mais aussi probablement des angles morts que je ne peux pas voir tout seul. C'est exactement ce qu'un stage corrige. »

« As-tu des questions pour nous ? »

Jamais « non ». Trois questions préparées, et on choisit selon ce qui a été dit :

« À quoi ressemble la revue de code chez vous — est-ce qu'un stagiaire fait relire toutes ses pull requests, et par qui ? » — tu montres que tu attends du retour.

« Quelle est la partie du code que vous trouvez la plus difficile pour quelqu'un qui arrive ? » — concrète, sincère, et la réponse t'apprend beaucoup sur l'état réel du projet.

« Sur quoi travaillerait un stagiaire pendant ses deux premières semaines ? » — tu te projettes dans le travail, pas dans le poste.

Une quatrième, si l'échange a été chaleureux : « qu'est-ce qui distingue, pour vous, un stagiaire qui s'en sort bien de un qui rame ? » La réponse est presque toujours utile, et elle est parfois surprenante.

Après l'entrevue

Deux gestes, dont le second est le plus important pour la suite de ta recherche.

Le email de suivi, dans les vingt-quatre heures, cinq à six lignes. Remercie, puis fais une chose que la plupart ne font pas : rebondis sur un point précis de la conversation. Si une question t'a mis en difficulté et que tu as trouvé la réponse depuis, c'est le moment idéal — « vous m'aviez demandé comment j'aurais géré l'invalidation du cache ; j'y ai repensé, et je crois que la bonne approche aurait été… ». Geste rare, et exactement le signal qu'on cherche chez un stagiaire : quelqu'un qui repart avec la question et revient avec la réponse.

Le refus, converti en information. Un refus n'est pas une évaluation de ta valeur : c'est une décision prise avec très peu de données, souvent entre plusieurs candidats corrects, parfois pour des raisons sans rapport avec toi — un budget, un profil déjà en tête, un projet reporté. Mais il contient presque toujours de l'information exploitable.

  • Demande un retour, une fois, poliment, sans négocier. « Merci de l'avoir considéré. Si vous avez deux minutes, y a-t-il un point précis sur lequel vous me conseilleriez de travailler ? » Beaucoup ne répondront pas ; ceux qui répondent donnent parfois une phrase qui vaut des semaines de devinettes. Ne discute jamais le retour reçu : tu remercies, tu notes, tu analyses plus tard.
  • Note les questions qui ont coincé, le jour même. Toutes celles qui t'ont fait hésiter, y compris — surtout — celles auxquelles tu as fini par bien répondre après un blanc. C'est une carte de tes trous, dressée par des professionnels, gratuitement.
  • Rattache chaque question à un module. L'étape qui transforme la liste en plan de travail. « Je n'ai pas su expliquer pourquoi ce composant devait être client » → « Server et Client Components ». « J'ai pataugé sur la validation » → « Formulaires 2 ». « Je n'ai pas su critiquer mon code » → « Lire et critiquer du code frontend ». Tu obtiens deux ou trois modules à relire, priorisés par le terrain plutôt que par ton intuition.

Mené ainsi, un refus devient un diagnostic. Le renversement coûte un effort réel — un refus fait mal, l'envie naturelle est de tourner la page vite. Mais la deuxième entrevue d'une série est presque toujours meilleure que la première, et ce n'est pas de la chance : c'est le retour de la première, exploité.

À retenir

On n'évalue pas l'étendue de ce que tu sais, mais ta capacité à raisonner à voix haute, à dire « je ne sais pas » proprement, et à apprendre vite. La grammaire de toute réponse technique tient en une formule : « J'ai choisi X parce que [raison liée au contexte] ; l'alternative était Y, qui a l'avantage de [Z], mais ici [pourquoi X gagne]. » Elle prouve que tu connais les deux options et que tu as arbitré selon un contexte.

Pour la présentation de ton test, un seul plan : le problème → l'architecture → une trace de bout en bout → un choix assumé → la suite, jamais de lecture ligne par ligne. Prépare trois faiblesses réelles de ton code, trois histoires de projet en S-A-R-A, et trois questions à poser à la fin. En live coding : clarifie avant de taper, pense fort, fais marcher avant de faire beau, termine par ce que tu testerais.

Enfin : ton projet personnel est de l'expérience, à condition de le raconter comme une suite de problèmes résolus. Et un refus est un diagnostic gratuit, à condition d'aller chercher le retour et de rattacher chaque trou à un module.

Et ailleurs : ce module décrit une compétence qui ne s'arrête pas à l'embauche — rendre son raisonnement lisible par quelqu'un d'autre. La même s'exerce dans le message d'une pull request (« voici le problème, voici l'approche, voici ce que j'ai écarté »), dans une décision d'architecture écrite pour ses collègues futurs, dans un rapport de bug, dans une estimation. La formule « X plutôt que Y parce qu'ici » n'est pas une astuce d'entrevue : c'est le format standard de la communication technique en équipe.

Retournement le plus utile : ce module te demande de raconter pourquoi tu as fait tes choix — donc prends l'habitude de le noter au moment où tu les fais. Deux lignes dans un message de commit ou un commentaire tagué NOTE suffisent. Tu écris ta préparation d'entrevue au fil de l'eau, et tu produis en même temps la trace qui rend un code compréhensible six mois plus tard. Deux bénéfices, un seul geste.

🗂️ L'aide-mémoire
Les cinq étapes d'un processus de stage, et ce qu'elles durent
premier appel 20–30 min ; test technique à la maison 2 à 6 h ; présentation du code 30–45 min ; entrevue technique 45–60 min ; live coding 30–45 min, parfois
Ce qu'on fait quand on bloque, en direct
on rend le blocage explicite : « je bloque sur… ». Le silence est le pire des choix — il cache le raisonnement, qui est justement l'objet de l'exercice
La règle des 48 heures avant
on relit, on n'apprend pas — et on relit ses propres notes plutôt que des tutoriels : elles sont organisées comme ta tête
Le délai et la longueur du courriel de suivi
dans les vingt-quatre heures, cinq à six lignes
Ce qu'on demande après un refus, et comment
un retour, une seule fois, poliment, sans négocier. On remercie, on note, on analyse plus tard — jamais on ne discute la réponse reçue
Les questions à noter le jour même
toutes celles qui ont fait hésiter, y compris celles auxquelles tu as fini par bien répondre après un blanc. Puis rattache chacune à un module : la liste devient un plan de travail priorisé par le terrain