<?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"
	>

<channel>
	<title>the 'bee log</title>
	<atom:link href="http://laribee.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://laribee.com/blog</link>
	<description>Coaching, Process, Design, Speculation</description>
	<pubDate>Mon, 24 Nov 2008 15:43:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>Psst&#8230; Over Here</title>
		<link>http://laribee.com/blog/2007/09/19/psst-over-here/</link>
		<comments>http://laribee.com/blog/2007/09/19/psst-over-here/#comments</comments>
		<pubDate>Wed, 19 Sep 2007 22:28:49 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/09/19/psst-over-here/</guid>
		<description><![CDATA[This&#8217;ll be redundant for a lot of people but I&#8217;ve picked this blog up and moved it over to CodeBetter. 
Note that my&#160;RSS feed hasn&#8217;t changed&#160;(more on how I managed that later) so this announcement is really for&#160;friends, enemies, frenimies, and lost Googlers&#160;that come to laribee.com or thebeelog.com straight up.
Now back to your regularly scheduled [...]]]></description>
			<content:encoded><![CDATA[<p>This&#8217;ll be redundant for a lot of people but I&#8217;ve picked this blog up and <a href="http://codebetter.com/blogs/david_laribee/">moved it over to CodeBetter</a>. </p>
<p>Note that <strong>my&nbsp;RSS feed hasn&#8217;t changed</strong>&nbsp;(more on how I managed that later) so this announcement is really for&nbsp;friends, enemies, frenimies, and lost Googlers&nbsp;that come to laribee.com or thebeelog.com straight up.</p>
<p>Now back to your regularly scheduled program!</p>
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/09/19/psst-over-here/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Human Amplification</title>
		<link>http://laribee.com/blog/2007/09/14/human-amplification/</link>
		<comments>http://laribee.com/blog/2007/09/14/human-amplification/#comments</comments>
		<pubDate>Fri, 14 Sep 2007 04:45:37 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/09/14/human-amplification/</guid>
		<description><![CDATA[I love this term: human amplification. I believe (but can&#8217;t find confirmation) that it comes from the U.S. Navy.
You know the idea. The Agile realm re-imagines the traditional manager as a sort of human amplifier. Let&#8217;s consider Scrum. One of the named roles in Scrum is the Scrum Master. It is the Scrum Master&#8217;s responsibility [...]]]></description>
			<content:encoded><![CDATA[<p>I love this term: human amplification. I believe (but can&#8217;t find confirmation) that it comes from the U.S. Navy.</p>
<p>You know the idea. The Agile realm re-imagines the traditional manager as a sort of human amplifier. Let&#8217;s consider Scrum. One of the named roles in Scrum is the Scrum Master. It is the Scrum Master&#8217;s responsibility (among other things) to remove obstacles revealed by the team.</p>
<p>To be amplified you&#8217;ve got to leave yourself open to amplification. In our world - where we don&#8217;t have DARPA, Super-sonic Jets, or 30mm Cannon - this means responding to criticism. Learn how to take criticism, and don&#8217;t be afraid to get to the heart of the matter. Courage is one of the core XP values for a reason.</p>
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/09/14/human-amplification/feed/</wfw:commentRss>
		</item>
		<item>
		<title>More Me Than You Can Shake a Stick At</title>
		<link>http://laribee.com/blog/2007/09/07/more-me-than-you-can-shake-a-stick-at/</link>
		<comments>http://laribee.com/blog/2007/09/07/more-me-than-you-can-shake-a-stick-at/#comments</comments>
		<pubDate>Fri, 07 Sep 2007 22:40:47 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/09/07/more-me-than-you-can-shake-a-stick-at/</guid>
		<description><![CDATA[After a fairly slow end-of-August, I&#8217;m kicking it into overdrive with the whole community involvement routine. If you aren&#8217;t sick of me by now, well friends, my antics this October and November should do the trick. Here&#8217;s the rundown:
Oct 3 &#124; Syracuse, NY &#124; Syracuse .NET Developer&#8217;s Group
Rik Bardrof and I will be doing a [...]]]></description>
			<content:encoded><![CDATA[<p>After a fairly slow end-of-August, I&#8217;m kicking it into overdrive with the whole community involvement routine. If you aren&#8217;t sick of me by now, well friends, my antics this October and November should do the trick. Here&#8217;s the rundown:</p>
<p><strong>Oct 3 | Syracuse, NY | </strong><strong><a href="http://www.cnydevelopers.net/FutureMeetings/tabid/61/Default.aspx">Syracuse .NET Developer&#8217;s Group</a></strong></p>
<p>Rik Bardrof and I will be doing a spruced up variant of the <span style="text-decoration:underline;">You Got Served: Ping-Pong Pairing</span> talk that covers TDD, DDD, and Ping Pong Pairing. If you&#8217;re in the cold north, you should try to make it. Rik, for the unaware, is a blogless developer who works with me at Xclaim. We should get a lot of opportunity to talk about some of the techniques we use in the wild.</p>
<p><strong>Oct 5-7 | Austin, TX | </strong><strong><a href="http://altnetconf.com/">ALT.NET Open Spaces Conference</a></strong></p>
<p><em>The</em> event of the year, IMHO. While not a speaking engagement (it&#8217;s more an invitation to a conversation, wait&#8230;) the event will be a great opportunity to meet many people with at least one foot in the .NET developer world. The event is in the Open Spaces style so I&#8217;ll pitch a few sessions and see how they&#8217;re received. In any case, I&#8217;m not going to bring stand-and-deliver sessions to this happening; I expect lots of conversation/debate/back-and-forth! </p>
<p><strong>Oct 8-9 | Boston, MA | </strong><strong><a href="http://www.remix07boston.com/">ReMIX</a></strong></p>
<p>Giving a talk called <span style="text-decoration:underline;">Language Mashups with the DLR</span> (it&#8217;s billed wrong on the site). Why would you use Javascript, Ruby, C#, Python, and friends all in the same application? What&#8217;s the DLR? How&#8217;s it work? What does stepping outside of the mono-langauge world do for you? Join me in Boston and find out.</p>
<p><strong>Oct 12-13 | Nashville, TN | </strong><strong><a href="http://www.devlink.net/">devLink</a></strong></p>
<p>I&#8217;m speaking about the juicy goodness that is <span style="text-decoration:underline;">Domain-Driven Design and NHibernate</span>. I&#8217;ve done this talk a few times now, so I&#8217;m retooling it going in to Music City USA. Should be a good time!</p>
<p><strong>Oct 19-20 | Tulsa, OK, | </strong><strong><a href="http://www.tulsatechfest.com/Default.aspx?tabid=55&amp;articleType=ArticleView&amp;articleId=103">Tulsa TechFest 2007</a></strong></p>
<p>Enter the <span style="text-decoration:underline;">Ping-Pong Programming House of Pain</span> with me and coconspirator <a href="http://codebetter.com/blogs/raymond.lewallen/">Ray Lewallen</a>. This session is so free-form, high participation, and different every time. We start with a model (DDD) and let it go from there. Hopefully we&#8217;ll be able to work in some developers from the peanut gallery like we did in OKC.</p>
<p><strong>Nov 25-29 | Vancouver, BC, CA | </strong><strong><a href="http://www.devteach.com/">DevTeach</a></strong><strong></p>
<p></strong>Doing a number of talks here (DDD, User Stories, Agile Panel, check the site). There are a number of excellent speakers on the roster, so I&#8217;m not only honored to be speaking, but jazzed up to be able to attend sessions by such folks as Jeremy Miller, JP Boodhoo, Ayende Rahien, James Kovacs, Scott Bellware, etc. I&#8217;m also glad to finally see Vancouver; I hear it&#8217;s the kind of city you can immediately picture living in.</p>
<p>If you&#8217;re coming out to one or more of these events let&#8217;s meet up! To me, that&#8217;s the main value of doing this - meeting a number of interesting, new people <em>and</em> catching up with those I&#8217;ve already met on the road.</p>
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/09/07/more-me-than-you-can-shake-a-stick-at/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ALT.NET Open Spaces - Registration Open!</title>
		<link>http://laribee.com/blog/2007/08/25/altnet-open-spaces-registration-open/</link>
		<comments>http://laribee.com/blog/2007/08/25/altnet-open-spaces-registration-open/#comments</comments>
		<pubDate>Sat, 25 Aug 2007 15:29:16 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/08/25/altnet-open-spaces-registration-open/</guid>
		<description><![CDATA[Registration has opened for the ALT.NET Open Spaces Conference! The cat&#8217;s out of the bag, the gates are open, release the bats! We have a limit of 100 People so get while the getting&#8217;s good (looks like there&#8217;s ~33 openings at the time of this post). In the coming weeks we&#8217;ll be communicating with the [...]]]></description>
			<content:encoded><![CDATA[<p>Registration has opened for the <a href="http://altnetconf.com">ALT.NET Open Spaces Conference</a>! The cat&#8217;s out of the bag, the gates are open, release the bats! We have a limit of <b>100 People</b> so <a href="http://altnetconf.com">get while the getting&#8217;s good</a> (looks like there&#8217;s ~33 openings at the time of this post). In the coming weeks we&#8217;ll be communicating with the people who are coming to Austin, sharing plans and pointers for the Open Space-ness, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/08/25/altnet-open-spaces-registration-open/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile Cheat Sheet</title>
		<link>http://laribee.com/blog/2007/08/16/agile-cheat-sheet/</link>
		<comments>http://laribee.com/blog/2007/08/16/agile-cheat-sheet/#comments</comments>
		<pubDate>Thu, 16 Aug 2007 18:13:35 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/08/16/agile-cheat-sheet/</guid>
		<description><![CDATA[ Sure you&#8217;ve got the ReSharper 3.0 cheat sheet taped to your monitor, but what do you have that&#8217;s reminding you of&#160;values and principles? You need an Agile&#160;cheat sheet! 
Luckily I&#8217;ve got one for you right here! Print it out and put it in your team room, tack it to your task board, and tape [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://laribee.com/files/agile-cheat-sheet.pdf" atomicselection="true"><img style="margin: 10px 0px 10px 20px" height="200" src="http://laribee.com/files/blog-images/AgileCheatSheet_C805/image021.png" width="151" align="right" border="0"/></a> Sure you&#8217;ve got the <a href="http://www.jetbrains.com/resharper/documentation/ReSharper30DefaultKeymap.pdf">ReSharper 3.0 cheat sheet</a> taped to your monitor, but what do you have that&#8217;s reminding you of&nbsp;<em>values</em> and <em>principles</em>? You need an Agile&nbsp;cheat sheet! </p>
<p>Luckily I&#8217;ve got one for you <a href="http://laribee.com/files/agile-cheat-sheet.pdf">right here</a>! Print it out and put it in your team room, tack it to your task board, and tape it to your monitor. </p>
<p>I made this about a year ago and put it up on the bulletin in our team room. From time to time a stakeholder will wander in, notice it, and ask about it. Then I say, &#8220;well let me tell you about this, it&#8217;s really exciting.&#8221;&nbsp;</p>
<p>It&#8217;s a handy information radiator for everyone and an omni-present&nbsp;reminder of how we, as Agilists, stay on point.</p>
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/08/16/agile-cheat-sheet/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Box Got Hotter</title>
		<link>http://laribee.com/blog/2007/08/13/the-box-got-hotter/</link>
		<comments>http://laribee.com/blog/2007/08/13/the-box-got-hotter/#comments</comments>
		<pubDate>Mon, 13 Aug 2007 20:08:04 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/08/13/the-box-got-hotter/</guid>
		<description><![CDATA[A great analogy for side-effects in your programs from Simon Peyton-Jones:
In the end any program must manipulate state. A program that has no side-effects whatsoever is is a kind of black box, right? You press go, and it runs, and all you can tell is the box got hotter.

Check out&#160;the video of his talk on [...]]]></description>
			<content:encoded><![CDATA[<p>A great analogy for side-effects in your programs from <a href="http://research.microsoft.com/~simonpj/">Simon Peyton-Jones</a>:</p>
<blockquote><p>In the end any program must manipulate state. A program that has no side-effects whatsoever is is a kind of black box, right? You press go, and it runs, and all you can tell is the box got hotter.</p>
</blockquote>
<p>Check out&nbsp;the <a href="http://blip.tv/file/324976">video of his talk on Haskell</a> at OSCON 2007 for this and many other gems.</p>
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/08/13/the-box-got-hotter/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Boring Inside</title>
		<link>http://laribee.com/blog/2007/08/13/boring-inside/</link>
		<comments>http://laribee.com/blog/2007/08/13/boring-inside/#comments</comments>
		<pubDate>Mon, 13 Aug 2007 19:40:32 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/08/13/boring-inside/</guid>
		<description><![CDATA[I&#8217;m burning down some podcast backlog as I wait (and wait and wait) for a plane that&#8217;s been delayed (and delayed and delayed) when I hit part of a Hanselminutes episode featuring Jeff Atwood on the topic of building your own PC.&#160;At one point, he observes that it&#8217;s kind of nice to know what&#8217;s going [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m burning down some podcast backlog as I wait (and wait and wait) for a plane that&#8217;s been delayed (and delayed and delayed) when I hit part of a <a href="http://www.hanselminutes.com/default.aspx?showID=92">Hanselminutes episode</a> featuring Jeff Atwood on the topic of building your own PC.&nbsp;At one point, he observes that it&#8217;s kind of nice to know what&#8217;s going on under the hood of your workstation and that knowing something about the internals of your hardware can make you a better developer. </p>
<p>I <a href="http://laribee.com/blog/2006/11/20/infrastructure-wont-matter/">couldn&#8217;t care less</a> about hardware. I care about my experience &#8212; keyboard, mouse,&nbsp;video walls&nbsp;&#8211;&nbsp;but the&nbsp;internals &#8212; Intel, AMD, pico-hampsters running on pico-hampster-wheels &#8211;&nbsp;make absolutely no difference to me. </p>
<p>To me&nbsp;infrastructure is a dial tone. It needs to&nbsp;be there, respond to my request, and let me get to the stuff I care about with minimum hassle. I care about&nbsp;understanding a problem or opportunity&nbsp;and finding&nbsp;its most&nbsp;direct and elegant&nbsp;solution <em>in software</em>. Of course my workstation&nbsp;needs to be fast and usable. Of course it needs to be reliable. And, oh yeah, if it could <a href="http://www.apple.com/macpro/">look pretty</a>, that&#8217;d be an extra bonus.</p>
<p>The developer uses tools to build tools. Software solutions, when delivered into the hands of the end user,&nbsp;are a tool. I build or acquire tools that help me build another tool. There&#8217;s a lot to figure out and grok. Throw in our industries frenetic rate of change and there&#8217;s plenty to keep me busy for several lifetimes.</p>
<p>Okay. That&#8217;s kind of a <a href="http://video.google.com/url?docid=2325698596257631574&amp;esrc=sr1&amp;ev=v&amp;q=who's%2Bon%2Bfirst&amp;srcurl=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DIEaKjRyPjVY&amp;vidurl=%2Fvideoplay%3Fdocid%3D2325698596257631574%26q%3Dwho%2527s%2Bon%2Bfirst%26total%3D3511%26start%3D0%26num%3D10%26so%3D0%26type%3Dsearch%26plindex%3D0&amp;usg=AL29H233H42BV1ofMjtMo_9at2kBXFuGuQ">who&#8217;s on first</a> way of saying the craft of developing software is generative: <em>tools produce tools produce tools</em>. Wouldn&#8217;t my time be better spent&nbsp;learning and mastering other elements of pure thought stuff?&nbsp;New languages, frameworks, patterns, techniques, and (you guessed it) tools? </p>
<p>I crave the&nbsp;<a href="http://en.wikipedia.org/wiki/Theory_of_forms">form</a> and trust the details. Knowledge of hardware internals might&nbsp;possibly <em>inform</em> your craft, but an examination of history, art, architecture, city planning, philosophy, or psychology&nbsp;might inform&nbsp;in a more creative, less pseudo-comparative way.&nbsp;</p>
<p>And before I hit publish, some disclaimers:</p>
<ol>
<li>I <em>would </em>care about hardware if it were part of the problem domain I was making software, e.g. embedded systems, network monitoring, device drivers. As soon as I moved on, I&#8217;d stop caring.  </li>
<li>I am <em>very</em> thankful that there are people that do care about hardware. Good network design/engineering/support (for example) is its own craft with its own horizon! </li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/08/13/boring-inside/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Exercise and Expect Discipline</title>
		<link>http://laribee.com/blog/2007/08/09/exercise-and-expect-discipline/</link>
		<comments>http://laribee.com/blog/2007/08/09/exercise-and-expect-discipline/#comments</comments>
		<pubDate>Fri, 10 Aug 2007 01:46:59 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/08/09/exercise-and-expect-discipline/</guid>
		<description><![CDATA[A few days back I was reminded&#160;of Shuhari.&#160;It&#8217;s a concept originating from&#160;Japanese martial arts that describes a three stage self-development process where a&#160;student progresses from novice to expert to master.
Perfection is a pervasive theme in the larger Agile community.&#160;&#160;Scott Bellware makes an agreeable point saying we should focus on the verb, not the noun;&#160;Dave Nicolette [...]]]></description>
			<content:encoded><![CDATA[<p>A few days back I was reminded&nbsp;of <a href="http://en.wikipedia.org/wiki/Shuhari">Shuhari</a>.&nbsp;It&#8217;s a concept originating from&nbsp;Japanese martial arts that describes a three stage self-development process where a&nbsp;student progresses from novice to expert to master.</p>
<p>Perfection is a pervasive theme in the larger Agile community.&nbsp;&nbsp;<a href="http://codebetter.com/blogs/scott.bellware/archive/2007/06/19/164379.aspx">Scott Bellware</a> makes an agreeable point saying we should focus on the verb, not the noun;&nbsp;<a href="http://dnicolet1.tripod.com/agile/index.blog?from=20070302">Dave Nicolette</a> has a pragmatic take on adoption of Agile methods; <a href="http://alistair.cockburn.us/index.php/ASD_book_extract:_%22Unknowable_and_incommunicable%22">Alistair Cockburn</a>&nbsp;brought the term Shuhari to the Agile vernacular.  </p>
<p>I have in my mind&#8217;s eye&nbsp;a particular scene from <a href="http://www.imdb.com/title/tt0325710/">The Last Samurai</a>. At one point the camera pans over a rural village where the town&#8217;s folk are engaged in their various activities of daily living. Captain Algren&nbsp;observes:<br />
<blockquote>
<p>From the moment they wake, they devote themselves to the perfection of whatever they pursue &#8212; I have never seen such discipline.</p>
</blockquote>
<p>Is the action is the actor&#8217;s raison d’être?&nbsp;Yes, but there&#8217;s more to it than one person and their craft. <em>There&#8217;s an </em><a href="http://pmdoi.org/"><em>interdependence</em></a><em> between the villagers</em>. The group dynamic creates an environment of healthy peer pressure that ingrains, supports, and reinforces the discipline required to pursue perfection.&nbsp;I depend on my neighbor, a potter,&nbsp;for my earthenware. My neighbor depends on me, a farmer, for my vegetables.  </p>
<p>Committing to the Agile way is&nbsp;a decision&nbsp;to pursue perfection.&nbsp;<strong>Discipline is flat-out, straight-up,&nbsp;and without a doubt the most fundamental ingredient in advancing on the path.</strong> Everyone involved in an Agile project or organization needs to hold discipline up as a precondition to continuous improvement. Customers, developers, managers, executives&#8230; <em>everyone.</em>&nbsp;Improve your craft, exercise self-discipline, and&nbsp;expect your team to do the same. </p>
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/08/09/exercise-and-expect-discipline/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How Many Licks?</title>
		<link>http://laribee.com/blog/2007/08/07/how-many-licks/</link>
		<comments>http://laribee.com/blog/2007/08/07/how-many-licks/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 16:04:53 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/08/07/how-many-licks/</guid>
		<description><![CDATA[Javier poses the question: &#8220;how many [CLR Objects] does it take to represent a Real World Object?&#8221; I have posted in&#160;about this&#160;in the past, but it&#8217;s an excellent question that throws a lot of folks. I also think I&#8217;ve refined my opinion on the question and it&#8217;s good to revisit these things every so often. [...]]]></description>
			<content:encoded><![CDATA[<p>Javier <a href="http://blog.lozanotek.com/archive/2007/07/27/How_Many_Classes_Does_It_Take_To_Fully_Represent_A_Real_World_Object.aspx">poses the question</a>: &#8220;how many [CLR Objects] does it take to represent a Real World Object?&#8221; I have posted in&nbsp;about this&nbsp;in the <a href="http://laribee.com/blog/2006/12/05/one-entity-format-does-not-fit-all/">past</a>, but it&#8217;s an excellent question that throws a lot of folks. I also think I&#8217;ve refined my opinion on the question and it&#8217;s good to revisit these things every so often. The question made me think back to an old school commercial for Tootsie Pops that aired during Saturday morning cartoons:</p>
<p><a href="http://laribee.com/files/blog-images/HowManyObjectstoRepresentanEntity_7A70/image.png" atomicselection="true"></a><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="96" alt="image" src="http://laribee.com/files/blog-images/HowManyObjectstoRepresentanEntity_7A70/image_thumb.png" width="120" border="0"/>&nbsp;<img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="96" alt="image" src="http://laribee.com/files/blog-images/HowManyObjectstoRepresentanEntity_7A70/image_thumb_3.png" width="120" border="0"/>&nbsp;<a href="http://laribee.com/files/blog-images/HowManyObjectstoRepresentanEntity_7A70/image_3.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="96" alt="image" src="http://laribee.com/files/blog-images/HowManyObjectstoRepresentanEntity_7A70/image_thumb_4.png" width="120" border="0"/></a>&nbsp;<a href="http://laribee.com/files/blog-images/HowManyObjectstoRepresentanEntity_7A70/image_4.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="97" alt="image" src="http://laribee.com/files/blog-images/HowManyObjectstoRepresentanEntity_7A70/image_thumb_5.png" width="120" border="0"/></a>&nbsp;<a href="http://laribee.com/files/blog-images/HowManyObjectstoRepresentanEntity_7A70/image_5.png" atomicselection="true"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="97" alt="image" src="http://laribee.com/files/blog-images/HowManyObjectstoRepresentanEntity_7A70/image_thumb_6.png" width="120" border="0"/></a>&nbsp;</p>
<p>In the commercial a boy approaches an owl, Mr. Owl to you, with a question: &#8220;how many licks does it take to get to the center of a Tootsie Pop?&#8221; Ever the <a href="http://en.wikipedia.org/wiki/Roger_Bacon">empiricist</a>, Mr. Owl engages in a short experiment. Loosing his discipline after three licks the owl bites into the candy&#8217;s chewy, pseudo-chocolate&nbsp;inner core. The owl licked thrice before chewing. He&nbsp;asserts, therefore, it takes but three bites to get to the center. The boy seems dissatisfied with the&nbsp;conclusion of Mr. Owl&#8217;s investigation worriedly observing that&nbsp;&#8221;the world may never know.&#8221;</p>
<p align="left">The number of objects you need to represent a real world entity can vary greatly depending on the needs and architecture (which should be driven by the needs) of your application. I&#8217;m still a believer in one entity probably isn&#8217;t enough. Let&#8217;s introduce an example. Say we have to represent <strong>Customer </strong>somewhere in the application. </p>
<p align="left">My first question is what makes up the Customer? Likely they&#8217;ll have one or two address objects? Let&#8217;s say they have two, a shipping address and an office address. So far we&#8217;re up to &#8220;thu-ree&#8221; -&nbsp;as Mr. Owl says -&nbsp;objects. Customer in this sense is a composite or, in DDD terms, an aggregate root. So right we&#8217;ve got (potentially) an effective infinite number of &#8220;objects&#8221;. Let&#8217;s make &#8220;object&#8221; mean &#8220;type&#8221; or &#8220;class&#8221; going forward. If we recast the question as &#8220;how many types does it take to represent a real world object&#8221; we can come up with a finite number of associations be they many-to-one, many-to-many (association class), or one-to-many (collections). Still I like the idea of &#8220;Customer as boundary&#8221; that comes with the DDD notion of aggregate root.</p>
<p align="left">So how do we get that Customer to our application layer? Generally speaking I look for an organizing principle (information architecture) centered on the main entities of the application. I like to group screens and actions in the UI around the entity. So I&#8217;d like to come up with a screen that lets you act on a list of Customers or open an individual customers, browse its data and take action on that instance of customer. Even though there&#8217;s a certain <a href="http://nakedobjects.org/wiki/Main_Page">nakedness</a> to these business objects I tend to favor creating DTOs or messages&nbsp;that represent the required slice of data. For example, I&#8217;d consider a list-like DTO&nbsp;of Customers that&#8217;s contains data that helps you find an individual Customer represented by a more jagged, higher resolution detail DTO.&nbsp;I also don&#8217;t&nbsp;invest <em>too much</em> time in factoring my DTOs&nbsp;for re-use, so I&#8217;m apt to create a DTO specific to the purpose at hand.&nbsp;</p>
<p align="left"><font color="#808080">Sidebar: I use a base class&nbsp;and external DSL for&nbsp;data transfer objects and have them support data-binding.&nbsp;<a href="http://laribee.com/blog/2007/06/21/the-smart-dto/">Read more</a> about it. I know </font><a href="http://www.lhotka.net/cslanet/"><font color="#808080">CSLA</font></a><font color="#808080">, for example, goes with a kind of single entity approach. Rocky calls it &#8220;mobile objects.&#8221; That is a customer is a customer is a customer. I don&#8217;t like this because I feel that it creates a lot of transformation code <em>everywhere</em> and I like to centralize this in a Service Layer. I also avoid loading my entity classes with responsibilities orthogonal to business logic such as data-binding support. Instead I favor a Service Layer peopled with Application Services. An Application Service is really a facade to the Model layer that brings infrastructure (sending an email) in to the mix with Domain artifacts: Entities, Repositories, Factories, and Services.</font></p>
<p align="left">Now we&#8217;ve got all these messages that support a user interacting with the model of a &#8220;real world object&#8221; and we&#8217;ve got a number of MVP triads that ultimately construct these messages that work on the entity. I guess my answer is as many as it takes and it can take quite a few. The benefit of splitting a real world object into a number of tailor-made (for the layer) objects is that it preserves a layered architecture which&nbsp;benefits through partitioning and isolation. That&#8217;s a Byzantine way of saying layers make a code base easier to evolve/maintain.</p>
<p align="left">If I had to break it down to for my current default architecture for smart clients that work over a firewall:</p>
<ol>
<li>
<div align="left">Customer (Aggregate Root Entity)</div>
</li>
<li>
<div align="left">Address (Value Object)</div>
</li>
<li>
<div align="left">CustomerRepository (Finds/Saves/Deletes Customers)</div>
</li>
<li>
<div align="left">PreferredCustomerService (Gets a list of Orders for a Customer and determines if they&#8217;re standard, gold, or silver)</div>
</li>
<li>
<div align="left">CustomerService (CRUDdy Application Service for Customers)</div>
</li>
<li>
<div align="left">CustomerDetail MVP Triad</div>
</li>
<li>
<div align="left">CustomerSearch MVP Triad</div>
</li>
</ol>
<p align="left"><em>All of these </em>items are <em>required</em> to represent the real-world customer <em>given my architecture</em>. Even if you go directly to model you still need to display stuff. Even if you&#8217;re not using MVP and are using Autonomous View, it&#8217;s still another object required to &#8220;represent&#8221; the real-world concept of customer. My preference is simply to let the concept of &#8220;Business Entity&#8221; flow through a layered architecture when it&#8217;s natural to the end user. In general I think it is a natural concept for a lot of entities. Adjusters talk about working with claims; underwriters write, renew, and terminate policies; project managers manage, well, projects&#8230; </p>
<p align="left">Having&nbsp;this baseline set of patterns helps you avoid the trap Mr. Owl fell in to. Namely, patterns control how many licks, um, objects it takes to get to the center of a user story and at the heart business value. You don&#8217;t need to go nuts with an&nbsp;over-arching,&nbsp;prescriptive framework. Pick a few design patterns to start with and a framework will emerge over time as you suit immediate needs, ease frequent pain points,&nbsp;and address redundancy. I, personally,&nbsp;look for how entities are treated, look to them (initially) for an organizing principle of user experience, and find design patterns that mesh my findings with a good measure of maintainability and testability.</p>
<p align="left">
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/08/07/how-many-licks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>One Logical Assertion Per Test</title>
		<link>http://laribee.com/blog/2007/08/06/one-logical-assertion-per-test/</link>
		<comments>http://laribee.com/blog/2007/08/06/one-logical-assertion-per-test/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 02:15:03 +0000</pubDate>
		<dc:creator>Dave</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://laribee.com/blog/2007/08/06/one-logical-assertion-per-test/</guid>
		<description><![CDATA[Having had the chance to get some good feedback from Aaron on my One Mock Per Test post I&#8217;m refining the TDD rules I&#8217;ll live by going forward. 
I still believe tests should have a single assertion, but as Ayende points out occasionally a single call to Assert.ThisOrThat won&#8217;t cut it.&#160;What we really want to [...]]]></description>
			<content:encoded><![CDATA[<p>Having had the chance to get some good feedback from Aaron on my <a href="http://laribee.com/blog/2007/08/04/one-mock-per-test/">One Mock Per Test</a> post I&#8217;m refining the TDD rules I&#8217;ll live by going forward. </p>
<p>I still believe tests should have a single assertion, but as Ayende <a href="http://www.ayende.com/Blog/archive/2007/08/05/What-is-one-assert.aspx">points out</a> occasionally a single call to <font face="Courier New" color="#004080" size="2">Assert.ThisOrThat</font> won&#8217;t cut it.&nbsp;What we really want to preserve a <em><strong>single logical&nbsp;assertion</strong></em>. Put another way,&nbsp;<em>if a test has multiple&nbsp;assertions, each assertion must exhibit a high cohesion with the specification described by the test</em>.&nbsp;In&nbsp;Ayende&#8217;s example each assertion has a shared mission: verify the contents of a row-like structure. The nature of the specification&nbsp;dictates more than one Assert. Without having to use too much imagination we can see in some circumstances it&#8217;d be&nbsp;overkill to check that&nbsp;each individual cell is set with a separate test, given that he&#8217;s working at the row level. I&#8217;ll pretend his specification says &#8220;a row is put in a certain state.&#8221;</p>
<p>An example test that uses multiple assertions in a highly cohesive manner:</p>
<pre class="csharpcode">[Test]
<span class="kwrd">public</span> <span class="kwrd">void</span> A_user_sees_results_of_a_gold_customer_search()
{
   ICustomerSearchService mockService
      = _mocks.DynamicMock&lt;ISearchService&gt;();

   ISearchView stubView
      = _mocks.Stub&lt;ISearchView&gt;();

   <span class="kwrd">// puts 26 customer entries in a fake DTO</span>
   CustomerSearchResultDTO fakeResults = GetFakeResults(26);

   <span class="kwrd">using</span> (_mocks.Record())
   {
       Expect
         .Call(mockService.FindCustomersByLevel(CustomerLevel.Gold))
         .Returns(fakeResults);
   }

   <span class="kwrd">using</span> (_mocks.Playback())
   {
      SearchPresenter presenter = <span class="kwrd">new</span> SearchPresenter(stubView, stubService);
      presenter.FindGoldCustomers();
      Assert.AreEqual("Gold Customers: 26", stubView.Title);
   }
}
<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>
</pre>
<p>In the example there are&nbsp;really three explicit, but highly cohesive,&nbsp;assertions in this contrived&nbsp;example:</p>
<ol>
<li>I expect that ISearchView.FindCustomersByLevel will be called</li>
<li>ISearchView.FindCustomersByLevel will be given an enum argument CustomerLevel.Gold</li>
<li>The view (technically a stub) will have the title &#8220;Gold Customers: 26&#8243;</li>
</ol>
<p>In the real world I&#8217;d likely treat the stubView as a mock object and set an expectation that it&#8217;s Data property receives the fakeResults. Another thing I&#8217;d probably do is stick with all interaction testing and treat stubView as a real mock object. I&#8217;d set an expectation that Title was set instead of asserting Title was set to a specific value after the fact. To me it&#8217;s a clear case of six to one, half-a-dozen to another but&nbsp;I suppose there&#8217;s something to be said for not paradigm shifting too much between interaction/state testing if it can be avoided.</p>
<p>However you cut it, these are <em>highly cohesive assertions</em>; they belong together and describe a complete interaction. The test is still satisfyingly small so I continue the benefit of quick return to test mode after&nbsp;passing green.</p>
<p>As an aside: I like Aaron and Jacob&#8217;s <a href="http://blog.eleutian.com/2007/02/27/LooselycoupledMocks.aspx">advice about using DynamicMocks</a> (when using Rhino Mocks) as a way of building a more flexible refactoring/change safety net from your tests. </p>
]]></content:encoded>
			<wfw:commentRss>http://laribee.com/blog/2007/08/06/one-logical-assertion-per-test/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
