Como eu trabalho
Regra em dado, não em código
Sempre que a regra é do negócio e muda na velocidade do negócio, ela sai do código e vira configuração. Aconteceu na política de risco dos canais de pagamento e no motor de paradas da fábrica. O custo é que a configuração vira parte crítica do sistema e precisa de cuidado próprio; o retorno é que o negócio deixa de esperar a fila de desenvolvimento.
Isso tem limite, e reconhecer o limite é parte da regra. Em comissionamento eu decidi o contrário, porque ali o que varia é a fórmula e não quais etapas se aplicam. Ver ADR 4 — Uma implementação por canal, não um motor parametrizado.
Extrair depois do terceiro caso
Abstração criada por antecipação quase sempre está errada. Só o terceiro uso mostra o que é essencial e o que era acidente do primeiro. As 8 bibliotecas das quais sou autor principal e os 5 pacotes públicos nasceram todos de código que já rodava em mais de um lugar.
Estado derivado, nunca atribuído
Quando um agregado tem estado que depende das suas partes, esse estado é calculado, não escrito.
Quem escreve status = concluido cria a chance de o status mentir. Custa uma função de recálculo e
elimina uma categoria inteira de bug de suporte.
Idempotência em tudo que vem de fora
Integração externa reenvia, callback chega fora de ordem, robô reprocessa fila. Toda operação que recebe chamada de terceiro precisa responder a mesma coisa se for chamada duas vezes.
Um tradutor por plataforma, não um barramento genérico
Barramento único parece economia e vira gargalo: todo time espera a fila de um time, e a incompatibilidade de uma plataforma contamina o modelo comum. Um tradutor dedicado é mais código e menos acoplamento.
Dizer o que eu não sei
Perfil sem limite declarado obriga quem lê a descobrir os limites sozinho, e a primeira descoberta contamina tudo que veio antes. Prefiro que o limite esteja escrito antes de alguém precisar perguntar.
Ver também
Projetar antes de implementar · Como eu depuro · Revisão de código e padrão