Creo que el diagrama de clase siempre debe usarse para documentar el código. No creo que si miras el código directamente puedes ver la arquitectura completa. Estoy de acuerdo en que si ha escrito el código usted mismo o ha estado trabajando en él durante mucho tiempo, entonces puede entenderlo, pero cada vez que surge una nueva demanda, cada vez que necesita mirar el código y buscar dónde agregar este nuevo código.
Lo que hacemos en nuestra empresa es tener vistas de diagramas de clases de nuestro proyecto. Realmente no pasamos tiempo modelando, solo usamos el diagrama de clase para visualizar el código después de una ingeniería inversa. Si el código cambia, entonces hay un mecanismo de fusión y mis diagramas de clase siempre se actualizan.
Lo fantástico es poder agregar comentarios, restricciones en el diagrama además de java doc. Revertimos el proyecto, luego creamos un modelo y finalmente extraemos vistas del modelo que se muestra como diagramas de clase UML. No codifico en esta etapa, pero obtengo una copia azul de la arquitectura de código y trabajo para crear o ampliar mi arquitectura actual. Si me gusta, presiono un botón y mi código existente se fusiona con mis diagramas. Me refiero a fusionar y ciertamente no a la generación de código completo. Solo se escribe el delta entre el código existente y mis diagramas, no el código completo cada vez.
He estado estudiando durante muchos años, tengo una maestría y sigo codificando, pero no quiero ser solo un escritor de Java y me gustaría usar mi cerebro un poco más. Las vistas UML me dan lo que necesito para pensar en mi arquitectura, comunicarme con los otros miembros del equipo y crear una mejor arquitectura sin usar el desarrollo Model Driven, sino solo el delta entre el código escrito manualmente existente y crear gráficamente diagramas de clase. Creo mi arquitectura a nivel de código, luego la invierto y miro el modelo. Creo vistas e intento mejorar mi arquitectura directamente en el código, luego retrocedo y veo lo que se hace, etc. Es una iteración permanente sin generación de código impulsada por el modelo, pero sincronización en vivo o fusión entre código y UML. Lo que me gusta es que el código impulsa el UML y ciertamente no es lo contrario.