Então você é o legado?

O que é legado?

Santo Agostinho, que de santo mesmo tinha muito pouco.

Dica: você sempre encontrará frases divertidas em Santo Agostinho

De uns tempos para cá tenho notado que cada vez mais pessoas falando sobre “software legado”. E sabem o que acho mais interessante? Elas caem em uma situação parecida com a que Santo Agostinho enfrentou ao falar sobre o tempo.

“Que é, pois o tempo? Se ninguém me pergunta, eu sei; se quero explicá-lo a quem me pede, não sei.” – Santo Agostinho

Troque a palavra “tempo” por “sistema/software legado” e faça uma auto crítica. Se eu te perguntar o que é software legado você vai saber me responder de forma clara e imediata? Já falei aqui como lido com legado, mas nunca apontei uma definição para este. Neste post faço isto,  mas antes vou mostrar algumas definições faláciosas.

“Todo software que você escreve depois de um tempo vira legado, assim como todo aquele que não foi escrito por você.”

Esta definição é um contra-senso e dá pra provar com lógica pura, quer ver? Se digo que um software é legado, a palavra “legado” denota uma categoria (ou conjunto) no qual alguns softwares se encaixem e outros não. Legado é adjetivo. Se é adjetivo, diferencia, se diferencia, deve haver algo que não seja legado.

Se tudo é legado, não há diferenciação, portanto não há legado. O software que você está escrevendo não é legado pois ainda não foi para produção e para o cliente sequer existe de fato, então cairia fora desta definição, mas aí entra aquela outra que também é furada.

“Se foi para a produção virou legado!”

Também não se aplica, a primeira versão do seu sistema, a qual você possui completo controle sobre o código fonte e arquitetura, que está brilhando de lindo pode ser chamado de legado? Sabemos que não. É apenas uma variação da primeira definição que mostrei.

“Legado é todo aquele software que precisa ser substituído por ser obsoleto ou não servir mais!”

Também não. Este software não é legado, mas sim inadequado ao contexto em que se encontra. Entra aí o conceito de obsoleto. Em que sentido obsoleto? Regras de negócio que não se aplicam mais? Uma plataforma de desenvolvimento que NINGUÉM no MULTIVERSO conheça?

A história do ambiente de desenvolvimento críptico também é furada. Ok, você pode ter dificuldade em encontrar mão de obra especializada, mas nada além do custo (que nem sempre é tão exorbitante assim quanto nos vendem) impede que você treine ou aprenda aquele ambiente também antes né? (sempre me soa a preguiça)

“Código legado é código sem testes.” – Michael C. Feathers

Sim, eu li o livro

Sim, eu li o livro

Desconfio que esta falação toda em cima de código legado é motivada pelo livro do Michael C. Feathers que o Robert Martin tem divulgado bastante atualmente. Neste livro há uma definição bem interessante: “código legado é código sem testes”.

Em uma primeira análise é uma boa definição: se o código não tem testes você não sabe explícitamente o que ele faz, logo não há controle sobre ele. Você não sabe se vai quebrá-lo quando for implementar uma nova funcionalidade ou mudança.

O problema desta definição é o escopo: apenas o programador (e talvez o arquiteto). Para o programador código legado é aquele que considera ruim o que, normalmente não passa de uma questão de ego (Fabio Akita tem um texto excelente sobre isto) e ignorância a respeito do contexto que gerou aquele sistema. É simplesmente não ter uma resposta honesta para a pergunta “o sistema deveria ser deste modo por que eu quero ou por que realmente é uma necessidade?”.

(Sobre o livro, bom: me decepcionou pois é mais um livro de refactoring do que sobre arquitetura na minha opinião. Um dia ainda escrevo um review sobre ele. Resumindo: micro demais e macro de menos, mas mesmo assim recomendo a leitura.)

wizardofoz1

Então você é o legado?

O que é um sistema legado?

Sistema legado é aquele cujo controle foi perdido por seus principais stakeholders. – Definição Lobo Weissmanniana

Software legado tem valor e prova disto está no fato de ser usado. Ignorar isto é menosprezar seu cliente e divulgar aos sete ventos sua própria arrogância e cegueira.

Software legado é aquele cujo controle sobre sua evolução foi perdido pelos principais interessados. E ei: o principal interessado não é o programador ou a equipe de desenvolvimento, mas quem o financiou e os usuários finais. Minha diferença em relação a Feathers é o foco: o dele é a equipe de desenvolvimento, o meu o usuário final.

Testes são importantes? Não, são vitais pois garantem a malha de segurança para a equipe de desenvolvimento e tudo o mais que todos nós, desenvolvedores, já estamos cançados de saber. No entanto para quem financia são na prática apenas um dialeto desconhecido. No que diz respeito à proximidade dos testes com o cliente final o mais próximo que iremos ter é o BDD mas, convenhamos, o usuário executivo não se interessa tanto assim por eles quanto se interessa pelo sistema final NO MUNDO REAL.

Quão “antiga” é a plataforma de desenvolvimento também não fazem um sistema legado. Prova disto é a imensidão de sistemas feitos em Ruby on Rails, Grails, Spring, .net e outros feitos às pressas como “MVP” que deixam seus patrocinadores desesperados com uma quantidade imensa de bugs a serem resolvidos e evoluções caríssimas. Em contrapartida, temos um verdadeiro universo de sistemas feitos em COBOL, FORTRAN, DELPHI e VB cujas instituições financeiras possuem completo controle sobre si e não podem ser considerados como legado. A diferença entre um e outro? Controle.

Quando evoluo um sistema legado o objetivo final é simples: devolver o controle a quem interessa. Mas como se perde este controle? De imediato as seguintes causas me vêem à mente:

  • Perda de contato com a equipe responsável pelo desenvolvimento do sistema.
  • Complexidade ingerenciada: você mantém a equipe mas esta perdeu o controle sobre a complexidade do sistema devido a problemas arquiteturais.
  • Perda do próprio conhecimento do sistema decorrente de ausência de documentação ou alta rotatividade dos stakeholders envolvidos na confecção original.
  • Aparente perda de controle: sinistro mas já vi acontecer. Ocorre quando alguém diz que o sistema é ruim apenas para justificar sua reescrita sem apresentar fatos concretos. (muito comum, especialmente quando você está buscando consultorias no mercado para evoluir seu legado)
  • Perda do código fonte.
  • Ou qualquer outra ausência do elo que ligava você à idéia original que gerou aquele sistema.

Entenda: simplesmente refatorar uma base de código não restaura o controle ao stakeholder pois ele nos paga essencialmente para não ter de se preocupar com isto. Para o investidor ter novas funcionalidades ou evoluções e adaptações implementadas em um prazo e custo aceitável, em um todo que seja compreensível, isto sim é ter controle sobre um sistema. ISTO é evoluir um legado, ou melhor, atualizar um sistema.

(Sabe aquele sistema que “não serve mais” ou é “obsoleto”? Quando é verdade, você tem controle sobre ele, pois sabe que não mais se aplica. Por isto não considero legado. Nestas situações há consciência de que deve haver um descarte. O máximo de descontrole que pode haver neste caso são pessoas que ainda o usam.)

Concluindo

É sempre a questão de uma boa definição. Claro que outras definições existem e podem até ser melhor que a minha, no entanto o que observo é que raríssimas vezes vejo a palavra chave fundamental, controle, ser aplicada. Se você domina um sistema, não há problema, você sabe como ele pode e deve evoluir. De resto, é o mito do legado como bem descrito no blog do Fabio Akita que citei acima.

PS: uma definição alternativa poderia ser “o que separa o desenvolvedor infantil do aduto”, mas achei que poderia soar um pouco agressiva.

Nota – 7/5/2016

Hoje vejo que minha definição de legado na realidade não o define, mas sim o problema principal que envolve o conceito.

E também vejo que o termo legado sequer deveria ser usado. Explico as razões neste post.

9 thoughts on “O que é legado?

  1. 2. Legado

    Por Dicionário inFormal (SP) em 14-01-2013
    Legado é algo transmitido ou adquerido mas não como herança, é algo deixado para um todo e não só pra um.

    Os dez mandamentos é um legado de Deus

    A MELHOR DEFINIÇÃO É DE UM SOFTWARE QUE É TRANSMITIDO/DEIXADO PARA OUTRO(S) PROGRAMADOR(ES) DAREM CONTINUIDADE/MANUTENÇÃO, ETC….

    Responda

    Kico (Henrique Lobo Weissmann) Reply:

    Oi Kalipha Pha,

    esta definição é bastante simplista, não? É importante lembrar que o significado de uma palavra varia de acordo com o contexto, sendo assim, a busca apenas pelo dicionário não nos ajuda tanto assim. Pode ser um ponto de partida, mas com certeza não será o de chegada.

    Responda

    Priscila Mayumi Sato Reply:

    Essa definição no dicionário comum, voltado a palavras do dia-a-dia. Esse legado citado é referente a heranças (financeiras, culturais, etc) e não a algo relacionado ao mundo de software

    Responda

  2. Faltou em uma das causas de perda de controle:

    Mudança de regras de negócio.

    Com a legislação brasileira sendo um “metamorfose ambulante”, sistemas antigos que são o coração de várias empresas tem dificuldades em evoluir por essa causa dela.

    Responda

    Kico (Henrique Lobo Weissmann) Reply:

    Este é um bom ponto sim Denner. No caso, tá inclusive relacionado mais a problemas arquiteturais.

    Responda

  3. Sistema legado é um sistema com tecnologia antiga, que está prestes a morrer ou já deveria ter morrido (ciclo de vida do software), e que dará lugar a um sistema com tecnologia moderna.
    Muitas vezes o sistema vira legado apenas por causa de demandas do mercado (desktop x web), mas não significa que seja um sistema ruim ou muito obsoleto. Já outras vezes o sistema não deveria mais existir, ou nunca deveria ter nascido, e já passou da hora da empresa investir em um novo. Com as mudanças de versões rotineiras .. isso acaba gerando muita confusão, pois as mudanças geradas pela nova versão não geram impacto suficiente para justificar a mudança de sistema.
    Eu tenho preferido usar algumas versões mais estáveis, cuja equipe do projeto domine, do que mudar apenas por que é novo.
    Legado não é sinônimo de obsolescência programada. Legado é a chegada natural do ciclo de vida de um sistema.

    Responda

    felipe Reply:

    Legado é a chegada natural do fim do ciclo de vida de um sistema.

    Responda

  4. Pra mim, Legado era todo o código ou ideia que eu pudesse reaproveitar de um projeto anterior… Bibliotecas ou classes que já foram testadas e possuem funcionalidades comuns, ou a melhor forma de implementar um comportamento ou função.

    Após o seu post, percebi que nunca tinha pensado a respeito e que todos os pontos de vista espostos parecem estar corretos em suas argumentações, afinal posso ter o meu legado e posso ter UM legado caido no colo… :-)

    Prefiro o sentido de que todo o nosso conhecimento é o Legado da humanidade e se existe legado existe transformação, pego o melhor do passado junto com o melhor do presente e a resultante será o legado para o futuro.

    Responda

  5. Concordo com a definição do autor. Uma aplicação disto: recentemente a microsoft terminou seu suporte ao windows xp. Nestes 14 anos que o produto durou, provavelmente a equipe que o desenvolveu estava ocupada com projetos inovadores, que renovaram o ciclo de venda da empresa. Surgiram o windows 7,8, 10, phone.. etc. O XP virou um legado por diversos motivos: a empresa focou em outros produtos, mais inovadores e modernos, o desenvolvimento passou para outras equipes (mudando seus stakeholders originais), etc. Manter este produto passou a ser quase que uma obrigação para a microsoft… Vejo que o que determina se um sistema virará ou não um legado é mais uma questão de marketing do que outra coisa. Um abraço!

    Responda

Leave a Reply

Your email address will not be published. Required fields are marked *