Introduzindo a modernização de sistemas e entropia
Muito bem, turma. Dando prosseguimento na cadeira de arquitetura de solução, vamos falar sobre modernização de sistemas legados e evolução arquitetural.
Esse tema é recorrente no nosso dia a dia no mercado: modernizar aplicações, sistemas e evoluir a arquitetura.
Vamos começar afirmando que todo sistema tende a “morrer”, isto é, a ser desativado em algum momento. Em outras palavras, todo sistema quer “morrer”.
Pode parecer uma afirmação dura para o início do curso, mas utilizaremos uma analogia com a vida humana: nascimento, crescimento, amadurecimento, envelhecimento e, por fim, a morte. Da mesma forma, isso ocorre com as aplicações.
Nós desenvolvemos aplicações que, em geral, já têm uma data de desligamento, ainda que não saibamos qual é. Mas quem define isso? Como isso é possível?
Retomando um conceito das aulas de física, pela segunda lei da termodinâmica, todo sistema fechado tende ao caos. Ele nasce organizado e tende ao caos. Isso não é específico da tecnologia, é um princípio da física. Por exemplo: se deixarmos uma xícara de café quente parada, sem fogo e sem nenhuma ação para mantê-la quente, ela esfria. Um quarto arrumado se desorganiza. Uma casa sem manutenção se deteriora. Experimentamos isso no dia a dia: se deixarmos um carro novo parado na rua, na garagem ou em qualquer lugar por um ano, não o encontraremos melhor do que deixamos; ele estará pior. O mesmo ocorre com um tênis recém-comprado: com o uso e o passar do tempo, ele não melhora; envelhece, desorganiza-se e estraga. Assim também acontece com nossos sistemas. Não é um acidente; é física, a segunda lei da termodinâmica.
A única forma de reverter essa tendência é gastar energia. Se o carro está com pneu vazio, empoeirado, com peças ressecadas pelo sol ou pela chuva, precisamos investir energia: encher ou trocar os pneus, aplicar produtos, lavar o carro. O mesmo vale para o tênis, para a casa, para o quarto. Isso também acontece com as aplicações.
Avançando, essa mesma lei se manifesta no código. As Leis de Lehman sobre evolução do software (programa) trazem princípios que se aplicam ao entendimento de sistemas e aplicações. Os sistemas exigem esforço, energia, para se manterem funcionais, operando e atendendo ao seu propósito. Se não investirmos energia, serão, em breve, desligados.
Em 1974, Meir Lehman estudou a evolução de um sistema da IBM e concluiu: o software (programa) obedece a um princípio análogo ao da termodinâmica; a entropia de um sistema aumenta com o tempo, a menos que trabalho específico seja executado para mantê-la ou reduzi-la. Com o tempo de evolução e uso de um software (programa), surgem dependências que não deveriam existir. Quantas vezes dizemos ou ouvimos: “Vamos fazer desse jeito e depois corrigimos”? Isso aumenta a entropia dos sistemas. Correções, exceções, diversas features (funcionalidades), prazos apertados — quantos de nós trabalhamos assim? Frequentemente precisamos executar tarefas para as quais gostaríamos de ter mais tempo para pensar e projetar, mas precisamos entregar. Isso eleva a entropia do software (programa).
Portanto, na maioria das vezes, não se trata de “enrolação” do time; é física. Em projetos com cronogramas rígidos, quando ouvimos “tem que fazer no prazo”, “faça desse jeito e depois consertamos”, “depois expomos isso com um contrato melhor”, “depois fazemos uma query (consulta) mais eficiente”, a tendência é que esses itens se acumulem e não sejam resolvidos. A entropia do software (programa) aumenta.
Desmistificando o conceito de legado
Vamos desfazer o mito de que “sistema antigo” é, necessariamente, sistema legado. Segundo o Michael, “código legado é simplesmente código sem testes”.
Vejamos dois exemplos:
15 anos de idade: temos uma aplicação, um software (programa), um sistema com 15 anos. Há testes robustos, fronteiras de domínio claras, documentação viva. O software (programa) atende ao negócio e recebe energia (investimento e manutenção). Não há prazos constantemente apertados nem a dinâmica de “lançar e depois corrigir”. O time é coeso. Apesar de ter 15 anos, esse sistema não é legado.
8 meses de idade: um software (programa) lançado sob pressão, com MVPs (produtos mínimos viáveis) eternos, “teste em produção”, atalhos acumulados e inúmeros “depois eu conserto; vamos lançar e depois conserto”. É muito provável que esse software (programa) já tenha data marcada para ser desligado, tornando-se legado.
Portanto, não se trata da data de criação do software (programa). Não é porque um sistema tem 20, 25, 10 ou 15 anos que é legado. Não é o fato de estar em COBOL ou C que o torna legado. A questão é a capacidade do sistema de mudar com segurança: se é código sem testes, repleto de adaptações improvisadas e complexo de alterar, então é legado, como propõe o Michael.
Vamos manter essa referência para retomá-la adiante.
Sustentando a arquitetura frente à entropia
Outro ponto importante na modernização de sistemas legados e em arquitetura é não supor que conseguiremos construir uma arquitetura que não se deteriore.
Vamos confessar que, às vezes, pensávamos que iríamos modelar e propor uma arquitetura que seria eterna. Isso não acontece. Se ela não receber trabalho constante, observação contínua e direcionamento recorrente, estará fadada a morrer.
Vamos estudar técnicas para manter a arquitetura viva, realizar modernizações e aplicar energia para evitar que as leis da física atuem sobre a aplicação. O sistema novo e brilhante, com ou sem IA, que vamos construir ou acabamos de construir, também está sujeito à segunda lei da termodinâmica. Não existe uma arquitetura ou solução imune à entropia.
A pergunta que fica é: que trabalho estamos investindo continuamente para desacelerar a entropia do sistema que estamos construindo? O trabalho de arquitetura, junto com os times de desenvolvimento e de produto, deve responder a isso. Qual energia estamos colocando? A cada entrega, estamos entregando algo que desacelera a entropia ou algo que a aumenta? Em outras palavras, estamos aumentando o caos ou diminuindo o caos? Estamos organizando ou desorganizando o sistema?
Nem sempre vamos entregar algo que organize. Isso também é um fato. Não devemos criar a expectativa de que só entregaremos melhorias. Temos o time do projeto, a necessidade do negócio, prazos e metas a serem cumpridas. Na maior parte do tempo, podemos acabar entregando algo que gera mais caos — é a física atuando. Ainda assim, precisamos buscar sempre entregar um trabalho que também organize, que traga energia para enfraquecer ou retardar a entropia do sistema e da aplicação.
Explicando a primeira lei de Lehman
A primeira lei de Lehman diz o seguinte: sistemas do tipo E devem ser continuamente adaptados ou se tornam progressivamente menos satisfatórios em uso. Aqui estamos falando sobre evolução de software. Lehman estabeleceu, em sua publicação sobre evolução de software, algumas leis, e a primeira afirma que sistemas do tipo E precisam de adaptação contínua. Sabemos disso: ao criar um sistema e colocá-lo em produção, com o tempo, precisamos continuar adaptando e melhorando. Se não fizermos isso, ele se tornará menos satisfatório.
Trabalhamos há algum tempo com uma pessoa desenvolvedora que costumava entregar uma solução, e costumávamos dizer: “ficou bom”. A resposta recorrente era: “está bom, mas sempre pode melhorar”. E, de fato, precisamos sempre melhorar a aplicação.
Essa é a primeira lei de Lehman. Mas o que é um sistema do tipo E? Estamos falando, basicamente, das aplicações que usamos no dia a dia, classificadas como tipo E de Embedded (embutido), isto é, qualquer sistema inserido no mundo real, cujo domínio do problema muda com o tempo. Em outras palavras, tudo que usamos hoje no mercado, como:
- CRM (gestão de relacionamento com clientes)
- aplicação de integração
- workflow (fluxo de trabalho)
- order manager (gerenciador de pedidos)
- sistema de faturamento
- sistema de pagamento
- sistema de cobrança
- sistemas de controle de fluxos
Essas aplicações, classificadas como tipo E, precisam ser adaptadas porque o negócio muda. Se recuperarmos uma aplicação de 15 ou 20 anos atrás, talvez não tivéssemos algumas agências reguladoras para as quais precisamos enviar informação hoje. Concorrentes, integrações e parcerias mudam o negócio continuamente. Surgem novas formas de pagamento. Antes do Pix, no setor bancário, havia DOC e TED como formas amplamente utilizadas de transferência de valores; hoje, praticamente tudo se resolve com Pix. Antes havia apenas cartões de crédito; agora há também cartões de alimentação e de refeição. O sistema precisa acompanhar o que surge de novidade.
Por definição, sem energia de manutenção, o sistema vai piorando e ficando menos satisfatório, às vezes mais lento. Ao fazer o primeiro deploy (implantação) de uma aplicação, o banco de dados está vazio, a mensageria está vazia, não há arquivos de log (registro), os filesystems (sistemas de arquivos) estão zerados, e a aplicação roda com determinada performance. Com o passar do tempo, as tabelas crescem, e precisamos colocar energia para mitigar esses efeitos e evitar que o software fique lento. É nesse sistema que precisamos, o tempo todo, colocar energia.
Definindo sistema legado e seus sintomas
A definição de Michael afirma que um sistema sem testes é um sistema legado — aquele no qual não fazemos testes. Lehman complementa ao dizer que um sistema que não atende mais ao negócio ou apresenta dificuldade de incorporar as inovações exigidas também é um sistema legado. Podemos combinar essas duas definições: quando não conseguimos mais testar o sistema de ponta a ponta, ou quando não conseguimos mais evoluir as inovações (ou isso se torna muito complexo), ele tende a se tornar um sistema legado.
Avançando sobre duas leis principais de Lehman:
- Segunda lei (da entropia): o sistema fica complexo demais para mudar com segurança.
- Primeira lei (da adaptação): o sistema não muda no ritmo que o negócio exige.
Considere um cenário de arquitetura corporativa no qual estamos organizando o catálogo de aplicações e montando uma visão de APM (gerenciamento de portfólio de aplicações). Precisamos classificar uma aplicação: está boa, mediana ou em descontinuação? Podemos aplicar essas duas leis para entender a situação da aplicação. Se ela está muito complexa para mudar, as releases (versões) demoram, os custos de desenvolvimento são altos e são necessárias muitas horas de trabalho para entregar uma funcionalidade. Ou, então, ela não consegue acompanhar o negócio, que está sempre reclamando dos prazos porque tudo demora.
Essa análise leva à classificação de que o sistema já apresenta falha de adaptação.
Outro sintoma do sistema é que, a cada mudança, alteramos uma coisa e três outras quebram.
Já vimos isso diversas vezes; temos certeza de que você já passou por essa situação.
Realiza-se uma alteração e, de repente, o sistema falha em uma parte que não modificamos, que não deveria ter sido afetada, e, ainda assim, quebra.
Levamos semanas para entregar por causa de dependências que não deveriam existir, débito acumulado — ou, melhor, dívida acumulada —, uma arquitetura rígida, fronteiras definidas de forma equivocada e monólitos sem separação por domínio.
Ao observarmos diversas situações, podemos classificar se esse sistema está mais sujeito à entropia, à falha de adaptação ou, eventualmente, aos dois cenários.
Ele é complexo demais para atender ao negócio e não consegue mais evoluir em função dessa complexidade, dada a entropia.
O sistema nasceu organizado e, agora, tornou-se um caos devido à quantidade de elementos que fomos adicionando.
Diante disso, deixamos um ponto de atenção ao final deste módulo.
Diferenciando legado de mudança de domínio
Nem todo sistema que não atende ao negócio é, tecnicamente, um legado.
Ele pode ser impecável, pode estar bem testado, bem modularizado, com baixa entropia — ou seja, não está em desordem — e, mesmo assim, não atender ao negócio.
Isso ocorre porque o negócio mudou.
Nessa situação, não adianta reescrevê-lo; não se trata apenas de modernização, e sim de uma mudança no negócio.
Podemos ter baixa entropia técnica, testes adequados, modularização e fronteiras bem definidas, sem débito técnico. Entretanto, o domínio mudou, o negócio mudou — não apenas a implementação.
Um exemplo é o das antigas aplicações de locação de DVD e fitas. Funcionavam bem: banco de dados bem tratado, índices, tabelas, tudo em ordem, leitor de código de barras. No entanto, esse modelo de negócio deixou de existir; agora é streaming (transmissão).
Esse sistema não será modernizado; será substituído por um novo, porque o negócio mudou.
Quando o domínio muda, não existe mais modernização. Nesse caso, nós realmente precisamos criar um novo sistema para atender ao novo domínio e às novas regras de negócio.
É importante entender isso, pois, em muitas situações, podemos ser levados a dizer: “vamos modernizar”.
Ao olhar para o negócio para avaliar a modernização, abrimos um parênteses: modernizar não pode ser apenas tech (tecnologia) por tech (tecnologia).
“Vamos modernizar, tirar da linguagem tal e colocar na linguagem Y.” “Vamos sair de COBOL e ir para Python.”
Apenas tecnologia pela tecnologia não basta. É necessário considerar o negócio e compreender a modernização sob essa perspectiva. Em alguns casos, não é modernizar; é criar uma nova aplicação.
Vale a pena discutirmos mais sobre isso na próxima aula, mas já deixamos registrado aqui.
Definindo sistema legado
O que é um sistema legado?
É quando a distância entre o que ele faz e o que o negócio precisa está aumentando.
O sistema se torna legado quando há uma necessidade de negócio e, cada vez mais, nossa aplicação se distancia da capacidade de atendê-la.
Ou seja, quando acumulamos tantas dívidas técnicas que não conseguimos pagá-las, e as necessidades do negócio se tornam cada vez mais difíceis de atender, o sistema caminha para o legado.
Explicando as leis de Lima e o ciclo de descontinuação
Na prática, as duas leis de Lima, tanto a de entropia quanto a de adaptação do sistema, normalmente atuam juntas.
Mais complexidade gera mais caos, o que torna a adaptação mais difícil.
Esse ciclo se reforça até que percebemos que o sistema está em descontinuação: precisa ser substituído ou modernizado, pois não atende mais ao negócio.
A partir daí, nós efetivamente iniciamos o trabalho de modernização.
Encerrando o módulo
Vamos encerrar por aqui.
Em breve, vamos começar o próximo módulo.
Um abraço!