StuartTech & Data
Préparer un entretien : Back-End Developer
Recrutement historique. Cette synthèse ne constitue pas une offre d’emploi actuellement ouverte.
Fondateurs Avanttoi — Synthèse éditoriale
Sommaire
Fondateurs Avanttoi — Synthèse éditoriale
Synthèse originale de faits rapportés dans un témoignage de candidat, non authentifié par Avanttoi. Les conseils et exercices sont créés par Avanttoi. Cette expérience n’a pas été vécue par les fondateurs et ne décrit pas nécessairement le recrutement actuel de l’entreprise.
Back-End Developer — Paris, France
Période des entretiens · avril 2019
- Le candidat rapporte un entretien téléphonique RH de trente minutes, suivi d'un entretien avec le N+1 d'environ une heure en visioconférence.
- Un test technique de sélection de trente minutes précède un test technique à distance d'environ sept heures, minuté, jugé « long mais amusant » par le candidat, puis un débriefing d'une heure et plusieurs entretiens sur site.
Publication du témoignage : Date de publication non précisée. Le lien de provenance est conservé dans le dossier éditorial privé.
Questions et thèmes réellement rapportés
Les citations conservent la formulation publiée par le candidat. Les thèmes décrivent le sujet documenté lorsque l’énoncé complet n’est pas disponible. Les corrigés d’entraînement figurent dans la partie Avanttoi.
Test technique à distance minuté d'environ sept heures
Test technique à distance, avant le débriefing
Après un test de présélection de trente minutes, le candidat effectue un test technique à distance d'environ sept heures, minuté, qu'il qualifie lui-même de « long mais amusant », suivi d'un débriefing d'une heure avec l'équipe technique. Le contenu précis de l'épreuve (langage, sujet fonctionnel) n'est pas publié.
Ce que vous pouvez travailler
Un test technique à distance de plusieurs heures, même qualifié d'« amusant » par un candidat, se prépare comme une petite mission réelle plutôt que comme un quiz : la gestion du temps compte autant que la justesse du code. Avant d'écrire la première ligne, il vaut mieux clarifier par écrit les entrées, sorties et cas limites attendus, puis découper le temps disponible en blocs (compréhension, implémentation, tests, relecture) avec des points d'arrêt francs plutôt que de coder en continu jusqu'à l'échéance. Sur des sujets classiques de back-end comme la limitation de débit, l'idempotence d'un point d'entrée ou la gestion de la concurrence, la difficulté n'est pas l'algorithme central mais les décisions annexes : que se passe-t-il en cas de clé inconnue, de requête en double, de panne partielle ? Documenter ces décisions dans le code ou un court README, même sommaire, montre une maturité d'ingénierie que le simple fonctionnement du programme ne suffit pas à démontrer. Enfin, garder du temps pour écrire quelques tests, même minimalistes, est presque toujours plus rentable en entretien qu'une fonctionnalité supplémentaire non testée.
Entraînez-vous sur des cas originaux
Ces scénarios pédagogiques et leurs corrigés ne sont pas des questions posées par Stuart.
Implémenter un limiteur de débit par fenêtre glissante
Exercice original Avanttoi. Implémentez en Python une classe LimiteurDebit(max_requetes, fenetre_secondes) avec une méthode autoriser(cle, maintenant) qui renvoie True si la requête est autorisée pour cette clé (par exemple un identifiant client) et False sinon, en n'autorisant jamais plus de max_requetes requêtes dans une fenêtre glissante de fenetre_secondes secondes se terminant à l'instant maintenant. Chaque clé doit avoir son propre compteur indépendant.
Voir le corrigé et les critères
Corrigé pédagogique
La classe rendue est la suivante :
class LimiteurDebit:
def __init__(self, max_requetes, fenetre_secondes):
self.max_requetes = max_requetes
self.fenetre = fenetre_secondes
self.historique = {}def autoriser(self, cle, maintenant): journal = self.historique.setdefault(cle, []) seuil = maintenant - self.fenetre while journal and journal[0] <= seuil: journal.pop(0) if len(journal) >= self.max_requetes: return False journal.append(maintenant) return True ```
Chaque clé possède son propre journal d'horodatages dans le dictionnaire historique, ce qui isole les compteurs entre clients. À chaque appel, les horodatages plus anciens que maintenant moins fenetre_secondes sont retirés du début du journal (fenêtre glissante, pas fenêtre fixe), avant de comparer sa longueur au maximum autorisé. Si le journal a atteint le maximum après nettoyage, la requête est refusée sans être enregistrée ; sinon elle est acceptée et son horodatage est ajouté. Cette implémentation est une création pédagogique Avanttoi ; elle ne reproduit pas le test réel demandé par Stuart, dont le contenu exact n'est pas publié.
Pour évaluer votre réponse
La fenêtre est bien glissante (basée sur maintenant - fenetre_secondes) et non fixe, chaque clé a un compteur indépendant, une requête refusée n'est pas comptabilisée dans le journal, et le code s'exécute sans erreur sur des appels avec des instants croissants.
Concevoir un point d'entrée d'API idempotent pour un webhook de paiement
Exercice original Avanttoi. Un fournisseur de paiement peut renvoyer plusieurs fois le même événement de webhook (au moins une livraison, sans garantie d'unicité). Décrivez la conception d'un point d'entrée POST /webhooks/paiement qui traite chaque événement de paiement exactement une fois côté métier, même si le même événement est reçu deux fois, en précisant la donnée que vous stockez, à quel moment, et ce que renvoie le point d'entrée lors d'un doublon.
Voir le corrigé et les critères
Corrigé pédagogique
La conception repose sur une clé d'idempotence stable, ici l'identifiant d'événement fourni par le fournisseur de paiement (par exemple event_id). Avant tout traitement métier, le point d'entrée tente d'insérer cet event_id dans une table ou un index dédié avec une contrainte d'unicité, dans la même transaction que l'effet métier (par exemple la mise à jour du statut de la commande). Si l'insertion réussit, l'événement est traité normalement et la transaction est validée. Si l'insertion échoue à cause de la contrainte d'unicité, cela signifie que l'événement a déjà été reçu : le point d'entrée renvoie alors un statut de succès (par exemple 200) sans rejouer l'effet métier, car du point de vue du fournisseur de paiement l'événement a bien été reçu avec succès la première fois. Stocker la clé et appliquer l'effet métier dans la même transaction évite la fenêtre de risque où un doublon arriverait entre l'enregistrement de la clé et l'application de l'effet. Renvoyer une erreur sur un doublon serait incorrect, car cela inciterait le fournisseur à renvoyer indéfiniment le même événement.
Pour évaluer votre réponse
La clé d'idempotence est l'identifiant d'événement du fournisseur (pas un hachage du corps de la requête, plus fragile), l'enregistrement de la clé et l'effet métier sont dans la même transaction, et un doublon renvoie un succès sans rejouer l'effet plutôt qu'une erreur.
Diagnostiquer une situation de compétition sur un traitement de commandes concurrent
Exercice original Avanttoi. Deux requêtes concurrentes tentent de décrémenter le même stock d'un article (lire la quantité disponible, vérifier qu'elle est positive, puis l'écrire décrémentée d'une unité) sans aucun verrou ni contrainte. Expliquez précisément comment une vente en trop (stock négatif) peut se produire avec ce code, puis proposez un correctif utilisant une contrainte ou une transaction au niveau de la base de données plutôt qu'un verrou applicatif.
Voir le corrigé et les critères
Corrigé pédagogique
Le scénario de vente en trop se produit ainsi : la requête A lit la quantité disponible (par exemple 1), la juge positive ; avant qu'elle n'écrive la nouvelle valeur, la requête B lit à son tour la même quantité encore égale à 1, la juge également positive ; les deux requêtes décrémentent alors chacune de leur côté et écrivent 0, alors que deux ventes ont été acceptées pour un seul article en stock. Le problème vient de la séparation entre la lecture et l'écriture, qui laisse une fenêtre où deux requêtes peuvent lire la même valeur avant qu'aucune n'ait écrit. Le correctif recommandé n'ajoute pas de verrou applicatif en mémoire, qui ne protège pas plusieurs instances du service, mais utilise une opération atomique côté base de données : une mise à jour conditionnelle du type UPDATE stock SET quantite = quantite - 1 WHERE article_id = ? AND quantite > 0, puis vérification du nombre de lignes affectées. Si aucune ligne n'est affectée, cela signifie que le stock était déjà insuffisant au moment de l'écriture, et la vente doit être refusée ; la base de données garantit l'atomicité de la lecture-vérification-écriture pour cette ligne, ce qu'aucun verrou en mémoire de processus ne peut garantir sur plusieurs instances.
Pour évaluer votre réponse
La fenêtre de compétition entre lecture et écriture est expliquée avec un scénario concret à deux requêtes, le correctif utilise une opération atomique côté base de données (mise à jour conditionnelle ou équivalent) plutôt qu'un verrou applicatif en mémoire, et la vérification du nombre de lignes affectées est mentionnée comme moyen de détecter l'échec.
Une séance de préparation ciblée
- 15 minutes : relisez les faits rapportés et notez trois sujets classiques de back-end que vous maîtrisez déjà (API, données, concurrence).
- 45 minutes : réalisez les trois exercices Avanttoi associés à cette fiche dans le temps imparti, puis comparez votre réponse aux critères et aux corrigés.
- 15 minutes : entraînez-vous à découper à voix haute un test technique de plusieurs heures en blocs de temps (compréhension, code, tests, relecture).
Les informations encore inconnues
- Ce compte rendu décrit un recrutement passé, déclaré par son auteur ; il ne constitue pas une validation indépendante ni le processus actuel officiel.
- Le contenu exact du test technique de sept heures (sujet fonctionnel, langage imposé ou non, livrables attendus) n'est pas publié.
- Aucun type de contrat, date de début de poste ou référence d'offre n'est documenté. Le mois affiché est celui de l'entretien.
- Les exercices et corrigés ci-dessous sont des créations pédagogiques Avanttoi ; ils ne reconstituent pas l'épreuve réelle demandée par Stuart.
À demander à votre recruteur
- Quel est le contenu exact du test technique de sept heures (sujet fonctionnel, langage imposé ou non) et le barème utilisé ?
- Quel type de contrat, quelle date de début et quelle référence d'offre sont associés à ce poste de Back-End Developer ?
- Quels outils, bibliothèques et accès (dépôt de code, environnement) sont fournis pendant l'épreuve technique à distance ?