Dev from trenches

Un lenguaje común y expresivo en equipos remotos

Introducción

Tenían aspecto humano y hablaban la misma lengua. Sin embargo, no se daba el entendimiento en nuestra conversación. No se entendían entre ellos por lo que descarté que fuera yo el único motivo. Usaban palabras diferentes para referirse a los mismos conceptos por lo que razonar en la misma dirección era imposible. Constantemente tenía que hacer de intérprete para que dos de ellos se pudieran comunicar. Era una tarea tediosa y no sabía si en mi interpretación se producía pérdida de semántica. Esta narrativa bien pudiera ser de una novela de ficción. En cambio esta situación es la que tenía diariamente con mi equipo durante las charlas técnicas. Si te sientes identificado con esta situación, entonces tienes un problema lo mismo que lo tuve yo. Te interesará saber como lo estoy resolviendo. Se resume en definir un lenguaje común y expresivo que pueda usarse en equipos remotos.

Comunicación ineficaz

La resolución a este problema de comunicación no es instantánea y  requiere un proceso largo de adaptación y evolución. Sin embargo he decidido poner foco en ello dado que ahora cobra mayor importancia lograr una comunicación eficaz. Nos encontramos trabajando 100% en remoto por la situación excepcional que estamos viviendo y los medios de  comunicación han variado. Necesitamos esa eficacia.

Nuestro equipo está formado por miembros con diferentes habilidades y conocimientos: expertos en el negocio, analistas, desarrolladores y testers.
Cada grupo usa un lenguaje diferente ocasionando que las comunicaciones sean ineficaces. Utilizar lenguajes diferentes ocasiona constantes malentendidos. Entre estos grupos no se da una buena comunicación.

Un grupo especial es el grupo de los desarrolladores. Usan su jerga técnica para expresarse utilizando nombres de clases en código en sus conversaciones. Esto también me ocurría cuando solamente desarrollaba código. Con este tipo de conversaciones no es posible razonar y profundizar para dar solución a los problemas. Las otras personas que no están involucrados directamente en el desarrollo concreto del que se está hablando están totalmente perdidos y no pueden aportar nada. Si durante las reuniones de tu equipo prevalece un lenguaje técnico entonces aquellos que no sean desarrolladores no pueden participar ni entender nada. Los desarrolladores que son quienes han producido este código están desconectados del resto del equipo. Es imposible mantener una conversación sin abstraernos del código.

El activo con mayor valor que producimos es el código del producto. Si haces catas en el código y no encuentras palabras que ni remotamente se asemejen a las palabras que describen al dominio y a tu modelo, entonces tienes un problema muy serio. No podrás entender la semántica del código con respecto al problema real que resuelve. Me recordaba a cuando programábamos en ensamblador o en código máquina, sin poder agarrarte a ninguna semántica. Se ha perdido la trazabilidad entre el dominio, el modelo y el código.

No pretendo dejar mi labor como intérprete y traductor sino que intento que ocurra con menos frecuencia. Pretendo que haya más conversaciones cruzadas entre los miembros del equipo con diferentes perfiles porque esto enriquecerá a todo el equipo y a todos los activos que produzcamos.

Lenguaje común y expresivo

Necesitamos establecer un lenguaje común que sea usado por todo el equipo para poder comunicarnos con eficacia, con precisión, evitando traducciones intermedias y sobre el que basar una conversación profunda apoyada en razonamientos lógicos.

Este lenguaje común debe servir para expresar el modelo que tengamos del dominio de nuestro negocio. Esta es la aproximación que propone Domain Driven Design (DDD). El modelo contiene los conceptos y relaciones entre ellos que son abstracciones del dominio. El lenguaje reserva palabras para referirnos sin lugar a la duda a los conceptos y relaciones del modelo del dominio. Siempre que queramos referirnos a un concepto o relación usaremos la misma palabra.

Sin embargo no se da un único sentido desde el lenguaje hacia el dominio. A través del lenguaje expresamos el modelo, razonamos sobre él y esto nos hace descubrir nuevos conceptos, relaciones y restricciones. A su vez esto provoca que conozcamos en mayor profundidad el dominio, extrayendo reglas de negocio que permanecían ocultas a nuestros ojos. Se da un doble sentido.

Los miembros del equipo definen este lenguaje común, pues haciéndoles partícipes será más fácil que luego lo usen. No todos tenemos las mismas habilidades para definir un lenguaje. Se necesita la habilidad de conceptualizar lo que ocurre en el dominio, extrayendo los conceptos y delimitando sus bordes semánticos. Analizando las relaciones que se dan entre los conceptos. Si el dominio es abstracto esta tarea será compleja porque no tendrás una referencia física de lo que modelan estos conceptos y relaciones.

He de admitir que me costó entender el ejemplo de las tribus esquimales. Estas tribus tienen una familia de palabras para caracterizar a la nieve, mientras que tribus del desierto no tienen esta expresividad tan abundante para hablar sobre este elemento. Los esquimales viven en la nieve a diario y necesitan comunicarse con esta expresividad para sobrevivir.

La expresividad de nuestro lenguaje guarda relación con la complejidad de nuestro dominio y de los problemas que resolvemos sobre este dominio. Las palabras mostrarán una precisión equivalente a estos conceptos y relaciones. El uso de cada palabra será adecuado dependiendo del contexto de la conversación en cada momento.

Se irán formando familias de palabras que representen a conceptos del modelo que tienen relación entre sí. En el contexto de este artículo denominaremos palabras raíz a aquellas palabras que representen a conceptos generales. De estas palabras se derivaran otras palabras que representen a conceptos más específicos.

Evolución del lenguaje

Nuestro lenguaje cotidiano evoluciona según el uso que hacemos de él. Se admiten nuevas palabras para referirnos a cosas o comportamientos nuevos. Se retiran palabras que ya no se usan. A medida que vamos conociendo mejor el dominio de nuestro producto vamos ampliando y refinando nuestro modelo y el lenguaje para expresarlo.

Nuevas palabras surgirán para acotar con mayor precisión un concepto. Al incluir estas nuevas palabras en el lenguaje podremos hablar de partes del dominio que antes no podíamos. O se irán modificando el significado de algunas de las palabras para dejar sitio a las nuevas. El borde semántico que delimita cada palabra se irá moldeando y encajando con los bordes de las otras palabras como si de un puzzle se tratara.

Hay veces en que se quedan partes del dominio sin cubrir por el modelo y por tanto el lenguaje tampoco reserva palabras para ellas. Cuando estás razonando sobre estas partes, la conversación no es natural. No puedes expresarte con las palabras que tienes definidas, pero tampoco sabes incluir nuevas palabras que expresen esto. Posteriormente el producto evoluciona incluyendo nuevas features y estas partes del dominio no cubiertas necesitan ser modeladas. El lenguaje incorpora palabras nuevas y ahora sí que se da una expresión natural. El lenguaje evoluciona según evoluciona el dominio y el producto.

Al evolucionar el lenguaje cambia tu entendimiento del dominio. Realmente el dominio no es algo que puedas percibir enteramente desde el comienzo. Se va descubriendo gracias al proceso lógico que se puede dar sobre el lenguaje que has definido.

Uso del lenguaje

Una vez que tenemos definido nuestro lenguaje común que nos permita una expresividad abundante debemos poner nuestro foco en que todo el equipo lo use.

Si mantienes una actitud de escucha activa durante las conversaciones te habrás dado cuenta que si no se usa bien el lenguaje no es posible confrontar puntos de vista o seguir profundizando en la resolución de un problema. No será posible razonar con profundidad en la conversación. Así pues, tanto quién habla como quién escucha deben poner el foco en usar apropiadamente el lenguaje. Cuando dos personas usan bien el lenguaje en sus discusiones se da un encuentro entre sus modelos mentales que se han formado a partir de las palabras que usan.

He comprobado que hay personas que aún estando establecido este lenguaje común en el equipo no lo usan de forma adecuada. Hay algunas personas que no usan las palabras del lenguaje correctamente. En una conversación usan una palabra pero están modificando la semántica de la palabra según lo que necesitan en ese momento para exponer su argumento. Esto les ocurre porque no tienen asimilados los bordes semánticos de definen cada palabra. Hay otras personas que directamente ni usan las palabras del lenguaje y siguen usando sus propias palabras. Hay otras personas que se quedan ancladas usando un lenguaje antiguo, utilizando palabras que ya no existen o cuyo significado ha variado. Son personas a quienes les cuesta adaptarse a la evolución que tiene nuestro lenguaje.

Debemos facilitar que estas personas usen bien nuestro lenguaje. Lo primero que hay que analizar es el motivo. Puede que el fallo esté en el uso que hacen del lenguaje. O puede que no tengan asimilado el modelo del dominio. O pueden ser ambas cosas. La peor situación es que no tengan asimilado el modelo. Si entienden bien el modelo entonces no habrá otra opción que hacer un esfuerzo en traducir sus conversaciones hasta que mejore su expresión. Constantemente habrá que referirse al modelo para ver a que conceptos están apuntando las palabras que usan. Si no entienden bien el modelo la situación se complica. En su mente el dominio se representa de otro modo y están cerrados a no admitir otro modelo diferente. Para estos casos no he encontrado aún una solución ...

De forma natural habrá personas en el equipo con el don natural de la comprensión y de la traducción. Instintivamente estas personas que no pueden comunicarse bien se apoyarán en ellas para comunicarse con el resto del equipo. Deberás tenerlo en cuenta cuando crees grupos de trabajo para siempre tener a un traductor en un grupo con personas con problemas en el uso del lenguaje.

Cuando se incorporen una nueva persona en el equipo todos los demás deberemos colaborar en que entienda y use nuestro lenguaje. Si la persona conoce nuestro dominio le costará menos usar el lenguaje e incluso podrá aportar conocimiento para evolucionarlo.

Cada grupo usará en mayor o menor medida las palabras del lenguaje. Los expertos en el dominio usaran en mayor medida palabras que representen conceptos genéricos del modelo y las reglas y restricciones del dominio. Usarán las palabras raíz de nuestro lenguaje. Los analistas, desarrolladores y testers usarán en mayor medida palabras que representen conceptos específicos, restricciones, excepciones y limitaciones del modelo. Estas palabras se derivaron en nuestro lenguaje de las palabras raíz, por lo que se dará el entendimiento entre estos grupos. Si se da el caso que un experto discute con un analista, hará una tarea de abstracción entre las palabras específicas que usa el analista hacia las palabras raíz que él mejor entiende. Y al revés, el analista hará una tarea de concreción desde las palabras raíz hacia las palabras específicas que él mejor comprende.

Cuando todo el equipo usa este lenguaje común logramos tener a un equipo cohesionado que razona sobre un mismo modelo. Se consigue una direccionalidad en las conversaciones. Esta direccionalidad nos da eficacia y profundidad de comprensión.

El cliente y los usuarios se dan cuenta que tu equipo sabe del negocio cuando mantiene conversaciones con él y entiende el lenguaje que usa, pues este lenguaje está describiendo su dominio. La imagen del equipo queda reforzada. El cliente no sólo puede hablar con los expertos en el negocio y los analistas sino también con el resto.

Usaremos este lenguaje común siempre. Lo usaremos en conversaciones habladas, en comunicaciones escritas, al escribir la documentación técnica del producto como análisis funcionales, diseños detallados, planes de pruebas, manuales del usuario, etc. Si hacemos esto siempre, tendremos como referencia el modelo del dominio y las interpretaciones erróneas se darán menos.

Si plasmamos gráficamente el lenguaje resultará más fácil su uso. Podemos usar un grafo para ello. Los nodos del grafo representan a los conceptos y las aristas a las relaciones. Los nombres de los nodos y de las aristas son las palabras del lenguaje. También podemos confeccionar un glosario de términos para explicar cada palabra, haciendo explícito su borde semántico.

Conclusiones

Definir un lenguaje común y expresivo para que todo lo equipo lo use mejora sustancialmente la comunicación. Cohesiona al equipo y permite discusiones entre las personas con una direccionalidad marcada.
A partir de este lenguaje las personas construyen un modelo mental común sobre el que razonar.
La expresividad que permite el lenguaje propicia el descubrimiento incremental del dominio.
Facilitaremos el uso del lenguaje a las personas del equipo con dificultades a la hora de expresarse.



Deja una respuesta

Subscríbete::About