01
A flag esquecida não é um if morto, é um multiplicador de estados
O argumento mais comum contra a limpeza é que a flag desligada não custa nada, porque a condição resolve em falso e o corpo nunca executa. O custo real não está no tempo de execução, está no número de estados que o sistema declara suportar. Cada flag booleana viva dobra o espaço de combinação do código que ela envolve, e como as flags não são independentes entre si, dez flags ativas descrevem mil vinte e quatro configurações possíveis. Nenhum time testa mil vinte e quatro configurações. O que acontece na prática é que uma dúzia de combinações é exercitada em produção e o restante existe apenas como promessa não verificada dentro do repositório.
A consequência aparece quando alguém precisa mudar o código adjacente. O engenheiro que abre o arquivo dois anos depois não sabe se a variante antiga ainda tem tráfego, não sabe se pode apagar o ramo do else, e o caminho mais barato para ele é preservar os dois lados e adicionar o terceiro. É assim que a dívida cresce sem que ninguém tome uma decisão errada isoladamente: cada escolha individual de preservar o desconhecido é razoável, e a soma delas produz um arquivo onde ninguém mais consegue afirmar o que está em produção.
Existe ainda um custo que aparece só no incidente e que é o mais caro dos três. Quando algo quebra às duas da manhã, a primeira pergunta é qual código o cliente afetado estava executando, e a resposta depende de resolver o estado de todas as flags que atravessam aquele caminho para aquele usuário naquele instante. Com flags limpas, isso é ler o arquivo. Com setenta flags vivas e histórico de valores não retido, isso é uma investigação que consome o tempo do incidente inteiro antes de qualquer diagnóstico começar.
| Tipo de flag | Vida esperada | Sinal de que virou dívida | Destino correto |
|---|---|---|---|
| Rollout de release | Dias a semanas | Cem por cento em uma variante há mais de um ciclo | Remover código e chave |
| Experimento A/B | Duração do teste | Análise já publicada e decisão tomada | Remover o braço perdedor e a chave |
| Kill switch operacional | Permanente por design | Nunca acionada e sem teste de acionamento | Manter, documentar e exercitar |
| Permissão por plano ou cliente | Permanente por design | Regra de negócio escondida em serviço de flags | Mover para autorização, sair do sistema de flags |
| Configuração de ambiente | Permanente | Valor idêntico em todos os ambientes há meses | Fixar no código e remover a chave |
A tabela existe porque o erro mais frequente na limpeza não é esquecer de remover, é remover a coisa errada. Um kill switch de dependência externa passa anos sem ser acionado e parece exatamente igual a uma flag de rollout esquecida quando você olha só a telemetria de uso. A diferença não está no dado, está na intenção declarada no momento da criação, e é por isso que o tipo precisa ser um campo obrigatório da flag e não uma convenção de nome.