<?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:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Caffeinated Coder</title>
	
	<link>http://www.caffeinatedcoder.com</link>
	<description>A Grande, Triple Shot, Non-Fat Core Dump by Russell Ball</description>
	<lastBuildDate>Wed, 10 Mar 2010 14:56:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/caffeinatedcoder/ProY" /><feedburner:info uri="caffeinatedcoder/proy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>caffeinatedcoder/ProY</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Reducing overloading ceremony with C# 4.0 optional parameters</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/SZb0IFPEDL8/</link>
		<comments>http://www.caffeinatedcoder.com/reducing-overloading-ceremony-with-c-4-0-optional-parameters/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 14:45:10 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Musings, Rants]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=843</guid>
		<description><![CDATA[It could be because I’m still suffering from upgrade fatigue due to a massive migration to .NET 3.5 that we recently completed at work.
Then again, it might just be because C# 4.0 has received little fanfare compared to the LINQ and lambda magic unveiled in C# 3.0.
Whatever the reason, I didn’t get around to installing [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>It could be because I’m still suffering from upgrade fatigue due to a massive migration to .NET 3.5 that we recently completed at work.</p>
<p>Then again, it might just be because C# 4.0 has received little fanfare compared to the LINQ and lambda magic unveiled in C# 3.0.</p>
<p>Whatever the reason, I didn’t get around to installing Visual Studio 2010 and experimenting with the new C# 4.0 features until just a few days ago.</p>
<p>Optional and Named Parameters, the first feature that I’m excited about, appears like a pretty minor feature on the surface but it has the potential to eliminate a lot of noisy “ceremony code”.</p>
<p>The concept is very simple and familiar to anyone who has specified a default value in a SQL Server stored procedure.</p>
<p>Up until now, when we’ve wanted to provide defaults for a method in C# and offer the API consumer a more concise way to call the method, we’ve had to rely on overloading.</p>
<p>Take the following common case code snippet as an example:</p>
<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;">
<div style="border-style: none; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;">
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> TakeOrder(<span style="color: #0000ff">string</span> name)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   2:</span> {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   3:</span>     <span style="color: #0000ff">this</span>.TakeOrder(name, <span style="color: #006080">"Americano"</span>);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   4:</span> }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   5:</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   6:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> TakeOrder(<span style="color: #0000ff">string</span> name, <span style="color: #0000ff">string</span> drink)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   7:</span> {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   8:</span>     <span style="color: #0000ff">this</span>.TakeOrder(name, drink, <span style="color: #006080">"grande"</span>);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   9:</span> }</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">  10:</span></pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">  11:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> TakeOrder(<span style="color: #0000ff">string</span> name, <span style="color: #0000ff">string</span> drink, <span style="color: #0000ff">string</span> size)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">  12:</span> {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">  13:</span>     <span style="color: #0000ff">string</span> order = String.Format(<span style="color: #006080">"{0} wants a {1} {2}"</span>, name, size, drink);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">  14:</span>     orders.Add(order);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">  15:</span> }</pre>
</div>
</div>
<p>Although the client code below is nice and concise, the method definitions contain a lot of duplication.</p>
<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;">
<div style="border-style: none; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;">
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   1:</span> StarbuxWench wenchDuJour = <span style="color: #0000ff">new</span> StarbuxWench(<span style="color: #006080">"Russ"</span>);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   2:</span> wenchDuJour.TakeOrder(<span style="color: #006080">"Brian"</span>);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   3:</span> wenchDuJour.TakeOrder(<span style="color: #006080">"Grif"</span>, <span style="color: #006080">"Mocha"</span>);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   4:</span> wenchDuJour.TakeOrder(<span style="color: #006080">"Kim"</span>, <span style="color: #006080">"Latte"</span>, <span style="color: #006080">"tall"</span>);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   6:</span> wenchDuJour.PlaceOrder();</pre>
</div>
</div>
<p>You might not notice it at first because you are used to it, but imagine if you had to provide a separate sproc definition for each optional parameter in a stored procedure.</p>
<p>Besides being noisy and high on &#8220;ceremony&#8221;, overloading is suboptimal because it doesn&#8217;t make the default values that are being utilized explicit, which can sometimes lead to unpleasant surprises for the consumer. I recently experienced this first hand when I wrongly assumed that the default value for comparison type for String.Compare was a case insensitive comparison.</p>
<p>Another limitation of overloading is that it requires a unique combination of types, which means that I couldn’t provide an overload with just name and size because they are both strings and I already have a definition with two strings (name and drink).</p>
<p>Now consider the C# 4.0 alternative:</p>
<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;">
<div style="border-style: none; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;">
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> TakeOrder(<span style="color: #0000ff">string</span> name, <span style="color: #0000ff">string</span> drink = <span style="color: #006080">"Americano"</span>, <span style="color: #0000ff">string</span> size = <span style="color: #006080">"grande"</span>)</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   2:</span> {</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   3:</span>     <span style="color: #0000ff">string</span> order = String.Format(<span style="color: #006080">"{0} wants a {1} {2}"</span>, name, size, drink);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   4:</span>     orders.Add(order);</pre>
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   5:</span> }</pre>
</div>
</div>
<p>Besides being much more concise and saving you the trouble of having to modify your code every time you want to expose a new parameter combination, it also solves the unique type combination limitation as well as hiding default parameteres from the client.</p>
<p>Here you can see that I&#8217;m skipping the second parameter by using the new named parameter syntax, which should be very familiar if you’ve ever worked with ruby.</p>
<div style="border: 1px solid gray; margin: 20px 0px 10px; padding: 4px; overflow: auto; line-height: 12pt; background-color: #f4f4f4; width: 97.5%; font-family: consolas,'Courier New',courier,monospace; max-height: 200px; font-size: 8pt; cursor: text;">
<div style="border-style: none; padding: 0px; overflow: visible; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;">
<pre style="border-style: none; margin: 0em; padding: 0px; overflow: visible; line-height: 12pt; background-color: white; width: 100%; font-family: consolas,'Courier New',courier,monospace; color: black; font-size: 8pt;"><span style="color: #606060">   1:</span> wenchDuJour.TakeOrder(<span style="color: #006080">"Jacob"</span>, size: <span style="color: #006080">"grande"</span>);</pre>
</div>
</div>
<p>Here&#8217;s a snapshot of the intellisense, which makes the defaults explicit.</p>
<p><img class="aligncenter size-full wp-image-844" title="optionalParams" src="http://www.caffeinatedcoder.com/wp-content/uploads/2010/03/optionalParams.png" alt="optionalParams" width="450" height="43" /></p>
<p>As I mentioned before, this feature is pretty trivial when compared with lambdas or LINQ, but anything that removes cruft from my code is a welcome addition to the language.</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=843&type=feed" alt="" />

<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/SZb0IFPEDL8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/reducing-overloading-ceremony-with-c-4-0-optional-parameters/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.caffeinatedcoder.com/reducing-overloading-ceremony-with-c-4-0-optional-parameters/</feedburner:origLink></item>
		<item>
		<title>Refining My TDD Strategy</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/Y6-SOFm_5Ps/</link>
		<comments>http://www.caffeinatedcoder.com/refining-my-tdd-strategy/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 20:16:55 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Musings, Rants]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=836</guid>
		<description><![CDATA[I’ve been doing various degrees of Test Driven Development for several years  and am still a strong advocate, but I’m definitely in one of those stages now  where I am rethinking my approach.
The last time I found myself in this position was several years ago during my  pre-mocking days when my test [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>I’ve been doing various degrees of Test Driven Development for several years  and am still a strong advocate, but I’m definitely in one of those stages now  where I am rethinking my approach.</p>
<p>The last time I found myself in this position was several years ago during my  pre-mocking days when my test suite was taking an hour to run, the majority of  my test failures were data-related ghosts, and the sql-laden setup and teardown  sections of tests were painful to create and even more painful to maintain.</p>
<p>Now I find myself facing similar types of friction even though the causes may  be different. Tests require too much effort to write due to mocking  requirements, especially in areas of legacy code that need to be refactored to  use dependency injection. Test failures are too often false positives caused by  simple refactorings due to the tight coupling caused by <a href="http://ayende.com/Blog/archive/2007/04/05/Guidelines-to-using-Interaction-Based-Testing.aspx">interaction-based  testing</a>. The overall number of tests is difficult to manage from the  perspective of documenting system behavior or being able to quickly discover  whether a test already exists for a particular piece of functionality that is  being modified.</p>
<p>As a result, our department has clearly stalled in its effort to incorporate  TDD into our everyday development process and now I’m trying to figure out how  to rectify that.</p>
<p>My current thinking is that <strong>the best way to make TDD a viable and  sustainable option is to selectively use it only when it provides a net gain in  value.</strong></p>
<p>I know that this is somewhat of a blasphemous thought because TDD\BDD is more  about design than automated testing, which means that it is supposed to be baked  into the development process and therefore not optional (or so I thought).</p>
<p>Although I have definitely experienced moments where TDD has improved both  the usability and elegance of my design by making me start from the perspective  of the API consumer and incrementally add features in the simplest possible way  that works, I have also seen plenty of cases where it provides little or no  benefit in terms of design. For example, I often seem to write code that  must fit into an existing design, follows a well known pattern, or only  slightly modifies an existing method.</p>
<p>The same holds true for refactoring. While there have definitely been times  where TDD has improved the quality of my code by providing a safety net that  allows me to catch more bugs and refactor more freely, there have also been  times when I’ve gained little value in this respect due to the simplicity of  the code. In fact, lately I’ve noticed that there have actually been times when I have  been less likely to refactor a section of code due to TDD because it had a large  number of interaction-based tests around it that would all have to be changed to  accommodate the implementation changes.</p>
<p>Finally, let us not forget that any and all code is <a href="http://blog.objectmentor.com/articles/2007/04/16/code-is-a-liability">intrinsically  a liability</a>. Since test code tends to grow at a much faster rate than normal  code, the long term maintenance cost of your test suite becomes even more of an important  factor to consider.</p>
<p>Ultimately, it seems as though some criteria for making a simple cost-benefit  analysis are in order to help decide when it make sense to use TDD.</p>
<p>So far I’ve come up with the following:</p>
<p><strong>When to write a test:</strong></p>
<ol>
<li>The design is unclear.</li>
<li>You’re implementing an important or complicated piece of business logic.</li>
<li>You’re about to implement a hack or sub-optimal solution because you’re  afraid of breaking something in an existing piece of messy, complicated code.</li>
</ol>
<p>It also occurred to me that just because you write a test doesn’t mean that  you have to commit it. There are several design artifacts (whiteboard, napkins,  etc) that are extremely helpful despite being disposable. Occasionally writing throw-away tests would certainly allow me to gain the design benefit without incurring the cost of maintaining a test that has  little long term value.</p>
<p>With that in mind, the following scenarios seem like reasonable examples of when it makes sense to take  the extra step of committing a test:</p>
<p><strong>When to commit a test:</strong></p>
<ol>
<li>The code is important to the business and heads will roll if someone  unintentionally breaks it.</li>
<li>The code is complicated and the next poor schmuck who touches it to make an enhancement has a good chance of  unintentionally breaking it.</li>
</ol>
<p><strong>Other ways to improve the cost-benefit ratio of testing:</strong></p>
<ol>
<li><strong>Use <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">SRS</a> to  isolate important business logic</strong> – By favoring small classes and  composition and focusing your testing efforts at this level rather than a higher  level where they all meet, you will drastically reduce the setup cost of mocking  out all the dependencies that probably aren’t relevant to your test anyway.</li>
<li><strong>Favor state-based testing over interaction-based testing</strong> –  I’ve run into a  few scenarios where interaction-based testing has been a  blessing, but it seems like more often than not it just leads to inappropriate  coupling with the implementation details that results in brittle test code. Use  it sparingly.</li>
<li><strong>Make test suite spring cleaning a post release ritual</strong> –  Nothing succumbs to entropy like code. Test code is even more critical to keep  clear, concise, and organized, because this has the potential to represent the  specifications of how your system works. If something is no longer important  delete it. If the test name isn’t clear or the folder structure isn’t optimal  for finding features, then invest the effort to change it. Otherwise, the <a href="http://en.wikipedia.org/wiki/Fixing_Broken_Windows">broken window  theory</a> will take affect faster than it takes Visual Studio to  load.</li>
</ol>
<p>Am I way off base here? Does anyone else have additional criteria for  deciding when it makes sense to remove yourself from TDD mode?</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=836&type=feed" alt="" />

<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/Y6-SOFm_5Ps" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/refining-my-tdd-strategy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.caffeinatedcoder.com/refining-my-tdd-strategy/</feedburner:origLink></item>
		<item>
		<title>Book Review – Lean Software Development: An Agile Toolkit</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/Jwgid-qsAJQ/</link>
		<comments>http://www.caffeinatedcoder.com/book-review-lean-software-development-an-agile-toolkit/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 05:23:08 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Musings, Rants]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=825</guid>
		<description><![CDATA[I just finished my February book from my 2010  tech book reading list, so I thought I would share some thoughts on Lean  Software Development: An Agile Toolkit by Mary and Tom Poppendieck before  moving on to my March book, Clean  Code by (Uncle) Bob Martin.
Rating -   1/2  (out [...]


Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/book-review-the-clr-via-c/' rel='bookmark' title='Permanent Link: Book Review: the CLR via C#'>Book Review: the CLR via C#</a> <small>As promised, here’s my review of the January book, the...</small></li><li><a href='http://www.caffeinatedcoder.com/return-of-the-becoming-a-better-developer-meme-my-2010-smart-goal/' rel='bookmark' title='Permanent Link: Return of the Becoming a Better Developer Meme: My 2010 SMART Goal'>Return of the Becoming a Better Developer Meme: My 2010 SMART Goal</a> <small>When I first started writing this blog, I devoted several...</small></li><li><a href='http://www.caffeinatedcoder.com/technical-book-sequels-a-case-study-in-trying-to-salvage-a-second-edition/' rel='bookmark' title='Permanent Link: Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition'>Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition</a> <small>In a recent post, I raved about Jon Skeet’s book,...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/0321150783?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321150783"><img class="size-full wp-image-827" style="margin: 10px;" title="FebBookReview_Lean" src="http://www.caffeinatedcoder.com/wp-content/uploads/2010/03/FebBookReview_Lean.jpg" alt="FebBookReview_Lean" width="184" height="238" align="right" /></a>I just finished my February book from my <a href="../return-of-the-becoming-a-better-developer-meme-my-2010-smart-goal/">2010  tech book reading list</a>, so I thought I would share some thoughts on <a href="http://www.amazon.com/gp/product/0321150783?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321150783">Lean  Software Development: An Agile Toolkit</a> by Mary and Tom Poppendieck before  moving on to my March book, <a href="http://www.amazon.com/gp/product/0132350882?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0132350882">Clean  Code</a> by (Uncle) Bob Martin.</p>
<p><strong>Rating -</strong> <img title="star_sm" src="../wp-content/uploads/2010/02/star_sm1.jpg" alt="star_sm" width="20" height="19" /> <img title="star_sm" src="../wp-content/uploads/2010/02/star_sm1.jpg" alt="star_sm" width="20" height="19" /> 1/2  (out of 5)</p>
<p><strong>Prerequisites – </strong>This book doesn’t assume any prior  knowledge, but it helps if you’re familiar with some basic Agile concepts. If  you’re like me and prefer to have some mental hooks in place before starting  a non-fiction book, then also take a few minutes to read the <a href="http://en.wikipedia.org/wiki/Lean_software_development">wiki summary  page</a> first.</p>
<p><strong>The Good</strong></p>
<ol>
<li><strong>Easily Consumable </strong>– Unlike the vast majority of technical  books, this one is well structured, concise, and well written. The  authors package up the information in 7 easy principles and 22 tools which  neatly correspond to chapters and subsections. Weighing in at a slim 180 pages,  many of which contain easy-to-read project anecdotes, business novelettes, and  case studies, the book can easily be read in the span of a week.</li>
<li><strong>Broadly Applicable </strong>– This book is all about concepts  and principals that can can be applied incrementally to almost any scenario. In  other words, you can still get value from it even if you don’t have the desire  or the freedom to change your current development methodology.</li>
</ol>
<p><strong>The Bad</strong></p>
<ol>
<li><strong>Management Genre – </strong>It has been a while since I’ve read  Dante, but I’m pretty sure that at least one of the <a href="http://en.wikipedia.org/wiki/Inferno_%28Dante%29">inner circles of  hell</a> is dedicated to making developers recursively read management drivel  until they beg for mercy. While this book is very developer-centric and arguably  has potential to greatly improve the quality of life for the average developer,  it is still firmly grounded in the business-management genre and thus  may inevitably irritate developers in a number of subtle ways.</li>
<li><strong>Too Vague at Times</strong> – While the focus on broadly applicable  principles has its strengths, it could also be frustrating for someone who is  looking for a more concrete and instructional guide to help them overhaul their  Software Development Lifecycle. This book is probably best used in conjunction with other more detailed and  prescriptive resources.</li>
<li><strong>Potentially Out-Dated</strong> – Despite being written in 2003, this book remains  remarkably relevant. However, it is not at the forefront of Lean-inspired thinking these days and does not take into account the  lessons learned from the front-line agilistas over the last 7 years. Based on some preliminary  research, it appears that the current Lean-inspired trend is focused around <a href="http://www.infoq.com/articles/hiranabe-lean-agile-kanban">Kanban</a>, which you can find out more about <a href="http://www.kanban101.com/">here</a> and <a href="http://blog.troytuttle.com/">here</a>.</li>
</ol>
<p><strong>Conclusion – </strong>As long as none of my negative bullet points  are deal breakers for you, then I would go ahead and recommend reading the book.  If your bookshelf already over-floweth or you can’t justify spending another  penny on tech books, then this might be a good one to &#8220;thoroughly browse” cover to cover at  your local bookstore over a series of lunch breaks.</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=825&type=feed" alt="" />

<p>Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/book-review-the-clr-via-c/' rel='bookmark' title='Permanent Link: Book Review: the CLR via C#'>Book Review: the CLR via C#</a> <small>As promised, here’s my review of the January book, the...</small></li><li><a href='http://www.caffeinatedcoder.com/return-of-the-becoming-a-better-developer-meme-my-2010-smart-goal/' rel='bookmark' title='Permanent Link: Return of the Becoming a Better Developer Meme: My 2010 SMART Goal'>Return of the Becoming a Better Developer Meme: My 2010 SMART Goal</a> <small>When I first started writing this blog, I devoted several...</small></li><li><a href='http://www.caffeinatedcoder.com/technical-book-sequels-a-case-study-in-trying-to-salvage-a-second-edition/' rel='bookmark' title='Permanent Link: Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition'>Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition</a> <small>In a recent post, I raved about Jon Skeet’s book,...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/Jwgid-qsAJQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/book-review-lean-software-development-an-agile-toolkit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.caffeinatedcoder.com/book-review-lean-software-development-an-agile-toolkit/</feedburner:origLink></item>
		<item>
		<title>The Case of 64-Bit .NET Upgrade Bug</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/COGmokdfRTE/</link>
		<comments>http://www.caffeinatedcoder.com/the-case-of-64-bit-net-upgrade-bug/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 19:25:17 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Musings, Rants]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=805</guid>
		<description><![CDATA[Disclaimer: This is not an exotic edge case or even a particularly difficult bug to figure out. I am merely writing about it because I managed to learn a few useful things about how .NET works in a 64 bit environment as I was investigating it and thought it might be useful to share.
The Bug: We recently [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><strong>Disclaimer: </strong>This is not an exotic edge case or even a particularly difficult bug to figure out. I am merely writing about it because I managed to learn a few useful things about how .NET works in a 64 bit environment as I was investigating it and thought it might be useful to share.</p>
<p><strong>The Bug: </strong>We recently upgraded one of our desktop apps from  .NET 1.1 to 3.5 and our tester reported that it immediately crashed during start-up on a 64-bit machine (both XP and Vista). There were no problems with it  prior to the upgrade and it still worked fine on 32 bit machines (…or rather, it did after we fixed all the cross-threading exceptions). The event viewer only showed a rather unhelpful unhandled exception in the Kernel32.dll (exception  code 0xe0434f4d).</p>
<p><strong>The Mystery: </strong>Why would upgrading an app cause it to stop working on a 64 bit machine? Wouldn’t upgrading it make it more rather than less likely to work on a newer machine?</p>
<p><strong>Clues:</strong></p>
<ol>
<li>We have another desktop app that went through a similar upgrade but experienced no problems on a 64 bit machine.</li>
<li>The desktop app in question uses the default build configuration.</li>
<li>The application references an older ActiveX component.</li>
</ol>
<p><strong>Helpful Facts:</strong></p>
<ol>
<li><strong>64-bit machines support running applications as both 32-bit processes and 64-bit processes</strong>. The simplest way to find out if <img class="size-full wp-image-807" title="64bit_post1" src="http://www.caffeinatedcoder.com/wp-content/uploads/2010/02/64bit_post11.png" alt="64bit_post1" width="237" height="79" align="right" style="padding:10px" />an application is running as 32-bit is to look for the *32 suffix in task manager. When testing a pre-upgraded version of the app, the suffix was there.  After the upgrade it wasn’t there.</li>
<li><strong>1.1 apps automatically run as 32-bit processes, but 2.0 apps can be run as either</strong>. On 64 bit machines, the OS looks at a flag in the PE header of the executable to determine which type of process it should run in. The flag is set by the compiler and can be ‘x86’, ‘x64’, or AnyCPU. AnyCPU means that it will run as a 32-bit process on 32-bit Windows and as a 64-bit process on 64-bit windows. The default configuration in Visual Studio is AnyCPU.</li>
<li><strong>A 64-bit process cannot load 32-bit dll’s</strong> – The application will crash with a BadImageFormatException.</li>
</ol>
<p><strong>The Culprit: </strong>The problem was obviously the ActiveX Control,  which was a 32-bit dll. It didn’t cause problems before the upgrade because the  application was forced to load in a 32-bit process since it was using the 1.1  framework. Once it was upgraded, it started loading in a 64-bit process because of the ‘AnyCPU’ default configuration we were using.</p>
<p><strong>Our Solution:</strong> We simply changed the build configuration to ‘x86’, which forces our app to run in a 32-bit process. I read where you can also make an out of process COM server that wraps the 32-bit dll, but that seemed like more work than we were willing to do at the time.</p>
<p><img class="aligncenter size-full wp-image-808" title="64bit_post3" src="http://www.caffeinatedcoder.com/wp-content/uploads/2010/02/64bit_post3.png" alt="64bit_post3" width="250" height="50" /></p>
<p/>
As I warned, nothing particularly complicated or earth-shattering, but some good fundamentals to be aware of when debugging apps on 64-bit machines.</p>
<p>Anybody else have interesting 64-bit bug war stories or helpful hints?</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=805&type=feed" alt="" />

<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/COGmokdfRTE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/the-case-of-64-bit-net-upgrade-bug/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.caffeinatedcoder.com/the-case-of-64-bit-net-upgrade-bug/</feedburner:origLink></item>
		<item>
		<title>Book Review: the CLR via C#</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/aluSJmR7nac/</link>
		<comments>http://www.caffeinatedcoder.com/book-review-the-clr-via-c/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 01:27:38 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Reviews]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=762</guid>
		<description><![CDATA[As promised, here’s my review of the January book, the CLR via C# by Jeffrey Richter, from my 2010 tech book reading list.
Rating -  (3 out of 5 stars)
Prerequisites

IL Tutorial – Although most of the samples in the book are in C#, there are several key code samples in IL and the book doesn’t [...]


Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/book-review-lean-software-development-an-agile-toolkit/' rel='bookmark' title='Permanent Link: Book Review &#8211; Lean Software Development: An Agile Toolkit'>Book Review &#8211; Lean Software Development: An Agile Toolkit</a> <small>I just finished my February book from my 2010 tech...</small></li><li><a href='http://www.caffeinatedcoder.com/technical-book-sequels-a-case-study-in-trying-to-salvage-a-second-edition/' rel='bookmark' title='Permanent Link: Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition'>Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition</a> <small>In a recent post, I raved about Jon Skeet’s book,...</small></li><li><a href='http://www.caffeinatedcoder.com/on-c-in-depth-and-the-state-of-old-school-technical-publishing/' rel='bookmark' title='Permanent Link: On C# in Depth and the State of Old School Technical Publishing'>On C# in Depth and the State of Old School Technical Publishing</a> <small>I recently downsized my technical library and got rid of...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/0735627045?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0735627045"><img class="size-full wp-image-763" style="margin: 10px;" title="clr_via_c#_book" src="http://www.caffeinatedcoder.com/wp-content/uploads/2010/02/clr_via_c_book.jpg" alt="clr_via_c#_book" width="131" height="160" align="right" /></a>As promised, here’s my review of the January book, <a href="http://www.amazon.com/gp/product/0735627045?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0735627045">the CLR via C#</a> by Jeffrey Richter, from my <a href="http://www.caffeinatedcoder.com/return-of-the-becoming-a-better-developer-meme-my-2010-smart-goal/">2010 tech book reading list</a>.</p>
<p><strong>Rating -</strong> <img class="size-full wp-image-761 alignnone" title="star_sm" src="http://www.caffeinatedcoder.com/wp-content/uploads/2010/02/star_sm1.jpg" alt="star_sm" width="20" height="19" /> <img title="star_sm" src="../wp-content/uploads/2010/02/star_sm1.jpg" alt="star_sm" width="20" height="19" /><img title="star_sm" src="../wp-content/uploads/2010/02/star_sm1.jpg" alt="star_sm" width="20" height="19" />(3 out of 5 stars)</p>
<p><strong>Prerequisites</strong></p>
<ol>
<li><strong>IL Tutorial</strong> – Although most of the samples in the book are in C#, there are several key code samples in <a href="http://en.wikipedia.org/wiki/Common_Intermediate_Language">IL</a> and the book doesn’t provide much help for the uninitiated. I think I got a few hundred pages into the book before I relented and took a 100 page reading detour through the first couple of chapters of <a href="http://www.amazon.com/gp/product/B0000B0SZ0?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B0000B0SZ0">Advanced .NET Programming</a> so that I could get a better grasp of the basic IL instructions and concepts. My reading sessions went much more smoothly after I did that.</li>
</ol>
<p><strong>The Good</strong></p>
<ol>
<li><strong>Illustrative scenarios with diagrams</strong> – I’ve read about value and reference types, the stack and the heap, boxing and unboxing, and the generational algorithm for garbage collection several times before, but I felt like this was the first time that I moved beyond a superficial conceptual<img class="size-full wp-image-778" style="margin: 10px;" title="clrviac#_med" src="http://www.caffeinatedcoder.com/wp-content/uploads/2010/02/clrviac_med.jpg" alt="clrviac#_med" width="250" height="153" align="right" /> understanding. This is primarily due to Jeffrey Richter’s approach of providing concrete code-based examples interspersed with helpful state diagrams. The picture to the right from his “How Things Relate at Runtime Section” in Chapter 4 shows the contents of the thread stack and heap as of a certain line in a simple code sample. His diagrams showing the contents of the heap, the finalization list, and the freachable queue as of each line in the sample code from his chapter on automatic memory management were also incredibly helpful in understanding how garbage collection works.</li>
<li><strong>Critical Analysis</strong> – The author periodically presents some strong and sometimes unexpected opinions on various topics through the book. Despite disagreeing with him on several points, such as sealing classes by default or avoiding the use of properties, I always felt like I gained new insights from reading his arguments. For example, I never knew that switching from unsealed to sealed breaks backward compatibility or that the JIT compiler produces more efficient code for sealed classes because it can call it non-virtually. Neither argument was enough to outweigh the testability issue in my mind, but it did give me a better mental hook to assimilate the knowledge than just reading a bunch of random facts in the style of a reference book would have.</li>
<li><strong>Novel Perspective</strong> – A few years ago I probably would have dismissed the book based on the title and the frequent use of IL as code samples because my focus as a developer was much more on the language than the runtime. Much like with the hardware on my computer, I expected the virtual machine my code was running on to just work for me and preferred to be shielded from what was under the hood whenever possible. However, as new language features rely more and more on the compiler to perform the magic, the potential for gaining insight into the language by moving closer to the runtime and looking at the IL (Intermediate Language) that the compiler generates increases dramatically. For example, rather than having separate chapters on anonymous methods, lambdas, and closures like most C# books, this book simply has sub-sections in the delegate chapter entitled syntactic shortcut # 1, 2,3, and 4. The decision to use that structure alone did more to provide insight into these new features than the vast majority of other C# books that I have read.</li>
</ol>
<p><strong>The Bad</strong></p>
<ol>
<li><strong>Lack of editorial discipline</strong> – I have to admit that I experienced periodic bouts of boredom with this book because there were sections that read like reference manuals (e.g. tables with API descriptions) or else included excruciating details about edge cases that seemed to be included more for thoroughness than as a way to explore or illustrate an important concept. This was particularly frustrating because I found myself jumping into skim mode or not fully paying attention and thus almost missing the scattered gems. In my opinion, the book could have gone from good to great if an editor had told him to put a disclaimer about not being comprehensive in the Forward and then challenged him to trim at least a 100-150 pages from the book. In order for a book to be great, it has to hold my attention for the majority of the time and this simply didn’t do it.</li>
<li><strong>Outdated coding conventions (nitpicker’s corner) – </strong>It was pretty easy to ignore this, but I have to admit that it threw me for a loop to see all the m_ variable prefixes in the code samples. I thought it was especially odd since the book was published from Microsoft Press since Microsoft has officially discouraged <a href="http://en.wikipedia.org/wiki/Hungarian_notation">Hungarian</a> notation for quite a while.</li>
</ol>
<p><strong>What’s Missing?</strong></p>
<ol>
<li><strong>A larger perspective on virtual machines</strong> – I would have loved to have read a chapter that explained where the CLR fits into the larger picture of virtual machines. It would have been nice to know a little bit of history as well as some analysis of what is innovative about Microsoft’s runtime and what is lacking in comparison to other execution engines such as the <a href="http://en.wikipedia.org/wiki/Java_Virtual_Machine">JVM</a>.</li>
</ol>
<p><strong>Recommended Sections &amp; Chapters </strong>(for lunchtime perusal at the bookstore)</p>
<ol>
<li>How the Runtime Resolves Type References (Chpt. 3 – pg. 85)</li>
<li>How Things Relate at Runtime (Chpt.  4 – pg. 107)</li>
<li>Reference and Value Types (Chpt. 5 – pg. 123)</li>
<li>Boxing and Unboxing Value Types (Chpt. 5 – pg. 129)</li>
<li>Exceptions (Chpt. 20)</li>
<li>Automatic Memory Management (Chpt. 19)</li>
<li>Threading (Chpt. 23 &amp; 24)</li>
</ol>
<p><strong>Conclusion</strong> – It definitely qualifies as one of the seminal .NET technical books that you should probably try to read it if you’re serious about increasing your depth of knowledge about C# and the CLR. However, if you do find yourself starting to lose interest while reading, then I recommend give simply yourself permission to skim sections that you are already familiar with. There are too many hidden gems in there to let the slow sections derail you from reading it cover to cover.</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=762&type=feed" alt="" />

<p>Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/book-review-lean-software-development-an-agile-toolkit/' rel='bookmark' title='Permanent Link: Book Review &#8211; Lean Software Development: An Agile Toolkit'>Book Review &#8211; Lean Software Development: An Agile Toolkit</a> <small>I just finished my February book from my 2010 tech...</small></li><li><a href='http://www.caffeinatedcoder.com/technical-book-sequels-a-case-study-in-trying-to-salvage-a-second-edition/' rel='bookmark' title='Permanent Link: Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition'>Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition</a> <small>In a recent post, I raved about Jon Skeet’s book,...</small></li><li><a href='http://www.caffeinatedcoder.com/on-c-in-depth-and-the-state-of-old-school-technical-publishing/' rel='bookmark' title='Permanent Link: On C# in Depth and the State of Old School Technical Publishing'>On C# in Depth and the State of Old School Technical Publishing</a> <small>I recently downsized my technical library and got rid of...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/aluSJmR7nac" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/book-review-the-clr-via-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.caffeinatedcoder.com/book-review-the-clr-via-c/</feedburner:origLink></item>
		<item>
		<title>Return of the Becoming a Better Developer Meme: My 2010 SMART Goal</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/IAs7DaDOszA/</link>
		<comments>http://www.caffeinatedcoder.com/return-of-the-becoming-a-better-developer-meme-my-2010-smart-goal/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 15:10:32 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Musings, Rants]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=753</guid>
		<description><![CDATA[When I first started writing this blog, I devoted several posts to planning and describing my efforts to become a better developer.
Although I was inspired by a certain unnamed developer’s public quest to read a book a week for six months, I never chose reading technical books as one of my goals.
I’m not sure why [...]


Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/book-review-lean-software-development-an-agile-toolkit/' rel='bookmark' title='Permanent Link: Book Review &#8211; Lean Software Development: An Agile Toolkit'>Book Review &#8211; Lean Software Development: An Agile Toolkit</a> <small>I just finished my February book from my 2010 tech...</small></li><li><a href='http://www.caffeinatedcoder.com/return-thoughtswherex-xiscaffeineinspired/' rel='bookmark' title='Permanent Link: return thoughts.Where(x => x.IsCaffeineInspired)'>return thoughts.Where(x => x.IsCaffeineInspired)</a> <small>It’s too hard to pick just one topic to delve...</small></li><li><a href='http://www.caffeinatedcoder.com/technical-book-sequels-a-case-study-in-trying-to-salvage-a-second-edition/' rel='bookmark' title='Permanent Link: Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition'>Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition</a> <small>In a recent post, I raved about Jon Skeet’s book,...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>When I first started writing this blog, I devoted several posts to <a href="http://www.caffeinatedcoder.com/my-six-month-roadmap-to-becoming-a-better-developer/">planning</a> and <a href="http://www.caffeinatedcoder.com/one-month-progress-report-on-being-a-better-developer/">describing </a>my efforts to become a better developer.</p>
<p>Although I was inspired by a certain unnamed developer’s <a href="http://graysmatter.codivation.com/post/How-I-Am-Becoming-A-Better-Developer-Part-1-Of-Infinity.aspx">public quest to read a book a week for six months</a>, I never chose reading technical books as one of my goals.</p>
<p>I’m not sure why I didn’t consider reading technical books as a worthwhile endeavor at the time. Perhaps it was because I was overly infatuated by my RSS reader or maybe I was just fixated on the burgeoning list of tools, frameworks, and open source projects that I had only recently become aware of after finally branching out from my Microsoft-centric comfort zone.</p>
<p>Whatever the reason, I now find myself with a very different perspective on what will help me grow the most as a developer.</p>
<p>For one thing, after reflecting on my own strengths and weaknesses I realized that I have been focusing on breadth of knowledge for too long and now need to concentrate on increasing my depth of knowledge about software development. I decided the best way to remedy this current imbalance was to embark on a methodical journey to finally read the dozen or more high quality books on software development that I currently have collecting dust on my shelves.</p>
<p><strong>My 2010 professional goal is to read one of the technical books in the picture below each month for twelve months and then do a blog post reviewing each one.</strong></p>
<p><img class="aligncenter size-full wp-image-754" title="SMART_Goal_books" src="http://www.caffeinatedcoder.com/wp-content/uploads/2010/02/SMART_Goal_books1.JPG" alt="SMART_Goal_books" width="400" height="533" /></p>
<p>When I first hatched this plan a few months ago, I put some serious thought into the best way to ensure that I would actually meet this goal. I knew that publicly announcing an ambitious goal would provide some motivation, but probably wouldn’t be enough, especially since I have been apt to abandon blogging for 4-5 month stretches these days.</p>
<p>Instead, I opted to take the <a href="http://www.career-intelligence.com/management/SmartGoals.asp">SMART</a> approach, which is acronym that describes the characteristics of well formed goals. I first read about in <a href="http://www.amazon.com/gp/product/1934356050?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1934356050">Pragmatic Thinking and Learning: Refactor Your Wetware</a> and was impressed how such a simple concept really helped me to refine my goals in ways that made me much more likely to achieve them.</p>
<p>How did I make my goal SMART?</p>
<ul>
<li> <strong>S – Specific </strong>– I didn’t just make a vague statement about reading more technical books. Instead I went to the trouble of picking out exactly how many and which ones I was going to read (although I left the order unspecified to give me a little bit of freedom to pursue what was most interesting or relevant to me at the time).</li>
<li><strong>M – Measurable </strong>– Writing a blog post review after finishing each book not only serves as a clear finish line for each monthly goal, but also provides a good way to mentally assimilate the information in each book from a <a href="http://en.wikipedia.org/wiki/SQ3R">SQ3R</a> reading perspective.</li>
<li><strong>A – Achievable</strong> – I didn’t want to make myself miserable for a year with unrealistic demands on my time, so I sat down and thought about the maximum number of hours I could realistically spend doing technical reading in a week (10 hr) as well as how many pages I average an hour on technical reading (25 pg) and how long my biggest books were (800 pg). After doing the math, I figured out that I could realistically handle one book a month, especially if I alternated between easy and challenging books. So far I’ve validated my hypothesis by successfully tackling one of my toughest books in January, <a href="http://www.amazon.com/gp/product/0735627045?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0735627045">CLR via C#</a> by Jeffrey Richter, and also being ahead of schedule for finishing my February book, <a href="http://www.amazon.com/gp/product/0321150783?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0321150783">Lean Software Development: An Agile Toolkit</a> by Mary and Tom Poppendieck.</li>
<li><strong>R – Relevant</strong> – Besides addressing my concerns about focusing too much on breadth of knowledge and not enough on depth, I also found these goals to be particularly relevant to me because I had just received 6 new ones in the mail due to my amazon gift certificate windfall that I got from taking JP Boodhoo’s <a href="http://www.jpboodhoo.com/training.oo">Nothing But .NET</a> class last fall and thus was suffering from a nasty spike of unread book guilt.</li>
<li><strong>T – Time-Boxed</strong> – Setting clear time deadlines is essential in order in terms of both motivation and measuring success. I chose one month reading iterations because they were easy to track (my January book is…) and it kept me on a brisk yet sustainable pace.</li>
</ul>
<p>As I already mentioned, I’ve completed one of my books so I’m off to work on my first review.</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=753&type=feed" alt="" />

<p>Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/book-review-lean-software-development-an-agile-toolkit/' rel='bookmark' title='Permanent Link: Book Review &#8211; Lean Software Development: An Agile Toolkit'>Book Review &#8211; Lean Software Development: An Agile Toolkit</a> <small>I just finished my February book from my 2010 tech...</small></li><li><a href='http://www.caffeinatedcoder.com/return-thoughtswherex-xiscaffeineinspired/' rel='bookmark' title='Permanent Link: return thoughts.Where(x => x.IsCaffeineInspired)'>return thoughts.Where(x => x.IsCaffeineInspired)</a> <small>It’s too hard to pick just one topic to delve...</small></li><li><a href='http://www.caffeinatedcoder.com/technical-book-sequels-a-case-study-in-trying-to-salvage-a-second-edition/' rel='bookmark' title='Permanent Link: Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition'>Technical Book Sequels: A Case Study in Trying to Salvage a Second Edition</a> <small>In a recent post, I raved about Jon Skeet’s book,...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/IAs7DaDOszA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/return-of-the-becoming-a-better-developer-meme-my-2010-smart-goal/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.caffeinatedcoder.com/return-of-the-becoming-a-better-developer-meme-my-2010-smart-goal/</feedburner:origLink></item>
		<item>
		<title>The Zen of “Go Away” Rates</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/1ACES_xja4w/</link>
		<comments>http://www.caffeinatedcoder.com/the-zen-of-%e2%80%9cgo-away%e2%80%9d-rates/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 13:38:21 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Musings, Rants]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=725</guid>
		<description><![CDATA[A friend of mine recently revealed a super, ninja-level consultant secret to me.
Whenever his work pipeline floweth over and an unknown client approaches him with a job, he quotes them a ridiculously high rate that he assumes they would never accept.
He calls it his “Go Away” rate.
The only problem is that these clients often do [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-726" style="padding:10px" title="wine-label-324x205" src="http://www.caffeinatedcoder.com/wp-content/uploads/2009/10/wine-label-324x205.jpg" alt="wine-label-324x205" width="250" height="158" align="right" />A friend of mine recently revealed a super, ninja-level consultant secret to me.</p>
<p>Whenever his work pipeline floweth over and an unknown client approaches him with a job, he quotes them a ridiculously high rate that he assumes they would never accept.</p>
<p>He calls it his “Go Away” rate.</p>
<p>The only problem is that these clients often do accept his proposal.</p>
<p>In fact, my friend admitted to me with a certain amount of amusement that he has noticed that clients are actually much less likely to balk and haggle over his “Go Away” rate than they are his normal, more reasonable hourly rate.</p>
<p>It reminds me of a <a href="http://dsc.discovery.com/news/2008/01/14/wine-brain-behavior.html">recent wine tasting experiment</a> that I read about where subjects did a taste test for a variety of wines and the only piece of information they were given was the price.</p>
<p>Not surprisingly, the subjects of the experiment overwhelmingly reported enjoying the pricier wines more even though the sneaky researchers often swapped the price labels between the cheap and expensive wines.</p>
<p>What is surprising, however, is that according to brain scans that were conducted by researchers during the experiment, people actually did experience more pleasure while drinking the cheap wines that they thought were pricier and not simply falsifying their answers to avoid looking uncultured.</p>
<p>In other words, the wine actually tasted better to them simply because they believed that the wine was higher quality.</p>
<p>While that improves the prospects for many consultants hoping to take that 4 week vacation to the Bahamas this year, what lesson can us poor salaried corporate slaves glean from this experience?</p>
<p>Although most developers don’t have the luxury of being able to quote a “Go Away” rate, they often do (at least on a subconscious level) have the option of giving a “Go-Away” estimate.</p>
<p>Don’t believe me? Consider the following scenario.</p>
<p>Your boss asks you how long it takes to code a CRM system from scratch using your dream technology stack. Do you actually sit down and give him the bad news, which is that the project probably won’t be finished until after he retires or is fired for incompetence or do you succumb to the typical developer’s hopeless optimism and mumble a couple of months?</p>
<p>Now, what if on the same day your boss asks you to give an estimate of how long it would take to change the color of some text on a legacy PowerBuilder app?</p>
<p>Just to make it interesting, let’s assume that the app in question is written using an unsupported version of PowerBuilder. Moreover, the data travels through no less than <a href="http://www.rubegoldberg.com/">6 rube goldbergian</a> layers, the highpoint of which is an excel worksheet written by a disgruntled accountant and a 5000 line .bat file written by the network admin who just sent to prison for embezzlement. To top it off,  it interacts with a mainframe you’ve never heard of that was scheduled to be retired a decade before you started working there.</p>
<p>In the second scenario, would you err on the side of optimism or would you promptly ask your HR person how much time is left before you vest and then multiply that answer by 8 in order to derive your very own “Go Away” estimate?</p>
<p>If you noticed yourself leaning towards the second option, then you may want to stop and consider what we’ve just learned from the wine researchers.</p>
<p>If you over-inflate your time estimate too much, then you may inadvertently make your boss want that change all the more.</p>
<p>Quote too high of a &#8220;Go Away&#8221; estimate, and you’ll soon find yourself in a product kick-off meeting heading up a team of “high quality” consultants, all of whom are charging “go-away” rates, and listening to your CIO give a <a href="http://www.caffeinatedcoder.com/motivational-anti-patterns/">sunshine up the arse speech</a> about how the new TCII (Text-Colorization Improvement Initiative) is going to revolutionize the way you do business.</p>
<p>Don’t say I didn’t warn you.</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=725&type=feed" alt="" />

<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/1ACES_xja4w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/the-zen-of-%e2%80%9cgo-away%e2%80%9d-rates/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.caffeinatedcoder.com/the-zen-of-%e2%80%9cgo-away%e2%80%9d-rates/</feedburner:origLink></item>
		<item>
		<title>On Crimes Against Duct-Tape, Mental Masturbation, and Pretty Boy Disclaimers</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/XROrcVr1-vA/</link>
		<comments>http://www.caffeinatedcoder.com/on-crimes-against-duct-tape-mental-masturbation-and-pretty-boy-disclaimers/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 13:34:28 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Musings, Rants]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=706</guid>
		<description><![CDATA[I’m deeply sorry.
The post you are about to read is mental masturbation in its purest form.
Its sole purpose is to release the mental tension that has been distracting me and otherwise preventing me from moving on to more productive lines of thought.
Yes, you guessed it. I am about to add yet another blog post to [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-709" title="duct-tape-man" src="http://www.caffeinatedcoder.com/wp-content/uploads/2009/10/duct-tape-man.jpg" alt="duct-tape-man" width="249" height="298" align="right" />I’m deeply sorry.</p>
<p>The post you are about to read is mental masturbation in its purest form.</p>
<p>Its sole purpose is to release the mental tension that has been distracting me and otherwise preventing me from moving on to more productive lines of thought.</p>
<p>Yes, you guessed it. I am about to add <a href="http://blog.objectmentor.com/articles/2009/09/24/the-duct-tape-programmer ">yet</a> <a href="http://jeffreypalermo.com/blog/debunking-the-duct-tape-programmer/ ">another</a> <a href="http://codebetter.com/blogs/ian_cooper/archive/2009/09/28/beating-the-duct-programmer-with-generic-domains-subdomains-and-core-domains.aspx ">blog</a> <a href="http://ayende.com/Blog/archive/2009/09/30/duct-tape-programmers.aspx">post</a> to the <a href="http://codebucket.org/archive/2009/09/26/the-backyard-mechanic.aspx">already</a> <a href="http://devlicio.us/blogs/vinull/archive/2009/09/24/being-a-duct-tape-programmer.aspx">tedious</a> <a href="http://blogcoward.com/archive/2009/09/25/On-Laziness-Cowboys-and-Duct-Tape.aspx">list</a> of reactions to Joel Spolsky’s now infamous <a href="http://www.joelonsoftware.com/items/2009/09/23.html ">Duct Tape Programmer Post</a>.</p>
<p>So let’s skip the cerebral foreplay and jump straight in to my naked thoughts on the matter:</p>
<ol>
<li><strong>Did Joel really think that anyone would feel flattered by the Duct-Tape metaphor?</strong> – If you’re resourceful, then you might be able to use duct-tape get a car to the closest mechanic without the aid of a tow truck or keep pipes from flooding the house until the plumber gets there. If you’re <a href="http://www.imdb.com/title/tt0165375/">McGuyver</a>, you might even be able to fashion a bomb out of it. However, duct-tape is not typically a tool ascribed to artists or a material associated with fundamentally important work. Even <a href="http://jwz.livejournal.com/">Jamie Zawinski</a>, the hero of the post, appears to have taken it for a <a href="http://jwz.livejournal.com/1096593.html">back-handed compliment</a>. Many of Joel’s ideological allies in the mini-flame wars that ensued also conceded that it was an unfortunate choice of words.</li>
<li><strong>Is Netscape truly the ideal poster child for the ‘Just F__ing Ship It’ movement?</strong> I’ll concede that Netscape deserves a prominent place in history for its role in opening the web to the masses, but its long term track record for both quality and business success is problematic at best. Early versions of the browser were widely criticized for being excessively bug laden and the company eventually went bankrupt shortly after the <a href="http://www.joelonsoftware.com/articles/fog0000000069.html">failed rewrite debacle</a> that ended up causing a three year lag-time between releases. Although there’s definitely <a href="http://gigamonkeys.com/blog/2009/09/28/a-tale-of-two-rewrites.html">room to debate</a> exactly who was at fault for the spectacular failure, it seems to me like Netscape wasn’t the best choice to use as a centerpiece for this argument. Perhaps it would have been better to practice the <a href="http://en.wikipedia.org/wiki/Separation_of_concerns">Separation of Concerns</a> principle, one of those crazy design fads that Joel rails about, and split apart the book review thread from the other tangled ball of themes in this post. Then he could have selected a more effective example to illustrate his point.</li>
<li><strong>Does Joel really think multiple inheritance, templates, design patterns, and COM are good examples of the “fadish programming craziness” espoused by today’s architecture astronauts? – </strong>Perhaps he just forgot to insert “Imagine you were coding back in 1994” before he went off the latest installment of his <a href="http://www.joelonsoftware.com/articles/fog0000000018.html">architectural astronaut</a> rant. Then again, perhaps it has been a little too long since he’s been on the developer end of things and its time that he stick with the marketing and managerial topics that he have become his staple in recent years.</li>
<li><strong>Does he really not see the conflict of interest in starting a “shipping over quality” crusade while at the same time selling bug tracking software – </strong>At the risk of falling victim to a <a href="http://en.wikipedia.org/wiki/Ad_hominem">circumstantial ad-hominen</a>, Joel arguing against Test-Driven Development is a little like the proprietor of a fat person’s clothing store attacking the medical establishment for advocating diet and exercise as a way to lose weight. Perhaps he wouldn’t have been the recipient of quite so many pithy <a href="http://twitter.com/mhinze/status/4341230362">twitter</a> <a href="http://twitter.com/jbogard/status/4343587975">jabs</a> if he spent more time over the last few years focusing on substantive topics and less time pimping <a href="http://www.fogcreek.com/FogBUGZ/">FogBugz</a> on his blog.</li>
<li><strong>Why the “pretty boy” disclaimer?</strong> – This was the most confusing aspect of his post for me. It felt vaguely reminiscent of an old grade school “then I woke up” ending that I used to tack on to stories when I was just too afraid to to commit to their fundamental premise. Was he backpedalling because he realized that extolling “shipping above all else” as a heroic virtue was a fundamentally flawed premise when applied to the software industry at large? Perhaps he was trying to compensate for his unfortunate choice of the duct-tape analogy and reassure Jamie that he wasn’t actually making him the butt of a subtle joke. Then again, perhaps it was just a poor choice for an ending that served only to water down an already questionable piece of writing.</li>
</ol>
<p>Ah. So much better…</p>
<p><strong>The morning after</strong></p>
<p>So&#8230;Um…Joel…AWKWARD…I guess that was pretty harsh in hindsight.</p>
<p>Did I mention that <a href="http://www.amazon.com/gp/product/1590593898?ie=UTF8&amp;tag=caffcodeblog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1590593898">your original book </a><img style="border-bottom-style: none !important; border-right-style: none !important; margin: 0px; border-top-style: none !important; border-left-style: none !important" src="http://www.assoc-amazon.com/e/ir?t=caffcodeblog-20&amp;l=as2&amp;o=1&amp;a=1590593898" border="0" alt="" width="1" height="1" /> is still among my favorites and that I would probably ask you to autograph on some decidedly non-phallic-looking peripheral device if we ever met in person?</p>
<p>Unfortunately, I still think that your post pretty much sucked. Sorry.</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=706&type=feed" alt="" />

<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/XROrcVr1-vA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/on-crimes-against-duct-tape-mental-masturbation-and-pretty-boy-disclaimers/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://www.caffeinatedcoder.com/on-crimes-against-duct-tape-mental-masturbation-and-pretty-boy-disclaimers/</feedburner:origLink></item>
		<item>
		<title>To Take or Not To Take the Nothin’ But .Net Training…That is the Question</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/eCIk_14eOlQ/</link>
		<comments>http://www.caffeinatedcoder.com/to-take-or-not-to-take-the-nothin-but-net-training%e2%80%a6that-is-the-question/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 03:56:32 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Musings, Rants]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=694</guid>
		<description><![CDATA[It’s been a few weeks since I’ve taken the Jean-Paul Boodhoo’s Nothin’ But .NET training course and I’ve had enough time and recuperate and reflect more on the experience.
Although I really enjoyed the course and am glad I took it, it seems wrong to just give a blanket endorsement of the course.
I just don’t think [...]


Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/some-lessons-from-day-1-of-nothin-but-net/' rel='bookmark' title='Permanent Link: Some Lessons from Day 1 of Nothin But .Net'>Some Lessons from Day 1 of Nothin But .Net</a> <small>I&#8217;m working on 2 hours of sleep last night thanks...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-695" style="padding:10px" title="JP" src="http://www.caffeinatedcoder.com/wp-content/uploads/2009/09/JP.jpg" alt="JP" width="179" height="259" align="right" />It’s been a few weeks since I’ve taken the <a href="http://www.jpboodhoo.com/home.oo">Jean-Paul Boodhoo</a>’s <a href="http://www.jpboodhoo.com/training.oo">Nothin’ But .NET training course</a> and I’ve had enough time and recuperate and reflect more on the experience.</p>
<p>Although I really enjoyed the course and am glad I took it, it seems wrong to just give a blanket endorsement of the course.</p>
<p>I just don’t think that any training course can or should even try to be well suited for every type of person.</p>
<p>With that in mind, I tried to come up with a few helpful criteria to help someone who is thinking of taking the course make their decision.</p>
<p><strong>You may want to take the course if…</strong></p>
<ol>
<li>You are somewhat comfortable with 3.5 .NET syntax, but really want to geek out on Predicates, Actions, Funcs, and the angle bracket cesspool where they intersect with Generics.</li>
<li>You like using natural language API’s like <a href="http://fluentnhibernate.org/">Fluent NHibernate</a> and are curious about how to construct an <a href="http://martinfowler.com/bliki/DomainSpecificLanguage.html">internal DSL</a> of your own.</li>
<li>You are a Test Driven Development fanboy, but are looking for cleaner and more innovative ways of writing maintainable tests.</li>
<li>You think <a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)">design patterns</a> are just swell and wouldn’t dream of writing a Hello World app without at least a dozen classes, but would like to see these principals in practice by someone who really knows his stuff.</li>
<li>You prefer a code-centric approach to learning and want to spend most of your time either coding or watching someone else code rather than simply listening to concept-laden lectures.</li>
<li>You wouldn’t mind a little motivational kick in the butt.</li>
</ol>
<p><strong>You may want to run away screaming from the course if…</strong></p>
<ol>
<li>You don’t due well with sleep deprivation.</li>
<li>You are deeply cynical and motivational tangents cause you physical pain.</li>
<li>You view design as hopelessly subjective and are fast to dismiss any additional layers of indirection as over-engineering.</li>
<li>Although you might be interested in learning how to use MVC Frameworks and IoC Containers, the thought of creating your own implementations as a learning exercise seems downright ludicrous to you.</li>
<li>You are NOT someone who is ‘convention promiscuous’ and the thought of doing things like naming_methods_with_underscores immediately sends you into Rain Man mode.</li>
<li>You get frustrated easily whenever you don’t immediately understand what is going on. JP is of the &#8216;push yourself past your limits’ and ‘learn by immersion’ school of thought when it comes to teaching. Unless you are in the top 5-10% of programmers, you’re probably going to feel pretty lost at various points of the course. If you are someone who can’t deal well with that feeling, then this course is probably not be for you.</li>
</ol>
<p><strong>Great Big Fat Disclaimer &#8211; </strong>I get the feeling that the content of JP’s courses tends to change pretty dramatically from month to month. This is a testament to his own talent and discipline when it comes to being a continual learner. However, it also means that you should probably take characterizations of the course (like this one) with a grain of salt.</p>
<p><strong>Some Essential Preparation Tips For Those Crazy Enough to Take It- </strong>For those of you that have decided to take the plunge and sign up for a future Nothin But .NET course, I highly recommend that you take the course preparation seriously. At the very least, you should do the following:</p>
<ol>
<li><strong>Watch all of his <a href="http://www.dnrtv.com/">DNR TV</a> design videos</strong> – JP demonstrates design principals continually throughout the course, but doesn’t really take the time to explain them up front. It is helpful if you have a good grounding in these to begin with.</li>
<li><strong>Learn and Practice R# short-cuts</strong> &#8211; JP is a true <a href="http://www.jetbrains.com/resharper/documentation/presentation/codingSession/CodingSession.wmv">ReSharper Jedi</a> and therefore his coding demonstrations can be hard to keep up with if your brain isn’t already used to taking the mental shortcuts that R# allows you to take.</li>
<li><strong>Practice using his BDD Library Extensions</strong> – I feel pretty comfortable with TDD and am used to BDD-style naming conventions, but the <a href="http://blog.jpboodhoo.com/MoreNewConventionsForHowIOrganizeMyTests.aspx">fluent interface style BDD library</a> that JP wrote and uses in the course through me for a loop at first. I wish I would have taken the time to get used to it more before the course.</li>
<li><strong>Sleep extra the week before the course and consider staying in the hotel even if you are local</strong> – In the words of a good friend of mine, “No amount of Starbucks makes you smart at 2:00 am”, at least not after 17 straight hours of intense training. It didn’t help that I only got a few hours of sleep the first night because of a sick baby at home, but I definitely would have been better off if I had tried to get extra sleep the week before.</li>
</ol>
<p>That’s my two cents.</p>
<p>Any alumni out there want to offer a dissenting opinion?</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=694&type=feed" alt="" />

<p>Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/some-lessons-from-day-1-of-nothin-but-net/' rel='bookmark' title='Permanent Link: Some Lessons from Day 1 of Nothin But .Net'>Some Lessons from Day 1 of Nothin But .Net</a> <small>I&#8217;m working on 2 hours of sleep last night thanks...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/eCIk_14eOlQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/to-take-or-not-to-take-the-nothin-but-net-training%e2%80%a6that-is-the-question/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://www.jetbrains.com/resharper/documentation/presentation/codingSession/CodingSession.wmv" length="13855023" type="video/x-ms-wmv" />
		<feedburner:origLink>http://www.caffeinatedcoder.com/to-take-or-not-to-take-the-nothin-but-net-training%e2%80%a6that-is-the-question/</feedburner:origLink></item>
		<item>
		<title>Writing an SVN PreCommit Hook in .NET that integrates with Jira</title>
		<link>http://feedproxy.google.com/~r/caffeinatedcoder/ProY/~3/coM4qMMpTyI/</link>
		<comments>http://www.caffeinatedcoder.com/writing-an-svn-precommit-hook-in-net-that-integrates-with-jira/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 02:26:07 +0000</pubDate>
		<dc:creator>Russell Ball</dc:creator>
				<category><![CDATA[Technical How-To's]]></category>
		<category><![CDATA[Technical Overviews]]></category>

		<guid isPermaLink="false">http://www.caffeinatedcoder.com/?p=684</guid>
		<description><![CDATA[What are Subversion hooks and why would you use them?
Hooks are extension points that allow you to add behavior at various stages of the commit process through an executable file.
The most useful one is the probably the pre-commit hook because it allows you to prevent a commit from occurring, thus providing a way to enforce [...]


Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/frictionless-code-reviews/' rel='bookmark' title='Permanent Link: Frictionless Code Reviews'>Frictionless Code Reviews</a> <small>Having a second set of eyes on your code has...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p><strong>What are Subversion hooks and why would you use them?</strong></p>
<p>Hooks are extension points that allow you to add behavior at various stages of the commit process through an executable file.</p>
<p>The most useful one is the probably the pre-commit hook because it allows you to prevent a commit from occurring, thus providing a way to enforce whatever policies that can dream up to help your development process run more smoothly.</p>
<p>We use it to ensure that developers enter a valid <a href="http://www.atlassian.com/software/jira/">Jira</a> key into the commit notes, which is a crucial step in <a href="http://www.caffeinatedcoder.com/frictionless-code-reviews/">making our code review process as painless as possible</a>.</p>
<p><strong>How do pre-commit hooks work?</strong></p>
<p>All you have to do is create a console application or script named pre-commit and copy it in the hooks directory of your repository. Subversion will automatically execute any application following this convention before each commit.</p>
<p>The repository path and transaction id associated with the commit will be passed in as the first two arguments, thus allowing you to look up relevant information about the revision before making the decision about whether or not to allow the commit to occur.</p>
<p>To prevent the commit from happening, all you have to do is exit with a &#8216;1&#8242;. You can even display an explanatory message to the user (at least in TortoiseSVN) by writing to Console.Error.<br />
<img class="aligncenter size-full wp-image-685" title="SVNHook_tortoiseSVN_Failure_Message" src="http://www.caffeinatedcoder.com/wp-content/uploads/2009/09/SVNHook_tortoiseSVN_Failure_Message1.png" alt="SVNHook_tortoiseSVN_Failure_Message" width="450" height="220" /><br />
<strong></strong></p>
<p><strong>Using SharpSVN to Avoiding Command Line Parsing Hell</strong></p>
<p>During my first attempt at implementing a hook, I programmatically spawned a process and executed svnlook.exe to extract the information I needed about the revision.</p>
<p>This worked fine for simple cases, but quickly began to require some serious Command Line Parsing-Fu in order to accomplish what I wanted. At that point my “There-has-to-be-an-easier-way” alarm went off in my head, so I began to search around for a pre-built API to simplify the task.</p>
<p>I soon found <a href="http://sharpsvn.open.collab.net/">SharpSVN</a>, a stable open source project that is used by <a href="http://ankhsvn.open.collab.net/">AnkhSVN</a> and <a href="http://www.sharpdevelop.net/">SharpDevelop</a>.</p>
<p>Aside from a few annoying testability issues that forced me to create wrapper classes in order to do unit testing, I had a good experience with the framework and would definitely recommend it over rolling your own.</p>
<p><strong>Integrating with Jira</strong></p>
<p><a href="http://www.atlassian.com/software/jira/">Jira</a> exposes a large portion of their functionality through web services that you can access by simply turning the “Accept Remote API calls” option on in the General Configuration area of the administration page.</p>
<p>We use the key parsed from the comment to query the Jira web service and verify that the referenced issue is in an opened state and has a fix version that has not already been released.</p>
<p><strong>Downloading the Code</strong></p>
<p>I zipped up a sanitized version of our pre-commit hook that you can <a href="http://dl.getdropbox.com/u/930313/SVNPreCommitHook.7z">download</a> and either use as a learning sample or modify for your own use.</p>
<img src="http://www.caffeinatedcoder.com/?ak_action=api_record_view&id=684&type=feed" alt="" />

<p>Related posts:<ol><li><a href='http://www.caffeinatedcoder.com/frictionless-code-reviews/' rel='bookmark' title='Permanent Link: Frictionless Code Reviews'>Frictionless Code Reviews</a> <small>Having a second set of eyes on your code has...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p><img src="http://feeds.feedburner.com/~r/caffeinatedcoder/ProY/~4/coM4qMMpTyI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.caffeinatedcoder.com/writing-an-svn-precommit-hook-in-net-that-integrates-with-jira/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.caffeinatedcoder.com/writing-an-svn-precommit-hook-in-net-that-integrates-with-jira/</feedburner:origLink></item>
	</channel>
</rss>
