Você não planeja durar 20 anos. Claro e simples. Em vez disso, você muda seus objetivos para a compartimentalização.
O seu banco de dados de aplicativos é independente? Se você tivesse que trocar de banco de dados agora, poderia? A sua linguagem lógica é agnóstica. Se você tivesse que reescrever o aplicativo em um idioma totalmente novo agora, poderia? Você está seguindo boas diretrizes de design, como SRP e DRY?
Eu tenho projetos em execução há mais de 20 anos e posso dizer que as coisas mudam. Como pop-ups. 20 anos atrás, você poderia confiar em um pop-up, hoje você não pode. O XSS não era uma coisa há 20 anos, agora você precisa prestar contas do CORS.
Portanto, o que você faz é garantir que sua lógica esteja bem separada e evitar o uso de QUALQUER tecnologia que prenda você a um fornecedor específico.
Isso pode ser muito complicado às vezes. O .NET, por exemplo, é excelente para expor lógica e método para o adaptador de banco de dados MSSQL que não possui equivalentes em outros adaptadores. O MSSQL pode parecer um bom plano hoje, mas continuará assim por 20 anos? Quem sabe. Um exemplo de como contornar isso para ter uma camada de dados totalmente separada das outras partes do aplicativo. Na pior das hipóteses, você precisará reescrever toda a camada de dados, o restante do seu aplicativo não será afetado.
Em outras palavras, pense nisso como um carro. Seu carro não fará 20 anos. Mas, com pneus novos, novo motor, nova transmissão, novas janelas, novos eletrônicos, etc. Esse mesmo carro pode ficar na estrada por muito tempo.