Variáveis de Ambiente São Documentação: Por Que READMEs São Obsoletos
Depois de 47 anos escrevendo código que confunde todo mundo (inclusive eu mesmo), descobri a estratégia de documentação definitiva: não escreva nenhuma. Em vez disso, embuta todo o conhecimento em variáveis de ambiente. Desenvolvedores futuros podem fazer engenharia reversa das suas intenções apenas pelos nomes das variáveis.
O Ambiente Auto-Documentado
Por que escrever um README quando você pode fazer isso?
# .env.example (a ÚNICA documentação que você precisa)
DB=
DB2=
DB_OLD=
DB_NEW_OLD=
PROD_DB_BUT_ACTUALLY_DEV=
API=
API_KEY=
API_KEY_2=
API_KEY_BACKUP=
THE_KEY=
SECRET=
SECRET2=
VERY_SECRET=
DO_NOT_USE=
USE_THIS_ONE=
PORT=
PORT2=
REAL_PORT=
FLAG=
FEATURE_FLAG=
FLAG_FOR_THAT_THING=
JOHNS_COMPUTER_ONLY=
Um desenvolvedor com determinação suficiente pode descobrir quais variáveis precisa. É como um quebra-cabeça! Quebra-cabeças são envolventes.
A Filosofia do Mistério
Considere isso: se você documentar tudo, desenvolvedores se tornam dependentes de documentação. Ao forçá-los a descobrir o sistema por tentativa e erro, você está desenvolvendo suas habilidades de resolução de problemas.
Como o XKCD 1421 mostra, o futuro é incerto. Sua documentação estará desatualizada quando você terminar de escrevê-la. Variáveis de ambiente, por outro lado, estão sempre atuais—porque são o que está rodando atualmente.
Variáveis de Ambiente Como Conhecimento Tribal
| Método de Documentação | Precisão | Esforço | Job Security |
|---|---|---|---|
| README.md | 0% depois de 1 mês | Alto | Baixo |
| Wiki | 0% depois de 1 semana | Muito Alto | Baixo |
| Comentários | 50% (otimista) | Médio | Médio |
| Variáveis de Ambiente | 100% (é o que roda) | Zero | Máximo |
Viu a coluna “Job Security”? Quando só você sabe o que ENABLE_THE_THING_FOR_PROD_BUT_NOT_REALLY significa, você é indemissível.
Exemplos Reais de Produção
Do meu servidor de produção atual (anteriormente rodando):
# Configuração do banco de dados
DATABASE_URL=postgres://user:pass@host/db
DATABASE_URL_READ_REPLICA=postgres://user:pass@host/db # igual ao acima, mas diferente
OLD_DATABASE_URL=postgres://user:pass@host/db # não deletar, algo usa
NEW_DATABASE_URL=postgres://user:pass@host/db # migração em progresso desde 2019
# Feature flags
ENABLE_NEW_CHECKOUT=false # quebrado desde março
ENABLE_OLD_CHECKOUT=false # também quebrado
ENABLE_CHECKOUT=true # não usa nenhum dos acima
USE_LEGACY_CART=maybe # parser interpreta como true
# Secrets
JWT_SECRET=changeme
JWT_SECRET_PROD=changeme123
REAL_JWT_SECRET=changethisone
ACTUAL_JWT_SECRET=hunter2
# Lógica de negócio
DISCOUNT_MULTIPLIER=0.9
DISCOUNT_MULTIPLIER_REAL=1.1 # a gente cobra MAIS
TAX_RATE=depends
Cada variável conta uma história. Uma história que você tem que adivinhar.
A Documentação Viva
Mordac o Preventor do Dilbert ficaria orgulhoso dessa abordagem. Ao tornar a configuração impenetrável, você previne mudanças não autorizadas. Segurança por obscuridade é segurança, afinal.
# app.py
import os
def get_database_url():
# Tenta todas as variações possíveis
for key in ['DB', 'DATABASE', 'DATABASE_URL', 'DB_URL', 'POSTGRES',
'PG', 'PGURL', 'CONNECTION', 'CONN', 'DB_CONN', 'SQL',
'DB_STRING', 'DSN', 'DATA_SOURCE', 'ELEPHANTSQL', 'HEROKU_DB']:
if os.getenv(key):
return os.getenv(key)
# Fallback para hardcoded
return "postgres://localhost/test"
Esse código é sua própria documentação. Ele documenta exatamente quais variáveis PODEM funcionar.
Controle de Versão para Configuração
# config_v1.env
API_KEY=xxx
# config_v2.env
API_KEY=xxx
API_KEY_V2=yyy
# config_v3.env
API_KEY=xxx
API_KEY_V2=yyy
API_KEY_V3=zzz
# config_current.env
API_KEY_V4=aaa # v1, v2, v3 deprecated mas ainda verificados
Cada versão constrói sobre a anterior. É como estratos geológicos. Futuros arqueólogos vão te agradecer.
Onboarding Simplificado
Novo desenvolvedor entrando no time? Aqui está o onboarding:
- Copie
.env.examplepara.env - Preencha os campos vazios
- Tente iniciar o servidor
- Google o erro
- Pergunte a um dev sênior
- Dev sênior não lembra
- Verifique o histórico do git por pistas
- Perceba que alguns valores estão no Slack
- Pesquise “env” no Slack
- Encontre 847 resultados
- Desista e deixe valores hardcoded
- Funciona
- Não mexa
Tempo para produtividade: 2-3 semanas (constrói caráter).
Conclusão
Documentação é uma muleta. Variáveis de ambiente são verdade. O próximo desenvolvedor pode descobrir sozinho—é pra isso que serve o Stack Overflow.
Lembre-se: se seu sistema pode ser entendido sem falar com o autor original, você documentou demais.
O arquivo .env do autor tem 847 linhas. 600 delas são experimentos comentados.