Reengenharia não é manutenção preventiva. Aliás, manutenção preventiva é uma coisa esquisita por si só, porque só se faz alteração em código se isso traz valor ao negócio do cliente.
Reeengenharia não implica na cópia da estrutura de objetos ou de chamadas a métodos presentes em uma linguagem para a outra, portanto a presença ou não de ferramenta que gera diagramas a partir de código é no mínimo questionável. O que deveria ser feito é fazer a análise baseado nos executáveis, nos fontes, nos documentos, nos casos de testes e nas bases de dados da aplicação atual. E depois, deve-se construir modelos e códigos não se baseando naquilo que foi escrito anteriormente, mas se baseando na análise feita anteriormente. Qualquer coisa diferente disso não é reengenharia propriamente dita.
Ninguém falou em “cópia da estrutura de objetos ou de chamadas a métodos”, niguém mencionou nada disso.
Mencionei a utilização de ferramentas para obtenção de diagramas de classes a partir do código fonte, isso é completamente diferente. Caso não tenha ciência, atividades de reengenharia envolvem atividades de engenharia reversa; se tivesse lido pelo menos uma referência confiável sobre o assunto estaria ciente disso. Atividades de engenharia reversa podem ser apoiadas por ferramentas.
Afinal de contas se você não tem uma representação de alto nível do que será alterado é bem complicado saber onde as alterações devem ser realizadas, e compreender o sistema como um todo. E quando a documentação disponível não está sincronizada com o estado atual do sistema? E os diagramas disponíveis na mesma também não refletem o que se encontra implementado? Vai continuar analisando e confiando cegamente na documentação?
Olha até posso sugerir algumas referências pra ti. Sem pedantismo nenhum, mas meu trabalho de mestrado é nessa área. Acho que sei do que estou falando. Se quiser pode começar por esse aqui: http://www.amazon.com/Oriented-Reengineering-Patterns-Engineering-Programming/dp/1558606394/ref=sr_1_1?ie=UTF8&s=books&qid=1210095211&sr=8-1
Toda a questão começou por “inferência de tipos”, se você acha que é fácil fazer tal coisa em linguagens dinamicamente tipadas poderia publicar bastante. Há vários artigos na IEEE sobre tal assunto… se tiver alguma idéia revolucionária.