Durante boa parte da minha trajetória, eu começava um projeto do jeito que muita gente começa: escolhendo a stack. Linguagem, banco, framework, nuvem. Parecia o ponto de partida natural. Só depois vinham a arquitetura e o código.

Foi trabalhando em projetos de integração entre instituições, com muitas áreas, regras e sistemas envolvidos, que percebi o que faltava nessa sequência. Um sistema pode usar tecnologia moderna, aguentar volume alto e ter uma arquitetura bonita no diagrama e, mesmo assim, representar errado o problema que deveria resolver.

Programar não é o mesmo que fazer engenharia

Programar é escrever instruções que produzem um comportamento. Engenharia de Software é mais amplo: é conceber, construir, verificar, operar e evoluir sistemas de forma sistemática, sabendo o custo, o risco e o impacto de cada escolha.

Uma funcionalidade pode funcionar hoje e ser frágil ao mesmo tempo. Basta que ninguém tenha testado o comportamento, que as decisões não estejam registradas ou que uma mudança pequena quebre algo do outro lado do sistema. A tela mostra o resultado certo; a estrutura por trás já acumula risco.

A diferença está na pergunta. A programação pergunta como implementar. A Engenharia de Software pergunta por que aquilo existe, para quem gera valor, que restrições precisa respeitar, como será verificado, como se comporta quando algo falha e como vai evoluir sem quebrar o resto.

Código que funciona é necessário, mas não suficiente.

O problema mora no domínio, não na API

Pense em uma plataforma que recebe eventos de várias fontes: municípios, empresas, dispositivos. A primeira descrição do projeto costuma ser simples: integrar os dados e deixar disponível para consulta.

Criar uma API que aceita dados é a parte fácil. As perguntas difíceis vieram antes:

  • Duas mensagens parecidas representam o mesmo evento?
  • Quando duas fontes divergem, qual prevalece?
  • Um evento que chegou atrasado ainda tem valor?
  • Como diferenciar falha de comunicação de ausência real de informação?
  • Quem pode consultar cada tipo de dado, e quais ações precisam deixar trilha de auditoria?

Nenhuma dessas perguntas pertence ao código. Elas pertencem ao domínio. Sem as respostas, dá para construir uma integração rápida e operacionalmente errada: processa tudo em milissegundos e entrega duplicidades e alertas sem contexto.

Quando o trabalho passou a começar por atores, eventos, estados e regras, as decisões técnicas ficaram mais fáceis de tomar. Identificador idempotente, fila, política de repetição, retenção e controle de acesso deixaram de ser preferência e passaram a ter motivo. (Escrevi mais sobre isso em O custo invisível da falta de integração.)

Toda decisão técnica deveria ter uma origem

Uma decisão técnica ganha qualidade quando dá para rastreá-la até uma necessidade, uma restrição ou um risco real. Alguns exemplos:

Pergunta de negócio Consequência técnica possível
O mesmo evento pode chegar mais de uma vez? Identificador idempotente e controle de duplicidade
A resposta precisa ser imediata? Processamento síncrono ou assíncrono
Quem pode executar a ação? Autenticação, autorização e políticas de acesso
É preciso reconstruir o que aconteceu? Trilha de auditoria, correlação e retenção
E se um componente falhar? Retentativas, fila de exceções e observabilidade

Quando essa ligação não existe, a arquitetura vira uma coleção de gostos pessoais. Entra a tecnologia da moda, entra o padrão que ninguém pediu, e a complexidade acidental cresce. Uma arquitetura madura não é a que tem mais componentes. É a que deixa claro por que cada componente existe.

Um teste rápido antes da próxima sprint

Antes da próxima decisão técnica do seu time, tente responder:

  • O problema e o resultado esperado estão descritos sem citar tecnologia?
  • Os atores e suas responsabilidades foram identificados?
  • Os termos mais importantes significam a mesma coisa para negócio e desenvolvimento?
  • As regras que nunca podem ser violadas estão escritas?
  • Exceções, atrasos, duplicidades e indisponibilidades foram discutidos?
  • Dá para ligar cada decisão técnica importante a uma necessidade ou risco?


Se várias respostas forem “não”, o time ainda está no começo da Engenharia de Software, mesmo que já tenha muito código escrito. Vocabulário compartilhado, aliás, é o ponto de partida do DDD, que tratei em DDD não é (só) para sistemas gigantes.

Para ir além

Esse é o tema do primeiro capítulo do meu livro, Engenharia de Software: Fundamentos e Práticas. Os outros 20 seguem o mesmo caminho, do problema à operação: requisitos, arquitetura, testes, segurança, DevOps e o uso de agentes de IA no desenvolvimento, sempre com casos reais anonimizados, checklist e exercício prático.

Você pode ler o começo do capítulo 1 e ver o sumário completo na página do livro.

  • Compartilhe esse post

Discussão e Comentários

Olá, deixe seu comentário para Engenharia de Software começa antes do código

Enviando Comentário Fechar :/