Pergunta de entrevista para Engenheiro de Software

Você precisa adicionar uma coluna não nula a uma tabela com 500 milhões de linhas. Como você entrega isso sem downtime?

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

Resposta rápida

Faça em etapas. Adicione a coluna como nullable sem default para a mudança ser só de metadados, suba código que escreve nela em todo caminho enquanto ainda tolera nulos, faça backfill em lotes pequenos com pausas para locks e replicação ficarem saudáveis, verifique que não restam nulos, aí adicione a restrição not null (validada separadamente onde houver suporte) e remova o código de fallback. Nunca um único ALTER bloqueante numa tabela desse tamanho.

Por que os entrevistadores perguntam isso

Essa é a migração expand and contract, e ela separa quem já entregou contra tabelas grandes de quem não entregou. Os entrevistadores querem a sequência de múltiplos deploys, consciência de que um ALTER ingênuo pega um lock e reescreve a tabela, lotes para proteger réplicas, e a disciplina de verificar antes de impor. Também sonda se você considera deploys graduais em que código antigo e novo rodam ao mesmo tempo.

Como estruturar sua resposta

  • Rejeite a migração bloqueante única explicitamente.
  • Exponha a sequência de expandir, backfill e contrair.
  • Explique o loteamento e por que ele protege as réplicas.
  • Considere código antigo e novo rodando lado a lado.

Exemplo de resposta

Exemplo falado, em primeira pessoa

A coisa que eu não vou fazer é um único ALTER que adiciona uma coluna not null com default, porque num engine mais antigo aquilo reescreve a tabela inteira sob um lock exclusivo e o serviço fica fora por todo o tempo que aquilo levar. Então eu expando primeiro: adiciono nullable, o que no Postgres moderno é mudança de metadados e efetivamente instantânea. Depois eu subo código que escreve a coluna nova em todo insert e update enquanto ainda tolera nulos na leitura, porque durante um deploy gradual pods antigos e novos estão vivos e eu não posso assumir o contrário. Depois o backfill, em lotes de talvez dez mil linhas indexados pela chave primária com um sleep curto entre eles, observando a defasagem de replicação enquanto roda e desacelerando se a defasagem subir. Quando a contagem de nulos for zero eu adiciono a restrição, e no Postgres eu adicionaria como not valid e validaria separadamente para pegar um lock mais fraco. O último deploy remove o fallback. Cada passo é reversível individualmente.

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 você faria rollback depois que o backfill começou?
  • E se o backfill precisar de lógica de aplicação por linha?
  • Como isso seria diferente no MySQL?

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