Pensar arquitetura antes de escrever código ou sair escrevendo e depois ver no que da?

Foto de Mohammad Rahmani na Unsplash

É muito comum começar um sistema abrindo o editor e escrevendo código. Cria um controller, faz uma query, retorna uma resposta e segue o jogo. No começo funciona. E exatamente por isso muita gente continua fazendo assim.

O problema é que essa forma de trabalhar escala muito mal.

Quando o sistema cresce, quando entra mais gente no time ou quando surgem novas regras, aquele código que “resolvia” começa a virar um emaranhado difícil de mexer. E aí surge a sensação de que qualquer mudança simples dá trabalho demais.

Isso quase nunca é culpa do código em si. Normalmente é arquitetura que nunca foi pensada.

Código muda o tempo todo. Arquitetura não.

Funções são reescritas, métodos são refatorados, nomes são ajustados. Mas a forma como o sistema foi estruturado lá no começo costuma durar anos. Se a base foi mal pensada, você passa muito tempo brigando com decisões antigas.

É por isso que arquitetura não é detalhe. Ela define o quanto o sistema vai te ajudar ou te atrapalhar no futuro.

Outro erro comum é começar pensando em ferramenta.

“Como faço isso no Laravel?”
“Qual padrão eu uso aqui?”
“Isso vira um service ou um job?”

Essas perguntas vêm cedo demais.

Antes disso, o que realmente importa é entender o problema. O fluxo. O que entra, o que sai, o que pode falhar, o que precisa ser consistente. Quando isso não está claro, qualquer código escrito vira tentativa e erro.

Framework ajuda, mas não pensa por você.

Misturar responsabilidade quase sempre parece produtivo no início.

Coloca regra no controller, resolve ali mesmo, já retorna a resposta e pronto. Funciona rápido. Até o dia em que você precisa reutilizar aquela lógica, testar isoladamente ou mudar um comportamento sem quebrar outro.

Quando tudo está no mesmo lugar, nada está realmente isolado.

Separar responsabilidade não é academicismo. É o que evita que uma mudança pequena vire um risco desnecessário.

Uma coisa que ajuda muito é pensar no fluxo antes de pensar em classes.

De onde vem o dado?
O que valida?
Onde a regra acontece?
O que persiste?
O que retorna?

Quando esse caminho está claro na cabeça, o código flui. Quando não está, você sente que está “programando no escuro”.

Arquitetura ruim costuma esconder dependências.

Você só descobre que uma parte do sistema depende de outra quando tenta mexer em algo e tudo quebra. Isso acontece porque essas dependências nunca foram assumidas, só foram surgindo.

Dependência explícita dói menos do que dependência escondida.

Produção exige previsibilidade.

Não é só sobre funcionar agora, é sobre saber o impacto de uma mudança. Quando a arquitetura é confusa, qualquer ajuste vira medo. Quando é clara, você sabe exatamente onde mexer e o que pode ser afetado.

Esse tipo de tranquilidade não vem do código bonito. Vem de decisões bem pensadas.

Também vale um cuidado importante: decisões irreversíveis cedo demais

Criar abstrações complexas, padrões genéricos ou estruturas “pensando no futuro” costuma travar o sistema antes mesmo dele crescer. Boa arquitetura é flexível. Ela resolve o problema atual sem impedir evolução.

Complexidade prematura cobra juros.

Pensar arquitetura não significa desenhar diagramas enormes nem usar nomes sofisticados. Na maioria das vezes, boa arquitetura é simples o suficiente para ser explicada em poucos minutos.

Se você não consegue explicar como o sistema funciona, provavelmente ele já está mais complexo do que deveria.

No começo, pensar arquitetura parece atrasar. Depois de alguns meses, ela economiza tempo. Menos retrabalho, menos bug colateral, menos receio de mexer no código.

O ganho não é imediato, mas é consistente.

Conclusão

Pensar arquitetura antes de escrever código não é tentar prever tudo. É reduzir incerteza.

É entender o problema antes de sair codando. É isso que separa sistemas que evoluem com tranquilidade daqueles que vão acumulando problemas silenciosos até virar dívida difícil de pagar.