We’ve been doing some work this week around trying to ensure that we have a ubiquitous language to describe aspects of the domain across the various different systems on my project.

It’s not easy as there are several different teams involved but one thing we realised while working on the language is that the language of the business is not the same as the language of the user.

Although this is the first time that I recall working on a project where the language of the user is different to the language of the domain I’m sure there must be other domains where this is the case as well.

In our case the language is simplified so that it makes sense to the user – the terms used by the business make sense in that context but would be completely alien if we used it on the interfaces from which our users interact with the system.

At the moment our domain model represents the business terminology and then when we show the data to the user we refer to it by a different name. The problem with this approach is that there is a mental translation step in trying to remember which business term maps to which user term.

We can probably solve this problem somewhat by having the user terms represented in our Presentation Model but this still doesn’t help remove the translation problem when it comes to discussions away from the code.

At the moment there aren’t that many terms which differ but I’m not sure what the approach should be if there become more in the future, should we have a whole user language as well as a business specific ubiquitous one or should our ubiquitous language be the user language?

A related idea is Fujimura’s “packages” (paper in _Science as Practice and Culture_) and Galison’s “trading zones” (in _Image and Logic_).

I like boundary objects and packages because they’re not purely linguistic – there are also things involved, so they are closer to software (which is a linguistic construct, in a way, but related to as a thing).

I’ve wanted to dig into these ideas more, but other things keep getting in the way.

The translation will always happen unless you have a single domain (thus a single Ubiquitous Language).

I think you probably have to face the fact that this is necessary and not try to escape from it. Create Bounded Contexts for you two Domains and define a Context Map. Wrap everything with integration tests and you’re good.