Complexidade não some. Ela migra.

Essa é a Lei de Conservação da Complexidade, formulada por Larry Tesler nos anos 80, e amplamente ignorada por quem mais deveria temê-la: engenheiros de software.

No universo de design de produto, a lei é quase um mantra. Quando um formulário elimina um campo, alguém no backend passa a inferir aquela informação. Quando uma interface esconde uma opção avançada, um engenheiro de suporte passa a receber o ticket. A complexidade que sumiu da tela apareceu em outro lugar, com outra cara e outro custo.

Na engenharia de software, a lei opera com a mesma intensidade, mas com uma diferença fatal: o destino da complexidade costuma ser invisível até o momento em que ela cobra sua dívida.

E esse momento, invariavelmente, é o pior possível.

A Ilusão da Abstração que Resolve

Toda decisão arquitetural que parece simplificar é, na prática, uma decisão sobre onde alocar complexidade.

Adotar um framework de ORM elimina a complexidade de escrever SQL. Mas transfere para o desenvolvedor a responsabilidade de entender o que aquele framework gera em tempo de execução (ex: quando ele vai ao banco, quantas queries produz, qual é o plano de execução resultante). A complexidade do SQL não desapareceu. Ela foi encapsulada.

Encapsulamento sem compreensão é uma bomba com timer.

Adotar uma plataforma de mensageria gerenciada elimina a complexidade operacional de manter brokers. Mas transfere para a arquitetura a responsabilidade de lidar com duplicação de mensagens, ordenação, falhas de idempotência e latência. A complexidade do protocolo não desapareceu. Ela foi terceirizada. E terceirização sem contrato explícito de falha é ingenuidade camuflada de pragmatismo.

Adotar um BaaS (Banking as a Service), um iPaaS (Integration Platform as a Service), ou qualquer plataforma que prometa "sem configuração" elimina a complexidade de infraestrutura. Mas transfere para o produto a dependência de rate limits, modelos de custo opacos e roadmaps fora do seu controle. A complexidade operacional não desapareceu. Virou risco de vendor lock-in com EBITDA embutido no preço do serviço.

A abstração não é uma solução. É uma decisão sobre quem paga a conta da complexidade e quando.

O problema não está em abstrair. Abstrações habilitam a evolução de sistemas. O problema está em abstrair sem consciência do destino. Em tratar a complexidade como algo que pode ser eliminado, quando ela apenas muda de endereço.

Onde a Complexidade Escondida Cobra o Preço

Complexidade alocada de forma irresponsável não quebra o build no dia do deploy. Ela apodrece silenciosamente, manifestando-se seis meses depois sob o sintoma clássico da lentidão inexplicável.

O sistema funciona. Nada cai. Mas adicionar um novo meio de pagamento leva três vezes mais tempo do que no ano passado. Cada refactor exige expedições arqueológicas. O desenvolvedor original que entendia os atalhos já saiu da empresa, e quem ficou não tem como saber onde estão as minas terrestres.

Isso é dívida de complexidade acumulada. Ela é letal porque o SonarQube não a detecta e o pipeline não a bloqueia. Ela só aparece quando o negócio exige velocidade e a engenharia descobre que os pés do time estão presos em concreto. O que levava duas semanas no primeiro ano, agora leva dois meses.

Não porque o time ficou pior. Porque a complexidade acumulada nos lugares errados passou a cobrar juros compostos sobre cada decisão nova.

O Arquiteto e a Responsabilidade do Destino

A Lei de Tesler não é uma sentença de resignação. Ela é uma bússola de responsabilidade.

Se toda decisão arquitetural aloca complexidade, então a pergunta que o arquiteto precisa responder não é "como eliminamos complexidade?". Essa pergunta não tem resposta, porque a premissa é falsa. A pergunta correta é: para onde estamos empurrando a complexidade, e esse destino é consciente e sustentável?

Existem três destinos possíveis para complexidade em sistemas de software:

Para o usuário. O sistema é mais simples internamente, mas o usuário precisa entender mais, configurar mais, ou tolerar mais falhas visíveis. Às vezes essa é a troca certa, especialmente quando o usuário tem contexto suficiente para gerenciar o que recebe. Mas precisa ser uma decisão explícita, não um efeito colateral de um prazo.

Para a plataforma. A complexidade vai para uma camada de infraestrutura, orquestração ou serviço gerenciado. O custo se materializa em latência adicionada, dependências externas, custo de operação e limitações de observabilidade. Novamente, pode ser a troca certa. Mas o contrato precisa estar na mesa.

Para o engenheiro. A complexidade fica implícita no código, nas convenções não documentadas, nas decisões que só existem na cabeça de quem as tomou. Esse é o destino mais perigoso, porque não tem dono formal, não tem custo visível e se acumula silenciosamente até se tornar o principal ativo de risco do sistema.

O terceiro destino é o mais comum. E é o que transforma sistemas vivos em sistemas que ninguém tem coragem de tocar.

Complexidade Explícita vs. Complexidade Acidental

Nem toda complexidade é igual. Essa é a distinção que separa arquitetura de artesanato.

Complexidade essencial é aquela que existe porque o problema é genuinamente complexo. Um sistema de autorização de transações financeiras é complexo porque o domínio é complexo: concorrência, consistência, reversibilidade, auditoria. Essa complexidade não pode ser eliminada. Pode ser gerenciada.

Complexidade acidental é aquela que existe porque as decisões de implementação a criaram. Camadas de abstração desnecessárias, acoplamentos implícitos, convenções não documentadas, contratos informais entre módulos. Essa complexidade pode ser eliminada. E precisa ser, porque ela não protege nenhum valor de negócio, ela apenas drena velocidade de evolução.

A Lei de Tesler diz que a complexidade essencial é conservada. O que ela não diz, mas precisa ser dito, é que a complexidade acidental é adicionada, não conservada. Ela é criada por escolhas ruins e acumulada por ausência de deliberação.

O trabalho do arquiteto é duplo: gerenciar a complexidade essencial com rigor, e eliminar a complexidade acidental.

Complexidade essencial bem gerenciada é robustez. Complexidade acidental acumulada é entropia com CNPJ.

O Custo de Negócio que Ninguém Coloca no Budget

Quando a complexidade é mal alocada de forma sistemática, o impacto não fica limitado ao repositório de código. Ele vaza para o P&L da companhia através de três vetores:

O custo de Onboarding: Sistemas com complexidade escondida nas abstrações exigem meses para que um engenheiro consiga contribuir com segurança. O conhecimento está nos desenvolvedores originais, não na arquitetura. Quando eles saem, o custo de reposição não é o salário do substituto, mas os meses de produtividade perdida desenterrando o que foi ocultado.

A hemorragia do MTTR: Sistemas onde a complexidade foi empurrada para camadas opacas produzem falhas sem causa raiz localizável. O incidente existe, o impacto é mensurável, mas a origem é arqueologia. Cada hora de war room é OPEX queimado rastreando uma decisão arquitetural que ninguém lembra ter tomado.

O Custo de Oportunidade: Quando o sistema se torna lento demais para evoluir, a empresa perde capacidade de resposta. Features que os competidores entregam em semanas levam trimestres. A janela de oportunidade fecha enquanto o time tenta entender no que está pisando.

Esses três vetores raramente aparecem no relatório que aprovou a abstração original. E é por isso que a lei continua sendo violada sistematicamente:

O custo da complexidade mal alocada é diferido. O benefício da abstração é imediato.

Síntese: Tornar o Invisível Visível

A Lei de Tesler não pede que a engenharia renuncie à abstração. Ela pede maturidade suficiente para fazer a pergunta certa antes de cada decisão.

Não "como simplificamos isso?", mas "para onde vai a complexidade que estamos removendo daqui?".

Não "qual framework resolve esse problema?", mas "qual é o contrato de complexidade que esse framework nos impõe e quem no time é capaz de honrá-lo?"

Não "que plataforma gerencia isso por nós?", mas "quais são os limites, os custos e as falhas dessa plataforma que passamos a herdar?"

Arquitetura de software não é a arte de eliminar complexidade. É a disciplina de torná-la explícita, alocada com intenção e sustentável ao longo do tempo.

Complexidade invisível não é arquitetura elegante.

É passivo não declarado no balanço técnico. E passivo oculto, inevitavelmente, desconta no EBITDA - sempre.