<?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:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6558914886349044117</atom:id><lastBuildDate>Tue, 27 Dec 2011 03:35:22 +0000</lastBuildDate><category>storytesting</category><category>practice</category><category>teamwork</category><category>microtesting</category><category>flow</category><category>agile</category><category>debugging</category><category>refactoring</category><category>planning</category><category>craftsmanship</category><category>collaboration</category><category>code tips java</category><category>ubiquitous language</category><category>bug spray</category><category>design</category><category>tdd</category><category>fun</category><category>corporate culture</category><category>leadership</category><category>pairing</category><category>user stories</category><category>thinking</category><title>MBarking on Innovation</title><description>Mike Bria&amp;#39;s humble ramblings on code, agile, and craftsmanship ... + people, brilliance, stupidity, vino, vivo &amp;amp; stuff like that.</description><link>http://aydsoftware.blogspot.com/</link><managingEditor>noreply@blogger.com (Mike Bria)</managingEditor><generator>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AYDSoftware" /><feedburner:info uri="aydsoftware" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-1656029929303294184</guid><pubDate>Fri, 31 Jul 2009 14:06:00 +0000</pubDate><atom:updated>2009-08-12T18:27:48.467-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">thinking</category><category domain="http://www.blogger.com/atom/ns#">tdd</category><category domain="http://www.blogger.com/atom/ns#">design</category><title>Test objects, not methods</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NtSvNsKtHLs/SoDIy2tPA-I/AAAAAAAAAT0/GwGaRB7mO5E/s1600-h/black_box1.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 141px;" src="http://1.bp.blogspot.com/_NtSvNsKtHLs/SoDIy2tPA-I/AAAAAAAAAT0/GwGaRB7mO5E/s200/black_box1.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5368511531829887970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;As you may or may not know, I am part of the team pushing the boundaries of Agile &amp;amp; XP at &lt;a href="http://industriallogic.com/"&gt;Industrial Logic&lt;/a&gt; with Josh Kerievsky.  As such, I'll be posting some of my rantings in our new Industrial Blogic album (the blog portion of our truly kick-ass "Greatist Hits" eLearning platform).&lt;/div&gt;&lt;div&gt;My debut there is a classic, but so grossly unknown topic.  Summarize it as so: if you want to test your private methods, take out a ruler and slap yourself over the wrist. As a personal mentor of mine, J.B. Rainsberger, used to tell me:  "if you really need to test that private method, then it should go somewhere else dude."&lt;/div&gt;&lt;div&gt;Check out the rest of the story &lt;a href="https://elearning.industriallogic.com/gh/submit?Action=PageAction&amp;amp;album=blog2009&amp;amp;path=blog2009/july/testObjectsNotMethods&amp;amp;devLanguage=Java"&gt;here&lt;/a&gt;, and while you're in add our Industrial Blogic to your RSS reader, we'll be keeping it hot there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-1656029929303294184?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=epdEhnex2CU:vM5zAnK3iN4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=epdEhnex2CU:vM5zAnK3iN4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=epdEhnex2CU:vM5zAnK3iN4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=epdEhnex2CU:vM5zAnK3iN4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=epdEhnex2CU:vM5zAnK3iN4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=epdEhnex2CU:vM5zAnK3iN4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=epdEhnex2CU:vM5zAnK3iN4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=epdEhnex2CU:vM5zAnK3iN4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=epdEhnex2CU:vM5zAnK3iN4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=epdEhnex2CU:vM5zAnK3iN4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=epdEhnex2CU:vM5zAnK3iN4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/epdEhnex2CU/test-objects-not-methods.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_NtSvNsKtHLs/SoDIy2tPA-I/AAAAAAAAAT0/GwGaRB7mO5E/s72-c/black_box1.gif" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/07/test-objects-not-methods.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-2368566642031067761</guid><pubDate>Wed, 08 Jul 2009 21:12:00 +0000</pubDate><atom:updated>2009-07-08T17:41:51.298-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">fun</category><title>Checking In (but no, not source control)</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NtSvNsKtHLs/SlUOprJ8rsI/AAAAAAAAATE/DbGxXG65DdU/s1600-h/taking_a_break.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 230px; height: 270px;" src="http://2.bp.blogspot.com/_NtSvNsKtHLs/SlUOprJ8rsI/AAAAAAAAATE/DbGxXG65DdU/s200/taking_a_break.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5356203440948948674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So sorry, I've been sooooo lax about posting any new thoughts (very busy training for a triathlon) - trust me though I've had many, my "rants todo" list is billowing over.  Soon, they will be here in all their glory for you to chew on, I promise (to both of us).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NtSvNsKtHLs/SlUQNrv_m3I/AAAAAAAAATc/ywlkEV2OtgU/s1600-h/full_moon_02_2000.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 98px; height: 100px;" src="http://1.bp.blogspot.com/_NtSvNsKtHLs/SlUQNrv_m3I/AAAAAAAAATc/ywlkEV2OtgU/s200/full_moon_02_2000.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5356205159095442290" /&gt;&lt;/a&gt;In the meantime, I thought you'd be interested to know that today we experienced two very very unique moments:&lt;/div&gt;&lt;div&gt;&lt;b&gt;12:34:56 07/08/09&lt;/b&gt; and &lt;b&gt;04:05:06 07/08/09&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;/b&gt;Won't happen again in any of our lifetimes.  Wow, pretty darn neat, huh? One day past a full moon to boot.&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NtSvNsKtHLs/SlUPNsQfSyI/AAAAAAAAATU/h1VhDMSRbFE/s1600-h/full_moon_02_2000.jpg"&gt;&lt;br /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); -webkit-text-decorations-in-effect: none; "&gt;And also, hopefully to keep you &lt;i&gt;really&lt;/i&gt; distracted from my absense, I thought I'd treat you to what I thought to be a pretty damn funny joke my dad forwarded my way:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NtSvNsKtHLs/SlUQsYoecjI/AAAAAAAAATk/ODONLNDODIg/s1600-h/talking_dog.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 300px; height: 150px;" src="http://3.bp.blogspot.com/_NtSvNsKtHLs/SlUQsYoecjI/AAAAAAAAATk/ODONLNDODIg/s200/talking_dog.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5356205686539579954" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:Arial;"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;A Dog Story&lt;br /&gt;&lt;br /&gt;A guy is driving around the back woods of &lt;/span&gt;&lt;/i&gt;&lt;st1:place st="on"&gt;&lt;st1:state st="on"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Montana&lt;/span&gt;&lt;/i&gt;&lt;/st1:state&gt;&lt;/st1:place&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; and he sees a sign in front of a broken down shanty-style house: 'Talking Dog For &lt;/span&gt;&lt;/i&gt;&lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Sale&lt;/span&gt;&lt;/i&gt;&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; ' He rings the bell and the owner appears and tells him the dog is in the backyard.&lt;br /&gt;&lt;br /&gt;The guy goes into the backyard and sees a nice looking &lt;/span&gt;&lt;/i&gt;&lt;st1:place st="on"&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Labrador &lt;/span&gt;&lt;/i&gt;&lt;/st1:place&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;retriever sitting there.&lt;br /&gt;&lt;br /&gt;'You talk?' he asks.&lt;br /&gt;&lt;br /&gt;'Yep,' the Lab replies.&lt;br /&gt;&lt;br /&gt;After the guy recovers from the shock of hearing a dog talk, he says 'So, what's your story?'&lt;br /&gt;&lt;br /&gt;The Lab looks up and says, 'Well, I discovered that I could talk when I was pretty young. I wanted to help the government, so I told the CIA. In no time at all they had me jetting from country to country, sitting in rooms with spies and world leaders, because no one figured a dog would&lt;br /&gt;be eavesdropping.'&lt;br /&gt;&lt;br /&gt;'I was one of their most valuable spies for eight years running. But the jetting around really tired me out, and I knew I wasn't getting any younger so I decided to settle down. I signed up for a job at the airport to do some undercover security, wandering near suspicious characters and listening in. I uncovered some incredible dealings and was awarded a batch of medals.'&lt;br /&gt;&lt;br /&gt;'I got married, had a mess of puppies, and now I'm just retired..'&lt;br /&gt;&lt;br /&gt;The guy is amazed. He goes back in and asks the owner what he wants for the dog.&lt;br /&gt;&lt;br /&gt;'Ten dollars,' the guy says.&lt;br /&gt;&lt;br /&gt;'Ten dollars? This dog is amazing! Why on earth are you selling him so cheap?'&lt;br /&gt;&lt;br /&gt;'Because he's a liar. He never did any of that shit.'&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, fantasy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Arial, -webkit-fantasy;"&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia, fantasy;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;;-) C ya soon...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia, -webkit-fantasy;"&gt;MB&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-2368566642031067761?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UEsH6_oH4ds:RnbbTzupDWA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UEsH6_oH4ds:RnbbTzupDWA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UEsH6_oH4ds:RnbbTzupDWA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=UEsH6_oH4ds:RnbbTzupDWA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UEsH6_oH4ds:RnbbTzupDWA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UEsH6_oH4ds:RnbbTzupDWA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UEsH6_oH4ds:RnbbTzupDWA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=UEsH6_oH4ds:RnbbTzupDWA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UEsH6_oH4ds:RnbbTzupDWA:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UEsH6_oH4ds:RnbbTzupDWA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=UEsH6_oH4ds:RnbbTzupDWA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/UEsH6_oH4ds/checking-in-but-no-not-source-control.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_NtSvNsKtHLs/SlUOprJ8rsI/AAAAAAAAATE/DbGxXG65DdU/s72-c/taking_a_break.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/07/checking-in-but-no-not-source-control.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-1630598702319901785</guid><pubDate>Sat, 16 May 2009 17:19:00 +0000</pubDate><atom:updated>2009-05-16T14:05:20.722-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">microtesting</category><category domain="http://www.blogger.com/atom/ns#">bug spray</category><category domain="http://www.blogger.com/atom/ns#">tdd</category><category domain="http://www.blogger.com/atom/ns#">storytesting</category><category domain="http://www.blogger.com/atom/ns#">refactoring</category><category domain="http://www.blogger.com/atom/ns#">craftsmanship</category><title>TDD:  The Rhythm</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NtSvNsKtHLs/Sg731_YSAOI/AAAAAAAAASk/NWQbkosiFw4/s1600-h/1063heartbeat.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://2.bp.blogspot.com/_NtSvNsKtHLs/Sg731_YSAOI/AAAAAAAAASk/NWQbkosiFw4/s200/1063heartbeat.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5336475115399020770" /&gt;&lt;/a&gt;&lt;br /&gt;Good TDD, well &lt;span style="font-style:italic;"&gt;real&lt;/span&gt; TDD, provides the team with a heartbeat.&lt;br /&gt;&lt;br /&gt;Everyone has a heartbeat, you know what it's like: continuous and clear, smoothly flowing, subtle yet ever so present and soothing. Its unlikely that you're explicitly listening to it, but you are without doubt subconciously aware of the supreme comfort and reassurance that heartbeat provides you each and every minute of your day. It keeps you alive!&lt;br /&gt;&lt;br /&gt;Same is true with software development. And while Iterations, Stand-ups, and CIT no doubt provide an essential macro-heartbeat, those things aren't what give us that minute to minute assurance analogous to our human heartbeat. That's where TDD comes in - true TDD provides us that comforting development heartbeat to actually get us productively and happily through the day.&lt;br /&gt;&lt;br /&gt;It provides the transition from story card to failing storytest (acceptance test). Then from failing storytest to the first failing microtest (unit test). Then minutes later to the first passing microtest. Then minutes later to the next failing microtest, then the next passing microtest, and our first refactoring. Then minutes later to our next quick cycle of "red/green/refactor". Then within an hour our first check-in. Then a few more "red/green/refactor" cycles and another checkin. And before you know it, after one of those cycles, &lt;span class="Apple-style-span"  style="font-family:verdana;"&gt;boom&lt;/span&gt;, a passing storytest! A high-five and a final checkin, then home by 6 to see the kids.&lt;br /&gt;&lt;br /&gt;Do you hear it? Thum-THUMP, Thum-THUMP, Thum-THUMP...RedBar-GREENBAR, RedBar-GREENBAR, RedBar-GREENBAR...&lt;br /&gt;&lt;b&gt;A development heartbeat.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It's this rhythm that guides you, that keeps you on track. Its what gives you the constant feedback to know, at every step of the way, that you're growing the right design, that you're satisfying the customer's needs, and that you haven't broken any windows.  It's what allows you to move freely and move fast. It's this rhythm that makes you feel good. It's this rhythm that makes you feel alive and happy.&lt;br /&gt;&lt;br /&gt;Ask anyone whose felt it. Once you've actually truly experienced this rhythm - this heartbeat - I assure you, just as with your human heartbeat, you'll find it unbearable to ever live without.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NtSvNsKtHLs/Sg7-qpna6uI/AAAAAAAAAS8/uq1VXlEoXj0/s1600-h/TDD-Cycle.jpeg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 460px; height: 270px;" src="http://1.bp.blogspot.com/_NtSvNsKtHLs/Sg7-qpna6uI/AAAAAAAAAS8/uq1VXlEoXj0/s400/TDD-Cycle.jpeg" border="0" alt="" id="BLOGGER_PHOTO_ID_5336482617159772898" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-1630598702319901785?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=aFPbU7QR7Zo:JdJQyPtdTFg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=aFPbU7QR7Zo:JdJQyPtdTFg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=aFPbU7QR7Zo:JdJQyPtdTFg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=aFPbU7QR7Zo:JdJQyPtdTFg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=aFPbU7QR7Zo:JdJQyPtdTFg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=aFPbU7QR7Zo:JdJQyPtdTFg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=aFPbU7QR7Zo:JdJQyPtdTFg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=aFPbU7QR7Zo:JdJQyPtdTFg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=aFPbU7QR7Zo:JdJQyPtdTFg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=aFPbU7QR7Zo:JdJQyPtdTFg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=aFPbU7QR7Zo:JdJQyPtdTFg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/aFPbU7QR7Zo/tdd-rhythm.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_NtSvNsKtHLs/Sg731_YSAOI/AAAAAAAAASk/NWQbkosiFw4/s72-c/1063heartbeat.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/05/tdd-rhythm.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-1133893417429610309</guid><pubDate>Fri, 03 Apr 2009 02:06:00 +0000</pubDate><atom:updated>2009-04-03T16:24:23.317-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">code tips java</category><category domain="http://www.blogger.com/atom/ns#">ubiquitous language</category><category domain="http://www.blogger.com/atom/ns#">design</category><category domain="http://www.blogger.com/atom/ns#">refactoring</category><category domain="http://www.blogger.com/atom/ns#">craftsmanship</category><title>PropertyFor Sale</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NtSvNsKtHLs/SdV-J0GTpaI/AAAAAAAAASc/TzJGzzFAvkw/s1600-h/TreeForSale.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 125px; height: 170px;" src="http://2.bp.blogspot.com/_NtSvNsKtHLs/SdV-J0GTpaI/AAAAAAAAASc/TzJGzzFAvkw/s200/TreeForSale.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5320297241877128610" /&gt;&lt;/a&gt;Properties. And, Java.  Lots of languages really, but let's look at Java.   Every Java (and other langs too) application of any size is going to be using some &lt;em&gt;properties&lt;/em&gt;.  Typically, they'll be held in a "myspecializedvalues.properties" file, but not necessarily.  For this example, let's assume you are using such a file (and can then thus use Java's built-in property management mechanism), but again, its not really the point.  And this approach can be applied no matter what format you choose to store your properties.&lt;br /&gt;&lt;br /&gt;The point of this is to show you a better way to manage - a better way to encapsulate and access - your properties so that the implementation is hidden behind an expressive interface, easy for anyone to understand and use.&lt;br /&gt;&lt;br /&gt;The point is to show the &lt;em&gt;&lt;bold&gt;PropertyFor&lt;/bold&gt;&lt;/em&gt; class, and to tell you why its better than what you probably have in place.&lt;br /&gt;&lt;br /&gt;So, this example has a strategy factory class that needs to make its decisions based on a property setting, this property having a true/false (boolean) value.  It starts off looking like this:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class GeneratorFactory {&lt;br /&gt; public String propFileName = &lt;br /&gt;    "ELearningSettings.properties";&lt;br /&gt;&lt;br /&gt; public GenerationStrategy projectGenerationStrategy() {&lt;br /&gt;   if (shouldIgnoreCode())&lt;br /&gt;    return new GenerateWithoutCode();&lt;br /&gt;   else&lt;br /&gt;    return new GenerateWithCode();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private boolean shouldIgnoreCode() {&lt;br /&gt;   Object valueObj = getProperty("CODE_IS_USELESS");&lt;br /&gt;   if (valueObj != null)&lt;br /&gt;     return Boolean.parseBoolean((String)valueObj);&lt;br /&gt;   return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private Object getProperty(String key) {&lt;br /&gt;   Properties properties = new Properties();&lt;br /&gt;   try {&lt;br /&gt;     properties.load(new FileInputStream(propFileName));&lt;br /&gt;   } catch (IOException e) {&lt;br /&gt;      throw new RuntimeException(e);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return properties.get(key);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You'll hopefully notice something about this factory.  First, it's primary responsibility is to serve up the correct strategy to its caller.  Of course though, you'll also notice that not only does this class do its primary purpose, but it also has a lot of low-level knowledge about how  to obtain the information it needs to make its decision. It knows all sorts of things about icky java property mania.&lt;br /&gt;&lt;br /&gt;Now, if this is the lone property in your system, than maybe this is okay and doing any kind of extraction here might be YAGNI (you might though, even if that is the case, be bothered by that fact that this class clearly violates the SRP, nonetheless...).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course though, this is not the case, and so let's assume that although this is the only class you see in this example there are in fact more properties in your system and more users of them.&lt;br /&gt;&lt;br /&gt;So, the logical thing to do is to extract that property reading management into its own class, happy to have its sole responsibility being providing property values.  You do so, and end up with this new "Settings" class:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class ELearningSettings {&lt;br /&gt; public String propFileName = &lt;br /&gt;     "ELearningSettings.properties";&lt;br /&gt;&lt;br /&gt; public Object getProperty(String key) {&lt;br /&gt;   Properties properties = new Properties();&lt;br /&gt;   try {&lt;br /&gt;     properties.load(new FileInputStream(propFileName));&lt;br /&gt;   } catch (IOException e) {&lt;br /&gt;     throw new RuntimeException(e);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return properties.get(key);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class GeneratorFactory {&lt;br /&gt; public GenerationStrategy projectGenerationStrategy() {&lt;br /&gt;   if (shouldIgnoreCode())&lt;br /&gt;     return new GenerateWithoutCode();&lt;br /&gt;   else&lt;br /&gt;     return new GenerateWithCode();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private boolean shouldIgnoreCode() {&lt;br /&gt;   Object valueObj = &lt;br /&gt;      ELearningSettings.getProperty("CODE_IS_USELESS");&lt;br /&gt;   if (valueObj != null)&lt;br /&gt;     return Boolean.parseBoolean((String)valueObj);&lt;br /&gt;   return false;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;You slap five with your pair and check in, this is much better!  Now your factory can do it's job without having any internal worry about where the settings (properties) are really coming from or how they're implemented.  Any other users of properties also get the same luxury.  A big improvement, no doubt.&lt;br /&gt;&lt;br /&gt;Many systems I've seen have figured this much out, and have this in place.  A "Settings" class that hides the details of how to look up properties, all you have to give it is the key to the property you want.&lt;br /&gt;&lt;br /&gt;But, this has limitations.&lt;br /&gt;&lt;br /&gt;First, and as many will figure out and solve on their own, a sprawl of the property key strings hard-coded in the various users of the properties.  You want to change this key?  Have fun chasing all the uses down.  Of course you could create a constants file for these keys, and have the callers only know the constants (which, in Java at least, provides the big benefit of being able to leverage you IDE when you want to change its name), but is that really enough?&lt;br /&gt;&lt;br /&gt;Second, yes your factory doesn't know about "ELearningSettings" or the "java...Properties" guts, but it does still have the job of knowing the format of these property values ('Object' in this case) and how to turn that into what it really wants, a &lt;em&gt;boolean&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Third, particularly if haven't created a constants file (in response to the first problem), how easy is it for future developers to go to one place and see all the possible properties/settings the system has available for them?&lt;br /&gt;&lt;br /&gt;There may be more limitations, but that's enough for me.&lt;br /&gt;&lt;br /&gt;So, our answer to each of these questions is where the magic happens, the MBark of this article.  We evolve our generic "Settings" class into a domain-friendly "PropertyFor" class:&lt;pre name="code" class="Java"&gt;public class PropertyFor {&lt;br /&gt;public static String propFileName = &lt;br /&gt;     "ELearningSettings.properties";&lt;br /&gt;&lt;br /&gt; public static boolean shouldIgnoreCode() {&lt;br /&gt;   Object valueObj = getProperty("CODE_IS_USELESS");&lt;br /&gt;   if (valueObj != null)&lt;br /&gt;     return Boolean.parseBoolean((String)valueObj);&lt;br /&gt;   return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static Object getProperty(String key) {&lt;br /&gt;   Properties properties = new Properties();&lt;br /&gt;   try {&lt;br /&gt;     properties.load(new FileInputStream(propFileName));&lt;br /&gt;   } catch (IOException e) {&lt;br /&gt;     throw new RuntimeException(e);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return properties.get(key);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class GeneratorFactory {&lt;br /&gt; public GenerationStrategy projectGenerationStrategy() {&lt;br /&gt;   if (PropertyFor.shouldIgnoreCode())&lt;br /&gt;     return new GenerateWithoutCode();&lt;br /&gt;   else&lt;br /&gt;     return new GenerateWithCode();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;What did we do here?  Well, we've taken all the knowledge highlighted above as our limitations and removed it from our factory (really, from all of the users of settings), and put it into our "Settings" class - which, as a result, now becomes a more useful, expressive &lt;em&gt;&lt;bold&gt;PropertyFor&lt;/bold&gt;&lt;/em&gt; utility.&lt;br /&gt;&lt;br /&gt;So, you'll see our factory now has to worry just about choosing a strategy, and no longer has any overhead related to obtaining the values it needs to make its decision.  More specifically, it doesn't know where the settings come from, doesn't know the details of how to access them or the keys that identify them, and it doesn't know what raw format they come in.  The factory knows it needs the boolean value of whether or not to "ignore code", and it gets that in one clear, simple line of code.&lt;br /&gt;&lt;br /&gt;Further, you've got the beauty of expressive methods on  singular class to be very domain-centric in assisting other programmers to access the available setttings/properties for your system - these methods, not only being clearly and expressively named, but also being typed appropriately for ultimate ease to the consumer.   And of course, when you need to change the name of the setting and/or the name the callers know it by, no problemo.&lt;br /&gt;&lt;br /&gt;So, that's really the main meat.&lt;br /&gt;&lt;br /&gt;For good measure though, we take a moment to improve the design of our PropertyFor class.  First, this isn't the only boolean setting we have (use your imagination) so we should have a nice clear reusable method to handle our boolean typed settings:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class PropertyFor {&lt;br /&gt; public static String propFileName = &lt;br /&gt;    "ELearningSettings.properties";&lt;br /&gt;&lt;br /&gt; public static boolean shouldIgnoreCode() {&lt;br /&gt;   return boolanValueFor("CODE_IS_USELESS");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static boolean boolanValueFor(String key){&lt;br /&gt;   Object valueObj = valueFor(key);&lt;br /&gt;   if (valueObj != null)&lt;br /&gt;     return Boolean.parseBoolean((String)valueObj);&lt;br /&gt;   return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static Object valueFor(String key) {&lt;br /&gt;  Properties properties = new Properties();&lt;br /&gt;  try {&lt;br /&gt;    properties.load(new FileInputStream(propFileName));&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;    throw new RuntimeException(e);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return properties.get(key);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And then, it really is pretty inefficient of us to read the properties file over and over, so let's take care of doing that just once and being done with it:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class PropertyFor {&lt;br /&gt; public static String propFileName = &lt;br /&gt;     "ELearningSettings.properties";&lt;br /&gt;&lt;br /&gt; private static Properties properties;&lt;br /&gt; static {&lt;br /&gt;   loadProperties();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static void loadProperties() {&lt;br /&gt;   properties = new Properties();&lt;br /&gt;   try {&lt;br /&gt;     properties.load(new FileInputStream(propFileName));&lt;br /&gt;   } catch (IOException e) {&lt;br /&gt;     throw new RuntimeException(e);&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static boolean shouldIgnoreCode() {&lt;br /&gt;   return boolanValueFor("CODE_IS_USELESS");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private static boolean boolanValueFor(String key){&lt;br /&gt;   Object valueObj = properties.get(key);&lt;br /&gt;   if (valueObj != null)&lt;br /&gt;     return Boolean.parseBoolean((String)valueObj);&lt;br /&gt;   return false;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;So there you have it:   &lt;em&gt;&lt;bold&gt;PropertyFor&lt;/bold&gt;&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;And, of course, this isn't a post about TDD, but here is the test that was in place and passing before and after any of these refactorings went down:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class GenerationStrategyFactoryTest {&lt;br /&gt; @Test  &lt;br /&gt; public void needingACodelessStrategy() {&lt;br /&gt;  propertiesFileIs("CodelessGenerationStrategy");&lt;br /&gt;  assertTrue(strategy() instanceof GenerateWithoutCode);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Test&lt;br /&gt; public void needingACodeStrategy() {&lt;br /&gt;  propertiesFileIs("IncludeCodeGenerationStrategy");&lt;br /&gt;  assertTrue(strategy() instanceof GenerateWithCode);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private void propertiesFileIs(String fileNameBase) {&lt;br /&gt;   String filePath = "testdata/" &lt;br /&gt;                  + fileNameBase + ".properties";&lt;br /&gt;   PropertyFor.propFileName = filePath;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private GenerationStrategy strategy() {&lt;br /&gt;   return new GeneratorFactory().&lt;br /&gt;     projectGenerationStrategy();&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;As an exercise, go ahead and write the test you think I have for the PropertyFor class, because of course you know I do!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ps// I'm really &lt;span style="font-weight:bold;"&gt;not&lt;/span&gt; liking this code highlighter library so far.  Any other Bloggers have good suggestions for a good library?!?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-1133893417429610309?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=gew223BM_Ks:SoAQPkpEKt8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=gew223BM_Ks:SoAQPkpEKt8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=gew223BM_Ks:SoAQPkpEKt8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=gew223BM_Ks:SoAQPkpEKt8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=gew223BM_Ks:SoAQPkpEKt8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=gew223BM_Ks:SoAQPkpEKt8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=gew223BM_Ks:SoAQPkpEKt8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=gew223BM_Ks:SoAQPkpEKt8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=gew223BM_Ks:SoAQPkpEKt8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=gew223BM_Ks:SoAQPkpEKt8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=gew223BM_Ks:SoAQPkpEKt8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/gew223BM_Ks/propertyfor-sale.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_NtSvNsKtHLs/SdV-J0GTpaI/AAAAAAAAASc/TzJGzzFAvkw/s72-c/TreeForSale.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/04/propertyfor-sale.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-8901856843941709675</guid><pubDate>Sun, 29 Mar 2009 03:06:00 +0000</pubDate><atom:updated>2009-03-29T23:42:26.283-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">practice</category><category domain="http://www.blogger.com/atom/ns#">craftsmanship</category><category domain="http://www.blogger.com/atom/ns#">pairing</category><category domain="http://www.blogger.com/atom/ns#">flow</category><title>Doing The Right Thing And Getting It Done</title><description>Been following my man Corey as he moves along on his &lt;a href="http://programmingtour.blogspot.com/"&gt;Journeyman Tour&lt;/a&gt; (which I &lt;a href="http://www.infoq.com/news/2008/12/haines-pairing-tour"&gt;posted about on InfoQ&lt;/a&gt; at its onset), in fact had dinner with him tonight!&lt;br /&gt;&lt;br /&gt;Here's a talk he did recently on "Practice", which I'm totally in agreement with.  Check it.&lt;br /&gt;&lt;br /&gt;&lt;object width="400" height="230"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=3756344&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=3756344&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="230"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/3756344"&gt;Practice - Corey Haines&lt;/a&gt; from &lt;a href="http://vimeo.com/user1307307"&gt;8th Light&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Keep on keepin' on, Corey!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-8901856843941709675?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=I1_WQGlSB2g:sm4RI_7B8l4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=I1_WQGlSB2g:sm4RI_7B8l4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=I1_WQGlSB2g:sm4RI_7B8l4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=I1_WQGlSB2g:sm4RI_7B8l4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=I1_WQGlSB2g:sm4RI_7B8l4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=I1_WQGlSB2g:sm4RI_7B8l4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=I1_WQGlSB2g:sm4RI_7B8l4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=I1_WQGlSB2g:sm4RI_7B8l4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=I1_WQGlSB2g:sm4RI_7B8l4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=I1_WQGlSB2g:sm4RI_7B8l4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=I1_WQGlSB2g:sm4RI_7B8l4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/I1_WQGlSB2g/doing-right-thing-and-getting-it-done.html</link><author>noreply@blogger.com (Mike Bria)</author><thr:total>1</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/03/doing-right-thing-and-getting-it-done.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-6315378117028181342</guid><pubDate>Sat, 28 Mar 2009 02:01:00 +0000</pubDate><atom:updated>2009-03-29T21:59:25.724-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">corporate culture</category><category domain="http://www.blogger.com/atom/ns#">bug spray</category><category domain="http://www.blogger.com/atom/ns#">ubiquitous language</category><category domain="http://www.blogger.com/atom/ns#">craftsmanship</category><title>Killing "Quality"</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NtSvNsKtHLs/Sc2C9jmcL4I/AAAAAAAAASU/NpU5jZlmyYQ/s1600-h/Beer_Mug_by_nicubunu.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://2.bp.blogspot.com/_NtSvNsKtHLs/Sc2C9jmcL4I/AAAAAAAAASU/NpU5jZlmyYQ/s200/Beer_Mug_by_nicubunu.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5318050729034526594" /&gt;&lt;/a&gt;&lt;br /&gt;So, a guy walks into a bar...&lt;br /&gt;&lt;br /&gt;No, just kidding.  But seriously though...&lt;br /&gt;&lt;br /&gt;You walk into a bar and order a "low quality" beer (tough economy these days).  What does this mean to you?  That it'll come out with a bug swimming in it?  That it will be served heated up? That it will be skunked? Glass only half full?&lt;br /&gt;&lt;br /&gt;No, of course not.  You'd be appalled, outraged.  Have every right to ask for your money back.  This place has acted in bad faith, they've acted &lt;i&gt;unacceptably&lt;/i&gt;.  You leave angered and vow to never return.&lt;br /&gt;&lt;br /&gt;Your wife wants you to drop $600 on a new Louis Vuitton bag (you gotta buy cheap beer and she' still asking for Louis?!?), because it's a "top quality" product.  Does she describe it this way because she knows it has less likelihood of falling apart the minute she gets it, or its colors smearing, or it having holes in the bottom?  Again, no.  These things are &lt;i&gt;assumed to be absent&lt;/i&gt;.  In the rare case you do happen to find anything like this, you are sure to invoke "return to sender, no questions asked".&lt;br /&gt;&lt;br /&gt;I could continue on this way throughout various types of products, but I suppose you get the point.&lt;br /&gt;&lt;br /&gt;Well, this ain't the case with our industry (Software Development). So I ask ye:  WTF, man?&lt;br /&gt;&lt;br /&gt;We use the word "quality" as an indicator of both "value" &lt;b&gt;and/or &lt;/b&gt;"defect" presence, interchangeably.&lt;br /&gt;&lt;br /&gt;When someone says "high quality" they could very well be talking about the &lt;i&gt;absence of defects&lt;/i&gt; or they could be talking about the &lt;i&gt;presence of value. &lt;/i&gt; And by software standards, neither would be an inappropriate use of the word.&lt;br /&gt;&lt;br /&gt;Not so in the bar, not with your beer.  Why then for us?  Again I ask, WTF?&lt;br /&gt;&lt;br /&gt;I know, I know.  Some of you are sitting there saying (correctly), "hey, wait, agile pays attention to customer feedback to iterate towards a higher &lt;i&gt;quality&lt;/i&gt; solution.  We're talking about 'value presence' there."  Or maybe your saying, "Our company's website says 'highest &lt;i&gt;quality&lt;/i&gt; product in the industry!'.  That's talking about 'value presence' too!  That's what &lt;i&gt;we&lt;/i&gt; mean when we say 'quality'."&lt;br /&gt;&lt;br /&gt;Well, maybe so (and good for you, seriously).  But I bet many of you still call your testers "the QA folk".  "QA", as in &lt;i&gt;Quality&lt;/i&gt; Assurance, as in "Those who ensure &lt;i&gt;quality&lt;/i&gt;".  But really, is their (primary) function that of ensuring 'value presence', or of ensuring 'defect absence'?  Look, don't get me wrong, on a healthy agile team these wicked cool cats ARE involved in 'ensuring high value', but at the end of the day that isn't why you're calling them "QA'ers".&lt;br /&gt;&lt;br /&gt;I've seen my share of "quality review" meetings, or fancy charts of "quality metrics", or annual budgets that talk of "quality goals" ... where  in each of these cases, "quality" is talking about DEFECTS.&lt;br /&gt;&lt;br /&gt;When was the last time someone described the benefits of TDD without mentioning, excitedly, "increased quality"?  (And, yes indeed, I am certainly just as guilty as the next guy.)&lt;br /&gt;&lt;br /&gt;So, why do I care?  Why the rant?&lt;br /&gt;&lt;br /&gt;Because, it's an indication of the generally &lt;i&gt;absurdly&lt;/i&gt; high level of tolerance our industry has for defects.&lt;br /&gt;&lt;br /&gt;That we describe defect density with the same word that we use to describe product "value" (to our customer/consumer) is gross.&lt;br /&gt;&lt;br /&gt;Heck, I'd go as far as to say its a part of the reason that we have such a generally high tolerance in the first place.  It's confusing and it is misleading.  It's too easy to masquerade our defect problems as a "quality improvement initiative" or some other politically wimpy label.&lt;br /&gt;&lt;br /&gt;When our customers get a bunch of "bugs in their beer" why aren't they appalled and outraged? Why aren't we?  Why don't they storm out and vow to never come back?  Why is it so damn okay to have defective software?  For the third time, WTF?&lt;br /&gt;&lt;br /&gt;Don't get me wrong, I'm not saying we should have an absolute "zero defect, period" attitude, that's simply unrealistic considering what we do.  But we should have a low enough tolerance for defects that it makes no sense for us to use the word "quality" when talking about them.&lt;br /&gt;&lt;br /&gt;"Quality" should be used as a measure of functional/aesthetic utility to our consumer, and &lt;i&gt;not&lt;/i&gt; as a measure of defects.  Really, it should just be &lt;i&gt;assumed&lt;/i&gt; that defects are generally absent.  This should just be implied in what it means to be a &lt;b&gt;Professional&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;So:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:large;"&gt;I&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt; hereby propose we as software professionals and businessmen stop using the word "quality" to mean a "measure of defects".&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Well then, what word will we use?  I polled Twitterverse with this question and received lots of great responses, but the group's choice as winner, courtesy of one Brian "Big Ball Of Mud" Foote, is this:&lt;br /&gt;&lt;b&gt;&lt;i&gt;Shittiness&lt;/i&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;.&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Software with minimal defects has a "low degree of shittiness";  lots of defects means it has a "high degree of shittiness".&lt;br /&gt;&lt;br /&gt;Of all the tweep responses though, overall my very favorite was from Lisa Crispin who said, "I have never liked measuring defects so it's hard to think about what to call it."&lt;br /&gt;&lt;br /&gt;Nice, now that actually says it all.  Something tells me that Lisa's company does &lt;i&gt;not&lt;/i&gt; simply think of their testers as "the QA folk".   There is hope!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-6315378117028181342?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=PIY6rHgOCGs:Zkgl6OjcBBs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=PIY6rHgOCGs:Zkgl6OjcBBs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=PIY6rHgOCGs:Zkgl6OjcBBs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=PIY6rHgOCGs:Zkgl6OjcBBs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=PIY6rHgOCGs:Zkgl6OjcBBs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=PIY6rHgOCGs:Zkgl6OjcBBs:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=PIY6rHgOCGs:Zkgl6OjcBBs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=PIY6rHgOCGs:Zkgl6OjcBBs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=PIY6rHgOCGs:Zkgl6OjcBBs:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=PIY6rHgOCGs:Zkgl6OjcBBs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=PIY6rHgOCGs:Zkgl6OjcBBs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/PIY6rHgOCGs/killing-quality.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_NtSvNsKtHLs/Sc2C9jmcL4I/AAAAAAAAASU/NpU5jZlmyYQ/s72-c/Beer_Mug_by_nicubunu.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/03/killing-quality.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-8909727385879065940</guid><pubDate>Sun, 22 Mar 2009 23:44:00 +0000</pubDate><atom:updated>2009-10-14T17:01:50.426-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">thinking</category><category domain="http://www.blogger.com/atom/ns#">microtesting</category><category domain="http://www.blogger.com/atom/ns#">tdd</category><category domain="http://www.blogger.com/atom/ns#">design</category><category domain="http://www.blogger.com/atom/ns#">user stories</category><category domain="http://www.blogger.com/atom/ns#">storytesting</category><category domain="http://www.blogger.com/atom/ns#">refactoring</category><category domain="http://www.blogger.com/atom/ns#">craftsmanship</category><category domain="http://www.blogger.com/atom/ns#">flow</category><title>TDD:  The Synergy</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NtSvNsKtHLs/ScmT-16WgJI/AAAAAAAAASM/HAB8iChd0Wc/s1600-h/yin-yang.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_NtSvNsKtHLs/ScmT-16WgJI/AAAAAAAAASM/HAB8iChd0Wc/s200/yin-yang.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5316943542920577170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;TDD.&lt;/b&gt;  What does this stand for?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Test Driven Development.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Said another way: Development, driven by tests.&lt;br /&gt;&lt;br /&gt;Notice, the acronym doesn't stand for test driven design. Not test driven analysis. Not test driven coding. Nope, not even test driven testing. It is, again, test driven &lt;i&gt;development&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;TDD is not a "task". It's not a thing we do &lt;i&gt;in addition&lt;/i&gt; to doing design, or &lt;i&gt;in addition&lt;/i&gt; to writing production code, or&lt;i&gt; in addition&lt;/i&gt; to "writing" stories. Rather, TDD it is &lt;i&gt;the way&lt;/i&gt; we design, &lt;i&gt;the way &lt;/i&gt;we write code, &lt;i&gt;the way&lt;/i&gt; we define a story. &lt;b&gt;It is the way we do development.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When done well, TDD exists at root of nearly everything we do in our agile team - it is the team's minute-to-minute comforting heartbeat.&lt;br /&gt;&lt;br /&gt;TDD means that "writing a story" equates to specifying in an&lt;i&gt; automated acceptance/story test&lt;/i&gt; (most often using FitNesse, Selenium, WaTiR, or something similar) "what it will look like" for a story to be working once we've implemented it.  How the new application feature monickered on the story card must behave for it to be DONE.&lt;br /&gt;&lt;br /&gt;TDD means that "designing" equates to specifying in an &lt;i&gt;automated unit/micro test&lt;/i&gt; (most often using a member of the xUnit family of tools) "what it will look like" for any particular object to work once we've implemented it.  In other words, what the expected behavior of that object is.&lt;br /&gt;&lt;br /&gt;TDD means that "coding" equates to letting that unit test tell us when we've written working production code. Possibly more importantly, it means that "coding" equates to letting those passing unit tests ensure that our object continues to work (satisfy it's expected behavior) while we mercilessly refactor that object to keep it super clean and expressive.&lt;br /&gt;&lt;br /&gt;And, in case you didn't notice in the above assertions, it means that our development is &lt;i&gt;driven by tests&lt;/i&gt;. This means that the test is written &lt;b&gt;&lt;i&gt;first&lt;/i&gt;&lt;/b&gt;. The existing [failing] test is what drives us to conjure up production code. The test is the only reason for us to write a line of code. It's the only way we know what code to write - the test is our &lt;i&gt;specification&lt;/i&gt;. Yes, we can write production code first then try to write a unit test to verify it's implementation, but, in addition to the mechanics of that likely being extremely difficult and counter-productive, that's simply &lt;b&gt;not&lt;/b&gt; TDD.&lt;br /&gt;&lt;br /&gt;Make no mistake about it. True TDD, at the acceptance (Story/Service) test level, is an act of &lt;i&gt;analysis&lt;/i&gt;. And true TDD, at the micro (unit/object) test level, is an act of &lt;i&gt;design&lt;/i&gt;. In a single statement: True TDD is much less an act of &lt;i&gt;verification&lt;/i&gt; (as the "test" part of the name might accidentally and incorrectly imply) as it is an act of &lt;i&gt;&lt;b&gt;specification&lt;/b&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;In summary, TDD provides the fundamental synergy between and foundation for all of our development "tasks" that enables us to truly &lt;b&gt;build the right software&lt;/b&gt; and to &lt;b&gt;build the software right&lt;/b&gt;. It ensures quality&lt;sup&gt;2&lt;/sup&gt; - which, in the end, is the only true way for us to &lt;i&gt;go fast&lt;/i&gt; and &lt;i&gt;go fun&lt;/i&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;** Upon further review, authors are changing the catchy phrase "ensures quality&lt;sup&gt;2&lt;/sup&gt;" to the more appropriate phrase of "ensures high quality and low shittiness"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-8909727385879065940?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=O-xvJHVhO-o:iKD9yB6KVd8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=O-xvJHVhO-o:iKD9yB6KVd8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=O-xvJHVhO-o:iKD9yB6KVd8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=O-xvJHVhO-o:iKD9yB6KVd8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=O-xvJHVhO-o:iKD9yB6KVd8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=O-xvJHVhO-o:iKD9yB6KVd8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=O-xvJHVhO-o:iKD9yB6KVd8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=O-xvJHVhO-o:iKD9yB6KVd8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=O-xvJHVhO-o:iKD9yB6KVd8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=O-xvJHVhO-o:iKD9yB6KVd8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=O-xvJHVhO-o:iKD9yB6KVd8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/O-xvJHVhO-o/tdd-synergy.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_NtSvNsKtHLs/ScmT-16WgJI/AAAAAAAAASM/HAB8iChd0Wc/s72-c/yin-yang.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/03/tdd-synergy.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-9032132976904370437</guid><pubDate>Tue, 17 Mar 2009 19:46:00 +0000</pubDate><atom:updated>2009-03-17T15:51:02.612-04:00</atom:updated><title>PE + The Roots = Magic</title><description>&lt;div&gt;Can't wait to see these guys at the &lt;a href="http://www.billboard.com/bbcom/news/tv-on-the-radio-public-enemy-set-for-roots-1003951255.story" target="_blank"&gt;Roots Picnic&lt;/a&gt; at Festival Pier in June!&lt;/div&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://widgets.nbc.com/o/4727a250e66f9723/49bffe1b90349214/4727a2501a2a0f59/8f6fe4f2/widget.js"&gt;&lt;/script&gt;&lt;div style="font:10px arial;width:300px;margin-top:3px;"&gt;&lt;a href="http://www.nbc.com/Video/library/" target="_blank"&gt;Video Recaps&lt;/a&gt; | &lt;a href="http://www.nbc.com/Video/library/full-episodes/" target="_blank"&gt;Full Episodes&lt;/a&gt; | &lt;a href="http://www.nbc.com/Video/library/webisodes/" target="_blank"&gt;Webisodes&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-9032132976904370437?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=peSMz6Qr7AA:9baeD0diGkI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=peSMz6Qr7AA:9baeD0diGkI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=peSMz6Qr7AA:9baeD0diGkI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=peSMz6Qr7AA:9baeD0diGkI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=peSMz6Qr7AA:9baeD0diGkI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=peSMz6Qr7AA:9baeD0diGkI:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=peSMz6Qr7AA:9baeD0diGkI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=peSMz6Qr7AA:9baeD0diGkI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=peSMz6Qr7AA:9baeD0diGkI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=peSMz6Qr7AA:9baeD0diGkI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=peSMz6Qr7AA:9baeD0diGkI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/peSMz6Qr7AA/pe-w-roots-magic.html</link><author>noreply@blogger.com (Mike Bria)</author><thr:total>0</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/03/pe-w-roots-magic.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-8948437720131565236</guid><pubDate>Tue, 10 Mar 2009 22:25:00 +0000</pubDate><atom:updated>2009-03-10T18:51:33.284-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">thinking</category><category domain="http://www.blogger.com/atom/ns#">collaboration</category><category domain="http://www.blogger.com/atom/ns#">debugging</category><category domain="http://www.blogger.com/atom/ns#">pairing</category><title>Rubber Duck Debugging</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NtSvNsKtHLs/SbbrC6CF9mI/AAAAAAAAASE/PO0zloy4m64/s1600-h/rubber-duck-in-las-vegas.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 149px;" src="http://1.bp.blogspot.com/_NtSvNsKtHLs/SbbrC6CF9mI/AAAAAAAAASE/PO0zloy4m64/s200/rubber-duck-in-las-vegas.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5311691245700380258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From an &lt;a href="http://tinyurl.com/67l22s" target="_blank"&gt;ethernal.org discussion&lt;/a&gt;:&lt;blockquote&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;"We called it the Rubber Duck method of debugging.  It goes like this:&lt;br /&gt;&lt;br /&gt;1) Beg, borrow, steal, buy, fabricate or otherwise obtain a rubber duck (bathtub variety)&lt;br /&gt;2) Place rubber duck on desk and inform it you are just going to go over some code with it, if that's all right.&lt;br /&gt;3) Explain to the duck what you code is supposed to do, and then go into detail and explain things line by line&lt;br /&gt;4) At some point you will tell the duck what you are doing next and then realize that that is not in fact what you are actually  doing.  The duck will sit there serenely, happy in the knowledge that it has helped you on your way.&lt;br /&gt;&lt;br /&gt;Works every time.  Actually, if you don't have a rubber duck you could at a pinch ask a fellow programmer or engineer to sit in."&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;I must say, I do quite like this.  I must also say, THIS IS WHY WE PAIR!  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having (hell, &lt;i&gt;getting&lt;/i&gt;) to vet your thoughts out-loud, in real-time, with another person is a fundamental benefit of &lt;a href="http://aydsoftware.blogspot.com/search/label/pairing"&gt;pair programming&lt;/a&gt;, one of the primary reasons overall productivity is increased, not decreased.&lt;br /&gt;&lt;br /&gt;Forget asking "at a pinch", have him there all along!&lt;br /&gt;&lt;br /&gt;Thanks for pointing me to this Buffer, fun stuff!!!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-8948437720131565236?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UwvnnXEmOQ8:knman-Vq_Qg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UwvnnXEmOQ8:knman-Vq_Qg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UwvnnXEmOQ8:knman-Vq_Qg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=UwvnnXEmOQ8:knman-Vq_Qg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UwvnnXEmOQ8:knman-Vq_Qg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UwvnnXEmOQ8:knman-Vq_Qg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UwvnnXEmOQ8:knman-Vq_Qg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=UwvnnXEmOQ8:knman-Vq_Qg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UwvnnXEmOQ8:knman-Vq_Qg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=UwvnnXEmOQ8:knman-Vq_Qg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=UwvnnXEmOQ8:knman-Vq_Qg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/UwvnnXEmOQ8/rubber-duck-debugging.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_NtSvNsKtHLs/SbbrC6CF9mI/AAAAAAAAASE/PO0zloy4m64/s72-c/rubber-duck-in-las-vegas.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/03/rubber-duck-debugging.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-2920297939651076912</guid><pubDate>Tue, 03 Mar 2009 03:59:00 +0000</pubDate><atom:updated>2009-03-10T21:31:56.329-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">bug spray</category><category domain="http://www.blogger.com/atom/ns#">tdd</category><category domain="http://www.blogger.com/atom/ns#">design</category><category domain="http://www.blogger.com/atom/ns#">refactoring</category><category domain="http://www.blogger.com/atom/ns#">craftsmanship</category><title>Nutshells:  Why TDD?</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NtSvNsKtHLs/SaywU5BvK7I/AAAAAAAAARk/l5XLm89Xe08/s1600-h/bulbs.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 110px; height: 76px;" src="http://1.bp.blogspot.com/_NtSvNsKtHLs/SaywU5BvK7I/AAAAAAAAARk/l5XLm89Xe08/s400/bulbs.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5308811933714951090" /&gt;&lt;/a&gt;&lt;div&gt;So, ya need that techie-friendly quick-pick-list to explain to someone why your project simply cannot live another second without TDD? I know I did, so I created one.  And I'd like to share it with you faithful readers.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;Confidence &amp;amp; Productivity&lt;/b&gt; … &lt;i&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Today&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Immediate feedback, ie. "cookies":  Green bars that give me full confidence in what I’m coding, or in other words, meeting requirements with decreased bugs&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A more efficient design:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Clear “expectations” (tests) drive my mind quickly and smoothly to solutions (algorithms)&lt;/li&gt;&lt;li&gt;Good public interfaces – my tests make me “eat my own dog food”&lt;/li&gt;&lt;li&gt;Simplicity – I’ve coded only what was needed to pass the tests&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;A more effective design:  in order to write software that is effectively tested in this manner, I’m naturally encouraged to ultimately write more cohesive and less coupled code&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Test “protection”:  “my tests” give me freedom to refactor mercilessly to create a more expressive, readable code-base while I’m coding&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;And then even more Test “protection”:  “all the tests” allow the build to silently ensure that today’s collective changes across the group haven’t broken any windows&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Confidence &amp;amp; Productivity … &lt;i&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Tomorrow&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;ul&gt;&lt;li&gt;Fact: addressing yesterday's bugs exponentially decreases today's productivity...unless:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;yesterday 's TDD decreases (if not nearly altogether removes) yesterday's bugs &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Fact: most bugs occur upon changing an existing code-base...unless:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Today’s [automated] tests become your safety net tomorrow&lt;/li&gt;&lt;li&gt;Growing test suite allows build to be the perpetual “silent police” &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Fact: easy to understand my design; hard to understand your design...unless:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Today’s [expectation-based] tests become your documentation tomorrow&lt;/li&gt;&lt;li&gt;My expressive code is easy for you to understand tomorrow &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Fact: “code rot” (poorly factored code) slows development over time...but:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;My tests force me to keep my design well-factored – forever! &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Fact: “paper documentation” gets outdated (and lies!) over time...in contrast to:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Automated Storytests: up-to-date, runnable “what it does” documentation (analysis)&lt;/li&gt;&lt;li&gt;Automated Microtests: up-to-date, runnable “how it does it” documentation (design)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, I'm not perfect, and feedback is king.  So, please, pretty please with sugar on top, let me know how you think this list can be improved! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-2920297939651076912?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=-td4i7VQxjA:XfoKHX0OTos:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=-td4i7VQxjA:XfoKHX0OTos:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=-td4i7VQxjA:XfoKHX0OTos:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=-td4i7VQxjA:XfoKHX0OTos:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=-td4i7VQxjA:XfoKHX0OTos:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=-td4i7VQxjA:XfoKHX0OTos:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=-td4i7VQxjA:XfoKHX0OTos:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=-td4i7VQxjA:XfoKHX0OTos:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=-td4i7VQxjA:XfoKHX0OTos:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=-td4i7VQxjA:XfoKHX0OTos:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=-td4i7VQxjA:XfoKHX0OTos:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/-td4i7VQxjA/nutshells-why-tdd.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_NtSvNsKtHLs/SaywU5BvK7I/AAAAAAAAARk/l5XLm89Xe08/s72-c/bulbs.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/03/nutshells-why-tdd.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-5372031085678683046</guid><pubDate>Fri, 13 Feb 2009 15:33:00 +0000</pubDate><atom:updated>2009-03-25T23:56:23.685-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">teamwork</category><category domain="http://www.blogger.com/atom/ns#">corporate culture</category><title>Wringing Necks</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NtSvNsKtHLs/SZWgh7pQDeI/AAAAAAAAARM/hdcegRNYUpc/s1600-h/choking_chiken.jpg" target="_blank"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_NtSvNsKtHLs/SZWgh7pQDeI/AAAAAAAAARM/hdcegRNYUpc/s200/choking_chiken.jpg" alt="" id="BLOGGER_PHOTO_ID_5302320641105464802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Re: Title.  Sorry, its Friday the 13th, couldn't resist!&lt;br /&gt;&lt;br /&gt;Anyhoo...I was checking out &lt;a href="http://www.infoq.com/news/2009/02/product-owner-one-person" target="_blank"&gt;this InfoQ post&lt;/a&gt; which asks the question of whether you need a single person as your "Product Owner" or it can be many. I have my opinions about the answer to that particular question, but I'll save that for another post. It's the undercurrent of that question I want to discuss now.&lt;br /&gt;&lt;br /&gt;"One neck to wring". "One throat to choke." I've heard this and similar statements for years in reference to Product Owners (in Scrum terms that is; in XP, we may say Customer).  In other words, there are people who make the statement that part of the Product Owner's role is to be the "one throat to choke", the "one neck to wring".&lt;br /&gt;&lt;br /&gt;My take on this is similar to my feeling on the &lt;a href="http://aydsoftware.blogspot.com/2009/01/dont-like-green-eggs-ham.html" target="_blank"&gt;"Chickens &amp;amp; Pigs"&lt;/a&gt; thing:  me don't like it, and here's a quick run-through of why.&lt;br /&gt;&lt;br /&gt;This euphemism, at its heart, is a statement of &lt;span style="font-weight: bold; font-style: italic;"&gt;accountability&lt;/span&gt;.  It basically implies that the Product Owner is accountable for the outcome of your agile project, for its successes and/or for its failures.  Beh, hogwash.&lt;br /&gt;&lt;br /&gt;Let's backtrack a tad (just can't help myself ;-).  I'm a believer that there exists at least these two primary degrees of agile teams:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Agile Team v1.0&lt;/span&gt;:  practices have been installed and people are following their agile methods generally as the book tells them.  They are following the mechanics, that is, but that's all.  What's missing?  Well, a &lt;span style="font-style: italic;"&gt;real &lt;span style="font-weight: bold;"&gt;team&lt;/span&gt;&lt;/span&gt;. Agile Team 1.0 may not be a bad thing, it's likely to be a much better thing than to have no agile at all, but it's not the hyper-productive thing your executives were clamoring for.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Agile Team v2.0&lt;/span&gt;:  as with v1.0, the team is following the practices, but this team is a &lt;span style="font-style: italic;"&gt;real&lt;/span&gt; &lt;span style="font-style: italic; font-weight: bold;"&gt;team&lt;/span&gt;.  In other words, the team is truly "self-organizing" and empowered.  This team understands and manages the interpersonal aspects of good teamwork. This team truly understands that at root of success are &lt;span style="font-style: italic;"&gt;people&lt;/span&gt;, and the interactions between them.   &lt;span style="font-style: italic;"&gt;This&lt;/span&gt; is the team that execs bought into [noun] "Agile" for; this team kicks ass.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Said another way, in &lt;a href="http://www.thepracticeofleadership.net/2007/03/21/book-review-the-five-dysfunctions-of-a-team/" target="_blank"&gt;Lencioni&lt;/a&gt; terms,  the members of Agile Team 2.0 trust one another, engage in unfiltered conflict around ideas, commit to decisions and plans of actions, hold one another accountable for acting on those decisions, and focus on the achievement of collective results.  Agile Team 1.0, on the other hand, does not do all of this.&lt;br /&gt;&lt;br /&gt;Highlight:  "...hold one another accountable...".  There ya have it, Agile Team 2.0 is a team that &lt;span style="font-style: italic;"&gt;shares&lt;/span&gt; its 'Accountability'.  Each member is accountable;  the developers, the testers, the CM folks, etc..., and finally, yes, the Product Owner (Customer) too.  No "one neck", no "one throat", &lt;span style="font-weight: bold;"&gt;everyone&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Bottom line, if any one person holds the accountability for success/failure on your agile project, particularly if that one person is your Product Owner, you've got more to learn about how to be [adjective] agile, about how to be a &lt;span style="font-style: italic;"&gt;team&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The good news is that you're not the best you can be, you've got room for some big improvement, how lucky!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-5372031085678683046?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=fLWnOX21vrY:z2yMv-IY_as:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=fLWnOX21vrY:z2yMv-IY_as:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=fLWnOX21vrY:z2yMv-IY_as:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=fLWnOX21vrY:z2yMv-IY_as:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=fLWnOX21vrY:z2yMv-IY_as:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=fLWnOX21vrY:z2yMv-IY_as:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=fLWnOX21vrY:z2yMv-IY_as:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=fLWnOX21vrY:z2yMv-IY_as:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=fLWnOX21vrY:z2yMv-IY_as:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=fLWnOX21vrY:z2yMv-IY_as:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=fLWnOX21vrY:z2yMv-IY_as:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/fLWnOX21vrY/wringing-necks.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_NtSvNsKtHLs/SZWgh7pQDeI/AAAAAAAAARM/hdcegRNYUpc/s72-c/choking_chiken.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/02/wringing-necks.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-7196459789710522258</guid><pubDate>Fri, 13 Feb 2009 02:37:00 +0000</pubDate><atom:updated>2009-02-17T12:44:12.345-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">code tips java</category><title>{"X} + {"Y"} = {"X", "Y"}</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NtSvNsKtHLs/SZTg5PJF21I/AAAAAAAAARE/KbNYZKJg6LI/s1600-h/code.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 133px;" src="http://4.bp.blogspot.com/_NtSvNsKtHLs/SZTg5PJF21I/AAAAAAAAARE/KbNYZKJg6LI/s200/code.jpg" alt="" id="BLOGGER_PHOTO_ID_5302109935243746130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Adding 2 Java arrays in 4 lines.&lt;br /&gt;&lt;br /&gt;First, and foremost, do your damndest to avoid the use of primitives.  If you're in the 21st century anyway, we have higher level languages and those languages have objects and, hot damn, let you &lt;span style="font-style: italic;"&gt;make&lt;/span&gt; objects - so use them!!!&lt;br /&gt;&lt;br /&gt;Be assured you'll hear more from me on that front for a long time to come. Anyhoo though...&lt;br /&gt;&lt;br /&gt;This quick post is about when you, for one legit reason or another, do have to work with primitive Java arrays.  As in "String[]" array, not "ArrayList&amp;lt;String&amp;gt;".&lt;br /&gt;&lt;br /&gt;Today, Gil and I had to and were quite miffed to find there was no easy built in way to combine to existing arrays.  Once the disgust was gone enough to type again, we coded a little utility to do it.&lt;br /&gt;&lt;br /&gt;So, here's what we ended up with:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;public static String[] arrayAdd(String[] one, String[] two) {&lt;br /&gt; String[] newArray = new String[one.length + two.length];&lt;br /&gt; System.arraycopy(one, 0, newArray, 0, one.length);&lt;br /&gt; System.arraycopy(two, 0, newArray, one.length, two.length);&lt;br /&gt; return newArray;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Do note please that this creates a third array which is thus returned (as opposed to actually changing the state of either one of the input arrays).&lt;br /&gt;&lt;br /&gt;If you've got better suggestions (libraries, whatever),  shout em out.  Otherwise, enjoy.&lt;br /&gt;&lt;br /&gt;And, yes, of course, we &lt;span style="font-style: italic;"&gt;do&lt;/span&gt; have a test for that!&lt;br /&gt;&lt;br /&gt;ps// can't help it.  To reassert my initial point, "resist your primitive obsession", using a List (object), of course, you get:&lt;pre name="code" class="Java"&gt;public static List&amp;lt;String&amp;gt; listAdd(List&amp;lt;String&amp;gt; one, List&amp;lt;String&amp;gt; two) {&lt;br /&gt; List&amp;lt;String&amp;gt; newList = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt; newList.addAll(one);&lt;br /&gt; newList.addAll(two);&lt;br /&gt; return newList;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;..and then of course if you don't want a new collection instance:&lt;pre name="code" class="Java"&gt;&lt;br /&gt; one.addAll(two);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-7196459789710522258?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=sLlRzp5nKhU:wp3FMzupHW4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=sLlRzp5nKhU:wp3FMzupHW4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=sLlRzp5nKhU:wp3FMzupHW4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=sLlRzp5nKhU:wp3FMzupHW4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=sLlRzp5nKhU:wp3FMzupHW4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=sLlRzp5nKhU:wp3FMzupHW4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=sLlRzp5nKhU:wp3FMzupHW4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=sLlRzp5nKhU:wp3FMzupHW4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=sLlRzp5nKhU:wp3FMzupHW4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=sLlRzp5nKhU:wp3FMzupHW4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=sLlRzp5nKhU:wp3FMzupHW4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/sLlRzp5nKhU/x-y-x-y-adding-java-arrays.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_NtSvNsKtHLs/SZTg5PJF21I/AAAAAAAAARE/KbNYZKJg6LI/s72-c/code.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/02/x-y-x-y-adding-java-arrays.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-8198337658981248344</guid><pubDate>Wed, 04 Feb 2009 02:06:00 +0000</pubDate><atom:updated>2009-02-04T15:58:35.424-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">teamwork</category><category domain="http://www.blogger.com/atom/ns#">collaboration</category><category domain="http://www.blogger.com/atom/ns#">pairing</category><title>Mi Code-ah, Su Code-ah</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NtSvNsKtHLs/SYj3NqhZmsI/AAAAAAAAAQ8/WlzB-Nh3ccs/s1600-h/collecive_ownership.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 149px;" src="http://2.bp.blogspot.com/_NtSvNsKtHLs/SYj3NqhZmsI/AAAAAAAAAQ8/WlzB-Nh3ccs/s200/collecive_ownership.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5298756775726127810" /&gt;&lt;/a&gt;&lt;br /&gt;In one sentence, what does 'Collective Code Ownership' (CoCO) mean?&lt;br /&gt;&lt;br /&gt;In the words of Kent Beck, it means "Anyone can change anything anytime".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Said another way:  There ain't no such thing as 'My code, your code'.  Them there is bad words, mi amigo.&lt;br /&gt;&lt;br /&gt;And then, in many more sentences...&lt;br /&gt;&lt;br /&gt;How many times have you been routed a defect that came out of your team but you had no idea how to address it because you "didn't code that part"? How many times have you been unable to take on a story because "Jerry's the only one who knows the business logic"? How many times have you been unable to proceed until you got approval from the person who "knows that code"? How many times have you had to leave a story on the shelf because the person who "owns that code" got wolfed for a few days (or "hit by a bus")? I could ask these questions forever but I'll stop there, I expect you get the point.&lt;br /&gt;&lt;br /&gt;Thus, as one of the main practices that stems from the value of Collaboration, &lt;span style="font-style: italic;"&gt;Collective Code Ownership&lt;/span&gt; aims to break those recurring enemies of productivity. It says that, certainly within at least a team, everyone owns all the code. Furthermore, everyone is free to...scratch that, everyone is &lt;span style="font-weight: bold;"&gt;responsible&lt;/span&gt; to be equipped to effectively make updates to absolutely whatever code their story takes them to -- without feeling like an intruder and without having to get "permission" or any non-casual advice from your so-called "expert" or "owner". From a more measurable POV, CoCO states that everyone on the team (developer-wise) must be able to describe the design of anything the team is working on in no more than 5 minutes.&lt;br /&gt;&lt;br /&gt;So, why possibly might this not always happen? Well, I see at least a few reasons.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First, it requires a very high level of collaboration and trust within a team, something that, unfortunately, isn't necessarily present "We've gone Agile! Day 1".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Second, it might not absolutely require it, but a test-covered, well-factored, and expressive code base goes a very, very, very, very, very long way to making this work.  Ok, I lied, it is required.  And again, this is something that for many new teams is simply not the situation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Third, in many cases, particularly on bigger enterprise-y projects, it simply takes a good amount of work and an investment in time (which, of course, is money) to make this happen.  Alas, to much dismay, its an investment that often ends up taking a back seat to  "hittin' that next deadline".&lt;/li&gt;&lt;/ul&gt;And lastly, it takes &lt;span style="font-weight: bold;"&gt;courage.&lt;/span&gt;  It takes being comfortable with stepping out of your "comfort zones" (pun intended) every now and again. It requires shifting your self-image from "I'm good at working on &lt;span style="font-style: italic;"&gt;this&lt;/span&gt; code" to "I'm good at working on &lt;span style="font-style: italic;"&gt;code&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Heck, isn't that why you became a programmer in the first place?  You didn't start your days banging on the keyboard dreaming of being "the dude who knows the billing system inside &amp;amp; out", or "the keeper of the logging framework", or "the Hibernate guy" did ya?  You loved code, programming, creating things, bringing new stuff to life, a real Doc Frankencoder.  Tap back into that, set the inner geek free, you'll be happier for it.&lt;br /&gt;&lt;br /&gt;And, you're in luck, the benefits do not stop there.&lt;br /&gt;&lt;br /&gt;At a team level, having a collective code ownership implies more freedom to have people pick up the most important stories or tasks, independent of what part of the app they may affect.  It allows you to focus more people on the next story, to have the team bum-rush it, get it started then completed quickly before moving onto the next most important story, which in the end is a better way to run your iteration than to "multi-thread" many concurrent stories.&lt;br /&gt;&lt;br /&gt;Does this mean that your team will religiously have &lt;span class="Apple-style-span" style="font-style: italic;"&gt;everyone&lt;/span&gt; working on &lt;span class="Apple-style-span" style="font-style: italic;"&gt;everything, &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;everyday&lt;span class="Apple-style-span" style="font-style: normal;"&gt;?&lt;/span&gt;&lt;/span&gt;  Course not, even if that did make sense, it ain't physically possible (in this dimension).  But it does mean that you should switch up pairs periodically (preferably at least daily), and share a story's tasks amongst your pairs. Have pairs face each other and be in earshot, rather than nestled off in their own cubbies and corners.  Have team design pow-wows around the whiteboard and code reviews around the projector every couple days. Use your wall-space to document decisions and debate working designs.  Collectively own the problems, collectively own the decisions, collectively own the code.&lt;br /&gt;&lt;br /&gt;And at an organizational level, Collective Code Ownership allows your teams to grow in a way that keeps up with the way your product matures.  Many applications will start their life having intense development needs in each of its various components, and logically teams will form around these components.  This may work initially (or it may not), but it comes with a natural tendency for silos of knowledge to form around the components, which will become problematic and counter-productive as the product matures and the user's needs shift away from "component-based enhancements" and more towards "application workflows" that span multiple components.&lt;br /&gt;&lt;br /&gt;So, yes that's right, I'm saying that Collective Code Ownership in fact goes beyond "your team"; it applies as well to "your organization".   Do the same rules apply as within the team?  "Everyone codes everything everyday", "pair with everyone", "describe the design in 5 minutes", etc?  No, it doesn't necessarily mean that.  But it does mean that you should initiate mechanisms for people to periodically get a glimpse into what other teams are working on, both functionally and technically.  It does mean that you might need to let your teams re-assemble now and again to spread knowledge and prevent yicky silos. &lt;br /&gt;&lt;br /&gt;And finally, most importantly and most simply, whether "your team" or not&lt;span class="Apple-style-span" style="font-style: italic;"&gt;, Collective Code Ownership&lt;/span&gt;, more than anything, is a state-of-mind:  if you need to change some code, then damn it,  its yours to change - and that's all good!&lt;br /&gt;&lt;br /&gt;* Check out also what we IXP'ers say officially about "&lt;a href="http://industrialxp.org/collectiveOwnership.html" target="_blank" title="IXP: Collective Ownership"&gt;Collective Ownership&lt;/a&gt;".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-8198337658981248344?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=nasLVHPceKg:iHCmkW1pARQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=nasLVHPceKg:iHCmkW1pARQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=nasLVHPceKg:iHCmkW1pARQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=nasLVHPceKg:iHCmkW1pARQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=nasLVHPceKg:iHCmkW1pARQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=nasLVHPceKg:iHCmkW1pARQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=nasLVHPceKg:iHCmkW1pARQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=nasLVHPceKg:iHCmkW1pARQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=nasLVHPceKg:iHCmkW1pARQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=nasLVHPceKg:iHCmkW1pARQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=nasLVHPceKg:iHCmkW1pARQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/nasLVHPceKg/collective-code-ownership.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_NtSvNsKtHLs/SYj3NqhZmsI/AAAAAAAAAQ8/WlzB-Nh3ccs/s72-c/collecive_ownership.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/02/collective-code-ownership.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-6107809252371838221</guid><pubDate>Tue, 27 Jan 2009 00:53:00 +0000</pubDate><atom:updated>2009-02-02T00:05:39.433-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">planning</category><title>Burning-Down the house</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NtSvNsKtHLs/SX5dSIgug-I/AAAAAAAAAQU/ESnn2KAnTus/s1600-h/burning+house.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 146px; height: 84px;" src="http://3.bp.blogspot.com/_NtSvNsKtHLs/SX5dSIgug-I/AAAAAAAAAQU/ESnn2KAnTus/s400/burning+house.jpg" alt="" id="BLOGGER_PHOTO_ID_5295772777938060258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A (the?) primary essence of agile is to focus on delivering value-adding functionality as often as possible. Value-adding, that is, from the point of view of your consumer.&lt;br /&gt;&lt;br /&gt;[Quick aside: we most often think of this in terms of value-adding 'application software', but certainly not by rule - it is whatever it is that is of value to your consumer. If you don't have a consumer, or if you aren't bringing value, then why are you spending time on it? Anyway...]&lt;br /&gt;&lt;br /&gt;The implication of this is that many tasks we perform, while in most instances are in fact (hopefully) necessary, do not in and of themselves provide any real 'customer' value. In software terms, for example, this means that while "analysis" or "coding" or "testing" activities might in fact be necessary, they are not what our consumer/customer seeks…it is "a working feature" only that truly provides the &lt;span style="font-weight: bold;"&gt;value&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Let's bring into the discussion that holy agile grail we call a "story" (a symbol/moniker for a value-adding feature) - it is assumed that all the tasks that have to occur to deliver a story will occur, but alas, we simply should not be giving or getting any cookies for completing these tasks. We get cookies only for delivering [running, tested] features; we get cookies for &lt;span style="font-style: italic;"&gt;delivering value&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;More to the point of where I'm going with this, its not really to any benefit then to explicitly track these tasks (ie, track, meaning in your reports, "backlog" if that's a tool of yours, or things similar).  Why?  Well, primarily, simply because it is the story (feature) we strive to deliver, not necessarily analysis or code, etc.&lt;br /&gt;&lt;br /&gt;(Taking a bit of a tangent here, but its an important one...) "Deliver value &lt;span style="font-weight: bold;"&gt;as&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;often as possible&lt;/span&gt;".  The further implication here is that we also strive to break the feature up into smaller and smaller pieces (stories); the smaller, the quicker it can be delivered, eh?  And, further, the smaller the more likely to have an accurate estimate; the easier to design in an evolutionary way; the easier to test; etc. But in the end, with respect to our "stories", no matter how small we split, we do not split by tasks - each split in and of itself must still provide some sort of demonstrable value.  Anyhoo...&lt;br /&gt;&lt;br /&gt;"So Mike," you say, "where in the world are you going with all this?!?!".  Great question, here it is:  (MBark of this post) Do away with your "burndown charts".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NtSvNsKtHLs/SX5pmzxrwnI/AAAAAAAAAQc/FFeVHN32SaE/s1600-h/DailyBurndown.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 321px; height: 233px;" src="http://3.bp.blogspot.com/_NtSvNsKtHLs/SX5pmzxrwnI/AAAAAAAAAQc/FFeVHN32SaE/s400/DailyBurndown.jpg" alt="" id="BLOGGER_PHOTO_ID_5295786327288824434" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The sprint "burndown" [pictured left], at least as prescribed by Scrum, is tracking tasks. Being we like not to focus on tasks, and being we only get cookies for completed stories, doesn't a burndown focus us on the wrong thing?  Yes, it does.  Bad burndown, bad.  In addition to focusing us on the &lt;span style="font-style: italic;"&gt;wrong&lt;/span&gt; things, it burdens us to worry about &lt;span style="font-style: italic;"&gt; too many things; &lt;/span&gt;to, in many ways, encourage us to micro-manage (which, of course, is not good for anybody and very un-agile). If you need more,  how about the fact that it can lead quite readily to false-negatives with respect to how "done" you really are:  "great, Bob, you've got task x, y, and z's hours all used up, sweet!"...but, uh, what the heck does that really mean with respect to the status of obtaining your real goal (delivering the feature)?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NtSvNsKtHLs/SX5qKOpfaFI/AAAAAAAAAQk/dJdZf-_iTvI/s1600-h/burnup.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 321px; height: 219px;" src="http://4.bp.blogspot.com/_NtSvNsKtHLs/SX5qKOpfaFI/AAAAAAAAAQk/dJdZf-_iTvI/s400/burnup.jpg" alt="" id="BLOGGER_PHOTO_ID_5295786935797639250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Thus, a "burnup" [pictured right].  A burnup tracks only features (whatever that might mean in your context); the features represented by stories, each assigned a point value to indicate size. When a story is complete (a feature is "done"), the burn goes "up" by that feature's points. No hours, no tasks, no minutiae about various random "inputs" - rather, just a simple representation of what we really care about - features being &lt;span style="font-weight: bold;"&gt;output&lt;/span&gt;.  Easy-peasy, and way more in line with our goals.  And, of course, as far as contributing as a tool to help us determine our velocity:  if we really need to measure anything, what we really want to be measuring is our rate of delivering working software, not our rate of "doing analysis", right?&lt;br /&gt;&lt;br /&gt;Be not mistaken by my message, it's not to say you and your team won't have daily knowledge of what particular tasks might be going on, I sure as hooha hope you do!  It's just that we don't go so far as to officially track or measure them. That's what your daily stand-up is for. And, of course, common sense is required, if you really want them to be visible, fantastic (I mean it) - go ahead and hang up some task stickies on your Storyboard or some other "information radiator" hanging in your team room.&lt;br /&gt;&lt;br /&gt;But, alas, my spidey-sense says: unless you're hoping to burn down your project, steer clear of the Burndown chart.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-6107809252371838221?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=ja7Tk7cy5iU:10z3B4IQqtQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=ja7Tk7cy5iU:10z3B4IQqtQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=ja7Tk7cy5iU:10z3B4IQqtQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=ja7Tk7cy5iU:10z3B4IQqtQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=ja7Tk7cy5iU:10z3B4IQqtQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=ja7Tk7cy5iU:10z3B4IQqtQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=ja7Tk7cy5iU:10z3B4IQqtQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=ja7Tk7cy5iU:10z3B4IQqtQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=ja7Tk7cy5iU:10z3B4IQqtQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=ja7Tk7cy5iU:10z3B4IQqtQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=ja7Tk7cy5iU:10z3B4IQqtQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/ja7Tk7cy5iU/burning-down-house.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_NtSvNsKtHLs/SX5dSIgug-I/AAAAAAAAAQU/ESnn2KAnTus/s72-c/burning+house.jpg" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/01/burning-down-house.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-3340232291378941417</guid><pubDate>Sat, 17 Jan 2009 22:09:00 +0000</pubDate><atom:updated>2009-01-21T16:25:10.558-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">teamwork</category><category domain="http://www.blogger.com/atom/ns#">corporate culture</category><title>Don't like Green Eggs &amp; Ham</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NtSvNsKtHLs/SXJodA7IejI/AAAAAAAAAQM/898_S1EECBk/s1600-h/green_eggs_ham"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 206px; height: 250px;" src="http://1.bp.blogspot.com/_NtSvNsKtHLs/SXJodA7IejI/AAAAAAAAAQM/898_S1EECBk/s400/green_eggs_ham" alt="" id="BLOGGER_PHOTO_ID_5292407359787268658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;...I do not like them Sam-I-Am.  No, not on a house, nor not with a mouse.  Not even from my mum, and certainly not with my Scrum.&lt;br /&gt;&lt;br /&gt;Eggs &amp;amp; Ham.  Or, as the old adage goes:  "Chicken &amp;amp; Pigs". Just in case you're not familiar, it's a euphemism started by Ken &amp;amp; Mike in the early days of Scrum.  Story goes as so:&lt;br /&gt;&lt;br /&gt;Chicken:  Let's start a restaurant!&lt;br /&gt;Pig: What would we call it?&lt;br /&gt;Chicken:  Ham n' Eggs!&lt;br /&gt;Pig:  No thanks. I'd be committed, but you'd only be involved!&lt;br /&gt;&lt;br /&gt;Basically, the jist is to say that certain people are committed to the project and accountable for its deliverables, whereas other people are not.  Further, its advised by Scrum that during the daily Stand-up (or "daily Scrum") only pigs are allowed to speak, chickens can listen in but can't speak.  There's more to it, but we'll get to that.&lt;br /&gt;&lt;br /&gt;While I understand, and even support, the intention of this - I really despise it. Why?  Well, we'll get to that too.  Read on.&lt;br /&gt;&lt;br /&gt;One (admittedly decent) intention of this is to help encourage a "team empowerment" culture - "We, the team, are in control of our destiny, we call our own shots, we succeed and fail by our own hands".  In the simplistic sense, the team are not just workers bees taking direction at every turn from their superiors, but rather they are a self-managed group needing to be dictated nothing but a goal.  In other words, undo the "command and control" management structure, and replace with an "empower and support" environment.&lt;br /&gt;&lt;br /&gt;The other main intention, as I understand it, was to help keep the team (pigs) from getting pulled off task into some worthless administrative meeting or unrelated task by someone outside the team (a chicken).  Also a good intention, but let's focus for now on the first mentioned above.&lt;br /&gt;&lt;br /&gt;Unfortunately, what commonly happens in many instances is that the team sees themselves as the "pig" and all of management as their "chickens".  The team "goes scrum" and all of sudden Chicken/Pig cards are flying left and right.  "You can't speak at our stand-up!"..."You can't come to our retrospective!"..."You can't tell us how to organize our cards!" ..."You can't... go away... you can't...leave us alone...you can't you can't you can't...".  Essentially, the team tells their managers to take a hike.&lt;br /&gt;&lt;br /&gt;Now, while a renegade team shunning their manager may in the luckiest cases represent an improvement over a &lt;span style="font-style: italic;"&gt;Command and Control,&lt;/span&gt; it's a far cry from what we mean by &lt;span style="font-style: italic;"&gt;Empower and Support&lt;/span&gt;.  In a nutshell , a "chickens &amp;amp; pigs" attitude ultimately begets nothing more than an "Us versus Them" culture.  Uggg. What we really want is simply an "Us" culture, no "Them".  Remember "People &amp;amp; Interactions"?&lt;br /&gt;&lt;br /&gt;That's my bottom line, that's why I think that "chicken &amp;amp; pigs" does way more damage than it does any good.  I'm certainly not the first one to say this by any means, its said again and again.  But yet I still see it over and over.  The organizations I find that are most likely to adopt "Scrum" (over say for example XP) often tend to be the ones that are already drowning in bureaucracy, red tape, a trust-less culture, an "Us vs Them" environment, a Command and Control world.  They are the ones that need more than anything a way to, yes, put the power into the hands of the "do'ers", but moreso to do so in the midst of breaking down the bureaucracy; to do so by making the managers just as important as collaborators and SUPPORTERS.&lt;br /&gt;&lt;br /&gt;Not by making them "them", but rather by amplifying their importance as people who enable the team to be empowered and successful.  By being fully plugged in so that they can know best how and when to help out.  Yes, its a fine line to be plugged in so that they can "support" rather than so that they can "direct", buts a crucial line to manage well.&lt;br /&gt;&lt;br /&gt;I had a few beers last week with a couple of my buddies from my old stomping ground, the company where I grew my agile wings.  No doubt, tons of fantastic things happening there, still, years after Scrum first "came down from the mountain".  It's a wonderful example of how "big agile" can and does work (granted, it ain't easy, but nothing good is). But lingering subtly between their words, I could still sense that one thing that still exists even there:  when things get tough, in too many people's eyes, the managers are "them" and the teams are "us".  Everything that goes wrong was a result of something that the "they's" of the place did or decided.&lt;br /&gt;&lt;br /&gt;I can't decide what's worse about that story:  that in many instances this is nothing more than "impression" over "reality"...or that much of what is "reality" is largely a result of the fact that there &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; still somewhat of a divide between "chickens &amp;amp; pigs" there.  What I mean by this second option is that a lot of the failure-resulting decisions made and processes instituted by the "they's" could be avoided if they weren't making these decisions in a bubble, without the "us'es".  Either way, it truly breaks my heart.&lt;br /&gt;&lt;br /&gt;So, do I place all the blame on the fact that they (we) were taught "chickens &amp;amp; pigs" by Ken?  Is it totally the simple euphemism's fault?  No, of course not.  But do I think it contributed to the problem?  Yes, I do.   In fact I think it made a big difference.  At the very least I can say confidently that it certainly didn't do anything to help fix the problem.&lt;br /&gt;&lt;br /&gt;So, I guess whether you think I'm full of it or not comes down to this classic question:  what's in a word?  Or in this case, a few words.  I think a lot.&lt;br /&gt;&lt;br /&gt;I do believe in the &lt;a href="http://en.wikipedia.org/wiki/Butterfly_effect" target="_blank"&gt;Butterfly Effect&lt;/a&gt; - often it is one little tiny thing that happens, or one little tiny phrase that is used, that totally changes the direction life takes.  Or if you don't buy that, think of taking a "chickens &amp;amp; pigs" approach as  &lt;a href="http://en.wikipedia.org/wiki/Fixing_Broken_Windows" target="_blank"&gt;breaking your first window&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And as a result, I do believe that if rather than teaching new teams about "chickens &amp;amp; pigs", those 30 minutes are spent introducing them to &lt;span style="font-style: italic;"&gt;effective&lt;/span&gt; "Empower &amp;amp; Support", the world could be a much better place.  Even better, heck with just "30 minutes" and "teams" - take an entire day and include your damn chickens.&lt;br /&gt;&lt;br /&gt;And, of course, for the conference room breakfast buffet, pass on the swine and scrambleds, serve up some fresh fruit and waffles!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-3340232291378941417?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=HwUoPv5UdWo:E61XmyLeXzQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=HwUoPv5UdWo:E61XmyLeXzQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=HwUoPv5UdWo:E61XmyLeXzQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=HwUoPv5UdWo:E61XmyLeXzQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=HwUoPv5UdWo:E61XmyLeXzQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=HwUoPv5UdWo:E61XmyLeXzQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=HwUoPv5UdWo:E61XmyLeXzQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=HwUoPv5UdWo:E61XmyLeXzQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=HwUoPv5UdWo:E61XmyLeXzQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=HwUoPv5UdWo:E61XmyLeXzQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=HwUoPv5UdWo:E61XmyLeXzQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/HwUoPv5UdWo/dont-like-green-eggs-ham.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_NtSvNsKtHLs/SXJodA7IejI/AAAAAAAAAQM/898_S1EECBk/s72-c/green_eggs_ham" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/01/dont-like-green-eggs-ham.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-4263568384468951834</guid><pubDate>Mon, 12 Jan 2009 00:28:00 +0000</pubDate><atom:updated>2009-06-23T10:32:48.187-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">pairing</category><title>Riddle Me This, Mr Pair Programmer</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NtSvNsKtHLs/SWqUeP6E9HI/AAAAAAAAAQA/oQU7CC-M6NU/s1600-h/riddler_small.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 124px; height: 115px;" src="http://1.bp.blogspot.com/_NtSvNsKtHLs/SWqUeP6E9HI/AAAAAAAAAQA/oQU7CC-M6NU/s400/riddler_small.jpg" alt="" id="BLOGGER_PHOTO_ID_5290203959687181426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"So, my programmers were &lt;a href="http://aydsoftware.blogspot.com/2008/12/why-do-pears-fall-in-love.html"&gt;pairing&lt;/a&gt;; one was on the middle-tier stuff, the other on the UI layer. Things didn't seem too efficient to us. What's up?"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Two people working on different "pieces" of the same story, even if simultaneously, is not "pair programming" - this is plain old fashioned delegation. In fact, this often decreases overall productivity, due to the fact (one of many) that putting the pieces together often exposes mismatching interfaces requiring varying degrees of rework.&lt;br /&gt;&lt;br /&gt;"Pair programming" means two people working together, side by side, on the same exact piece of code - two people &lt;span style="font-style: italic;"&gt;thinking&lt;/span&gt; and talking together, one person [happens to be] typing. Furthermore, 'one person typing, one person watching' is also not "pair programming"; the key to pairing is two people thinking as one...two people &lt;span style="font-style: italic;"&gt;collaborating&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"How to best go about selection of pairs?&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Pairs should typically not be assigned, they should be formed naturally on their own. [But, see the next question for more info]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"I suspect that some pairs, for example two junior programmers, might be less effective and thus decrease productivity and code quality. Is this true?"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Yes, technically there is some truth to this... at least at the beginning. Part of the point of pairing is to help share skills and knowledge, so it may help to match up more skilled with less skilled.&lt;br /&gt;&lt;br /&gt;BUT, much more true when you start pairing as a team, not so much once you've been at it for a little while. Once everyone is of relatively equal understanding (of the practices at least) everyone should pair with everyone. The only requirement is that the two people get along from a personal POV (and if they don't, maybe they shouldn't be on the same team anyway?). Within reason, the more "movement" the better.  @see &lt;a href="http://odeo.com/episodes/22032035-Arlo-Belshee-Agile-2005-Promiscuous-Pairing-and-the-Least-Qualified-Impementer"&gt;Promiscuous Pairing&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Also, something else to chew on.  Having "preset/preference" pairs actually works a bit against the desired outcome - the essence of PP is having "two heads" working on one problem, in sort of a checks &amp;amp; balances way; the longer 2 people work together, the more they become "one head", which in large part works against the goal ("&lt;span style="font-style: italic;"&gt;two&lt;/span&gt; heads collaborating").&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"Do we need a certain minimum level of skill across the team before taking on pair programming?"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Absolutely not. Getting to a shared higher "level of skill across the team" is an &lt;span style="font-style: italic;"&gt;outcome&lt;/span&gt; of PP (not a prereq).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"Is there a way to verify the quality of a pair that is not that experienced?"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;The team should simply pay attention and use common sense.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"Is PP appropriate for some tasks and not others? Aren't small complexity activities not worth pairing on, since it just delays them?"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;No.&lt;br /&gt;&lt;br /&gt;First, on a slight tangent, part of our goal as craftsman in general is to make all tasks "small complexity", ie. simple - small stories and evolutionary design exist in large part to virtually eliminate "large complexity" altogether. When everything feels like a "toy example", then we've succeeded.&lt;br /&gt;&lt;br /&gt;Anyway, the "stupid typos"/"silly decisions"/"shortcuts"/etc are actually more likely to occur for the "simple tasks" becuase the programmer often sees it as just that: "oh, this is just a simple little thing, I don't really need to TDD/[fill in the blank], what could go wrong"...and wallah, we've got a &lt;a href="http://www.artima.com/intv/fixit2.html"&gt;broken window&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now, all that said, yes, if the task is truly a few minute trivial thing, then it may not help to PP. As with all things, common sense is required.&lt;br /&gt;&lt;br /&gt;The truth is that the time where one in fact might be better off working alone is when they have a real doozy of a problem that they need to concentrate very hard on to get their head around.  If you need some quiet dorm room time, go ahead and split up for a stint.  Prototype, spike, get your head about you, then regroup and get to it.  Rule is though: "No non-throwaway code during solo time".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"Should teams adjust their expected velocity to account for the effect of pair programming, especially when first adopting?"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;My experience is that velocity rarely decreases enough to try to predict it - assuming they pair effectively (which is not hard), the benefits are often gained immediately.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"Do we need to pair from the onset of a story?"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Yes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;"In other words, can a story be begun by one person, then a pair picked up halfway through?"&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Not advised.&lt;br /&gt;&lt;br /&gt;Pairing actually tends to be a bit counterproductive if "picked up halfway through", mostly because the "pair" comes on and is quite likely to become, at best, a bystander observing what the other has done / is doing, or, at worst, just "a pain who won't stop poking holes in my design".&lt;br /&gt;&lt;br /&gt;Again, true pair programming means the two are largely thinking as one, just so happens only one person is typing.&lt;br /&gt;&lt;br /&gt;If pairing is attempted "half way in", the result is often "one person thinking, another person simply watching" - which, consequently, &lt;span style="font-weight: bold;"&gt;is&lt;/span&gt; more of a waste of time than a benefit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-4263568384468951834?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=dsHZdtN6tDE:N9cOWrRlenM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=dsHZdtN6tDE:N9cOWrRlenM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=dsHZdtN6tDE:N9cOWrRlenM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=dsHZdtN6tDE:N9cOWrRlenM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=dsHZdtN6tDE:N9cOWrRlenM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=dsHZdtN6tDE:N9cOWrRlenM:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=dsHZdtN6tDE:N9cOWrRlenM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=dsHZdtN6tDE:N9cOWrRlenM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=dsHZdtN6tDE:N9cOWrRlenM:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=dsHZdtN6tDE:N9cOWrRlenM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=dsHZdtN6tDE:N9cOWrRlenM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/dsHZdtN6tDE/riddle-me-this-mr-pair-programmer.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_NtSvNsKtHLs/SWqUeP6E9HI/AAAAAAAAAQA/oQU7CC-M6NU/s72-c/riddler_small.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/01/riddle-me-this-mr-pair-programmer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-7371072731477234462</guid><pubDate>Mon, 12 Jan 2009 00:21:00 +0000</pubDate><atom:updated>2009-01-21T16:26:03.635-05:00</atom:updated><title>E-A-G-L-E-S, EAGLES!!!</title><description>Sorry, I just couldn't help it!  &lt;a href="http://www.philadelphiaeagles.com/"&gt;GO BIRDS&lt;/a&gt;!!!&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 300px; height: 300px;" src="http://3.bp.blogspot.com/_NtSvNsKtHLs/SWqNl7vDunI/AAAAAAAAAPw/lNH5qIrKEqA/s400/EAGLES_WHITE.jpg" alt="" id="BLOGGER_PHOTO_ID_5290196395129813618" border="0" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-7371072731477234462?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=IhjqzPsjhsE:KU4dJmCoFs8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=IhjqzPsjhsE:KU4dJmCoFs8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=IhjqzPsjhsE:KU4dJmCoFs8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=IhjqzPsjhsE:KU4dJmCoFs8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=IhjqzPsjhsE:KU4dJmCoFs8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=IhjqzPsjhsE:KU4dJmCoFs8:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=IhjqzPsjhsE:KU4dJmCoFs8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=IhjqzPsjhsE:KU4dJmCoFs8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=IhjqzPsjhsE:KU4dJmCoFs8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=IhjqzPsjhsE:KU4dJmCoFs8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=IhjqzPsjhsE:KU4dJmCoFs8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/IhjqzPsjhsE/e-g-l-e-s.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_NtSvNsKtHLs/SWqNl7vDunI/AAAAAAAAAPw/lNH5qIrKEqA/s72-c/EAGLES_WHITE.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/01/e-g-l-e-s.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-4015660398892763543</guid><pubDate>Fri, 09 Jan 2009 16:30:00 +0000</pubDate><atom:updated>2009-01-21T16:26:13.549-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">teamwork</category><category domain="http://www.blogger.com/atom/ns#">corporate culture</category><category domain="http://www.blogger.com/atom/ns#">leadership</category><title>Where'd Jeff Probst go? (aka, Kicking someone off the island)</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_NtSvNsKtHLs/SWbUMEIiAgI/AAAAAAAAAPg/cPFMx8tnK2A/s1600-h/rotten_apple.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 110px; height: 100px;" src="http://3.bp.blogspot.com/_NtSvNsKtHLs/SWbUMEIiAgI/AAAAAAAAAPg/cPFMx8tnK2A/s320/rotten_apple.gif" alt="" id="BLOGGER_PHOTO_ID_5289148116126269954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Yesterday I spent the better part of my morning reading through the 130 or so messages in the Scrum Dev Yahoo group's "Rotten Apple In Scrum Team" discussion, then  I posted &lt;a href="http://www.infoq.com/news/2009/01/handling-your-underperformer" target="_blank"&gt;this "newsy" summary of the discussion&lt;/a&gt; on InfoQ.&lt;br /&gt;&lt;br /&gt;In a nutshell, Marko told the group of a guy on his team he sees as a drastic "under-performer", or as he put it originally a "&lt;span style="font-style: italic;"&gt;rotten apple&lt;/span&gt;", and asked for advice as to what to do with him.  Read the InfoQ post to get a deeper sense for how people responded, but the gist of most of the advice was for Marko to take an open-minded and objective stab at finding out (and/or helping the team find out) what's really driving this person's performance, or, rather, lack thereof.  And then to help him out.&lt;br /&gt;&lt;br /&gt;"Try 'Beginners Mind'"..."take queue from Linda Rising"..."pair up with the guy"..."be nice, be helpful, be supportive"...and so on and so on.   Hear this clearly (before I get to my real point of this post):  I generally agree wholeheartedly with all the advice presented.&lt;br /&gt;&lt;br /&gt;Now though, all that Dr. Jeckyll buildup for the Mr. Hyde thought:  130+ replies and not one mention of "kicking someone off the island"?&lt;br /&gt;&lt;br /&gt;[...and the crowd gasps in horror...]&lt;br /&gt;&lt;br /&gt;I've seen, and I'm sure you have too, a team who had an individual who truly did bring the team down.  Typically not because they couldn't program quite as fast, or weren't quite as smart, or weren't quite as good in front of customers, or anything skill/experience/productivity-related like that.  Rather, simply because they had a negative attitude, because they didn't play nicely or just plain didn't &lt;span style="font-style: italic;"&gt;care.  &lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;[*Note:  For what's worth, I do not think this applies to Marko's guy, but the discussion got me thinking anyway.]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;One seriously under appreciated technique that I stress should be considered for these true "rotten apples" is to get them off your team, kick 'em off the damn island.  No one says you have to fire them, just get them out of the way somehow.&lt;br /&gt;&lt;br /&gt;Forget tools, intelligence, certifications, experience for a moment.  The degree with which having a good &lt;span style="font-weight: bold;"&gt;team&lt;/span&gt; (in the "synergy" sense that is) contributes to good results (and, hell, a good time) is amazing;  having a &lt;span style="font-style: italic;"&gt;great&lt;/span&gt; team, well that's just indescribably astounding, magical even.  Conversely, the degree with which having a bad team atmosphere can lead to serious bed-shatting, well, that's also quite amazing as well.&lt;br /&gt;&lt;br /&gt;So if you've got someone who after the Prime Directive and the Beginner's Mind and the Pairing has still got that sour-puss face and, more importantly, is still killing your team's ju-ju, then by all means call the spade a spade, cut your losses, and remove them.  Be as graceful as you like, but please, as Bo used to say, &lt;span style="font-style: italic;"&gt;just do it&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Again I stress, I'm about as "glass half full" as they come - I'm not trying to encourage a general exclusive, head-chopping, "only the best" attitude.  95 times out of 100 your man intends the best and just needs a little love, and by all means you outta be doing your damnedest to facilitate that happening.  My point is that for those other 5, stop being so P.C. and get the bad apple out of your basket.  Your team's ju-ju will thank you for it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;** Update:  Thanks to Esther Derby for shouting out about her &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.estherderby.com/weblog/2007/04/when-is-it-time-to-move-someone-off.html" target="_blank"&gt;related and more concretely useful post&lt;/a&gt;&lt;span style="font-style: italic;"&gt; from some time ago echoing the same sentiment.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-4015660398892763543?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=8mQtHVLIycg:idl4VBBwNPQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=8mQtHVLIycg:idl4VBBwNPQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=8mQtHVLIycg:idl4VBBwNPQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=8mQtHVLIycg:idl4VBBwNPQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=8mQtHVLIycg:idl4VBBwNPQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=8mQtHVLIycg:idl4VBBwNPQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=8mQtHVLIycg:idl4VBBwNPQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=8mQtHVLIycg:idl4VBBwNPQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=8mQtHVLIycg:idl4VBBwNPQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=8mQtHVLIycg:idl4VBBwNPQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=8mQtHVLIycg:idl4VBBwNPQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/8mQtHVLIycg/whered-jeff-probst-go-aka-kicking.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_NtSvNsKtHLs/SWbUMEIiAgI/AAAAAAAAAPg/cPFMx8tnK2A/s72-c/rotten_apple.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2009/01/whered-jeff-probst-go-aka-kicking.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-8123498765523512165</guid><pubDate>Mon, 15 Dec 2008 16:50:00 +0000</pubDate><atom:updated>2009-06-23T10:33:59.468-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">design</category><category domain="http://www.blogger.com/atom/ns#">pairing</category><title>Why do pears fall in love?</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_NtSvNsKtHLs/SUaQQ7jC5_I/AAAAAAAAAOw/O6RR-D8AdAA/s1600-h/2Pears.jpeg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 116px; height: 90px;" src="http://2.bp.blogspot.com/_NtSvNsKtHLs/SUaQQ7jC5_I/AAAAAAAAAOw/O6RR-D8AdAA/s320/2Pears.jpeg" alt="" id="BLOGGER_PHOTO_ID_5280066233675474930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So, I've been following Corey Haines' &lt;a href="http://programmingtour.blogspot.com/" target="_blank" title="Corey Haines' Pair Programming Tour"&gt;Pair Programming Tour&lt;/a&gt;.  Check it out, it's a rather cool gig, both as it brings the topic of Pairing back under a much needed limelight, as well as, in and of itself, the totally unique and inspiring act of Corey taking such a tour in the name of our craft.  Kudos Corey!&lt;br /&gt;&lt;br /&gt;It's got me re-inspired to write up some of the things I've always wanted to about pairing, as I'll do now and then  here in my nifty new super fantastic blog.&lt;br /&gt;&lt;br /&gt;To start, I'm drumming something up from one of my first writings years ago about this wonderful thing we call Pair Programming.  It's a simple list, intended to highlight the major reasons why we pair.  Here it is...&lt;br /&gt;&lt;blockquote&gt;When programming (ie. designing) alone even the most disciplined/skilled of us will:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get stuck on various "how to's" (often for a great deal of time)&lt;/li&gt;&lt;li&gt;Often stray, both in thought and code, away from the current task at hand&lt;/li&gt;&lt;li&gt;Spend a lot of time debating various decisions in our head&lt;/li&gt;&lt;li&gt;Create designs only we understand, thus requiring a future time-consuming learning curve for everyone else (trust me)&lt;/li&gt;&lt;li&gt;Be prone to, at least occasionally, make bad decisions - each of which incurring technical debt*&lt;/li&gt;&lt;li&gt;Be prone to make programming errors (especially if we're not test-driving), thus incurring technical debt*&lt;/li&gt;&lt;li&gt;Be likely to "cheat" (out of good programming practices), thus incurring technical debt*&lt;/li&gt;&lt;li&gt;Periodically get burnt out, requiring a break [during which time no work is done]&lt;/li&gt;&lt;li&gt;Have no one to encourage us or celebrate with&lt;/li&gt;&lt;br /&gt;* "technical debt" = exponentially costly [ie, time-consuming] future rework!&lt;br /&gt;See also: &lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html" target="_blank" title="MF Bliki: TechnicalDebt"&gt;Martin Fowler on &lt;i&gt;Technical Debt&lt;/i&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When &lt;a href="http://aydsoftware.blogspot.com/2009/01/riddle-me-this-mr-pair-programmer.html"&gt;pair programming&lt;/a&gt; (ie. designing) even the least disciplined/skilled of us will:&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Rarely get stuck on any "how to's" - for those things that stick us, our pair is highly unlikely to be stuck as well&lt;/li&gt;&lt;li&gt;Remain focused on the task at hand&lt;/li&gt;&lt;li&gt;Be able to more efficiently [quickly] make design decisions collaboratively with our partner&lt;/li&gt;&lt;li&gt;Be sure that at least one person won't have a time consuming learning curve to understand my design&lt;/li&gt;&lt;li&gt;Be forced to verbally justify the rational for our decisions, thus greatly decreasing the likelihood that we "miss something"&lt;/li&gt;&lt;li&gt;Rarely make a programming error that our pair won't pick up&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Not be able to "cheat"&lt;/li&gt;&lt;li&gt;Be able to pass the keyboard to our pair when we need a break - keeps us moving, and keeps us fresh&lt;/li&gt;&lt;li&gt;Have someone to constantly encourage us and celebrate with (ie..fun)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;For these reasons, it has been shown that diligent pair programming, at least over any non-trivial period of time, does not decrease team velocity. In fact, it will often increase team velocity (and, as a nifty side effect, software quality as well).&lt;br /&gt;&lt;/blockquote&gt;So, chew on that, maybe it'll help you in the next hallway conversation where you need to explain to someone how "pairing does NOT double the time it takes to get something done".&lt;br /&gt;&lt;br /&gt;And of course, remember why this is necessary in the first place:  The world we live in these days, well kids,  It Ain't Your Daddy's Software Development...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;**Update:  &lt;a href="http://aydsoftware.blogspot.com/2009/01/riddle-me-this-mr-pair-programmer.html"&gt;Check out this&lt;/a&gt; for some Q&amp;amp;A about Pairing&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-8123498765523512165?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=5nb40VuWZkI:DEDKIkRnNSg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=5nb40VuWZkI:DEDKIkRnNSg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=5nb40VuWZkI:DEDKIkRnNSg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=5nb40VuWZkI:DEDKIkRnNSg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=5nb40VuWZkI:DEDKIkRnNSg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=5nb40VuWZkI:DEDKIkRnNSg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=5nb40VuWZkI:DEDKIkRnNSg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=5nb40VuWZkI:DEDKIkRnNSg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=5nb40VuWZkI:DEDKIkRnNSg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=5nb40VuWZkI:DEDKIkRnNSg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=5nb40VuWZkI:DEDKIkRnNSg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/5nb40VuWZkI/why-do-pears-fall-in-love.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_NtSvNsKtHLs/SUaQQ7jC5_I/AAAAAAAAAOw/O6RR-D8AdAA/s72-c/2Pears.jpeg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2008/12/why-do-pears-fall-in-love.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6558914886349044117.post-880677518475659832</guid><pubDate>Sat, 13 Dec 2008 23:19:00 +0000</pubDate><atom:updated>2009-01-21T16:26:25.066-05:00</atom:updated><title>Where art thou been?</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_NtSvNsKtHLs/SUROlgJnGqI/AAAAAAAAAOc/RORJGXkhqIU/s1600-h/SockMonkey"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://4.bp.blogspot.com/_NtSvNsKtHLs/SUROlgJnGqI/AAAAAAAAAOc/RORJGXkhqIU/s320/SockMonkey" border="0" alt=""id="BLOGGER_PHOTO_ID_5279431069377436322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;(Disclaimer:  you will find nothing of value in this post.  Leave now.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, here's me, welcome to the party.  For the life of me I cannot even begin to understand how it's taken me to until December 13, 2008 to actually create my own personal blog.  It's an anomaly.  Whacked.  Crazy.  Odd.  Questionable.&lt;br /&gt;&lt;br /&gt;Anyone who knows me knows that, more often than not, its hard to shut me up.  I love to write, I've been doing it for many years, and in many ways, for many reasons.  I've written much about many things.  Much even about software, and about agile, about people and the world we all rock.&lt;br /&gt;&lt;br /&gt;So where have I been?  Who knows, maybe I was subconsciously afraid no one would give a flying crap what I had to say in the blogosphere and was avoiding the rejection?  Maybe I wasn't properly motivating myself?  Maybe I was too busy with other stuff?  Maybe I'm just lazy (yes, that's it).&lt;br /&gt;&lt;br /&gt;It's unfortunate, really, how much people fail to do the things they know they should do, or want to do.  How much we let something get in the of way it.  Personally speaking, and professionally.  In life, and in business...and, here it comes, definitely in software development.  People, all over the world, knowing they could or should be doing software better.  Designing better.  Coding better.  Delivering better.  Collaborating better.  Communicating better.  Trusting better.  In the end - living better.&lt;br /&gt;&lt;br /&gt;Doing it better...and having more fun doing it!&lt;br /&gt;&lt;br /&gt;So, here then lies the root of what you'll likely find here:  writings...well, ok, ramblings (some useless, some useful, some idiotic, some wise, some comical, some ridiculous, some stupid, some cool), that chronicle whatever might be striking my fancy any given sunny day about the world of software and the people who inhabit it.  Sometimes it'll be geeky, sometimes business-y, sometimes touchy-feely, sometimes none of the above. We'll see.&lt;br /&gt;&lt;br /&gt;Anyhoo, just needed to get that off my chest, that was for me, please do disregard this rambling collection of words.  Promise, no more stream-of-consciousness psycho-babble about "me" (well, at least not for a little while!).   From here on out, we talk of our craft.  We talk of software, and of that funny thing they call "agile".  &lt;br /&gt;&lt;br /&gt;See ya soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6558914886349044117-880677518475659832?l=aydsoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=Pbb2C-KqOIY:i4bTC8DD21I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=Pbb2C-KqOIY:i4bTC8DD21I:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=Pbb2C-KqOIY:i4bTC8DD21I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=Pbb2C-KqOIY:i4bTC8DD21I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=Pbb2C-KqOIY:i4bTC8DD21I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=Pbb2C-KqOIY:i4bTC8DD21I:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=Pbb2C-KqOIY:i4bTC8DD21I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=Pbb2C-KqOIY:i4bTC8DD21I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=Pbb2C-KqOIY:i4bTC8DD21I:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/AYDSoftware?a=Pbb2C-KqOIY:i4bTC8DD21I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/AYDSoftware?i=Pbb2C-KqOIY:i4bTC8DD21I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/AYDSoftware/~3/Pbb2C-KqOIY/where-art-thou-been.html</link><author>noreply@blogger.com (Mike Bria)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_NtSvNsKtHLs/SUROlgJnGqI/AAAAAAAAAOc/RORJGXkhqIU/s72-c/SockMonkey" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://aydsoftware.blogspot.com/2008/12/where-art-thou-been.html</feedburner:origLink></item></channel></rss>

