<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;C08MQX85fSp7ImA9WhRUEEs.&quot;"><id>tag:blogger.com,1999:blog-20576845</id><updated>2012-01-20T13:18:00.125+01:00</updated><category term="articles" /><category term="software estimation" /><category term="Vista" /><category term="Domain Driven Design" /><category term="podcast" /><category term="design patterns" /><category term="wiki" /><category term="IAD2009" /><category term="XP" /><category term="books" /><category term="enterprise architecture" /><category term="recruiting" /><category term="Technorati" /><category term="Hibernate" /><category term="OOD" /><category term="AJAX" /><category term="community" /><category term="Object-oriented programming" /><category term="events" /><category term="naymz" /><category term="open source" /><category term="SOA" /><category term="presentation" /><category term="trends" /><category term="software development" /><category term="Greasemonkey" /><category term="creativity" /><category term="MDA" /><category term="adwords" /><category term="software craftmanship" /><category term="agile" /><category term="survey" /><category term="DSL" /><category term="web 2.0" /><category term="BDD" /><category term="kanban" /><category term="video" /><category term="Mac OS X" /><category term="Grails" /><category term="tdd" /><category term="DDD" /><category term="JUnit" /><category term="Spring" /><category term="freelance" /><category term="training" /><category term="usability" /><category term="system integration" /><category term="code generation" /><category term="Social Networking" /><category term="lean" /><category term="me" /><category term="Continuous Integration" /><category term="data management" /><category term="Italy" /><category term="Office" /><category term="Identity2.0" /><category term="UX" /><category term="humour" /><category term="UML" /><category term="avanscoperta." /><category term="software configuration management" /><category term="communication" /><category term="development process" /><category term="JAOO2007" /><category term="Java" /><category term="configuration management" /><category term="Refactoring" /><category term="MsProject" /><category term="Groovy" /><category term="microformats" /><category term="JAOO" /><category term="IAD2008" /><category term="software architecture" /><category term="tags" /><category term="offshore software development" /><category term="scrum" /><category term="JAX" /><category term="coaching" /><category term="Maven" /><category term="User Experience" /><category term="Eclipse" /><category term="Context Mapping" /><category term="OOP" /><category term="Acceptance tests" /><category term="design" /><category term="JSF" /><category term="antipatterns" /><category term="project management" /><category term="OOA" /><category term="requirements" /><category term="testing" /><category term="blogging" /><category term="RAD" /><category term="J2EE" /><title>Ziobrando's Lair</title><subtitle type="html">An independent blog on Software Development</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>158</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ZiobrandosLair" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="ziobrandoslair" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A08FR3o8eip7ImA9WhRWFUw.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-309103070718937337</id><published>2012-01-02T16:56:00.001+01:00</published><updated>2012-01-02T16:56:56.472+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T16:56:56.472+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="J2EE" /><title>Setting up a DDD sample app</title><content type="html">&lt;p&gt;The guy who started it all is called Emanuele Del Bono. He’s a friend, a nice guy and a respected colleague. He participated in the first Domain-Driven Design class of my company, and also did a fantastic job in finding a suitable place for the class.  He is also one of the guys that animated a discussion on the DDD-IT mailing list that urged me to write this posts, some time ago. So I should have been warned about the danger behind his simple request.&lt;br /&gt; Some weeks ago, he complained about the lack of code example in the DDD-IT mailing list, and challenged the list to see if anybody dared to post the code of some aggregate. Innocent and legitimate request, ...or so it seemed. However, since he used the word “courage”, the one that kids use among themselves to do things they will regret, I accepted the challenge and started working on some code that could be shared, and found useful by the list.&lt;/p&gt;&lt;h2&gt;Why should I regret it?&lt;/h2&gt;&lt;p&gt;As I said, the request is both legitimate and innocent. What could be the drawbacks. I can point out two.&lt;/p&gt;&lt;li&gt;&lt;strong&gt;Time&lt;/strong&gt;: I like to do things well, and sometimes I tend to get lost in meaningless details. So,  for me, doing things right will take time. Given how busy I am, there’s a clear and present danger of never finishing the stuff.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Questions&lt;/strong&gt;: there are many things that I don’t want to talk about when talking about Domain-Driven Design. Frameworks are one of these. I use some of them, but I can’t really say I love them. However, I don’t like questions like &lt;em&gt;“how do you do this with Spring and Hibernate?”&lt;/em&gt; because you can probably do it in a smarter way that I can figure out. I think one of the values of DDD is to provide a conceptual background where these type of problems, decrease their importance to the point of being mere implementation details (even though they can make your time a hell if they don’t work exactly as expected). So my worry is to get too many questions focusing on the wrong side without really clarifying doubts on the part that matters most.&lt;/li&gt;&lt;h1&gt;Choosing a domain&lt;/h1&gt;&lt;p&gt;I definitely need something different from Cargos. Since I know the training domain a little, and used it also in the recent DDD school camp, I decided to choose this domain. However, as will be clearer later, we’ll need &lt;strong&gt;&lt;em&gt;precision&lt;/em&gt;&lt;/strong&gt; in defining what this is really about. Simply knowing how things work in the training domain won’t be enough.&lt;/p&gt;&lt;h1&gt;Choosing a programming language&lt;/h1&gt;&lt;p&gt;Since colleagues were eager for code, the first thing to do was choosing a programming language to actually show some code. The obvious choice was to choose my favorite language and get along with that. Problem number one: I don’t have a favorite language. Problem number two: there are too many things in the code that could divert both writer and readers attention from the actual scope of the task.&lt;/p&gt;&lt;li&gt;&lt;strong&gt;Java&lt;/strong&gt;: this has been my first choice, a little conservative I have to admit. However, it’s bee a while since I wrote some java code, and I stopped following Java trends after Oracle’s takeover. Last but not least, all of my local configuration needed an update.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Groovy&lt;/strong&gt;: a lot more pleasant to work with than Java, but to make it really pleasant I had to deconstruct Grails a little, in ways that might look obscure to most readers, carefully selecting only some of the available features. Good topics for a blog post, but not for this app.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;C#&lt;/strong&gt;: though I’ve been recently playing with the platform, and I appreciated some features, I still don’t feel like it’s mine. Still too hard for me to distinguish good and bad stuff.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ruby&lt;/strong&gt;: I am relatively new to the language, and probably missing some key tips on the technology stack and on the programming style (&lt;em&gt;“You still think like a Java guy”&lt;/em&gt; Paolo Perrotta once said, I hope I improved a little since then…).&lt;/li&gt;&lt;p&gt;Given this starting point, I started with Java. I thought I could set up quickly a skeleton architecture with Spring, like the ones I was used to work with.&lt;/p&gt;&lt;p&gt;So I opened up the IDE and started coding.&lt;/p&gt;&lt;p&gt;Wrong choice.&lt;/p&gt;&lt;p&gt;After setting up an &lt;strong&gt;Aggregate&lt;/strong&gt; an some satellite &lt;strong&gt;Services&lt;/strong&gt; that did their dirty job, or faked it with a mock implementation, I finally realized that I was getting all wrong and was underestimating the task of writing a sample application. What was my problem?&lt;/p&gt;&lt;p&gt;Ambiguity.&lt;/p&gt;&lt;p&gt;The model I was building looked perfectly sound from a “modeling” perspective, but I was getting uncomfortable in the multiple roles of developer, analyst, and domain expert or product owner. Moreover, the &lt;em&gt;“let’s show some code quickly”&lt;/em&gt; approach that I started with, didn’t really work. To define exactly what my aggregates were supposed to do, I needed a lot more &lt;em&gt;precision&lt;/em&gt;, since a little business tweak in the underlying domain would have driven me in divergent modeling choices. I needed consistency and unity of vision in my domain, before I could implement it in my model.&lt;/p&gt;&lt;p&gt;Well, that was no surprise. &lt;em&gt;That’s exactly what DDD is for&lt;/em&gt;. And a common, simplified development cycle is:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;gather some information from the domain expert about features A, B and C; &lt;/li&gt;&lt;li&gt;quickly implement it as a domain model, using DDD patterns; &lt;/li&gt;&lt;li&gt;spot contradictions in the current understanding of the domain, that emerge from the model; &lt;/li&gt;&lt;li&gt;refine the model, asking to the domain expert &lt;em&gt;what he precisely meant&lt;/em&gt; when he talked about features A, B, and C. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The only weird thing is that &lt;em&gt;all the roles are in my head now&lt;/em&gt;. And to keep my sanity and stop swinging from one interpretation to another one of the same corner of the domain, I need to be a little more structured, and define exactly what I want from myself. &lt;br /&gt;&lt;h1&gt;Providing a little structure&lt;/h1&gt;&lt;br /&gt;I want to model my aggregates around a problem, and I want this to be precisely defined. So, despite this being &lt;em&gt;just an example&lt;/em&gt;, or maybe exactly for this reason, I can’t go for shortcuts. Let’s start with a user story and see where it lead us. ￼&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin-left:auto; margin-right:auto;" src="http://lh6.ggpht.com/-5lsueuISnho/TwHTvwHBYDI/AAAAAAAAAS0/yxtBT-xwnPE/DDD%252520Sample%252520User%252520Story.jpg?imgmax=800" alt="DDD Sample User Story" title="DDD Sample User Story.jpg" border="0" width="405" height="268" /&gt;&lt;br /&gt;&lt;br /&gt;My first problem was to find a good name for my role. I mean, my company is rather small, so there’s not much of a clean role separation. I could have put something like “as Me” and was probably going to be more correct, even if less portable.&lt;/br&gt;&lt;br /&gt;However, that’s defining the starting point, and the scope for the first iteration. But it’s not precise enough. Let’s nail it down with an acceptance test.&lt;br /&gt;&lt;div&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: &lt;em&gt;Publishing a new training&lt;/em&gt;&lt;/br&gt;&lt;strong&gt;Given&lt;/strong&gt; a Catalog&lt;/br&gt;&lt;strong&gt;And&lt;/strong&gt; a Training &lt;em&gt;gourmet coding&lt;/em&gt; not yet published&lt;/br&gt;&lt;strong&gt;When&lt;/strong&gt; I publish Training &lt;em&gt;gourmet coding&lt;/em&gt; on Catalog&lt;/br&gt;&lt;strong&gt;Then&lt;/strong&gt; Training &lt;em&gt;gourmet coding&lt;/em&gt; is available on Catalog&lt;/br&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;And try to make it work. Of course this means setting up Cucumber in the development environment, something I thought it wasn’t strictly necessary, but I realized I am getting addicted to.  &lt;br /&gt;&lt;br /&gt;By the way, despite my previous experiences with Cucumber and Java, and the precious guidance by &lt;a href="http://cuke4ninja.com/"&gt;the secret ninjas cucumber scrolls&lt;/a&gt;, setting up again Cuke4Duke in my project didn’t work that smoothly. Looks like Maven got in the way. Again.  &lt;br /&gt;&lt;br /&gt;No, please. Not &lt;em&gt;that&lt;/em&gt; again.  &lt;br /&gt;&lt;br /&gt;In a second, Maven destroyed my pleasure. And made me think that, even though I am still a rookie on Ruby, every second spent on solving problems on Ruby is a second spent learning, while the time spent on Java is probably wasted. So, after just a few minutes, I already dropped my platform and started again with Ruby, instead of Java. But this sample app is a sandbox, for learning and experimenting. Needs to be fun. &lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Modeling question number one &lt;/h1&gt;&lt;br /&gt;Do I really need a catalog? When thinking about managing trainings, a Catalog is the abstraction that naturally comes to mind. However when I started thinking about what I really wanted to do with this application, I couldn’t find any behavior for the catalog &lt;em&gt;within the boundaries&lt;/em&gt; of my application. I said &lt;em&gt;“boundaries&lt;/em&gt;” which means that I need to define scope more precisely. A little &lt;strong&gt;context map&lt;/strong&gt; will do the job.&lt;br /&gt;&lt;div  text-align="center"&gt;&lt;img style="display:block; margin-left:auto; margin-right:auto;" src="http://lh6.ggpht.com/-4Rm77-Bk9u4/TwHTxbEbYPI/AAAAAAAAAS8/Y-9MQnLaioc/Bounded%252520Contexts%252520plus%252520ACL.jpg?imgmax=800" alt="Bounded Contexts plus ACL" title="Bounded Contexts plus ACL.jpg" border="0" width="515" height="392" /&gt;&lt;em&gt;The ultra-basic context map, with my application and an Anti-Corruption Layer separating it from the external website model&lt;/em&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;￼ The main idea, for now, is to manage the trainings locally and trigger a publishing action on an external website. I have no idea about how to do that, but I need to make it clear that I am not directly working on the catalog that is visible to a potential customer. I have an external website for that. Maybe some hosting service exposing APIs would do the job. But I don’t want to know that. Right now I just need to know that I won’t publish directly on that. I’ll hide the details behind some &lt;strong&gt;domain service&lt;/strong&gt; and hide all the little dirty things needed to complete the job behind the curtain of a neat interface. More likely, I’ll pretend to do that, and &lt;em&gt;shamelessly fake everything&lt;/em&gt;, but behind the same interface.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Ruby, the architecture and me &lt;/h1&gt;&lt;br /&gt;I hereby state loud and clear my ignorance about the architectural patterns in Ruby. I don’t know much about it, so whenever you see something that doesn’t quite fit the picture or that seems awkward, feel free to comment and correct me. The only thing I am almost sure about is that I don’t want to use Rails. Can’t say it won’t fit in the picture (I am not looking for a 100% DDD application, and I can figure out portions of the application that could be implemented according to that paradigm) but definitely Active Record is not what I want to start with, and definitely I don’t want a full framework stack. I want to add things little by little. &lt;br /&gt;&lt;h2&gt;Persistence framework&lt;/h2&gt; &lt;br /&gt;After exploring a little, I’ve chosen &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt;. A lightweight persistence framework that can be used at two different levels of abstraction. I started with the very low level approach, so my &lt;strong&gt;repositories&lt;/strong&gt; now look a little &lt;em&gt;vintage&lt;/em&gt;. :-) &lt;br /&gt;&lt;br /&gt;Also &lt;a href="http://datamapper.org/"&gt;DataMapper&lt;/a&gt; looked interesting. I’ll probably give it a try when trying to make the architecture a little more agnostic about persistence frameworks.  &lt;br /&gt;&lt;br /&gt;The trickiest part so far has been separating persistence instructions from transaction management. In a typical DDD architecture, transaction management is an application layer concern, but this seems to be at odd with most of the examples regarding ORMs and persistence frameworks in general.  &lt;br /&gt;&lt;h2&gt;What I like so far&lt;/h2&gt;&lt;br /&gt;I really like the Ruby testing stack. Cucumber and Rspec are incredibly well supported by RubyMine, and coding is a pleasure in this area.  Getting to all green is always a pleasure. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What I don’t like so far &lt;/h2&gt;&lt;br /&gt;Of course the database had his revenge after &lt;a href="http://www.slideshare.net/ziobrando/drive-your-dba-crazy-in-3-easy-steps"&gt;that presentation&lt;/a&gt;. SQLite rebelled and I wanted to test the app also with some real DMBS, but installing MySQL has been a little pain (well, the actual installation run smoothly ...it just didn’t work with my Ruby version). I had to switch to a different Ruby version and to reinstall it before having it work with my stack.  &lt;br /&gt;&lt;br /&gt;There are also a few things that don’t feel right on the architecture. I missed some of the things Spring was doing behind the scenes, and that used to be my default paradigm so there is a high possibility that the whole stuff looks like a Spring based Java application in Ruby dress. Some patterns which are relevant in Java and C# (like &lt;strong&gt;Application Facade&lt;/strong&gt; and &lt;strong&gt;Repository&lt;/strong&gt;) probably have a more elegant alternative implementation in Ruby, and there are some &lt;strong&gt;Singletons&lt;/strong&gt; around (forgive me) which are basically placeholder for a different implementation. In general wiring up is not as elegant as I would haver liked.  &lt;br /&gt;&lt;h1&gt;Ok, but where is the code? &lt;/h1&gt;&lt;br /&gt;I’ve started a project on GitHub. It’s called D3N. You can find it &lt;a href="https://github.com/ziobrando/D3n"&gt;there&lt;/a&gt;. It's still naive, but I’ve tried to do things well and started to post also issues about the things I want to cover/experiment in the next weeks. At the end I am thinking more about a playground than a “sample app” (I hate this term). &lt;br /&gt;So far, there's not so much to see, but I've been writing a hell of a long post. Let's try to get more use cases implemented and more coverage of the actual evolution. As I said before, there’s a lot more in doing a DDD application than just the resulting code. &lt;br /&gt;&lt;br /&gt;As somebody once said: &lt;em&gt;it’s the journey, not the destination&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-309103070718937337?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/o9flOo_BUy0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/309103070718937337/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=309103070718937337" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/309103070718937337?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/309103070718937337?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2012/01/setting-up-ddd-sample-app.html" title="Setting up a DDD sample app" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-5lsueuISnho/TwHTvwHBYDI/AAAAAAAAAS0/yxtBT-xwnPE/s72-c/DDD%252520Sample%252520User%252520Story.jpg?imgmax=800" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CUQGQHk_eCp7ImA9WhRRFkg.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-3158347220924404432</id><published>2011-11-30T12:01:00.001+01:00</published><updated>2011-11-30T12:42:01.740+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-30T12:42:01.740+01:00</app:edited><title>Denial won't help you learning</title><content type="html">&lt;p&gt;While preparing my talk (&lt;a href="http://www.agilemovement.it/video/volevo-solo-scrivere-codice"&gt;video&lt;/a&gt;) for the last Italian Agile Day conference, I spent some time retrospecting on my past projects. As people who attended know, this retrospective step ended up completely thwarting the original purpose of the speech: looking back in the past I discovered more than I expected.&lt;/p&gt;&lt;p&gt;To be completely honest, some of the inspiration for the talk came from Alistair Cockburn closing keynote at JAOO 2007 , I rarely invent anything. Connecting the dots is my job.&lt;/p&gt;&lt;h2&gt;My key factors for successful learning&lt;/h2&gt;&lt;p&gt;(OMG, I wrote this title like I know this stuff... and I actually don’t) While retrospecting on my past projects, I didn’t focus on normal success conditions. I focused on &lt;em&gt;the amount of relevant &lt;strong&gt;knowledge&lt;/strong&gt; learnt during the project&lt;/em&gt;. This allowed me to look at the past with a different perspective, seeing things that I probably overlooked in the past. From the perspective of learning, the key factors that most influenced the outcome were:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Team attitude&lt;/li&gt;&lt;li&gt;Motivation&lt;/li&gt;&lt;li&gt;Context.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Team attitude is a tricky definition. Because it states 2 different things: that the attitude is relevant, and that I actually need a team. Of course I’ve learnt a lot &lt;em&gt;also&lt;/em&gt; in projects where I was a lone consultant: I did some stuff, I solved some problems, I spent some time thinking about what I actually did. But the real massive amount of learning happened in projects where I had the chance to solve complex problems &lt;em&gt;as a team&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Interestingly I couldn’t find any connection to the role I was playing at that time. Didn’t really made a difference if I was a junior developer or a project manager, or a senior architect. Didn’t really made a difference if I was supposed to be managed or managing (I hate this definition, but that used to be the past). Didn’t really made a difference if I was supposed to &lt;em&gt;learn&lt;/em&gt; from the colleagues or to &lt;em&gt;teach&lt;/em&gt; them something.&lt;/p&gt;&lt;p&gt;The one single thing that made a lot of difference was the attitude me and my colleagues shared in those difficult projects.&lt;/p&gt;&lt;h2&gt;Learning attitude patterns&lt;/h2&gt;&lt;p&gt;People made a lot of difference also in the business outcome of the project (yes, that boring on-time and on-budget part) but could give me from the very beginning a grasp about what I was going to expect. Let’s make some examples with somewhat stereotypical approaches.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;“I know what I am talking about” &lt;/strong&gt;that the kind of sentence often heard in organizations. To me, it means &lt;em&gt;“I don’t feel any need to improve”&lt;/em&gt;. I’ve met some person like this, but luckily they were not in my team. Sometimes they were part of the organization we were supposed to work for, almost always they were part of the problem. I don’t want hem in my team. Plain and simple.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;“That’s all clear to me”&lt;/strong&gt; ... No. It isn’t. People that for some reasons &lt;em&gt;pretend&lt;/em&gt; they’ve understood everything needed to solve the problem, are part of the problem as well. Quite often, under the surface they look for hints about what the boss said, and keep pretending that everything is fine. Walking timebombs.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;“I have no clue about what we’re going to do”&lt;/strong&gt; Now we’re talking! The most effective colleagues I’ve worked with always started the project with fear. They called me out for a one on one talk, and with fearful eyes told me &lt;em&gt;“I know absolutely nothing about the topic of this project”&lt;/em&gt;, and - believe me - their faces were even better when I answered honestly &lt;em&gt;“I have no idea about it either”&lt;/em&gt;. But that conversation was &lt;strong&gt;honest&lt;/strong&gt;, we defined a common ground, and we started learning collaboratively assuming that we didn’t know all the things and that we needed to share information to solve a common problem.&lt;/p&gt;&lt;p&gt;Confront this profile with the previous two. Would you share information with those colleagues also? A lot less, ...they won’t need it anyway: they (pretended/assumed) that they already know the stuff. They basically shut themselves out from any possibility of collaborative learning.  Ok, that’s basically Socrates statement: &lt;em&gt;“The real wise man is the one that knows that he doesn’t know”&lt;/em&gt;. &lt;em&gt;...But not only. &lt;/em&gt;&lt;/p&gt;&lt;h2&gt;Focusing efforts in the right direction&lt;/h2&gt;&lt;p&gt;What’s striking me more and more, is that the attitude we had sometime towards learning new things as a team, was incredibly effective also because it was efficient. We din’t &lt;em&gt;waste&lt;/em&gt; any time in pretending that we were better than we really were. We did have a massive amount of work to do, but we didn’t have any &lt;strong&gt;&lt;em&gt;knowledge debt&lt;/em&gt;&lt;/strong&gt;, and we didn’t spend a second studying &lt;em&gt;things that people around me expect me to know but I don’t&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Don’t you smell something familiar here? It smells like &lt;em&gt;your dirty little secret&lt;/em&gt; to me. Make me think about movies where one of the characters did something wrong in the past and lives in the fear of being blackmailed... Ignoring a key skill, it’s not as bad as committing a crime, but the mechanics in our mind are not that different. Our brain start working in &lt;em&gt;“I can’t let them discover my secret" &lt;/em&gt;mode&lt;em&gt;, &lt;/em&gt;which is a dangerous slope: it makes you feel like “I am not the person they expect”.&lt;/p&gt;&lt;p&gt;It doesn’t matter how bad is our secret, the mechanics are similar: &lt;em&gt;shame&lt;/em&gt; and &lt;em&gt;fear of humiliation&lt;/em&gt; (even if only at the coffee machine level) are powerful triggers, and would lead to the wrong behavior, and also to&lt;em&gt; learn less&lt;/em&gt; in the long run. Because stress is preventing from effective learning, because one can’t enjoy collaborative learning, and because a lot of time won’t be dedicated to learning but just to &lt;em&gt;cover-my-ass&lt;/em&gt; activities which are brain draining (how many brain cycles are you spending deleting compromising SMS from your phone or wondering if your girlfriend can actually see what you posted on &lt;em&gt;that other girl'&lt;/em&gt;s wall on Facebook?).&lt;/p&gt;&lt;p&gt;To be honest, in a software project, your fault (if we want to call it like that) is really little. Telling that you’ve actually never understood OOP, or that you’ve never actually shipped anything to production isn’t a &lt;em&gt;fault&lt;/em&gt;, it’s just a honest starting point. Stating where you are exactly and honestly right now would save you and your team a lot of troubles in the future.&lt;/p&gt;&lt;p&gt;When is the moment of staffing the team for a new project. Now I know exactly what I want. I want people with the right learning attitude.&lt;/p&gt;&lt;h2&gt;Only knowledge gap?&lt;/h2&gt;&lt;p&gt;Not really. The more I look into the problem, the more I realize that the mechanics are the same whether it is &lt;em&gt;knowledge&lt;/em&gt; or &lt;em&gt;learning debt&lt;/em&gt;, &lt;em&gt;technical debt&lt;/em&gt; or &lt;em&gt;motivational debt&lt;/em&gt;. Failing to acknowledge where we really are only exacerbates the problem.  But that’s a topic for a whole new post. I also didn’t say much about &lt;em&gt;motivation&lt;/em&gt; and &lt;em&gt;context&lt;/em&gt;... Stay tuned.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-3158347220924404432?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/geVZQJEIxkI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/3158347220924404432/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=3158347220924404432" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3158347220924404432?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3158347220924404432?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2011/11/denial-won-help-you-learning.html" title="Denial won&amp;#39;t help you learning" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DEICQ38yeCp7ImA9Wx9aFU4.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-473215397419284882</id><published>2011-03-07T23:22:00.001+01:00</published><updated>2011-03-07T23:22:42.190+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-07T23:22:42.190+01:00</app:edited><title>See the Forest and the trees with Kanban</title><content type="html">I uploaded the slides of my presentation about Kanban that I gave at last UGI Alt.Net Conf in Milan.&lt;div style="width:425px" id="__ss_7169759"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/ziobrando/forest-and-trees-with-kanban" title="Forest and trees with kanban"&gt;Forest and trees with kanban&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse7169759" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=forestandtreeswithkanban-110306155156-phpapp01&amp;stripped_title=forest-and-trees-with-kanban&amp;userName=ziobrando" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse7169759" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=forestandtreeswithkanban-110306155156-phpapp01&amp;stripped_title=forest-and-trees-with-kanban&amp;userName=ziobrando" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ziobrando"&gt;Alberto Brandolini&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-473215397419284882?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/EFOXV_BqpeQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/473215397419284882/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=473215397419284882" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/473215397419284882?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/473215397419284882?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2011/03/see-forest-and-trees-with-kanban.html" title="See the Forest and the trees with Kanban" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0IFRXgzeCp7ImA9Wx5bEEQ.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-2910212496876323301</id><published>2010-10-17T10:13:00.001+02:00</published><updated>2010-10-26T15:25:14.680+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-26T15:25:14.680+02:00</app:edited><title>Loosely Coupled Complexity - Unleash the power of your Domain Model with Command Query Responsibility Segregation and Event Sourcing</title><content type="html">Here are the slides of my presentation about CQRS and Event Sourcing, that I gave at NHibernate Day in Bologna last week.&lt;div style="width:425px" id="__ss_5459541"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/ziobrando/loosely-coupled-complexity-unleash-the-power-of-your-domain-model-with-command-query-responsibility-segregation-and-event-sourcing" title="Loosely Coupled Complexity - Unleash the power of your Domain Model with Command Query Responsibility Segregation and Event Sourcing"&gt;Loosely Coupled Complexity - Unleash the power of your Domain Model with Command Query Responsibility Segregation and Event Sourcing&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5459541" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cqrseventsourcing-101016055756-phpapp02&amp;stripped_title=loosely-coupled-complexity-unleash-the-power-of-your-domain-model-with-command-query-responsibility-segregation-and-event-sourcing&amp;userName=ziobrando" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5459541" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cqrseventsourcing-101016055756-phpapp02&amp;stripped_title=loosely-coupled-complexity-unleash-the-power-of-your-domain-model-with-command-query-responsibility-segregation-and-event-sourcing&amp;userName=ziobrando" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ziobrando"&gt;Alberto Brandolini&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;And if you're masochistic enough to stand my accent ...here is the &lt;a href="http://vimeo.com/16054927"&gt;video&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-2910212496876323301?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/ivsZjTL6q_Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/2910212496876323301/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=2910212496876323301" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/2910212496876323301?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/2910212496876323301?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2010/10/loosely-coupled-complexity-unleash.html" title="Loosely Coupled Complexity - Unleash the power of your Domain Model with Command Query Responsibility Segregation and Event Sourcing" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DEYNR3k9fCp7ImA9Wx5VGEU.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-3355150002994731986</id><published>2010-10-12T14:23:00.001+02:00</published><updated>2010-10-12T14:23:16.764+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-12T14:23:16.764+02:00</app:edited><title>DDD Reference Links</title><content type="html">&lt;p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 28.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;﻿Further references&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Books&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Domain Driven Design - Eric Evans (Addison Wesley)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;The official starting point for Domain Driven Design, covering the topic form tactical to strategical.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Applying Domain-Driven Design and Patterns (Addison Wesley)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;A more implementation related approach focusing on the mechanics of the implementation of tactical DDD with C# and .Net. &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;DDD Quickly&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;A free dowloadable smaller reference for Tactical DDD from InfoQ&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://www.infoq.com/minibooks/domain-driven-design-quickly"&gt;http://www.infoq.com/minibooks/domain-driven-design-quickly&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Domain Driven Design website&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;New official website for Domain Driven Design. Aggregator for further resources, informations, discussion and events&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://domaindrivendesign.org"&gt;http://domaindrivendesign.org&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;/&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Domain Driven Design User Group&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;This is the place where the most interesting discussions are hosted&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://tech.groups.yahoo.com/group/domaindrivendesign/"&gt;http://tech.groups.yahoo.com/group/domaindrivendesign/&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Italian Domain Driven Design group&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://it.groups.yahoo.com/group/DDD-IT/"&gt;http://it.groups.yahoo.com/group/DDD-IT/&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Eric Evans interviews and talks on InfoQ&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://www.infoq.com/interviews/domain-driven-design-eric-evans"&gt;http://www.infoq.com/interviews/domain-driven-design-eric-evans&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://www.infoq.com/presentations/model-to-work-evans"&gt;http://www.infoq.com/presentations/model-to-work-evans&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://www.infoq.com/articles/eric-evans-ddd-matters-today"&gt;http://www.infoq.com/articles/eric-evans-ddd-matters-today&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://www.infoq.com/presentations/strategic-design-evans"&gt;http://www.infoq.com/presentations/strategic-design-evans&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://www.infoq.com/presentations/ddd-dsl-evans"&gt;http://www.infoq.com/presentations/ddd-dsl-evans&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;DDD sample Application&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;A working implementation of DDD principles in SpringMVC plus Hibernate, maintained by Swedish company Citerus.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://dddsample.sourceforge.net"&gt;http://dddsample.sourceforge.net&lt;/a&gt;&lt;/span&gt;&lt;span style="letter-spacing: 0.0px color;"&gt;/ &lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: 12px;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: 18px;"&gt;&lt;strong&gt;CQRS &amp;amp; Event Sourcing&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;I needed a separate page for that:&lt;/p&gt;&lt;p&gt;&lt;a href="http://ziobrando.blogspot.com/2010/10/cqrs-event-sourcing-reference-links.html"&gt;http://ziobrando.blogspot.com/2010/10/cqrs-event-sourcing-reference-links.html&lt;/a&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;DDD, TDD &amp;amp; BDD&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;The three amigos: DDD, TDD &amp;amp; BDD Presentation by Gojko Adzic&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #1022a3;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://skillsmatter.com/podcast/design-architecture/ddd-tdd-bdd"&gt;http://skillsmatter.com/podcast/design-architecture/ddd-tdd-bdd&lt;span style="text-decoration: underline; letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;Gojko Adzic’s Blog: &lt;a href="http://gojko.net/"&gt;&lt;span style="font: 12.0px Helvetica; text-decoration: underline; letter-spacing: 0.0px color;"&gt;http://gojko.net/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Context mapping&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Strategic Domain Driven Design with Context mapping&lt;/strong&gt; (My article on InfoQ)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #1022a3;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://www.infoq.com/articles/ddd-contextmapping"&gt;http://www.infoq.com/articles/ddd-contextmapping&lt;span style="text-decoration: underline; letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Context Mapping in Action&lt;/strong&gt; - Presentation by Alberto Brandolini&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #1022a3;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://skillsmatter.com/podcast/design-architecture/context-mapping-in-action"&gt;http://skillsmatter.com/podcast/design-architecture/context-mapping-in-action&lt;span style="text-decoration: underline; letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Articles&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;About entities, aggregates and data duplication - Alberto Brandolini’s blog&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #1022a3;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://ziobrando.blogspot.com/2010/06/about-entities-aggregates-and-data.html"&gt;http://ziobrando.blogspot.com/2010/06/about-entities-aggregates-and-data.html&lt;span style="text-decoration: underline; letter-spacing: 0.0px color;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Random Links&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;Kent Beck blog entry on why writing maintainable software matters.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #0e1f99;"&gt;&lt;span style="text-decoration: underline; letter-spacing: 0.0px;"&gt;&lt;a href="http://www.threeriversinstitute.org/blog/?p=104"&gt;http://www.threeriversinstitute.org/blog/?p=104&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Some more related or interesting books&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Patterns of Enterprise Application Architecture - Martin Fowler&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Analysis Patterns - Martin Fowler&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Growing Object Oriented Software, guided by tests - Steve Freeman &amp;amp; Nat Pryce&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;The Pragmatic Programmer - Dave Thomas and Andy Hunt&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Clean Code - Robert C. Martin&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Agile Software Development, Pattern Principles and Patterns&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Lean Software Development - Mary and Tom Poppendieck&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Test Driven Development by Example - Kent Beck&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;Collaboration Explained - Jean Tabaka&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="letter-spacing: 0.0px;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-3355150002994731986?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/7E5KaBSbVGU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/3355150002994731986/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=3355150002994731986" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3355150002994731986?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3355150002994731986?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2010/10/ddd-reference-links.html" title="DDD Reference Links" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEUBRHY5fSp7ImA9Wx5UFU0.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-6804606910445999473</id><published>2010-10-12T14:21:00.001+02:00</published><updated>2010-10-19T17:30:55.825+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-19T17:30:55.825+02:00</app:edited><title>CQRS &amp; Event Sourcing Reference Links</title><content type="html">&lt;h2&gt;﻿CQRS &amp;amp; Event Sourcing&lt;/h2&gt;&lt;h3&gt;&lt;a href="http://groups.google.com/group/dddcqrs"&gt;DDD/CQRS Mailing list&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="http://cqrs.wordpress.com/"&gt;&lt;strong&gt;The official CQRS Website&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;Interviews&lt;/h4&gt;&lt;strong&gt;Eric’s interview to Greg Young&lt;/strong&gt;&lt;a href="http://www.infoq.com/interviews/Architecture-Eric-Evans-Interviews-Greg-Young"&gt;http://www.infoq.com/interviews/Architecture-Eric-Evans-Interviews-Greg-Young&lt;/a&gt;&lt;p&gt;&lt;a href="http://www.udidahan.com/2009/12/09/clarified-cqrs/"&gt;&lt;strong&gt;Clarified CQRS&lt;/strong&gt;&lt;/a&gt; - Article by Udi Dahan&lt;/p&gt;&lt;h4&gt;Presentations&lt;/h4&gt;&lt;strong&gt;Command Query Responsibility Segregation&lt;/strong&gt; - Presentation by Udi Dahan&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/Command-Query-Responsibility-Segregation"&gt;http://www.infoq.com/presentations/Command-Query-Responsibility-Segregation&lt;/a&gt;&lt;strong&gt;Avoid a failed SOA&lt;/strong&gt; - Presentation by Udi Dahan&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/SOA-Business-Autonomous-Components"&gt;http://www.infoq.com/presentations/SOA-Business-Autonomous-Components&lt;/a&gt;&lt;h3&gt;Event Sourcing&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Event Sourcing definition&lt;/strong&gt; by Martin Fowler &lt;/p&gt;&lt;a href="http://martinfowler.com/eaaDev/EventSourcing.html"&gt;http://martinfowler.com/eaaDev/EventSourcing.html&lt;/a&gt;&lt;p&gt;&lt;strong&gt;Innovation and Event Sourcing&lt;/strong&gt; - Greg Young presentation&lt;/p&gt;&lt;a href="http://skillsmatter.com/podcast/design-architecture/architectural-innovation-eventing-event-sourcing"&gt;http://skillsmatter.com/podcast/design-architecture/architectural-innovation-eventing-event-sourcing&lt;/a&gt;&lt;h3&gt;Code References&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Super Simple CQRS Example&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://codebetter.com/blogs/gregyoung/archive/2010/08/31/super-simple-cqrs-example.aspx"&gt;http://codebetter.com/blogs/gregyoung/archive/2010/08/31/super-simple-cqrs-example.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-6804606910445999473?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/dyplwmTlaBw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/6804606910445999473/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=6804606910445999473" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/6804606910445999473?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/6804606910445999473?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2010/10/cqrs-event-sourcing-reference-links.html" title="CQRS &amp;amp; Event Sourcing Reference Links" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;D0UNSXs8fip7ImA9WxFVFkU.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-3322098038937645080</id><published>2010-06-16T09:35:00.002+02:00</published><updated>2010-06-16T12:48:18.576+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-16T12:48:18.576+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="development process" /><category scheme="http://www.blogger.com/atom/ns#" term="BDD" /><category scheme="http://www.blogger.com/atom/ns#" term="Domain Driven Design" /><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="Acceptance tests" /><title>Agile Testing UK meetup</title><content type="html">&lt;p&gt;While in England for DDD Exchange, I caught the opportunity to participate in a meetup of the UK Agile Testing community. &lt;a href="http://gojko.net/"&gt;Gojko Adzic&lt;/a&gt; led a very interesting workshop about how to write acceptance tests.&lt;/p&gt;&lt;p&gt;Neil McLaughlin, who happened to be in my team in the hands-on simulation wrote a &lt;a href="http://blog.mittenview.co.uk/2010/06/reflections-on-tonights-agile-testing.html"&gt;nice report&lt;/a&gt; on the evening, and then Gojko himself &lt;a href="http://gojko.net/2010/06/16/anatomy-of-a-good-acceptance-test/"&gt;posted about what he showed us&lt;/a&gt;. I'll try add something, from the participant perspective.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;The developer mindset&lt;/h2&gt;&lt;p&gt;Given we had quite a few people in the room, around 60, it was really interesting to note all different behaviors, but there were also some striking similarities. Most of the discussion we had were focused on&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Formal correctness of the test&lt;/li&gt;&lt;li&gt;Splitting tests to be testing one concern at that time&lt;/li&gt;&lt;li&gt;avoiding duplication in test fixture setup&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;When discussing the outcome, Gojko pointed out that the main concern for acceptance tests was &lt;em&gt;readability&lt;/em&gt;, instead. Readability is a subjective evaluation criteria, and might lead to a not-so-precise definition about how to make it &lt;em&gt;right&lt;/em&gt;. But that's the only way to write a &lt;em&gt;useful&lt;/em&gt; acceptance test. But the developer's mindset really had a strong influence on us, it was really hard to give up.&lt;/p&gt;&lt;h2&gt;Constrained by the tools&lt;/h2&gt;&lt;p&gt;Despite &lt;a href="http://skillsmatter.com/"&gt;Skills Matter&lt;/a&gt; (that was hosting the evening) doing a fantastic job in providing an impressive amount of whiteboards for all the team, some of the discussions were constrained by the amount of space available on the whiteboard, so we ended up pruning some concerns, thinking they were of little value to the discussion. It turned out we were wrong.&lt;/p&gt;&lt;p&gt;But, as I said, we had an amount of writable space that was a lot larger than what I normally found in a typical workplace... and &lt;em&gt;still this was constraining us&lt;/em&gt;. Buying one more whiteboard is cheap, making wrong assumptions because of writable space constraints is a lot more costly.&lt;/p&gt;&lt;h2&gt;We're problem solvers, after all&lt;/h2&gt;&lt;p&gt;During the exercise, Gojko was wandering around from one team to another one, playing the role of the &lt;em&gt;Domain Expert&lt;/em&gt;. However, most of the teams seemed more interested in his &lt;em&gt;Teacher&lt;/em&gt; role and asked some questions about &lt;em&gt;how to solve the exercise&lt;/em&gt;, but barely none about ambiguities in the domain. We preferred to use &lt;em&gt;assumptions&lt;/em&gt; instead.&lt;/p&gt;&lt;p&gt;Even if I knew the trick, it worked on me as well. But it's scary to note that even when writing acceptance tests, which are a lot more translation than design, our built-in problem solving brain leads us so easily on the road of &lt;em&gt;guessing&lt;/em&gt; instead of &lt;em&gt;asking&lt;/em&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-3322098038937645080?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/T-E4hyQAQN4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/3322098038937645080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=3322098038937645080" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3322098038937645080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3322098038937645080?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2010/06/agile-testing-uk-meetup.html" title="Agile Testing UK meetup" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0AEQ3c5eCp7ImA9WxFVFko.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-4976440352006489792</id><published>2010-06-15T18:41:00.006+02:00</published><updated>2010-06-16T11:15:02.920+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-16T11:15:02.920+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="Domain Driven Design" /><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="OOD" /><title>About Entities, Aggregates and Data Duplication.</title><content type="html">&lt;p&gt;There's been an interesting discussion about Aggregates on the Italian DDD mailing lists. When things become complex, a simple example might just turn too simple. So I came up with this medium-sized one. Hope it won't be too long. Ok, so let's start from our first User Story&lt;/p&gt;&lt;p&gt;&lt;cite&gt;&lt;strong&gt;User Story #1: Placing an order&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;As a&lt;/strong&gt; Customer&lt;br /&gt;&lt;strong&gt;I Want to&lt;/strong&gt; place an order&lt;br /&gt;&lt;strong&gt;In order to&lt;/strong&gt; purchase some goods&lt;br /&gt;&lt;/cite&gt;&lt;/p&gt;&lt;p&gt;The simplest implementation of the story is essentially &lt;em&gt;stateless&lt;/em&gt;: every time a customer wants to order something, needs to re-enter the data. In the DDD perspective, the resulting model is based on a single &lt;em&gt;aggregate&lt;/em&gt; (we're deliberately ignoring the catalog for now) whose &lt;em&gt;root&lt;/em&gt; is the &lt;strong&gt;Order&lt;/strong&gt; class.&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://lh6.ggpht.com/_miciPvwKRf0/TBetMNAOK5I/AAAAAAAAAPY/BRaQPx-Fyp0/DDD%20order%20story%201.1.jpg?imgmax=800" border="0" alt="DDD order story 1.1.jpg" width="447" height="419" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The stateless nature of the service makes it really easy to implement: a &lt;strong&gt;Customer&lt;/strong&gt; is just a &lt;em&gt;Value Object&lt;/em&gt;, created and eventually dropped at needs. Also we took some shortcut: we've chosen to implement Address as a String. &lt;strong&gt;Item&lt;/strong&gt; is sort of &lt;em&gt;natural value object&lt;/em&gt;, while &lt;strong&gt;LineItem&lt;/strong&gt; is somewhat in the middle: we can change quantities, while the order is in open state, but we can implement this also using droppable &lt;em&gt;Value Objects&lt;/em&gt;, easing the integrity burden for the aggregate root.&lt;/p&gt;&lt;p&gt;Some businesses (like buying train tickets) might just work like this, but our marketing is more inclined to manage customers in a more long-term way, so here are two more user stories.&lt;/p&gt;&lt;p&gt;&lt;cite&gt;&lt;strong&gt;User Story #2: Returning customer&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;As a&lt;/strong&gt; Customer&lt;br /&gt;&lt;strong&gt;I Want to&lt;/strong&gt; retrieve my profile&lt;br /&gt;&lt;strong&gt;In order to&lt;/strong&gt; place more orders&lt;/cite&gt;&lt;/p&gt;&lt;p&gt;Story &lt;em&gt;&lt;strong&gt;#2&lt;/strong&gt;&lt;/em&gt; breaks our assumption about the aggregate boundaries. If we stick to the aggregate &lt;em&gt;rule-of-thumb&lt;/em&gt;, if we want to delete an &lt;strong&gt;Order&lt;/strong&gt;, we probably don't want to delete also the corresponding &lt;strong&gt;Customer&lt;/strong&gt;. So we need a separate aggregate for that.﻿ What would happen if we decide to delete a Customer? Should we delete all orders? We don't have enough information to answer that, yet, we'll mark it as an outstanding question for our next meeting with the domain expert. Let's try the model with two aggregates and see how does it perform.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;cite&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_miciPvwKRf0/TBetOT5HeKI/AAAAAAAAAPc/NcFUS-uAbxo/DDD%20order%20story%202.2.jpg?imgmax=800"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 450px;" src="http://lh4.ggpht.com/_miciPvwKRf0/TBetOT5HeKI/AAAAAAAAAPc/NcFUS-uAbxo/DDD%20order%20story%202.2.jpg?imgmax=800" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/cite&gt;&lt;cite&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/cite&gt;&lt;/p&gt;&lt;p&gt;We now have a relationship crossing the &lt;em&gt;aggregate boundary&lt;/em&gt;. We have promoted &lt;strong&gt;Customer&lt;/strong&gt; to become the &lt;em&gt;root&lt;/em&gt; of the newly created &lt;em&gt;aggregate&lt;/em&gt;, so there is no potential integrity violation. Still we have to watch it closely, because this is where problems related to lazy/eager loading  will arise. We also added username and password to &lt;strong&gt;Customer.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;&lt;strong&gt;User Story #3: Different shipping address&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;As a&lt;/strong&gt; Customer&lt;br /&gt;&lt;strong&gt;I Want to&lt;/strong&gt; specify a valid shipping address&lt;br /&gt;&lt;strong&gt;In order to&lt;/strong&gt; ship to a different destination﻿&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Multiple addresses are a call for a separate type to manage &lt;strong&gt;Address.&lt;/strong&gt; We don't have so many responsibilities so far, for this class, except validation (which as Udi Dahan would say, doesn't necessarily belong to the domain layer) but the smell of duplication is probably enough to go for a separate class.  We try to keep the model as simple as possible, so we treat &lt;strong&gt;Address&lt;/strong&gt; like a &lt;em&gt;value object&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://lh4.ggpht.com/_miciPvwKRf0/TBes_-pt2JI/AAAAAAAAAPI/7Nj0vOIlXTM/DDD%20order%20story%203.jpg?imgmax=800" border="0" alt="DDD order story 3.jpg" width="450" /&gt;&lt;/p&gt;&lt;p&gt;&lt;cite&gt;&lt;strong&gt;User Story #4: Editable customer profile&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;As a&lt;/strong&gt; Customer&lt;br /&gt;&lt;strong&gt;I Want to&lt;/strong&gt; edit my profile&lt;br /&gt;&lt;strong&gt;In order to&lt;/strong&gt; update it if needed&lt;br /&gt;&lt;/cite&gt;&lt;/p&gt;&lt;p&gt;Story #4 makes explicit what we've been suspecting: &lt;strong&gt;Customer&lt;/strong&gt; needs to be an &lt;em&gt;entity&lt;/em&gt;, because it has a nontrivial lifecycle. No revolutions at Domain Model level, but this triggers a question: &lt;em&gt;"What happens if  I have an outstanding order and the customer changes its data before the order is dispatched?"&lt;/em&gt; This is the type of questions you don't want to answer as software developer. So we walk up the stairs to have a talk with the Domain Expert. We come back with two fresh user stories:&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;&lt;strong&gt;User Story #5: Specify Billing and Shipping address&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;As a&lt;/strong&gt; Customer&lt;br /&gt;&lt;strong&gt;I Want to&lt;/strong&gt; specify independent billing and shipping addresses&lt;br /&gt;&lt;strong&gt;In order to&lt;/strong&gt; deliver goods to different locations&lt;/span&gt;&lt;/p&gt;&lt;p&gt;This one is relatively easy: just reinforcing our design. We'll now have two references from &lt;strong&gt;Order&lt;/strong&gt; to &lt;strong&gt;Address&lt;/strong&gt;, which are managed by the &lt;strong&gt;Customer&lt;/strong&gt;. We just store a default &lt;strong&gt;Address &lt;/strong&gt;in the &lt;strong&gt;Customer&lt;/strong&gt; aggregate (we could do better) but's ok for now.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://lh3.ggpht.com/_miciPvwKRf0/TBetESP-2hI/AAAAAAAAAPM/jxQ2zU9OTOQ/DDD%20order%20story%205.jpg?imgmax=800" border="0" alt="DDD order story 5.jpg" width="450"  /&gt;&lt;/p&gt;&lt;p&gt;Story #6 is a little trickier, it comes from the legal department and tell us what we probably expected.&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;"&gt;&lt;strong&gt;User Story #6: Track past orders&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;As a&lt;/strong&gt; Legal Department&lt;br /&gt;&lt;strong&gt;I Want to&lt;/strong&gt; track orders&lt;br /&gt;&lt;strong&gt;In order to&lt;/strong&gt; in order to manage litigations&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The domain expert state it clear: once an order is placed, it can't be changed in any of its parts, be it the content or the &lt;strong&gt;Customer&lt;/strong&gt;. In case of litigation, it must behave &lt;em&gt;exactly like printed paper&lt;/em&gt;. But &lt;strong&gt;Customer&lt;/strong&gt; does not, its &lt;em&gt;lifecycle&lt;/em&gt; is different from our needs, we'd need a separate class for that. We're lacking fantasy and call it &lt;strong&gt;CustomerData&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" src="http://lh5.ggpht.com/_miciPvwKRf0/TBetJyayyLI/AAAAAAAAAPU/Ajzh8HtSq4s/DDD%20order%20story%206.jpg?imgmax=800" border="0" alt="DDD order story 6.jpg" width="450"  /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Everything is looking a lot different from the beginning. The two aggregates are now largely decoupled: we can change or delete an order without affecting the customer or deleting or unregistering a customer without losing tracks of its past orders. On the other hand we have explicit duplication here. &lt;strong&gt;Customer&lt;/strong&gt; and CustomerData look so similar we're feeling guilty. Did we violate DRY principle? At first look the data is the same, but if we think about &lt;em&gt;behavior&lt;/em&gt;, or class lifecycle, &lt;strong&gt;Customer&lt;/strong&gt; and &lt;strong&gt;CustomerData&lt;/strong&gt; are clearly two different beasts. But more often than not, when the starting point is the data model, instead of the domain model we end up thinking that's the same data, hence the same class. I bet experienced data modelers do not fall into these pitfalls as well, but I've seen these problems recurring quite often.&lt;/p&gt;&lt;p&gt;Once we accept that little bit of data duplication we have a system which is a lot easier to evolve and maintain, with aggregate roots as integrity enforcers within their boundaries, and agnostic about the rest.&lt;/p&gt;&lt;p&gt;To add some salt, don't forget aggregates are also building blocks of distributed systems: suppose we'll need to send orders to a remote system. Sending just the single &lt;em&gt;aggregate&lt;/em&gt; and the referenced value objects is probably the cleanest way.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-4976440352006489792?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/AKwl5MUbTG4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/4976440352006489792/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=4976440352006489792" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/4976440352006489792?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/4976440352006489792?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2010/06/about-entities-aggregates-and-data.html" title="About Entities, Aggregates and Data Duplication." /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_miciPvwKRf0/TBetMNAOK5I/AAAAAAAAAPY/BRaQPx-Fyp0/s72-c/DDD%20order%20story%201.1.jpg?imgmax=800" height="72" width="72" /><thr:total>11</thr:total></entry><entry gd:etag="W/&quot;A04ASH49fCp7ImA9WxFQEkk.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-2665722217810734467</id><published>2010-05-07T18:32:00.001+02:00</published><updated>2010-05-07T18:32:29.064+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-07T18:32:29.064+02:00</app:edited><title>Software ...e tutto ciò che comporta</title><content type="html">Here are the slides from my presentation in Better Software 2010. I tuned it up a bit, changed the grey text, added comments (in italian) and a couple of slides. Hope you'll enjoy it.&lt;br /&gt;&lt;div style="width:425px" id="__ss_4007768"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/ziobrando/software-e-tutto-ci-che-comporta" title="Software ...e tutto ciò che comporta"&gt;Software ...e tutto ciò che comporta&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4007768" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=softwareetuttocichecomportaafterbsw2010-100507110008-phpapp01&amp;stripped_title=software-e-tutto-ci-che-comporta" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4007768" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=softwareetuttocichecomportaafterbsw2010-100507110008-phpapp01&amp;stripped_title=software-e-tutto-ci-che-comporta" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ziobrando"&gt;Alberto Brandolini&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-2665722217810734467?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/EU42a7XiFWc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/2665722217810734467/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=2665722217810734467" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/2665722217810734467?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/2665722217810734467?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2010/05/software-e-tutto-cio-che-comporta.html" title="Software ...e tutto ciò che comporta" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkEAQ3wyeip7ImA9WxBWEU0.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-3354814767560199511</id><published>2010-02-02T09:50:00.001+01:00</published><updated>2010-02-02T09:50:42.292+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-02T09:50:42.292+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="User Experience" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="UX" /><title>Some thoughts on the iPad</title><content type="html">Last week the Net was in "full hype mode" for the launch of the latest Apple device. The outcome anyway is rather controversial, maybe expectations were set too high, leaving somebody down.&lt;br /&gt;&lt;br /&gt;Only time and revenues will tell who's right: but I think a few things that emerged from recent discussions are worth thinking about.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;It's all about being sexy&lt;/h1&gt;&lt;br /&gt;What's the ugliest part of an electronic device? Cables. They're messy, and despite every effort to make them look pleasant ...they are ugly, and probably always will. I suspect that the lack of connectors is a way to discourage users from plugging in many devices: famous actresses look a lot more ordinary without the make up. And they hate showing up in public if they have some imperfections on the skin. It's called &lt;em&gt;vanity&lt;/em&gt;. The best way to satisfy vanity is to make the iPad an &lt;strong&gt;essentially wireless device&lt;/strong&gt;. Cables are for losers, they're necessary, but only when nobody's watching.&lt;br /&gt;&lt;br /&gt;However, if you still feel like you need to upload pictures, &lt;em&gt;connect&lt;/em&gt; to external devices... you'll maybe end up buying another device like the AirPort.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Gestures matters&lt;/h2&gt;&lt;br /&gt;Some folks complained it's less than an iPhone. Wow ...it's big! Do you really would like to phone with a big device like this? It doesn't feel natural. Our body learned to associate gestures with situations, and we phone with small objects (like ...phones) and we read with bigger ones (like magazines, books and newspapers). I think the whole idea is to make the device feel &lt;em&gt;natural&lt;/em&gt;. Things or actions that wouldn't fit the device were simply not included.&lt;br /&gt;Looks like the whole idea is to be a device do be used on the couch. Relaxed, and quiet. Like ...reading a book, but not necessarily so.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;A pleasant experience&lt;/h2&gt;&lt;br /&gt;iBook and the relative store, are more than a hint that Apple is engaging Amazon in the book battle. Some friends noted that reading a book requires a different display, to be a pleasant experience for the eye. I think they're right on this. Sill the iPad is not a device to do one thing (as it is for Kindle) but to do many. And not all of them are necessarily known from the beginning.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;No multitasking&lt;/h2&gt;&lt;br /&gt;Some people consider the lack of multitasking capabilities as a key missing feature on the iPad. I think the opposite. Frequent interruptions are stressing, and to me the iPad looks like a thing to do one thing at a time (which by the way is the basic mantra of GTD, Kanban and so on). If you want to torture yourself by being continuously interrupted, a phone or a PC are the tools for you, and this is what you probably use for working. But if you want to please yourself, relaxing on the couch, the only other thing to do while using the iPad is probably having a glass of good wine. Or maybe that's the picture of you that will stick in your brain to make you buy that thing. &lt;br /&gt;I suspect that also the lack of a camera has something to do with that. I mean ...Apple put cameras in MacBooks ages ago: they know how to build devices with cameras. But the stressing feeling of being continuously reachable is what makes people hate cell phones. A device that allows you to surf/read &lt;em&gt;without being interrupted&lt;/em&gt; that often, could be loved by some. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;It's not for the geeks&lt;/h2&gt;&lt;br /&gt;Maybe I am a little bit too far on this, but I think the iPad is targeted to a part of the market that had been partially untouched from other Apple products. Think about the agenda: it really feels like a real agenda, with all the potential of an application. There are quite a few users that still prefer planning on paper rather than on a blackberry or an iPhone, cause &lt;em&gt;you don't see the whole picture there&lt;/em&gt;. More generally, geeks feel comfortable with complexity and multitasking. Many folks don't.&lt;br /&gt;&lt;br /&gt;I have to admit i bought the iPhone for 2 reasons: &lt;em&gt;learning&lt;/em&gt; and &lt;em&gt;vanity&lt;/em&gt;. The reasons I use it now are completely different, and I discovered them while using it. So I think it's still early to have a precise idea of the potential, and of the marketing success, but really looks like "less is more" has been a design driver this time.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-3354814767560199511?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/qlvNxdxYxOo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/3354814767560199511/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=3354814767560199511" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3354814767560199511?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3354814767560199511?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2010/02/some-thoughts-on-ipad.html" title="Some thoughts on the iPad" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkYFRno7eSp7ImA9WxBQE00.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-1574699732506155327</id><published>2010-01-12T15:52:00.002+01:00</published><updated>2010-01-12T15:55:17.401+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-12T15:55:17.401+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="User Experience" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="usability" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="UX" /><title>We can do better than this... Reloaded</title><content type="html">In the last Italian Agile Day I delivered an open presentation called "Possiamo fare di meglio" (this post's title is just the translation), where I raised some questions about the way we develop software. I then tried to summarize some of the things that emerged in the discussion &lt;a href="http://ziobrando.blogspot.com/2009/11/crowdsourcing-experiment.html"&gt;here&lt;/a&gt;, but there are still many things that are bouncing in my head...&lt;br /&gt;&lt;br /&gt;One thing that really disappoints me is the low quality of many software applications I have to deal with in my everyday life. Some days I really feel like I am &lt;em&gt;surrounded by crap&lt;/em&gt;. Just to make it clear what I am talking about: here is an excerpt of what a home banking service is asking me &lt;em&gt;every single operation I do&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;strong&gt;Choose the desired account:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;select name="menu" size="2"&gt;  &lt;option value="1"&gt;My Company Account&lt;/option&gt;  &lt;option value="2"&gt;(all the accounts)&lt;/option&gt;&lt;/select&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And every time I think: &lt;em&gt;"It's one account, it's just one account, it's always been just one account, so why on Earth you keep asking me this question every time! Couldn't you just take me straight to the account..."&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Some days I just feel like surrender, some other I see how some application are doing a fantastic job, on platforms like iPhone or on the web, and I feel like there's still some hope for us.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;There is still a lot to do&lt;/h2&gt;&lt;br /&gt;Despite all of our efforts, to introduce TDD and continuous integration, velocity based estimations and the like. There's a lot to do in other fields as well. Let me say it in another way: &lt;strong&gt;many companies are looking towards agile methodologies as a way to improve their &lt;em&gt;development processes&lt;/em&gt;, in order to &lt;em&gt;deliver software on time and on budget&lt;/em&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Doesn't sound that bad isn't it?&lt;br /&gt;&lt;br /&gt;It does. It doesn't mention the quality of the product. ...Oh, yes, we forgot, we need also tests to reduce our defect ratio. Tests are good, software quality is good, but still doesn't address the whole point. We should deliver &lt;strong&gt;better products&lt;/strong&gt;. Emphasis on the process itself would satisfy the managers' ancient need for schedules and predictable outcome, allowing teams to produce crap more efficiently, but would not produce better products unless some key points are specifically addressed.&lt;br /&gt;&lt;br /&gt;The most neglected areas at the moment - at least from my point of observation - are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;user's involvment,&lt;/li&gt;&lt;li&gt;understanding the domain complexity,&lt;/li&gt;&lt;li&gt;lack of an overall perspective,&lt;/li&gt;&lt;li&gt;inefficient learning during the product development lifecycle.&lt;/li&gt;&lt;/ol&gt;The items are not completely separated, in fact they're slightly overlapping, but I think these are the areas where as software developers we can (and must) improve a lot.&lt;br /&gt;&lt;br /&gt;In the next posts I'll dig deeper in these topics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-1574699732506155327?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/bnolaU_3K8w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/1574699732506155327/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=1574699732506155327" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/1574699732506155327?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/1574699732506155327?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2010/01/we-can-do-better-than-this-reloaded.html" title="We can do better than this... Reloaded" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CUYBQno_fCp7ImA9WxBRFk8.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-8077327727678192773</id><published>2010-01-04T17:28:00.004+01:00</published><updated>2010-01-04T17:39:13.444+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-04T17:39:13.444+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><title>New DDD training events in Bologna</title><content type="html">The first dates for Domain Driven Design classes in Bologna are finally published!&lt;br /&gt;&lt;div class="entry"&gt;&lt;div class="snap_preview"&gt;&lt;ul&gt;&lt;li&gt;1 introduction day, targeted to who want's to know what DDD is, on &lt;strong&gt;February 8th &lt;/strong&gt;(&lt;a href="http://avanscopertadddprimer08022010.eventbrite.com/"&gt;info &amp;amp; registration&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;4 days of workshop &lt;strong&gt;from February 9th to 12th &lt;/strong&gt; for practitioners that want to dig deeper and discuss (&lt;a href="http://avanscopertadddworkshop09022010.eventbrite.com/"&gt;info &amp;amp; registration&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The events will take place in Savoia Regency Hotel (well known to participants of last Italian Agile Day). Early bird till January 15th, and special discounts for Bologna XPUG menbers.&lt;br /&gt;&lt;/p&gt; &lt;/div&gt;          &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-8077327727678192773?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/Qk2SkHNcR0E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/8077327727678192773/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=8077327727678192773" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/8077327727678192773?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/8077327727678192773?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2010/01/new-ddd-training-events-in-bologna.html" title="New DDD training events in Bologna" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEIDQn4_fCp7ImA9WxBTGUU.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-8799831573855865058</id><published>2009-12-16T18:56:00.003+01:00</published><updated>2009-12-16T19:02:53.044+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-16T19:02:53.044+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Domain Driven Design" /><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="design patterns" /><title>DDD patterns as “elegant support”</title><content type="html">I've got quite a challenging response to &lt;a href="http://www.infoq.com/articles/ddd-contextmapping"&gt;my article about context mapping on InfoQ&lt;/a&gt;, that forced me to re-think about the article, and re-express some concepts, because some statements could have been misleading. I quickly mentioned the “classical” or “tactical” DDD patterns, such as &lt;span style="font-weight: bold;"&gt;Aggregates&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;Repositories&lt;/span&gt; and it looked like they’re the key to successful design. Well, they do help a lot, but the key to successfully implement a domain model is to understand the domain, achieving a &lt;span style="font-style: italic;"&gt;creative collaboration&lt;/span&gt; with the domain expert. Practically this produces a small, but sophisticated, domain model that deeply reflects our understanding of the domain and supports our future, business-driven, changes. It’s impressive to see how a well designed model can accommodate changes.&lt;br /&gt;&lt;br /&gt;So, the whole point is to keep your model tidy, small and clean. Most of the tactical DDD patterns serve the goal of keeping the domain model clean. Classes like &lt;span style="font-weight: bold;"&gt;Factories&lt;/span&gt; or &lt;span style="font-weight: bold;"&gt;Repositories&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;belong&lt;/span&gt; in the domain layer, have a well defined responsibility, but I think their overall purpose is to allow for the &lt;span style="font-style: italic;"&gt;cleanest possible programming style&lt;/span&gt; in &lt;span style="font-weight: bold;"&gt;Entities&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;Value&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Objects&lt;/span&gt;, where most of the domain behavior is coded. In a certain way, the whole system of patterns is a sort of &lt;span style="font-style: italic;"&gt;necessary scaffolding&lt;/span&gt; to allow the domain model to thrive. Patterns are not part of discussion with users and domain experts (this is pretty obvious, but ...zealots are zealots), they’re just part of the implementation. They allow the model to be &lt;span style="font-style: italic;"&gt;technology independent&lt;/span&gt;, or &lt;span style="font-style: italic;"&gt;decoupled&lt;/span&gt; from other portions of the application, they allow the model to be &lt;span style="font-style: italic;"&gt;easily tested&lt;/span&gt;. They allow for complexity to be managed in an &lt;span style="font-style: italic;"&gt;elegant and scalable way&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sometimes elegance might be a problem&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There is some aesthetic quality in a well crafted domain model. Some developers really like what a DDD model will look like. Guess what? I like it too. But that might deviate our attention to what really matters. Sometimes elegance has no business value, or better, is perceived to have none, by non-developers.&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;“We’re refactoring this architecture to make it more elegant”&lt;/li&gt;&lt;li&gt;“I don’t pay you to write Armani-dressed code! I want code that works and I want it fast!”&lt;/li&gt;&lt;/ul&gt;Has any of us developers being seduced by &lt;span style="font-style: italic;"&gt;the beauty of numbers&lt;/span&gt; in an Excel balance sheet from the finance department? I guess not. It’s just a different language. So, sometimes it’s better to express&lt;span style="font-style: italic;"&gt; “elegance”&lt;/span&gt; as &lt;span style="font-style: italic;"&gt;“reducing the cost of change”&lt;/span&gt;. Sounds a lot more like business, and a lot less like a disconnected geek spending the time tidying up the code (by the way also &lt;span style="font-style: italic;"&gt;cleanup&lt;/span&gt; doesn’t really work). We’ll still implement elegantly, but that’s our job.&lt;br /&gt;&lt;br /&gt;So if you’re enthusiastically embracing DDD and try to apply what you’ve read in the book, be careful not to transform yourself in a DDD pattern zealot. Their elegance might distract attention from the real goal: they’re helpful and often indispensable, but the real target is in the domain itself, and in it’s business value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-8799831573855865058?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/UcD0T_bVsxY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/8799831573855865058/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=8799831573855865058" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/8799831573855865058?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/8799831573855865058?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/12/ddd-patterns-as-elegant-support.html" title="DDD patterns as “elegant support”" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUMFQnk9eip7ImA9WxNaFks.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-4318587681280843422</id><published>2009-12-01T12:34:00.002+01:00</published><updated>2009-12-01T12:36:53.762+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-01T12:36:53.762+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="IAD2009" /><title>Video of my "Possiamo fare di meglio" speech is out.</title><content type="html">Big thanks to Yuri Valentini and all the friends from the Bologna XP User Group, for editing and posting the video. Here's the &lt;a href="http://blip.tv/file/2905907"&gt;link&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-4318587681280843422?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/8ct2tq1vkLI" height="1" width="1"/&gt;</content><link rel="related" href="http://blip.tv/file/2905907" title="Video of my &quot;Possiamo fare di meglio&quot; speech is out." /><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/4318587681280843422/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=4318587681280843422" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/4318587681280843422?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/4318587681280843422?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/12/video-of-my-possiamo-fare-di-meglio.html" title="Video of my &quot;Possiamo fare di meglio&quot; speech is out." /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0MMQn89fSp7ImA9WxNaEkg.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-7968983110053251208</id><published>2009-11-26T17:02:00.002+01:00</published><updated>2009-11-26T17:04:43.165+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-26T17:04:43.165+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="User Experience" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="software development" /><category scheme="http://www.blogger.com/atom/ns#" term="UX" /><category scheme="http://www.blogger.com/atom/ns#" term="IAD2009" /><title>Shared the Agile Day Presentation</title><content type="html">The Slideshare version of my "Possiamo fare di meglio" (we can do better than this) presentation, is now available (in Italian) &lt;a href="http://www.slideshare.net/ziobrando/possiamo-fare-di-meglio"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I did my best to add comments to the many pictures, sooner or later also the video version will be available.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-7968983110053251208?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/6Z2Y8zKFQjU" height="1" width="1"/&gt;</content><link rel="related" href="http://www.slideshare.net/ziobrando/possiamo-fare-di-meglio" title="Shared the Agile Day Presentation" /><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/7968983110053251208/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=7968983110053251208" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/7968983110053251208?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/7968983110053251208?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/11/shared-agile-day-presentation.html" title="Shared the Agile Day Presentation" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0AMQn85eSp7ImA9WxNaEUk.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-5026183781931052322</id><published>2009-11-25T10:32:00.002+01:00</published><updated>2009-11-25T10:36:23.121+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-25T10:36:23.121+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="articles" /><category scheme="http://www.blogger.com/atom/ns#" term="Context Mapping" /><title>Article on DDD Context Mapping is out on InfoQ</title><content type="html">We've been talking about Context Mapping quite a lot in the last days, I was also writing a lot in the meanwhile. The article I wrote for &lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt; is finally &lt;a href="http://www.infoq.com/articles/ddd-contextmapping"&gt;live&lt;/a&gt;.&lt;br /&gt;Thanks to Srini Penchikala for taking care of me and of my messy review process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-5026183781931052322?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/iW0fhtqOD7E" height="1" width="1"/&gt;</content><link rel="related" href="http://www.infoq.com/articles/ddd-contextmapping" title="Article on DDD Context Mapping is out on InfoQ" /><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/5026183781931052322/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=5026183781931052322" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/5026183781931052322?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/5026183781931052322?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/11/article-on-ddd-context-mapping-is-out.html" title="Article on DDD Context Mapping is out on InfoQ" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;C0MER3Y9eCp7ImA9WxNaEE0.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-3500229573857696465</id><published>2009-11-23T19:30:00.002+01:00</published><updated>2009-11-23T19:36:46.860+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-23T19:36:46.860+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="User Experience" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="UX" /><category scheme="http://www.blogger.com/atom/ns#" term="IAD2009" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><title>A crowdsourcing experiment</title><content type="html">Like one year ago, I decided to give my talk at Italian Agile Day as an open session with roughly the same schema: 15-20 minutes of impact talk, and 30 minutes of open discussion. I like this type of sessions because it’s not a &lt;span style="font-style: italic;"&gt;“I know the truth”&lt;/span&gt; approach (I don't), but rather a way to make a small portion of a possible truth emerge from anyone in the room. So, even if I had some answers in mind, I preferred to focus on the &lt;span style="font-style: italic;"&gt;questions&lt;/span&gt;, leaving the answers eventually open. I’ve seen some open sessions, but it’s not the kind of things that you practice every week (unless you’re leading a talk show), so please forgive me if it anything went wrong. Personally, I think it went a lot better than the year before: the discussion flew naturally and touched many of the topics I wanted to touch.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;See it in another way&lt;/span&gt;&lt;br /&gt;Ok, now think of me like Dr.Evil, with a “&lt;span style="font-style: italic;"&gt;masterplan&lt;/span&gt;”: I’ve managed to hire about 200 among the best IT professionals I know as consultants for one hour. Basically for free. That’s my crowdsourcing experiment. And I had the feeling of so many little things emerged. Maybe not so clearly, maybe not so well formed or well expressed, but enough to make me think a lot in the following days.&lt;br /&gt;&lt;br /&gt;On the way home, and later in the weekend some thoughts were a little clearer. I guess my personal follow up is worth sharing: at least ...I owe it to the participants. :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;We’re making products, not software&lt;/span&gt;&lt;br /&gt;Software is what we know, what we like to write, what we learned to produce. Some of us are really good in writing software, or in making their team write good software. That’s only half of the story: from the user perspective we see a &lt;span style="font-weight: bold;"&gt;product&lt;/span&gt;, not code. In the discussion, many mentioned &lt;span style="font-weight: bold;"&gt;user interface &lt;/span&gt;or the &lt;span style="font-weight: bold;"&gt;user experience&lt;/span&gt;. Which is right. But it’s still trees, not the forest. If we start thinking about the overall product we might realize that we need to &lt;span style="font-style: italic;"&gt;see the whole&lt;/span&gt; a lot better than we usually do. Scrum has a good shoot on this by emphasizing the role of the &lt;span style="font-weight: bold;"&gt;Product Owner&lt;/span&gt;, meaning that we have a &lt;span style="font-style: italic;"&gt;single responsible person&lt;/span&gt; (which is a gift from the gods in many organizations) for the whole product. There’s a problem up there, because so many times the whole idea of product is flawed, and we’re just &lt;span style="font-style: italic;"&gt;writing software&lt;/span&gt;. Guess what... with a high probability of being completely useless.&lt;br /&gt;&lt;br /&gt;I’ve seen so many projects missing their goals or their potential, just because the responsible organization didn’t have a clear idea of the whole product not to see a pattern here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Non technical integration is not so easy&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Ok, so we should try to have an &lt;span style="font-style: italic;"&gt;all-round view&lt;/span&gt; to our product. Including also non developers roles within our project scope. Interesting but tricky. Especially if the team boundaries do not match with the company boundaries, which might happen quite often in a cross-functional team. But software-only teams can control continuous integration to a very high degree of efficiency using TDD, Continuous Integration and SCM tools. But this is only a portion of the product. Other professional might follow a different approach, that has nothing to do with TDD (or maybe it has... only on a different time scale), and the perfection we strived to achieve becomes frustratingly fragile. I guess there’s no easy recipe  here, we’ve got to fall back on mantras like&lt;span style="font-style: italic;"&gt; “inspect and adapt”&lt;/span&gt;: solutions might be a lot different from team to team. After all we’re humans. But it’s funny to realize that we sometimes we want to “integrate early and often” but “only software artifacts, please”. Postponing integration with non-software components of your project is even riskier.&lt;br /&gt;&lt;br /&gt;This is definitely a hot topic, especially if you approach it from an enterprise management perspective: enterprise 2.0 folks are talking about more flexible approaches to collaboration, and this might be at odds with the benefit of a jelled team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-3500229573857696465?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/33KPr27fO7o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/3500229573857696465/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=3500229573857696465" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3500229573857696465?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/3500229573857696465?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/11/crowdsourcing-experiment.html" title="A crowdsourcing experiment" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEYAQns8fSp7ImA9WxNbGUQ.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-6645462174388800684</id><published>2009-11-23T17:53:00.002+01:00</published><updated>2009-11-23T18:09:03.575+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-23T18:09:03.575+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="books" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="IAD2009" /><title>Reading suggestions after IAD2009</title><content type="html">I’ve found myself talking about many different books with many different persons during IAD2009, here’s a summary of the books I more or less explicitly suggested:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/1934356050/ref=ord_cart_shr?_encoding=UTF8&amp;amp;m=ATVPDKIKX0DER&amp;amp;v=glance"&gt;Pragmatic Thinking and Learning&lt;/a&gt; - Andy Hunt: some things happen by chance, some don’t some others you could make it happen.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Agile-Software-Development-Cooperative-Game/dp/0321482751"&gt;Agile Software Development, the cooperative game&lt;/a&gt; - Alistair Cockburn: an eye-opener on what’s around the code.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Agile-Retrospectives-Making-Teams-Great/dp/0977616649/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258995381&amp;amp;sr=1-1"&gt;Agile Retrospectives&lt;/a&gt; - Esther Derby, Diana Larsen: so little small details can make the difference between a good retrospective and a useless bloodbath.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Collaboration-Explained-Facilitation-Software-Project/dp/0321268776/ref=pd_sim_b_3"&gt;Collaboration Explained&lt;/a&gt; - Jean Tabaka: sometimes there’s so much about the people that we don’t really know.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Agile-Project-Management-Microsoft-Professional/dp/073561993X/ref=pd_sim_b_5"&gt;Agile Project Management with Scrum&lt;/a&gt; - Ken Schwaber: it’s not software development, it’s product development.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Agile-Retrospectives-Making-Teams-Great/dp/0977616649/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258995381&amp;amp;sr=1-1"&gt;Don’t Make Me Think&lt;/a&gt; - Steve Krug: how many times are we willing to transform a service into a pain?&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258995675&amp;amp;sr=1-1"&gt;The design of everyday things&lt;/a&gt; - Donald A. Norman: guys, I hate bad design. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258995717&amp;amp;sr=1-1"&gt;Domain Driven Design&lt;/a&gt; - Eric Evans: there’s much more to this book than it looks (and looks like there’s plenty of stuff already).&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420/ref=pd_sim_b_2"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt; - Martin Fowler: the reference book for current architectural patterns.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Agile-Project-Management-Creating-Innovative/dp/0321658396/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258995784&amp;amp;sr=1-1"&gt;Agile Project Management&lt;/a&gt; - Jim Highsmith: it’s not all about the software,but it works. &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Slack-Getting-Burnout-Busywork-Efficiency/dp/0767907698/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258995824&amp;amp;sr=1-1"&gt;Slack&lt;/a&gt; - Tom de Marco: oops seems like so many things your organization is doing are wrong.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Peopleware-Productive-Projects-Teams-Second/dp/0932633439/ref=pd_sim_b_3"&gt;Peopleware&lt;/a&gt; - Tom de Marco, Timothy Lister: still incredibly useful, if you haven’t read it you’re just pretending to manage software projects.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Getting-Things-Done-Stress-Free-Productivity/dp/0142000280/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258995905&amp;amp;sr=1-1"&gt;Getting Things Done&lt;/a&gt; - David Allen: everybody’s talking about GTD, maybe because there’s something true in that.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1258995976&amp;amp;sr=1-1"&gt;Clean Code&lt;/a&gt; - Robert C.Martin: you won’t go anywhere if you don’t agree on this.&lt;/li&gt;&lt;/ul&gt;Hope these might be useful to some.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-6645462174388800684?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/96v1ip4hLlk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/6645462174388800684/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=6645462174388800684" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/6645462174388800684?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/6645462174388800684?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/11/reading-suggestions-after-iad2009.html" title="Reading suggestions after IAD2009" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEYGSHs9eCp7ImA9WxNbGUQ.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-909926967439747660</id><published>2009-11-23T17:01:00.000+01:00</published><updated>2009-11-23T17:02:09.560+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-23T17:02:09.560+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="Domain Driven Design" /><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="IAD2009" /><title>Back from the Italian Agile Day 2009</title><content type="html">I’ve seen skilled and curious colleagues. I’ve seen nice ideas emerge from different perspectives (more on this soon). I’ve met old friends and nice persons which I didn’t know and that I am now honored to know.&lt;br /&gt;&lt;br /&gt;All this doesn’t happen everyday and everywhere.&lt;br /&gt;&lt;br /&gt;Thanks to Marco Abis that every year make this magic happen. Thanks to everybody in the staff and to all friends from the Bologna XP Users Group, once more fantastic. Thanks to all the speakers, able to tell real stories without hype or fluff. Thanks to all the participants to my “talk show” sharing interesting ideas and thoughts. Thanks to the heroes that risked asphyxia to follow my Domain Driven Design mini-workshop.&lt;br /&gt;&lt;br /&gt;Thanks also to Roberto Bettazzoni that reminded me what it means to be “Romagnolo”.&lt;br /&gt;&lt;br /&gt;It has been a great day.&lt;br /&gt;&lt;br /&gt;Thanks to everybody made it possible.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-909926967439747660?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/v_nvuHWYXiU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/909926967439747660/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=909926967439747660" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/909926967439747660?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/909926967439747660?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/11/back-from-italian-agile-day-2009.html" title="Back from the Italian Agile Day 2009" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkcHQXs_fCp7ImA9WxNUEUs.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-5555549265219637163</id><published>2009-11-02T14:04:00.003+01:00</published><updated>2009-11-02T14:20:30.544+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-02T14:20:30.544+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="training" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="IAD2009" /><category scheme="http://www.blogger.com/atom/ns#" term="scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="avanscoperta." /><title>Scrum Introduction with Peter Stevens</title><content type="html">As a satellite event to the &lt;a href="http://www.agileday.it/front/"&gt;2009 Italian Agile Day&lt;/a&gt; in Bologna, I'll be helping Peter Stevens in the one day &lt;a href="http://avanscopertascrumintro19112009.eventbrite.com/"&gt;Introduction to Scrum&lt;/a&gt; that'll take place in Bologna on November 19th, right before the IAD. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Peter is a seasoned Scrum trainer based in Switzerland, and helping companies in different countries. More info could be found on his blog &lt;a href="http://www.scrum-breakfast.com/"&gt;Scrum Breakfast&lt;/a&gt;.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Peter speaks quite a good Italian, we thought that the best combination would be to keep the teaching part in English, and question time in Italian. But ...I guess this would be an emerging behaviour as well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By the way, Agile Day participants will get a 20% discount on the full price.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-5555549265219637163?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/ImKJrToNe8A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/5555549265219637163/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=5555549265219637163" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/5555549265219637163?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/5555549265219637163?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/11/scrum-introduction-with-peter-stevens.html" title="Scrum Introduction with Peter Stevens" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0YGRXY-eip7ImA9WxNVEU4.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-8991394881344689688</id><published>2009-10-21T17:26:00.004+02:00</published><updated>2009-10-21T17:32:04.852+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-21T17:32:04.852+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="JAX" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><title>JAX Italia 2009</title><content type="html">Event agenda is getting crowded: in November I'll also be speaking at the first edition of the &lt;a href="http://www.jaxitalia.com/"&gt;Italian JAX Conference&lt;/a&gt;, I'll be giving a talk about Domain Driven Design, and a full-day DDD seminar on Saturday 14th.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some more detailed info &lt;a href="http://www.jaxitalia.com/konferenzen/jaxitalia09/speaker/#4393"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-8991394881344689688?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/QpHMlsd0qyM" height="1" width="1"/&gt;</content><link rel="related" href="http://www.jaxitalia.com/" title="JAX Italia 2009" /><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/8991394881344689688/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=8991394881344689688" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/8991394881344689688?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/8991394881344689688?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/10/jax-italia-2009.html" title="JAX Italia 2009" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;Ak8DRn0zcCp7ImA9WxNVFUo.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-8338021267849963696</id><published>2009-10-20T15:13:00.003+02:00</published><updated>2009-10-26T18:41:17.388+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-26T18:41:17.388+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="IAD2009" /><title>Italian Agile Day 2009</title><content type="html">Registrations are open for the &lt;a href="http://www.agileday.it/front/2009/italian-agile-day-2009/"&gt;Italian Agile Day 2009&lt;/a&gt;, still in Bologna on November 20th.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll be giving a talk "Possiamo fare di meglio" (We can do better than this) and maybe a short workshop. Everybody interested in agile software development is warmly welcome. Hurry up!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-8338021267849963696?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/Xex5RiqJDiY" height="1" width="1"/&gt;</content><link rel="related" href="http://www.agileday.it/front/2009/italian-agile-day-2009/" title="Italian Agile Day 2009" /><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/8338021267849963696/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=8338021267849963696" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/8338021267849963696?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/8338021267849963696?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/10/italian-agile-day-2009.html" title="Italian Agile Day 2009" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUUMQ3Y6eip7ImA9WxJVFkg.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-6633080663724761459</id><published>2009-07-03T22:28:00.002+02:00</published><updated>2009-07-03T22:34:42.812+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-03T22:34:42.812+02:00</app:edited><title>Fast and Slim Enterprise 2.0</title><content type="html">Next Friday - July 10th 2009 - I'll be participating to a public debate in Bologna (Palazzo Gnudi at 17.30) about the Enterprise 2.0 topic. Speaker panel looks promising, and the event is free :-)&lt;br /&gt;&lt;br /&gt;Software house &lt;a href="http://www.gecod.it"&gt;Gecod&lt;/a&gt; is hosting the event, more information on the &lt;a href="http://www.gecod.it/it/master/enterprise2.do"&gt;official event page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-6633080663724761459?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/5wUxuX9AUu4" height="1" width="1"/&gt;</content><link rel="related" href="http://www.gecod.it/it/master/enterprise2.do" title="Fast and Slim Enterprise 2.0" /><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/6633080663724761459/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=6633080663724761459" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/6633080663724761459?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/6633080663724761459?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/07/fast-and-slim-enterprise-20.html" title="Fast and Slim Enterprise 2.0" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEYGR3g_cCp7ImA9WxJVE00.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-331130170356690628</id><published>2009-06-29T21:30:00.012+02:00</published><updated>2009-06-29T22:08:46.648+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-29T22:08:46.648+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Domain Driven Design" /><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="OOD" /><title>So ...what exactly is a context? - Part 1</title><content type="html">&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:georgia;"&gt;One of the premises of Strategic Domain Driven Design is that in every non-trivial application there will be multiple models at play. This may sound controversial to some, but since a model is a representation of a portion of the problem domain aimed to serve a specific &lt;span style="font-style: italic;"&gt;use&lt;/span&gt;, the need of multiple models promptly arises as our application grows in size and/or complexity.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;The &lt;span style="font-style: italic;"&gt;Ubiquitous Language&lt;/span&gt; plays many roles in DDD, among others it may be considered an &lt;span style="font-style: italic;"&gt;integrity check&lt;/span&gt; for any model in play assuring that every role involved in software development, from domain experts to developers, shares the same language and agrees on the specific meaning of every term which is part of the ubiquitous language.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_miciPvwKRf0/SkkW3emkk_I/AAAAAAAAALI/pBBEskkLK8s/s1600-h/Ubiquitous+language.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 397px; height: 400px;" src="http://1.bp.blogspot.com/_miciPvwKRf0/SkkW3emkk_I/AAAAAAAAALI/pBBEskkLK8s/s400/Ubiquitous+language.jpg" alt="" id="BLOGGER_PHOTO_ID_5352834774470005746" border="0" /&gt;&lt;/a&gt;&lt;img src="file:///Users/alberto/Library/Caches/TemporaryItems/moz-screenshot-5.jpg" alt="" /&gt;&lt;span style="font-style: italic;font-family:arial;font-size:85%;"  &gt;￼The Ubiquitous Language should be the only language used to express a model. Everybody in the team should be able to agree on every specific term without ambiguities.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:georgia;"&gt;Code is the primary expression of the model, other artifacts might be necessary along the way to capture requirements or portions of the design, but the only artifact that will be constantly in sync with the application behavior is &lt;span style="font-style: italic;"&gt;code&lt;/span&gt; itself. Ensuring that every term is precisely defined and that is consistently used in every representation of the model greatly helps ensuring integrity of our application. Model integrity comes at a (reasonable) price: the model cannot be extended indefinitely, but can be shared, coherent and acknowledged only within a given Context.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family:georgia;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;So, ...what exactly is a context? &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family:georgia;"&gt;In Domain Driven Design, a Context is defined as&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:georgia;"&gt;&lt;span style="font-style: italic;"&gt;“The setting in which a word or a statement appears that determines its meaning”&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:georgia;"&gt;which might sound rather ...vague, at first read. But I’ve learnt that Eric Evans always chooses carefully each word, especially in the key sentences. So the definition above describes exactly what a context is (at least in the Domain Driven Design context). This definition says nothing about the &lt;span style="font-style: italic;"&gt;size&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;shape&lt;/span&gt; or other characteristics of a context, so they are likely to be consequences of the &lt;span style="font-style: italic;"&gt;link&lt;/span&gt; between the word or the statement and the meaning. &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family:georgia;"&gt;But this definition calls for examples, here is a trivial one. The word &lt;span style="font-style: italic;"&gt;Account&lt;/span&gt; has a very precise meaning in the banking context, and in a typical application, we would probably model it with a &lt;span style="font-weight: bold;font-family:lucida grande;" &gt;balance&lt;/span&gt; and an &lt;span style="font-weight: bold;font-family:lucida grande;" &gt;accountNumber&lt;/span&gt; attribute, and so on. But in the context of Web Applications, an &lt;span style="font-style: italic;"&gt;Account&lt;/span&gt; is closely related to &lt;span style="font-style: italic;"&gt;credentials&lt;/span&gt;, such as &lt;span style="font-weight: bold;font-family:lucida grande;" &gt;username&lt;/span&gt;, &lt;span style="font-weight: bold;font-family:lucida grande;" &gt;password&lt;/span&gt;, and so on, and we would tend to model it in a very different way.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:georgia;"&gt;Trying to force the two definition within a single class might result in awkward code, whose conceptual integrity has been undermined by the attempt to fulfill two distinct models within the same class. Admitting that the same term might be referred to two distinct concepts is crucial for model integrity. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Making the contexts explicit, we are making both models clearer and unambiguous.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_miciPvwKRf0/SkkZaZ9jCuI/AAAAAAAAALQ/6OqOkHt8JuQ/s1600-h/Separate+bounded+contexts.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 203px;" src="http://4.bp.blogspot.com/_miciPvwKRf0/SkkZaZ9jCuI/AAAAAAAAALQ/6OqOkHt8JuQ/s400/Separate+bounded+contexts.jpg" alt="" id="BLOGGER_PHOTO_ID_5352837573542873826" border="0" /&gt;&lt;/a&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;span style="font-style: italic;"&gt;The term Account does not have a single non ambiguous meaning, but in a given context the meaning is well defined.&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Ok, this first example might be too trivial: the term Account refers to two different concepts, and simply calling them &lt;/span&gt;&lt;span style="font-weight: bold;font-family:lucida grande;" &gt;BankingAccount&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; and &lt;span style="font-weight: bold;font-family:lucida grande;" &gt;LoginAccount&lt;/span&gt; might have solved the problem.&lt;/span&gt; &lt;span style="font-family:georgia;"&gt;A more subtle distinction might arise when the concepts is the same but but used in different ways, thus leading to different models.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Let’s suppose we’re working with an application managing payments. We’ll probably use this application to manage our &lt;/span&gt;&lt;span style="font-style: italic;font-family:georgia;" &gt;Banking Accounts&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, keeping track of current balance and past operations. The model for our Banking Account might be a &lt;/span&gt;&lt;span style="font-weight: bold;font-family:lucida grande;" &gt;&lt;span style="font-family:lucida grande;"&gt;BankingAccount&lt;/span&gt; &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;class like the one below.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_miciPvwKRf0/SkkaoBbG7ZI/AAAAAAAAALg/D-RM_4Xsj9Q/s1600-h/BankingAccount.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 198px; height: 218px;" src="http://2.bp.blogspot.com/_miciPvwKRf0/SkkaoBbG7ZI/AAAAAAAAALg/D-RM_4Xsj9Q/s400/BankingAccount.jpg" alt="" id="BLOGGER_PHOTO_ID_5352838906985770386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Some PFM apps allow us to manage also payments, keeping a &lt;span style="font-style: italic;"&gt;Payee Registry&lt;/span&gt;. In this scenario, a Payee is normally associated with one or more Banking Account, but in this case we won’t know anything of the internals nor we can issue any operation on those accounts. Does it make sense to model the &lt;span style="font-weight: bold;font-family:lucida grande;" &gt;Payee&lt;/span&gt; account with the &lt;span style="font-weight: bold;font-family:lucida grande;" &gt;BankingAccount&lt;/span&gt; class we’ve just defined?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_miciPvwKRf0/SkkbbJLvnkI/AAAAAAAAALo/ub-lTjF9o8I/s1600-h/Another+BankingAccount.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 156px;" src="http://3.bp.blogspot.com/_miciPvwKRf0/SkkbbJLvnkI/AAAAAAAAALo/ub-lTjF9o8I/s400/Another+BankingAccount.jpg" alt="" id="BLOGGER_PHOTO_ID_5352839785242140226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Well... it &lt;/span&gt;&lt;span style="font-style: italic;font-family:georgia;" &gt;does&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; sound reasonable: it’s the same concept, I mean, in the real world our account and the payee’s one might even be &lt;/span&gt;&lt;span style="font-style: italic;font-family:georgia;" &gt;in the same physical bank&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;. Still, it doesn’t feel completely &lt;/span&gt;&lt;span style="font-style: italic;font-family:georgia;" &gt;right&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;: we are not supposed to issue any operation on the payee Banking Account, or to track anything on that. Even worse: doing so would probably be a bad mistake within our application.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;In this case, we’re &lt;/span&gt;&lt;span style="font-style: italic;font-family:georgia;" &gt;using&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; the &lt;/span&gt;&lt;span style="font-style: italic;font-family:georgia;" &gt;same concept&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; in &lt;/span&gt;&lt;span style="font-style: italic;font-family:georgia;" &gt;different ways&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, and this will lead us to &lt;/span&gt;&lt;span style="font-style: italic;font-family:georgia;" &gt;different models&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;. Even if the class is already defined in the application, a different context calls for a different model.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_miciPvwKRf0/SkkcEP4vv0I/AAAAAAAAALw/8wQqYZ4sJUs/s1600-h/Separate+bounded+contexts+same+Concept.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 231px;" src="http://3.bp.blogspot.com/_miciPvwKRf0/SkkcEP4vv0I/AAAAAAAAALw/8wQqYZ4sJUs/s400/Separate+bounded+contexts+same+Concept.jpg" alt="" id="BLOGGER_PHOTO_ID_5352840491416141634" border="0" /&gt;&lt;/a&gt;&lt;span style="font-family:georgia;"&gt;Again, name clashes might be solved in different ways at the code level, you can effectively partition the system by adding meaningful prefixes to the classes, or using packages, or in some other way. What matters now is that there are ambiguities, and a term can be effectively defined only within a given space.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;So, a Context is a “space” where a given concept is &lt;span style="font-style: italic;"&gt;precisely defined without ambiguities&lt;/span&gt;, so that it can be safely used in the &lt;span style="font-style: italic;"&gt;Ubiquitous Language&lt;/span&gt;. If the same concept appears different times with different meanings within an application, we’re probably heading towards multiple &lt;span style="font-style: italic;"&gt;Bounded Contexts&lt;/span&gt; within the &lt;span style="font-style: italic;"&gt;same application&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;In Domain Driven Design, a model is intended to serve a specific &lt;span style="font-style: italic;"&gt;use&lt;/span&gt;, and nontrivial applications often tend to be used in different ways: trying to accommodate every use within a single model is a meaningless effort. It will end up corrupting your model with ill-defined or ambiguous term making the model you developed within a context less valuable. Contexts cannot be expanded indefinitely: &lt;span style="font-style: italic;"&gt;Context Boundaries&lt;/span&gt; are needed to define which concepts are in and which ones are out, and to ensure conceptual integrity to the model within the context.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-331130170356690628?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/XxdKa8KPaoI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/331130170356690628/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=331130170356690628" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/331130170356690628?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/331130170356690628?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/06/so-what-exactly-is-context-part-1.html" title="So ...what exactly is a context? - Part 1" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_miciPvwKRf0/SkkW3emkk_I/AAAAAAAAALI/pBBEskkLK8s/s72-c/Ubiquitous+language.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkMDSXg5cSp7ImA9WxJWF0o.&quot;"><id>tag:blogger.com,1999:blog-20576845.post-7689820768621787508</id><published>2009-06-23T16:44:00.003+02:00</published><updated>2009-06-23T17:21:18.629+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-23T17:21:18.629+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="Domain Driven Design" /><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><title>Back from the London DDD-Exchange</title><content type="html">&lt;p&gt;&lt;span style="font-family:Georgia;"&gt;I just came back from London where Gojko Adzic and I led a 4-day full immersion Domain Driven Design class in Skills Matter HQ. Wasn’t it enough, on friday we had the first edition of &lt;/span&gt;&lt;a style="font-family: Georgia;" href="http://skillsmatter.com/event/design-architecture/ddd-exchange"&gt;DDD-Exchange&lt;/a&gt;&lt;span style="font-family:Georgia;"&gt;, in the Crypt with quite a few interested participants.&lt;/span&gt;  &lt;span style="font-family:Georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;"&gt;First of all, I’ve got to thank everybody in &lt;/span&gt;&lt;a style="font-family: Georgia;" href="http://skillsmatter.com/"&gt;Skills Matter&lt;/a&gt;&lt;span style="font-family:Georgia;"&gt; for the fantastic job. Organization was incredibly efficient with wi-fi, food and beverages, real-time twitter coverage and quick publishing of the talks on the company website (mine is &lt;/span&gt;&lt;a style="font-family: Georgia;" href="http://skillsmatter.com/podcast/design-architecture/context-mapping-in-action/wd-112"&gt;here&lt;/a&gt;&lt;span style="font-family:Georgia;"&gt;). Despite a long line of sleepless nights working on the presentation and my terrible accent, looks like everything went fine. We had quite a few interesting talks, and I also participated to my first park bench panel, which turned out being quite interesting and open ended. Also, beers with some of the folks that came to attend the DDD-Exchange were even more open ended.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt; &lt;span style="font-family:Georgia;"&gt;So, despite being incredibly tired, at the end I felt like I did something good, many people actually &lt;span style="font-style: italic;"&gt;liked&lt;/span&gt; my presentation and we had many interesting discussions during the breaks.&lt;/span&gt;  &lt;span style="font-family:Georgia;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Georgia;"&gt;By the way I uploaded &lt;/span&gt;&lt;a style="font-family: Georgia;" href="http://www.slideshare.net/ziobrando/context-mapping-in-action"&gt;my presentation&lt;/a&gt;&lt;span style="font-family:Georgia;"&gt; on Slideshare, after making some small corrections and adding some notes to prevent possible misunderstandings.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;small&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/DDD"&gt;DDD&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/Software+Development"&gt;Software Development&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/Agile"&gt;Agile&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/Project+Management"&gt;Project Management&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20576845-7689820768621787508?l=ziobrando.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ZiobrandosLair/~4/BDrssy0bxKw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://ziobrando.blogspot.com/feeds/7689820768621787508/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=20576845&amp;postID=7689820768621787508" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/7689820768621787508?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/20576845/posts/default/7689820768621787508?v=2" /><link rel="alternate" type="text/html" href="http://ziobrando.blogspot.com/2009/06/back-from-london-ddd-exchange.html" title="Back from the London DDD-Exchange" /><author><name>Alberto Brandolini</name><uri>http://www.blogger.com/profile/00568728817611163214</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://bp3.blogger.com/_miciPvwKRf0/R9EjDE9ooVI/AAAAAAAAAEM/ePLxbtn05bA/S220/PC272620-1.jpg" /></author><thr:total>0</thr:total></entry></feed>

