Para explicar esto adecuadamente, necesitamos una breve lección de historia. En los primeros días de la ingeniería de software, una analogía de uso frecuente era construir una casa. Un arquitecto e ingeniero estructural discuten los planes con un cliente y elaboran un diseño. Los constructores luego siguen ese diseño para construir la casa real. Escribir código fue visto como el equivalente a construir la casa real. Por lo tanto, se percibió la necesidad de un diseño inicial antes de que esa construcción pudiera tener lugar. Se crearon varias herramientas de diseño gráfico, con UML como una de ellas.
La idea original con UML era que uno diseñara completamente un sistema con UML y luego lo entregara a los codificadores para traducir ese diseño en código. En realidad, esto simplemente no funciona, y llevó a años de programadores a ser vistos como "implementadores", en lugar de "diseñadores", los proyectos se retrasaron, los diseños tuvieron que cambiar constantemente después de que se suponía que estaban completos, etc.
El motivo es simple. La codificación es diseño . Con la analogía de la casa, el código son los dibujos del arquitecto. El compilador es el constructor que toma esos diseños y crea un programa a partir de ellos. Esta realización condujo a técnicas ágiles, TDD, etc. nacen: herramientas para ayudar a mejorar la calidad del diseño de ese código.
Del mismo modo que un arquitecto puede producir bocetos preliminares para ayudarla a ella y a su equipo a visualizar el diseño general, un desarrollador puede usar UML u otras herramientas para ayudar a visualizar el diseño necesario. Así como esos bocetos no se siguen a ciegas, el UML no se debe seguir a ciegas. El diseño del código debe evolucionar a partir de iteraciones ágiles y utilizando TDD. Del mismo modo, así como un arquitecto podría construir un modelo de la casa para ayudarla a ella y a su equipo a visualizar los dibujos, también se puede usar UML para ayudar a visualizar la estructura del código.
Como dice el tío Bob, no puedes validar el UML, solo puedes validar el código. Por lo tanto, el código es la documentación de diseño principal y UML, si se usa, es solo documentación secundaria.