Acho que os diagramas UML só podem ser úteis se eles expressarem algo em um nível mais alto de abstração do que o seu código .
Escrever UML apenas por uma questão de escrever UML torna-se uma burocracia desnecessária e torna o projeto e o código menos adaptáveis a mudanças sem qualquer benefício.
Por exemplo, um diagrama de classes UML mostrando todas as classes em um pacote, com todos os seus atributos e métodos - algo que pode ser facilmente gerado automaticamente - não fornece nenhum valor: está no mesmo nível de abstração que o seu código . Além disso, o código certamente será uma fonte melhor para essas informações, pois sempre estará atualizado e provavelmente será documentado e organizado de uma maneira que seja mais fácil saber quais métodos / atributos / coisas são mais importantes.
Por outro lado, se você tiver conceitos de um nível de abstração mais alto do que o que pode ser expresso expresso no código, documentá-los em um diagrama pode ser uma boa idéia.
Por exemplo, um diagrama mostrando os módulos abstratos de nível superior em um sistema complexo, com suas dependências e talvez uma pequena descrição de suas responsabilidades e para qual pacote / namespace eles mapeiam no código-fonte pode ser realmente útil para um novo membro da equipe que precisa ser introduzido no projeto ou também pode ser usado para descobrir onde uma nova classe / funcionalidade deve ser lançada.
Outro exemplo de um diagrama útil pode ser um diagrama de seqüência que mostra as etapas de alto nível a serem tomadas em um protocolo de comunicação. Talvez cada etapa tenha pequenas peculiaridades e complexidades, mas provavelmente é suficiente descrevê-las no próprio código. O diagrama de nível superior pode ajudar um programador a entender facilmente o "quadro geral" das coisas, sem precisar se preocupar com as complexidades de cada interação.
Enfim, esses são apenas alguns exemplos; Existem muitos casos em que um diagrama simples pode ajudar bastante. Lembre-se de que você deve fazê-las somente quando não puder expressar algo no próprio código. Se você estiver usando diagramas UML para explicar o próprio código-fonte, torne o código de classificação mais auto-documentado.
Finalmente, algumas das regras gerais que se aplicam ao código também podem se aplicar aos diagramas: evite repetir-se, mantenha-o simples, não tenha medo de mudar as coisas (apenas porque algo está documentado em um diagrama UML não significa que não possa seja alterado) e sempre pense em quem lerá / manterá esses diagramas no futuro (provavelmente seu futuro) ao escrevê-los :)