Arquitetura simples não é ausência de desenho. É escolher camadas suficientes para deixar responsabilidades claras sem criar caminhos artificiais para toda mudança pequena.
Em serviços web, complexidade costuma aparecer como excesso de abstração, pastas com nomes genéricos, regras espalhadas e contratos implícitos entre controller, serviço, banco e integrações.
Responsabilidade visível
Uma camada deve existir porque protege uma decisão real: entrada HTTP, regra de negócio, persistência, integração externa ou adaptação de formato. Se ela apenas repassa dados sem acrescentar sentido, talvez esteja escondendo simplicidade.
Nomes também importam. Classes e módulos devem indicar o comportamento que carregam. Quando tudo se chama manager, helper ou utils, o desenho perde valor para quem precisa manter.
Contratos pequenos
Prefira contratos explícitos e estreitos. Um serviço que recebe objetos enormes do request fica preso à interface. Um adaptador que devolve estrutura genérica demais transfere validação para quem consome.
Testes ajudam a manter fronteiras honestas. Se uma mudança simples exige montar metade da aplicação, a arquitetura pode estar cobrando pedágio alto demais.
Evolução gradual
Comece simples e extraia camadas quando a dor aparecer com clareza. Antecipar uma arquitetura grande para um problema pequeno costuma produzir mais acoplamento do que maturidade.