DDD: La importancia del lenguaje ubicuo.

Programar no es acerca de instrucciones , sentencias, clases o estructuras. Programar es usar un medio, los lenguajes de programación, para poder reproducir un proceso que existe en el mundo real, al menos gran parte del software que usa en las empresas busca este propósito. Al trabajar con ideas y conceptos que son un subconjunto del mundo real es importante el tratamiento que se le da a las ideas que usas para construir.

¿Que es ubicuidad?.

Ubicuidad es un sinónimo  de omnipresencia, mas allá de un significado religioso. Cuando se habla de lenguaje ubicuo quiere decirse que los conceptos y comportamientos están presentes en varios lugares dentro del ciclo de vida del proyecto. Sobre todo el lenguaje ubicuo debe estar presente en las mentes de los involucrados en el proyecto. Todos, no importa el nivel técnico deben poder hablar con los mismos términos que se refieren a las mismas cosas desde la terminología del usuario, no del TI.

El lenguaje ubicuo construye puentes y destruye muros.

Frecuentemente los proyectos en la empresa inician desde dos puntos. Primero, un dueño del problema requiere de una solución tecnológica, con su enfoque de alto nivel construye el requerimiento o una mera descripción de la problemática. Después, el equipo de desarrollo construye una especificación basada en lo que se entendió de la descripción, desde el bajo nivel. Es común que el equipo de desarrollo piense en lenguajes, frameworks, plataformas, bases de datos y/o infraestructura como primer paso. ¿Que tan posible es que existan lagunas en el conocimiento del problema?, ¿que tan posible es que el dueño del problema y el equipo de desarrollo vean las cosas distintas?, ¿que tan posible es que la problemática sea mas compleja de lo que se cree por ambas partes?. La respuesta a estas preguntas es: muy posible.

Rara vez hay una preocupación de los implicados por clarificar conceptos durante el desarrollo de un proyecto, esto implica que se deja a interpretación de cada persona lo que se supone que debe o puede hacer el sistema. Sin haber tirado una sola linea de código es posible encontrar fallos en el diseño, siempre es preferible dedicar tiempo a asegurarse que los conceptos fundamentales del problema a resolver se llaman igual y significan lo mismo en todas partes del subdominio del problema. Si todos hablan en los mismos términos, las reuniones de revisión, cambios, seguimiento o entrega van a ser definitivamente mas fáciles.

El lenguaje ubicuo mejora la calidad del código.

Las ideas y los comportamientos del sistema son susceptibles a perderse en la codificación. No solo hay que asegurarse  de que usas los mismos términos con las personas, las maquinas también deben de seguir esta practica. Los conceptos de alto nivel plasmados en el requerimiento, en términos del usuario, deben de ser modelados de igual modo en la arquitectura de la solución. Teniendo fidelidad con las entidades y comportamientos usados es fácil hacer cambios, también es fácil de  corregir. La legibilidad de un código en términos ubicuos permite que el programador gaste menos esfuerzo mental en resolver problemas derivados del mantenimiento. Si tu código se puede leer como prosa o un pseudolenguaje de dominio cualquiera podrá dar mantenimiento, no solo el equipo original.

El lenguaje ubicuo previene malas practicas.

El principal smell que se elimina cuando decides usar términos ubicuos es la obsesión con los primitivos, al tener estructuras  de datos con mayor significado las puedes usar para construir las reglas de negocio o los algoritmos. También  permite reducir las dependencias porque es mas sencillo diferenciar que es una política y que es un detalle. Las pruebas resultan mas sencillas porque  es mas claro definir cuales son los caminos críticos para probar. Incluso se pueden encontrar fallos en la arquitectura o faltantes  en el conocimiento de la solución.

Autor imagen: Leon Riskin