Sou um pouco parcial do resumo da Wikipedia :
Um sistema legado é um método, tecnologia, sistema de computador ou programa de aplicativo antigo que continua a ser usado, normalmente porque ainda funciona para as necessidades dos usuários, mesmo que agora estejam disponíveis tecnologias mais recentes ou métodos mais eficientes de executar uma tarefa.
Muito do que as outras pessoas estão descrevendo em suas respostas são razões pelas quais o código se torna "legado". Mas a questão essencial em si é esta:
Mas ainda é usado nos sistemas de produção - então é realmente legado? E o que o torna legado?
O fato de ainda ser usado na produção é exatamente 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 "retirado", respectivamente. Legado significa que ele ainda está em uso e funciona bem, mas incorpora projetos ou técnicas que não são mais de uso comum.
Qualquer código ou sistema que você (a) gostaria de 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 do código, significa mudanças significativas no design, possivelmente usando uma nova estrutura ou mesmo uma nova plataforma.
Há várias razões pelas quais sistemas ou código podem se tornar herdados:
Falta de manutenção regular ou apodrecimento do software . Claramente, se o aplicativo não for mantido regularmente, ele não acompanhará as principais mudanças no mundo do software. Isso pode ser devido à simples negligência ou pode ser uma escolha deliberada com base nas prioridades de negócios ou restrições orçamentárias.
Falta de teste. Outra resposta faz referência à alegação hiperbólica de um autor popular de qualquer código não coberto por testes como 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 ficam tímidos e com medo de fazer grandes alterações porque se preocupam em quebrar alguma coisa, liderando a "podridão do software" acima.
Rev-locking, um fator frequentemente esquecido, particularmente insidioso em projetos que utilizam grandes bibliotecas ou estruturas de código aberto (embora eu tenha visto isso acontecer com ferramentas comerciais também). Freqüentemente, haverá grandes customizações na estrutura / biblioteca, tornando uma 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 incluído, nunca alterado. Como esses sistemas precisam ser reescritos para atualizar - em vez de revisar de forma incremental / iterativa - muitas empresas não se incomodam.
Qualquer coisa que diminua ou interrompa as atualizações em uma base de código pode levar a essa base de código a se tornar herdada.
Agora, a pergunta 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:
Devemos evitar essa rotulagem injustificada de código que funciona perfeitamente?
E a resposta é não, não devemos; a rotulagem é garantida e o próprio termo implica claramente código de funcionamento. O ponto não é que é função, mas como está funcionando.
Em alguns casos, não há nada de errado com o código herdado. Não é uma palavra ruim. Os sistemas / códigos legados não são maus. Eles acabaram de coletar poeira - às vezes um pouco, às vezes muito.
O legado se torna obsoleto quando o sistema não pode mais atender (todas) as necessidades do cliente. Esse rótulo é um dos quais precisamos ter cuidado. Caso contrário, é simplesmente uma equação de custo / benefício; se o custo da atualização for menor que o custo de seus benefícios (incluindo menores custos futuros de manutenção), faça a atualização; caso contrário, deixe em paz. Não é necessário cuspir a palavra "legado" no mesmo tom que você normalmente reserva para "auditoria fiscal". É uma situação perfeitamente aceitável.