<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>the 'bee log</title><link>http://codebetter.com/blogs/david_laribee/default.aspx</link><description>Dave Laribee's thoughts on software development.</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><geo:lat>40.727093</geo:lat><geo:long>-73.978644</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-sa/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/thebeelog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>The High Cost of Losing a Developer</title><link>http://feedproxy.google.com/~r/thebeelog/~3/N9FlS__-DUQ/the-high-cost-of-losing-a-developer.aspx</link><pubDate>Tue, 17 Nov 2009 06:18:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:434130</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=434130</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/11/17/the-high-cost-of-losing-a-developer.aspx#comments</comments><description>&lt;p&gt;You&amp;#39;ve probably heard statistics about the &amp;quot;high cost of losing a customer.&amp;quot; The theory is simple and true (fact?): keeping existing customers and repeat business is much more profitable than attracting new customers. Here are a few facts from &lt;a href="http://www.businesscoach.com/go/bc/handouts/the_high_cost_of_losing_a_customer/index.cfm"&gt;BusinessCoach.com&lt;/a&gt;:
&lt;/p&gt;
&lt;blockquote&gt;
- For every customer who bothers to complain, there are 26 others who remain silent.&lt;br /&gt;
- The average &amp;ldquo;wronged&amp;rdquo; customer will tell 8 to 16 people.&lt;br /&gt;
- 91% of unhappy customers will never purchase services from you again.&lt;br /&gt;
- It costs about five times as much to attract a new customer as it costs to keep an old one.&lt;br /&gt;
- Each one of your customers has a circle of influence of 250 people or potential customers who hear bad things about you!&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;The point of this post is simple: &lt;b&gt;RETAIN YOUR GOOD DEVELOPERS.&lt;/b&gt; Getting someone up to speed on a legacy codebase takes a long time and is an expensive undertaking. A large part of the software coach&amp;#39;s or manager&amp;#39;s job is attracting, developing and &lt;i&gt;keeping&lt;/i&gt; talent. And that talent becomes more valuable over time. &lt;/p&gt;
&lt;p&gt;Yes, you might be able to replace someone at a lower annual salary, but you have to take into account the complexity of your code portfolio in how long it&amp;#39;ll take to make that person productive. A $60K/annum employee may very well take $120K before reaching the productivity level and contribution of the developer who left the team.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=434130" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=N9FlS__-DUQ:ecT5dl-I4i0:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=N9FlS__-DUQ:ecT5dl-I4i0:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=N9FlS__-DUQ:ecT5dl-I4i0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=N9FlS__-DUQ:ecT5dl-I4i0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=N9FlS__-DUQ:ecT5dl-I4i0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=N9FlS__-DUQ:ecT5dl-I4i0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/N9FlS__-DUQ" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/teams/default.aspx">teams</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/management/default.aspx">management</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/systems+thinking/default.aspx">systems thinking</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/business/default.aspx">business</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/11/17/the-high-cost-of-losing-a-developer.aspx</feedburner:origLink></item><item><title>Code Coverage: What Is It Good For?</title><link>http://feedproxy.google.com/~r/thebeelog/~3/i3Y43_GrcsM/code-coverage-what-is-it-good-for.aspx</link><pubDate>Fri, 13 Nov 2009 20:06:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:427043</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>11</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=427043</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/11/13/code-coverage-what-is-it-good-for.aspx#comments</comments><description>&lt;p&gt;Absolutely nothing. Or so the story goes...&lt;/p&gt;
&lt;p&gt;I had a mini-exchange with my pal &lt;a href="http://codebetter.com/blogs/glenn.block/Default.aspx"&gt;Glenn Block&lt;/a&gt; last night on Twitter. He was recycling the somewhat old meme that code coverage is a cockamamie metric that, as he puts it, &amp;quot;[code coverage is] a false security blanket on quality&amp;quot;. &lt;/p&gt;
&lt;p&gt;Measurements (other than net profit, of course) are merely indicators. They give us insight into what we&amp;#39;re doing, red flags that help us know when to follow up on and drill into with more qualitative and hands on tools.This is, more-or-less, the idea behind &lt;a href="http://en.wikipedia.org/wiki/Autonomation"&gt;Autonomation or &amp;quot;automation with a human touch.&amp;quot;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For example: while code coverage isn&amp;#39;t proof that our testing efforts will yield higher maintainability, it does tell us a teams commitment to a test practice.&lt;/p&gt;
&lt;p&gt;I tend to believe the most interesting indicators are composite metrics. What happens when we start thinking about combining code coverage with cyclomatic complexity? I&amp;#39;d like to read a (hopefully) inverse relationship over time, coverage rising while complexity falls, as a good indicator that we&amp;#39;re doing simple design.&lt;/p&gt;
&lt;p&gt;The important thing to remember about metrics is they are only single purpose tools which, correctly applied, gift us with little tidbits of insight. It&amp;#39;s up to you to find meaningful and creative uses for the various metrics and their various combinations. Once you start doing that, measurements like code coverage can certainly help you achieve your immediate goals.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=427043" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=i3Y43_GrcsM:2zKCDf6Grx0:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=i3Y43_GrcsM:2zKCDf6Grx0:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=i3Y43_GrcsM:2zKCDf6Grx0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=i3Y43_GrcsM:2zKCDf6Grx0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=i3Y43_GrcsM:2zKCDf6Grx0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=i3Y43_GrcsM:2zKCDf6Grx0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/i3Y43_GrcsM" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/Metrics/default.aspx">Metrics</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/TDD/default.aspx">TDD</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/teams/default.aspx">teams</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/testing/default.aspx">testing</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/practices/default.aspx">practices</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/11/13/code-coverage-what-is-it-good-for.aspx</feedburner:origLink></item><item><title>December 2-3 London Workshop Update</title><link>http://feedproxy.google.com/~r/thebeelog/~3/3xBeH-OvrRs/december-2-3-london-workshop-update.aspx</link><pubDate>Thu, 05 Nov 2009 15:29:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:411776</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=411776</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/11/05/december-2-3-london-workshop-update.aspx#comments</comments><description>&lt;p&gt;Forgive the self-promotional interruption, but quick housekeeping note:&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve asked the company hosting my workshop in London to reduce the price of my 2-day workshop on December 2-3 aimed at &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2009/09/30/london-workshop-december-1-2.aspx"&gt;tools and techniques technical leads, folks interested in lean, standard work, etc.&lt;/a&gt; to try to get as many people there (it&amp;#39;s a group collaboration focused thing). I also want to get as much feedback as I can. &lt;b&gt;If you book before November 15th, the price is &amp;pound;550&lt;/b&gt;.

					&lt;/p&gt;
&lt;p&gt;Register &lt;a href="http://skillsmatter.com/course/design-architecture/towards-a-new-architect"&gt;at the SkillsMatter site&lt;/a&gt;. &lt;i&gt;Also feel free to contact me with any questions laribee/AT/gmail/DOT/com&lt;/i&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=411776" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=3xBeH-OvrRs:uDTMIKQY00E:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=3xBeH-OvrRs:uDTMIKQY00E:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=3xBeH-OvrRs:uDTMIKQY00E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=3xBeH-OvrRs:uDTMIKQY00E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=3xBeH-OvrRs:uDTMIKQY00E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=3xBeH-OvrRs:uDTMIKQY00E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/3xBeH-OvrRs" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/housekeeping/default.aspx">housekeeping</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/announcements/default.aspx">announcements</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/11/05/december-2-3-london-workshop-update.aspx</feedburner:origLink></item><item><title>Low-Technology</title><link>http://feedproxy.google.com/~r/thebeelog/~3/QLCKhPrYHO8/low_2D00_technology.aspx</link><pubDate>Thu, 29 Oct 2009 18:55:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:403429</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>13</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=403429</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/10/29/low_2D00_technology.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;m completely obsessed with the idea of &lt;a href="http://en.wikipedia.org/wiki/Low-technology"&gt;low-technology&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;The term low-technology is a description of those crafts and tools whose inception (typically) predates the Industrial Revolution.&lt;/blockquote&gt;
&lt;blockquote&gt;A test for low-technology may be that it can be practiced or fabricated with a minimum of Capital investment by an individual or small group of individuals; and that the knowledge of the practice can be completely comprehended by a single individual, free from increasing specialization and compartmentalization.&lt;/blockquote&gt;
&lt;p&gt;An excellent overview of some of the cutting edge efforts in low-technologies can be seen in this &lt;a href="http://www.ted.com/talks/amy_smith_shares_simple_lifesaving_design.html"&gt;TED video with low-technologist Amy Smith&lt;/a&gt;. I completely agree with when says, &amp;quot;not all inventions need to be grandiose, complex things... sometimes they can be simple and smart ideas that just help a lot of people.&amp;quot;&lt;/p&gt;
&lt;p&gt;The second block quote is where I&amp;#39;m coming from. What are those tools in software development that add lots of value without minimal getting started overhead. Pair-programming seems like an excellent example of low technology. Emergent design, test-driven development and value-driven approaches like XP are yet more.&lt;/p&gt;
&lt;p&gt;It seems, to me anyway, that these are the things that&amp;#39;ll yield the most benefits. Both vendor-supplied tooling and trending topics we hold near and dear, like &lt;a href="http://domaindrivendesign.org/"&gt;Domain-Driven Design&lt;/a&gt; and &lt;a href="http://www.martinfowler.com/bliki/DomainSpecificLanguage.html"&gt;DSLs&lt;/a&gt; and this fluent madness in general, strike me as more &lt;i&gt;high-technology&lt;/i&gt; approaches.&lt;/p&gt;
&lt;p&gt;There&amp;#39;s nothing wrong with high-technology, of course, but my instinct is that the risk-reward equation for most teams usually favors low-technology. We have, after all, limited bandwidth and attention, so my vote will ever go to what I see as big and easy wins: stuff focused on beefing up the signal of our communication as a team and community against the noise we might get as a software fashion victim.&lt;/p&gt;
&lt;p&gt;Anyway, this is a key topic I&amp;#39;ll be centering on over the next little while and thought y&amp;#39;all might find this way of looking at our kit, our standard tradecraft at least a little bit interesting.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=403429" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=QLCKhPrYHO8:p9e8A_TztII:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=QLCKhPrYHO8:p9e8A_TztII:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=QLCKhPrYHO8:p9e8A_TztII:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=QLCKhPrYHO8:p9e8A_TztII:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=QLCKhPrYHO8:p9e8A_TztII:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=QLCKhPrYHO8:p9e8A_TztII:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/QLCKhPrYHO8" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/XP/default.aspx">XP</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/opinion/default.aspx">opinion</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/TDD/default.aspx">TDD</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/teams/default.aspx">teams</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/coaching/default.aspx">coaching</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/practices/default.aspx">practices</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/low-technology/default.aspx">low-technology</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/10/29/low_2D00_technology.aspx</feedburner:origLink></item><item><title>The Most Productive Programming Language</title><link>http://feedproxy.google.com/~r/thebeelog/~3/vb2_6KdSukk/the-most-productive-programming-language.aspx</link><pubDate>Wed, 28 Oct 2009 00:08:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:398206</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>9</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=398206</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/10/27/the-most-productive-programming-language.aspx#comments</comments><description>&lt;p&gt;The most productive and useful programming language you know, by a long shot, is English or Hindi or Portuguese or Spanish or French or whatever human language your team uses. Good communication skills are way more valuable to you and your customers than picking up &lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X"&gt;a new language every year&lt;/a&gt;. That is, while there is value in the item on
the right, I value the item on the left more. &lt;a href="http://agilemanifesto.org/"&gt;Sound familiar?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Developers that name things well and program with a respect for human
languages create more maintainable and easier to follow code. Being able to communicate with a customer, analyst and/or product owner can save you hour upon hour of effort and keep your solution simple. No programming language no matter how syntactically minimal or internal DSL friendly can ever come close to this.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=398206" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=vb2_6KdSukk:KWWCyIvDJJs:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=vb2_6KdSukk:KWWCyIvDJJs:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=vb2_6KdSukk:KWWCyIvDJJs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=vb2_6KdSukk:KWWCyIvDJJs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=vb2_6KdSukk:KWWCyIvDJJs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=vb2_6KdSukk:KWWCyIvDJJs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/vb2_6KdSukk" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/Language/default.aspx">Language</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/coaching/default.aspx">coaching</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/craftsmanship/default.aspx">craftsmanship</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/basics/default.aspx">basics</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/10/27/the-most-productive-programming-language.aspx</feedburner:origLink></item><item><title>London Workshop, December 1-2</title><link>http://feedproxy.google.com/~r/thebeelog/~3/C4S4XKH4Xbw/london-workshop-december-1-2.aspx</link><pubDate>Wed, 30 Sep 2009 21:00:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:367807</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=367807</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/09/30/london-workshop-december-1-2.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;UPDATE: The workshop is scheduled for December 2-3.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;A little housekeeping. I&amp;#39;m doing a two-day workshop I&amp;#39;m doing in London in December (1-2).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://skillsmatter.com/course/design-architecture/towards-a-new-architect" target="_blank"&gt;http://skillsmatter.com/course/design-architecture/towards-a-new-architect&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;I&amp;#39;ll share the experiences and tools I&amp;#39;ve developed as a team
lead over the last decade doing architecture on Agile then Lean teams.
My thesis should sound familiar: we need a Chief Architect-like role in
development, someone who considers all aspects of the system and can
coach the team toward emergent design in product and process. The
workshop is aimed at giving you actionable tools and an overview of
things I&amp;#39;ve seen work really well together. Some of the
Lean/Kanban-related topics include how XP works with Kanban and how
architectural/design approaches can help get to release-per-feature and higher ROI for your business. &lt;br /&gt;
&lt;br /&gt;The course is appropriate for technical leads (current and
aspiring), product owners and designers, coaches and senior developers or
software architects. &lt;br /&gt;&lt;br /&gt;Hope to see you there (and have pints with the London Kanban and AltNetBeers kids)!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=367807" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=C4S4XKH4Xbw:WdzheuPTp74:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=C4S4XKH4Xbw:WdzheuPTp74:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=C4S4XKH4Xbw:WdzheuPTp74:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=C4S4XKH4Xbw:WdzheuPTp74:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=C4S4XKH4Xbw:WdzheuPTp74:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=C4S4XKH4Xbw:WdzheuPTp74:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/C4S4XKH4Xbw" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/XP/default.aspx">XP</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/architecture/default.aspx">architecture</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/lean/default.aspx">lean</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/housekeeping/default.aspx">housekeeping</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/kanban/default.aspx">kanban</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/announcements/default.aspx">announcements</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/09/30/london-workshop-december-1-2.aspx</feedburner:origLink></item><item><title>Exceptional and Substitutable</title><link>http://feedproxy.google.com/~r/thebeelog/~3/mcGn-mkoPhc/liskov-and-exceptions.aspx</link><pubDate>Wed, 09 Sep 2009 17:34:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:343425</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=343425</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/09/09/liskov-and-exceptions.aspx#comments</comments><description>&lt;p&gt;I watched &lt;a href="http://twitter.com/schambers"&gt;Sean Chambers&lt;/a&gt; deliver an excellent talk about &lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;S.O.L.I.D. principles&lt;/a&gt; last weekend at &lt;a href="http://www.tallycodecamp.org/2009"&gt;Tallahassee CodeCamp&lt;/a&gt;. It motivated me to look a little deeper into the &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/09/22/why-solid-gimme-an-l.aspx"&gt;Liskov Substitution Principle&lt;/a&gt;, which states:&lt;/p&gt;
&lt;blockquote&gt;Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.&lt;/blockquote&gt;
&lt;p&gt;We accept this as a truth and it&amp;#39;s what makes us hate the &lt;i&gt;is &lt;/i&gt;keyword in C# so damn much. I wrote a post a while back &lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/09/22/why-solid-gimme-an-l.aspx"&gt;that explains (or attempts to) what LSP and why it&amp;#39;s important&lt;/a&gt;, which is to say I won&amp;#39;t harp on the what and why here. I&amp;#39;ll spend your attention, rather, on how LSP works with exceptions.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle"&gt;LSP article on Wikipedia&lt;/a&gt; provides clarification around exceptions and subclasses:&lt;/p&gt;
&lt;blockquote&gt;No new exceptions should be thrown by methods of the subtype, except
where those exceptions are themselves subtypes of exceptions thrown by
the methods of the supertype. &lt;br /&gt;&lt;/blockquote&gt;
&lt;p&gt;Here&amp;#39;s a contrived and fugly example in ruby:&lt;/p&gt;
&lt;pre&gt;class FileSystem&lt;br /&gt;  &lt;br /&gt;  def save(path, text)&lt;br /&gt;    File.open(path, &amp;#39;w+&amp;#39;) {|f| f.write(text) }&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class AmazonFileSystem &amp;lt; FileSystem&lt;br /&gt;  &lt;br /&gt;  include &amp;#39;amazon_library&amp;#39;&lt;br /&gt;  &lt;br /&gt;  def save(path, contents)&lt;br /&gt;    begin&lt;br /&gt;      write_to_s3(path, contents)&lt;br /&gt;    rescue&lt;br /&gt;      AmazonWebServicesError.new(&amp;#39;cannot write file&amp;#39;);&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class AmazonWebServicesError &amp;lt; StandardError&lt;br /&gt;  &lt;br /&gt;  def initialize(message)&lt;br /&gt;    @message = message&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def message&lt;br /&gt;    return @message&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def backup_system&lt;br /&gt;  &lt;br /&gt;  file_name = &amp;#39;book.txt&amp;#39;;&lt;br /&gt;  my_important_text = &amp;#39;hello world&amp;#39;;&lt;br /&gt;  &lt;br /&gt;  [AmazonFileSystem.new, FileSystem.new].each do |file_system|&lt;br /&gt;    begin&lt;br /&gt;      file_system.save(file_name)&lt;br /&gt;    rescue AmazonFileError&lt;br /&gt;      # VIOLATION! FOR SHAME!&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;A &lt;i&gt;try-catch&lt;/i&gt; (or &lt;i&gt;begin-rescue&lt;/i&gt;) is a conditional pattern and it&amp;#39;s my sense that when we use this with implementation inheritance we&amp;#39;ve made a particularly egregious and insidious violation of the LSP. &lt;/p&gt;
&lt;p&gt;First off, we&amp;#39;re know things about the internals of our subclass in our consumer. We&amp;#39;ve broken encapsulation and increased coupling. &lt;/p&gt;
&lt;p&gt;Secondly, our special AmazonWebServiceError only shares StandardError with what&amp;#39;s likely to be thrown by our FileSystem class. This means we can&amp;#39;t treat errors that are likely to fall out of Ruby&amp;#39;s IO core polymorphically. More conditional logic/branching, more cyclomatic complexity, more coupling, and these are bad things.&lt;/p&gt;
&lt;p&gt;What can we do to stay on the good side of LSP when dealing with exceptions in inheritance hierarchies, you ask? Well, as the rule states, we can make exceptions subclass the exception the parent throws. For example, we could catch whatever error our fictitious amazon library throws and decorate it with a custom error that derives from the error File.write in ruby core throws. Another, perhaps, better option would be to hold off on coding defensively wherever you can and let the exception bubble up to a central part of your program that deals, exclusively, with these corner cases. That is, &lt;a href="http://msdn.microsoft.com/en-us/library/aa480591.aspx"&gt;implement an exception shield&lt;/a&gt; wherever we don&amp;#39;t need compensating logic.&lt;/p&gt;
&lt;p&gt;LSP and exceptions: another thing to pay attention to while on programming&amp;#39;s happy trail, friends.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=343425" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=mcGn-mkoPhc:h7L3hHYBL3I:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=mcGn-mkoPhc:h7L3hHYBL3I:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=mcGn-mkoPhc:h7L3hHYBL3I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=mcGn-mkoPhc:h7L3hHYBL3I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=mcGn-mkoPhc:h7L3hHYBL3I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=mcGn-mkoPhc:h7L3hHYBL3I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/mcGn-mkoPhc" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/Ruby/default.aspx">Ruby</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/oo/default.aspx">oo</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/design/default.aspx">design</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/principles/default.aspx">principles</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/solid/default.aspx">solid</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/09/09/liskov-and-exceptions.aspx</feedburner:origLink></item><item><title>The Secret Sauce</title><link>http://feedproxy.google.com/~r/thebeelog/~3/AgjQvf94_gQ/the-secret-sauce.aspx</link><pubDate>Tue, 08 Sep 2009 21:32:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:340782</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>8</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=340782</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/09/08/the-secret-sauce.aspx#comments</comments><description>&lt;p&gt;Are you listening? I&amp;#39;m about to give away the secret to to all of this this Lean/Agile/Software Craftsmanship fuss. The secret is... &lt;a target="_self" title="Exercise &amp;amp; Expect Discipline" href="http://laribee.com/blog/2007/08/09/exercise-and-expect-discipline/"&gt;DISCIPLINE&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;&amp;quot;The time is always right to do what is right&amp;quot; -- Martin Luther King, Jr.
&lt;/blockquote&gt;
&lt;p&gt;Assuming we know what to do, and I know a lot of you reading this do, we should always just say no to shortcuts. Delivery pressure is a real thing, but if you&amp;#39;re estimating a piece of work, estimate what it&amp;#39;ll take to do the right thing. If real Object-Oriented Programming is new to you, it&amp;#39;s going to take you a whole lot longer to get something done. If the language is new to you, it&amp;#39;s going to take you a lot longer to get something done.&lt;/p&gt;
&lt;p&gt;Sometimes we take embarrassing and unprofessional shortcuts like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Getting out of TDD mode.&lt;/li&gt;
&lt;li&gt;Rolling shoddy spike code into production.&lt;/li&gt;
&lt;li&gt;Using an older, more familiar but less quality recipe to a common coding task.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The best way I know of to keep discipline up is pair programming. Some would say pairing is the way because two heads are better than one. I say it&amp;#39;s a great practice because it creates a healthy peer pressure.&lt;/p&gt;
&lt;p&gt;Learning and discipline are the two halves of continuous improvement. In short: live what you learn, act on your new knowledge and skill.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=340782" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=AgjQvf94_gQ:ZmulAbIhTUE:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=AgjQvf94_gQ:ZmulAbIhTUE:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=AgjQvf94_gQ:ZmulAbIhTUE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=AgjQvf94_gQ:ZmulAbIhTUE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=AgjQvf94_gQ:ZmulAbIhTUE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=AgjQvf94_gQ:ZmulAbIhTUE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/AgjQvf94_gQ" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/teams/default.aspx">teams</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/continuous-improvement/default.aspx">continuous-improvement</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/kaizen/default.aspx">kaizen</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/09/08/the-secret-sauce.aspx</feedburner:origLink></item><item><title>Return False on the Happy Path</title><link>http://feedproxy.google.com/~r/thebeelog/~3/ESoP3wOb49M/return-false-on-the-happy-path.aspx</link><pubDate>Tue, 08 Sep 2009 19:44:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:340545</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>13</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=340545</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/09/08/return-false-on-the-happy-path.aspx#comments</comments><description>&lt;p&gt;When you call a query method that returns true or false, I
highly suggest that you make true results trip conditional logic /
guard clauses / etc. I was driving out some code today in an MVC controller that had a dependency on an type who&amp;#39;s responsibility it is to check for unique email addresses in a database of user which looks like so:&lt;/p&gt;
&lt;pre&gt;public interface IUniqueEmailValidator&lt;br /&gt;{&lt;br /&gt;  bool EmailAddressIsUnique(string email);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;All well and good, but you&amp;#39;ll notice that the method returns &lt;i&gt;true&lt;/i&gt; in the happy path. That is, if an email address is unique (working on an authentication system), the object returns true.&lt;/p&gt;
&lt;p&gt;I use an auto-mocking container when doing TDD with .NET. Most implementations give you back a so-called dynamic mock which just absorbs calls and returns default values on methods that return value types. So in the case above, a dynamic mock will always return false unless you tell it otherwise. I&amp;#39;d end up having to put noisy stub code in all of my other specs. For example:&lt;/p&gt;
&lt;pre&gt;Dependency()&lt;br /&gt;  .Stub(u =&amp;gt; u.EmailAddressIsUnique(null))&lt;br /&gt;  .IgnoreArguments()&lt;br /&gt;  .Return(true);&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;In the controller we&amp;#39;re working on right now, there are about 10 specifications that failed because of this default behavior. This is a big problem because the introduction of a new specification results in me having to change a bunch of other contexts which is stinky, fragile design!&lt;/p&gt;
&lt;p&gt;An opportunity to make things better! I changed the interface to this:&lt;/p&gt;
&lt;pre&gt;public interface IUniqueEmailValidator&lt;br /&gt;{&lt;br /&gt;  bool EmailAddressIsUnique(string email);&lt;br /&gt;  bool EmailAddressIsTaken(string email);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;The new &lt;i&gt;EmailAddressIsTaken&lt;/i&gt; method simply inverts the result of &lt;i&gt;EmailAddressIsUnique&lt;/i&gt;. Really frighteningly simple stuff, but, by calling the new method, my test code stays isolated and the special cases don&amp;#39;t break my numerous other specs.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=340545" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=ESoP3wOb49M:cZ9cdeFTpSU:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=ESoP3wOb49M:cZ9cdeFTpSU:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=ESoP3wOb49M:cZ9cdeFTpSU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=ESoP3wOb49M:cZ9cdeFTpSU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=ESoP3wOb49M:cZ9cdeFTpSU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=ESoP3wOb49M:cZ9cdeFTpSU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/ESoP3wOb49M" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/BDD/default.aspx">BDD</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/TDD/default.aspx">TDD</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/oo/default.aspx">oo</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/design/default.aspx">design</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/code/default.aspx">code</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/C_2300_/default.aspx">C#</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/09/08/return-false-on-the-happy-path.aspx</feedburner:origLink></item><item><title>Kanban Features in VersionOne</title><link>http://feedproxy.google.com/~r/thebeelog/~3/U8Njt_G_ST0/kanban-features-in-versionone.aspx</link><pubDate>Wed, 29 Jul 2009 17:54:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:255213</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=255213</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/07/29/kanban-features-in-versionone.aspx#comments</comments><description>&lt;p&gt;We added basic Kanban features (board, cycle time, cummulative flow diagrams) into our product VersionOne. These goodies are in the latest release which is available today. &lt;a href="http://twitter.com/stevenharman"&gt;Steve Harman&lt;/a&gt; and I cut a video demonstrating the functionality on a 47&amp;quot; multi-touch display.&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.viddler.com/explore/laribee/videos/13/"&gt;CHECK IT OUT.&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Have to say, I&amp;#39;m pretty excited about the new features. Customers, be sure to &lt;a href="https://ideaspace.versionone.com/"&gt;let us know how/what we can improve!&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=255213" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=U8Njt_G_ST0:u9U_EtxVJy8:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=U8Njt_G_ST0:u9U_EtxVJy8:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=U8Njt_G_ST0:u9U_EtxVJy8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=U8Njt_G_ST0:u9U_EtxVJy8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=U8Njt_G_ST0:u9U_EtxVJy8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=U8Njt_G_ST0:u9U_EtxVJy8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/U8Njt_G_ST0" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/video/default.aspx">video</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/lean/default.aspx">lean</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/kanban/default.aspx">kanban</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/versionone/default.aspx">versionone</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/07/29/kanban-features-in-versionone.aspx</feedburner:origLink></item><item><title>Ubiquitous Language in Product Development</title><link>http://feedproxy.google.com/~r/thebeelog/~3/BkPtbFlfYJk/ubiquitous-language-in-product-development.aspx</link><pubDate>Wed, 24 Jun 2009 21:15:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:249270</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=249270</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/06/24/ubiquitous-language-in-product-development.aspx#comments</comments><description>&lt;p&gt;Hi there. &lt;/p&gt;
&lt;p&gt;I got this question from a fellow named Martin today: &lt;/p&gt;
&lt;blockquote&gt;&lt;i&gt;Real simple ... most of the discussion on DDD surrounds the design in terms of the ubiquitous language.&lt;br /&gt;&lt;br /&gt;
What if you are developing a product that is designed to be a tool for
a certain industry, say marketing, but the processes and terminology
all differ according to the marketing company that is in discussion.&lt;br /&gt;&lt;br /&gt;
To be specific, one company may use the term Client and the other Customer?&lt;br /&gt;&lt;br /&gt;
How do you accommodate the difference in terms? &amp;nbsp;Do you code to a common denominator or do you just pick one and go?&lt;/i&gt;&lt;/blockquote&gt;
&lt;p&gt;Great question; in product development we&amp;#39;re often trying to make a general solution that solves the common problems of customers that have different languages. There&amp;#39;s no way around that.&lt;/p&gt;
&lt;p&gt;First, find those elements that are universal. Question if there&amp;#39;s really a need for all of this customization or if your clients are OK with calling a client a customer. Having a ubiquitous language that can be used end-to-end, from developer to end user, is extremely valuable and kind of the original point. &lt;/p&gt;
&lt;p&gt;For variable terms you should, in my estimation and experience, form an &lt;i&gt;internal ubiquitous language&lt;/i&gt; that&amp;#39;s adhered to across product management and software development. In cases like this, you&amp;#39;ll can potentially also apply DDD guidance to a generic subdomain that handles terminology. This domain usually goes by the name &amp;quot;localization,&amp;quot; only slightly extended to allow clients to change terminology. This is exactly how we handle the differences in terminology (silly) between agile methods like Scrum and XP in our product at VersionOne. We simply have a set of components that handle the change between backlog item and story, iteration and sprint, etc.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=249270" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=BkPtbFlfYJk:PoC6pUhMUvk:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=BkPtbFlfYJk:PoC6pUhMUvk:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=BkPtbFlfYJk:PoC6pUhMUvk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=BkPtbFlfYJk:PoC6pUhMUvk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=BkPtbFlfYJk:PoC6pUhMUvk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=BkPtbFlfYJk:PoC6pUhMUvk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/BkPtbFlfYJk" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/DDD/default.aspx">DDD</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/product+development/default.aspx">product development</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/06/24/ubiquitous-language-in-product-development.aspx</feedburner:origLink></item><item><title>Announcing the Lean Kanban Conference</title><link>http://feedproxy.google.com/~r/thebeelog/~3/ZfItfpzmXSM/announcing-the-lean-kanban-conference.aspx</link><pubDate>Tue, 06 Jan 2009 14:44:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:186982</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=186982</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2009/01/06/announcing-the-lean-kanban-conference.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve been working with &lt;a href="http://www.agilemanagement.net/Articles/Weblog/blog.html"&gt;David Anderson&lt;/a&gt; and crew to produce the &lt;a href="http://leankanbanconference.com/"&gt;Lean Kanban Conference&lt;/a&gt; in Miami, February 18th-20th. &lt;/p&gt;&lt;p&gt;There are a number of great speakers and some folks that have been practicing Kanban and flexing Agile methodologies with Lean thinking for some time. For my part, I&amp;#39;m going to do a talk about introducing pull systems at the edges of an Agile team (based on experiences at VersionOne), JIT&amp;#39;ing retrospectives, and rethinking software development activities and practices -- architectures, continuous integration, source control -- through the Lean lens, which would have us release regularly (on a feature basis, in fact).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If you&amp;#39;re interested in Lean Software Development and Kanban, this is &lt;u&gt;the&lt;/u&gt; place to be. &lt;a href="http://leankanbanconference.com/"&gt;Register now!&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=186982" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=ZfItfpzmXSM:aZN1Bxrl82E:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=ZfItfpzmXSM:aZN1Bxrl82E:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=ZfItfpzmXSM:aZN1Bxrl82E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=ZfItfpzmXSM:aZN1Bxrl82E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=ZfItfpzmXSM:aZN1Bxrl82E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=ZfItfpzmXSM:aZN1Bxrl82E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/ZfItfpzmXSM" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/conferences/default.aspx">conferences</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/lean/default.aspx">lean</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/housekeeping/default.aspx">housekeeping</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/kanban/default.aspx">kanban</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2009/01/06/announcing-the-lean-kanban-conference.aspx</feedburner:origLink></item><item><title>Spicing Up Your Standup</title><link>http://feedproxy.google.com/~r/thebeelog/~3/CPpjqHYa6WM/spicing-up-your-standup.aspx</link><pubDate>Mon, 17 Nov 2008 01:58:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:185103</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=185103</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2008/11/16/spicing-up-your-standup.aspx#comments</comments><description>&lt;p&gt;&lt;b&gt;Tags:&lt;/b&gt; &lt;a href="http://www.lukemelia.com/devblog/"&gt;luke-melia&lt;/a&gt;&lt;a href="http://www.weplay.com/blog/the-daily-stand-up"&gt;-is-awesome&lt;/a&gt;, funny&lt;/p&gt;

&lt;p&gt;
&lt;object height="344" width="425"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/SUcmpZ8hzKA&amp;amp;hl=en&amp;amp;fs=1"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowscriptaccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/SUcmpZ8hzKA&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" height="344" width="425"&gt;&lt;/object&gt;
&lt;/p&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=185103" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=CPpjqHYa6WM:58YtL9URf9M:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=CPpjqHYa6WM:58YtL9URf9M:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=CPpjqHYa6WM:58YtL9URf9M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=CPpjqHYa6WM:58YtL9URf9M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=CPpjqHYa6WM:58YtL9URf9M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=CPpjqHYa6WM:58YtL9URf9M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/CPpjqHYa6WM" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/Agile/default.aspx">Agile</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/stand-up/default.aspx">stand-up</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2008/11/16/spicing-up-your-standup.aspx</feedburner:origLink></item><item><title>Ayende on Advanced NHibernate</title><link>http://feedproxy.google.com/~r/thebeelog/~3/xkRh46cgUus/ayende-on-advanced-nhibernate.aspx</link><pubDate>Thu, 13 Nov 2008 14:02:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:184983</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>26</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=184983</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2008/11/13/ayende-on-advanced-nhibernate.aspx#comments</comments><description>&lt;p&gt;There&amp;#39;s this cat called Ayende that&amp;#39;s been around the NHibernate block (20 or 30 times). &lt;a href="http://kaizenconf.pbwiki.com/"&gt;In Austin&lt;/a&gt;, he did a 3-hour workshop detailing the advanced features of the tool. If you weren&amp;#39;t there, sorry you missed it.&lt;/p&gt;
&lt;p&gt;Oh wait! You&amp;#39;re in luck; someone recorded it! The audio is a little quiet so be sure to, as the kids say, &amp;quot;pump up the volume.&amp;quot;&lt;/p&gt;
&lt;p&gt;Enjoy...&lt;/p&gt;
&lt;p&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="viddler_d579ac3f" height="351" width="545"&gt;&lt;param name="movie" value="http://www.viddler.com/player/d579ac3f/"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed src="http://www.viddler.com/player/d579ac3f/" type="application/x-shockwave-flash" allowscriptaccess="always" name="viddler_d579ac3f" height="351" width="545"&gt;&lt;/object&gt;&lt;/p&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=184983" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=xkRh46cgUus:o3P3L-umTeM:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=xkRh46cgUus:o3P3L-umTeM:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=xkRh46cgUus:o3P3L-umTeM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=xkRh46cgUus:o3P3L-umTeM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=xkRh46cgUus:o3P3L-umTeM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=xkRh46cgUus:o3P3L-umTeM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/xkRh46cgUus" height="1" width="1"/&gt;</description><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/conferences/default.aspx">conferences</category><category domain="http://codebetter.com/blogs/david_laribee/archive/tags/video/default.aspx">video</category><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2008/11/13/ayende-on-advanced-nhibernate.aspx</feedburner:origLink></item><item><title>Designing the Team Room, Take 2</title><link>http://feedproxy.google.com/~r/thebeelog/~3/illYVgybeFM/designing-the-team-room-take-2.aspx</link><pubDate>Thu, 06 Nov 2008 15:19:00 GMT</pubDate><guid isPermaLink="false">d21fbbc9-c112-4f32-ad14-95939a2c53d4:184700</guid><dc:creator>Dave Laribee</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://codebetter.com/blogs/david_laribee/rsscomments.aspx?PostID=184700</wfw:commentRss><comments>http://codebetter.com/blogs/david_laribee/archive/2008/11/06/designing-the-team-room-take-2.aspx#comments</comments><description>&lt;p&gt;Based on the comments, a couple of clarifications on my &amp;quot;&lt;a href="http://codebetter.com/blogs/david_laribee/archive/2008/11/05/designing-the-team-room.aspx"&gt;Designing the Team Room&lt;/a&gt;&amp;quot; post from yesterday.&lt;/p&gt;&lt;p&gt;The text at the bottom certainly does have contradictions and conflicts. That&amp;#39;s by design. We wanted to see what people came up with, what ideas latched on to &amp;quot;productivity&amp;quot; versus &amp;quot;collaboration.&amp;quot; The opening is simply for context. People that are up on Theory of Constraints will realize that defining conflicts and finding solutions based on root cause is, well, kind of the whole point.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I also neglected to detail the mechanics used for the design storm.&lt;/p&gt;&lt;p&gt;1. Each person tore of a sheet from a 3M sticky easel pad, grabbed a marker, and found a spot on the wall.&amp;nbsp; &lt;br /&gt;2. We had twelve (12) people stand in the circle.&lt;br /&gt;3. I read the context statement I posted yesterday.&lt;br /&gt;4. For 5 minutes, each person made a &amp;quot;design.&amp;quot; Some of these were visual, some textual, some floor plans, etc.&lt;br /&gt;5. We then counted off by threes to form a total of four groups (ones in one group, twos in another).&lt;br /&gt;6. Each group member (within their group) had 1 minute to pitch their ideas.&lt;br /&gt;7. After the individual pitches, we took another 5 minutes to synthesis a cohesive design.&lt;br /&gt;8. The cohesive designs were presented to the entire group.&lt;/p&gt;&lt;p&gt;What was interesting is that this process took under 30 minutes and we got a little closer to consensus and got some &lt;i&gt;really&lt;/i&gt; good ideas. And that was the point... &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://codebetter.com/aggbug.aspx?PostID=184700" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=illYVgybeFM:DOZ00qYQaW8:GX2IY5MWfH0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=GX2IY5MWfH0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=illYVgybeFM:DOZ00qYQaW8:XQ266DUsA9M"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?d=XQ266DUsA9M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=illYVgybeFM:DOZ00qYQaW8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=illYVgybeFM:DOZ00qYQaW8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thebeelog?a=illYVgybeFM:DOZ00qYQaW8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thebeelog?i=illYVgybeFM:DOZ00qYQaW8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thebeelog/~4/illYVgybeFM" height="1" width="1"/&gt;</description><feedburner:origLink>http://codebetter.com/blogs/david_laribee/archive/2008/11/06/designing-the-team-room-take-2.aspx</feedburner:origLink></item></channel></rss>
