<?xml version="1.0" encoding="UTF-8" ?><!-- generator=Zoho Sites --><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><atom:link href="https://www.reflektis.nl/blogs/Requirements-engineering/feed" rel="self" type="application/rss+xml"/><title>reflektis - Blog , Requirements engineering</title><description>reflektis - Blog , Requirements engineering</description><link>https://www.reflektis.nl/blogs/Requirements-engineering</link><lastBuildDate>Mon, 07 Sep 2026 14:32:16 +0200</lastBuildDate><generator>http://zoho.com/sites/</generator><item><title><![CDATA[CRC sessies]]></title><link>https://www.reflektis.nl/blogs/post/crc-sessies</link><description><![CDATA[CRC sessies zijn een perfecte tool voor het maken van bedrijfsmodellen maar zijn tot mijn verbazing nog steeds relatief onbekend. Daarom een korte intr ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_OKAnNbP7QRe2eUwFFTba5w" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_uAOkG52mS4audJ3F-EyYJA" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_2doC_ws9T2imch9FQlHgeA" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_cvZoJobOQ0WGhIzcsUE-HA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center " data-editor="true"><div><p>CRC sessies zijn een perfecte tool voor het maken van bedrijfsmodellen maar zijn tot mijn verbazing nog steeds relatief onbekend.</p><p>Daarom een korte introductie: waarom zijn CRC sessies zinvol? hoe doe je dat dan? wat leveren ze op?</p><h2>Waarom zijn CRC sessies zinvol?</h2><p class="has-drop-cap">Om een goed model te krijgen van het business domein is het nodig dit model tot stand te laten komen met zoveel mogelijk input, maar belangrijker nog: met zoveel mogelijk betrokkenheid van de business deskundigen. Niet alleen omdat op die manier de betrokkenheid (buy-in) van de business groter is (zeker niet onbelangrijk en vaak onvoldoende of zelfs helemaal niet meegenomen) maar ook om de kwaliteit van de modellen zo goed mogelijk te krijgen.</p><p>Software engineers hebben vaak geen hoge pet op van de vaardigheid van business domein kenners om dat domein uit te leggen. Ze denken al snel dat een interview en een rapportje voldoende zijn om hun bovenmenselijke vermogen tot begrip te voeden en daar een compleet domein model uit te destilleren. Per slot van rekening is het begrijpen en in kaart brengen van veel verschillende domeinen hun vak!</p><p>Aan die houding klopt heel veel niet. Ook iets wél trouwens! In de software engineering is de noodzaak om zaken expliciet te krijgen natuurlijk altijd nijpend geweest. Daarom is het eigenlijk vooral in de software-engineering dat modelleertechnieken zijn ontwikkeld. Maar daarmee moeten we nog niet de vergissing maken dat we beter in staat zijn de business te begrijpen dan de business zélf. Zoals we zouden moeten weten is het voor experts helemaal niet makkelijk om hun kennis expliciet te verwoorden (expert kennis is &quot;tacit knowledge&quot;). Maar maak niet de fout te concluderen dat ze er dus eigenlijk weinig van begrijpen!</p><p>Zie hiervoor ook mijn artikel over intelligentie:&nbsp;<a href="https://blog.reflektis.nl/business-intelligence-een-andere-definitie/">Business Intelligence: een andere definitie</a>.</p><p>Ons probleem (mij even verplaatsend in de software engineer) is dat wij onvoldoende in staat zijn geweest, al decennia lang, de manier waarop een business persoon de wereld bekijkt, te faciliteren. Wij (architecten) leven in een wereld waarin alles expliciet is, tot op de punten en komma's, maar dat is voor &quot;gewone&quot; mensen heel anders. Wij hebben als het ware een disfunctioneel wereldbeeld gekregen, en het ergste is dat we er ons niet eens van bewust zijn! Het zijn &quot;zij&quot; die niet weten wat ze willen, die niet snappen wat echt belangrijk is, die voortdurend zwalken. &quot;Zij&quot; zijn lastig!</p><p>Er is grote behoefte aan technieken die zowel &quot;ons&quot; als &quot;hun&quot; helpen met elkaar te praten. Elkaars taal spreken. Een hulpmiddel voor <em>verbinding</em>.</p><p>En dat is nu precies waar we CRC sessies voor kunnen gebruiken. De speelse werkvorm helpt om het ijs te breken, en is zo ingericht dat geen van de partijen in een oneerlijk voordelige (of nadelige) positie zit. De vorm daagt op een neutrale manier experts uit hun kennis vorm te geven, door die kennis tot leven te laten komen. En de vorm waarin die kennis tot leven komt is een <em>verhaal</em>.</p><h2>Hoe doe je CRC sessies?</h2><p>Het is belangrijk dat we ons realiseren dat CRC sessies in principe door en met business domein experts gedaan worden. De resultaten worden opgepakt door software engineers of business analisten, maar het is niet nodig dat deze bij de sessies zélf aanwezig zijn. Het kán echter wel, en het kan ook wel degelijk zinvol zijn om dat wel te doen om het wederzijdse begrip te voeden. Maar de sessie zou ook gedaan kunnen worden door een ervaren CRC sessie-facilitator (ervaring is echter wel van groot belang, juist omdat deze techniek nog relatief onbekend is en zeker in het begin een aantal valkuilen vermeden dienen te worden) en verder alleen maar mensen uit de business.</p><p>Er is een maximale groepsgrootte. In de praktijk varieert dit maar ik hou een maximale grootte van 8 man aan. Iedereen krijgt een stapeltje papier of karton dat er als volgt uit ziet:</p><div class="wp-block-image"><figure class="aligncenter size-full"><img src="https://blog.reflektis.nl/wp-content/uploads/CRC1-1024x639-1.png" alt="" class="wp-image-11944"/><figcaption>Voorbeeld CRC kaart</figcaption></figure></div>
<p>Aan de linkerzijde is een lijst van <em>Responsibilities</em> (de &quot;R&quot; in CRC).</p><p>Aan de rechterzijde is een lijst van <em>Collaborators</em> (de laatste &quot;C&quot; van CRC).</p><p>Bovenin komt de naam van het concept/object te staan, zijn <em>Class</em> (de eerste &quot;C&quot; van CRC).</p><p>Vaak maak ik ook nog gebruik van een balletje (jongleerballen zijn heel geschikt!), of van een &quot;talking stick&quot;; eigenlijk een hulpmiddel om structuur aan te brengen: alleen de persoon met een balletje of the &quot;talking stick&quot; mag praten. Maar ik geef aan het begin van de sessie het balletje ook een lading: het is belangrijk om dat balletje zo snel mogelijk weer kwijt te raken! Het is als het ware een hete aardappel waar je je aan brandt als je het te lang in je mond (handen) houdt.</p><p>Het uitvoeren gaat door een stukje bedrijfsproces of gebeurtenissen in de werkelijke wereld op te pakken en dit na te spelen. Iedereen zit met zijn stapeltje (nog blanco) kaarten, en het spelen van het stukje bedrijfsproces is nu als het ware de hete aardappel: wie denkt een object te kunnen bedenken dat hier iets in kan betekenen?</p><p>In het begin is het een beetje aftasten, maar dat is niet erg: de structuur van de oplossing komt gaandeweg tot stand. Daarvoor is de ervaring van de facilitator nodig: die weet dat een exploratieve wijze van stukjes bedrijfsproces uitspelen het beste resultaat oplevert.</p><h2>Wat leveren CRC sessies op?</h2><p>Het resultaat van één of meerdere CRC sessies is een bedrijfsmodel, ook wel domeinmodel genoemd. Maar dan wel eentje waar meer in zit dan alleen maar de structuur van het business domein. Doordat we namelijk de verantwoordelijkheden van de deelnemende objecten expliciet hebben benoemd hebben we ook de dynamiek, het gedrag, van het systeem beschreven. En wel zodanig dat we al een heel eind zijn gekomen in de richting van een implementatiemodel, geschikt om uit te werken in een programmeertaal als Java of C#.</p><p>De kaarten kunnen rechtstreeks vertaald worden naar zogenaamde &quot;class stubs&quot; van zogenaamde POJO's (Java) of POCO's (C#). Dat zijn de classes, en members van die classes. De lijst van verantwoordelijkheden komt terug in de interface van de class als <em>methodes</em>. De lijst met collaborators komt terug als <em>associations</em>, waarschijnlijk member variabelen die als &quot;slots&quot; dienen om de association in te implementeren.</p><p>De uitgespeelde CRC sessies kunnen nog eens opnieuw gespeeld worden ter validatie. Een nuttige aanpak is de sessies in unit tests op te schrijven (met de verwachte uitkomsten).</p><p>Er is een gedeeltelijke overlap met de technieken zoals ik die beschreven heb over <a href="https://blog.reflektis.nl/exploratory-modelling-introduction/">exploratory modelling</a>.</p><hr class="wp-block-separator dotted"/><h2>Boeken</h2><ul><li><a href="http://amzn.to/1UtGvLj" target="_blank">Using CRC Cards: An Informal Approach to Object-Oriented Development (SIGS: Advances in Object Technology)</a></li><li><a href="http://amzn.to/1UtGEOD" target="_blank">The CRC Card Book</a></li><li><a href="http://amzn.to/1UtGMhl" target="_blank">CRC Card Book Value Pack</a></li></ul></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Tue, 17 Jul 2012 08:32:13 +0200</pubDate></item><item><title><![CDATA[eXploratory Modelling Explained]]></title><link>https://www.reflektis.nl/blogs/post/exploratory-modelling-explained</link><description><![CDATA[Abstract This article describes an approach to modelling that is relatively unknown &nbsp;. It capitalises on capabilities of modern programming tools a ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_7CBqqxf7S76wm9SNKhcEMw" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_9twSMIQRQWavk503lMI8Kg" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_xvG8ntHYTBqIU29Rs-5cIA" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_1aypGYEZQ_G3rH4cGb5LgQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center " data-editor="true"><div><h2>Abstract</h2><p>This article describes an approach to modelling that is relatively unknown<sup><a href="#_edn1"></a></sup>&nbsp;. It capitalises on capabilities of modern programming tools and languages, especially dynamic qualities, as well as advances in object-oriented modelling.</p><p>It empowers the development of DSL's, using what might be called a meta-DSL approach.</p><p>For the examples in this chapter (as in most of our projects) we have used a Smalltalk development environment, VisualWorks<sup><a href="#_edn2"></a></sup>&nbsp; in particular, but the approach is in no way exclusive to the Smalltalk language or environment. The author has&nbsp;also applied the approach in a Microsoft VisualStudio environment with C# and Java/Eclipse/IntelliJ with comparable success. The approach is called <em>eXploratory Modelling</em>. Its aim is to significantly improve the modelling and requirements effort.</p><p>We will start by describing the overall xM process and an example xM session. This will hopefully convey the “feel” of xM. After this we will introduce several relevant theoretical issues intended as a first attempt at laying a foundation for xM practices.</p><p>A more compact introduction can be found in this article: <a href="https://blog.reflektis.nl/exploratory-modelling-introduction/">eXploratory Modelling Introduction</a>.</p><p>Reflektis provides training to effectively use this revolutionary technique: <a href="https://www.reflektis.training/course/exploratory-modelling">eXploratory Modelling (Training)</a></p><h2>The xM process</h2><p>The actual xM process consists of two parts, possibly iterative:</p><ol><li>Elicitation sessions with clients, domain experts or business experts</li><li>Transformation of the resulting domain into an implementation</li></ol><p>During the sessions, of which you will get a feel in the next subchapter containing a walkthrough of a typical xM session, domain experts actually build a running domain component. This is an executable component, executing the defined business processes, and validated as-they-build-it by the domain experts.</p><p>After this phase, or iteratively if needed, the executable domain can be transformed to run on the platform of choice, i.e. Java EE or .NET or any other platform. The implemented domain can remain in Smalltalk which will require minimal if any transformation (this is my preferred strategy), or in C# or Java or another programming language. We have experience with the following strategy that worked surprisingly well.</p><ol><li>Export the implemented classes to XMI. We have written a simple but usable component to do this in Smalltalk, which is available for VisualWorks in the VisualWorks public repository<a name="_ednref3"></a><sup><a href="#_edn3"></a></sup>&nbsp;under the name xM-XMI Mapping.</li><li>Import the resulting XMI into any UML tool (such as <a href="http://www.sparxsystems.com">Sparx Enterprise Architect</a> or Rational XDE)</li><li>Export and/or transform the resulting model into a target platform such as .NET using the UML tool</li></ol><p>The result is an implemented domain as an executable class library, not just a class stub framework as in some other modelling approaches. More on this process later.</p><h2>An xM walkthrough</h2><p>This subchapter will describe a typical xM session facilitated by an expert modeller who should be fluent enough in the IDE to implement the model on the fly as prompted by the workshop participants who are the domain experts. However the actual programming skills in the programming language used need not be sky-high – basic skills are usually more than sufficient.</p><p>This subchapter is written in the first person (“I did this, then that”), from the viewpoint of the facilitator.</p><p>The goal of this subchapter is to convey the “feel” of an xM session, and to communicate the prime patterns to apply. In the rest of this article some of these patterns will be elaborated upon further. Finally we will attempt to lay a more theoretical foundation.</p><p>We will take a simple example that may seem familiar to those who read the book on Domain Driven Design by Eric Evans<sup><a href="#_edn4"></a></sup> a Cargo application (for a sample Java implementation you might check <a href="https://github.com/citerus/dddsample-core">Github</a>). During the creation of this object model the readers will hopefully appreciate the subtle differences of this model with the one from Eric Evans’ book.</p><p>We will use VisualWorks Smalltalk from Cincom<sup><a href="#_edn2"></a></sup>, but in the various Smalltalk dialects the process would be very similar.</p><p>Please visualise the following setting. I, the facilitator, behind my laptop running the development environment and projecting this on a large screen that is visible to the audience. The audience may consist of one or more domain experts. The extent of the group is determined of course by the scope of the session. Try to keep the group small to enable maximum interaction. Also don’t be afraid to do several sessions with different domain experts on the same or overlapping domain areas. This will only make the domain richer. I am never afraid of conflicting domain definitions — this is a fact that we need to support instead of discourage as we usually do when we do requirements engineering. Try to centre any discussions around the domain objects on the screen, the components from the business domain, and avoid direct discussions between team members. The domain objects should be anchors of the discussions. Sessions should be short, typically a maximum of three hours, with at least two breaks between. These sessions are intensive, or should be, and longer sessions are hard to keep up.</p><p>To start the discussion I ask the workshop participants to decide about an object that reaches a certain goal, an end goal or state of the business domain. I talk about demand-chain processes, about flexibility, and about inverting time (see the subchapter on Reverse Time Pattern for more on this introductory story, as well as <a href="https://www.reflektis.com/blog/time-inversion-pattern/">the article on this pattern</a>). The question, when this story has been told, is:</p><p>“What object can we find that, when reaching a certain state, accomplishes a relevant business goal?”</p><p>The group decides on <span style="font-family:&quot;courier new&quot;, courier;">Cargo</span>, which is delivered to a customer site. So I start with creating an instance of <span style="font-family:&quot;courier new&quot;, courier;">Cargo</span>. For this I will need to create this class in the browser. I usually talk my way over this, since most of the artefacts in the domain, objects, methods and variables, will be created dynamically as you will see shortly, except classes. This is a feature of the IDE that could easily be added.</p><p>In the illustration below you can see I created a package called <span style="font-family:&quot;courier new&quot;, courier;">xM-Walkthrough</span>, with a Namespace<sup><a href="#_edn5" name="_ednref5"></a><a href="#_edn5"></a></sup>called <span style="font-family:&quot;courier new&quot;, courier;">XMExamples</span>. With this namespace selected I ask a menu and select New Class…:</p><figure class="wp-block-image size-full"><img src="https://blog.reflektis.nl/wp-content/uploads/image001.png" alt="" class="wp-image-12001"/></figure><p>This will open the standard Class creation window. I fill in the class name we want: <span style="font-family:&quot;courier new&quot;, courier;">Cargo</span>. I ignore the default options:</p><figure class="wp-block-image size-full"><img src="https://blog.reflektis.nl/wp-content/uploads/image003.png" alt="" class="wp-image-12005"/></figure><p>The previous steps are done quickly and covered-up by explaining I do some technical groundwork which is not relevant.</p><p>Now I am finally able to create our start object:</p><figure class="wp-block-image size-full"><img src="https://blog.reflektis.nl/wp-content/uploads/image005.png" alt="" class="wp-image-12485"/></figure><p>This will open a window you as an xM modeller, and the workshop participants will become very familiar with. Things will start coming alive now!</p><p>An inspector:</p><figure class="wp-block-image size-full"><img src="https://blog.reflektis.nl/wp-content/uploads/image007.png" alt="" class="wp-image-12487"/></figure><p>The <strong>inspectors</strong> are the business domain objects we will play with continuously during the xM sessions. There may be dozens of them on the screen at any moment during the sessions, and may contain links to hundreds or even thousands of other objects that are not explicitly represented on the screen in inspectors. These objects may persist during many sessions, we may even have some in the last sessions that were created in the first! This is the power of this approach, that we do not start from scratch every time, but start in a living world in which objects begin as trivially simple things but become more and more able. Nothing goes down, everything evolves, morphs, into the functionality we are aiming for.</p><p>The other window most of our time will be spent in will be the <strong>debugger</strong>. For business domain experts the debugger is usually introduced as the “object message-passing hiker”. It is a small backpack on the objects we create to trace their journey through life. They should not feel they are doing software development or programming; in fact I even don’t want to feel that way myself when I am working on the business domain!</p><p>The message passing metaphor is our “hook” into the domain behaviour, and the foundation on which new objects (with their responsibilities) are created.</p><p>The inspector “is” our object. I point to it (hand-waving is important!), and ask the session participants to see this window as our business object itself, by using a bit of imagination. Human beings have imagination to spare, so this is never a real problem in our sessions. And probably this simple cargo object we have created in the first few minutes of our domain modelling sessions will live for a long time, maybe during the entire modelling effort! It will remain, growing, evolving, morphing, being put to sleep and woken up again over the course of many sessions.</p><p>Now the time has come to do a bit of conceptual thinking. The object is there, but it cannot do anything yet, and we need to think back to why we were doing these modelling sessions again. Oh yeah, we were building the domain model for a cargo application. So if that were the case – what would be the purpose of this application? Or better: try not to think about applications at all. Think about the problem or business domain: what is the purpose of the cargo company? It will probably not take long to come to the insight that the purpose in life of the cargo company is to pick up cargo at one location, and move it without attrition to another location. Secondary purposes exist, such as doing this efficiently, at least as efficient or cost-effective as existing or potential business competitors.</p><p>When this insight has been declared viable, I take a little time to explain to the domain modellers that we need to adopt a specific way of thinking about problem domain issues. This is an explication of the <a href="https://blog.reflektis.nl/active-passive-pattern/">Active-Passive Pattern</a> in combination with the <a href="https://blog.reflektis.nl/time-inversion-pattern/">Time Inversion Pattern</a>. This story however is not one I tell in the context of software development or modelling. You should avoid doing that also. Concentrate on explaining the concept to them from a business management perspective, or from the perspective of supply chain management processes. Explain that companies have adopted this pattern on a global scale in the past decade, companies like Toyota and Nike. Explain that business process theories like <a title="What is Lean" href="http://www.lean.org/WhatsLean/">Lean</a>, <a title="What Is Six Sigma? - iSixSigma" href="http://www.isixsigma.com/new-to-six-sigma/getting-started/what-six-sigma/">Six Sigma</a> and <a title="What is Supply Chain Management" href="http://supplychainmanagement.in/scm/index.htm">supply chain management</a> contain this pattern as a powerful tool to help enterprises create efficient and flexible business processes.</p><p>In the Active-Passive Pattern, objects do things <em>themselves</em>, and generally avoid things <span style="font-style:italic;">being done</span> to them. In the “real” world this is the other way round, and that is exactly what we want to achieve here: turn things upside down, in order to create extendible, complex models. I call this process <em>mirroring</em>. The Active-Passive Pattern is nothing more than a simple trick to enable complex and scalable models.</p><p>Viewing the domain object we created with this newly gained perspective, what would be the last thing this object would need to do to fulfil the business goal? After some discussion the group might come to appreciate that the goal could be to deliver the cargo.</p><p>We write:</p><pre class="wp-block-code"><code>self deliver</code></pre><p>in our workspace and evaluate this expression with Do it. Notice what we are doing? We are proceeding &quot;as if&quot; our application was already finished, as if all objects already know what to do!</p><figure class="wp-block-image size-full"><img src="https://blog.reflektis.nl/wp-content/uploads/image009.png" alt="" class="wp-image-12488"/></figure><p>Of course an exception pops up:</p><figure class="wp-block-image size-full"><img src="https://blog.reflektis.nl/wp-content/uploads/image011.png" alt="" class="wp-image-12489"/></figure><p>The <span style="font-family:&quot;courier new&quot;, courier;">Cargo</span> object exists (we are evaluating the expression&nbsp;<span style="font-family:Courier New, Courier, monospace;">self deliver</span> in this object, in the inspector). However we are asking it to do something that it does not yet know how to do.</p><p>No worries. Click the <strong>Define it…</strong> button, and up pops the debugger, our second friendly neighbourhood tool:</p><figure class="wp-block-image size-full"><img src="https://blog.reflektis.nl/wp-content/uploads/image013.png" alt="" class="wp-image-12491"/></figure><p>The environment has done a few nifty things for us. It has dynamically created a method deliver in the class <span style="font-family:Courier New, Courier, monospace;">Cargo</span>, restarted the execution of the code that we started in the workspace, and interrupted the execution thread in this new method. We can see that the method body has been filled in for us with a neat&nbsp;self halt, which has opened this debugger.</p><p>I usually make a little joke here that modelling this way is really efficient: we have already built our system! We have cargo, which can deliver itself.</p><p>Reality is a bit more demanding, but this way in which the model should unfold is important to explain. We are in the execution chain of business or domain objects, and we have indeed arrived at the last step in a relevant business process – there should be a clear and shared understanding of this principle.</p><p>Now the next step should be to think about the last preceding action. That is: what needed to be done, or what state should we have created, in order for the delivered state to be really done? Look at this as a sequence of steps, in effect a business process, which we are building up in reverse time. This is an application of the <a href="https://blog.reflektis.nl/time-inversion-pattern/">Reverse Time Pattern</a>. We are in the last message sent in a relevant business process. Now we need to think about the last message before that.</p><p>What could it be? Imagine yourself to be the cargo. I repeatedly urge the workshop participants to identify themselves with the active model objects they are working with, to anthropomorphise. You are there; you have fulfilled your purpose in life. But what was the last thing that needed to be done before achieving that state of bliss?</p><p>Usually several alternatives are put forward. One could be: “go to the destination”. Or “put yourself on a ferry to the destination”.</p><p>The second option is interesting because it introduces a second object we have not yet created, but one clearly of a different type or class: a mover of things (could be a ferry, a ship, a train, etc.). Help the group appreciate the potential thinking error, in thinking about the “mover” object being active, and the cargo object being passive. In this case we might decide that cargo will have sufficient active properties in making its way to its destination, so we will delegate the final delivery responsibility to the mover:</p><figure class="wp-block-image size-full"><img src="https://blog.reflektis.nl/wp-content/uploads/image015.png" alt="" class="wp-image-12492"/></figure><p>For now&nbsp;we will leave the rest of the session to the imagination of the reader (or their inspiration!). We hope it is clear that by traversing the backward path, the demand-chain path, we slowly implement a complete process. And that by doing it in this fashion, this process might very well be an unexpectedly efficient and flexible process as well! We often come up with interesting alternatives of processes that were executed since the Stone Age without any change.</p><p>Many side paths may be explored, many of which may turn out to be wrong or inappropriate. This way of exploring the domain should be executed without fear: we will make mistakes, decide to throw away entire parts and build them again. The environment will help us in doing this without hampering our progress. Usually in the beginning the participants need a lot of encouragement to build up their courage to explore, try out, change, and re-think their decisions, but as they learn that the environment is actually helping them in doing this they gain courage and start becoming more and more creative.</p><p>This is always a very satisfying phase in the workshops.</p><p>An important issue concerning modelling has been tackled here as well. We mention it explicitly because it is a recurring issue. We were able to answer the question: Where to begin?</p><p>In subsequent sessions the model unfolds. Be not afraid to attempt alternative paths to the same or equivalent goals. The purpose of these sessions is not to mould a business process in concrete. The resulting object model should be seen as an enabling web of objects, a semantic web, which is able to reach the same goal even in ways not explicitly modelled or considered while modelling.</p><p>The sessions should also be productive. We do not need nor want a long stretching period of modelling sessions. The percentage spent in these sessions should be small. We need a lot of time for implementing the technical connections, typically more than 4/5 of the total implementation effort.</p><h2>Agility</h2><p>xM is very well suited for software teams that want to apply agile processes. The acronym xM is not accidentally similar to xP (<a title="Extreme Programming: A Gentle Introduction." href="http://www.extremeprogramming.org/">Extreme Programming</a>). The x in xM could be interpreted as extreme! Extreme Programming originated from software development best practices that were common in the Smalltalk community and was codified by Kent Beck in his seminal book<sup><a href="#_edn6"></a></sup>. Many Smalltalk developers employ some sort of domain prototyping similar to xM, and like extreme programming, until Kent Beck published his book, this practice has never been codified or published. Graphical Smalltalk environments like VisualWorks, Squeak, Dolphin or VAST are best suited for xM sessions because the runtime objects and the development environment are so tightly integrated that in fact they cannot be viewed as separate. While in most development environments the deployed and implemented executable is different from the programmed stuff, this is not so in Smalltalk. Created objects, as you have seen in the walkthrough, can be modified while remaining in existence. Recompiling in Smalltalk environments is a different thing! This property of most Smalltalk environments can be utilised to the max for xM.</p><p>In Smalltalk, application development should be viewed a bit differently: an application in Smalltalk is developed&nbsp;<em>within</em> the IDE; in fact the IDE is <span style="font-style:italic;">itself</span> a Smalltalk application. All objects in the Smalltalk environment live inside an entity called an “image”. Living dormant on disk as a file, this image is quickened, re-awakened, by the Smalltalk virtual machine. On closing a development session (or, indeed, an application execution) this set of objects is persisted on disk again. In Smalltalk, new objects and new classes are created by respectfully asking already existing Smalltalk objects to do so: morphing existing things creates new things. There is no real experience of compiling and deploying. Creating an application in Smalltalk is more about stripping out unnecessary objects to create the runtime.</p><p>The xM approach fits in with the minimalistic approach that prompted some proponents of agile methods to eschew modelling and UML. We think that xM brings you the best of two world: the advantages of having a model that can be viewed and played with, plus an executable class library that can be fitted with a complete set of unit tests<sup><a href="#_edn7" name="_ednref7"></a><a href="#_edn7"></a></sup>, albeit one that needs some transformation effort. We will talk about that shortly.</p><p>xM also delivers what MDA attempts to deliver, at least partly. The result is a repository of objects that can be viewed as a UML model, but that also lives as an executable, verifiably running set of objects. You can play with these objects. Both representations have great merit.</p><h2>Modelling dilemmas</h2><p>Modelling has always been an important part of software engineering, or engineering in general. We use models to capture the problem domain in a way that is most cost effective: the model should require much less effort, yet be “complete” enough to help in achieving a full implementation.</p><p>A model is a replica of what we actually want to describe. It is a representation of the “thing“ we want to describe; in engineering this “thing“ usually is a system we want to build. A common definition of a model contains the element of simplification: the model is a replica of the “thing“ with all “superfluous” elements removed. Of course this introduces an interesting and not so easily resolved dilemma: did we not remove elements that will turn out to be important? Who decides what is superfluous and what is not?</p><p>In this sense, models also play an important role in capturing requirements.</p><p>To build models, we use a language or several languages, depending on the context or the aspect we want to model. In software engineering a unifying effort has been successful and has resulted in the Unified Modelling Language or UML<sup><a href="#_edn8"></a></sup>. The UML has gone through several versions, but can be challenging to use. It is often perceived as too complex, difficult to learn, and hard to translate into a concrete implementation. As a rule however, the UML captures the domain in a generic sense: in the form of a class model. Most UML models contain little or no instance models, and if they do, they are usually additional and in no way complete, nor are they intended to be complete. In this way UML models are more abstract than, say, home models or car wind tunnel models. In no way this should be regarded as a fundamental shortcoming, we are just stating characteristics.</p><p>A popular trend has become known as Domain Specific Languages (DSL's), as an attempt to overcome the overly generic UML and create languages or vocabularies more tunes to specific business domains. These models may be somewhat easier to use, but we think they have a lot of shortcomings, especially regarding their domain-specificness: domains are seldom isolated and interact constantly, sometimes intrusively. How will your DSL deal with that?</p><p>We sometimes coin the Smalltalk environment the DSL of DSL's. An article that talks about this is <a href="http://cacm.acm.org/magazines/2011/7/109910-dsl-for-the-uninitiated/fulltext">DSL for the Uninitiated - Domain-specific languages bridge the semantic gap in programming</a> (appeared in Communication of the ACM, 2011, No. 7). The author used Ruby, but we think Smalltalk (which was an important inspiration for Ruby) is even better suited.</p><p>The common definition of models is not one we adhere to in xM. We view models as&nbsp;<em>reflections</em> of the thing we want to model. The model <em>mirrors</em> the real thing. The concept of mirroring creates a powerful metaphor that helps our minds in applying models effectively, and not falling in the trap of viewing the models as somehow goals in themselves, or as more real than the thing it models.</p><h2>Architectural Connotations</h2><p>All accumulated knowledge concerning modelling complex domains, and the various patterns that can help in making decisions, are equally appropriate for xM. However three patterns or styles are especially important in xM, and are in the modelling literature in general undervalued in a way that merits special attention here. They are:</p><ol><li>Domain Model pattern<sup><a href="#_edn9"></a></sup></li><li><a href="https://blog.reflektis.nl/active-passive-pattern/">Active-Passive pattern</a></li><li><a href="https://blog.reflektis.nl/time-inversion-pattern/">Time Inversion&nbsp;pattern</a></li></ol><p>Of these pattern the first is best documented but the other two are strangely absent from most pattern literature, or if they are, they are interwoven in other patterns. For example the Time Inversion&nbsp;Pattern is not explicitly documented anywhere, but it certainly has become an important part of modern supply chain management business process descriptions. It just has not elsewhere been published as a pattern yet.</p><h3>Domain Model Pattern</h3><p>For a proper understanding of xM in the context of a complete effort that delivers a solution to a customer, the reader needs to have a clear understanding of what a domain is, and how the part of this solution that is called the domain is isolated from other parts. xM delivers an implemented, complete, fit-for-purpose domain. It does not deliver a complete solution, which will consist of several additional components, such as user interfaces, persistency solutions, or others, which we call technical components. To visualise the role of what we call a domain, in relation to these technical components, we draw the following diagram:</p><p>This diagram is also called the&nbsp;<em>Sunflower model</em> or the&nbsp;<a href="https://blog.reflektis.nl/the-satellite-model/"><em>Satellite model</em></a>. It is topologically not very different from <a href="http://msdn.microsoft.com/en-us/library/ff650258.aspx">Layered Architecture</a>, but cognitively it conveys the important message: the business should be central in our solutions.</p><p>The diagram contains a central component: the Domain. This is the business domain containing the required business functionality. There are several attributes we want this domain component to conform to, because we can derive most value from xM if we follow these guidelines:</p><ol><li>The domain component contains <em>only</em> domain functionality. It should have minimal if any technical content: no databases, GUI, or computers.</li><li>The domain has no dependencies on any technical components such as the ones mentioned above.</li></ol><p>However, a business domain implemented as such will have little value. For example it has no user interface to communicate with it. Therefore connections must exist with what we call the <strong>technical components</strong>. It is not within the scope of this article to describe ways to implement this coupling, we will only mention that we use adapter technology to connect the business component(s) with the technical components in such a way that is has no or minimal impact on the requirement that the business component has no awareness of technology. Several articles on this site elaborate on this, for example <a href="https://blog.reflektis.nl/business-centred-architecturen-i/">Business Centred Architectures</a>&nbsp;(article in Dutch).</p><p>To aid in understanding this architectural design principle or style, please visualise the domain as a&nbsp;<em>replication</em> or&nbsp;<em>mirroring</em> of the real world of the business. Concepts and processes as they exist in the business or problem domain can be found here. We do not build a domain component as an implementation of an automation solution, or business process, but we re-create the business in a mirrored format. The business process model should be viewed as a derived or implicit result of creating the domain model.</p><p>This mirrored format is especially recognisable in the two main patterns we describe below. A mirror reflects, but it turns some things around! The attempt to create models that resemble the real thing as closely as possible is a fundamental mistake, and we hope to have demonstrated a different approach here. The trick of applying the Reverse Time and Active Passive patterns will create infinitely scalable domain models. Modelling complex domains without applying these patterns will produce models that collapse under their own weight.</p><p>The technical components can then be seen as being there for only one reason: as non-functional components they&nbsp;<em>synchronise</em> the mirrored business with the real, outside world. These technical components should be understood as nothing but synchronisation mechanisms. When viewed as such, we have a cognitive aid in applying these components wisely, and not fall into the well-known trap of endowing them with too much business logic.</p><p>We will now briefly describe the two mirroring or reversing patterns. In describing these patterns we follow a pattern template. These patterns are also documented separately on this site.</p><h3>The Active-Passive Pattern</h3><h4>Intent</h4><p>A domain model will become large and very complex. This is nothing to be afraid of. It is how it should be. We&nbsp;<em>want</em> complexity! The intent of the model is to capture the domain, that is: reflect the real world. This model should be functional when very small, but be willing to grow, indeed to be infinitely scalable. However, in order to avoid a model that is unmanageable we should not make the fundamental error of trying to model the domain as close to the real world as possible. A simple trick is to turn active and passive around: active objects in the real world are modelled as passive, indeed even almost devoid of complexity in the sense of behaviour or responsibilities. Passive objects in the real world on the contrary are modelled as active, taking initiatives, doing things. The responsibilities endowed upon them are precisely those activities that, in the “real” world, are done with them. This will help in realising the intent (this is another aspect of turning-around).</p><h4>Also Known As</h4><ul><li>The World of Roger Rabbit</li><li>Activity inversion</li><li>Looking-glass world</li><li>Anthropomorphising</li></ul><h4>Example</h4><p>A person pays a bill. He owns an account to pay bills with. The person is the active object in the real world. He pays the bill by opening or accessing the account, creating a transaction, telling the transaction the amount that he copies from the amount contained in the bill, as some other information. And finally he tells the transaction to go ahead. He is a very complex object, with many responsibilities and many relations with other objects. The objects bill, transaction, account, are passive. In fact they contain only the information (data) necessary for the person and usually contain little responsibilities. They are often trivially simple.</p><h4>Context</h4><p>There are many passive, exceedingly simple objects (i.e. an Account), and few active, exceedingly complex objects (i.e. a Customer). Usually the active objects correspond to actors in the use cases, or external agents or triggers. The passive objects are data containers, with information used in a business process.</p><h4>Problem</h4><p>The sequence in behaviour is rather critical: first do this, and then do that. This is called <em>process brittleness</em>. The process is not easily changed. The few exceedingly complex active objects are strongly coupled to a lot of often trivially simple passive objects (typically more than three) with which they perform all kinds of tasks. The system can capture the business problem domain reasonably well when still small, but as the domain grows (that is, the model of the business domain in the software) it becomes increasingly difficult to manage, until expanding the domain model becomes virtually impossible because of the exploding transitive dependencies. The model collapses under its own weight. This is what is most often the cause of the exponential cost curve of computer systems we build.</p><h4>Solution</h4><p>The Active Passive pattern describes the world, or complex systems, by employing two rules:</p><ol><li>Objects that are active in the real world (machines, systems, persons, committees) are modelled as passive, that is they do not initiate actions themselves, and any responsibility they have (usually they have responsibilities) are delegated to other objects</li><li>Objects that are passive in the real world (documents, cars, products) are modelled as active: they initiate actions, take responsibilities upon themselves to reach a business goal. They typically delegate most of the actions needed to finish a business process to other active objects, and in doing so succeed in staying simple and small.</li></ol><p>Association hubs are, when this pattern is properly applied, greatly reduced in number. Association hubs are classes in the model with many associations (more than three is often already too many!). Inversion of activity turns activity and passivity around. In the example: the person has almost no responsibility. Instead the bill has the one main responsibility in this context, namely to “pay himself”. The bill starts the entire process of paying by contacting the person (someone has presumably created the bill, and this someone told the bill: “I want some money from this person.” The bill only needs to ask the person for one thing: an account payable. After receiving this account he proceeds by telling the account to create a transaction for himself. The bill is done now; the chain of responsibility has been transferred to the account. However, account does not hold this responsibility for long. He creates a transaction for the bill, and subsequently tells this transaction to go ahead. All the rest is done by the transaction. A simple rule of thumb is that any responsibility of an active object in the real world can be relocated to a passive object in the model.</p><p>Active objects should limit themselves in the number of responsibilities they have: typically an object should have only one responsibility. There may be more defined in the interface of the object, but these should be delegated to others. Good objects are lazy!</p><h4>Consequences</h4><p>The distribution of complexity over the model is more balanced. Some objects are rather passive but are usually linked to several other objects. Some objects are rather active but linked to few others. This way there are less complexity hubs in the model. The resulting or generated processes are more demand-chain and more easily changed. Processes are not the source for the structural model, but rather the responsibilities of a few key objects (like &quot;bill&quot; in the example above). This recurs in the way the domain model structure comes into being, by employing the Inverse Time Pattern that is described in another subchapter. <br/> The domain model may be large, but any segment of it is loosely coupled.</p><h4>See Also</h4><ol><li>The Active Object&nbsp; pattern<sup><a href="#_edn10"></a></sup> should not be confused with this pattern. This is a pattern that is mainly used to model objects that contain their own thread of control, to be used in concurrent systems.</li><li>The domain-centred design principle is also strongly related to what Craig Larman calls the Expert Pattern<a name="_ednref11" href="#_edn11"></a><sup><a href="#_edn11"></a></sup>.</li><li>This pattern is usually applied together with the Inverse Time Pattern.</li><li>There is a strong relation between this pattern and CRC sessions. In CRC sessions, workshop participants play the role of objects in the customer domain. The facilitator usually emphasises the need to choose objects in the domain that are usually considered passive</li></ol><h3>The Time Inversion&nbsp;Pattern</h3><h4>Intent</h4><p>The Time Inversion Pattern is used to model dynamic collaborative behaviour between model components. To choose which responsibilities should be endowed upon a component, the modeller considers a goal that should be reached by one or more key components. This goal should be an end-goal. There may be more than one end-goal, but one at a time is chosen for a modelling session. Reasoning backward from this end-goal the modellers searches for other components to delegate behaviour to, but in an&nbsp;<em>inverted</em> time frame: the first modelled object implements the last step in reaching the goal, the second the last step before that, and so on. The choice of candidate objects is from a list of active objects obtained from the Active-Passive Pattern.</p><h4>Also Known As</h4><ul><li><a title="Demand chain - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Demand_chain">Demand-chain</a></li><li><a title="From Push to Pull- - John Seely Brown" href="http://www.johnseelybrown.com/pushmepullyou4.72.pdf">Pull model (Toyota)</a></li><li><a title="Just in time (business) - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Just-in-time_%28business%29">Just-In-Time</a></li></ul><h4>Example</h4><p>A model that implements a business process that builds and delivers cars would probably contain an active object&nbsp;Car. The main responsibility, as last in the business process steps, could very well be: deliver yourself to the customer. Sometimes a responsibility named &quot;sell yourself&quot; is used.</p><p>How can a car deliver itself? Well, we define a method (=responsibility) in the class Car, called deliver. We dive into the method that should be executed when the car does this. What is the last thing that should be done in order to satisfy the&nbsp;deliver responsibility? We might decide that this is the fact that the car dealer drives the car to the customer site. So we need a&nbsp;CarDealer, and we create this class/object with the responsibility&nbsp;driveToCustomer. How can the car dealer drive the car to the customer site? He needs to have the car. The car, in order to be able to exist on the dealers’ site, needs to build itself:&nbsp;build. This is a new responsibility, in the case of aggregates largely delegated to the composing elements, etc.</p><p>The picture we want to unfold here is exactly that: of unfolding. A business process is created dynamically, can in fact be seen as generated from the collected interfaces of the web of available objects. Business processes should not be hard-coded, explicitly modelled, or contained in a separate software component, as is often the case for example in Service Oriented Architectures.</p><h4>Problem</h4><p>Where do you begin modelling the customers’ problem domain? This strategy makes this simpler: begin with the goals the business wants to accomplish.</p><p>How can you know that the way you model things that are done, are not modelled in such a way as to be almost impossible to change?</p><p>Modelling a complex business domain often is very hard, and it is even harder to find out where to begin.</p><h4>Solution</h4><p>Walking backwards along the process chain, creating active objects along the way, the car would build itself, parts would build themselves and assemble themselves, factories making the parts would pay themselves, etcetera. This is a backward inferencing process, a demand-chain process. In general, the goal objects generate the process to achieve their goals, instead of hard-coded processes as we too often see for example in BPM<sup><a href="#_edn12"></a></sup>.</p><h4>Structure</h4><p>The resulting object graph is able to perform one or more trees of business processes, where the roots of the trees are the final business results. However it is important to remark here that the object graph structure itself is not at all directly conceived from these processes. Instead, various, sometimes incomplete, processes are taken during the modelling phase to &quot;play out&quot; by existing and newly created objects. This leads to an object graph that can be validated to at least be able to perform the defined processes, but usually is able to perform a superset of these input processes. This can be seen in the modelling sessions, when the domain experts propose a new process, and we find out that the existing model is able to generate this process without needing any change whatsoever in the model.</p><h4>Known Uses</h4><p>The Time Inversion Pattern is one of the three primary patterns used in eXploratory Modelling (xM). Behaviour of objects is realised by thinking about the final goal of an object, and then to decide upon the last previous action needed to accomplish this goal. This final or last action is usually delegated to a new object (usually an Active Object), upon which the modeller jumps to this object, and tries to find out the previous action in this object in the same way. This process can be viewed in action in the subchapter containing an xM walkthrough.</p><p>This pattern is well known in industry, as exemplified by Toyota in what they originally called the <em>Pull Model</em><sup><a href="#_edn13" name="_ednref13"></a><a href="#_edn13"></a></sup>.</p><h4>Consequences</h4><p>By using the demand-chain modelling strategy models gain in flexibility, especially in the case of uncertainty, vague business requirements, processes that are difficult to make concrete or should be highly optimised.</p><p>The resulting solution, the model, may lack structural consistency: models can be redundant and impossible to understand on an overall level. This is a potential problem, but we argue that in the case of the kind of model we talk about, this is usually not so. We create models that are complex, difficult to overview or comprehend, but because of the high cohesion this actually works in favour of the model instead of against it. The model is to a large extend managing its own complexity.</p><h4>See Also</h4><p>This pattern is usually combined with the Active-Passive Pattern, because the choice of where to place the previous process step to is determined by selecting an active object that is usually passive in the real world.</p><p>As mentioned earlier this pattern is well known and documented in supply-chain management theory<sup><a href="#_edn14" name="_ednref14"></a><a href="#_edn14"></a></sup>.</p><h2>Interoperability</h2><p>An xM effort is not an island. It is embedded in a complete solution effort and should behave as a good citizen. It should not dictate the way software development is done, although as mentioned it operates most effectively in projects with certain characteristics such as agility.</p><p>To behave as a good citizen it should be interoperable. The Smalltalk environment may be used for the sessions, but the result should be, when necessary, transferrable to any other environment. Also the work of integration should not require high skilled or specialised labour, but be highly automated.</p><p>There are two aspects of interoperability we want to cover in this subchapter.</p><ol><li>Importing existing domain information</li><li>Exporting into different programming languages and environments</li></ol><p>We will only report those strategies that we have used in our own projects, since the purpose of this article is primarily an experience report. Much experience must still be gathered from others applying the method.</p><h3>Importing existing domain information</h3><p>For modelling a domain with domain experts it is usually necessary to “fill” the domain with objects they know. Having these objects to play with greatly helps in feeling “at home” in the domain and explore sensible processes and responsibilities. This filling, in order to be realistic, may often involve the creation of many thousands of objects. Often the classes for these objects do not exist yet, so how do we deal with this situation?</p><p>There may be alternative or better solutions, but what we have used in our projects was a very pragmatic approach. We asked the customer for access to their data. For one customer this data was too sensitive but it was not difficult to obtain a relevant data set in the form of an anonymised export of their Oracle data into a Microsoft Access database. This proved to be very useful. The dataset can be made available as raw data in Smalltalk, to be parsed and made into “real” objects with simple Smalltalk scripts.</p><p>This way we were able to create vast amounts of persons with extensive profile data which in this project was an important aspect of their domain and needed to be available in order to play with the domain effectively.</p><h3>Exporting into other environments</h3><p>MDA<sup><a href="#_edn15" name="_ednref15"></a><a href="#_edn15"></a></sup>is working on an extensive set of transformation rules to enable model driven implementations. We have used a very restricted subset of this functionality, as was available in one of the tools we used, Enterprise Architect from Sparx Systems. This tool states it implements part of the MDA specification.</p><p>The part we used was XMI import, and transforming the resulting model into a C# implementation. XMI is part of the UML specification, and defines an XML interchange format for object-oriented languages.</p><p>We did not use (in fact these rules do not even exist yet) any transformation rules for transforming Smalltalk code into C#. This of course means that the resulting C# framework did not contain code either! We re-created the classes and methods. We did not re-create the method bodies. In that respect the resulting model does not bring us more than more or less traditional UML modelling.</p><p>However, we did export the Smalltalk method bodies. This was, together with all comment in classes and methods, placed into comments in the C# classes. A simple XMI framework in Smalltalk written by the author did the export.</p><p>Since we restricted ourselves to implementing in the domain classes only business domain behaviour, it is important to realise that the code in these classes has some interesting properties which help us a lot:</p><ol><li>Method bodies are typically short and concise, on average 2-3 lines of code.</li><li>The complexity of this code is very low: they are typically easy to understand, because in fact they were created and written by the business domain experts, not by a programmer.</li><li>Only a very restricted subset of the Smalltalk class library was used to write this code. This of course implied that for the facilitator only this restricted subset of the vast Smalltalk class library should be familiar</li></ol><p>This helped us with our very simple strategy for transforming the Smalltalk codebase into C#: programmers needed basic understanding of Smalltalk, not much more, to read the Smalltalk code as comment in the C# classes, and manually transform this code into C#. And of course this implied that the resulting C# code in turn was simple as well.</p><p>The task turned out to be trivial, if somewhat time-consuming. But we concluded that for this task cheap or junior programmers could be used. It was a low-skill labour.</p><h2>Other instance based approaches</h2><p>Other approaches exist that have more or less overlap with xM. Some of them complement xM while others are similar. We give a summarised overview of some of these, in order to help in understanding xM better.</p><ol><li><span style="font-weight:bold;">Prototyping</span><br/> Used to get a feel for the required end product by creating simple examples, mock-ups or screen drawings. As a rule prototypes do not implement business logic or functionality because that would require too much time and effort, which had better be applied in implementing the &quot;real&quot; product.</li><li><span style="font-weight:bold;">Use Cases</span><br/> Describe typical interactions of users, called actors, with the system. No information is gathered on the components of the system, or the actual business processes in the domain that is under scrutiny.</li><li><span style="font-weight:bold;">Scenarios or user stories</span><br/> Sometimes closely related to use cases, but typically smaller or simpler. Used in so-called agile approaches. Basic planning input for extreme programming teams that gather them from requirements sessions with the customer, with the restricting requirement that they should be implementable within one iteration or sprint, typically with a duration of one to four weeks.</li><li><span style="font-weight:bold;">Naked Objects</span><sup><a href="#_edn16" name="_ednref16"></a><a href="#_edn16"></a></sup><br/> Offers an environment that enables the user to “play” with objects and their state. Strong overlap with xM and the tools used in xM. Business domains that are more data-centric and form-oriented are well suited to tackle with Naked Objects. xM is more generic and better suited than Naked Objects to tackle complex domains.</li><li><span style="font-weight:bold;">CRC sessions</span><br/> Closely related to xM, in effect xM can be seen as derived from it. Originally conceived at Tektronix to teach object oriented thinking<sup><a href="#_edn17" name="_ednref17"></a><a href="#_edn17"></a></sup> , these workshop sessions actually play out objects and their interactions, and offer an effective technique to create high quality object models</li></ol><h2>xM in other environments</h2><p>As was briefly mentioned in the article summary, the xM approach has been applied by the author and his colleagues in other environments, i.e. the VisualStudio development environment from Microsoft, using C# as the language to model/program in.</p><p>Programming languages like C# lack some features that can greatly increase the effectiveness of xM sessions. The same goes for the IDE, such as VisualStudio. This lack can partly be compensated by some modifications in the environment that we will describe here shortly. However we think the advantages of a modelling/programming approach like xM will bring sufficient benefits to justify its use even if external constraints prohibit a team from using the preferred Smalltalk environment for the effort.</p><ol><li>On-the-fly changing class names, method names and such, without needing to re-create existing instances (remember, xM sessions constantly extend and build on existing domain objects). This can be overcome by streaming the objects to file, and back again, with some recovery algorithms to deal with adding or removing attributes or changing names of attributes. For example the Object Bench in VisualStudio empties the objects when one of their classes is recompiled. However it is possible to hook into this and stream the objects out and in again.</li><li>The ability to do this in several locations: in the browser, in the debugger, in the objects themselves</li><li>Drag-and-drop to move objects around or create instances of associations (<em>links</em> in UML parlance) visually</li></ol><h2>Conclusion</h2><p>We think xM is an approach that can introduce significant and relevant improvements in any development effort.</p><p>Though many of its composing elements are not new, and indeed have been part of the toolbox of most experienced and accomplished object-oriented modellers, the combination of techniques offers much added value.</p><p>xM is especially useful in a domain-centred architecture, that is an architecture that has a clear separation between the business domain and the other components. We think this separation is an essential design principle in any architectural style. A domain driven architecture has not been elaborated upon in this article, but this can be accomplished in many of the existing architectural styles architectures, such as a Service Oriented Architecture.</p><p>The use of this technique in our projects has been met with great enthusiasm by our customers, and indeed often been characterised as “we never thought this was even remotely possible to do with such ease and efficiency”.</p><hr class="wp-block-separator"/><h2>References</h2><p><a name="_edn1"></a> The author did not invent the term. It was first encountered at the ESUG 2007 conference in Lugano, in a presentation by Andreas Tönne (then from Georg Heeg eK, Germany).&nbsp; See NiallRossESUG2007report.pdf (application/pdf Object). . Available from world wide web: <a href="http://www.esug.org/data/ReportsFromNiallRoss/NiallRossESUG2007report.pdf">http://www.esug.org/data/ReportsFromNiallRoss/NiallRossESUG2007report.pdf</a>.</p><p><a name="_edn2"></a> VisualWorks is one of several existing Smalltalk implementations. Cincom Smalltalk - Simply Possible.&nbsp; . Available from world wide web:&nbsp; <a href="http://www.cincomsmalltalk.com/userblogs/cincom/blogView?content=vwfactsheet">http://www.cincomsmalltalk.com/userblogs/cincom/blogView?content=vwfactsheet</a>.</p><p><a name="_edn3"></a> CincomSmalltalkWiki: Public Store Repository.&nbsp; . Available from world wide web:&nbsp; <a href="http://www.cincomsmalltalk.com/CincomSmalltalkWiki/PostgreSQL%2BAccess%2BPage">http://www.cincomsmalltalk.com/CincomSmalltalkWiki/PostgreSQL+Access+Page</a>.</p><p><a href="http://amzn.to/1NQTDZJ" target="_blank">EVANS, E.&nbsp;<em>Domain-driven design : tackling complexity in the heart of software.</em>&nbsp;Boston: Addison-Wesley, 2004</a>.</p><p><a href="#_ednref5" name="_edn5"></a> Namespaces are here to scope the names of classes. Usually only one namespace is necessary.</p><p><a href="#_ednref6" name="_edn6"></a><a href="http://amzn.to/1P4mACv" target="_blank">BECK, K.&nbsp;<em>extreme programming eXplained : embrace change.</em> Reading, MA: Addison-Wesley, 2000.</a></p><p><a href="#_ednref7" name="_edn7"></a> Unit tests have not been discussed in this chapter, but their absence is only for the sake of conciseness. In fact many of the starting points of xM sessions can be from unit tests.</p><p><a name="_edn8"></a> Object Management Group - UML.&nbsp; . Available from world wide web:&nbsp; &lt;<a href="http://www.uml.org/">http://www.uml.org/</a>&gt;.</p><p><a href="#_ednref9" name="_edn9"></a><a href="http://amzn.to/1NQTOnM" target="_blank">FOWLER, M.&nbsp;<em>Patterns of enterprise application architecture</em>. Boston: Addison-Wesley, 2003.</a> (The Addison-Wesley signature series) has called this the Domain Model. The relation of this pattern to others can be seen in <a href="http://amzn.to/1P4mHho" target="_blank">BUSCHMANN, F.&nbsp;<em>Pattern-oriented software architecture : a system of patterns.</em> Chichester ; New York: Wiley, 1996.</a></p><p><a name="_edn10"></a><a href="http://www.cs.wustl.edu/%7Eschmidt/PDF/Act-Obj.pdf"> http://www.cse.wustl.edu/%7Edoc/pspdfs/Act-Obj.pdf</a></p><p><a href="#_ednref11" name="_edn11"></a><a href="http://amzn.to/1NQTWnm" target="_blank">LARMAN, C.&nbsp;<em>Applying UML and patterns : an introduction to object-oriented analysis and design and iterative development.</em> 3rd. ed. Upper Saddle River, N.J.: Prentice Hall PTR, 2005.</a></p><p><a href="#_ednref12" name="_edn12"></a> Business Process Modelling.</p><p><a name="_edn13"></a><em>Edge Perspectives with John Hagel.</em> . Available from world wide web: &lt;<a href="http://edgeperspectives.typepad.com/edge_perspectives/2005/10/from_push_to_pu.html">http://edgeperspectives.typepad.com/edge_perspectives/2005/10/from_push_to_pu.html</a>.</p><p><a href="#_ednref14" name="_edn14"></a><a href="http://amzn.to/1P4mOtf" target="_blank">TAYLOR, D. A.&nbsp;<em>Supply chains : a manager's guide</em>. Boston, MA: Addison-Wesley, 2004.</a></p><p><a name="_edn15"></a> “MDA.” <a href="http://www.omg.org/mda/.">http://www.omg.org/mda/.</a></p><p><a name="_edn16"></a><em>Welcome to Naked Objects.</em>&nbsp; . Available from world wide web:&nbsp; &lt;<a href="http://www.nakedobjects.org">http://www.nakedobjects.org/home/index.shtml</a>.</p><p><a href="#_ednref17" name="_edn17"></a> For an introduction on how CRC came to be, see chapter 4 in: <a href="http://amzn.to/1P4mQkG" target="_blank">BECK, K.&nbsp;<em>Kent Beck's guide to better Smalltalk.</em>&nbsp;Cambridge, U.K. ; New York: Cambridge University Press, 1999. (SIGS reference library series 14).</a></p><h2>&nbsp;</h2></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Fri, 08 Apr 2011 11:01:30 +0200</pubDate></item><item><title><![CDATA[eXploratory Modelling (Introduction)]]></title><link>https://www.reflektis.nl/blogs/post/exploratory-modelling-introduction</link><description><![CDATA[Estimated reading time: 5 minutes xM Exploratory Modelling is acronym-ed as xM, and the parallel with xP (eXtreme Programming) is not accidental: in a ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_5Y-RDwmQSSS-o7nba1s-XQ" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_h-GbvXHKRnqaIXF8TXXHPA" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_0HUNPMX5TNKVLojaTdkcIQ" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_bRC-2REySraw38LJB39KIg" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center " data-editor="true"><div><p class="wp-block-yoast-seo-estimated-reading-time yoast-reading-time__wrapper"><span class="yoast-reading-time__icon"><svg style="vertical-align:-0.1em;"></svg></span><span class="yoast-reading-time__spacer" style="width:1em;"></span><span class="yoast-reading-time__descriptive-text">Estimated reading time: </span><span class="yoast-reading-time__reading-time">5</span><span class="yoast-reading-time__time-unit"> minutes</span></p><p class="has-text-align-center"><span style="font-size:18pt;"><em><span style="color:rgb(255, 0, 0);"><span style="font-size:24pt;"><span style="font-family:&quot;&quot; times new roman &quot;&quot;, times;"><strong><br/>xM </strong></span></span></span></em></span></p><p class="has-drop-cap">Exploratory Modelling is acronym-ed as xM, and the parallel with xP (eXtreme Programming) is not accidental: in a highly interactive development environment this modelling approach does for modelling what xP does for programming: it does away with procedures, documentation, or any activity that does not directly and visibly contribute to the end result. Moreover it cannot properly be categorised as modelling since the end result or deliverable of the xM effort is a running, executable software program. However, for the purpose of categorisation, but especially regarding the place of xM in the solution-realisation cycle, it can best be categorised as a modelling activity.</p><p>It empowers the development of Domain Specific Languages (DSL), and thus can be viewed as a DSL of DSL's.</p><p>Xm is truly instance based programming, since the actual business experts or domain experts, facilitated by an xM moderator who directly incorporates the results of the ongoing discussion into software objects, play around with objects. These are actual instances of classes with the behaviour and state that was deemed relevant for them.</p><p>It is a perfect example of what Adele Goldberg referred to as “robust prototyping”. The modelling effort seamlessly results in running, validated business models.</p><p>Xm is very well suited for DDD (Domain Driven Design) since it is well suited for business models but less well suited for the technological layers which are also necessary in deployed customer solutions.</p><p>You can read other articles on this site about how to couple the domain with the technology components .</p><p>xM can be done in many environments/tools, with some essential functionality to facilitate the sessions, but the Smalltalk development environments are exceedingly well suited. We have used Naked Objects successfully as well, especially in projects that are strongly data-driven and rely on user interfaces that are form-oriented.</p><p>Sessions start by exploring the desired <em>end result or goal </em>of a typical use of the system, or preferably of the business that we are building a business model for. An example can be an insurance product: the goal is that this product is purchased by a customer. The first step might be to create an actual, visible instance of InsuranceProduct. The modelling team will see this object on the screen, and it may be adorned with an icon to designate as an insurance product. Also this object will typically stay alive during many modelling sessions, not just this one. It will grow, accumulate all kinds of different objects around it to extend its functionality and to complete the vision of the business about its business domain. This is an application of the&nbsp;<a href="https://blog.reflektis.nl/time-inversion-pattern/">Time Inversion Pattern</a>.</p><p>The unfolding model is a living persistent entity, which will be enhanced in each subsequent modelling session.</p><p>At closing a modelling session the complete state is frozen to be unfrozen at the start of the next session.</p><p>These objects must be created on the fly, modified on the fly, and open to any kind of transformation or even morphed into totally different objects or classes, so the system needs to be extremely dynamic. We have worked with other environments (Java Eclipse, Microsoft VisualStudio) and from these experiences we know that xM is possible in these environments. However the Smalltalk environment and language has proven to be vastly superior in the context of these modelling sessions.</p><p>Since we categorise these sessions as modelling sessions, in spite of the fact that the result is an executable running application (albeit only for the business domain component), it has been necessary to deliver the modelling results to projects that need to implement it in any other environment. For this we have used a transformation engine that exports the system to XMI, which is used to generate C# or Java code for the domain model. This way other target platforms can easily be supported as well.</p><p>However nothing would prevent you from employing the Smalltalk classes built during the modelling sessions to implement a complete solution in Smalltalk itself, resulting in an executable component (one or more running Smalltalk images containing the business domain components). We have not yet had the opportunity to try this in any of our projects, but in a world where everything is easier to interoperate with web services, this seems to be a viable and probably very cost-effective solution.</p><p>Also, on the interoperability aspect, we made extensive use of creating many business objects from existing business data, by importing them and transforming them from Microsoft Access databases, SQL Server and others. Especially for business experts, who constitute these modelling teams, this creates a realistic and familiar environment. The goal of the simulated world is to be an accurate representation of the business domain.</p><p>An interesting aspect of the application of this modelling technique is the feedback from customers who participated as business experts in these sessions. They were exceedingly enthusiastic, showed no noticeable discomfort to work in an environment that was originally meant to be used only by software developers (although some tricks were applied to hide some of the programming language from them), and felt the exercise to be extremely productive.</p><p>Curious whether xM might help you improve your requirements engineering process? Dealing with a complex business domain? <a href="https://blog.reflektis.nl/contact/">Contact me, I think I can help!</a></p><p>For a more extensive article on xM, please go to:&nbsp;<a href="https://blog.reflektis.nl/exploratory-modelling-explained/">eXploratory Modelling Explained</a>.</p><ul class="wp-block-yoast-seo-related-links yoast-seo-related-links"><li><a href="https://blog.reflektis.nl/exploratory-modelling-explained/">eXploratory Modelling Explained</a></li><li><a href="https://blog.reflektis.nl/exploratory-modelling-followup/">Exploratory Modelling followup</a></li><li><a href="https://blog.reflektis.nl/architect-scrum/">Architect Scrum</a></li><li><a href="https://blog.reflektis.nl/deploying-visualworks-applications/">Deploying VisualWorks Applications</a></li><li><a href="https://blog.reflektis.nl/why-use-uml-for-business-modeling/">Why use UML for Business Modeling</a></li></ul></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Wed, 08 Apr 2009 13:46:30 +0200</pubDate></item><item><title><![CDATA[Video of eXploratory Modelling at ESUG2008 available]]></title><link>https://www.reflektis.nl/blogs/post/video-of-exploratory-modelling-at-esug2008-available</link><description><![CDATA[https://www.youtube.com/watch?v=qlQx25QCRIk Today James Robertson published his video of my talk on eXploratory Modelling at ESUG2008 . Have fun watchin ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_QPA6rj84Qbm2IHWa7ofoLQ" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_XnnBXxE0SI-f2KRFYl_pfQ" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_WzqTRSeZSmmdZnT7CEfvsg" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_LV9pFkbjSFm-nkhKLL-tLw" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center " data-editor="true"><div><figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">https://www.youtube.com/watch?v=qlQx25QCRIk</div>
</figure><p>Today James Robertson published his video of my talk on eXploratory Modelling at <a href="http://www.esug.org/wiki/pier/Conferences/2008?_s=xOjkszTdhc9FtHl6&amp;_k=gk_oqLcnsSqpLPAT&amp;_n&amp;19">ESUG2008</a>.</p><p>Have fun watching it, and please do not hesitate to <a href="https://www.reflektis.nl/contact">contact me</a> if you have questions or if any part of the presentation was unintelligible because of the noise or such. The presentation was done without a microphone, and I guess James did a great job getting the sound quality to acceptable levels.</p></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Tue, 02 Sep 2008 15:50:41 +0200</pubDate></item><item><title><![CDATA[Video van eXploratory Modelling op ESUG2008 nu beschikbaar]]></title><link>https://www.reflektis.nl/blogs/post/video-van-exploratory-modelling-op-esug2008-nu-beschikbaar</link><description><![CDATA[https://www.youtube.com/watch?v=qlQx25QCRIk Vandaag publiceerde James Robertson de video van mijn presentatie op ESUG 2008 over eXploratory Modelling. ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_34GvOH-VSRCycNgF_8UM7Q" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_K2HdPJHbTIqkJlNLtEgffg" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_Q49t2qCRQCaov4QY2Ym_QQ" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_-lFpFYKGR7aoqTlLnBR_NA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center " data-editor="true"><div>https://www.youtube.com/watch?v=qlQx25QCRIk Vandaag publiceerde James Robertson de video van mijn presentatie op ESUG 2008 over eXploratory Modelling. Veel plezier met het bekijken, en weifel niet om contact met mij op te nemen als je vragen hebt of wanneer een stuk van de presentatie moeilijk te verstaan was door het af en toe slechte geluid. De presentatie werd gedaan zonder microfoon en James heeft goed werk gedaan de kwaliteit van het geluid zo goed mogelijk te krijgen.</div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Tue, 02 Sep 2008 15:50:41 +0200</pubDate></item><item><title><![CDATA[Exploratory Modelling followup]]></title><link>https://www.reflektis.nl/blogs/post/exploratory-modelling-followup</link><description><![CDATA[For those who attended my presentation (and other interested people of course) on ESUG 2008 about Exploratory Modelling or xM, I collected some refere ]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_0a7CCeWQRyqBrcNElWPY2A" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_v6bPZC17Qw64g6Aum80oAA" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_Bj3EgrW8RCutPvKelUiMVw" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_qg-GSv_lSvyjMXl9_GW7zQ" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center " data-editor="true"><div><p>For those who attended my presentation (and other interested people of course) on <a class="icon-external" href="http://www.esug.org/wiki/pier/Conferences/2008/Exploratory%20Modeling?_s=11z8lQ8DXAPYWZKX&amp;_k=nt4OORk81fWoE13O&amp;_n&amp;37" target="_blank">ESUG 2008</a> about Exploratory Modelling or xM, I collected some references.</p><ul><li><a href="https://www.yumpu.com/en/document/view/28967847/rationale-for-xm-esug/3" target="_blank">Slides of the presentation</a></li><li>Podcast in which my presentation is discussed (note: no longer available, sorry)</li><li><a href="https://youtu.be/qlQx25QCRIk" target="_blank">Video of the presentation, thanks to James Robertson of Cincom</a>.</li></ul><p>This site contains several articles related to the subject of my presentation:</p><ol><li>To read more on the &quot;reverse time pattern&quot; please read <a href="https://blog.reflektis.nl/time-inversion-pattern/">Time Inversion Pattern</a></li><li>The subject of mirroring surfaces in a lot of articles and might even be regarded as the central theme of this site, but to get you started here are a few important links. <ol><li>The article on the <a href="https://blog.reflektis.nl/active-passive-pattern/">Active-Passive Pattern</a></li><li><a href="https://blog.reflektis.nl/through-the-looking-glass/">Through the Looking Glass</a></li><li><a href="https://blog.reflektis.nl/the-mirrored-world/">The Mirrored World</a></li></ol></li></ol><p>I mentioned Domain Driven Design as required reading for Smalltalkers:</p><ul><li>Website on Domain Driven Design: <a class="icon-external" title="Domain Driven Design Website" href="https://groups.yahoo.com/neo/groups/domaindrivendesign/info" target="_blank">www.domaindrivendesign.org</a></li><li><a class="icon-external" title="Domain Driven Design Book" href="http://amzn.to/1Odn4UM" target="_blank">The book by Eric Evans</a> (and Eric Evans was a Smalltalker...)</li></ul><p>Some of the patterns are not completely documented, this is of course work in progress.</p></div></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Wed, 27 Aug 2008 12:51:11 +0200</pubDate></item></channel></rss>