Meus dois centavos, baseados na leitura dessa thread “em um tapa só”:
Uma coisa que eu ouvi já de várias pessoas, acho que o Yoshima inclusive, é que UML não é documentação.
Sério, as pessoas superestimam demais a UML. Escrevem-se tanto detalhes nesse diagrama que se perde a visão do todo. E aí, os diagramas ficam praticamente no mesmo nível de detalhe do código. E veja só, ninguém é louco de escrever uma aplicação em Java e, ao mesmo tempo, a mesma aplicação em C# (porém sem compilar), alegando que uma das linguagens é mais fácil de se trabalhar. Mas incrivelmente, com a UML, os rupistas e cascateiros escrevem a mesma aplicação de duas formas diferentes, e nem se tocam do ridículo!
Eu acho a UML útil, mas só se for pra comunicar uma idéia “macro”. Tipo, algum conceito que, se fosse olhar pro código, exigiria a leitura de um punhado de arquivos. Fora isso, é refazer a mesma coisa sem necessidade.
Com relação ao uso de UML para engenharia reversa, tenho uma postura bastante contrária. Os diagramas resultantes serão, no mínimo, confusos. E, implicitamente, assume uma postura cascata, onde haveria um dia mágico onde a aplicação antiga se desligaria e a nova entraria no ar. Fato é que esse dia nunca chega! Existem, em códigos legados, conceitos tão implícitos (mas importantes pros clientes) que uma análise BDUF não vai capturar. E quando ocorre a “fase de transição”? (Que a literatura sobre engenharia reversa não fala!) É aquele momento onde um requisito urgente precisa ser adicionado na aplicação mais antiga porque a nova ainda está em desenvolvimento. Nesse caso, o menos ruim é fato de se escrever duas vezes, porque o pior é o fato de que esse requisito pode ser esquecido quando a nova versão estiver no ar!
Vou causar briga com isso, mas enfim: engenharia reversa é lenda! Só funciona quando a aplicação é pequena, mantido por um curto período por um ou dois programadores que ainda estão disponíveis para conversar. Ou então quando a aplicação antiga é tão ruim que, simplesmente, não atende o que o cliente quer (aí não precisa de engenharia reversa, pois o legado não tem como ajudar). Pros outros casos, só resta a triste sina: mantenha a aplicação, mas refatore e adicione casos de testes quando for mexer. Isso significa que aquela mudança do Struts 1 para o Grails não deve ser feita? Exatemente! Não dá pra saber o que está escondido no código legado (e, ao contrário do que muitos acreditam, a UML não ajuda), e é melhor não sumir com requisitos da aplicação da noite para o dia.