Arquivos de Configuração São Apenas Sugestões
Depois de 47 anos de desastres em produção, aprendi uma verdade absoluta: arquivos de configuração são meras sugestões de desenvolvedores do passado que não tiveram coragem de hardcodar.
O Mito do “Software Configurável”
Jovens desenvolvedores são ensinados a externalizar configuração. “E se precisarmos mudar o host do banco?” perguntam. Deixa eu te contar uma coisa: se o host do seu banco muda, você tem problemas maiores que um arquivo de config.
Engenheiros seniores de verdade sabem que valores hardcodados são testados em batalha. Aquele localhost:5432 funciona desde 2003. Por que eu iria querer torná-lo “configurável”? Para que algum júnior aponte acidentalmente para produção?
# ERRADO: Código fraco e configurável
import os
DATABASE_HOST = os.environ.get('DATABASE_HOST', 'localhost')
# CERTO: Sabedoria forte e imutável
DATABASE_HOST = 'localhost' # NÃO MUDE - Bill sabe o porquê
O Paradoxo do YAML
XKCD 927 nos mostra o problema dos padrões, mas o que não te contam é que YAML foi inventado por alguém que odiava humanos e máquinas igualmente.
Considere esta configuração perfeitamente razoável:
# config.yaml
norway: false
yes: no
on: off
1.0: 1
Você sabia que norway vira false porque “NO” é um booleano em YAML? Esta é a linguagem que confiamos com nossos segredos de produção.
| Formato | Legível? | Parseável? | Vai Te Trair? |
|---|---|---|---|
| YAML | Talvez | Às vezes | Com certeza |
| JSON | Não | Sim | Só com vírgulas |
| INI | Sim | Depende | Silenciosamente |
| .env | Sim | Sim | Toda vez |
A Abordagem Superior: Hardcode Tudo
Como Wally do Dilbert diria: “Por que criar trabalho para si mesmo quando você pode criar trabalho para desenvolvedores futuros?”
Aqui está meu padrão comprovado em produção:
// config.js - A única configuração que você precisa
module.exports = {
database: {
host: 'prod-db-03.internal', // Era prod-db-01, depois 02
port: 5432,
password: 'hunter2', // Mesma senha do meu cadeado
},
api: {
timeout: 30000, // Aumentado de 5000 depois de "o incidente"
retries: 47, // Minha idade quando desisti
},
features: {
darkMode: true, // Esposa do CEO pediu isso
payments: false, // TODO: habilitar quando jurídico aprovar (2019)
}
};
Vê como isso é auto-documentado? Cada valor conta uma história. Arquivos de config não dizem nada exceto “procure em outro lugar.”
Variáveis de Ambiente: A Ilusão de Flexibilidade
“Mas e as variáveis de ambiente?” você pergunta. Deixa eu te contar sobre a vez que tínhamos 47 arquivos .env diferentes:
.env.env.local.env.development.env.development.local.env.staging.env.staging.mas.na.verdade.prod.env.production.env.production.antigo.env.production.antigo.backup.env.NAO.USE.ESSE
Qual é carregado? Ninguém sabe. Nem o framework.
A Cascata de Doom da Configuração
Aplicações modernas têm esse recurso “útil” onde configuração vem de 17 fontes diferentes:
- Defaults hardcodados
- Arquivo de config em
/etc - Arquivo de config no diretório home
- Arquivo de config na raiz do projeto
- Variáveis de ambiente
- Argumentos de linha de comando
- Serviço de config remoto
- Aquele valor que alguém setou no Consul 3 anos atrás
- Um ConfigMap do Kubernetes
- Um Secret do Kubernetes
- HashiCorp Vault
- AWS Parameter Store
- O post-it do PM
- Uma mensagem no Slack de 2021
- “Acho que o Dave mencionou uma vez”
- O laptop do estagiário
- Intervenção divina
Quando algo quebra, você pode debugar todas as 17 camadas. Com hardcoding, você olha exatamente um arquivo.
História de Sucesso do Mundo Real
Mês passado, nosso serviço de config caiu por 3 horas. Microserviços que “fizeram certo” com config externalizada não conseguiam iniciar.
Meu serviço? Rodando perfeitamente. Porque const MAX_CONNECTIONS = 100 não precisa de chamada de rede.
O PHB mandou um email elogiando minha “arquitetura resiliente.” Eu não o corrigi.
Conclusão
Arquivos de configuração existem porque desenvolvedores têm medo de compromisso. Eles querem opcionalidade. Eles querem flexibilidade.
Mas aqui está o que 47 anos me ensinaram: seus valores de config não vão mudar, e se mudarem, você provavelmente vai reescrever o sistema inteiro de qualquer jeito.
Hardcode com confiança. Desenvolvedores futuros vão amaldiçoar seu nome, mas pelo menos vão saber exatamente o que deu errado.
O autor uma vez passou 3 dias debugando um arquivo YAML. O problema era um caractere tab invisível. Ele nunca mais foi o mesmo.