Pergunta de entrevista para Engenheiro de Software

O que causa uma condição de corrida, e como você acha uma que só aparece em produção?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

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

Exemplo falado, em primeira pessoa

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 funciona

Perguntas 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

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot