Quanto Mais Cresce Menos Se Vê - O que é, o que é? Quanto mais cresce, menos se vê. - Charada e Resposta ...
O que é, o que é? Quanto mais cresce, menos se vê. - Charada e Resposta ...

Problemas que viram monstros de tamanho desconhecido

Você já entrou num sistema legado que parecia simples quando foi contratado para arrumar um bug pontual? Passa duas semanas lá e descobre que o código que você precisava alterar era só a ponta de um iceberg que tem pelo menos 47 camadas interligadas. Cada modificação que você faz gera dois novos problemas em outra parte do sistema. Isso é exatamente o que a expressão quanto mais cresce menos se vê descreve na prática. A gente costuma pensar em crescimento como algo linear e previsível. Mas na realidade, projetos de software, equipes, infraestrutura — tudo que cresce de forma orgânica sem governança adequada passa por uma transição de estado onde a complexidade interna ultrapassa a capacidade do time de mapear todas as dependências. O sistema continua funcionando. Só que ninguém consegue prever mais o que acontece quando uma variável muda.

Isso não é só sobre código. Já vi isso acontecer com processos operacionais, documentações, contratos. A empresa cresce, adiciona novas divisões, cada divisão cria seus próprios fluxos, e de repente o orgânico original virou uma teia que até quem fundou a empresa não consegue diagramar mais.

O verdadeiro custo do quanto mais cresce menos se vê

O problema real não é o crescimento em si. O problema é a perda de visibilidade sistêmica. Quando o time passa de algo em torno de 7 a 12 pessoas trabalhando juntas, a comunicação deixa de ser eficiente por rede direta e passa a depender de documentos e reuniões formais. A informação que antes estava no corredor agora vive em três planilhas diferentes e duas pastas do SharePoint que ninguém atualiza há seis meses. Na minha experiência, isso aparece primeiro nos testes de integração. Tudo funciona isoladamente. O serviço de pagamento passa, o de notificação passa, o banco de dados passa. Mas quando você sobe os três juntos com dados reais, algo no limite entre eles entra em conflito. E o log de erro mostra algo tão genérico que você leva horas pra entender que o problema foi um timeout mal configurado que só aparece quando dois serviços específicos ficam sob carga simultânea.

Eu já perdi duas semanasando esse tipo de bug em 2019. Era um sistema de agendamento médico que tinha sido construído por três desenvolvedores trabalhando em paralelo sem coordenação. Cada um fez seu módulo achando que o outro ia seguir o padrão deles. O resultado foi um sistema onde o horário de consulta aparecia correto no frontend mas o backend gravava um timezone diferente no banco. O médico via 14h, o paciente recebia SMS às 11h, e o sistema de check-in marcava 18h. Três horários diferentes pra mesma consulta. A solução? Reescrevemos o módulo de horário inteiro usando uma library de timezone padronizada e criamos um teste de integração obrigatório que roda antes de qualquer deploy. Demorou três dias pra implementar e economizou horas de debugging todo mês.

Sinais de que você atingiu o ponto de visibilidade crítica

Antes de falar de solução, precisamos entender quando isso já virou problema. Os indicadores mais comuns são sutis no início. Tempo de onboarding crescente. Se um desenvolvedor novo leva mais de quatro semanas pra fazer a primeira contribuição significativa, algo está errado. Em times saudáveis com boa documentação, esse número fica entre uma e duas semanas.

Dependências circulares não documentadas. Você descobre que o serviço A depende do B, o B depende do C, e o C por sua vez chama endpoints do A. Ninguém sabia disso quando construiu. Aparece só quando o sistema cai e o root cause analysis revela o loop. Configurações em mais de cinco lugares diferentes. Se o mesmo parâmetro de produção aparece em arquivos distintos, ambientes diferentes, ou variáveis de ambiente espalhadas, você já perdeu o controle da fonte única da verdade.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Cada bug novo revela três bugs escondidos. Quando você conserta algo e descobre que aquela correção quebra outras três funcionalidades que estavam "funcionando mas ninguém testava", o sistema já está maior que a capacidade do time de validá-lo completamente. Decisões que exigem reunião de alinhamento. Mudanças simples que antes eram decididas em agora precisam de call com cinco pessoas. Isso não é burocracia — é sinal de que ninguém tem mais visão completa do impacto.

Estratégias práticas para recuperar a visibilidade

A primeira coisa que muita gente tenta é contratar mais gente. Isso piora o problema. Mais pessoas em um sistema já complexo aumenta a taxa de introdução de novas dependências não documentadas. O caminho certo é o oposto: reduzir a complexidade antes de escalar. Mapeamento obrigatório de dependências. Todo serviço novo precisa ter um diagrama de dependências registrado antes de entrar em produção. Não é enfeite. É a única forma de saber o que vai quebrar quando você mudar aquilo. Ferramentas como Jaeger pra tracing distribuído ou até mesmo um diagrama manual atualizado no Confluence ajudam, desde que sejam mantidos.

Testes de integração como gate de deploy. Se o seu pipeline de CI/CD não roda testes que validam a interação entre pelo menos três serviços críticos, você está implantando no escuro. Isso cobre entre 60 e 70 por cento dos bugs que aparecem em produção e que não são detectados por testes unitários. Revisão trimestral de débito técnico. Reserve duas semanas por trimestre pra refatorar sem features novas. Nesse período, você resolve os hacks que foram inseridos como atalho, documenta o que não está documentado, e remove código morto. O tempo parece perdido, mas na prática você economiza duas vezes mais na quarter seguinte porque para de corrigir os mesmos problemas repetidamente.

Documentação viva, nãoos monumentais. Documentação que ninguém lê é pior que nenhuma documentação. Prefira comentários no código que explicam o porquê das decisões, não o que o código faz. E mantenha um arquivo README no repositório com o fluxo principal atualizado. Se o README não reflete o código atual, atualize-o antes de fazer qualquer outra coisa. Limitar o breadth de cada time. Um time deve ser dono de no máximo três serviços críticos. Quando um time é responsável por dez, a atenção se dilui e os detalhes caem entre as frestas. O modelo de team-topology recomenda times pequenos e autônomos com boundaries bem definidos.

Quando o quanto mais cresce menos se vê é irreversível

Existem casos onde o sistema cresceu tanto que a única solução viável é reescrever do zero. O critério prático que eu uso é simples: se o tempo gasto entendendo o código existente supera o tempo que levaria pra escrever uma versão nova e funcional, vale a pena considerar o rewrite. Isso acontece normalmente quando o sistema tem mais de cinco anos, passou por pelo menos três arquitetos diferentes, e o código original foi escrito por pessoas que saíram da empresa há dois ou mais anos. A documentação existe mas não corresponde mais à realidade. Os testes cobrem apenas cenários felizes. E cada modificação nova exige conhecimento tribal que só existe na cabeça de uma ou duas pessoas que estão prestes a sair.

O rewrite nunca é a primeira opção. É a última. Antes de chegar lá, tente as estratégias de contenção. Mapeamento, testes, débito técnico. Se depois de seis meses de trabalho consistente nesses pilares o sistema continuar impossível de navegar, aí sim considere o rewrite com uma arquitetura intencionalmente mais simples e bem definida desde o início. A regra de ouro é: o crescimento sem governança gera complexidade oculta. E complexidade oculta é o maior risco silencioso em qualquer projeto de software que ultrapassa certa escala. Reconhecer isso cedo economiza meses de dor de cabeça.