Eu prefiro o resumo da Wikipedia :
A legacy system is an old method, technology, computer system, or application program that continues to be used, typically because it still functions for the users' needs, even though newer technology or more efficient methods of performing a task are now available.
Muito do que outras pessoas estão descrevendo em suas respostas são razões porque o código se torna "legado". Mas a questão essencial em si é esta:
But it's still used in the production systems - so is it really legacy? And what makes it legacy?
O fato de que ainda é usado na produção é precisamente o que o torna legado . Se o código não funcionar corretamente ou não for mais usado na produção, esse código será "quebrado" ou "aposentado", respectivamente. Legado significa que ainda está em uso e funciona bem, mas incorpora projetos ou técnicas que não estão mais em uso comum.
Qualquer código ou sistema que você quer (a) deseja atualizar / atualizar, mas não pode ou (b) ainda está no meio da atualização, é um sistema legado. Isso não significa refatoração ou limpeza geral de código, isso significa significativas alterações no design, possivelmente usando um novo framework ou até mesmo uma nova plataforma.
Existem vários motivos pelos quais sistemas ou códigos podem se tornar legados:
-
Falta de manutenção regular ou podridão de software . Claramente, se o aplicativo não for mantido regularmente, ele não acompanhará as grandes mudanças no mundo do software. Isso pode ser devido a negligência simples ou pode ser uma escolha deliberada com base nas prioridades do negócio ou restrições orçamentárias.
-
Falta de testes. Outra resposta faz referência à alegação hiperbólica de um autor popular de qualquer código não coberto por testes sendo código legado. Isso realmente não é uma definição precisa, mas é uma possível causa raiz; sem bons testes (automatizados ou manuais), os desenvolvedores tornam-se tímidos e com medo de fazer grandes mudanças porque se preocupam em quebrar alguma coisa, o que leva ao "apodrecimento do software" acima.
-
Rev-locking, um fator frequentemente negligenciado que é particularmente insidioso em projetos que usam grandes bibliotecas ou frameworks de código aberto (embora eu tenha visto isso acontecer com ferramentas comerciais também). Muitas vezes, haverá uma grande personalização feita na estrutura / biblioteca, tornando a atualização proibitivamente difícil ou cara. Assim, o sistema se torna legado porque é executado em uma plataforma mais antiga (e possivelmente não mais suportada).
-
O código-fonte não está mais disponível, o que significa que o sistema só pode ser adicionado, nunca alterado. Como esses sistemas precisam ser reescritos para atualizar - ao contrário de revisões incrementais / iterativas - muitas empresas não se incomodarão.
Qualquer coisa que atrase ou interrompa as atualizações em uma base de código pode fazer com que a base de código se torne legada.
Agora, a questão separada, não declarada, mas implícita é, o que há de errado com o código legado? É frequentemente usado como um termo pejorativo, daí a pergunta:
Should we shy away from this unwarranted labelling of perfectly functioning code?
E a resposta é não, não devemos; a rotulagem é garantida e o próprio termo claramente implica código funcional. O ponto não é que é sua função, mas como está funcionando.
Em alguns casos, não há nada errado com o código legado. Não é uma palavra ruim. Código / sistemas legados não são maus. Eles apenas coletaram um pouco de poeira - às vezes um pouco, às vezes muito.
Legado torna-se obsoleto quando o sistema não pode mais atender (todas) as necessidades do cliente. Esse rótulo é um dos que precisamos ter cuidado. Caso contrário, é simplesmente uma equação de custo / benefício; se o custo de atualização for menor do que o custo de seus benefícios (incluindo custos de manutenção futuros menores), faça upgrade, caso contrário, deixe-o em paz. Não há necessidade de cuspir a palavra "legado" no mesmo tom que você normalmente reserva para "auditoria fiscal". É uma situação perfeitamente OK.