Eu acho que o diagrama de classes sempre deve ser usado para documentar o código. Eu não acho que se você olhar diretamente para o código, poderá ver a arquitetura completa. Concordo que, se você mesmo escreveu o código ou trabalhou nele por um longo período de tempo, pode entender, mas cada vez que uma nova demanda surge, cada vez que você precisa olhar para o código e procurar onde adicionar esse novo código.
O que fazemos em nossa empresa é ter visualizações de diagramas de classes de nosso projeto. Realmente não gastamos tempo modelando, mas apenas usamos o diagrama de classes para visualizar o código após uma engenharia reversa. Se o código for alterado, existe um mecanismo de mesclagem e meus diagramas de classes são sempre atualizados.
O que é fantástico é poder adicionar comentários, restrições no diagrama, além do java doc. Revertemos o projeto e, em seguida, criamos um modelo e, finalmente, extraímos as visualizações do modelo exibido como diagramas de classe UML. Não codifico nesse estágio, mas obtenho uma cópia azul da arquitetura de código e trabalho nela para criar ou estender minha arquitetura atual. Se eu gostar, pressiono um botão e meu código existente é mesclado com meus diagramas. Quero dizer mesclar e certamente não geração de código completo. Somente o delta entre o código existente e meus diagramas é gravado, não o código completo toda vez.
Estou estudando há muitos anos, tenho mestrado e ainda codigo, mas não quero ser apenas um escritor de java e gostaria de usar meu cérebro um pouco mais. As visualizações UML fornecem o que eu preciso para pensar sobre minha arquitetura, comunicar-me com os outros membros da equipe e criar uma arquitetura melhor sem usar o desenvolvimento orientado a modelos, mas apenas o delta entre o código escrito manualmente existente e criar graficamente diagramas de classes. Eu crio minha arquitetura no nível do código, depois a inverto e olho para o modelo. Crio visualizações e tento melhorar minha arquitetura diretamente no código, depois inverto novamente e vejo o que é feito, etc ... É uma iteração permanente, sem geração de código orientada a modelo, mas com sincronização ao vivo ou mesclagem entre código e UML. O que eu gosto é que o código conduz a UML e certamente não o contrário.