<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>www.sanderhoogendoorn.com</title>
	<atom:link href="http://sanderhoogendoorn.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://sanderhoogendoorn.com/blog</link>
	<description>Imagination is more important than knowledge</description>
	<lastBuildDate>Tue, 08 May 2012 15:08:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Agile anti-patterns. Yes you agile projects can and will fail too</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1100&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=agile-anti-patterns-yes-you-agile-projects-can-and-will-fail-too</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1100#comments</comments>
		<pubDate>Tue, 08 May 2012 15:08:25 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Requirements]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Smart]]></category>
		<category><![CDATA[Smart use cases]]></category>
		<category><![CDATA[Software architecture]]></category>
		<category><![CDATA[Software estimation]]></category>
		<category><![CDATA[User stories]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1100</guid>
		<description><![CDATA[Over the years I have noticed a lot of agile anti-patterns during projects. Wrongly used agile approaches, dogmatic use of agile approaches, agile-in-name-only. Recently I have presented a talk at a number of agile and software development conferences that demonstrates &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1100">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1100"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1100&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"><iframe src="http://www.facebook.com/widgets/like.php?href=http://sanderhoogendoorn.com/blog/?p=1100" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"></iframe></div>
<p>Over the years I have noticed a lot of agile anti-patterns during projects. Wrongly used agile approaches, dogmatic use of agile approaches, agile-in-name-only. Recently I have presented a talk at a number of agile and software development conferences that demonstrates patterns of agile misuse. These conferences include Agile Open Holland (Dieren), Camp Digital (Manchester), GIDS (Bangalore), ACCU (Oxford) and Jazoon (Zurich). Anyway, here’s the slide deck. Enjoy.</p>
<div style="width: 425px" id="__ss_12849698"><strong style="margin: 12px 0px 4px; display: block"><a title="Agile Anti-Patterns. Yes your agile projects can and will fail too." href="http://www.slideshare.net/aahoogendoorn/agile-antipatterns-yes-your-agile-projects-can-and-will-fail-too" target="_blank">Agile Anti-Patterns. Yes your agile projects can and will fail too.</a></strong> <iframe style="width: 559px; height: 390px" height="355" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/12849698" frameborder="0" width="425" marginwidth="0" scrolling="no"></iframe>
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/thecroaker/death-by-powerpoint" target="_blank">PowerPoint</a> from <a href="http://www.slideshare.net/aahoogendoorn" target="_blank">Sander Hoogendoorn</a> </div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1100</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to kill your estimates</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1081&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-kill-your-estimates</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1081#comments</comments>
		<pubDate>Sat, 14 Apr 2012 13:00:54 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Client /server]]></category>
		<category><![CDATA[Estimation]]></category>
		<category><![CDATA[Smart estimation]]></category>
		<category><![CDATA[Smart use case points (SUCP)]]></category>
		<category><![CDATA[Smart use cases]]></category>
		<category><![CDATA[Software estimation]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1081</guid>
		<description><![CDATA[It must have been about twenty five years ago. I was working for a large international consultancy firm. One of the reliable ones. The ones that you would think that had everything worked out. But I guess this was merely &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1081">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1081"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1081&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"><iframe src="http://www.facebook.com/widgets/like.php?href=http://sanderhoogendoorn.com/blog/?p=1081" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"></iframe></div>
<p><em>It must have been about twenty five years ago. I was working for a large international consultancy firm. One of the reliable ones. The ones that you would think that had everything worked out. But I guess this was merely the product of my imagination.</em></p>
<p>At one time two colleagues and I were working on an estimate for a bid for a software development project. Now the three of us together, despite the fact that this occurred long time ago, had quite some years of experience in the field. So you would reckon we could come up with a decent estimate. And we did. In fact, we created two estimates. One by counting screens, based on a point scale and a real-life velocity. A very popular and suitable technique as we were building desktop applications. Next to that we created a work breakdown structure. Using both techniques we estimated ALL the work in the project, not just coding or coding and testing. Not much to our surprise the results from both estimates were comparable. Happy and confident with the result, we presented our estimates to the account manager in charge.</p>
<p>It was at this particular point in time, at that very instant, that my faith and trust in our industry vanished into thin air, not to return again. Not even more than glancing at the work we’d invested in our estimates, the account manager merely looked at the end result and added 20% to the overall price for the project. For contingency, he claimed.</p>
<p>Up to this deciding moment in my career I had never even heard of the word. Contingency. And still I refuse to stop and think what the impact of that little word is to this industry and probably others too. To sum it up, every confident estimate can be killed by (account) managers adding seemingly random percentages. Just because they don’t trust your estimates. Or they still remember the court cases from previous projects. Frightening all together.</p>
<p>Needless to say we lost the bid. Our competitors were less expensive.</p>
<h2>History revisited</h2>
<p>Now I wouldn’t write about this unfortunate event if I hadn’t met a similar situation only a few weeks ago. You might imagine we’ve learned a thing or two in the twenty five years since. Alas. We didn’t. And it’s industry wide I assume.</p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/IMAGE_522.jpg"><img style="display: inline" title="IMAGE_522" alt="IMAGE_522" src="http://sanderhoogendoorn.com/blog/wp-content/IMAGE_522_thumb.jpg" width="515" height="309"></a></p>
<p>With a small team we had worked on an estimate for re-engineering a client/server desktop application to a .Net web application. We estimated based on smart use case points, a technique that we have used and refined over the years. A reliable estimation technique. The estimate resulted in just under 500 smart use case points, which is a measure for the size and complexity of the system. Given the fact that we have executed multiple similar projects successfully we were able to establish that it takes about 8 hours per smart use case point to realize the software. And yes, we have actually gathered metrics! These 8 hours include ALL work on the project, including project management, documentation, testing, setting up the development environment etc. Simple calculation tells us that we would need 4.000 hours to do the project. So this was what we coughed up for the responsible account manager.</p>
<p>Without so much as a blink of the eye an email came back from the account manager stating that he added 20% to our estimate, and that he would communicate this new number to the client. Leaving us with a lot of questions of course.</p>
<p>So the interesting question is: where does the 20% come from? You would expect that it originated from having evaluated software development projects for years and years, and comparing original estimates in those projects with the final outcome – given the fact that requirements change, teams change and technology changes. But to be quite honest, unfortunately I suspect this is not case. There’s but only a few organizations that actually measure like this. I assume. And then even if he had done that, would it be exactly 20%? Why not 17.6? Or 23.17? Exactly 20%? Or maybe the account manager knows his statistics. Statistics claim that developers estimate 20% too optimistic. As we developers are optimists. But this was a <em>team</em> estimate including all work on the smart use case on the backlog.&nbsp; </p>
<h2>Yesterday’s weather</h2>
<p>To cut to the chase, if a team estimates the amount of work in a project, especially on a relative scale, as an account manager this is what you should believe, as it is the best estimate available. This is the yesterday’s weather principle. The best way to predict today’s weather, is to look at the weather from the day before. No more, no less. </p>
<p><img src="http://weblogs.nieuwegarde.nl/images/weersvoorspelling_borger.gif"></p>
<p>Adding 20% – or 10% or 15% – just as a rule of thumb is not based on any real-life experience. In my opinion such actions show that the account manager puts no trust in his own people, in his own organization. This would be similar to saying that if it was 10 degrees yesterday, we’ll just state that it will be 7 degrees today, without having looked at the weather forecast. </p>
<h2>Restore trust</h2>
<p>So what’s the message here? Please dear account managers, put some trust in the people who try to create as estimate as accurate as they can. Don’t add 20%, or 10% for that matter, just based on gut feeling. And more important, dear software developing organizations, start measuring your projects! Gather metrics so future estimates become much more accurate and realistic, and future project proposals and project will be less off target than so many projects I witness. And on the fly restore some of the trust so many people have lost in our industry. Let’s learn.</p>
<p><em><strong>This post is published in </strong></em><a href="http://www.sdn.nl/SDN/Magazine/tabid/66/Default.aspx" target="_blank"><em><strong>SDN Magazine</strong></em></a><em><strong>.</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1081</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evolving agile</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1078&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=evolving-agile</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1078#comments</comments>
		<pubDate>Wed, 04 Apr 2012 13:32:05 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anti-patterns]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Smart]]></category>
		<category><![CDATA[Waterfall]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1078</guid>
		<description><![CDATA[Without any doubt agile is the biggest evolution in software development approaches since the introduction of waterfall back in the early seventies. And yes. Agile is an evolution rather than a revolution. The best practices and techniques in agile didn’t &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1078">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1078"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1078&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"><iframe src="http://www.facebook.com/widgets/like.php?href=http://sanderhoogendoorn.com/blog/?p=1078" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"></iframe></div>
<p>Without any doubt agile is the biggest evolution in software development approaches since the introduction of waterfall back in the early seventies. And yes. Agile is an evolution rather than a revolution. The best practices and techniques in agile didn’t just pop-up. Rather they emerged from years of hard-working, real-life experience in succeeding and failing in projects. </p>
<p>So working in short iterations, in multi-disciplinary teams, prioritizing our work items regularly, and testing and delivering early and frequently using simplified communication, as we could capture agile in a single sentence, are improvements we’ve all introduced in our software development projects over the past forty years. Agile, and all of it flavors, such as Extreme Programming, Scrum, Smart or Kanban, have merely evolved from teams trying to do a little better every day. And have succeeded in doing that.</p>
<p>In the second decade of this century, due to the overall success of agile approaches, the majority of organizations executing projects will move towards agile. Either quickly or slowly. And for a variety of reasons. To raise quality. To increase predictability. To execute on-time, on-budget. To minimize time-to-market. Or simply because Gartner says so.</p>
<p><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://images.wikia.com/fantendo/images/6/66/PokemonTrainer.png" width="205" height="289"></p>
<p>But with the success of agile come new challenges. Agile projects require agile coaches. Whether certified as Scrum Master, Lean Champion, or Pokémon Trainer, there is a lack of sufficiently experienced agile coaches. As a result an increasing number of projects is guided by ill-experienced coaches, often leading to a dogmatic and rigor application of agile. More over large organizations will feel the need to standardize, industrialize or institutionalize their agile efforts, resulting in ill-digestible, comprehensive agile manuals.</p>
<p>Although adaption and creativity are fundamental to agile, these growing pains will slow down the enormous progress we are making in the field of software development approaches. Agile is meant to evolve. Always. Continuously. Improving and professionalizing our software development is not a frog-leap process, proceeding with one giant leap every fifteen years. It is an fluid, never-ending process of many, many little steps taken on a daily basis. We learn from what we do. Yesterday, today, tomorrow, next year. </p>
<p><em>This post was written as a contribution to the upcoming book “Shaping Apps Germany”, published by Capgemini, Germany.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1078</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A short notice about object relational mapping framework generated queries&#8230;</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1075&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-short-notice-about-object-relational-mapping-framework-generated-queries</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1075#comments</comments>
		<pubDate>Sat, 24 Mar 2012 13:26:07 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Anti-patterns]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Domain driven design]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Hibernate / nHibernate]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1075</guid>
		<description><![CDATA[I guess object relational mapping is an accepted paradigm for exchanging data between an object oriented domain layer and underlying databases. For most applications object relational mapping is more than sufficient. And if not, perhaps command query responsibility segregation might &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1075">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1075"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1075&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"><iframe src="http://www.facebook.com/widgets/like.php?href=http://sanderhoogendoorn.com/blog/?p=1075" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"></iframe></div>
<p><em>I guess object relational mapping is an accepted paradigm for exchanging data between an object oriented domain layer and underlying databases. For most applications object relational mapping is more than sufficient. And if not, perhaps command query responsibility segregation might contribute well to your solution.</em></p>
<p>Being a more than frequent user, this very short blog post is not meant to question either of these popular paradigms. However, I would like to make it clear that applying object relational mapping might not always lead to optimal solutions, especially from a database perspective. Most object relational mapping framework generate the underlying queries to the database, based on the domain layer and the associations between the domain objects in this layer. The quality of these generated queries is strongly dependent on the quality of the domain model and layer. If the domain model is complex, so will the generated queries be. Rubbish in is rubbish out. </p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image105.png"><img style="display: inline" title="image" alt="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb33.png" width="333" height="437"></a></p>
<p>So it is noteworthy how the framework you’re using maps associations and properties to SQL statements. Some frameworks may choose remarkable construct for this mapping resulting in hard and unreadable queries, or queries that aren’t very much optimized for the underlying data model. So this short blog post is just to make you notice. </p>
<p>The problem actually comes from the enormous amount of features a full-grown object relational mapping framework needs to implement. Basically, everything and the kitchen sink. Driven by the good but blind ambition to serve as many developers as they possibly can, in any case more than all other competitors, the framework developers implement as many features as the code in the framework can handle. And sometimes this feature bloating may lead to peculiar results, where the framework might still function, but the original goals of providing a lightweight, straightforward, easy-to-use framework to solve most common mapping problems have long been abandoned. </p>
<p>For developers using such frameworks I guess the most decent piece of advice I can give is: don’t go into the dark corners of domain modeling, as the solutions resulting may be hard to maintain and to extend. Use middle-of-the-road constructs, and prefer simpler, more generic out-of-the-box solutions to more specific and elaborate domain models.</p>
<p>I’ll leave with an example of a query which was generated by a frequently used object relational mapping framework in the .Net space. I’m quite sure the database will have a hard time executing this particular query. </p>
<p>And yes, the following is indeed a single select query. Go figure.</p>
<p><font face="Courier New"><strong>SELECT</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[ID] AS [ID],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN &#8217;2X&#8217; WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1) AND([UnionAll2].[C6] IS NOT NULL)))) THEN &#8217;2X0X&#8217; WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)) THEN &#8217;2X0X0X&#8217; WHEN(([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6] IS NOT NULL)))) THEN&#8217;2X1X&#8217; ELSE &#8217;2X1X0X&#8217; END AS [C1],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[MAPReportId] AS [MAPReportId],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[PartnerNumber] AS [PartnerNumber],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[CapturedVia] AS [CapturedVia],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[Currency] AS [Currency],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[DataAsOf] AS [DataAsOf],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[DateApproved] AS [DateApproved],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[DateCreated] AS [DateCreated],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[DateProcessed] AS [DateProcessed],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[DateReturned] AS [DateReturned],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[DateSubmittedToRo] AS [DateSubmittedToRo],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[PeriodCovered] AS [PeriodCovered],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[ProcessGeneralComments] AS [ProcessGeneralComments],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[ReasonReturned] AS [ReasonReturned],</strong></font></p>
<p><font face="Courier New"><strong>[Extent1].[StatusID] AS [StatusID],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[AverageLoanSize] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL))THEN [UnionAll1].[AverageLoanSize] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C2],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[AveragePortfolioOutstanding] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6]IS NOT NULL)) THEN [UnionAll1].[AveragePortfolioOutstanding] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT(([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C3],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[BoYPortfolioOutstanding] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] ISNOT NULL)) THEN [UnionAll1].[BoYPortfolioOutstanding] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT(([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C4],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[DepositsAmount] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL))THEN [UnionAll1].[DepositsAmount] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C5],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS int) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1) AND([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[EoYNrBorrowers] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)) THEN[UnionAll1].[EoYNrBorrowers] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS int) END AS [C6],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[EoYPortfolioOutstanding] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] ISNOT NULL)) THEN [UnionAll1].[EoYPortfolioOutstanding] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT(([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C7],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS varchar(1)) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] =1) AND ([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[MFIPortfolioSize] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOTNULL)) THEN [UnionAll1].[MFIPortfolioSize] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] =1) AND ([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS varchar(1)) END AS [C8],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS int) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1) AND([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[NrLoans] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)) THEN[UnionAll1].[NrLoans] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS int) END AS [C9],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[InvestmentOutstanding] WHEN (([UnionAll2].[C6] = 1) AND([UnionAll2].[C6] IS NOT NULL)) THEN [UnionAll1].[InvestmentOutstanding] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C10],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[LoanOutstanding] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] ISNOT NULL)) THEN [UnionAll1].[LoanOutstanding] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT(([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C11],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN [UnionAll1].[OutstandingExposure] WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOTNULL)) THEN [UnionAll1].[OutstandingExposure] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT(([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C12],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS varchar(1)) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] =1) AND ([UnionAll2].[C6] IS NOT NULL)))) THEN CAST(NULL AS varchar(1)) WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL))THEN [UnionAll2].[C1] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS varchar(1)) END AS [C13],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)) THEN[UnionAll2].[C2] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6]IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C14],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)) THEN[UnionAll2].[C3] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6]IS NOT NULL)))) THEN CAST(NULL AS float) END AS [C15],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS varchar(1)) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] =1) AND ([UnionAll2].[C6] IS NOT NULL)))) THEN CAST(NULL AS varchar(1)) WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL))THEN [UnionAll2].[C4] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND([UnionAll1].[C6] IS NOT NULL)))) THEN CAST(NULL AS varchar(1)) END AS [C16],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS bit) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1) AND([UnionAll2].[C6] IS NOT NULL)))) THEN CAST(NULL AS bit) WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)) THEN[UnionAll2].[C5] WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND ([UnionAll1].[C6]IS NOT NULL)))) THEN CAST(NULL AS bit) END AS [C17],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)) THENCAST(NULL AS float) WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND([UnionAll1].[C6] IS NOT NULL)))) THEN [UnionAll2].[Exposure] ELSE [UnionAll2].[Exposure] END AS [C18],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)) THENCAST(NULL AS float) WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND([UnionAll1].[C6] IS NOT NULL)))) THEN [UnionAll2].[InvestmentOutstanding] ELSE [UnionAll2].[InvestmentOutstanding]END AS [C19],</strong></font></p>
<p><font face="Courier New"><strong>CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT (([UnionAll2].[C6] = 1)AND ([UnionAll2].[C6] IS NOT NULL)))) THEN CAST(NULL AS float) WHEN (([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)) THENCAST(NULL AS float) WHEN (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] IS NOT NULL) AND ( NOT (([UnionAll1].[C6] = 1) AND([UnionAll1].[C6] IS NOT NULL)))) THEN [UnionAll2].[LoanOutstanding] ELSE [UnionAll2].[LoanOutstanding] END AS [C20],</strong></font></p>
<p><strong><font face="Courier New">CASE WHEN (( NOT (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL))) AND ( NOT (([UnionAll2].[C7] = 1) AND ([UnionAll2].[C7] ISNOT NULL)))) THEN CAST(NULL AS decimal(18,2)) WHEN (([UnionAll1].[C5] = 1) AND ([UnionAll1].[C5] IS NOT NULL) AND ( NOT(([UnionAll2].[C6] = 1) AND ([UnionAll2].[C6] IS NOT NULL)))) THEN CAST(NULL AS decimal(18,2)) WHEN (([UnionAll2].[C6] = 1) AND([UnionAll2].[C6] IS NOT NULL))</font><br /></strong></p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1075</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Het institutionaliseren van agile</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1071&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=het-institutionaliseren-van-agile</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1071#comments</comments>
		<pubDate>Wed, 14 Dec 2011 09:31:31 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anti-patterns]]></category>
		<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Project management]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1071</guid>
		<description><![CDATA[Er is een anti-patroon op het gebied van agile dat me nauw aan het hart gaat. En dat is de institutionalisering van agile. In de afgelopen vijftien jaar heb ik met veel plezier en inzet organisaties en projecten gecoacht op &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1071">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1071"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1071&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"><iframe src="http://www.facebook.com/widgets/like.php?href=http://sanderhoogendoorn.com/blog/?p=1071" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"></iframe></div>
<p><em>Er is een anti-patroon op het gebied van agile dat me nauw aan het hart gaat. En dat is de institutionalisering van agile.</em>
<p>In de afgelopen vijftien jaar heb ik met veel plezier en inzet organisaties en projecten gecoacht op weg om agile worden. In die vijftien jaar heb ik ongelooflijk veel geleerd, over software ontwikkeling, over programmeren, over processen, over het doen van projecten maar misschien vooral over de mensen in die projecten, en hoe deze mensen samenwerken. En het moet gezegd worden, ieder mens is uniek, iedere samenwerking is uniek, en vooral daardoor, los van alle technieken en technologie, is ieder project anders.<br />
<h2>Handboeken agile</h2>
<p>Nu zijn we op een punt in de tijd beland dat agile populairder is dan ooit, en waarschijnlijk zelfs populairder is dan het ooit in de toekomst nog gaat worden. We zijn op het punt dat alle grote organisaties hun software ontwikkeling gaan veragiliseren. Dit is het punt in de tijd waarop meer en meer projecten agile worden uitgevoerd. En dit is daarom ook het punt in de tijd dat grote organisaties gaan vastleggen hoe agile projecten dienen te worden uitgevoerd.
<p><img src="http://newsleaks.in/wp-content/uploads/2011/07/books1.jpg"><br /><em>Handboek agile in zes delen</em></p>
<p>Er zullen steeds dikkere en gedetailleerde handboeken verschijnen met voorschriften over hoe lang een stand-up meeting mag zijn, welke vragen daarin moeten worden behandeld, hoe groot een team mag zijn, met welke ontwikkelomgevingen de ontwikkelaars moeten werken, welke testtechnieken mogen worden gebruikt, templates voor het vastleggen van user stories, smart use cases, evaluaties, en wellicht zullen er organisaties zijn die zo ver gaan dat ze gaan voorschrijven dat user stories op langwerpige gele post-its op het taskboard dienen te hangen en individuele taken op vierkante groene.</p>
<h2>De geest terug in de fles</h2>
<p>Als ik één tip mag geven? Zodra deze verschijnselen zich voordoen in een organisaties is agile ten dode opgeschreven. Agile projecten varen wel bij de juiste hoeveelheid vrijheidsgraden, mensen en samenwerking varen wel bij de juiste hoeveelheid vrijheid. Software ontwikkeling is een creatief proces, en agile werkwijzen zijn geëent op het zichzelf voortdurend verbeteren. Zodra organisaties agile gaan institutionaliseren, wordt de creativiteit langzaam maar heel zeker uit de projecten getrokken. Het zelflerend vermogen van agile projecten aan banden gelegd. De geest is weer terug in de fles, en de stop kan erop.</p>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1071</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Added GetOrDefault() extension methods for state providers</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1068&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=added-getordefault-extension-methods-for-state-providers-2</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1068#comments</comments>
		<pubDate>Fri, 18 Nov 2011 14:57:42 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1068</guid>
		<description><![CDATA[In the framework ADF.NET state can be temporarily stored by calling the StateManager. The StateManager is an static façade that holds three different instances of the IStateProvider interface. These instances are: Personal. State that is stored somewhere for personal use &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1068">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1068"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1068&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div class="wlWriterHeaderFooter" style="float:none; margin:0px; padding:4px 0px 4px 0px;"><iframe src="http://www.facebook.com/widgets/like.php?href=http://sanderhoogendoorn.com/blog/?p=1068" scrolling="no" frameborder="0" style="border:none; width:450px; height:80px"></iframe></div>
<p>In the framework <a href="http://http://adf.accelerateddeliveryplatform.com/" target="_blank">ADF.NET</a> state can be temporarily stored by calling the <strong>StateManager</strong>. The <strong>StateManager </strong>is an static façade that holds three different instances of the <strong>IStateProvider </strong>interface. These instances are:</p>
<ul>
<li><strong>Personal</strong>. State that is stored somewhere for personal use of the current user of the application. Usually in web applications an implementation is plugged in to use the <strong>Session </strong>object. in desktop applications this is more likely a <strong>Dictionary</strong>, and in Azure an implementation could be used to refer to Azure Storage.
<li><strong>Application</strong>. State that needs to be shared over all users.
<li><strong>Settings</strong>. State that can be obtained from settings, such as from <strong>environment.config</strong> or <strong>web.config</strong>.</li>
</ul>
<p>To facilitate easier use of state, we’ve added two overloaded extension methods that operate on the interface <strong>IStateProvider</strong>.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 119.61%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; height: 256px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> T GetOrDefault&lt;T&gt;(<span style="color: #0000ff">this</span> IStateProvider provider, <span style="color: #0000ff">string</span> key, Func&lt;T&gt; <span style="color: #0000ff">value</span>)</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> {</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     <span style="color: #0000ff">if</span> (!provider.Has(key)) { provider[key] = <span style="color: #0000ff">value</span>.Invoke(); }</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>&nbsp; </pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>     <span style="color: #0000ff">return</span> (T)provider[key];</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span> }</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span>&nbsp; </pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum8">   8:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> T GetOrDefault&lt;T&gt;(<span style="color: #0000ff">this</span> IStateProvider provider, <span style="color: #0000ff">string</span> key, T <span style="color: #0000ff">value</span>)</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum9">   9:</span> {</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum10">  10:</span>     <span style="color: #0000ff">if</span> (!provider.Has(key)) { provider[key] = <span style="color: #0000ff">value</span>; }</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum11">  11:</span>&nbsp; </pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum12">  12:</span>     <span style="color: #0000ff">return</span> (T)provider[key];</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum13">  13:</span> }</pre>
<p><!--CRLF--></div>
</div>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<p>Using these extension methods will allow you to get the value for a specific key, and in case it doesn’t exist yet, first add it to the state and afterwards return it. The first overload can be used to only evaluate the func when the key is not yet present, similar to the following code example.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 121.84%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; height: 122px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum1">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> DomainCollection&lt;Company&gt; GetAll()</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum2">   2:</span> {</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum3">   3:</span>     <span style="color: #0000ff">lock</span> (cacheLock)</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum4">   4:</span>     {</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum5">   5:</span>         <span style="color: #0000ff">return</span> StateManager.Personal.GetOrDefault(key, () =&gt; List(CompanyGateway.GetAll()));</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum6">   6:</span>     }</pre>
<p><!--CRLF-->
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"><span style="color: #606060" id="lnum7">   7:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>Here, the <strong>List()</strong> method is only invoked if no key is present. </p>
<p>The second overload is best used when the value does not need to be evaluated, but rather already exists.</p>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1068</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Death by Dogma versus Agile Assembly</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1063&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=death-by-dogma-versus-agile-assembly</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1063#comments</comments>
		<pubDate>Fri, 04 Nov 2011 13:50:43 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anti-patterns]]></category>
		<category><![CDATA[Documentation]]></category>
		<category><![CDATA[iteration]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Smart]]></category>
		<category><![CDATA[Smart estimation]]></category>
		<category><![CDATA[Smart use cases]]></category>
		<category><![CDATA[Talks]]></category>
		<category><![CDATA[User stories]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1063</guid>
		<description><![CDATA[On November 3, 2011 I presented the keynote of the Agile Open Holland Conference in Dieren. During this challenging talk I discussed the current state of affairs in agile organizations and projects and the effects of the recent strong rise &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1063">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1063"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1063&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><em>On November 3, 2011 I presented the keynote of the Agile Open Holland Conference in Dieren. During this challenging talk I discussed the current state of affairs in agile organizations and projects and the effects of the recent strong rise in popularity of agile approaches.</em> <em>Let’s put it mildly: there’s a lot of work to be done.</em></p>
<h2>Death by dogma</h2>
<p>Almost all organizations, large and small, are turning towards agile to escape failing traditional software development projects. Due to this strong increase in popularity of agile approaches and techniques, many newcomers will enter the field of agile coaching. Of course without the very necessary real-life experience but proudly waving their Certified Professional Scrum Master Sensei Trainer Certificate proving they at least had two days of training. </p>
<p><img src="http://www.worklifeinnovation.com/blog/wp-content/uploads/2008/05/diploma.jpg"><br /><em>Going through the hardship of two whole intense days of training becoming a Certified Agile Jedi Knight is worthwhile!</em></p>
<p>In my opinion, as a result many organizations and projects in the next couple of years will be coached why well-willing consultants who have barely made it through boot camp, and in the famous Shu-Ha-Ri learning model haven’t yet made it beyond copying their teacher. This will lead to very dogmatic applications of the more popular agile approaches, mostly Scrum, especially when the so-called leaders in the field themselves turn to dogma. This dogmatic thinking will block the use of more mature techniques and technology in agile projects, even when these would really improve projects, or would prevent agile projects from failing. “No, you can not do modeling in Scrum” and “Burn-down charts are mandatory” are two such simple real-life example statements that I’ve witnessed some certified agile Jedi Knight make. Due to this lack of experience and the growing dogmatism in the agile beliefs, more and more agile projects will fail. Death by dogma.</p>
<p>During my keynote I discussed many examples of dogmatic Scrum implementations and the drawbacks from being <em>dogmagile, </em>building the story up from my previous posts <a href="http://sanderhoogendoorn.com/blog/?p=1048" target="_blank">Scrumdamentalists and Crusaders</a> and <a href="http://sanderhoogendoorn.com/blog/?p=1059" target="_blank">Flower-Power Agile Fluffiness</a>. </p>
<p>But maybe even more important during the keynote I also show that there is no such thing as one-size-fits-all agile. Different organizations and different projects require different agile approaches. Sometimes lightweight agile, for instance implemented using Scrum, user stories, simple planning, simple estimation, and one co-located team using post-its on a wall is just fine. But in many projects the way of working used should rather be built up from slightly more enterprise ready approaches, for example using Smart, smart use cases, standardized estimation, multiple distributed teams and on-line dashboards. </p>
<h1>What is agile anyway?</h1>
<p>Implementing agile in your projects starts with establishing what it means to be in an agile project. As I demonstrate in the keynote, I consider <em>short iterations</em>, <em>collaborative teams</em>, a <em>small unit of work</em>, <em>continuous planning</em>, <em>delivering early and often</em>, and <em>simplifying communication </em>to be crucial to considering a project working in an agile way. </p>
<p>From there you can pick and choose from a wide variety of approaches, techniques and technology. Most of them stemming from the agile era, but some of them can also be related to older (or more mature) era’s. Concluding you might say that to be successful in implementing agile in <strong>your </strong>organization, you will need to assemble <strong>your </strong>agile approach from everything that will help you implement these six agile bare necessities. Anyway, enjoy!</p>
<div style="width: 425px" id="__ss_10025690"><strong style="margin: 12px 0px 4px; display: block"><a title="Death by Dogma versus Agile Assembly" href="http://www.slideshare.net/aahoogendoorn/death-by-dogma-versus-agile-assembly" target="_blank">Death by Dogma versus Agile Assembly</a></strong> <iframe height="355" marginheight="0" src="http://www.slideshare.net/slideshow/embed_code/10025690" frameborder="0" width="425" marginwidth="0" scrolling="no"></iframe>
<div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/aahoogendoorn" target="_blank">Sander Hoogendoorn</a> </div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1063</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Flower-Power Agile Fluffiness</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1059&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=flower-power-agile-fluffiness</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1059#comments</comments>
		<pubDate>Thu, 08 Sep 2011 15:07:40 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anti-patterns]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Smart use cases]]></category>
		<category><![CDATA[Use cases]]></category>
		<category><![CDATA[User stories]]></category>
		<category><![CDATA[Waterfall]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1059</guid>
		<description><![CDATA[To all the dear people in the agile community and to the faint-hearted: this will not be an easy blog post. There was a time when being a software developer was a decent craft, requiring decent craftsmanship and yes also &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1059">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1059"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1059&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><em>To all the dear people in the agile community and to the faint-hearted: this will not be an easy blog post. There was a time when being a software developer was a decent craft, requiring decent craftsmanship and yes also a lot of creativity, some communication, some collaboration. Still it was a decent craft. The waterfall-ish methodologies we used weren’t extremely optimal, but at least software development was a craft. Similar to a carpenter who uses his tools to craft new furniture, or a industrial designer using his tools to come up with a new model Toyota – I know this is not the best example, but at least I now have the attention of the kind folks in the lean community. And then came agile.</em></p>
<p>Now believe me, I don’t have anything against agile. I’ve been promoting agile and iterative approaches to software development since the mid-nineties, and haven’t done traditional projects ever since. Agile used to be about engineering. We were improving ourselves by using better techniques, continuous integration or continuous deployment, writing unit test, pair programming, writing <a href="http://www.accelerateddeliveryplatform.com/SmartUseCase.ashx">smart use cases</a> or user stories, using a bug tracker, burn-down charts and even post-its on the wall. So far, it’s still all in a days work. There was a time that as an analyst, a developer, or a tester you could be proud of being in an agile project.</p>
<p>But these days if I look at what’s going on at agile conferences, on twitter, in blog posts, literature and discussions on agile, Scrum, Lean, Kanban and whatever new flavors of the month are passing by, I get the feeling I’m no longer talking about craftsmanship but rather ending up in Disneyland or in San Francisco in the late sixties. I’ve got a feeling were not in Kansas anymore.</p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image100.png" target="_blank"><img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb28.png" alt="image" width="482" height="302" border="0" /></a><em><br />
Agile coach at work.</em></p>
<h2>Agile community anti-patterns</h2>
<p>Certainly it’s a good thing everybody can join the agile community. But I witness a lot of repetitive behavior I strongly discourage. Let’s name this repetitive behavior <em>agile community anti-patterns – </em>not to confuse with agile anti-patterns. The latter merely describe failures in agile projects, and yes these do occur, while the former describe <em>community </em>failures. Let me sum some up for you – while on the fly breaking my first anti-pattern:</p>
<ul>
<li><em>Metaphorizing</em></li>
<li><em>Zenify</em></li>
<li><em>Kindergarten Agile</em></li>
<li><em>Open Door Wisdom </em></li>
<li><em>Scrumdamentalism</em></li>
</ul>
<p>Allow me to elaborate a bit on these agile community anti-patterns.</p>
<h2>Metaphorizing</h2>
<p>Although I’m not sure metaphorizing is a even good English word, I’m quite sure you get the meaning of it. Everything anybody comes up with these days about agile – or about what people <em>think </em>is agile – is immediately turned into a metaphor or is given a silly name.</p>
<p>Can we please stop talking about the <em>Gemba Walk </em>when we mean that it’s a good thing our manager stops by every now and then? This shouldn’t even have a name.</p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image101.png" target="_blank"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb29.png" alt="image" width="482" height="362" border="0" /></a><br />
<em>Japanese manager stopping by.</em></p>
<p>What does it mean when an agile specialist states that “you should verify the <em>five why’s </em>with the <em>reverse loop</em>”? And what about <em>Feature Injection</em>? According to a recent tweet “feature Injection is more about using examples to discover the relationships you <em>need</em> and missed or got wrong.” Call me old-fashioned but I totally miss what this is about.</p>
<h2>Zenify</h2>
<p>Yes, I know lean manufacturing started in Japan at Toyota. So there is a link between agile and Japan. But is that an argument to zenify software development?</p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image102.png" target="_blank"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb30.png" alt="image" width="482" height="362" border="0" /></a><br />
<em>Our new Feng Shui office space. </em></p>
<p>Why do we need to explain roles in a software development project as <em>samurai</em>, <em>sensei</em> or <em>roshi</em>. I thought product owner and agile coach were already abstract enough. What about re-arranging our office in a Feng Shui manner? Also the word <em>kaizen</em> seems to become very popular. Quoting a recent tweet: “Just write down small things on small papers. It&#8217;s your kaizen.” Although I’m all for small things what does this mean and why do I need to introduce this in my project?</p>
<h2>Kindergarten Agile</h2>
<p>Not sure about the average level of maturity of people in agile projects around the world, but in the projects I’ve been in the last decade or so, people where pretty mature. So why is it groups of sensible people at <em>un</em>conferences are discussing the <em>Happiness Index </em>of projects? To me this sounds much more like a weekly column in a women’s magazine than a solid engineering practice in a software development project.</p>
<p>And I for one certainly don’t want to have to pass a baton if the flow in my stand-up meeting or scrum isn’t achieved automagically. Still this was seriously recommended by one of the authorities in the agile community during a recent presentation at a conference.</p>
<p>Some tweets to further illustrate my point? If someone says “Add <em>Ready for Celebration </em>before the Done column on your wall board” should I start decorating the office? It makes you wonder how often his projects get things done. Even worse is “Make sure you don&#8217;t miss the agile elephant versus the waterfall elephant in the lobby.” which was tweeted from a recent agile conference. Where was this conference held? At the Toys-R-Us?</p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image103.png" target="_blank"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb31.png" alt="image" width="482" height="362" border="0" /></a><br />
<em>Participants at a recent agile conference strolling down the exhibition hall.</em></p>
<h2>Open Door Wisdom</h2>
<p>Often I see quotes coming from the agile community that are no more than open doors, and have been open doors in projects for decades and perhaps centuries, but that are treated by others in the community as sources of new and ultimate wisdom.</p>
<p>Recently a speaker at an agile conference claimed that “if your retrospectives don’t add value to your project, you should change your retrospectives.” Duh. The speaker got a loud applause from the audience, he is now considered an absolute guru, and his quote got tweeted and re-tweeted all over the world. This is not even an open door, it’s an open gate.</p>
<h2>Scrumdamentalism</h2>
<p>Now I’ve blogged about <a href="http://sanderhoogendoorn.com/blog/?p=1048" target="_blank">Scrumdamentalism</a> before, but with the newer generations of agile converts, some communities are getting more and more populated by religious zealots who will treat their newly gained faith with deep fundamentalism. Any best practice from their own belief is treated as mandatory, while followers from other beliefs are often considered heretics. A recent blog post states that: “A technical project manager can be a good product owner if he sticks to managing the product backlog and abiding by the rules of Scrum.” I wasn’t aware that Scrum even had rules. You learn something new everyday.</p>
<p>And if Scrumdamentalism alone isn’t bad enough already, it is even enforced by the so-called leaders themselves, proven by the following horrible quote &#8220;the team needs to listen to god talk and follow the commandments&#8221; from one of the Great Leaders in this particular community. Dear agilists there is is no one-true-belief. There’s value in all of them. And also can we please abolish the function title Agile (or Scrum or Kanban or Lean) Evangelist. Moreover, people calling themselves Agile Sensei should be banned from conferences and projects if you ask me.</p>
<h2>Flower-Power Agile Fluffiness</h2>
<p>Please people can we stop adding all this new age Flower-Power fluffiness to agile. In my opinion the agile community with all it’s great ideals and best practices is slowly degrading into a worldwide Luna park. My guess is I that it won’t be long before someone somewhere will suggest to add a psychotherapist to every software development project. “How do you feel about not being able to get your user story to the <em>Ready for Celebration </em>column?” Or plan a clown’s visit during retrospectives to increase the Happiness Index.</p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image104.png" target="_blank"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb32.png" alt="image" width="482" height="322" border="0" /></a><br />
<em>Agile retrospective with product owners present.</em></p>
<p>We are slowly becoming the laughing stock of the engineering world. I long for the time that we re-introduce engineering in our trade, and all go back to work again.</p>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1059</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Scrumdamentalists and crusaders</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1048&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scrumdamentalists-and-crusaders</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1048#comments</comments>
		<pubDate>Wed, 29 Jun 2011 10:52:45 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Anti-patterns]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Smart use cases]]></category>
		<category><![CDATA[User stories]]></category>
		<category><![CDATA[Waterfall]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1048</guid>
		<description><![CDATA[After having promoted agile and iterative approaches to software development projects for over a decade, I finally find that, like Bob Dylan says, the times they are a-changing. And for the better. Many small and large organizations and enterprises are &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1048">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1048"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1048&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><em>After having promoted agile and iterative approaches to software development projects for over a decade, I finally find that, like Bob Dylan says, the times they are a-changing. And for the better. Many small and large organizations and enterprises are now turning towards agile approaches, often to compensate for years and years of failing projects. You might suggest that all’s well that ends well . But…</em></p>
<p>With the growing success of agile approaches new patterns and anti/patterns arise. Implementing agile well, although promoted as being easy by many, isn’t that easy. It’s actually quite hard to get it right. Implementing agile well is a learning process, just like learning to ride a bicycle well, or learning how to master a programming language. This is where coaching on the job can and should play an important role. </p>
<h2>Pokemon Trainers and Jedi Knights</h2>
<p>But good agile coaches are scarce these days. So many companies jump into this growing gap and send of there consultants to far away agile training courses. Inexperienced or at most with little experience these suddenly acclaimed Scrum Masters, Lean Certified Project Managers, Pokémon Trainers and Jedi Knights are now pushed into the marketplace.</p>
<p>Let me predict you that this explosion of these new gurus will lead to massive agile project failure. Allow me to explain. As with most religions, people just entering the new belief tend to be far more fundamentalistic and dogmatic about their new faith than people who have lived in the same religion for years. Newbies will apply the religion’s commandments far more literally than they are meant – as the elders know. And moreover, these newbies will see there new religion as the only true source of knowledge, denying the value in other religions. </p>
<p>In a sense you might say we’re in the Agile Middle Ages. The new agile fundamentalists are like crusaders, full of enthusiasm, heavily armed, not very adapted or open to the new world they travel too, but with an urge to strike down all non-believers.</p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sanderhoogendoorn.com/blog/wp-content/image99.png" width="443" height="332" />    <br /><em>Agile fundamentalist in the field</em></p>
<h2>Scrumdamentalism illustrated</h2>
<p>This fundamentalism is best witnessed in the Scrum community. Personally, I like Scrum a lot, but too often I see Scrum certified coaches making remarks about what is and what isn’t Scrum, and even worse: what is and what isn’t agile. Let me illustrate my statement with some real-life examples.</p>
<p>In many projects, especially the more enterprise projects, I prefer modeling smart use cases and use these as unit of work, estimation, development and testing way over the more unstructured user stories. At quite a few occasions Scrumdamentalists have come up to me and claim that you <strong><em>must</em></strong> use user stories, otherwise you’re not doing Scrum, but instead you are doing waterfall. Modeling doesn’t seem to be allowed&#160; anyway in a Scrum project, if I believe my Scrumdamentalists.&#160; Now I haven’t read the little Red Book of Scrum, but I’m pretty sure Scrum doesn’t really push user stories as being mandatory, nor forbids modeling. </p>
<p>Another great example followed a picture I tweeted of my current project’s dashboard during a week when our tester was on holiday. Clearly the list of work items to test was larger than the other columns. My picture led to a remarkable comment from a certified and even experienced Scrum Master that all team members should automatically take over each others work when someone is offline. And if we didn’t do that we were not doing agile, but were doing waterfall instead. </p>
<p>Yes I do consider that taking over each others work is good practice, but to a certain extent. I don’t know about your project, but in my project testing is serious business, with serious techniques, that requires serious expertise. Testers do totally different work than analysts or developers. I don’t see any of my C# developers creating process cycle tests or writing functional test cases. Or even worse, the other way around. Would you seriously consider a tester to learn how to write C# code, just because one of the developers spends a week on the beach? So I guess I’m in a waterfall project.</p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMAG0024" border="0" alt="IMAG0024" src="http://sanderhoogendoorn.com/blog/wp-content/IMAG0024.jpg" width="473" height="284" />    <br /><em>A non-proper agile dashboard</em></p>
<p>And if you think this was the low point of my experiences, another Scrumdamentalist overlooked the picture I posted and noticed that my project has different and more stages a work item goes through than the task board he considered obligatory. We had stages such as developer testing, testing, accepting and approving, while he said that you only have to-do, working and done on a <strong><em>proper</em></strong> task board.</p>
<p>And dear people, is it really necessary to call an iteration a sprint, and a stand-up meeting a scrum to make my project successful?</p>
<h2>Process fits project</h2>
<p>I strongly believe that this agile fundamentalism and dogmatic thinking is going to stop progress and productivity. It ignores on of the basic principles that makes agile such a strong proposition – namely to improve on your process and techniques continuously to make the process fit your project, and not the other way around. </p>
<p>Dear people in the agile communities, please don’t try to become holier than the pope. Being agile means not trying to be dogmatic. We are not looking for the holy grail. There is no one true agile religion I’m afraid, there’s value in all of them. As the agile manifesto clearly states: we are <strong><em>uncovering</em></strong> better ways of developing software by doing it. So go out and explore.</p>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1048</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Modeling your domain models in UML</title>
		<link>http://sanderhoogendoorn.com/blog/?p=1045&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=modeling-your-domain-models-in-uml</link>
		<comments>http://sanderhoogendoorn.com/blog/?p=1045#comments</comments>
		<pubDate>Thu, 12 May 2011 09:21:23 +0000</pubDate>
		<dc:creator>shoogend</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design patterns]]></category>
		<category><![CDATA[Domain driven design]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://sanderhoogendoorn.com/blog/?p=1045</guid>
		<description><![CDATA[In any given system under development, the business domain of that system is key. It holds all concepts important to the domain, and captures the business logic from the domain. An important question to answer is what to model about &#8230; <a href="http://sanderhoogendoorn.com/blog/?p=1045">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: left; margin-right: 10px; margin-top: 0px; margin-bottom: 5px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1045"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fsanderhoogendoorn.com%2Fblog%2F%3Fp%3D1045&amp;source=aahoogendoorn&amp;style=normal&amp;service=TinyURL.com&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><em>In any given system under development, the business domain of that system is key. It holds all concepts important to the domain, and captures the business logic from the domain. An important question to answer is what to model about the objects in that domain and how to model this in UML class diagrams.</em></p>
<h2>Identifying the elements of the business domain</h2>
<p>First of all, it is important to underline which types of classes participate in the model, simply referred to as the domain model. Aligned with the paradigm of domain driven design, I recommend to model the following types of classes:</p>
<ul>
<li>Domain objects. </li>
<li>Factories. </li>
<li>Repositories. </li>
<li>Services. </li>
</ul>
<h2>Domain objects</h2>
<p>A domain object captures a concept from the real world of the application. Think of <strong>Contact</strong>, <strong>Contract</strong>, <strong>Company</strong> or <strong>Address</strong>. Domain object are considered to have identity. Next, domain objects have properties, and these properties have types. Also, domain object deliver services (often implemented as methods).</p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image92.png" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb21.png" width="502" height="262" /></a>&#160; <br /><em>A number of domain objects in a class diagram</em></p>
<p>A concept in the business domain should be considered as such if it has either state (modeled in properties) or delivers services (modeled as operations). Or of course both.</p>
<h2>Factories</h2>
<p>Factory classes are used to create new instances of domain objects. Although this can often be achieved by just directly creating a domain object from scratch, in most domains creating new object is more complex, especially with the core concepts in the business domain. For instance, when we created a new <strong>Contact</strong>, it need to have a least one <strong>Address</strong> which also needs to be created, and it should be aligned with the current <strong>Company</strong>. When creating such a construct (often referred to as a aggregate in domain driven design) a factory class is used (and modeled) to holds this creation functionality.     </p>
<p>A factory class can cover multiple creation scenarios. Name your factory classes after the domain object it creates. Think of classes such as <strong>ContactFactory</strong> and <strong>CompanyFactory</strong>. Model each of these scenarios as a method on the factory class. </p>
<h2>Repositories</h2>
<p>Additionally to the factory classes, a business domain can have repositories. A repository is responsible for answering enquiries about existing instances of domain objects. For instance, you might want to grab all instances of <strong>Contact</strong> who live in Amsterdam. Name such repositories after the corresponding domain object. Think of <strong>ContactRepository</strong> or <strong>AddressRepository</strong>. Model such enquiries as methods on the repository associated with the domain object. Please note that many projects choose to combine the factory and repository classes. </p>
<h2>Services</h2>
<p>Some services in the business domain do not directly correspond to a domain object, but rather apply to several different domain objects. In this case, such as service can be modeled as a separate class, usually with the name of the actual task as its class name. Think of a service such as&#160; <strong>ImportFromExcel</strong> that imports a project, its work items and their estimates into a dashboard. </p>
<p>As an alternative, projects may choose not to model separate factories, repositories and services, but rather add all their functionality as services on the actual domain object. In this case, I would recommend stereotyping these methods for example as <strong>factory method</strong>, <strong>repository method</strong> or <strong>service</strong>, so their purpose is immediately clear. </p>
<p>Please note that even though now these methods are modeled on the domain object, they will likely not be implemented there, but on the actual factories and repositories. This alternative is merely a technique to avoid cluttering the domain model with unnecessary classes. Domain models are full enough without adding factories and repositories.</p>
<h2>Identifying properties </h2>
<p>Now let’s delve down to the domain objects, clearly the most important type of class in the domain model. Next to delivering services, domain objects have properties, such as Name, <strong>Email</strong>, <strong>City</strong>, <strong>Country</strong>, <strong>Level</strong>. </p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image93.png" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb22.png" width="502" height="296" /></a>    <br /><em>A domain object <strong>Contact </strong>with a number of public properties</em></p>
<p>You will need to identify all meaningful properties on your domain objects. Basically you will need to identify all properties that a domain object exposes to the outside world, either other classes in the domain, user interface elements that bind to it, use cases or persistency layers. These are the public properties of the domain object.</p>
<p>Do not model fields that are internal to a domain object as these are not relevant to the business domain but in most cases are only relevant to the developers. Thinks for instance of the <strong>Id</strong> of a domain object, that is required to store it in a database or to a web service.</p>
<p>A special reminder goes out to properties that are not persisted but are calculated or assembled by the other properties and fields of the domain object. These are called derived properties, and should be marked as such in the domain model.</p>
<h2>Modeling property types</h2>
<p>And each of these properties has a type. These types actually hold quite a lot of information on the business domain – maybe even more than you’d expect.</p>
<p>I consider the following types of property types:</p>
<ul>
<li>Basic types such as <strong>string</strong>, <strong>DateTime</strong>, <strong>float</strong>. </li>
<li>Values types or objects such as <strong>ISBN</strong>, <strong>Email</strong> or <strong>BSN</strong>. </li>
<li>Enumerations </li>
<li>Variable lists. </li>
<li>Associations. </li>
</ul>
<h2>Basic types</h2>
<p>Many properties will appear to have a basic type, such as <strong>number</strong>, <strong>string</strong>, <strong>date</strong>, <strong>timestamp</strong>, <strong>float</strong>. However, note that for a whole lot of properties, you actually quite a lot more than that it’s just a <strong>string</strong>. Therefore, for each property check properly if you know more about it than that it just has a basic type. </p>
<h2>Value types or object</h2>
<p>A value type or object is an object that is recognizable by its value, but where we are not interested in it’s identity. For instance, two instances of my email address will appear to be the same, while two instances of <strong>Company </strong>that can have exactly the same values for all properties can still be two different companies. </p>
<h2>Enumerations</h2>
<p>Sometimes, a property can only have a limited set of values. In this case you might consider modeling an enumeration (which is a standard stereotype in UML). This enumeration holds the possible values, so next you can model the property of the type of the enumeration. </p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image94.png" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb23.png" width="502" height="183" /></a>    <br /><em>Enumerations <strong>ContactType</strong>, <strong>PrivacyLevel </strong>and <strong>Gender</strong>.</em></p>
<p>For instance, a domain object <strong>Contact </strong>might have a <strong>Type</strong> property that be <strong>Individual</strong>, <strong>Group</strong> or <strong>Family</strong>. Now model an enumeration <strong>ContactType</strong> that holds these values, and model the property <strong>Type</strong> of type <strong>ContactType</strong>.     </p>
<p>But, there’s a restriction to using enumerations. Only use these if you are certain that the list of possible values is static, that is does not change over the course of the life of you application. If you need to add to or change the list of values, this results in re-testing your whole application as the values are often used to perform conditional operations. So if you think the list of values is going to change don’t use an enumeration. Model a variable list instead.</p>
<h2>Variable lists</h2>
<p>If a property can only have a value from limited set of values, but that list is subject of change during the life of your application, enumeration are not the best solution. The list of values itself should be maintained – either by some software, possibly external to your application, or directly in the database. Think of lists of countries, states or academic titles.    </p>
<p>Therefore you will need to take extra care of these properties. Now there’s a number of options here. If the list only uses standard properties (think of <strong>Name</strong> and <strong>Description</strong>) and is just used for reference, you might want to group all these different list into one single domain object (and hence table). In this case, an additional properties is required for this domain object, for instance called <strong>Type</strong>, that describes the type of element, such as <strong>Country</strong>, <strong>State</strong>, or <strong>AcademicTitle</strong>. In this option you will only need a single maintenance use case to maintain all values in all lists. The value or now available for reference, selection or printing on envelopes. We usually refer to this pattern as <em>Smart Reference</em>.     </p>
<p>For modeling a property of the type of such a variable list there are a number of options. Either refer to the type of list in the name of the property (call it <strong>Country</strong>, <strong>State</strong> or <strong>AcademicTitle</strong>) and model <strong>SmartReference </strong>as the type of the property. This works out fine as long as you don’t have to properties of a domain object referring to the same variable list.     </p>
<p>A more agreeable option is to give the property the name you want it to have, and model the type of the variable list as the type of the property. To make sure the property is recognized as a variable list, add a stereotype (for instance <strong>smartreference</strong>) tot the property. </p>
<h2>Associations</h2>
<p>And then there’s the option that would want to refer another domain object. In this case you normally model an association rather than model a property. An association models a structural relationship between two (or more, but don’t go that road) objects in your business domain. So if a contact has zero, one or multiple relationship, you can model this as a one-to-many association between the domain object <strong>Contact </strong>and <strong>Relationship </strong>in your domain model. </p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image95.png" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb24.png" width="502" height="119" /></a>    <br /><em>Two (named) associations between <strong>Contact</strong> and <strong>Relationship</strong>.</em></p>
<p>In code all associations (as in UML) are represented by properties that exist on both classes. So in the example <strong>Contact </strong>will have a property that represents a list of relationships. And vice versa, each <strong>Relationship</strong> will have a property of type <strong>Contact</strong>. Unless you add additional names to the ends of the association in the domain model, the names for these properties are undefined. However it’s a good habit to name them after the domain object they come from. So the properties will simply be called <strong>Contact.Relationships</strong> and <strong>Relationship.Contact</strong> – mind the plural.     </p>
<p>However, if there’s two different associations between the same domain objects, applying this default naming patterns isn’t enough. It would result in multiple properties with the same name. In that case always specify meaningful names explicitly to the ends of the association. For instance if another association (one-to-one) between <strong>Contact </strong>and <strong>Relationship </strong>exists that identifies who’s the from and who’s to to in the relationship, this could result in properties <strong>Contact.Froms</strong> (a list of type <strong>Relationship</strong>) and something like <strong>Contact.Tos </strong>(also a list of type <strong>Relatioship</strong>).     </p>
<p>Another reason for specifying meaningful names to association ends is that these simply occur in the vocabulary of the business domain. </p>
<h2>Adding validations</h2>
<p>The next step is to add validations to you domain model, and your domain objects in particular. I’ll look at the following types of validations:</p>
<ul>
<li>Are properties <em>mandatory</em> or not? </li>
<li>Is the property valid if the type is a <em>value object</em>? </li>
<li>Is the property correctly <em>formatted</em>? </li>
<li>Does the domain object adhere to the defined <em>business rules</em>? </li>
</ul>
<h2>Mandatory properties</h2>
<p>Most properties on domain objects will be mandatory (although debatable). Therefore by default the multiplicity for a property is set to <strong>[1..1]</strong>, which means that there is to be exactly one occurrence for this properties on each object. If a property is not mandatory for the domain object to be valid the multiplicity of such a property is set to <strong>[0..1]</strong> – which implies that zero or one instances of this property are present.</p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image96.png" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb25.png" width="502" height="143" /></a>    <br /><em>Mandatory and non-mandatory properties</em></p>
<p>In the example above, <strong>BirthName</strong> is not mandatory, but <strong>AlternativeEmail2 </strong>is. </p>
<h2>Value objects </h2>
<p>The use of value types of objects in your domain objects explicitly adds validation to your objects. It means that the validations rules for this particular value object will apply to such a property automatically. If a property is defined using type <strong>Email</strong>, all values (when checked) need to follow the rules defined on the value object Email that define when something is in fact a valid <strong>Email</strong>. Of course, these validations can best be modeled on the value object itself. </p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image97.png" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb26.png" width="502" height="88" /></a>    <br /><em>Properties that have a value object as their type (<strong>Email</strong>)</em></p>
<p>In code, this could results in the following property for class <strong>Contact </strong>(using the ADF.NET framework).</p>
<div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 125.94%; padding-right: 4px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; height: 116px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px">
<div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   1:</span> <span style="color: #0000ff">public</span> Email AlternativeEmail2</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   2:</span> {</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   3:</span>     get { <span style="color: #0000ff">return</span> state.GetValue&lt;Email&gt;(ContactDescriber.AlternativeEmail2); }</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   4:</span>     set { state.SetValue(ContactDescriber.AlternativeEmail2, <span style="color: #0000ff">value</span>); }</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   5:</span> }</pre>
</p></div>
</div>
<h2>Formatting</h2>
<p>Some properties follow a certain format. Think of properties representing money or dates. If the type of the property is a value object, the format should be specified there (often as a regular expression). If not, model the format with the property. Please note that formatting is often culture specific. </p>
<p>Formats can include aspects such as length attributes, for instance a string may not be longer than 64 characters, or must be within a certain range, for instance when a value must be larger than 0 but smaller than 128. </p>
<h2>Business rules</h2>
<p>Additionally domain objects can validate business rules. For instance on a domain object <strong>Relationship</strong>, a business rule may validate that both contacts in the relationship match some relationship type. This can be defined in an operation (or a method in code) called <strong>ToContactMustMatchRelationshipType</strong>. Although this seems like an abundant long name, in fact I recommend to name business rules exactly to what they’re actually doing. Moreover, I recommend to implement the business rules in code using exactly the same name, thus creating traceability.</p>
<p><a href="http://sanderhoogendoorn.com/blog/wp-content/image98.png" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://sanderhoogendoorn.com/blog/wp-content/image_thumb27.png" width="502" height="243" /></a>&#160; <br /><em>Modeling business rules in your domain object using the <strong>business rule</strong> stereotype</em></p>
<p>I also recommend to add the stereotype <strong>business rule </strong>to these operations to distinguish them from other methods your classes have. In code the business rule <strong>ToContactMustMatchRelationshipType </strong>could look something like this. Here the attribute <strong>BusinessRule </strong>is attached to the method for the same reason, and to allow for automatic validation.</p>
<div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 152.18%; padding-right: 4px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; height: 161px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px">
<div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   1:</span> [BusinessRule]</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   2:</span> <span style="color: #0000ff">public</span> ValidationResult ToContactMustMatchRelationshipType()</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   3:</span> {</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   4:</span>     <span style="color: #0000ff">return</span> !To.IsEmpty &amp;&amp; RelationshipType.To != To.ContactType</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   5:</span>         ? ValidationResult.CreateError(<span style="color: #0000ff">this</span>.Prop(r =&gt; r.To), <span style="color: #006080">&quot;Contact type '{1}' for {0} does not match required contact type '{2}'.&quot;</span>, To, To.ContactType, RelationshipType.To) </pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   6:</span>         : ValidationResult.Success;</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   7:</span> }</pre>
</p></div>
</div>
<h2>&#160;</h2>
<p>An interesting type of business rule is that where the domain object at hand is validated against other domain object (mostly of the same type). For instance, when adding a new <strong>OrderType</strong> object, even though it is by definition unique (as domain object have identity by nature, usually implemented using an <strong>Id </strong>property), may not have the same name as any of the other already existing order types. Or a new contract </p>
<h2>When to validate?</h2>
<p>An intriguing question that comes to mind when discussing validation is when to validate the validations? In a traditional Windows user interface one might say that the moment the user leaves a field and moves to the next the validation for the represented domain object property could or should be fired. In a web application typically the user types in all the fields and then presses submit.</p>
<p>Validating the objects at hand should fire all validations, value objects, mandatory properties, formatting, business rules that are valid for the event (such as save, remove). In the code example from use case <strong>Manage Address</strong> an <strong>Address </strong>object is validated and than saved .</p>
<div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 150.17%; padding-right: 4px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; height: 210px; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px">
<div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> SaveAddress()</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   2:</span> {</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   3:</span>     </pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   4:</span>     <span style="color: #0000ff">if</span> (<span style="color: #0000ff">this</span>.Execute(</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   5:</span>         () =&gt; Address.Validate(),</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   6:</span>         () =&gt; Address.Save(),</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   7:</span>         () =&gt; SaveContact()))</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   8:</span>     {</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">   9:</span>         OK();</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  10:</span>     }</pre>
<pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"><span style="color: #606060">  11:</span> }</pre>
</p></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://sanderhoogendoorn.com/blog/?feed=rss2&#038;p=1045</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

