Uma condição de corrida acontece quando duas threads ou requests tocam estado mutável compartilhado e o resultado depende do timing. O formato clássico é ler, modificar, escrever sem segurar um lock nos três passos. Para achar uma em produção, procure estado que é checado e depois usado numa ação, adicione logging correlacionado em volta dessa sequência, reproduza sob concorrência real em vez de num teste unitário, e deixe restrições do banco pegarem a violação.
Por que os entrevistadores perguntam isso
Esses bugs são caros e a abordagem de depuração separa engenheiros experientes do resto. Os entrevistadores querem o padrão ler modificar escrever nomeado, o entendimento de que adicionar um lock não é automaticamente correto se o escopo estiver errado, e uma abordagem diagnóstica que aceita que você não reproduz um bug de timing clicando por aí localmente. Empurrar o invariante para dentro do banco é a resposta que eles esperam.
Como estruturar sua resposta
- Defina a corrida como estado mutável compartilhado mais timing.
- Nomeie o padrão ler modificar escrever explicitamente.
- Descreva como você reproduziria sob concorrência.
- Ofereça uma correção que move o invariante para o banco.
Exemplo de resposta
Uma corrida precisa de duas coisas: estado mutável compartilhado, e dois caminhos chegando nele ao mesmo tempo. Quase toda que eu já depurei tem o mesmo formato, uma checagem seguida de uma ação com um intervalo no meio. Ler o saldo, decidir que é suficiente, escrever o saldo novo. Dois requests se intercalam e o número fica errado. Achar isso em produção é principalmente aceitar que você não chega no repro clicando. Eu escrevo um script que dispara o mesmo request umas duzentas vezes concorrentemente, porque a janela pode ter dois milissegundos de largura. Aí eu logo com um request id dos dois lados da leitura e da escrita, para conseguir ver a intercalação na linha do tempo. Para a correção eu tento mover o invariante para o banco em vez da aplicação: um update com um where no valor esperado, ou uma restrição única, para o banco impor. Locks em nível de aplicação só funcionam se todo escritor passar pelo seu código, e mais cedo ou mais tarde um não vai passar.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Como um lock distribuído muda sua resposta?
- Qual é a diferença entre uma condição de corrida e uma corrida de dados?
- Como você escreveria um teste que pega isso no CI?
Mais perguntas para Engenheiro de Software
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas