<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3412076207393035593</id><updated>2012-03-06T22:30:11.254-05:00</updated><category term='kata'/><category term='CSD'/><category term='CI'/><category term='clink'/><category term='github'/><category term='codemash'/><category term='conference'/><category term='rubyonrails'/><category term='prison'/><category term='JBehave'/><category term='reflector'/><category term='TDD'/><category term='feedback'/><category term='agile'/><category term='fxCop'/><category term='git'/><category term='BDD'/><category term='craftsmanship'/><category term='rails'/><category term='seven pillars'/><category term='class'/><category term='gist'/><category term='.net'/><category term='Agile Skills Project'/><category term='coupling'/><category term='1devday'/><category term='tutorial'/><category term='continous integration'/><category term='best practices'/><category term='pastie'/><category term='xslt'/><category term='communication'/><category term='Java'/><category term='Refactoring'/><category term='C#'/><category term='pair programming'/><category term='certification'/><category term='scrum'/><category term='Jenkins'/><category term='Ruby'/><category term='software'/><category term='Pillar'/><category term='partials'/><category term='CodeRetreat'/><category term='Conway&apos;s Game of Life'/><category term='Cyclomatic complexity'/><category term='self improvement'/><category term='ruby koans'/><category term='examples'/><title type='text'>Treetown Agile Adventure</title><subtitle type='html'>My adventures in Agile Software Development and Coaching from Ann Arbor, MI.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.jhoover.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1586142670587980960</id><published>2012-03-06T07:41:00.002-05:00</published><updated>2012-03-06T22:26:48.255-05:00</updated><title type='text'>Pair Programming Harmful? Says who?</title><content type='html'>There's been a lot of attention on Twitter to an &lt;a href="http://techcrunch.com/2012/03/03/pair-programming-considered-harmful/"&gt;article &lt;/a&gt;by Jon Evans at TechCrunch that takes a fairly broad attack on the agile practice of pair programming, only to advise readers to use their best judgement about it. I find the piece to be a sensationalist attack on a practice that the author doesn't seem to understand. He cites the ineffectiveness* of "brainstorming", which pairing is nothing like; and the dangers of allowing people to hide and let others do the work, which good pairing actually &lt;i&gt;mitigates&lt;/i&gt;. Even if you grant his, in my estimation, weakly-supported hypothesis that it harms superstars, it completely misses the accelerated learning and distribution of knowledge that pairing affords agile developers and newbies. The article also misses the natural instinct that we developers have to work on what we find fun and interesting, even if it's not trying to solve the business problem at hand - how many times have you seen a cowboy rewrite working code because s/he didn't like it or because&amp;nbsp; it was a prime candidate for a flashy new technology? Waste like that doesn't happen in good pairs. Neither does finding yourself at the end of a couple of hours having achieved little besides some web surfing, a few personal calls, and having reduced the size of your inbox? Or haven't we all seen great, creative solo work, that isn't what the business needs? &lt;br /&gt;&lt;br /&gt;Evans doesn't &lt;span style="font-size: small;"&gt;acknowledge &lt;/span&gt;that pairing is a skill that takes practice to get good at, and for some developers getting good at it requires some people to step out of their comfort zones. Rather than his arguments against pairing, I'd like to see an article discussing personal challenges that pairing poses for some developers and the courage that it will take for them to become good pairers, if they want to avail themselves of the benefits of pairing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: Times, 'Times New Roman', serif;"&gt;* This claim may not even withstand scrutiny: &lt;a href="http://bobsutton.typepad.com/my_weblog/2012/01/why-the-new-yorkers-claim-that-brainstorming-doesnt-work-is-an-overstatement-and-possibly-wrong.html"&gt;http://bobsutton.typepad.com/my_weblog/2012/01/why-the-new-yorkers-claim-that-brainstorming-doesnt-work-is-an-overstatement-and-possibly-wrong.html &lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-1586142670587980960?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1586142670587980960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2012/03/pair-programming-harmful-says-who.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1586142670587980960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1586142670587980960'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2012/03/pair-programming-harmful-says-who.html' title='Pair Programming Harmful? Says who?'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-7427229727107628093</id><published>2012-03-05T09:06:00.001-05:00</published><updated>2012-03-05T09:12:20.424-05:00</updated><title type='text'>A New Big Visible for the Card Wall - State Change Criteria</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-NwKBOOT6sZ4/Tz0fB5sDjWI/AAAAAAAAAsM/JPvD6B4daH0/s1600/StateChangeCriteria.jpg" imageanchor="1" style="clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-NwKBOOT6sZ4/Tz0fB5sDjWI/AAAAAAAAAsM/JPvD6B4daH0/s400/StateChangeCriteria.jpg" width="111" yda="true" /&gt;&lt;/a&gt;&lt;/div&gt;I have a team that's just starting agile. During Sprint 0, we decided on a Definition-of-Done, but the team also wanted a way to make the criteria for moving a story card from one column on the wall to another big and visible. Being new, they thought it would help them to see, as they move a card from one column to the next, what had better be complete at this stage. If they had missed something, they have a chance to catch up before they actually move the card. We came up with yellow boxes that sit on the physical boundaries between columns on our card&amp;nbsp;wall (see right). I'm calling them State Change Criteria (since there's already been a &lt;a href="http://xprogramming.com/articles/expcardconversationconfirmation/"&gt;CCC&lt;/a&gt; since early XP days). The team left room to hand-write new criteria as their understanding grows and their process improves.&lt;br /&gt;&lt;br /&gt;We came up with&amp;nbsp;two more big visibles (not shown) that address the flow of "defects". One says: "In-sprint defects are moved back into Sprint Backlog." This is to remind the team that we don't track problems with in-play cards, we just fix and finish them within the sprint. The other says: "Escaped defects are written as new user stories and moved back into the Release Backlog." This is to remind the team that the Product Owner may choose to prioritize new functionality above fixing the defect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-7427229727107628093?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/7427229727107628093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2012/03/new-big-visible-state-change-criteria.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/7427229727107628093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/7427229727107628093'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2012/03/new-big-visible-state-change-criteria.html' title='A New Big Visible for the Card Wall - State Change Criteria'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-NwKBOOT6sZ4/Tz0fB5sDjWI/AAAAAAAAAsM/JPvD6B4daH0/s72-c/StateChangeCriteria.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-5342694319245562814</id><published>2012-02-02T14:58:00.001-05:00</published><updated>2012-02-02T15:02:45.846-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='continous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='CI'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='fxCop'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Cyclomatic complexity'/><category scheme='http://www.blogger.com/atom/ns#' term='coupling'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>Trying to get .Net Metrics Computed and Displayed with Jenkins</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;I'm helping a .Net team stand up &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt; as their CI server. The build steps we have so far are building a solution and running fxCop against the debug build. Using the Jenkins &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Violations"&gt;Violations Plugin&lt;/a&gt;, which supports &lt;a href="http://blogs.msdn.com/b/codeanalysis/archive/2010/07/26/fxcop-10-0-is-available.aspx"&gt;fxCop&lt;/a&gt;, we can display a nice trend chart and have hot links to drill down and see the violations in context.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;My next goal was to run metrics that my team agreed on, specifically &lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;Cyclomatic Complexity&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Coupling_%28computer_programming%29"&gt;Coupling&lt;/a&gt;. I was hopeful because &lt;a href="http://msdn.microsoft.com/en-us/library/bb385914.aspx"&gt;Visual Studio 2010 can already compute them&lt;/a&gt;. But I found out that Visual Studio's code metrics can't be called on the command line.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;Fortunately, I found &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=9422"&gt;Visual Studio Code Metrics PowerTool 10.0&lt;/a&gt;&amp;nbsp;for that purpose. There's lots of information already out about using it:&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;Jeff Bramwell has a blog post about the PowerTool&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;and&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/camerons/about.aspx"&gt;Cameron Skinner&lt;/a&gt;&amp;nbsp;wrote one about it.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;Unfortunately, the Violations Plugin doesn't support the xml output, and the PowerTool doesn't have an option to output to HTML. Fortunately, though, Skinner also wrote a &lt;a href="http://www.blogger.com/goog_444282179"&gt;post that&amp;nbsp;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;&lt;a href="http://blogs.msdn.com/b/camerons/archive/2011/02/20/code-metrics-reporting-and-xslt-debugging.aspx"&gt;provides an xslt and a .css file&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;that will turn the results into HTML.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;So my next step was to make a build step that runs a command-line tool to apply the transform.&lt;/span&gt;&lt;span style="color: #500050; font-size: small;"&gt;&lt;span style="font-family: arial,sans-serif;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #500050; font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;I couldn’t figure out or find enough documentation on&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=21714" target="_blank"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;msxsl.exe&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="color: #500050; font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt;, but I found &lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://www.codeproject.com/Articles/8823/A-better-MSXSL-EXE-Adding-the-ability-to-Transform" target="_blank"&gt;&lt;span style="font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;this CodeProject project&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="color: #500050; font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: small;"&gt; and it works.&lt;/span&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;(Anyhow, it would only take a few lines to write your &lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;own in C# because you can use calls from &lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;MSXML.&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;Now I need to figure out how to use the HTML report in&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;Jenkins. I'll investigate the Jenkins &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/HTML+Publisher+Plugin"&gt;HTML Publisher Plugin&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #500050; font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;"&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-5342694319245562814?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/5342694319245562814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2012/02/trying-to-get-net-metrics-computed-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/5342694319245562814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/5342694319245562814'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2012/02/trying-to-get-net-metrics-computed-and.html' title='Trying to get .Net Metrics Computed and Displayed with Jenkins'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1789486947219432558</id><published>2011-12-14T20:33:00.000-05:00</published><updated>2011-12-14T20:33:31.505-05:00</updated><title type='text'>Why Pair Program?</title><content type='html'>&lt;div class="adn ads" style="border-collapse: collapse; border-left-color: transparent; border-left-style: solid; border-left-width: 1px; padding-bottom: 20px; padding-left: 8px;"&gt;&lt;div class="gs" style="margin-left: 44px;"&gt;&lt;div class="ii gt adP adO" id=":a5" style="margin-bottom: 0px; margin-left: 0px; margin-right: 15px; margin-top: 5px; padding-bottom: 5px; position: relative; z-index: 2;"&gt;&lt;div style="color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;Pair programming is one of the agile engineering practices that developers give me the most pushback on (probably second only to TDD). Here are some of the reasons I give for why we pair program:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;  &lt;br /&gt;&lt;div class="MsoNormal" style="color: #222222;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;ul style="color: #222222;"&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #1a1a1a;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;progress (driver)&amp;nbsp;&lt;i&gt;and&lt;/i&gt; research (navigator) instead of progress &lt;i&gt;or&lt;/i&gt; research (solo dev)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #1a1a1a;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;may avoid the need for code reviews, which can be&amp;nbsp;contentious&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #1a1a1a;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;second set of eyes, catches silly mistakes&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #1a1a1a;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;less thrashing between QA and dev and back&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #1a1a1a;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;less time wasted down rabbit holes, as navigators offer perspective&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #1a1a1a;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;less time wasted&amp;nbsp;on non-work distractions&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #1a1a1a;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;keep each other honest on practices like code quality, TDD, checkins&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #1a1a1a;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;reduces a team's&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Bus_factor"&gt;&lt;span style="color: #0000f6;"&gt;bus factor&lt;/span&gt;&lt;/a&gt;, a significant business risk for IT projects&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;!--EndFragment--&gt;&lt;br /&gt;&lt;div style="color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #222222;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif;"&gt;I'd like to write more about some of these, but I'm not sure when I'll get to it.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hi" style="background-attachment: initial; background-clip: initial; background-color: #f2f2f2; background-image: initial; background-origin: initial; border-bottom-left-radius: 0px 0px; border-bottom-right-radius: 0px 0px; color: #222222; font-family: arial, sans-serif; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; width: auto;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="ajx" style="clear: both; color: #222222; font-family: arial, sans-serif;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="gA gt ac5" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-left-radius: 0px 0px; border-bottom-right-radius: 0px 0px; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-color: initial; border-top-style: none; border-top-width: initial; color: #222222; font-family: arial, sans-serif; font-size: 13px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; width: auto;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-1789486947219432558?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1789486947219432558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/12/why-pair-program.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1789486947219432558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1789486947219432558'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/12/why-pair-program.html' title='Why Pair Program?'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-118714054986125295</id><published>2011-11-17T18:23:00.000-05:00</published><updated>2011-11-17T18:23:21.718-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Refactoring - Is It Only Removing Duplication?</title><content type='html'>Today a colleague was looking for a TDD poster that showed Red-Green-Refactor with detailed emphasis on Refactoring. We found a diagram that simply said "refactoring = removing duplication". This got be thinking about &lt;a href="http://www.jbrains.ca/permalink/the-four-elements-of-simple-design"&gt;a post by JB Rainsberger&lt;/a&gt; in which he said: "...if you master removing duplication and fixing bad  names, then I claim you master object-oriented design." (If you see this, JB, do you still make this claim?)&lt;br /&gt;&lt;br /&gt;There are lots of kinds of duplication, and JB's assertion makes sense to me especially when I think about &lt;span&gt;the kind of &lt;i&gt;informational&lt;/i&gt;  duplication (as opposed to code duplication) that DRY is intended to avoid.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-118714054986125295?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/118714054986125295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/11/refactoring-is-it-only-removing.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/118714054986125295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/118714054986125295'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/11/refactoring-is-it-only-removing.html' title='Refactoring - Is It Only Removing Duplication?'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-4240075079818769363</id><published>2011-09-25T21:32:00.000-04:00</published><updated>2011-09-25T21:32:55.574-04:00</updated><title type='text'>After Agile Coach Camp 2011</title><content type='html'>I spent this weekend at &lt;a href="http://blog.agilecoachcamp.us/"&gt;Agile Coach Camp&lt;/a&gt; in Columbus, Ohio. It was my first open space conference, and I loved it! Learn about &lt;a href="https://secure.wikimedia.org/wikipedia/en/wiki/Open_Space_Technology"&gt;Open Space&lt;/a&gt; unconferences on Wikipedia.&amp;nbsp; I won't even try to explain it. &lt;br /&gt;&lt;br /&gt;Friendship, community, sharing, equality, questions, suggestions, personal revelations, self-examination, laughter, fun - I received all these things and more. Zee Spencer summarized some of the sessions &lt;a href="https://plus.google.com/u/0/107098760722539280474/posts/EyAgp4szYdy"&gt;here&lt;/a&gt;, and I'm sure there will be others. There's a picture of the &lt;a href="https://picasaweb.google.com/114043888000663006020/ACCUS02#5656064696822710658"&gt;sessions board&lt;/a&gt; showing most of the Saturday sessions.&lt;br /&gt;&lt;br /&gt;You can get a small taste of the amazing energy of the event by reading the &lt;a href="https://twitter.com/#%21/search/realtime/accus"&gt;#accus&lt;/a&gt; hashtag on Twitter.&lt;br /&gt;&lt;br /&gt;In 2012, Agile Coach Camp will be in Minneapolis. If you can, you owe it to yourself to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-4240075079818769363?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/4240075079818769363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/09/after-agile-coach-camp-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/4240075079818769363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/4240075079818769363'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/09/after-agile-coach-camp-2011.html' title='After Agile Coach Camp 2011'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-8969284537736637994</id><published>2011-09-09T20:33:00.001-04:00</published><updated>2011-09-09T20:35:28.540-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='craftsmanship'/><title type='text'>Advice for someone wanting to get (back) into software development</title><content type='html'>I was talking to a friend today who was doing software development several years ago but has been unemployed for a while. He asked if I had any ideas about what he might to to get back into software. &lt;br /&gt;&lt;br /&gt;(An an aside,&amp;nbsp; Patrick Welsh already wrote a great piece about &lt;a href="http://patrickwilsonwelsh.com/?p=687"&gt;why people should consider a career in software)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are some of the thoughts I gave my friend on how to get (re)started in the industry:&lt;br /&gt;&lt;br /&gt;- If you don't have work experience  to show on your resume, create relevant non-work experiences and  structure your resume to show them.&lt;br /&gt;&lt;br /&gt;- If you're not already on &lt;a href="http://www.twitter.com/"&gt;Twitter&lt;/a&gt;, set up an account and use the search function to find experts in the areas you are interested in. Follow them.&lt;br /&gt;&lt;br /&gt;- Attend groups/events where people who do what you want to do gather. Ask people questions about what they do. Ask what blogs they read and who they follow on Twitter.&lt;br /&gt;&lt;br /&gt;- Start learning web programming, throw up a website, publish the code on someplace like github, and keep updating it. One place to start might be: &lt;a href="http://railsforzombies.org/" target="_blank"&gt;http://railsforzombies.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Expose yourself to new languages and technologies: ruby, scala,  functional languages, automated testing, continuous iteration ...&lt;br /&gt;&lt;br /&gt;- If you're not currently working, ask about an internship someplace you'd  like to work at, even if it has to be unpaid.&lt;br /&gt;&lt;br /&gt;- Be helpful - volunteer for anything related to your targeted field. People remember/like you better if you've helped them. Less cynically, it gives people a chance to see who you are and what your attitude and skills are.&lt;br /&gt;&lt;br /&gt;- Don't get hung up on getting/finishing a degree if you don't  already have one, especially if it would take away from getting real  life experience.&lt;br /&gt;&lt;br /&gt;- &lt;i&gt;Read this book&lt;/i&gt; about managing your software career:&lt;br /&gt;&lt;a href="http://pragprog.com/book/cfcar2/the-passionate-programmer" target="_blank"&gt;"The Passionate Programmer: Creating a Remarkable Career in Software Development" by Chad Fowler&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Consider reading this book about agile software development:&lt;br /&gt;&lt;a href="http://jamesshore.com/Agile-Book/" target="_blank"&gt;"The Art of Agile Development" by James Shore&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Finally&lt;/b&gt;: Don't follow my advice without deciding for yourself if it makes sense for you. Ask other people about it as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-8969284537736637994?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/8969284537736637994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/09/advice-to-someone-wanting-to-get-back.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/8969284537736637994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/8969284537736637994'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/09/advice-to-someone-wanting-to-get-back.html' title='Advice for someone wanting to get (back) into software development'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1991819311868191769</id><published>2011-06-25T23:28:00.005-04:00</published><updated>2011-06-27T23:48:38.033-04:00</updated><title type='text'>Coding in the Clink IV - my second coding retreat at Marion Correctional Institute</title><content type='html'>&lt;span class="screen-name screen-name-coreyhaines pill"&gt;On Saturday, I attended &lt;/span&gt;&lt;a href="http://codingintheclink4-linkedin.eventbrite.com/"&gt;Coding in the Clink IV&lt;/a&gt;  at MCI. It was great to see the inmates again. We all agreed they have made great strides in their  learning since the last time we worked with them in March.&lt;br /&gt;&lt;br /&gt;This was my second time spending a day programming with inmates at MCI. The first time in, I got to have my stereotypes blasted. As I said in my previous post about Coding in the Clink, one thing that struck me most was how similar the day was to a full-fledged &lt;a href="http://coderetreat.ning.com/profiles/blogs/how-a-coderetreat-works"&gt;CodeRetreat&lt;/a&gt; on the outside.&lt;br /&gt;&lt;br /&gt;This time, I was reminded all day of just how careful I need to be when pairing with or coaching a less experienced developer. If I'm not careful, it's easy for me to press ahead with my own ideas and simply explain to my pair what I'm doing. That doesn't always leave my partner room to struggle with ideas, and in that moment I'm not letting them succeed in solving a problem or explaining something to me or probably other ways.&lt;br /&gt;&lt;br /&gt;On the outside, while pairing in this way is not what I strive for, a little bit of it isn't necessarily a disaster. Unless they are in way over their head, most devs I pair with will assert themselves and claim their role a partner, even when I'm not sharing well that day. When that happens, I often "wake up" and start "playing nice" again.&lt;br /&gt;&lt;br /&gt;But in prison, inmates are predisposed to not assert themselves to outsiders. Dan Weibe mentions it in his post "&lt;a href="https://javaguys.wordpress.com/2010/10/17/but-but-there-are-criminals-in-prison/"&gt;But-but there are CRIMINALS in prison!&lt;/a&gt;":&lt;br /&gt;&lt;blockquote&gt;...The program is seen by the prisoners as a very good thing, and any  attack on it ... could get the whole program ejected ... [and] life would immediately become very dangerous for the  offending prisoner.  Everybody knows this...  &lt;/blockquote&gt;Here's the part that illustrates why I have to be extra-careful to be a good pair in the prison:&lt;br /&gt;&lt;blockquote&gt;... &lt;span style="font-style: italic;"&gt;in some  cases the normal give-and-take of pairing can be hamstrung when a  volunteer and a prisoner pair together because the prisoner strains to  be pathologically accommodating.&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;/blockquote&gt;To some extent, I let myself fall victim to that this weekend at CitC IV. I still think the inmates that I paired with had good experiences this time, but I would have liked to offer them more. Looking back to my first visit to MCI, I was better pair/coach that day, doing a good job at things like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;meeting the man where he is&lt;/li&gt;&lt;li&gt;inviting him to try things&lt;/li&gt;&lt;li&gt;asking him some questions that he knows the answer to&lt;/li&gt;&lt;li&gt;asking him harder questions so he has to stretch himself to come up with an answer&lt;/li&gt;&lt;li&gt;making small suggestions when he's stuck rather than giving answers&lt;br /&gt;&lt;/li&gt;&lt;li&gt;putting aside my desire to make progress in the code in favor of getting to know my partner a little and facilitating his learning&lt;/li&gt;&lt;/ul&gt;Now that I've spent some time thinking about this, I feel prepared to be the kind of coach/pair that I know I can be at the next CitC. I just wish the institution could accommodate more than one event like this per quarter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-1991819311868191769?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1991819311868191769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/06/coding-in-clink-iv-my-second-coding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1991819311868191769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1991819311868191769'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/06/coding-in-clink-iv-my-second-coding.html' title='Coding in the Clink IV - my second coding retreat at Marion Correctional Institute'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-4894872661918643527</id><published>2011-03-28T00:00:00.003-04:00</published><updated>2011-03-28T00:19:06.765-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeRetreat'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='clink'/><category scheme='http://www.blogger.com/atom/ns#' term='Pillar'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><category scheme='http://www.blogger.com/atom/ns#' term='prison'/><title type='text'>Coding in the Clink - CodeRetreat III at Marion Correctional Institute</title><content type='html'>Since Dan Wiebe  already did a great job of summarizing today's &lt;a href="https://javaguys.wordpress.com/2011/03/27/coding-in-the-clink-iii-another-javaguys-code-retreat-at-mci/"&gt;"Coding in the Clink - III"&lt;/a&gt; CodeRetreat at &lt;a href="https://javaguys.wordpress.com/2011/03/27/coding-in-the-clink-iii-another-javaguys-code-retreat-at-mci/"&gt;Marion Correctional Institute&lt;/a&gt;  (MCI), he suggested I blog specifically about the two sessions I  participated in.&lt;br /&gt;&lt;br /&gt;I paired with Wes in the first cycle. He has  programming experience "on the outside". Not only was he disappointed  that we had to use &lt;a href="http://www.eclipse.org/downloads/moreinfo/java.php"&gt;Eclipse&lt;/a&gt; instead of &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ&lt;/a&gt;,  he was further disheartened that we had to work on a generic  workstation that didn't have his Eclipse template(s) on it. But he got  over all that quickly and we had a blast (and got some work done). Wes  and I were yukking it up so much that another insider asked us to keep  it down. (Wes is known in the group for his loud enjoyment.) Wes did  most of the driving. I mainly suggested ways for the tests to drive the  code and offered ways to break his ideas into smaller TDD steps . Wes  was great about this. He feigned frustration at my suggestions while  making it clear that he appreciated me keeping him "honest". It seemed  to help him take a break from the all-too-common block of "I've already got it designed in my head, how do I write it with tests first?" I did  occasionally contribute to our design, mainly by suggesting tests that I thought  would cause interesting problems. One suggestion I made seemed to lead  us down a rabbit hole, but Wes and I made the best of it by turning it  into real refactoring practice (when our tests were green).&lt;br /&gt;&lt;br /&gt;After our first session, the inside guys and we outsiders pulled our  chairs into a rough circle and discussed the morning. The insiders  really seemed to appreciate the learning that happens in both  directions, even in pairs that have significant skill differences. One  said he liked being a triple because he had the resources and  perspectives of two other programmers instead of just one.&lt;br /&gt;&lt;br /&gt;A quick anecdote about lunch: we were served "brunch" food (eggs,  sausage, English muffin...) and a couple of the insiders made a point to  say that we shouldn't think they eat like this all the time, that this  is a nicer meal than they usually have. And overhearing them, a nearby  corrections officer ("CO", never "guard") answered something like:  "Don't listen to them, this is no better than what they always eat". I'm  not sure what was behind this exchange. It was the only thing I heard the  whole day that could even remotely be taken as playing for sympathy.  Otherwise conversation was just about like what goes on at  CodeRetreats on the outside: insiders asked us about what other  languages we've used, they told us about their past computer experience,  and two told me at lunch about a job they both worked on with a private  company in Arizona from inside MCI. (I tip my hat to those guys -  telephone was the only way they were allowed to communicate with their  civilian colleagues, and one of the colleagues didn't initially want to  work with men in prison.)&lt;br /&gt;&lt;br /&gt;During the second (and last) cycle of the day, I was in a triple with Larry and Dave (I think).  Dave was much more comfortable than Larry, and seemed to have more  experience. This cycle, I was especially aware of being a coach, maybe  because Larry wasn't as quick to see where Dave was going and was less  assertive with his ideas than Dave was. I found myself pulled in two  directions - on the one hand, I was drawing Larry out by asking him to  suggest tests or suggesting that he implement code to make Dave's new  test pass. On the other hand, I wanted to encourage Dave's enthusiasm  and ideas. The conclusion I drew from this cycle is that I think  inexperienced developers probably shouldn't be in triples unless they are very  outgoing and ready to take risks. If I'm coaching someone who is shy or  inexperienced or both, I'd like to be able to give them my full  attention as a paring partner.&lt;br /&gt;&lt;br /&gt;It seemed like everyone, insiders and outsiders, had a great experience. More than one insider spoke of what he learned. We worked about 9:30 to 3, so if you figure we had 30 minutes for lunch, we only had about 5 hours. Most people seemed to think that this was too short a day. Apparently, they usually have until 4:00 but were cut short today because of scheduling of other outside programs.&lt;br /&gt;&lt;br /&gt;Many thanks to Dan, Jo Dee (Dan's "prison boss"), the COs that accommodated us, the insiders and the other six volunteers. I'd very much like to do this again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-4894872661918643527?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/4894872661918643527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/03/coding-in-clink-coderetreat-iii-at.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/4894872661918643527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/4894872661918643527'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/03/coding-in-clink-coderetreat-iii-at.html' title='Coding in the Clink - CodeRetreat III at Marion Correctional Institute'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1562470286884682726</id><published>2011-02-20T16:13:00.005-05:00</published><updated>2011-02-20T16:32:52.205-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><category scheme='http://www.blogger.com/atom/ns#' term='partials'/><category scheme='http://www.blogger.com/atom/ns#' term='gist'/><title type='text'>#RubyOnRails and partial forms</title><content type='html'>I'm working on some exercises in the &lt;a href="http://ruby.railstutorial.org/ruby-on-rails-tutorial-book"&gt;Ruby on Rails Tutorial book&lt;/a&gt;. I noticed a lot of duplication in &lt;a href="https://gist.github.com/836276"&gt;my new and edit views&lt;/a&gt;, so I thought I'd try and make it more &lt;a href="https://secure.wikimedia.org/wikipedia/en/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt;. I knew I'd need a partial, but I hadn't written one for a view yet. &lt;br /&gt;&lt;br /&gt;I'd heard good things about the #RubyOnRails &lt;a href="irc.us.freenode.net"&gt;IRC&lt;/a&gt; channel, so now was a good time to try it out. I had to download an IRC client for my MacBook, and chose &lt;a href="http://colloquy.info/"&gt;Colloquy&lt;/a&gt;. In almost no time, I got enough help to implement my partial. (If you aren't familiar with it in Rails 3, you can see my solution &lt;a href="https://gist.github.com/836250"&gt;here&lt;/a&gt;.) I don't know why it tripped me up so much. I finally got the second argument right in the form_for correct and used it as a local variable in the submit line so that the button has the right text. And all my rspec tests pass.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-1562470286884682726?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1562470286884682726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/02/rubyonrails-and-partial-forms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1562470286884682726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1562470286884682726'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/02/rubyonrails-and-partial-forms.html' title='#RubyOnRails and partial forms'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1509576415861148790</id><published>2011-02-20T15:43:00.006-05:00</published><updated>2011-02-20T16:33:09.368-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pastie'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='gist'/><title type='text'>gist vs pastie</title><content type='html'>I started another post (which I'll finish at another time) about using the RoR channel on IRC to get help with creating a form partial to eliminate duplication in my new and edit forms. I started writing about &lt;a href="http://gist.github.com/"&gt;gist&lt;/a&gt;, saying it was like &lt;a href="http://pastie.org/"&gt;Pastie&lt;/a&gt;, and then I started looking at the difference between the two. There are enough similarities and differences to be worth an entire post, so here it is.&lt;br /&gt;&lt;br /&gt;Gist is associated with your &lt;a href="https://github.com/"&gt;github &lt;/a&gt;account. Gist allows public and private pastes. Other gist users can clone or fork your code using a url that is created for each paste.&lt;br /&gt;&lt;br /&gt;Pastie doesn't require a login, so it's nice for quick-and-dirty. Pastie claims to have a &lt;a href="http://pastie.org/help/#bot"&gt;bot&lt;/a&gt; that you are supposed to be able to access right inside IRC. You send it a public message, it private messages you a link, you click the link, paste your code, click OK and the bot is supposed to announce the link to your paste to the channel. Unfortunately, I'm told it's never worked.&lt;br /&gt;&lt;br /&gt;Pastie does have a nice feature for Rails developers &lt;del&gt;that gist does not&lt;/del&gt;: Ruby on Rails syntax highlighting. Apparently &lt;a href="http://blog.pastie.org/2009/09/pastie-learns-c.html"&gt;it has C# syntax highlighting&lt;/a&gt; too, but it's only mentioned in the &lt;a href="http://blog.pastie.org/"&gt;blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I plan to stick with gist for now, because of its connection to guthub.&lt;br /&gt;&lt;br /&gt;EDIT: I didn't realize that gist not-only has syntax highlighting for &lt;span style="font-style:italic;"&gt;lots&lt;/span&gt; of languages, it will auto-detect based on the filename extension that you give your paste (for example, &lt;a href="https://gist.github.com/836250"&gt;this partial&lt;/a&gt; that I will discuss in my next post.) Now I'll stay with gist for sure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-1509576415861148790?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1509576415861148790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/02/gist-vs-pastie.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1509576415861148790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1509576415861148790'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/02/gist-vs-pastie.html' title='gist vs pastie'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-5321468696797987470</id><published>2011-02-04T23:10:00.006-05:00</published><updated>2011-02-20T16:29:32.010-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='reflector'/><title type='text'>Success with Reflector.NET</title><content type='html'>&lt;p style="color: rgb(0, 0, 0);" class="mobile-photo"&gt;At my day job, we had a custom application in the field, a one-off, that a long-time customer  had recently requested an important change for. The trouble was that we didn't  seem to have source for it, and no one could remember who in our company had written  it. All we knew was roughly when it was written (a few years ago) and  that it was probably written with C#.NET.&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0);" class="mobile-photo"&gt;So I ran &lt;a href="http://www.red-gate.com/"&gt;RedGate&lt;/a&gt;'s &lt;a href="http://www.red-gate.com/products/dotnet-development/reflector/"&gt;.NET Reflector&lt;/a&gt; on the hope of maybe getting some usable  source code. I'd poked around inside assemblies before, but I'd never disassembled an executable to generate code. My hopes were exceeded - I have a very usable C# project  now, with meaningful method names and so on! Here's how I did it (I'm  sure this story has been countless times, but I enjoyed doing it, so I'm  presenting my experience.)&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0);" class="mobile-photo"&gt;I launched .NET Reflector and it asked me to pick a .NET framework to load default assemblies from, but I just clicked Cancel. File | Open ..., browse to my application, click open. After briefly poking around inside my app, I clicked my .exe in the tree and selected Tools | Disassemble, making sure that C# was selected in the language combo box on the toolbar. Then Tools | Export. Reflector wrote out a couple .cs files (Global.cs and AssemblyInfo.cs) and then prompted me for the location of an assembly that it could not locate. Fortunately, the field engineer had included that assembly with when he gave me the executable to experiment on. So I browsed to the assembly and clicked OK.&lt;br /&gt;&lt;/p&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;   (Side note: I'm actually writing about this as I repeat the process at home, for a second time, from scratch. I hadn't taken sufficient notes at work to be able to write this post. The first time I did this, I skipped the step telling Reflector about the assembly. What that cost me was that while this second time reflector knew about the enums that were defined in the DLL, it didn't the first time. I had to find them by inspecting the method prototypes, using DevStudio's object browser, reading error messages in the code, and knowing generally what the app was supposed to do. It wasn't a lot of extra work, and I enjoyed my sleuthing but I'm glad to know that Reflector can do it for me.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Reflector went on to write a Form1.cs, two .cs files that I recognized as containing functions common to many of my company's products, a .resources file, and a .csproj file. Things were starting to look good.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;The .csproj opened fine in Visual Studio 2003. The first thing I noticed was that even though I had told Reflector where the referenced assembly was, the reference to it in the project was wrong, so I easily fixed that. Next I opened Form1.cs and was welcomed with the familiar WinForm layout of the app I had started with. Crossing my fingers, I started  the solution building. 74 build errors, but many of those were duplicates. This might not be too bad.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;There were ten or more errors of the form:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    'System.Environment.CurrentDirectory.get': cannot explicitly call operator or accessor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;on lines like this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    string str = Environment.get_CurrentDirectory();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;That's not the model that .NET uses for getters! Changing the line to:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    string str = Environment.CurrentDirectory;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;got it to compile without even a warning. There were also setter lines I had to fix, like this:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    Environment.set_CurrentDirectory(WorkingDirectory);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;which became:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    Environment.CurrentDirectory = WorkingDirectory;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;And then there were the lines that looked to be assigning delegates:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;objFMon.add_ReceiveCodes2(new __CCodeMonitor_ReceiveCodes2EventHandler(this.objFMon_ReceiveCodes2));&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;which I fixed in this way:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    objFMon.ReceiveCodes2 += (new __CCodeMonitor_ReceiveCodes2EventHandler(objFMon_ReceiveCodes2));&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Another example of this type of error was was:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    FAULT_CODE fault_code = this.m_aryFaultCodes.get_Item(i);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;which became:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    FAULT_CODE fault_code = (FAULT_CODE) m_aryFaultCodes[i];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;There were about 25 errors of the form:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:78%;" &gt;&lt;span style="font-family:courier new;"&gt;     Method 'MyApplication.Form1.Form1_Load(object, System.EventArgs)' referenced without parentheses&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;that referred to a line like:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    btnAck.Click += new EventHandler(this, this.btnAck_Click);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;I changed that one to:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    btnAck.Click += new EventHandler(btnAck_Click);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;I'm not sure what inspired me to think that the signiature was wrong except, perhaps, the vague feeling that the handler already knows that I'm giving it a method on 'this'.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Including all the delegates, there were about a dozen that I fixed by changing them from the function style to the property style.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Interestingly, Reflector didn't do a great job getting the number type right on a value given to a switch statement. I got this error:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    A value of an integral type expected&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;on the first line of this &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;switch&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; statement:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;                    switch (num2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                        &lt;/span&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;case -1f:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                            &lt;/span&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;base.WindowState = FormWindowState.Minimized;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                               &lt;/span&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;goto Label_0474;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                        &lt;/span&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;case 0f:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                            &lt;/span&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;base.WindowState = FormWindowState.Normal;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                            &lt;/span&gt;&lt;/span&gt;  &lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;goto Label_0474;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                    }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;because num2 was a &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;float&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;. Notice that Reflector added "f" after the integer values in the &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;case&lt;/span&gt; lines. Searching upward in the code, there didn't seem to be any reason for num2 to need to be a &lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;float&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;, so I changed it to an &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;int&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; and got rid of the "f"s. I had to do this for a second &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;switch&lt;/span&gt; statement as well.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;It wasn't hard to figure out that I had to cast several returns from &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;ResourceManager.GetObject&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; as &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;Image&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; or &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;Icon&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; as in this case:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    base.Icon = (Icon) manager.GetObject("$this.Icon");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;  The following line called a function familiar to me, with my company's &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;SpecialRead&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; function. I knew that returning zero was a success code, so I was confident that I could replace &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;null&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; with &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:78%;" &gt;&lt;span style="font-family:courier new;"&gt;    if (SpecialRead(specialHandle, ref retValue, ref this.retLength, this.lenBufferInt16) == null)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;There were 10 or 11 of those that I fixed.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;This error had me stumped briefly:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:78%;" &gt;&lt;span style="font-family:courier new;"&gt;    Resources 'MyApplication.Form1.resources' and 'MyApplication\Form1.resx' have the same manifest resource name &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;'MyApplication.Form1.resources'.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;But after a brief trip out to google, I decided to try deleting the .resources file. That seemed to do the trick. So with the compile and link errors gone, I cautiously pressed F5. I was disappointed when I got:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:78%;"  &gt;    An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in MyApplication.exe&lt;br /&gt; Additional information: COM object with CLSID {XXXXXXXX-YYYY-ZZZZ-MMMM-NNNNNNNNNNNN} is either not valid or not registered.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;I was missing a COM object that needed to be registered.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;So I took what I had built to the original engineer. His laptop was fully configured to run the product. Sure enough, my app ran successfully on his laptop. He sent it off to the customer to see that it runs the same in the field as the original. If it does, then I'll make the original requested change.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;UPDATE&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: After we shipped the executable I built, another engineer found the original source code, in a remote, nearly neglected corner of our version control system. It's possible that the code in version control is not as current as the (now lost) code that was used to build the original exe I was given. So my next task will be to compare the two sets of source and see if I can determine if one is newer that the other&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-5321468696797987470?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/5321468696797987470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/02/success-with-reflectornet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/5321468696797987470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/5321468696797987470'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/02/success-with-reflectornet.html' title='Success with Reflector.NET'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1376059112984809869</id><published>2011-01-25T22:02:00.008-05:00</published><updated>2011-02-20T16:33:26.379-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeRetreat'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>I'm hot on Rails, git, and CodeRetreat</title><content type='html'>Now that I'm back from &lt;a href="http://www.codemash.org/"&gt;CodeMash&lt;/a&gt;, where I attended an overview session called "Rails 3 from A to Z", I'm excited about taking a deeper dive into Rails. My first exposure to Ruby was the excellent &lt;a href="http://rubykoans.com/"&gt;Ruby Koans&lt;/a&gt; PreCompiler session at CodeMash 2010. I didn't complete all the koans at that session, and I didn't follow up and finish them afterward (although I was bitten again by the koan bug when I helped Dianne work on her &lt;a href="http://www.srtsolutions.com/codemash-recap-scala-koans-precompiler"&gt;Scala Koans&lt;/a&gt; &lt;a href="http://codemash.org/Sessions#PreCompiler%3a+Scala+Koans"&gt;PreCompiler session&lt;/a&gt; during &lt;a href="http://www.srtsolutions.com/4-more-weeks-of-six-weeks-of-scala"&gt;Six Weeks of Scala&lt;/a&gt;), but now that I've completed &lt;a href="http://railsforzombies.org/"&gt;Rails for Zombies&lt;/a&gt;, I'm totally going to go back and finish the ruby koans. Maybe before that, I'll finish another Ruby tutorial I started, &lt;a href="http://tryruby.org/"&gt;TryRuby.org&lt;/a&gt;. It leads you through lessons and has you enter your answers at a command prompt.  After that, I will probably go on to &lt;a href="http://railstutorial.org/"&gt;RailsTutorial.org&lt;/a&gt; (as recommended at the end of Rails for Zombies.) They have a free tutorial book online and they sell a pdf version and tutorial screencasts.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And after &lt;i&gt;that&lt;/i&gt;, I've found a series of interesting articles on programming Rails on Apple's website:&lt;/div&gt;&lt;div&gt;- &lt;a href="http://developer.apple.com/tools/rubyonrails.html"&gt;Using Ruby on Rails for Web Development on Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;- &lt;a href="http://developer.apple.com/library/mac/#featuredarticles/CustomizeRails/"&gt;Customizing Rails Applications on Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div&gt;- &lt;a href="http://developer.apple.com/tools/deployonrailsleopard.html"&gt;Deploying Rails Applications on Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;And somewhere among all that, I'll want to learn the &lt;a href="http://dev.twitter.com/doc"&gt;Twitter API&lt;/a&gt;, as I have an idea for a site related to Twitter.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another CodeMash 2011 &lt;a href="http://codemash.org/Sessions#PreCompiler%3a+Git+Immersion+(Half+day+afternoon)"&gt;session&lt;/a&gt; that I've taken to heart is the awesome &lt;a href="http://gitimmersion.com/"&gt;Git Immersion&lt;/a&gt;. While my department at work uses Subversion, I've started keeping my experiments in a git repository. And since so Ruby (and other projects) use git and/or &lt;a href="https://github.com/"&gt;github&lt;/a&gt;, it will be good to be familiar with git.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And finally, I'll be attending the &lt;a href="http://coderetreat.ning.com/events/2nd-anniversary-coderetreat"&gt;2nd Anniversary CodeRetreat in Ann Arbor&lt;/a&gt; this Saturday, Jan 29. This will be number 5 for me. Come join us!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&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/3412076207393035593-1376059112984809869?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1376059112984809869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2011/01/im-hot-on-rails-git-and-coderetreat.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1376059112984809869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1376059112984809869'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2011/01/im-hot-on-rails-git-and-coderetreat.html' title='I&apos;m hot on Rails, git, and CodeRetreat'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-9094327199178809105</id><published>2010-12-04T09:42:00.003-05:00</published><updated>2011-09-09T20:35:18.723-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='feedback'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>On Giving Useful Feedback</title><content type='html'>Successful agile teams do well, in part, because of the types and amount of communication they use. One place where communication is most important and comes with significant risk is giving "constructive criticism" or "corrective" feedback. I've noticed two patterns of feedback that don't work well: indirect or soft feedback,  focused on not hurting the recipient's feelings and unnecessarily frank, or even blunt feedback given with little regard for the recipient's feelings. The first pattern tends to communicate insufficient information and the second pattern, while containing full information, is not presented in a manner that that is often met with defensiveness.&lt;br /&gt;&lt;br /&gt;A friend told me about a pattern of giving feedback that I think does a good job of avoiding the pitfalls of the first two patterns. I didn't ask him where he learned it, and I could only find one reference to it: http://bit.ly/dEwGw4 The pattern is called "what-what-why" and it works like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tell &lt;span style="font-style: italic;"&gt;what&lt;/span&gt; you didn't/don't like or &lt;span style="font-style: italic;"&gt;what&lt;/span&gt; you think didn't/doesn't work well&lt;/li&gt;&lt;li&gt;Tell &lt;span style="font-style: italic;"&gt;what&lt;/span&gt; you would like instead&lt;/li&gt;&lt;li&gt;Tell &lt;span style="font-style: italic;"&gt;why&lt;/span&gt; you think your suggestion would be more effective&lt;/li&gt;&lt;/ul&gt;For example:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I don't like how our team is spread out and in individual cubicles&lt;/li&gt;&lt;li&gt;I'd like it if we moved into one room and sat at a cluster of tables&lt;/li&gt;&lt;li&gt;We'd "overhear" important information and there would be fewer barriers to asking each other questions.&lt;/li&gt;&lt;/ul&gt;Or:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;One thing that didn't work for me in the retrospective was when you would say something before someone else was finished speaking&lt;/li&gt;&lt;li&gt;I'd like it if you allow other people to finish their point and then add yours&lt;/li&gt;&lt;li&gt;I think the meeting would flow more smoothly and everyone would that they would get their chance to be fully heard.&lt;/li&gt;&lt;/ul&gt;There are a couple things I really like about giving feedback this way. First, it makes it clear that this is what &lt;span style="font-style: italic;"&gt;I&lt;/span&gt; don't like and what &lt;span style="font-style: italic;"&gt;I&lt;/span&gt; want instead. If I were to instead say: "You know, it might be better if you let people finish their point..." or "Don't interrupt people...", I'm not really owning that this feedback is coming from &lt;span style="font-style: italic;"&gt;me&lt;/span&gt;. Second, it focuses on the desired benefit instead of focusing on anything about the person, making it less likely that they will take what I am saying personally and become defensive. And finally, I don't have to spend a lot of time thinking about how I am going to give feedback or worry much about how the person might take it. As soon as I see something that I'd like to be different, I can give the what-what-why and address the issue right away. This is great because communication is most effective when it happens early.&lt;br /&gt;&lt;br /&gt;I recognize, however, that not all feedback is intended to cause a different outcome. Sometimes someone is doing something that I like or that I think is working well and I want to let that person know. In that situation, I use a "what-why" pattern:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tell &lt;span style="font-style: italic;"&gt;what&lt;/span&gt; you like/liked or &lt;span style="font-style: italic;"&gt;what&lt;/span&gt; you think works/worked well&lt;/li&gt;&lt;li&gt;Tell &lt;span style="font-style: italic;"&gt;why&lt;/span&gt; you like it or think it works well&lt;/li&gt;&lt;/ul&gt;For instance:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;On the story wall, I like how you've given each team member a tag that they can put on the story that they are working on.&lt;/li&gt;&lt;li&gt;Not only does it let everyone know what everyone else is working on, but it's a good way of reminding people to only work on one story at a time.&lt;/li&gt;&lt;/ul&gt;Like what-what-why, this pattern lets me own that this is my viewpoint, it focuses on the process and outcome rather than the person, and it's a template that lets me communicate as soon as I recognize that I want to.&lt;br /&gt;&lt;br /&gt;If you try what-what-why or what-why, I'd be interested to hear your results. Do you have similar feedback patterns that you find useful?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-9094327199178809105?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/9094327199178809105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2010/12/on-giving-useful-feedback.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/9094327199178809105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/9094327199178809105'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2010/12/on-giving-useful-feedback.html' title='On Giving Useful Feedback'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1842730353822505484</id><published>2010-10-24T16:57:00.012-04:00</published><updated>2010-10-24T18:55:39.812-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='1devday'/><category scheme='http://www.blogger.com/atom/ns#' term='certification'/><title type='text'>Another Thought on Certification</title><content type='html'>Yesterday at &lt;a href="http://sites.google.com/site/1devday/"&gt;1DevDayDetroit&lt;/a&gt;, &lt;a href="http://www.virenderajmani.com/"&gt;Virender Ajmani&lt;/a&gt; gave a very interesting talk about Google Map mashups. (If you missed his talk, check out his &lt;a href="http://blog.mibazaar.com/"&gt;blog&lt;/a&gt; or download his &lt;a href="http://mibazaar.com/1DevDayDetroit.ppt"&gt;slides&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Besides his very interesting content, he mentioned something that else that caught my attention - the &lt;a href="http://code.google.com/qualify/faq.html"&gt;Google Qualified Developer program&lt;/a&gt;. It's a different approach to the question of developer certification (which I know is a hot topic in the Agile world in general and at the &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/certification?pli=1"&gt;Agile Skills Project&lt;/a&gt; in particular). Google's program is free, and it focuses on accomplishments, references, community participation, and knowledge. If you become certified, you get a badge for your blog.&lt;br /&gt;&lt;br /&gt;To be certified in a particular Google API (Chrome extensions, Maps, etc.), a developer must earn at least 3000 of the available 5000 points towards that API  in any. She/he can earn points in the following ways:&lt;br /&gt;- showing proof of their work (working code) - up to 1000 points&lt;br /&gt;- providing references (from paying clients) - up to 1000 points&lt;br /&gt;- demonstrate community participation - up to 1000 points&lt;br /&gt;- take the online exam - up to 2000 points&lt;br /&gt;&lt;br /&gt;What I like about this approach is that no one type of mastery is enough to earn certification. For instance, a developer who aces the exam can not be certified without other evidence of their competence.&lt;br /&gt;&lt;br /&gt;I wonder what an Agile badge in this style would be like.&lt;br /&gt;&lt;br /&gt;There are already Scrum exams. Perhaps taking one of them would earn some points. There would be a cap on how many points could be earned through exams, and exam points might expire after a certain time.&lt;br /&gt;&lt;br /&gt;I'm not sure how working code is necessarily any indication of someone's skill in Agile, so I think we'd have to come up with something else.&lt;br /&gt;&lt;br /&gt;Attending certain classes might be worth points. I know there's been a lot of talk about how taking a class doesn't necessarily mean a person learned anything, and I agree. So perhaps any given class would be only worth a small amount, say 200-300 points, and it would only count if you had taken the course in the past year, and only 1000 points could be earned by attending classes.&lt;br /&gt;&lt;br /&gt;Certainly some Agile developers could provide references from customers, and capping the number of points from references would reduce the chance and affect of quid pro quo referrals. Developers who don't have professional references could earn their points in some of the other ways.&lt;br /&gt;&lt;br /&gt;And maybe &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/quests/read-a-book"&gt;book quests&lt;/a&gt; or webinar quests could provide a few points, perhaps with a fairly low cap.&lt;br /&gt;&lt;br /&gt;I know there's a non-trivial amount of administration that would be required to manage a program like this. Please join the discussion on the &lt;a href="http://groups.google.com/group/agile-developer-skills/browse_thread/thread/787e62438684822c"&gt;Agile Skills Project Google Group&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-1842730353822505484?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1842730353822505484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2010/10/another-thought-on-certification.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1842730353822505484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1842730353822505484'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2010/10/another-thought-on-certification.html' title='Another Thought on Certification'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-7515868449421695323</id><published>2010-09-08T23:16:00.005-04:00</published><updated>2011-02-20T16:34:15.914-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='class'/><category scheme='http://www.blogger.com/atom/ns#' term='certification'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Scrum Developer Certification is Now Real</title><content type='html'>Just over a week ago, I got the following email from Chet Hendrickson:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Hello ADS Course Participants,&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;The&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; mechanism &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;for&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;applying&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;for&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;the&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;Scrum&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;Alliance&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;Scrum&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Developer Certification is now available.  &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;The&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; Agile Developer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Skills course you took with us satisfies &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;the&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; Basic Developer Skills&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  portion of &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;the&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; certification requirement.  If you also hold a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Certified ScrumMaster (CSM) certification you may now apply &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;for&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;the&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  CSD.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style=";font-family:courier new;font-size:85%;" class="il"  &gt;The&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; application can be found at:&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: courier new;" href="http://www.scrumalliance.org/resources/1809" target="_blank"&gt;http://www.scrumalliance.org/&lt;wbr&gt;resources/1809&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So whatever your view about the value of certification, it's happening. As for me, I'm not a CSM, so I won't be applying for a CSD any time soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-7515868449421695323?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/7515868449421695323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2010/09/scrum-developer-certification-is-now.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/7515868449421695323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/7515868449421695323'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2010/09/scrum-developer-certification-is-now.html' title='Scrum Developer Certification is Now Real'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-6431893180515289264</id><published>2010-05-19T00:46:00.007-04:00</published><updated>2011-02-20T16:31:00.851-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSD'/><category scheme='http://www.blogger.com/atom/ns#' term='class'/><category scheme='http://www.blogger.com/atom/ns#' term='certification'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Thoughts on my experiences at the second Scrum Alliance CSD course.</title><content type='html'>Dave Nicolette recently &lt;a href="http://dnicolet1.tripod.com/agile/index.blog/2020614/looking-back-on-the-first-certified-scrum-developer-course/"&gt;blogged&lt;/a&gt; about how he has joined the ranks of the Certified Scrum Developers, by being a CSM and completing the Scrum Alliance CSD course taught in Cleveland by Ron Jeffries and Chet Hendrickson. I took the same course one week later in Ann Arbor. Unlike Dave, I'm not a CSM yet, so I don't qualify as a Certified Scrum Developer - I'm not going to weigh in on the pros and cons of "certification".&lt;br /&gt;&lt;br /&gt;Even though the CSM was offered the two days immediately before the CSD course, I chose to only take the CSD course right now. My current focus is on improving my development skills, and the CSD course fits right in with that. It was a great opportunity to practice TDD, Pair Programming, and Scrum under Ron and Chet's observing eyes.&lt;br /&gt;&lt;br /&gt;Unlike the Cleveland class, the Ann Arbor only had a few "known" participants. Present were &lt;a href="http://c2.com/cgi/wiki?RichGarzaniti"&gt;Rich Garzaniti&lt;/a&gt;, a long-time eXtreme Programmer and member of the Chrysler Comprehensive Compensation project (C3) and &lt;a href="http://c2.com/cgi/wiki?RichGarzaniti"&gt;Nayan Hajratwala&lt;/a&gt;, agile and lean coach and speaker. &lt;a href="http://srtsolutions.com/public/blog/243891"&gt;Dianne Marsh&lt;/a&gt;, co-founder of SRT Solutions, was also present, although she does not specifically focus her work on agile. The rest of us are seasoned developers with agile experience that ranged from never having done TDD to actively learning TDD outside of work and in the early stages of trying to introduce small agile practices into their workplace. I'm a long-time developer, involved in the &lt;a href="http://agileskillsproject.org/"&gt;Agile Skills Project&lt;/a&gt;, a rabid &lt;a href="http://coderetreat.ning.com/"&gt;Code Retreat&lt;/a&gt; attendee, but I have little agile experience on the job.&lt;br /&gt;&lt;br /&gt;Like the Cleveland class, we had difficulty with infrastructure that held us back, and as Dave said, that's not unexpected. Still, one team spent basically an entire 4-hour iteration (the course only scheduled 3 iterations in all) on infrastructure problems. The team I was on only spent half of an iteration on infrastructure problems (Without Nayan's familiarity with Maven, Hudson, Eclipse, and FitNesse, I suspect it would have also taken us a whole iteration too). In our class retrospective, we decided that there was some merit in having infrastructure issues as part of the class, as it gives a taste of what it really takes to set up tools for an agile project. We also decided that whatever steps are taken to reduce such issues, there will always be some, and they may provide enough learning.&lt;br /&gt;&lt;br /&gt;In contrast to Ron's assessment that the Cleveland class produced the least results he'd ever seen (the CSD course is based on Ron &amp;amp; Chet's ADS course), Ron said that we, the Ann Arbor class produced the most "done" code he'd ever seen. In Dave's blog post, he gives an extended analysis of his class's results. I won't be discussing our results in that level of detail. Briefly, I attribute our success to having executed agile practices well. Here is a list of some things I think we did well:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sprint planning meetings that involved a PO&lt;/li&gt;&lt;li&gt;TDD that focused on results and had a good balance of strong assertions and deferring to the other partner&lt;/li&gt;&lt;li&gt;Frequent Pair Rotation&lt;/li&gt;&lt;li&gt;Communication between pairs&lt;/li&gt;&lt;li&gt;Hourly Standup Meetings (remember, iterations were 4 hours)&lt;/li&gt;&lt;li&gt;Retrospectives that produced actual to-do items for improving our process&lt;/li&gt;&lt;li&gt;Doing the things from our retrospectives that we said we'd do&lt;/li&gt;&lt;li&gt;Lots of time with Ron &amp;amp; Chet as POs.&lt;/li&gt;&lt;/ul&gt;While we certainly were not immune from making assumptions about stories, we did ask a lot of questions about the cards during our planning meetings. When the Ron or Chet gave high priority to stories that we thought would take a lot of time, we suggested other stories that we thought would generate some value more quickly or we requested that some stories be split. We were conservative with our commitments.&lt;br /&gt;&lt;br /&gt;Additionally, I think the goals the Ann Arbor participants had for the class were well suited to creating "done" stories. While I think Rich and Nayan wanted to refine their already strong agile craft,  the rest of us seemed to be experienced developers who either want to become agile or to become &lt;span style="font-style: italic;"&gt;more&lt;/span&gt; agile. While Nayan seemed to play a dual role as contributing developer and coach on my team, I think we all took responsibility for delivering quality results and improving our process.&lt;br /&gt;&lt;br /&gt;All of that is not to say that we didn't have our share of problems. We realized late in the course that we would have saved some time talking in circles if we had drawn simple design ideas on a white board. Additionally, my team might have been able to show more value to the POs if we had implemented fewer file operations and left IO as an abstraction. In our code review, our team found some early design decisions that would have caused difficulties later, were we to have continued developing the product.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There's an old saw that says we learn more from failure than we do from success. That feels true for me regarding this course. I'm struggling to find any real "gems" of learning. For me, the biggest benefit of the course was the practicing - practicing  technical tasks and practicing improving our process. Since I don't pair at my current job, the course gave me a good chance  to look at how I pair and think about ways that I can be a better pair.  And I did learn to use FitNesse and Hudson, which I had not used before.&lt;br /&gt;&lt;br /&gt;And finally, I left the class with a renewed hope for our profession and my career. Being in a class of developers who seem really committed to delivering value and improving their craft was tonic for the pain and exasperation that I've experienced  in past projects that had all the classic failures.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-6431893180515289264?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/6431893180515289264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2010/05/thoughts-on-my-experiences-at-second.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/6431893180515289264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/6431893180515289264'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2010/05/thoughts-on-my-experiences-at-second.html' title='Thoughts on my experiences at the second Scrum Alliance CSD course.'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-4218884517632764401</id><published>2010-03-29T21:39:00.007-04:00</published><updated>2010-03-29T23:13:42.200-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeRetreat'/><category scheme='http://www.blogger.com/atom/ns#' term='BDD'/><category scheme='http://www.blogger.com/atom/ns#' term='JBehave'/><category scheme='http://www.blogger.com/atom/ns#' term='Conway&apos;s Game of Life'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>My Venture into JBehave via Conway's Game of Life</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;Having used &lt;a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"&gt;Conway's Game of Life&lt;/a&gt; (CGoL) at several &lt;a href="http://coderetreat.ning.com/"&gt;CodeRetreat&lt;/a&gt;s&lt;span style="font-size:78%;"&gt;*&lt;/span&gt; to practice &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;Test Driven Design (TDD)&lt;/a&gt;, I thought I would revisit it when I took my first steps into &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"&gt;Behavior Driven Development (BDD)&lt;/a&gt; with &lt;a href="http://jbehave.org/"&gt;JBehave&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I downloaded JBehave 2.5 and refreshed my memory of the GoL rules:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Any live cell with fewer than two live neighbours dies, as if caused by underpopulation.&lt;/li&gt;&lt;li&gt;Any live cell with more than three live neighbours dies, as if by overcrowding.&lt;/li&gt;&lt;li&gt;Any live cell with two or three live neighbours lives on to the next generation.&lt;/li&gt;&lt;li&gt;Any dead cell with exactly three live neighbours becomes a live cell.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;What I love about using GoL for learning BDD is that the rules are practically already written as Given-When-Then scenarios. Just minor tweaks (including changing to the US spelling of neighbor) gave me:&lt;ol&gt;&lt;li&gt;Given a live cell with fewer than two live neighbors, Then the cell is dead.&lt;/li&gt;&lt;li&gt;Given a live cell with more than three live neighbors, Then the cell is dead.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Given a live cell with two or three live neighbors, Then the cell is dead.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Given a dead cell with exactly three live neighbors, Then the cell is alive.&lt;/li&gt;&lt;/ol&gt;All that's missing is a "When". All 4 rules have the same "When", which is "When I calculate the next generation". Taking that into account, I get:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Given a live cell with fewer than two live neighbors, When I calculate the next generation, Then the cell is dead.&lt;/li&gt;&lt;li&gt;Given a live cell with more than three live neighbors, When I calculate the next generation, Then the cell is dead.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Given a live cell with two or three live neighbors, When I calculate the next generation, Then the cell is dead.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Given a dead cell with exactly three live neighbors, When I calculate the next generation, Then the cell is alive.&lt;/li&gt;&lt;/ol&gt;Since any given rule could only have 9 different cases (0-8 alive neighbors) I decided that, rather than deal with the logic of "less than"/"fewer than"/"exactly", I would spell out every specific condition that meets a rule.&lt;br /&gt;&lt;br /&gt;JBehave expects scenarios to have separate lines for Given, When, and Then. Rule #1 can be completely expressed as:&lt;br /&gt;&lt;br /&gt;Scenario:&lt;br /&gt;Given Rule &lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;: &lt;span style="font-weight: bold;"&gt;alive&lt;/span&gt; cell with &lt;span style="font-weight: bold;"&gt;0 &lt;/span&gt;neighbors&lt;br /&gt;When I calculate the next generation&lt;br /&gt;Then the cell should be &lt;span style="font-weight: bold;"&gt;dead&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Scenario&lt;br /&gt;Given Rule &lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;: &lt;span style="font-weight: bold;"&gt;alive&lt;/span&gt; cell with &lt;span style="font-weight: bold;"&gt;0 &lt;/span&gt;neighbors&lt;br /&gt;When I calculate the next generation&lt;br /&gt;Then the cell should be &lt;span style="font-weight: bold;"&gt;dead&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've written the variables in the scenario in bold here. That will become more clear later. I inserted "Rule &lt;span style="font-weight: bold;"&gt;1&lt;/span&gt;" into the given just to make it easier to know what rule I'm on when a scenario fails.&lt;br /&gt;&lt;br /&gt;I wrote scenarios for every condition for all 4 rules (it came out to 18) and put them in a file named "i_can_calculate_the_next_generation". JBehave requires scenarios be named all lower case with words separated by underscores. You can see all the scenarios and all the source code in my &lt;a href="http://github.com/JeffHoover/BDD-with-JBehave---Conway-s-Game-of-Life"&gt;github repo for this project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(If you're a Windows developer and you don't like the idea of files without extensions, I found a &lt;a href="http://codingbone.wordpress.com/2009/12/16/building-a-simple-project-using-behavior-driven-development-with-jbehave/"&gt;blog post&lt;/a&gt; that showed a customization that allowed JBehave to read ".scenario" files instead of files with no extension, but I decided not to bother with that for this first experiment.)&lt;br /&gt;&lt;br /&gt;Once I have my scenarios written, it's time to code. JBehave requires that the class corresponding to the scenarios be the same words, but camel-case, and without underscores, so I created ICanCalculateTheNextGeneration.java&lt;br /&gt;&lt;br /&gt;The entire class is:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;import org.jbehave.scenario.Scenario;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public class ICanCalculateTheNextGeneration extends Scenario {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    public ICanCalculateTheNextGeneration(){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        super(new RuleEngineSteps());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;Now for the meat of the code, starting with the implementation of RuleEngineSteps:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    @Given("Rule $ruleNum: $aliveVal cell with $aliveCount neighbors")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    public void aliveOrDeadCellWithPossiblySomeAliveNeighbors(int ruleNum, String initialLiveState, int numberOfAliveNeighbors){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   ruleEngine = new ConwayRuleEngine();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   cell = new Cell(initialLiveState.equals("alive"), numberOfAliveNeighbors);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    @When ("I calculate the next generation")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    public void iCalculateTheNextGeneration()&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   ruleEngine.CalculateTheNextGeneration(cell);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    @Then ("the cell should be $resultingAliveState")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    public void theCellShouldBe(String expectedAliveState)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   String actualAliveState = "alive";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   if (!cell.isAlive()){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   actualAliveState = "dead";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   }&lt;/span&gt;&lt;br /&gt;                 &lt;span style="font-family: courier new;"&gt;Assert.assertEquals(expectedAliveState, actualAliveState);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Look for a moment at how variables are used between the scenarios and the code. Remember I had:  "Then the cell should be &lt;span style="font-weight: bold;"&gt;dead&lt;/span&gt;"? Look at the corresponding @Then in the code:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;@Then ("the cell should be $resultingAliveState")&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    public void theCellShouldBe(String expectedAliveState)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Whatever I want as variable in the scenario, for example &lt;span style="font-weight: bold;"&gt;dead&lt;/span&gt; above, I name a variable starting with "$" in the attribute line and use the same name (without "$") as the parameter to the method.&lt;br /&gt;&lt;br /&gt;Cell.java is basically only setters and getters. ConwayRuleEngine.java is where the business logic lives (Excuse the pun). Initially, &lt;span style="font-family:courier new;"&gt;CalculateTheNextGeneration()&lt;/span&gt; will do nothing.&lt;br /&gt;&lt;br /&gt;When I run ICanCalculateTheNextGeneration.java as a JUnit test in Eclipse. I get a red bar. In the console I see:&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;(i_can_calculate_the_next_generation)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Scenario: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Given Rule 1: alive cell with 0 neighbors&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;When I calculate the next generation&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Then the cell should be dead (FAILED)&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;and other failures. All that's left is the implementation of the business logic, which I'll leave as an exercise for you. (Or you can look at &lt;a href="http://github.com/JeffHoover/BDD-with-JBehave---Conway-s-Game-of-Life"&gt;my code&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Once I got my code working, I refactored it. I've tried to reduce duplication and make the code very clean. I'd appreciate any comments you have.&lt;br /&gt;&lt;br /&gt;Finally, I invite you to check out the &lt;a href="http://agileskillsproject.org/"&gt;Agile Skills Project&lt;/a&gt;, a non-commercial, community-based project which aims to establish a common baseline of the skills an Agile developer needs to have, skills possibly including TDD and BDD.&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;&lt;span style="font-size:85%;"&gt;*A plug for &lt;a href="http://coderetreat.ning.com/"&gt;CodeRetreat&lt;/a&gt; if you're not familiar with it: &lt;a href="http://patrickwilsonwelsh.com/"&gt;Patrick Welsh&lt;/a&gt; and &lt;a href="http://www.coreyhaines.com/"&gt;Corey Haines&lt;/a&gt; have created a kind of one-day coding dojo that gives software developers who want to improve their craft a chance to practice agile skills like Pair Programming and TDD. We do 40 minute iterations on Conway's Game of Life, have mini-retrospectives, throw out our code before the next iteration, and have a retrospective of the whole event at the end of the day. CodeRetreats have been held in Java and Ruby (that I know of) and in several countries. If you haven't been to one, I encourage you to go to one.&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-4218884517632764401?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/4218884517632764401/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2010/03/my-venture-into-jbehave-via-conways.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/4218884517632764401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/4218884517632764401'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2010/03/my-venture-into-jbehave-via-conways.html' title='My Venture into JBehave via Conway&apos;s Game of Life'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1428554536055409717</id><published>2010-03-03T21:44:00.013-05:00</published><updated>2011-02-20T16:37:15.348-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pair programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile Skills Project'/><title type='text'>Why do we Pair Program?</title><content type='html'>One of the most controversial agile practices has to be &lt;a href="http://www.extremeprogramming.org/rules/pair.html"&gt;Pair Programming&lt;/a&gt;.  Matt Wynne has a &lt;a href="http://blog.mattwynne.net/2009/08/09/personas-for-debugging-pair-programming-session/"&gt;blog post&lt;/a&gt; that lists several personae and why they don't want to pair program. It's a preview of what &lt;a href="http://agile2009.agilealliance.org/node/1206"&gt;he presented at Agile 2009&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Other people have written about the &lt;a href="http://c2.com/cgi-bin/wiki?PairProgrammingBenefits"&gt;benefits of successful pair programming&lt;/a&gt;, which is an after-the-fact analysis. Right now I'm going to look at &lt;span style="font-style: italic;"&gt;why&lt;/span&gt; we pair program, which is about intention&lt;br /&gt;&lt;br /&gt;I recently started thinking about why we pair program. What is our intention in using this practice? I came to the conclusion that Pair Programming promotes many of the &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory"&gt;Seven Skill Pillars&lt;/a&gt; named by the &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/home"&gt;Agile Skills Project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pillar: &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory/collaboration"&gt;Collaboration&lt;/a&gt; &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory/collaboration/collective-ownership"&gt;&lt;/a&gt;&lt;br /&gt;Pair programming is specifically listed as a skill of the Collaboration pillar, but it also supports &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory/collaboration/collective-ownership"&gt;Collective Ownership&lt;/a&gt; by preventing silos of knowledge (technical or domain knowledge) from forming.&lt;br /&gt;&lt;br /&gt;Pillar: &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory/technical-excellence"&gt;Technical Excellence&lt;/a&gt;&lt;br /&gt;Working directly with another developer reinforces good development practices, and two sets of eyes on code lets fewer mistakes make their way into the product.&lt;br /&gt;&lt;br /&gt;Pillar: &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory/self-improvement"&gt;Self Improvement&lt;/a&gt;&lt;br /&gt;Pair programming  sets a tone for a culture of continuous learning by creating ongoing opportunities for co-mentoring.&lt;br /&gt;&lt;br /&gt;Pillar: &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory/supportive-culture"&gt;Supportive Culture&lt;/a&gt;&lt;br /&gt;The transparency around each developer's skill level that comes from programming in front of each other gives a developer an opportunity to be tolerant and encouraging, knowing they will receive the same treatment in return.&lt;br /&gt;&lt;br /&gt;Pillar: &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory/confidence"&gt;Confidence&lt;/a&gt;&lt;br /&gt;By supporting each other in the practices of &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory/confidence/continuous-integration"&gt;Continous Integration&lt;/a&gt; and &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/agile-skills-inventory/technical-excellence/test-driven-design-tdd"&gt;Test-Driven Design&lt;/a&gt;, and by having a design and implementation that is jointly created, a pair can know they are producing quality code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-1428554536055409717?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1428554536055409717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2010/03/why-do-we-pair-program.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1428554536055409717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1428554536055409717'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2010/03/why-do-we-pair-program.html' title='Why do we Pair Program?'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-7455451957459071296</id><published>2010-01-16T17:24:00.010-05:00</published><updated>2011-02-20T16:31:54.376-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby koans'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='examples'/><category scheme='http://www.blogger.com/atom/ns#' term='codemash'/><title type='text'>CodeMash Precompiler Session # 1 - Ruby Koans</title><content type='html'>As I mentioned in my last post, I recently returned from CodeMash 2010, where I attended two &lt;a href="http://codemash.org/Precompiler"&gt;PreCompiler sessions&lt;/a&gt;. For the morning session, I attended "&lt;a href="http://codemash.org/Precompiler#Ruby"&gt;The Ruby Koans, Learning Ruby One Test at a Time with Joe O'Brien and Jim Weirich&lt;/a&gt;" which taught Ruby syntax and how to write tests in Ruby.  (Joe also gave an excellent and extremely popular talk called: "&lt;a href="http://codemash.org/Sessions#Refactoring+the+Programmer"&gt;Refactoring the Programmer&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;The word "&lt;a href="http://en.wikipedia.org/wiki/Koan"&gt;koan&lt;/a&gt;" comes from Zen Buddhism. As I understand it, Jim and Joe called their talk "Ruby Koans" because of their unique style of teaching that relies as much on mystery and intuition as it does on rational thinking.&lt;br /&gt;&lt;br /&gt;Jim has asked participants in the CodeMash session to show the koans to someone else, so I encourage you to look at them. You can try the koans yourself as follows:&lt;br /&gt;&lt;br /&gt;(1) Have a working version of Ruby:&lt;br /&gt;- Windows: Install from: &lt;a href="Install%20from:%20http://rubyforge.org/frs/download.php/66871/rubyinstaller-1.8.6-p383-rc1.exe"&gt;http://rubyforge.org/frs/download.php/66871/rubyinstaller-1.8.6-p383-rc1.exe&lt;/a&gt;&lt;br /&gt;- Macs: OS X comes preloaded on Macs so you are ready to go.&lt;br /&gt;- Linux Users: Use apt-get, or whatever is appropriate for your system&lt;br /&gt;&lt;br /&gt;(2) Download the Ruby Koans and install into a working directory:&lt;br /&gt;- &lt;a href="http://cloud.github.com/downloads/edgecase/ruby_koans/rubykoans.zip"&gt;http://cloud.github.com/downloads/edgecase/ruby_koans/rubykoans.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The file README.rdoc is a text file that explains the concept, tells how to get started, and gives contact information.&lt;br /&gt;&lt;br /&gt;To set up for the exercise: unzip the koans, open a command-prompt, and cd to the directory containing the koans. The exercise starts at the most simple level possible, but if you complete the koans, you will learn most of the Ruby syntax and see examples of how Ruby behaves at edge cases.&lt;br /&gt;&lt;br /&gt;To start the exersise, give the command:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;ruby path_to_enlightenment.rb&lt;/span&gt;&lt;/blockquote&gt;You should see the following result:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;&lt;blockquote&gt;Thinking AboutAsserts&lt;br /&gt;  test_assert_truth has damaged your karma.&lt;br /&gt;&lt;br /&gt;You have not yet reached enlightenment ...&lt;br /&gt;&lt;false&gt; is not true.&lt;br /&gt;&lt;br /&gt;Please meditate on the following code:&lt;br /&gt;./about_asserts.rb:10:in `test_assert_truth'&lt;br /&gt;path_to_enlightenment.rb:28&lt;/blockquote&gt;&lt;/span&gt;The line "&lt;false&gt; is not true." gives a hint as to why the test failed.&lt;br /&gt;The line after the "Please meditate..." line tells what line of code the test failed on.&lt;br /&gt;&lt;br /&gt;Looking in the file about_asserts.rb around line 10, we see:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;def test_assert_truth&lt;br /&gt;    assert false                # This should be true&lt;br /&gt;  end&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;In Ruby, def/end declares a method, and the word: "test_" at the start of the method name declares it as a test. The comment is a hint from Joe that the test fails, in this case rather obviously, because it is asserting false. So this koan demonstrates the a test in its simplest form, one that asserts a boolean condition. If you change false to true and run "ruby path_to_enlightenment.rb" again, that test will pass and the error you will see:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;Thinking AboutAsserts&lt;br /&gt;  test_assert_truth has expanded your awareness.&lt;br /&gt;  test_assert_with_message has damaged your karma.&lt;br /&gt;&lt;br /&gt;You have not yet reached enlightenment ...&lt;br /&gt;This should be true -- Please fix this.&lt;br /&gt;&lt;false&gt; is not true.&lt;br /&gt;&lt;br /&gt;Please meditate on the following code:&lt;br /&gt;./about_asserts.rb:16:in `test_assert_with_message'&lt;br /&gt;path_to_enlightenment.rb:28&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;So now the test_assert_truth test passes and the test_assert_with_message test is failing. The code for the second test is:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;  def test_assert_with_message&lt;br /&gt;    assert false, "This should be true -- Please fix this"&lt;br /&gt;  end&lt;/span&gt;&lt;/blockquote&gt;and we see where the "This should be true..." message comes from. Joe has now shown us what an assertion with an error message looks like. Again change false to true, rerun the ruby command and you'll see the next failing test.&lt;br /&gt;&lt;br /&gt;The koans go on to present illustrations of control statements, hashes, scope, strings, arrays, inheritance, iteration and others language details. I don't think anyone at the PreCompiler finished all the exercises during that session - I sure didn't - but it's clear that I will know a lot about Ruby syntax when I do.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finally if you have questions about the koans, you can reach Jim at his website&lt;a href="http://onestepback.org/"&gt; http://onestepback.org/ &lt;/a&gt;or @&lt;a href="http://twitter.com/jimweirich"&gt;jimweirich &lt;/a&gt;on Twitter. Or you can reach Joe at his website&lt;a href="http://objo.com"&gt; http://objo.com&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;or @&lt;a href="http://twitter.com/objo"&gt;objo&lt;/a&gt; on Twitter&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-7455451957459071296?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/7455451957459071296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2010/01/codemash-precompiler-session-1-ruby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/7455451957459071296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/7455451957459071296'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2010/01/codemash-precompiler-session-1-ruby.html' title='CodeMash Precompiler Session # 1 - Ruby Koans'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-322494924067373601</id><published>2010-01-16T16:39:00.004-05:00</published><updated>2010-01-16T17:23:34.208-05:00</updated><title type='text'>Back from CodeMash 2010</title><content type='html'>I just got back from a great experience at &lt;a href="http://codemash.org/"&gt;CodeMash&lt;/a&gt; 2010. This was my first CodeMash, and it will certainly not be my last. If you're a software developer and you've never gone to a CodeMash, I can't recommend it enough. (If you're a developer and you've already gone, I don't have to say anything because I know you'll be going back.) Besides all the technical goodness, there was lots of fun!&lt;br /&gt;&lt;br /&gt;If you're not familiar with CodeMash, its home page describes it as a unique two (or optionally three) day event:&lt;br /&gt;&lt;blockquote&gt;"... that will educate developers on current practices, methodologies and technology trends in variety of platforms and development languages such as Java, .NET, Ruby and PHP. Held [in] January, at the lush &lt;a href="http://www.kalahariresort.com/"&gt;Kalahari Resort&lt;/a&gt; in Sandusky, Ohio, attendees will be able to attend a world-class technical conference amid Ohio's largest indoor waterpark.&lt;/blockquote&gt;There were also sessions on career development, TDD/BDD, Agile/Lean/Kanban methodologies, dynamic languages like F# and Scheme, development for mobile platforms like iPhone and Android, and too many more for me to list here. See the &lt;a href="http://codemash.org/Sessions"&gt;session list&lt;/a&gt; for more, and for detailed writeups and presenter bios.&lt;br /&gt;&lt;br /&gt;This year, there were three keynote addresses and loads of software-development-related &lt;a href="http://codemash.org/Sponsors"&gt;sponsors&lt;/a&gt;, the likes of Microsoft, Amazon, Compuware, RedGate, and ComponentOne gave talks, demonstrations, held raffles and gave away lots of swag.&lt;br /&gt;&lt;br /&gt;But some of the most valuable experiences come from talking with other developers in the hallways, between sessions, at &lt;a href="http://en.wikipedia.org/wiki/Open-space_meeting"&gt;open space meetings&lt;/a&gt; organized by participants based on their interests, in the Coding Dojo room, and at the cocktail party.&lt;br /&gt;&lt;br /&gt;I mentioned that CodeMash is two or optionally three days. They call the optional third day events, held the day before the official conference opens, the PreCompiler. The &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://codemash.org/Precompiler"&gt;PreCompiler Sessions&lt;/a&gt; are 4 hour, hands-on, interactive labs. That's not to say that if you only attend the main conference you won't have a chance to sit down at a machine and try somethings out, but interactive sessions at the main conference are shorter (only about an hour) and tended to be less in-depth.&lt;br /&gt;&lt;br /&gt;I attended 2 PreCompiler sessions, "&lt;a href="http://codemash.org/Precompiler#Ruby"&gt;The Ruby Koans, Learning Ruby One Test at a Time with Joe O'Brien and Jim Weirich&lt;/a&gt;" and "&lt;a href="http://codemash.org/Precompiler#PracticalTBDD"&gt;Practical T/BDD - Half Day Hands-on Lab with Phil Japikse&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;I'll tell about these in subsequent blog posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-322494924067373601?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/322494924067373601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2010/01/back-from-codemash-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/322494924067373601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/322494924067373601'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2010/01/back-from-codemash-2010.html' title='Back from CodeMash 2010'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-8983188473612914165</id><published>2010-01-11T14:18:00.006-05:00</published><updated>2011-02-20T16:32:08.012-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeRetreat'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='craftsmanship'/><category scheme='http://www.blogger.com/atom/ns#' term='codemash'/><title type='text'>Grand Rapids CodeRetreat ... but it's in Ruby</title><content type='html'>I'm a big fan of CodeRetreat. Besides being a fun day, it's a great way to practice agile things like: pair programming, supportive environment, software craftsmanship, TDD, retrospectives, courage, and so on. I think they are great events for both aspiring Agilists and experienced Agilists.&lt;br /&gt;&lt;br /&gt;I read &lt;a href="http://www.atomicobject.com/pages/Jeremy+Anderson"&gt;Jeremy Anderson&lt;/a&gt;'s &lt;a href="http://spin.atomicobject.com/2010/01/11/code-retreat-grand-rapids"&gt;blog post&lt;/a&gt; about an upcoming &lt;a href="http://coderetreat.ning.com/xn/detail/2712512:Event:3302?xg_source=activity"&gt;CodeRetreat in Grand Rapids&lt;/a&gt;. I was all set to go when I read that it will be held in &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt;, and since I haven't used Ruby, I was discouraged. As much as I'd like to try it, I'm not sure how much time I'll have in my schedule before then.&lt;br /&gt;&lt;br /&gt;Then I found &lt;a href="http://tryruby.org/"&gt;TryRuby&lt;/a&gt;. It offers an interactive Ruby prompt and a follow-along tutorial, right in your browser! And there's another tutorial I found, Ruby in &lt;a href="http://www.ruby-lang.org/en/documentation/quickstart/"&gt;Twenty Minutes&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;So I guess I'll have to revisit the sessions I planned to attend this week at &lt;a href="http://codemash.org/"&gt;CodeMash 2010&lt;/a&gt; and see if there are beginner Ruby sessions.  Perhaps, between them and some extra work during downtime, I'll pick up enough Ruby to feel comfortable attending the Grand Rapids Code Mash next month.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-8983188473612914165?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/8983188473612914165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2010/01/grand-rapids-coderetreat-but-its-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/8983188473612914165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/8983188473612914165'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2010/01/grand-rapids-coderetreat-but-its-in.html' title='Grand Rapids CodeRetreat ... but it&apos;s in Ruby'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-708295421954943759</id><published>2009-11-23T12:28:00.004-05:00</published><updated>2009-11-23T12:34:15.622-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='seven pillars'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>What is agile communication?</title><content type='html'>In thinking about some things for the &lt;a href="http://agileskillsproject.com/"&gt;Agile Skills Project&lt;/a&gt;, I realized that agile teams &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/sandbox/communication"&gt;communicate differently&lt;/a&gt; than non-agile teams.&lt;br /&gt;&lt;br /&gt;It seems to me that agile communication aims to be:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;public (vs private or secret) [public within the entire team, not public as in news media]&lt;br /&gt;&lt;/li&gt;&lt;li&gt;early (vs delayed)&lt;/li&gt;&lt;li&gt;spoken, preferably in person (vs email)&lt;/li&gt;&lt;li&gt;free from judgment (vs assigning blame)&lt;/li&gt;&lt;li&gt;osmotic (vs selectively broadcast)&lt;/li&gt;&lt;li&gt;flat (vs hierarchical)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;A significant enabler of agile communication is the &lt;a href="https://sites.google.com/site/agileskillsprojectwiki/sandbox/skills/supportiveculture"&gt;Supportive Environment&lt;/a&gt; Agile Pillar.&lt;br /&gt;&lt;br /&gt;What characteristics of agile communications do you notice?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-708295421954943759?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/708295421954943759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2009/11/what-is-agile-communication.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/708295421954943759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/708295421954943759'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2009/11/what-is-agile-communication.html' title='What is agile communication?'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-479735293902566607</id><published>2009-11-16T09:27:00.004-05:00</published><updated>2009-11-17T00:57:28.703-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='1devday'/><title type='text'>Why we say: "No Best Practices"</title><content type='html'>I came across an great article from 2005 titled: &lt;a href="http://www.satisfice.com/blog/archives/27"&gt;No Best Practices&lt;/a&gt; and it reminded me that there was some discussion about the term "best practice" at the recent &lt;a href="http://sites.google.com/site/1devday/"&gt;1DevDay&lt;/a&gt; event.&lt;br /&gt;&lt;br /&gt;Besides speaking to reasons &lt;span style="font-style: italic;"&gt;why&lt;/span&gt; we say there are no best practices, James Bach gives a nice list of "simple, honest alternatives":&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    “Here’s what I would recommend for this situation.”&lt;/li&gt;&lt;li&gt;    “Here is a practice I find interesting.”&lt;/li&gt;&lt;li&gt;    “Here is my favorite practice for dealing with {x}.”&lt;/li&gt;&lt;li&gt;    “{Person X} attributes {practice Y} for his success. Maybe you’d like to learn about it.”&lt;/li&gt;&lt;/ul&gt;as well as a list of answers to common replies to his argument, replies like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;“I don’t mean ‘best practice’ literally. I’m just suggesting that this is a damn good practice.”&lt;/li&gt;&lt;li&gt;“When I said this practice is a ‘best practice’ I meant it was best for a certain context. But pretty much everyone in the industry shares that context, so what’s the point of talking about context?”&lt;/li&gt;&lt;li&gt;“This practice represents a consensus among industry leaders.”&lt;/li&gt;&lt;li&gt;“Lighten up. It’s just an expression.”&lt;/li&gt;&lt;/ul&gt;It really helped me get clear about why we say: "No Best Practices".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-479735293902566607?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/479735293902566607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2009/11/why-we-say-no-best-practices.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/479735293902566607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/479735293902566607'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2009/11/why-we-say-no-best-practices.html' title='Why we say: &quot;No Best Practices&quot;'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-7980349907408382323</id><published>2009-11-15T23:55:00.003-05:00</published><updated>2009-11-16T00:32:56.252-05:00</updated><title type='text'>My (growing) Agile Booklist</title><content type='html'>In no particular order, here are the agile books currently in my bookcase:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Practices of an Agile Developer, by Venkat Subramaniam and Andy Hunt&lt;/li&gt;&lt;li&gt;Clean Code, by (Uncle) Bob Martin&lt;/li&gt;&lt;li&gt;Refactoring: Improving the Design of Existing Code, by Martin Fowler&lt;/li&gt;&lt;li&gt;Test Driven Development: By Example, by Kent Beck&lt;/li&gt;&lt;li&gt;Working Effectively with Legacy Code, by Michael Feathers&lt;/li&gt;&lt;li&gt;Agile Principles, Patterns, and Practices in C#, by: Martin C. Robert &amp;amp; Martin Micah&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-7980349907408382323?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/7980349907408382323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2009/11/my-growing-agile-booklist.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/7980349907408382323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/7980349907408382323'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2009/11/my-growing-agile-booklist.html' title='My (growing) Agile Booklist'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-6707519971001629623</id><published>2009-11-15T23:16:00.005-05:00</published><updated>2009-11-15T23:40:01.412-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeRetreat'/><category scheme='http://www.blogger.com/atom/ns#' term='seven pillars'/><category scheme='http://www.blogger.com/atom/ns#' term='kata'/><title type='text'>CodeRetreat 12-5-09 LeanDog</title><content type='html'>I'm looking forward to attending &lt;a href="http://coderetreat.ning.com/xn/detail/2712512:Event:3633"&gt;CodeRetreat 12-5-09&lt;/a&gt;.&lt;br /&gt;It's a free event, sponsored by and held at &lt;a href="http://www.leandog.com/contact.html"&gt;LeanDog&lt;/a&gt;. If you aren't familiar with the idea of a Code Retreat, as promoted by my friend &lt;a href="http://patrickwilsonwelsh.com/"&gt;Patrick Wilson Welsh&lt;/a&gt;, take a look at his description &lt;a href="http://coderetreat.ning.com/profiles/blogs/what-the-heck-is-coderetreat"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Briefly, it's an event where agile software developers get together and pair program several solutions to a practice program, with the goal of honing our craft and furthering learning and discussion (Think &lt;a href="http://jonjagger.blogspot.com/2009/09/practice-practice.html"&gt;software kata&lt;/a&gt;.) The event hits 5 of the &lt;a href="http://groups.google.com/group/agile-developer-skills/web/chets-2nd-proposal?pli=1"&gt;7 agile skill pillars&lt;/a&gt; proposed by the &lt;a href="http://agileskillsproject.com/"&gt;Agile Developer Skills Project&lt;/a&gt;:&lt;br /&gt;    * Collaboration&lt;br /&gt;    * Supportive Culture&lt;br /&gt;    * Confidence&lt;br /&gt;    * Technical Excellence&lt;br /&gt;    * Self-Improvement&lt;br /&gt;&lt;br /&gt;I attended the previous LeanDog CodeRetreat and it was great! Lots of talented developers, great practice and learning, tech talks and a party-like atmosphere.&lt;br /&gt;&lt;br /&gt;LeanDog's location is amazing. Their website describes says:&lt;br /&gt;&lt;blockquote&gt;Our office is floating in downtown Cleveland right next to the U.S.S. Cod (a WWII Submarine), the Burke Lakefront Airport, and the &lt;a href="http://www.rockhall.com/"&gt;Rock and Roll Hall of Fame&lt;/a&gt;. We are located on a converted steamship, the Keasarge, that was formerly known as Hornblower’s Barge and Grill. The restaurant setting remains and offers open spaces that are perfect for practicing Agile. Our location gives a great view of the skyline of the city we support.&lt;/blockquote&gt;&lt;br /&gt;We'll be coding in Java again, but if you want to learn or practice pairing and you don't know Java, don't let that stop you. That was my situation last time and it was still a great experience!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-6707519971001629623?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/6707519971001629623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2009/11/coderetreat-12-5-09-leandog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/6707519971001629623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/6707519971001629623'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2009/11/coderetreat-12-5-09-leandog.html' title='CodeRetreat 12-5-09 LeanDog'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1496776503349629770</id><published>2009-11-15T21:37:00.012-05:00</published><updated>2009-11-15T22:09:53.807-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='seven pillars'/><category scheme='http://www.blogger.com/atom/ns#' term='self improvement'/><category scheme='http://www.blogger.com/atom/ns#' term='codemash'/><title type='text'>CodeMash 2010</title><content type='html'>I've registered for &lt;a href="http://codemash.org/"&gt;CodeMash 2010&lt;/a&gt;&lt;br /&gt;January 14-15, 2010 in Sandusky, OH&lt;br /&gt;&lt;br /&gt;There are several agile sessions scheduled:&lt;br /&gt;&lt;br /&gt;- Agile Iteration 0 by Ken Sipe&lt;br /&gt;- An Agile Toolchain for Flex RIAs by James Ward&lt;br /&gt;- Credit Crunch Code – Time to Pay Back the Technical Debt by Gary Short&lt;br /&gt;- Domain-Driven Design: An Introduction by Barry Hawkins&lt;br /&gt;- Seeing Constraints, Kanban Explained by Jon Stahl&lt;br /&gt;- Testing the Enterprise by Leon Gersing and Charley Baker&lt;br /&gt;- User Stories: Closing the Agile Loop by Barry Hawkins&lt;br /&gt;&lt;br /&gt;Wednesday is an optional &lt;a href="http://www.codemash.org/Precompiler"&gt;Precompiler&lt;/a&gt; session(full registration required to attend). The agile topics that day are:&lt;br /&gt;- Practical T/BDD - Half Day Hands-on Lab by Phil Japikse&lt;br /&gt;- Test Driven Development: From Concept to Deployment with Leon Gersing (all day)&lt;br /&gt;&lt;br /&gt;There are loads of sessions that aren't specifically about agile but look great anyhow. According to the CodeMash site:&lt;br /&gt;&lt;blockquote&gt;More than 45 sessions will be held, spread across the following tracks:&lt;br /&gt;&lt;br /&gt;    * Architecture: SOA, W3C Standards, WS* Implementations, Interoperability and all things 30,000 foot or higher.&lt;br /&gt;    * Desktop Development: Standalone Applications, Fat/Smart Client, Client/Server and all things running local on Windows, Mac or your favorite Linux distribution.&lt;br /&gt;    * Web Development: Web services, Ajax, frameworks, and all things related to the browser.&lt;br /&gt;    * Methodologies: Anything pertinent to how modern development methodologies help build software faster, cheaper, and with less grief.&lt;br /&gt;    * Mobility: All things mobile: platforms, devices, content distribution, social networking, community building, and anything else used in conjunction with those devices which have little screens.&lt;br /&gt;    * Languages: What's new and cool in languages such as C#, Java, PHP, Python, PHP, Ruby? Of course there are other languages which we've omitted from this list for reasons of space but don't mean to offend their feelings.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;and since one of the &lt;a href="http://www.exampler.com/blog/2009/06/10/the-seven-pillars-of-an-agile-team-introduction/"&gt;seven pillars&lt;/a&gt; is Self Improvement, why not attend and check out what interests you or what you think might help your team? And the cost for the conference is very low (see below.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Details:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://codemash.org/"&gt;CodeMash 2010&lt;/a&gt; will be held January 13-15, 2010 in Sandusky, OH at &lt;a href="http://www.kalahariresorts.com/oh/"&gt;Kalahari Resort&lt;/a&gt;, America's largest indoor water park&lt;br /&gt;&lt;br /&gt;Early Bird discount $175 until Nov 30&lt;br /&gt;Regular $220 until Jan 7, 2010&lt;br /&gt;Procrastinator $300&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-1496776503349629770?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1496776503349629770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2009/11/codemash-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1496776503349629770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1496776503349629770'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2009/11/codemash-2010.html' title='CodeMash 2010'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3412076207393035593.post-1456652206635303577</id><published>2009-11-15T20:51:00.005-05:00</published><updated>2009-11-15T21:12:41.076-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='1devday'/><title type='text'>1DevDay Detroit</title><content type='html'>Yesterday, I attended a great event, &lt;a href="http://sites.google.com/site/1devday/"&gt;1DevDay Detroit&lt;/a&gt;. It was put on by the &lt;a href="http://www.detroitjug.org/"&gt;Detroit Java User Group&lt;/a&gt;, generously hosted at &lt;a href="http://www.eprize.com/"&gt;ePrize&lt;/a&gt;, and sponsored by too many companies to mention here. The day was amazingly affordable ($40) and, I think, a great success - especially given that it is a new event. There were a few minor hiccups, mainly around timing talks, but they didn't impact the overall quality of the day.&lt;br /&gt;&lt;br /&gt;While 1DevDay was not specifically an agile event, there was much agile activity, including:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.agiledeveloper.com/"&gt;Venkat Subramaniam&lt;/a&gt;'s excellent and funny keynote, "Facts and Fallacies of Everyday Software Development"&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://www.hendricksonxp.com/"&gt;Chet Hendrickson&lt;/a&gt;'s talk about the &lt;a href="http://agileskillsproject.com/"&gt;Agile Skills Project&lt;/a&gt;, a non-commercial group created to quantify skills needed by agile software developers and identify valid means of assessing skills, trainings, and books.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://agileshrugged.com/"&gt;Nayan Hajratwala&lt;/a&gt;'s interactive session on refactoring legacy code with no tests and gradually adding and increasing test coverage to the codebase.&lt;br /&gt;&lt;br /&gt;There was also a twitter hashtag, &lt;a href="http://twitter.com/#search?q=%231devday"&gt;#1devday&lt;/a&gt;, where participants posted thoughts and comments. Check it out to get a picture of what the day was like.&lt;br /&gt;&lt;br /&gt;Just as fun was meeting and talking with other developers, many of whom are using at least some agile practices.&lt;br /&gt;&lt;br /&gt;I'm already looking forward to next year's event!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3412076207393035593-1456652206635303577?l=blog.jhoover.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jhoover.com/feeds/1456652206635303577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.jhoover.com/2009/11/1devday-detroit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1456652206635303577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3412076207393035593/posts/default/1456652206635303577'/><link rel='alternate' type='text/html' href='http://blog.jhoover.com/2009/11/1devday-detroit.html' title='1DevDay Detroit'/><author><name>Jeff Hoover</name><uri>http://www.blogger.com/profile/00303074503426576256</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-mFnzataO4Zw/Tn_QeRz3hHI/AAAAAAAAArA/BHirVakk1yk/s1600/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
