<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Tim Barcz</title><link>http://devlicio.us/blogs/tim_barcz/default.aspx</link><description>Why use nails when a screw is the more reversible choice?  Have Twitter, follow the conversation there at @&lt;a href="http://www.twitter.com/timbarcz"&gt;timbarcz&lt;/a&gt;</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/TimBarcz" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Resharper 5.0 - Bookmarks</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/uTcFDFK8xLU/reshaper-5-0-bookmarks.aspx</link><pubDate>Fri, 09 Oct 2009 18:35:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:52509</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=52509</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/10/09/reshaper-5-0-bookmarks.aspx#comments</comments><description>&lt;p&gt;Today it was announced that &lt;a href="http://blogs.jetbrains.com/dotnet/2009/10/resharper-50-intro/"&gt;Resharper 5.0 will soon be introduced as part of the public EAP (Early Access Program)&lt;/a&gt;.&amp;nbsp; As one on &lt;a href="http://www.jetbrains.com/devnet/academy/experts/index.html"&gt;JetBrains .NET Academy Experts&lt;/a&gt; I&amp;rsquo;ve had access to Resharper 5.0 for a few weeks. While in the coming weeks and months you&amp;rsquo;ll hear quite a bit from developers who are trying out Resharper 5.0 I wanted to alert you to one of my favorite features at this point.&lt;/p&gt;
&lt;h3&gt;Bookmarks&lt;/h3&gt;
&lt;p&gt;I read a lot more code than I write. When exploring new projects, doing code reviews, tracking down a bug, I like to mark different paths the flow of execution may take.&amp;nbsp; Most often to keep track of call stacks and what goes where, I usually end up using a piece of paper with a pencil drawing lines to various methods and interfaces. I could use Visual Studio which has had the concept of bookmarks for some time.&amp;nbsp; You can put a bookmark in code which creates a bit of a mark in your file that you can come back to later.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/oldbookmarks_5F00_5B657C78.png"&gt;&lt;img title="oldbookmarks" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="oldbookmarks" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/oldbookmarks_5F00_thumb_5F00_6D44A0F6.png" width="600" border="0" height="122" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;The problem with these bookmarks is that they&amp;rsquo;re flat and don&amp;rsquo;t and you get options of previous or next, but never the opportunity to define what &amp;ldquo;next&amp;rdquo; means? Hopping from bookmark to bookmark may not actually follow any intended path you meant to take when you placed the bookmark.&lt;/p&gt;
&lt;p&gt;Resharper 5.0 introduces the concept of bookmarks where you can set order.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/bookmarks_5F00_61AEE3B7.png"&gt;&lt;img title="bookmarks" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" alt="bookmarks" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/bookmarks_5F00_thumb_5F00_0F30037B.png" width="600" border="0" height="135" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Now I can happily bounce around code and easily inspect different control flows in a much more controlled fashion.&lt;/p&gt;
&lt;p&gt;ReSharper has been part of my toolset now for several years and I think what they&amp;rsquo;re doing is great.&amp;nbsp; While ReSharper 5.0 is a bit buggy at times I like it and the improvements it brings. I am looking forward to further EAP releases of ReSharper and encourage you to check them out as well. Should be coming by the end of this month.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=52509" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/uTcFDFK8xLU" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Announcement/default.aspx">Announcement</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/ReSharper/default.aspx">ReSharper</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/10/09/reshaper-5-0-bookmarks.aspx</feedburner:origLink></item><item><title>Git…Command-line or GUI?</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/RYNFs-LkfYM/git-command-line-or-gui.aspx</link><pubDate>Wed, 07 Oct 2009 19:15:02 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:52378</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>22</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=52378</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/10/07/git-command-line-or-gui.aspx#comments</comments><description>&lt;p&gt;A short quick post to get some feedback from you, the reader.&lt;/p&gt;  &lt;p&gt;I’m working to learn and transition to Git (using &lt;a href="http://www.lostechies.com/blogs/jason_meridth/archive/2009/06/01/git-for-windows-developers-git-series-part-1.aspx"&gt;Jason Meridth’s great series on Git&lt;/a&gt;).&amp;#160; Up to this point I’ve been using the command-line only, working to learn Git on the command-line before I rely on a tool or GUI abstraction. Recently I’ve been going through some refactoring on a project where I’m using Git. Right now I’m slow, really slow. Renaming files/classes for example is cumbersome to say the least.&lt;/p&gt;  &lt;p&gt;I got to wondering if knowing the command-line is even useful anymore or it just a geek badge of honor that a few developers like to point to proudly when talking about skill sets? Some part of me feels like using a tool like GitGUI or TortoiseGit is “cheating”.&amp;#160; Ironically I admire Git because it seems to let me work the way I want to work; branch often, local commits, easier merging and yet right now the command-line use of Git is my primary roadblock. It is at this point that I start thinking I should give up on the command-line since an SCM tool shouldn’t be intrusive and move to a GUI tool and give up my chances at fifth degree black belt geek.&lt;/p&gt;  &lt;p&gt;So what do you think?&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Use command-line go slow now but know the tool very well.&lt;/li&gt;    &lt;li&gt;Use GUI and go faster, however always be reliant on the GUI abstraction&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Is using a GUI “cheating”?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=52378" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/RYNFs-LkfYM" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Git/default.aspx">Git</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/10/07/git-command-line-or-gui.aspx</feedburner:origLink></item><item><title>Ship Software With Value</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/zPvs_sJSwGM/ship-software-with-value.aspx</link><pubDate>Tue, 29 Sep 2009 18:49:24 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:51874</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=51874</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/09/29/ship-software-with-value.aspx#comments</comments><description>&lt;p&gt;The blogosphere has gone a bit crazy the last few days with posts responding to &lt;a title="The Duct Tape Programmer By Joel Spolsky" href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;Joel Spolsky’s latest article about &amp;quot;The Duct Tape Programmer&amp;quot;&lt;/a&gt;. Bloggers everywhere are tossing their two cents in and saying what parts of Joel&amp;#39;s post was good and what wasn&amp;#39;t good. Once noticeable trend is that many have jumped on the &amp;quot;just ship it&amp;quot; bandwagon.&lt;/p&gt;  &lt;p&gt;There’s a quote mentioned by Jamie Zawinski in the article:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Yeah,” he says, “At the end of the day, ship the f---ing thing! It’s great to rewrite your code and make it cleaner and by the third time it’ll actually be pretty. But that’s not the point—you’re not here to write code; you’re here to ship products.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I don&amp;#39;t know Jamie and I imagine the context that the comment was made in was based around some pre-existing level of candor with the person he was speaking. We really don’t know what “…ship the f---ing thing” means in the context of that conversation and what level of quality is expected in that scenario. I would agree with Joel/Jamie that shipping products is important and that often developers (myself included) run the risk of becoming too entrenched in a design or beauty and all too easily miss the point of developing software...which is to ship a product that adds value.&amp;#160; However...”shipping” is only part of the picture. As someone responsible for the value of the product my team ships, I’m keenly aware of what affects shipping early can do (both the positive and negative).&lt;/p&gt;  &lt;p&gt;I&amp;#39;m reading a lot where people say &amp;quot;just ship it&amp;quot; but I&amp;#39;ve been part of teams where shipping too soon costs more money in the long run (and sometimes not even “the long run” but a few days/weeks down the road). These pro “ship it” bloggers surely must be talking about non-critical business systems when we say &amp;quot;just ship it&amp;quot;; would you want to ride on a plane where the flight control systems were sent out with bugs? Even a measly 1% failure rate of airplane system is unacceptable and is enormously expensive both in dollars and reputation for an airline.&lt;/p&gt;  &lt;p&gt;The point is that shipping is the point but not the whole point, it&amp;#39;s only one aspect of a well delivered software product. &lt;strong&gt;Shipping software with value is the point.&lt;/strong&gt;&amp;#160; Ship too soon with bugs and the value gained by shipping is potentially lost.&amp;#160; Conversely shipping late provides no value at all.&amp;#160; Neither lobbing a piece of crap over the wall at your customers early, nor refactoring your code till it shines is the point, neither should be considered a success. There’s a sweet spot that you need to find.&amp;#160; Keep in close contact with your customer, if you pay attention they’ll let you know when you’ve crossed into either extreme.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=51874" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/zPvs_sJSwGM" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Rant/default.aspx">Rant</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Testing/default.aspx">Testing</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Opinion/default.aspx">Opinion</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/09/29/ship-software-with-value.aspx</feedburner:origLink></item><item><title>Testing URL Generation on Routes in MVC Framework</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/5oivg5Rri2o/testing-url-generation-on-routes-in-mvc-framework.aspx</link><pubDate>Thu, 27 Aug 2009 05:15:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:50767</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>11</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=50767</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/27/testing-url-generation-on-routes-in-mvc-framework.aspx#comments</comments><description>&lt;p&gt;Today I wrote some code to output URLs in a certain manner in an &lt;a href="http://www.asp.net/mvc"&gt;ASP.NET MVC&lt;/a&gt; project.&amp;nbsp; The code I wrote was extremely simple, but I struggled, I mean S-T-R-U-G-G-L-E-D, to write tests against the new code and ensure correctness. I could easily very visually that it was working but the amount of setup and kludge around ViewContext, RequestContext and ControllerContext was causing me to pull my hair out.&lt;/p&gt;
&lt;p&gt;I tweeted my frustrations as I packed up and left work for the day and got the following responses soon thereafter:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a title="Tim Barcz on Twitter" href="http://www.twitter.com/timbarcz"&gt;@TimBarcz&lt;/a&gt; outbound routing is still hard, sadly (from &lt;a href="http://www.twitter.com/subdigital"&gt;@subdigital&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a title="Tim Barcz on Twitter" href="http://www.twitter.com/timbarcz"&gt;@TimBarcz&lt;/a&gt; &amp;hellip;a way to test #aspnetmvc a helper to reduce the ridiculous noise/setup would be helpful (from &lt;a href="http://www.twitter.com/ehexter"&gt;@ehexter&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Determined to not give up I pulled down the &lt;a href="http://mvccontrib.codeplex.com/"&gt;MVCContrib&lt;/a&gt; source and started to peck away. I&amp;rsquo;m working on committing and finalizing the code but here is a sneak peak of the changes.&amp;nbsp; Hopefully you agree that it is an improvement.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; [Test]&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Should_correctly_generate_session_url()&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RouteConfigurator().RegisterRoutes();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     var builder = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; TestControllerBuilder();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     var context = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RequestContext(builder.HttpContext, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RouteData());&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;     context.HttpContext.Response.Expect(x =&amp;gt; x.ApplyAppPathModifier(&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)).IgnoreArguments().Do(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Func&amp;lt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&amp;gt;(s =&amp;gt; s)).Repeat.Any();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     var urlhelper = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; UrlHelper(context);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; url = urlhelper.RouteUrl(&lt;span style="color:#006080;"&gt;&amp;quot;session&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { sessionKey = &lt;span style="color:#006080;"&gt;&amp;quot;this-is-the-session&amp;quot;&lt;/span&gt;, conferenceKey = &lt;span style="color:#006080;"&gt;&amp;quot;austincodecamp&amp;quot;&lt;/span&gt; });&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;     url.ShouldEqual(&lt;span style="color:#006080;"&gt;&amp;quot;/austincodecamp/sessions/this-is-the-session&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; [Test]&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; should_be_able_to_generate_url_from_named_route()&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     OutBoundUrl.OfRouteNamed(&lt;span style="color:#006080;"&gt;&amp;quot;session&amp;quot;&lt;/span&gt;).ShouldMapToUrl(&lt;span style="color:#006080;"&gt;&amp;quot;/sessions&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; [Test]&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; should_be_able_to_generate_url_from_controller_action()&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     OutBoundUrl.Of&amp;lt;FunkyController&amp;gt;(x =&amp;gt; x.New()).ShouldMapToUrl(&lt;span style="color:#006080;"&gt;&amp;quot;/Funky/New&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Much, much cleaner and easier on the eyes.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not quite done yet and has some holes (accepting additional route values, etc) but it&amp;rsquo;s worthy of discussion and once completed should make one very frustrating aspect of testing in MVC even easier.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=50767" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/5oivg5Rri2o" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/ASP.NET+MVC+Framework/default.aspx">ASP.NET MVC Framework</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Open+Source+Software/default.aspx">Open Source Software</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/MVCContrib/default.aspx">MVCContrib</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/27/testing-url-generation-on-routes-in-mvc-framework.aspx</feedburner:origLink></item><item><title>Zero Defects In Software, Setting a Higher Bar</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/C5AtI1Nlc_g/zero-defects-in-software-setting-a-higher-bar.aspx</link><pubDate>Wed, 26 Aug 2009 18:04:37 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:50751</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>9</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=50751</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/26/zero-defects-in-software-setting-a-higher-bar.aspx#comments</comments><description>&lt;p&gt;Several months ago &lt;a href="http://devlicio.us/blogs/tim_barcz/archive/2009/03/05/improving-software-process-a-letter-to-upper-management.aspx"&gt;I published a letter to upper management about improving software processes&lt;/a&gt;.&amp;#160; In that post I laid out what our team needed to do to be more effective at our jobs. Since that letter nearly five months ago, I have been promoted to management myself and now manage the team. While some might say I’ve gone to the dark side, I would vehemently disagree.&amp;#160; The role certainly has changed me but I like my role because I still am a developer and know that high quality solutions do mean dollars in our pockets because we’re able to adjust/react more quickly. &lt;/p&gt;  &lt;p&gt;I just got done reading an article over my lunch break and it caused me to shake my head in one key spot (emphasis mine):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;It’s very difficult, if not impossible, to build and maintain a dynamic web site that works flawlessly every moment of every day for every customer&lt;/strong&gt;. Between implementing new content, changing technology,&amp;#160; managing internal stakeholders, and designing for customers who have different objectives, learning styles, and backgrounds, you could never produce a 100 percent error-free site. &lt;strong&gt;After all, to err is human&lt;/strong&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Have we really set the bar that low with quality in software? I think we need to raise the bar.&amp;#160; A few months ago I took a stand with my letter to management, here is a similar email I wrote to my team recently which works to combat the thought process and acceptance of poor quality so rampant in our industry:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;All, &lt;/p&gt;    &lt;p&gt;As a developer I&amp;#39;ve worked on systems and rarely, if ever, have we set the bar so high as to have zero known bugs in the system.&amp;#160; I think often this is looked at as &amp;quot;too lofty&amp;quot; or &amp;quot;impossible&amp;quot;.&amp;#160; Well, the development team here currently has one bug and is fast approaching zero.&amp;#160; It IS possible. &lt;/p&gt;    &lt;p&gt;In our department we often talk of &amp;quot;demonstrating competency and expertise&amp;quot;.&amp;#160; The flip-side of setting such high expectation is that we can shatter our reputation quickly with even a few small issues or bugs.&amp;#160; Chris has said that developers are like airline pilots and that you only hear about them when something goes wrong.&amp;#160; There&amp;#39;s a lot of truth in that.&amp;#160; You expect a pilot to get you somewhere safely - people expect our software to work. &lt;/p&gt;    &lt;p&gt;I think we should not shy away from holding ourselves to an excessively high standard.&amp;#160; Frankly, I&amp;#39;m more familiar with how to do it as a developer having years of building software to gain knowledge and experience from.&amp;#160; I don&amp;#39;t have all the answers on how do this from the other aspects but I don&amp;#39;t think this means we stop trying.&amp;#160; I think quality should be the first and highest goal.&amp;#160; Speed should follow quality.&amp;#160; If you&amp;#39;re keeping a high quality standard and feel overwhelmed that the work is backing up behind you and you can&amp;#39;t ensure the highest quality, please don&amp;#39;t hesitate to talk to me about it and we&amp;#39;ll see if priorities can be reworked. &lt;/p&gt;    &lt;p&gt;As a team we&amp;#39;re setting a positive direction for our department and its future. As we continue to refine our processes and expectations within each subgroup be aware of the lasting impact of the work we do.&amp;#160; Be vigilant about improvements in the process we can make.&amp;#160;&amp;#160; If you see areas where you see quality slipping, pull the &amp;quot;red cord&amp;quot; and stop the process from going further until the quality is fixed.&amp;#160; We want anything that leaves this department to be of the highest quality, whether a proofing round or a final product build.&amp;#160; Don’t rely on other departments to back us up.&amp;#160; If we operate in this manner we&amp;#39;ll only build further credibility and reputation within the company. &lt;/p&gt;    &lt;p&gt;Tim&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;What about you? What’s your stance towards bugs? Think zero defect is too lofty?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=50751" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/C5AtI1Nlc_g" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Testing/default.aspx">Testing</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Project+Management/default.aspx">Project Management</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/26/zero-defects-in-software-setting-a-higher-bar.aspx</feedburner:origLink></item><item><title>RhinoMocks Exploration : RhinoMocks “Caching” Values?</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/TGYpOcCc84c/rhinomocks-exploration-rhinomocks-caching-values.aspx</link><pubDate>Fri, 21 Aug 2009 22:26:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:50171</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=50171</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/21/rhinomocks-exploration-rhinomocks-caching-values.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/RhinoExploration_5F00_75614801.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/RhinoExploration_5F00_75614801.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" alt="RhinoExploration" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/RhinoExploration_5F00_thumb_5F00_22E267C5.jpg" align="right" border="0" height="209" width="329" /&gt;&lt;/a&gt;Occasionally on the &lt;a href="http://groups.google.com/group/RhinoMocks/"&gt;RhinoMocks mailing list&lt;/a&gt; a question pops up about various pieces of the framework that people struggle with. This post is the first in hopefully an ongoing series where I address specific underpinnings of RhinoMocks to you, the reader.&amp;nbsp; I&amp;rsquo;ll do my best to explain the inner workings of the code and what is going on under the covers while trying to keep it &amp;ldquo;real&amp;rdquo;.&amp;nbsp; If you have specific things you want to see, let me know and I will do my best to put together the tutorial.&lt;/p&gt;
&lt;p&gt;That said, let&amp;rsquo;s get started&amp;hellip;&lt;/p&gt;
&lt;p&gt;Occasionally a question will come in about RhinoMocks caching a value and that something must be a bug in the framework.&amp;nbsp; Consider the following very simple test where we want to return the current date/time from a property getter.&amp;nbsp; You have a component with a gettable time but no setter.&amp;nbsp; In order to fake this out we use the Stub() method return a &amp;quot;known&amp;quot; value.&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; [TestFixture]&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; TimTests&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     [Test]&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DateTimeDive()&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;         var stub = MockRepository.GenerateStub&amp;lt;IFoo&amp;gt;();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;         stub.Stub(x =&amp;gt; x.Current).Return(DateTime.Now);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;         &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;         Thread.Sleep(5000);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;         Console.WriteLine(stub.Current);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt; }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; IFoo&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;     DateTime Current { get; }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;What time do you suppose is written out the console given the Thread.Sleep cal? The common thinking is that the Stub() method stores a method to be called to return the value at the time of execution when in reality what is happening is that the stub.Stub(x =&amp;gt; x.Current).Return(DateTime.Now) line is evaluated at runtime at the time the Stub is set.&amp;nbsp; Therefore, in the above code, the Console.WriteLine(stub.Current) will actually write the time from 5 seconds (5000 milliseconds prior) when the stub call was made. In other words, when Stub() is called, the resulting value is calculated and ready to be returned, it&amp;#39;s not deferred for execution. &lt;/p&gt;
&lt;p&gt;What is going on is that deep in the bowels of RhinoMocks there are things called Expectations, MockStates, and Recorders.&amp;nbsp; In the code above, when Stub() is called, what happens is a two step process (but appears as one, given the fluency, or dot-dot notation, of the call). &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. An expectation is created with a null return value (stub.Stub(x=&amp;gt;x.Current)) 
  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. The expectation is updated with the known return value (.Return(DateTime.Now)) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Note that if you try to write code without the second piece, you will get an InvalidOperationException when you try to use the stubbed property stating: 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; failed: Method &amp;#39;IFoo.get_Current();&amp;#39; requires a return value or an exception to throw. 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.InvalidOperationException: Method &amp;#39;IFoo.get_Current();&amp;#39; requires a return value or an exception to throw. 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\dev\OSS\rhino-tools\mocks\Rhino.Mocks\Expectations\AbstractExpectation.cs(342,0): at Rhino.Mocks.Expectations.AbstractExpectation.ReturnOrThrow(IInvocation invocation, Object[] args) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\dev\OSS\rhino-tools\mocks\Rhino.Mocks\Impl\StubReplayMockState.cs(63,0): at Rhino.Mocks.Impl.StubReplayMockState.DoMethodCall(IInvocation invocation, MethodInfo method, Object[] args) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\dev\OSS\rhino-tools\mocks\Rhino.Mocks\Impl\ReplayMockState.cs(118,0): at Rhino.Mocks.Impl.ReplayMockState.MethodCall(IInvocation invocation, MethodInfo method, Object[] args) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\dev\OSS\rhino-tools\mocks\Rhino.Mocks\MockRepository.cs(678,0): at Rhino.Mocks.MockRepository.MethodCall(IInvocation invocation, Object proxy, MethodInfo method, Object[] args) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\dev\OSS\rhino-tools\mocks\Rhino.Mocks\Impl\RhinoInterceptor.cs(96,0): at Rhino.Mocks.Impl.RhinoInterceptor.Intercept(IInvocation invocation) 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c:\OSS\Castle\Tools\Castle.DynamicProxy2\Castle.DynamicProxy\AbstractInvocation.cs(202,0): at Castle.DynamicProxy.AbstractInvocation.Proceed() 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; at IFooProxybc98a6ed8f1b4aa3b9ea36d89f80e6af.get_Current() 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C:\dev\OSS\rhino-tools\mocks\Rhino.Mocks.Tests\TimTests.cs(43,0): at Rhino.Mocks.Tests.TimTests.err() 

  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; There is an &amp;quot;expectation&amp;quot; created when the call is made and that expectation is added to a recorder (There are ordered and unordered method recorders, by default (the most common scenario) you will be using unordered recorders). These recorders record the mocked object (our stub object here), the method being called, and the &amp;quot;expectation&amp;quot;. The call to .Return(DateTime.Now) updates the expectation with the desired return value.&amp;nbsp; In the RhinoMocks framework this code is very simple but it&amp;#39;s important to note this value is executed at the point this code is run.&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IMethodOptions&amp;lt;T&amp;gt; Return(T objToReturn)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     expectation.ReturnValue = objToReturn;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can see from the code above that setting up a return value simply updated the expectation&amp;#39;s return value. 
  &lt;br /&gt;I hope you&amp;#39;ve followed the above code.&amp;nbsp; The RhinoMocks codebase is not simple per se and you do not need to understand it in depth to use it but I think in this case it help (as I see it often pop up on the mailing list). &lt;/p&gt;
&lt;p&gt;So what do you do if you want something to be called in a delayed fashion?&amp;nbsp; In our example I want the call to IFoo.Current to represent the DateTime.Now when I call it (as opposed to when I set it up). To do that, simply use the &amp;quot;Do()&amp;quot; method.&amp;nbsp; Here is an example that provides the same functionality as above, only the return value of the Stub is deferred until the stub is actually called.&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; [Test]&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Realtime_results_with_Do()&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     var stub = MockRepository.GenerateStub&amp;lt;IFoo&amp;gt;();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;     stub.Stub(x =&amp;gt; x.Current).Do(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Func&amp;lt;DateTime&amp;gt;(() =&amp;gt; DateTime.Now));&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;     Thread.Sleep(5000);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;     Console.WriteLine(stub.Current);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
I hope this helps a bit with the confusion around RhinoMocks and perceived &amp;quot;caching&amp;quot; of values.&amp;nbsp; If you have questions about this or other areas of RhinoMocks, I would love to tear into them for you, just ask!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=50171" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/TGYpOcCc84c" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Rhino+Mocks/default.aspx">Rhino Mocks</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/21/rhinomocks-exploration-rhinomocks-caching-values.aspx</feedburner:origLink></item><item><title>Invoke.CallFor(()=&gt; Speakers).For(IowaCodeCamp.Version(4))</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/WBjvIv5waZw/invoke-callfor-gt-speakers-for-iowacodecamp-version-4.aspx</link><pubDate>Fri, 21 Aug 2009 03:48:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:50149</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=50149</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/20/invoke-callfor-gt-speakers-for-iowacodecamp-version-4.aspx#comments</comments><description>&lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="Iowa Code Camp, Des Moines Iowa, November 7, 2009" alt="Iowa Code Camp, Des Moines Iowa, November 7, 2009" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/ICC_5F00_77303164.jpg" width="240" align="right" border="0" height="146" /&gt;Not too long ago Iowan developers had to travel to other states to get to a code camp.&amp;nbsp; Now, a few short years later, Iowa, on &lt;b&gt;November 7th, is having it&amp;#39;s fourth Iowa Code Camp in Des Moines.&amp;nbsp; &lt;/b&gt;I&amp;#39;m writing today to officially announce that we are now accepting speaker submissions for the event. I encourage you to think about what excites you about .NET and software development and how you can impact software developers in the Midwest with your topic.&amp;nbsp; Code camp attendees are typically talented developers who demonstrate their dedication to their craft by coming to a learning event on a weekend.&amp;nbsp; High quality content, such as that topic that just popped into your head or that topic you&amp;#39;ve been waiting to speak on, are the kinds of sessions our attendees are looking for.&lt;/p&gt;
&lt;p&gt;To submit a session or three, simply go to &lt;a href="http://iowacodecamp.com/Speakers.aspx"&gt;http://iowacodecamp.com/Speakers.aspx&lt;/a&gt; and follow the instructions there.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;The deadline to submit is September 23&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;A few quick notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Speaker and session selection is done by the Iowa Code Camp leadership. We&amp;#39;ll accept as many sessions as we can hold and will work to balance between advanced and beginner level topics &lt;/li&gt;
&lt;li&gt;You may (and are encouraged) to submit more than one abstract &lt;/li&gt;
&lt;/ul&gt;
&lt;div style="border-bottom:#c0c0c0 1px solid;border-left:#c0c0c0 1px solid;padding-bottom:5px;background-color:#e0e0e0;padding-left:5px;padding-right:5px;border-top:#c0c0c0 1px solid;border-right:#c0c0c0 1px solid;padding-top:5px;"&gt;&lt;b&gt;Special note to new speakers or people interested in speaking at a code camp for the first time:&lt;/b&gt;     &lt;br /&gt;Code camps are a great way to enter the world of speaking and &amp;quot;dip your toe in the water&amp;quot;.&amp;nbsp; If you&amp;#39;ve thought about speaking before and have a topic you&amp;#39;re knowledgeable about, consider taking the next step and submitting a session.&amp;nbsp; Iowa Code Camp welcomes new speakers and works hard to provide a very friendly environment to present for the first-time presenter.&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=50149" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/WBjvIv5waZw" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Announcement/default.aspx">Announcement</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Code+Camps/default.aspx">Code Camps</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/20/invoke-callfor-gt-speakers-for-iowacodecamp-version-4.aspx</feedburner:origLink></item><item><title>Moving to Kanban : A Mentoring Session</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/hd0axa-4Two/moving-to-kanban-a-mentoring-session.aspx</link><pubDate>Thu, 20 Aug 2009 03:49:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:50135</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=50135</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/19/moving-to-kanban-a-mentoring-session.aspx#comments</comments><description>&lt;p&gt;After &lt;a href="http://devlicio.us/blogs/tim_barcz/archive/2009/08/06/moving-to-kanban-did-scrum-fail.aspx"&gt;my recent post about our software team moving to Kanban&lt;/a&gt; I got an email from &lt;a href="http://www.lostechies.com/blogs/derickbailey/"&gt;Derick Bailey&lt;/a&gt; asking how he could help with our transition.&amp;nbsp; Derick graciously offered to meet with our team and help with any questions we may have and provide guidance as someone who has traveled this path before.&lt;/p&gt;
&lt;p&gt;We met for a little over two hours on Monday and recorded the discussion.&amp;nbsp; You&amp;#39;ll find that we bounce around a little bit which is because what you&amp;#39;re hearing is a team working in Scrum learning about Kanban.&amp;nbsp; This wasn&amp;#39;t scripted.&amp;nbsp; It is a teams honest questions about how one would go to Kanban and how to put the right pieces in place to make it succeed.&lt;/p&gt;
&lt;p&gt;Derick and the guys at &lt;a href="http://www.lostechies.com"&gt;LosTechies&lt;/a&gt; have set up the hosting for this on &lt;a href="http://pablotv.lostechies.com"&gt;PabloTv&lt;/a&gt;: &lt;a href="http://pablotv.lostechies.com/screencasts/dbailey/Adopting%20Kanban%201/Adopting%20Kanban%201.html"&gt;&lt;b&gt;Check out the first Adopting Kanban video&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=50135" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/hd0axa-4Two" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Kanban/default.aspx">Kanban</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Methodology/default.aspx">Methodology</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/19/moving-to-kanban-a-mentoring-session.aspx</feedburner:origLink></item><item><title>Book Review: Web Design for ROI</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/Gv6L3-IGF98/book-review-web-design-for-roi.aspx</link><pubDate>Fri, 14 Aug 2009 13:19:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:50064</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=50064</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/14/book-review-web-design-for-roi.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/image_5F00_2.png"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" alt="image" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/image_5F00_thumb.png" width="197" align="right" border="0" height="240" /&gt;&lt;/a&gt; So I&amp;#39;ve been on a kick lately to publish book reviews of books I&amp;#39;ve been reading.&amp;nbsp; I hesitated at writing this review given the nature of the book tends to be more around design than it does around code.&amp;nbsp; I decided to write the review for a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Designers, who also code, may read this blog&lt;/li&gt;
&lt;li&gt;If you work on a web site you &lt;b&gt;&lt;i&gt;should&lt;/i&gt;&lt;/b&gt; care about the design since it will affect the success of your site as well the way you code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I wouldn&amp;#39;t normally have picked up this book, instead favoring usability books by &lt;a href="http://www.useit.com"&gt;Jakob Nielsen&lt;/a&gt; or &lt;a href="http://www.sensible.com"&gt;Steven Krug&lt;/a&gt; or other well known usability personalities.&amp;nbsp; However, back in May I went to the &lt;a href="http://www.accmshow.com/ACCM2009/public/enter.aspx"&gt;ACCM Conference&lt;/a&gt; (Annual Conference of Catalog and Multichannel Merchants) and sat in a day long seminar by the authors of this book, &lt;a href="http://www.closed-loop-marketing.com/lance-loveday.php"&gt;Lance Loveday&lt;/a&gt; and &lt;a href="http://www.closed-loop-marketing.com/sandra-niehaus.php"&gt;Sandra Niehaus&lt;/a&gt;.&amp;nbsp; Both were very knowledgeable and presented their material well and as such I was interested in the print version of the seminar, this book, &lt;a href="http://www.wd4roi.com/home.html"&gt;Web Design for ROI&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Part I - The Big Picture&lt;/h2&gt;
&lt;p&gt;The first part of this book talks about some of the principles of what design can do and the state of web site design as a whole.&amp;nbsp; If you&amp;#39;re reading this page chances are good that you have worked for sites that pay little attention to design.&amp;nbsp; If you have not worked for such a company, you can easily think of one in which you are a customer.&lt;/p&gt;
&lt;p&gt;There is a good case made for revisiting design aspects of the site as an investment in future profitability. Quite often a site that is &amp;quot;up&amp;quot; is considered done and work soon begins on the next set of features without really watching to see how a page or set of pages is performing.&amp;nbsp; Are people finding what they are looking for? Is it clear on a page what someone should do next? This book presents the idea that web design is never done and really it&amp;#39;s a constant effort to tweak pages to see changes in the analytics.&lt;/p&gt;
&lt;p&gt;Chapter four introduces the idea of user testing which, after being exposed to it a several years ago has been a closet interest of mine.&amp;nbsp; Analytics are brought into the picture here too but again all stuff that is pretty basic if you&amp;#39;re already in the web space and are actively tracking users and patterns.&amp;nbsp; &lt;b&gt;If there is one thing I learned from this section is that even the most minor changes to a web page, things most developers would scoff at, can have a dramatic effect on the performance (ROI) of a page&lt;/b&gt;.&lt;/p&gt;
&lt;h2&gt;Part II - Design Guidelines&lt;/h2&gt;
&lt;p&gt;This section of the book goes through different pages on an e-commerce site, landing pages, checkout, product detail pages, and of course the home page.&amp;nbsp; I liked how each of these pages were featured in their own chapter.&amp;nbsp; Throughout this section I appreciated the full color screen shots of examples.&amp;nbsp; My only issue was with the softness of some of the advice.&amp;nbsp; Granted it may be presented this way because design is really a case-by-case basis and there is really no one-size-fits-all.&amp;nbsp; Or it could be that the authors feared putting concrete advice in the book only to see their advice (and book) quickly become outdated.&amp;nbsp; I&amp;#39;m not sure.&lt;/p&gt;
&lt;h2&gt;Conclusion and Final Thoughts&lt;/h2&gt;
&lt;p&gt;This book was a very quick read and did add to my knowledge a bit but more importantly got me thinking about design and usability, which is always a good thing.&amp;nbsp; If you&amp;#39;re looking for a few ideas and conversation starters with your design staff then I would pick it up.&amp;nbsp; If you&amp;#39;re new design and analytics this book can be a good primer as the various terms and definitions are given in the sidebar at times and inline.&amp;nbsp; If you&amp;#39;re in the e-Commerce space already and have been doing design for some time, I think you may be disappointed in the book because many concepts are things you would probably already know.&amp;nbsp; The problem for me may lie in the intro where the authors talk about who this book is for &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;These days it takes a village of people to inspire, envision, create, and maintain a web site. This book is for everyone in that village. We&amp;#39;ve attempted to make the book useful and accessible to people with a range of experience levels&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In my opinion they cast their net so wide they missed the mark.&amp;nbsp; Having sat in on a seminar with Lance and Sandra, I can confidently say they know their stuff and some of that came through in the book.&amp;nbsp; The problem ultimately lies in the quote above.&amp;nbsp; With making this book appeal to everyone it appeals to very few because it never achieves the depth that I&amp;#39;ve seen that both Lance and Sandra have.&amp;nbsp; Ultimately Lance and Sandra have a wealth of information and quite honestly I would have liked to have seen possibly two books which go into much deeper depth than this single book which scratches the surface.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=50064" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/Gv6L3-IGF98" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Book+Reviews/default.aspx">Book Reviews</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Web+Design/default.aspx">Web Design</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/14/book-review-web-design-for-roi.aspx</feedburner:origLink></item><item><title>Jet Brains Development Academy Welcomes Another</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/uf_7Hc3qltk/jet-brains-development-academy-welcomes-another.aspx</link><pubDate>Wed, 12 Aug 2009 02:55:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:49999</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=49999</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/11/jet-brains-development-academy-welcomes-another.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/image_5F00_4.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" alt="image" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/image_5F00_thumb_5F00_1.png" width="240" align="right" border="0" height="57" /&gt;&lt;/a&gt; A few years ago I was introduced to &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper&lt;/a&gt; (&lt;a href="http://www.jetbrains.com"&gt;JetBrains&lt;/a&gt;) from a co-worker (Thanks Grant!).&amp;nbsp; Having always been one who desires to move more quickly through code and take advantage of any shortcut I can, ReSharper felt like &amp;quot;coming home&amp;quot;.&lt;/p&gt;
&lt;p&gt;Last week I was invited to be part of their &lt;a href="http://www.jetbrains.com/devnet/academy/index.jsp"&gt;development academy&lt;/a&gt; as a an &lt;a href="http://www.jetbrains.com/devnet/academy/experts/index.html"&gt;academy expert&lt;/a&gt;.&amp;nbsp; For those of you not aware of this hidden gem that JetBrains has created:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Members of the Academy are recognized experts in various areas of software development. They contribute to Java and .NET communities by advocating best development practices through formal and informal publications and meetings, and serve as a versatile source of expertise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;#39;ll be entirely honest and say that I don&amp;#39;t consider myself an &amp;quot;expert&amp;quot; in anything, let alone ReSharper.&amp;nbsp; Yes, ReSharper is an integral piece of my development environment and an extension of my finger tips, but I&amp;#39;m always coming across new key commands or features that were always sitting there, begging me to use them, making me realize, I can stretch this tool a bit more (or is it the other way around?).&lt;/p&gt;
&lt;p&gt;The reason I&amp;#39;m so fond of ReSharper is that development tools litter the .NET space.&amp;nbsp; This is plainly visible by picking up a magazine and thumbing through it, taking notice to all of the component manufacturers and tools available.&amp;nbsp; The quality and usefulness of some of these tools can often be called into question.&amp;nbsp; ReSharper, however, is a pleasure to work with.&amp;nbsp; Even in it&amp;#39;s memory hogging days (around version 4.0) I didn&amp;#39;t mind it so much, the productivity gain was entirely worth it (version 4.5 works beautifully).&amp;nbsp; There are tools that I like having and tools that I must have.&amp;nbsp; Had the company I work for not purchased ReSharper, I would have paid for it out of my own pocket.&amp;nbsp; I can&amp;#39;t say that for a great number of tools out there.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=49999" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/uf_7Hc3qltk" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/ReSharper/default.aspx">ReSharper</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/11/jet-brains-development-academy-welcomes-another.aspx</feedburner:origLink></item><item><title>Coding Contest: Create a Programming Pearl</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/ZJ7wsG8CRRQ/coding-contest-create-a-programming-pearl.aspx</link><pubDate>Mon, 10 Aug 2009 03:14:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:49917</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>21</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=49917</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/09/coding-contest-create-a-programming-pearl.aspx#comments</comments><description>&lt;p&gt;The other day I was solving a seemingly simple problem.&amp;#160; While solving the problem I came across several hiccups one could have to consider (I say could given some unique environments this problem could surface in, ie. performance a primary concern).&amp;#160; While working the solution to completion, I got to thinking about other ways I could solve the problem.&amp;#160; It got me to thinking &lt;a href="http://www.amazon.com/Programming-Pearls-2nd-ACM-Press/dp/0201657880"&gt;Programming Pearls&lt;/a&gt;, a great book about solving problems effectively.&lt;/p&gt;  &lt;p&gt;Now that I&amp;#39;ve &amp;quot;solved it&amp;quot; myself, I&amp;#39;m curious what you could, the readers of this blog could come up with and I, by extension, can learn from.&lt;/p&gt;  &lt;h2&gt;The Problem at Hand&lt;/h2&gt;  &lt;p&gt;When given some text as an input, that text could include some &amp;quot;bad&amp;quot; characters.&amp;#160; For example, in Microsoft Word when typing a hyphen, Word will change the hyphen to a dash, since grammatically speaking a dash is different from a hyphen and most often you, the Word user, mean to use a dash so Word puts on there for you (thumbs up on the usability aspect of this feature Microsoft).&amp;#160; The problem is, the dash character that Word uses is not in the ASCII character set. &lt;/p&gt;  &lt;p&gt;With this program, we don&amp;#39;t want to allow a certain subset of characters, and instead replace the characters with a different character. Using the Word example of a dash and a hyphen, I want to scrub uses of a dash and replace with the hyphen.&lt;/p&gt;  &lt;p&gt;Here are some other common ones:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="589"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="134"&gt;Character&lt;/td&gt;        &lt;td valign="top" width="147"&gt;Correct ASCII Value&lt;/td&gt;        &lt;td valign="top" width="306"&gt;Bad Values&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="134"&gt;Hyphen&lt;/td&gt;        &lt;td valign="top" width="147"&gt;45&lt;/td&gt;        &lt;td valign="top" width="306"&gt;8208, 8211, 8212, 8722, 173, 8209, 8259&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="134"&gt;Single Quote&lt;/td&gt;        &lt;td valign="top" width="147"&gt;39&lt;/td&gt;        &lt;td valign="top" width="306"&gt;96, 8216, 8217, 8242, 769, 768&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="134"&gt;Double Quote&lt;/td&gt;        &lt;td valign="top" width="147"&gt;34&lt;/td&gt;        &lt;td valign="top" width="306"&gt;8220, 8221, 8243, 12291&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="134"&gt;Space&lt;/td&gt;        &lt;td valign="top" width="147"&gt;32&lt;/td&gt;        &lt;td valign="top" width="306"&gt;160, 8195, 8194&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;What the code should do is simply take in a string, and output the string with the offending &amp;quot;bad&amp;quot; characters replaced with a specified character (using the table above).&amp;#160; Very simple.&lt;/p&gt;  &lt;p&gt;I&amp;#39;ve provided the stub code here and a unit test, to provide an example, based on the table above...fill in the blank and submit!&lt;/p&gt;  &lt;div&gt;   &lt;div style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;     &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; [Test]&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Input_with_bad_characters_should_be_replaced_with_approprate_character()&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     var badChars = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;[] {(&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 96, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 8216, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 8217, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 8242, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 769, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 768,&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;         (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 8220, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 8221, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 8243, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;) 12291,(&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)8208, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)8211, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)8212, &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;         (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)8722, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)173, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)8209, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)8259,(&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)160, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)8195, (&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;)8194};&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;     var badString = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;(badChars);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     var cleanedString = CleanInput(badString);&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;     &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;     Assert.That(cleanedString, Is.EqualTo(&lt;span style="color:#006080;"&gt;&amp;quot;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;\&amp;quot;\&amp;quot;\&amp;quot;\&amp;quot;-------   &amp;quot;&lt;/span&gt;));   &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; CleanInput(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; input)&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;     &lt;span style="color:#008000;"&gt;// your details here&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;The Judging&lt;/h2&gt;

&lt;p&gt;The judging of the winner will be entirely based on my discretion.&amp;#160; I&amp;#39;m looking first for correctness, that the problem is in fact solved.&amp;#160; After that I&amp;#39;m open to seeing what you can do.&amp;#160; The only limit is your creativity.&lt;/p&gt;

&lt;h2&gt;The Prize&lt;/h2&gt;

&lt;p&gt;I am offering up your choice of a book from Addison-Wesley or a $25 gift certificate to &lt;a href="http://www.thinkgeek.com"&gt;ThinkGeek&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am thoroughly excited to see what you can come up with....&lt;/p&gt;

&lt;p&gt;(Please post submissions &lt;strike&gt;as a comment&lt;/strike&gt; to &lt;a href="http://gist.github.com"&gt;http://gist.github.com&lt;/a&gt;&amp;#160; Leave some way for me to get in contact with you)&lt;/p&gt;

&lt;div style="border-bottom:#c0c0c0 1px dashed;border-left:#c0c0c0 1px dashed;padding-bottom:0px;background-color:#e0e0e0;margin:0px;padding-left:0px;padding-right:0px;border-top:#c0c0c0 1px dashed;border-right:#c0c0c0 1px dashed;padding-top:0px;"&gt;
  &lt;h2 style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;padding-top:0px;"&gt;Updates&lt;/h2&gt;

  &lt;p&gt;Update #1: Please Make All submissions from hence forth to &lt;a href="http://gist.github.com"&gt;http://gist.github.com&lt;/a&gt; (Thanks Tuna)&lt;/p&gt;

  &lt;p&gt;Update #2: I will stop reviewing submissions one week after post date&lt;/p&gt;

  &lt;p&gt;Update #3: Feel free to leave your comments on who you think should win and why (I still reserve the right to overrule you :-))&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=49917" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/ZJ7wsG8CRRQ" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Contest/default.aspx">Contest</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/09/coding-contest-create-a-programming-pearl.aspx</feedburner:origLink></item><item><title>Moving to Kanban, Did Scrum Fail?</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/_zlmQRE5srk/moving-to-kanban-did-scrum-fail.aspx</link><pubDate>Fri, 07 Aug 2009 03:25:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:49878</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=49878</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/06/moving-to-kanban-did-scrum-fail.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/Untitled_5F00_4.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" alt="Untitled" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/Untitled_5F00_thumb_5F00_1.png" align="right" border="0" width="240" height="113" /&gt;&lt;/a&gt; Several months ago our software team decided to dive into the Scrum process.&amp;nbsp; What we were doing before that simply wasn&amp;#39;t working.&amp;nbsp; The project had unstable delivery dates and we knew something needed to change.&lt;/p&gt;
&lt;p&gt;Fast forward about four months and we&amp;#39;re going to take a shot at using Kanban and leave Scrum behind.&amp;nbsp; Quite surprising since I blogged that &lt;a href="http://devlicio.us/blogs/tim_barcz/archive/2008/08/18/scrum-a-not-so-bad-development-methodology.aspx"&gt;Scrum was a pretty good development methodology&lt;/a&gt;.&amp;nbsp; Why change if Scrum is so great?&amp;nbsp; Did Scrum fail?&amp;nbsp; Is Kanban that much better?&amp;nbsp; Is Kanban Better than scrum? Read on fellow Kaizenista.&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;Why Change To Kanban?&lt;/h2&gt;
&lt;p&gt;The developers that I work with are professionals at their core.&amp;nbsp; For us we want to deliver code, we want to make an impact. We want a consistent process that brings us maximal results.&amp;nbsp; We want a process that aides our development and doesn&amp;#39;t impede it.&lt;/p&gt;
&lt;p&gt;I work for the &lt;a href="http://www.jpcycles.com"&gt;world&amp;#39;s largest motorcycle parts and accessories dealer&lt;/a&gt;.&amp;nbsp; The code we right is in high demand, we want to get it out to the world as soon as possible.&amp;nbsp; Scrum imposes sprints and releases (several sprints) on the team.&amp;nbsp; We found that we don&amp;#39;t work that way.&amp;nbsp; If a feature is &amp;quot;done, done, done&amp;quot; we promote it to production we don&amp;#39;t wait for an arbitrary end of sprint.&amp;nbsp; This seems to fit better with Kanban.&lt;/p&gt;
&lt;p&gt;Secondly we want to reduce lead times, see features get implemented quicker.&amp;nbsp; While we saw a huge improvement with the adoption of scrum, the idea of a pull system versus a sprint backlog would have meant shorter lead time in several cases in the recent past.&lt;/p&gt;
&lt;p&gt;There are other reasons, but they all point to our desire to produce more.&amp;nbsp; Upper management has been quite pleased with scrum.&amp;nbsp; They see consistent work being accomplished and goals being met and the team quite happy. I had a discussion with my boss today about Kanban and was initially hesitant given only four months of using scrum.&amp;nbsp; He was thrilled with the idea of us working in ways to improve the process.&lt;/p&gt;
&lt;h2&gt;Did Scrum Fail?&lt;/h2&gt;
&lt;p&gt;I was asked my thoughts on a similar question on the drive home tonight by &lt;a href="http://www.lostechies.com/blogs/chrismissal/"&gt;Chris Missal&lt;/a&gt;.&amp;nbsp; I absolutely don&amp;#39;t think Scrum failed.&amp;nbsp; Scrum was a huge improvement and has shown us that it is okay to experiment and tweak with processes.&amp;nbsp; Had we adopted Kanban several months ago rather than first going through Scrum I believe our Kanban process would not have gone over well.&amp;nbsp; Quite simply we wouldn&amp;#39;t have done it right.&amp;nbsp; Now, after having worked in Scrum, we&amp;#39;re transitioning to Kanban to address very specific points where we see waste.&lt;/p&gt;
&lt;h2&gt;Is Kanban Better than Scrum?&lt;/h2&gt;
&lt;p&gt;Nope, Scrum is a perfectly fine solution and I don&amp;#39;t have a negative thing to say about it. For us Kanban seems to work more the way we work.&amp;nbsp; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;#39;s like putting on a tennis shoes to go golfing in then later trading in the tennis shoes for a pair of golf spikes.&amp;nbsp; The spikes are better than tennis shoes but the tennis shoes are better than nothing (barefoot).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;#39;s a better fit.&amp;nbsp; For the way our process flows and how we work, Scrum was like golfing in tennis shoes, it was an improvement but there are better optimizations to be made.&amp;nbsp; If Scrum is working for you, great. For us we wanted to try Kanban. &lt;/p&gt;
&lt;h2&gt;How are you Going to Start?&lt;/h2&gt;
&lt;p&gt;First, we don&amp;#39;t know much about Kanban. No one on our team carries certification like I do with Scrum.&amp;nbsp; Therefore we&amp;#39;re going to leverage you, the community, and our passion to learn and improve.&amp;nbsp; We&amp;#39;re going to use post&amp;#39;s from great authors and teachers like &lt;a href="http://www.lostechies.com/blogs/derickbailey/"&gt;Derick Bailey&lt;/a&gt; who posted yesterday (very well timed Derick) about &amp;quot;&lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/08/05/how-to-get-started-with-kanban-in-software-development.aspx"&gt;How To Get Started With Kanban In Software Development&lt;/a&gt;&amp;quot;.&amp;nbsp; We&amp;#39;re going to become student of Kanban and more importantly process improvement. Ultimately I don&amp;#39;t want the fear of something new to stop of from trying something that could help us. You have to experiment, tweak, and never be satisfied where you sit, you can always improve something.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ll keep you all posted as we go forward.&amp;nbsp; My hope is that the improvement we saw with Scrum will be magnified and we&amp;#39;ll see similar improvements with Kanban.&lt;/p&gt;
&lt;p&gt;Will keep you posted.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=49878" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/_zlmQRE5srk" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Scrum/default.aspx">Scrum</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Kanban/default.aspx">Kanban</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Methodology/default.aspx">Methodology</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/06/moving-to-kanban-did-scrum-fail.aspx</feedburner:origLink></item><item><title>Help: My Twitter Account Was Suspended</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/MQE_AZ9StH0/my-twitter-account-was-suspended.aspx</link><pubDate>Tue, 04 Aug 2009 04:48:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:49825</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=49825</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/08/03/my-twitter-account-was-suspended.aspx#comments</comments><description>&lt;p&gt;After a really good evening at &lt;a href="http://www.crineta.org"&gt;CRineta&lt;/a&gt;, I hop online to post a final tweet of the night only to see that my account has been suspended:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/image_5F00_2.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" alt="image" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/tim_5F00_barcz/image_5F00_thumb.png" width="595" border="0" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Very strange indeed.&amp;nbsp; I&amp;#39;ve looked over the terms of service and to be honest I can&amp;#39;t see where I&amp;#39;ve faltered at all.&lt;/p&gt;
&lt;p&gt;*Sigh* If I&amp;#39;m silent on Twitter for the next few days you&amp;#39;ll hopefully now know why? If you by chance know someone who knows someone at Twitter who can escalate this please by all means let me know.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=49825" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/MQE_AZ9StH0" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Rant/default.aspx">Rant</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/08/03/my-twitter-account-was-suspended.aspx</feedburner:origLink></item><item><title>Welcome Krzysztof Koźmic</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/PEapGaLlFtk/welcome-krzysztof-ko-mic.aspx</link><pubDate>Tue, 28 Jul 2009 02:38:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:49583</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=49583</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/07/27/welcome-krzysztof-ko-mic.aspx#comments</comments><description>&lt;p&gt;It is my pleasure to announce a new voice to the Devlicio.us community, &lt;a href="http://devlicio.us/blogs/krzysztof_kozmic/"&gt;Krzysztof Koźmic&lt;/a&gt;.&amp;nbsp; Krzysztof, also called Xtoff, has been putting out great content on his personal blog for some time.&amp;nbsp; He is a committer on the popular &lt;a href="http://castleproject.org/"&gt;open source Castle Project&lt;/a&gt; and is my &lt;a href="http://www.castleproject.org/dynamicproxy/index.html"&gt;DynamicProxy&lt;/a&gt; yoda having put out what I consider &lt;a href="http://kozmic.pl/category/23.aspx"&gt;the most complete tutorial on DynamicProxy on the internet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve had the pleasure of working with Krzysztof on the &lt;a href="http://groups.google.com/group/RhinoMocks"&gt;RhinoMocks mailing list&lt;/a&gt; and solving problems and helping community members there and I look forward to writing alongside him here and learning from him in the months to come.&lt;/p&gt;
&lt;p&gt;You can follow &lt;a href="http://devlicio.us/blogs/krzysztof_kozmic/"&gt;Krzysztof&amp;#39;s blog&lt;/a&gt; at &lt;a href="http://devlicio.us/blogs/krzysztof_kozmic/"&gt;http://devlicio.us/blogs/krzysztof_kozmic/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Welcome Xtoff!!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=49583" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/PEapGaLlFtk" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Announcement/default.aspx">Announcement</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/07/27/welcome-krzysztof-ko-mic.aspx</feedburner:origLink></item><item><title>Book Review: The Art of Unit Testing</title><link>http://feedproxy.google.com/~r/TimBarcz/~3/Fhe-p6_57js/book-review-the-art-of-unit-testing.aspx</link><pubDate>Thu, 23 Jul 2009 16:16:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:49544</guid><dc:creator>Tim Barcz</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://devlicio.us/blogs/tim_barcz/rsscomments.aspx?PostID=49544</wfw:commentRss><comments>http://devlicio.us/blogs/tim_barcz/archive/2009/07/23/book-review-the-art-of-unit-testing.aspx#comments</comments><description>&lt;p&gt;Over the last few years my blog has been filled with posts imploring testing and sharing techniques about testing. Most recently I&amp;rsquo;ve been speaking at code camps on how one can begin unit testing, sensing that a large majority of people out there don&amp;rsquo;t yet have the level of comfort with testing. Given my personal commitment to software quality through testing, I was excited to get my hands on a copy of &lt;a href="http://weblogs.asp.net/ROsherove/"&gt;Roy Osherove&amp;rsquo;s&lt;/a&gt; &lt;span style="text-decoration:underline;"&gt;&lt;a href="http://manning.com/osherove/"&gt;The Art of Unit Testing&lt;/a&gt;&lt;/span&gt; from &lt;a href="http://www.manning.com"&gt;Manning&lt;/a&gt;. A few weeks ago our copy was delivered and I have been excited for an upcoming vacation which would give me the time to sit down and churn through the book.&lt;/p&gt;
&lt;h2&gt;Part I &amp;ndash; The Basics of Unit Testing&lt;/h2&gt;
&lt;p&gt;In part one Roy defines unit testing. Roy takes a similar approach as the one that I use, explaining early on that we all do unit testing in one form or another. Too often I hear from people that they don&amp;rsquo;t have time to unit test. The reality is, and Roy makes this point very well, is that we never hand over code right after writing it. We all take some time to &amp;ldquo;test&amp;rdquo;. Some people write unit tests. Some write a simple app to test various scenarios and yet others will run the whole application. &lt;/p&gt;
&lt;p&gt;Roy takes the time early on to contrast a unit test with an integration test. This is a masterful move on Roy&amp;rsquo;s part as the confusion between unit testing and integration testing is one that even seasoned testers don&amp;rsquo;t always seem to understand. It sets the stage early and well for the introduction in part two of the use of isolation frameworks.&lt;/p&gt;
&lt;p&gt;In this part of the book Roy introduces us to a sample application that carries us throughout the book. I always appreciate it when books do this. The consistent sample application allows the user to follow the addition of new concepts more easily than examples that jump around. Roy focuses solely on the NUnit framework which is something I plan to take with me when I give future talks on unit testing. In my talks I introduce users to NUnit, MbUnit, as well as xUnit. My thought process has been to inform the listeners of my talk to the different options available. After reading the book, Roy&amp;rsquo;s approach of presenting a single framework to the user is a much better approach. It allows the reader to go deeper with a single framework which will benefit the reader much more than the surface knowledge of several frameworks.&lt;/p&gt;
&lt;h2&gt;Part II &amp;ndash; Core Techniques&lt;/h2&gt;
&lt;p&gt;This section goes into depth quite a bit on how to introduce &amp;ldquo;seams&amp;rdquo; (&amp;ldquo;&amp;hellip;places in your code where you can plug in different functionality&amp;hellip;&amp;rdquo;). I appreciate the effort Roy goes to in this chapter to explain how you exactly break apart your designs. He takes a methodical and thoughtful approach to design patterns that many out there have never used.&lt;/p&gt;
&lt;p&gt;I was pleased to see the introduction of stubs as a concept outside of an isolation (mocking) framework. I take a similar approach when I talk about RhinoMocks and isolation frameworks. While Roy ends up talking about RhinoMocks (an isolation framework) he makes sure the reader understands why the framework is useful. Ultimately this is a benefit to the reader as they no longer become a drone using a framework advertised by a respected book author but instead are informed and make the decision based on what is best for their situation.&lt;/p&gt;
&lt;p&gt;Roy also goes into detail about the differences between Stubs, Mocks and Fakes. These questions are something I encounter often when talking about &amp;ldquo;mocking&amp;rdquo;. The move towards simplicity and clarity was refreshing. In general for the mass public terms like &amp;ldquo;Test Doubles&amp;rdquo;, &amp;ldquo;Spys&amp;rdquo;, &amp;ldquo;Dummy&amp;rdquo;, &amp;ldquo;Fakes&amp;rdquo;, provide little to no value and only add confusion. Roy takes a similar stance and does a very good job clearing the air and setting the reader on a course for success.&lt;/p&gt;
&lt;p&gt;As someone with a vested interest in RhinoMocks I was pleased to see it&amp;rsquo;s coverage in chapter 5. There were times where I questioned what Roy was doing (the introduction of strict mocks) but soon recovered with further explanation about the topic. I will say that I was not a fan of the use of the record/replay syntax in the book and the subsequent AAA syntax (which was really record/replay). I really can&amp;rsquo;t fault Roy on this because I believe that RhinoMocks 3.5 was released after Roy began working on the book.&lt;/p&gt;
&lt;h2&gt;Part III &amp;ndash; The Test Code&lt;/h2&gt;
&lt;p&gt;This part of the book covered more of the non-code aspects to unit testing such a build automation, project structure, and inheritance for tests. In the beginning of the section Roy writes:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;In chapter 7, we&amp;rsquo;ll look at the three basic pillars of good unit tests &amp;ndash; readability, maintainability, and trustworthiness &amp;ndash; and look at techniques to support them. If you only read one chapter in the book, this should be it&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I questioned why this seemingly crucial chapter was in Part III of the book and not part of Part I (The Basics). Further, the importance of chapter 7 only appeared in the introduction to Part III and the reader would not find it unless they were already there.&lt;/p&gt;
&lt;p&gt;Chapter 6 felt a bit out of place to me in the book. The inclusion of test class inheritance patterns isn&amp;rsquo;t something I see often in codebases nor the use of generics in tests, which was another pattern mentioned. Much of what was contained in this chapter seemed like common sense to me. I trust that Roy and the editors/reviewers of the book have seen enough instances to believe otherwise, hence the inclusion of this chapter in the book.&lt;/p&gt;
&lt;p&gt;The information in chapter 7 was very good and I do agree with the statement (quoted above) that appeared in the introduction to the section. While I maintain the information may have served the reader better had it been presented in an earlier section it did not feel out of place or ruin the flow of the book.&lt;/p&gt;
&lt;h2&gt;Part IV &amp;ndash; Design and Process&lt;/h2&gt;
&lt;p&gt;This section again is a section where the book undersells itself. Having spoken in the past about unit testing at several code camps, questions constantly comes up about the political aspects of testing. Developers question how they can bring it into their organization or how they can explain the benefits to other developers or even upper management. This section of the book does a great job at anticipating the common questions and how to best make unit testing efforts succeed. It addresses ways to help your unit testing efforts succeed and demonstrates ways that will cause those efforts to fail. Despite my previous adoption and enthusiasm for testing I still found the information in this section very useful and worthwhile.&lt;/p&gt;
&lt;p&gt;Chapter 9 goes into testing legacy applications. The entirety of the book up to chapter 9 is spent on testing with the assumption that the developer has the ability to change/create the design. I believe this is a vast minority of people out there. Chapter 9 entices readers by talking about how to introduce testing into a legacy code base. The idea of graphing the priority of components in your system was something new to me but is very interesting and seems to be a thoughtful &amp;ldquo;scientific&amp;rdquo; way of attacking an untested legacy application. In general this chapter is shorter than I would have preferred but I believe that the majority of information that could be here would be out of the scope of this book which is why the chapter makes references to &lt;a href="http://www.objectmentor.com/omTeam/feathers_m.html"&gt;Michael Feathers&amp;#39;&lt;/a&gt; book &lt;span style="text-decoration:underline;"&gt;&lt;a href="http://www.amazon.com/Working-Effectively-Legacy-Robert-Martin/dp/0131177052"&gt;Working Effectively with Legacy Code&lt;/a&gt;&lt;/span&gt;. (Not e to self: Buy Michael Feathers book)&lt;/p&gt;
&lt;h2&gt;Conclusion and Final Thoughts&lt;/h2&gt;
&lt;p&gt;This book is a must own, buy it. It covers unit testing from start to finish and will get you up to speed on unit testing rather quickly while giving you a solid foundation to build upon in the future. My only gripe with the book is that it generally undersells itself, which is a great position for a book to be in (the reader believing the book contains more value that was thought when the purchase was made). &lt;/p&gt;
&lt;p&gt;I am generally not surprised that I enjoyed the book. I&amp;rsquo;ve closely followed Roy&amp;rsquo;s blog for several years and cut my unit-testing teeth on much of the advice contained on his blog. Roy is well respected in the community as well in the unit-testing circles and this book does the developer who reads it a great service in advancing their abilities in writing solid, testable code, a goal all of us should be striving after.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=49544" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/TimBarcz/~4/Fhe-p6_57js" height="1" width="1"/&gt;</description><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Testing/default.aspx">Testing</category><category domain="http://devlicio.us/blogs/tim_barcz/archive/tags/Book+Reviews/default.aspx">Book Reviews</category><feedburner:origLink>http://devlicio.us/blogs/tim_barcz/archive/2009/07/23/book-review-the-art-of-unit-testing.aspx</feedburner:origLink></item></channel></rss>
