Une condition de concurrence se produit quand deux threads ou requêtes touchent un état mutable partagé et que le résultat dépend du timing. La forme classique, c'est lire, modifier, écrire sans tenir un verrou sur les trois étapes. Pour en trouver une en production, cherchez un état qui est vérifié puis utilisé, ajoutez des logs corrélés autour de cette séquence, reproduisez sous une vraie concurrence plutôt que dans un test unitaire, et laissez les contraintes de la base attraper la violation.
Pourquoi les recruteurs posent cette question
Ces bugs coûtent cher et l'approche de débogage sépare les ingénieurs expérimentés du reste. Le recruteur veut que le motif lire-modifier-écrire soit nommé, la compréhension qu'ajouter un verrou n'est pas automatiquement correct si la portée est mauvaise, et une approche de diagnostic qui accepte qu'on ne reproduit pas un bug de timing en cliquant en local. Pousser l'invariant dans la base est la réponse qu'il espère.
Comment structurer votre réponse
- Définissez la course comme un état mutable partagé plus du timing.
- Nommez explicitement le motif lire-modifier-écrire.
- Décrivez comment vous la reproduiriez sous concurrence.
- Proposez un correctif qui déplace l'invariant dans la base.
Exemple de réponse
Une course a besoin de deux choses : un état mutable partagé, et deux chemins qui l'atteignent en même temps. Presque toutes celles que j'ai déboguées ont la même forme, une vérification suivie d'une action avec un écart entre les deux. Lire le solde, décider qu'il est suffisant, écrire le nouveau solde. Deux requêtes s'entrelacent et le chiffre est faux. Les trouver en production, c'est surtout accepter qu'on ne peut pas cliquer jusqu'à une reproduction. J'écris un script qui envoie la même requête deux cents fois en parallèle, parce que la fenêtre fait peut-être deux millisecondes. Ensuite je logue avec un identifiant de requête de part et d'autre de la lecture et de l'écriture, pour voir l'entrelacement dans la chronologie. Pour le correctif, j'essaie de déplacer l'invariant dans la base plutôt que dans l'appli : un update avec une clause where sur la valeur attendue, ou une contrainte d'unicité, pour que la base l'impose. Les verrous au niveau applicatif ne marchent que si tous les écrivains passent par votre code, et un jour l'un d'eux ne le fera pas.
Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.
Voir comment ça marcheQuestions de relance à prévoir
- En quoi un verrou distribué change-t-il votre réponse ?
- Quelle est la différence entre une condition de concurrence et une course de données ?
- Comment écririez-vous un test qui attrape ça en CI ?
Autres questions pour Ingénieur logiciel
Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.
Prédire mes questions