Hi,
as mentioned earlier, here are some more thoughts on domain modeling. I’m curious to read about other experiences as well.
The most important takeaways for me working in different projects where I had to identify domain abstractions are (and I’ll explain each point below in more detail):
- Listen to the domain experts (obvious, but wait)
- Doubt/Challenge the domain experts
- Observe the domain experts
- Know as much about the “consumers” of the domain model as you know about the domain model itself
- Built prototypes / demos often and let domain experts try them out
Obviously, my findings are biased towards building languages with rich notations and for non-programmers, so nobody should follow them blindly. It’s also not a complete list, but I consider these to be most important for me.
Listen to the domain experts
Undoubtedly this sounds obvious. Talking to the domain experts is necessary to understand the problem domain, and I won’t suggest specific techniques how to do that, I don’t have a preferred way yet, it really depends on a lot of factors. I use “domain expert” incredibly broad here and don’t mean just the roles that you might built tools for. Usually everyone involved in the creation of a product or service might have information to share with you that helps you built the right tools.
The most important thing, as cheesy as it may sound, is to listen what they tell you, but also notice what they are not telling you. So it is important to ask a lot of questions regarding their business goals, the target group’s role inside the bigger picture, their inputs and outputs, etc. If they never mention problems with the tools they are currently using, ask them how they ended up using this specific toolchain and why they like it (or not?). If some use custom scripts and tools they built for themselves (sometimes in secret), investigate heavily how this decision came about. This sounds like a rare thing, but thus far, in all my projects, people have already been building their own tools in Excel, with Matlab, in Python, or what have you, to improve their workflows.
Doubt/Challenge the domain experts
People involved in a process long enough take it as the status quo. More often than not, established steps within a process, however, only exist due to makeshift solutions or the lack of the right solution and can therefore be eliminated completely if the new tools just skip or automate them.
This is certainly related to what I wrote earlier about investigating the domain experts, but I also mean to not always trust what you hear is required or true. I’m not saying people delibertaly lie to you (although House might disagree), but they often just are unable to see the forest for the trees (here’s hoping this idiom works in English as it does in German).
Observe the domain experts
More generally speaking, look into UX testing methods. This allows you learn even more about steps and things your target group might do without questioning it and therefore never telling you about it. Do it at the beginning to learn about the current tools and processes and do it with your own prototypes and the eventual product to incrementally improve it.
My wife’s a UX engineer, and I stole a lot of her approaches towards UX design for language design in the past.
This helped me tremendously developing ideas for the language notations and user interactions, instead of looking at documents like spreadsheets and Word files the target group might have produced before and just trying to copy the notations over. Trying to mimic old notations might be an okay approach for a first iteration, but personally, I think it is good to question them right from the beginning to avoid translating bad habits from before into the new tools you are trying to build.
Know about the “consumers” of the domain model
Whether or not your domain model produces configuration, code, readable documents, or anything in between: it is important to understand how it is consumed and why the expected format is as it is. Maybe the target is just an intermediate step anyway and can be skipped. Maybe different reader groups of some generated artifact are interested in different aspects and therefore one should generate different views upon the data? A lot can be gained if the consumers are investigated and understood as well as the domain itself, and it can influence the domain’s scope and shape.
Built prototypes / demos often and let domain experts try them out
Basically, this means to treat your languages and tools the same way as any other product where you benefit from an iterative approach with a lot of small increments.