Monday, August 4, 2014

Help! I'm stuck with DDD Modeling! 8 Tips'n'Tricks to move on.

I was sitting in front of my laptop with a bunch of paper cards scattered all around me. My desk and my windowsill were covered with printed scenarios on the one side and with handwritten sketches of couple of Models on the opposite one. On the monitor, I was browsing photos of previous Modeling sessions and, from time to time, chatting with my friend - an UX Designer.

For last couple of days I was doing the Modeling of a very hard part of our Core Domain. I spoke to Domain Experts in different roles, and I was working closely with the UX Designer, who made a lot of research earlier. I run couple of Modeling sessions - both alone and in groups of 2-5 people. I just couldn't figure out a good enough solution.

I was stuck.

Do You know that feeling?


Have You been in that moment, when you realize, that sometimes Synthesis is not that easy part of the Design process? The moment, when you feel like You are trying to push on a rope? You've done everything correctly, and yet You still cannot find the solution...

I assume, that You are a good scout, and You did Your homework.
  • You have a Context Map somewhere,
  • You did some Event Storming (by Alberto Brandolini),
  • You are focused on some specific Subdomain and have abstracted unimportant things,
  • You have some significant Scenarios in it,
  • You have some Models that fullfill some of those Scenarios,
  • You are actively using Modeling Whirlpool

Everything looks good, but it seems like You can always come with another significant Scenario that will break some already created Models... You are clearly missing some concept and you need to do something different to stop spinning your wheels. 

You need some...

Modeling Tips'n'Tricks


Enter the 8 Tips'n'Tricks that can help You to move on with Modeling activity. I already knew the first 7 and the last one was proposed to me by Mathias Verraes in the Twitter thread. Here You have it, you can take them and use in Your projects.


If You know any other trick, feel free to post it in the comments.


1. "Gibberish Game"

Sometimes you cannot agree on some concept with Your friend or You have a feeling that there is too much responsibility attached to one word. Or maybe the responsibility is distributed into couple of unrelated words. Or maybe the word that you are using to describe some concept has rotten and you need something more.

Just try to use completly unrelated word - some giber like "blah" - and use it in sentences to describe some related parts of the Domain. After couple of minutes you will see what true responsibilities are attached to that concept and naming them would be easier.

2. Paper documents

Ask Your Domain Expert, how would she do all the job, if there were no computer systems involved in the process. What kind of paper documents would she have, who would create them and who would process them. It helps to discover the Data Flow and connections between different actors of the Scenario.

3. Sketch some UI mocks

You should ask for help Your UX Designer with this one - You know, that we, developers, are pretty bad at UIs... ;) Draw some simple UIs, and ask Your Domain Expert what data would she need on that screen, why would she need that screen and what kind of decisions to make based on that data. And the key question - where that data would come from.

Note: This one can be tricky, because it may lead You to Modeling application Features instead of true Invariants of the Domain.

4. Model the unknowing explicitly and proceed - aka "Here be dragons"

Sometimes You don't need to spend that much time in one place. There may be other parts of the Domain that require Your attention. If You feel like You stuck and this is not that important, try to surround that part with a fence, build some interfaces and put a picture of a dragon there. Then flee... ;)

5. Enter the Domain Expert role

Try to explain the problem to a third-party, non-technical and non-related to the business person. Then let her ask some questions. Magic can happen!

6. Play with your subconscious mind

Do You know how Your brain works? Do You know why you have some great ideas and solutions under the shower? I won't go into details, You can find a lot of it on the internets, but sometimes it is good to let the biology do the job. Just keep asking Yourself the questions about Your problem and do not provide any solutions to those questions. At some unexpected time You may be enlightened - i.e. in the traffic jam. Keep a writing pad in Your pocket.

7. Drink some beer

This one is my favourite. But of course - not in your work time, not at your office, and definitely not in the traffic jam. :)

8. Remove all constraints

The last but not least - introduced to me by Mathias Verraes:
"Remove all constraints, model the simplest thing that has value, then add constraints back one by one."


Your Tips'n'Tricks


If You have any other Tips'n'Tricks, please post them in comments, so that more of us can use them and move on with their, lets call it "Synthesis Paralysis".

4 comments:

  1. Great list :-)

    To add a little context: it helps if you list the constraints explicitly on a whiteboard, collaborating with stakeholders. Constraints can be business rules, but also anything else (limited budget, performance, team members who don't know the technology or the architecture, the number of network calls, concurrency, cognitive overload for the end-user, maintenance costs...) There may be a lot of these hidden or implied constraints that block you from being truly creative. We all have internal filters that shoot down ideas before we even speak them out loud.

    Then ask questions such as: How would we model this if there was no database, and there was only one user, and we had unlimited time to build it, and the business didn't care about this specific rule? Your brain will be free to come up with great ideas. Then adding back a single constraint at a time, allows you solve each constraint as a single small problem, instead of a nested big one.

    You'll also discover that some of the constraints are in fact not important, or can easily be discarded.

    ReplyDelete
    Replies
    1. Thanks for the context and other valuable questions. :)

      Delete
  2. "I was sitting in front of my laptop with a bunch of paper cards scattered all around me" therefore...

    #9 Move your body
    Cognitive processes flow differently depends on body is engaged or not.
    So, stand up, step ahead, gesticulate, speak aloud.

    Tip #1 works better when you engage body as well. So put a domain object on the floor, stand on it and grab one book for each responsibility...Are you heavy- or lightweight?
    And then name your self in the Indian style - you know long, long descriptive name.

    Then donate sb, with one of your books and name yourself again. Repeat until you reach English-style name; short one :)

    ReplyDelete
    Replies
    1. Thanks for another good trick! :)
      Moving is a great idea - go for a walk and so on.

      Unfortunatelly in my case it didn't help, since I was stuck for couple of days... So I had to move - I don't like spending nights in the office. ;)
      Nevertheless this is valuable insight!

      Delete