Testes e qualidade de código

Por que o código legado é sempre criticado?

Ainda me lembro claramente do momento em que, no meu primeiro dia na empresa nova, recebi o repositório e abri o código pela primeira vez.

4 min de leitura
Imagem de capa de Por que o código legado é sempre criticado?

Ainda me lembro claramente do momento em que, no meu primeiro dia na empresa nova, recebi o repositório e abri o código pela primeira vez.

Havia um arquivo de 3 mil linhas com todo tipo de lógica misturada. Suspirei sem perceber.

“Quem foi que escreveu isso assim…?”

Alguns meses depois, porém, um desenvolvedor recém-chegado que analisava meu código estava com exatamente a mesma expressão. Foi quando entendi: código legado não é culpa de uma única pessoa.

Vou começar pela conclusão.

O código legado é criticado não por ser ruim, mas porque o contexto em que foi escrito desapareceu.

Hoje quero compartilhar minha experiência sobre por que o código legado sempre vira alvo de reclamações e como sofrer menos ao lidar com ele.


O que é código legado? É diferente de código antigo?

Vamos esclarecer primeiro: código legado não é simplesmente “código antigo”.

Pela minha experiência, há um único critério: código que dá medo de alterar porque não tem testes.

Michael Feathers define código legado em seu livro “Working Effectively with Legacy Code” como “código sem testes”. Mesmo que tenha sido escrito há apenas uma semana, se não há testes e cada alteração deixa você apreensivo, isso é código legado.

Por outro lado, até um código de 10 anos pode ser alterado tranquilamente se tiver testes abrangentes.

Portanto, a idade não é o problema. O ponto central é ter ou não a confiança de que “se eu mexer aqui, nada vai quebrar em outro lugar”.


Por que o código legado é sempre criticado?

Ao organizar os motivos, encontrei três principais.

1. Quem escreveu o código não está mais na empresa

Não há ninguém a quem perguntar por que foi feito assim. Sem comentários ou documentação, restam apenas o código e a minha imaginação.

2. O contexto desapareceu

Código estranhamente enrolado quase sempre tem uma história: prazo apertado, requisitos esquisitos ou uma solução para contornar um bug de uma versão específica do sistema operacional.

Na época, era a melhor opção, mas essas circunstâncias não ficam registradas no código. Só sobra o resultado, que hoje parece incompreensível.

3. O código dos outros sempre parece estranho

Sinceramente, esse é o principal motivo. Meu código parece natural porque tenho o fluxo na cabeça, mas, no código dos outros, precisamos acompanhá-lo desde o início.

Essa frustração acaba saindo na forma de “por que fizeram assim?”.

Vamos olhar o código abaixo. À primeira vista, ele traz um vestígio típico de código legado: dá vontade de perguntar por que essa condição existe.

// por que 30 é subtraído, ninguém sabe
if user.type == "B" && amount > 0 {
    finalPrice = amount - 30 // 2019resquício de uma promoção de anos atrás?
}

Não há como saber se este - 30 ainda é necessário ou se é um vestígio de um evento antigo. Uma linha assim, acumulada várias vezes, acaba virando código legado.


Então, como devemos lidar com código legado?

Diante de um código legado desconhecido, é natural querer “reescrever tudo”, mas existe um caminho melhor.

Hoje sigo três princípios.

  1. Não reescrevo sem pensar — código que funciona incorpora a resposta a inúmeros bugs corrigidos ao longo do tempo. Se você reescrevê-lo, terá de enfrentar tudo de novo desde o início.
  2. Primeiro cubro o código com testes — ao fixar o comportamento atual com testes, fica evidente o que quebrou depois da alteração.
  3. Deixo registrado por que fiz a alteração — se o motivo estiver na mensagem do commit ou em um comentário, a próxima pessoa pelo menos vai me culpar um pouco menos.

O terceiro é especialmente importante. É a única maneira de não passar para alguém no futuro a frustração que sinto agora.


No fim, o código novo de hoje será o código legado de amanhã

O que descobri ao longo de seis meses é um pouco desanimador: este código que estou escrevendo com tanto cuidado também será código legado, criticado por alguém daqui a alguns anos.

Quando aceitei isso, fiquei mais tranquilo. Em vez de buscar a perfeição, mudei o rumo para facilitar a vida da próxima pessoa.

Se você está suspirando diante de um código legado desconhecido, lembre-se por um instante de que quem o escreveu também fez o melhor que podia naquele dia. E comece tranquilamente pelos testes. Esse parece ser o caminho que machuca menos todo mundo.