Executando verificação de segurança...
7

O que sobra de um software quando ninguém mais mantém ele?

Grande parte das discussões sobre arquitetura de software gira em torno de mudança:
como evoluir mais rápido, como refatorar com segurança, como trocar tecnologia sem dor.

Mas existe uma pergunta que quase nunca aparece:

O que acontece quando a mudança para?

Na prática, muitos sistemas de longa duração não morrem por problemas de performance ou escalabilidade. Eles morrem porque, com o tempo, perdem coerência conceitual.
Regras de negócio vazam para a infraestrutura, decisões arquiteturais se tornam irreversíveis, e o sistema acaba sendo reescrito não porque está “errado”, mas porque ninguém mais consegue entendê-lo.

Recentemente encontrei um paper técnico que propõe uma forma diferente de pensar arquitetura, tratando o tempo como uma restrição arquitetural primária, e não como um detalhe implícito.

Legacy-First Design (LFD)

O método apresentado no paper se chama Legacy-First Design (LFD).

Ele não é um framework, nem um novo padrão arquitetural.
O foco está no nível de decisão arquitetural, partindo de uma distinção explícita entre:

o que precisa durar

e o que pode mudar ao longo do tempo

Em vez de otimizar apenas para velocidade de entrega ou conveniência tecnológica, o LFD prioriza:

  • preservação da identidade do sistema
  • independência tecnológica do núcleo
  • clareza conceitual ao longo dos anos
  • sobrevivência mesmo sem manutenção ativa

A pergunta central deixa de ser:

“Como estruturar o sistema para mudar mais rápido?”

e passa a ser:

“O que precisa continuar fazendo sentido mesmo quando ninguém mais mexer no código?”

“Survival in Abandoned State”

Um dos conceitos mais interessantes do paper é o de Survival in Abandoned State.

A maioria das arquiteturas assume, implicitamente, que sempre haverá manutenção contínua.
O LFD não assume isso.

Ele trata o abandono como um estado previsível no ciclo de vida do software.
Sob essa ótica, um sistema que colapsa conceitualmente quando é abandonado falhou arquiteturalmente, mesmo que tenha funcionado bem no passado.

Projetar pensando nisso significa criar sistemas que:

  • ainda podem ser compreendidos sem os autores originais
  • preservam o significado central do domínio
  • não dependem de conhecimento tribal para “não quebrar”

Relação com práticas conhecidas

O paper deixa claro que o LFD não substitui abordagens como Clean Architecture, DDD ou Arquitetura Hexagonal.

Ele funciona como uma camada de governança temporal, orientando onde essas práticas devem ser aplicadas e o que precisa ser protegido da mudança.

Leitura complementar

O paper é curto, conceitual e direto ao ponto:

📄 Legacy-First Design (LFD): A Temporal Approach to Software Sustainability
👉 https://zenodo.org/records/18208444

Vale a leitura, principalmente para quem trabalha com:

  • sistemas legados
  • plataformas que precisam durar anos
  • código que troca de time com frequência

Para debate

Queria jogar a pergunta pra discussão:

👉 Vocês já trabalharam em sistemas que “funcionavam”, mas ninguém mais conseguia entender?
👉 O que, na prática, ajudou (ou atrapalhou) a sobrevivência desses sistemas ao longo do tempo?

Curioso pra ouvir experiências reais.

Carregando publicação patrocinada...
6

Eu tenho um sistema que mal acabou de ser desenvolvido, ficou legado. Aguardei até os últimos dias o lançamento de versões dos frameworks que estavam sendo prometidas , versões com várias breaking changes, e não foi lançado. Como o adonis 5 e o vue 3. Isso há uns 8 anos.

O resultado é que hoje eu tenho um sistema que é base para operações de uma empresa que fatura milhões, mas que até pra mudar a cor de um botão é um sacrifício.

Ex.: a vercel vive mudando a versão mínima do node. Esse sistema foi feito no node 12. Hoje o padrão é 24, quase 26. Se eu quiser trocar o texto de um botão, vou precisar atualizar tudo pq a vercel exige no mínimo o node 20. E eu só consegui atualizar até o 18 sem quebrar tudo.

Agora eu tenho que trocar a máscara do cnpj pra alfanumérico e o que deveria simplesmente ser uma alteração de 99.999.999/9999-99 pra XX.XXX.XXX/9999-99 virou um pesadelo kkkk
A solução é tirar da vercel e colocar em um servidor próprio. Mais fácil configurar um ambiente inteiro do que mexer em biblioteca legada.

Ano passado a empresa pediu pra trocar o banco Inter pelo Banco do Brasil na geração de boletos. Foi um caos. O sistema não tem typescript, era tudo js. O autocomplete não funciona. Horrível de mexer. Antes de alterar qualquer coisa, criei mil testes que passavam com o código atual. Só aí consegui me sentir seguro pra mexer.
Detalhe: o sistema é 100% coberto de testes de integração. Mas não tinha nada de teste unitário. Aí ficava difícil de testar pequenas partes. No final, resolvi quebrar tudo em pequenas funções com testes unitários e deu certo.

Então, minha experiência diz: antes de mexer em qualquer coisa, encha de testes.