<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>On the Heap</title>
	<atom:link href="http://blog.ontheheap.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ontheheap.com</link>
	<description>Doing things well in software development; by Stephen Rylander</description>
	<lastBuildDate>Tue, 05 Jan 2010 20:50:01 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='blog.ontheheap.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/656aa5b4c6ade8b53edb557689453a0a?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>On the Heap</title>
		<link>http://blog.ontheheap.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.ontheheap.com/osd.xml" title="On the Heap" />
	<atom:link rel='hub' href='http://blog.ontheheap.com/?pushpress=hub'/>
		<item>
		<title>TypeMock gets it wrong on ORM</title>
		<link>http://blog.ontheheap.com/2010/01/05/typemock-gets-it-wrong-on-orm/</link>
		<comments>http://blog.ontheheap.com/2010/01/05/typemock-gets-it-wrong-on-orm/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 20:47:53 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[technical]]></category>
		<category><![CDATA[ORM TDD]]></category>

		<guid isPermaLink="false">http://blog.ontheheap.com/?p=129</guid>
		<description><![CDATA[The fellas at TypeMock recently discussed &#8220;Mocking only what you own&#8221; in response to a cogent though not very helpful post from normally lucid author Mark Needham.
Mark basically said don&#8217;t mock external dependencies SUCH AS Hibernate.  Not any external dependency.  Without getting into the functional versus unit/mock testing discussion I agree with Mark.  Why write [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=129&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>The fellas at <a href="http://site.typemock.com/this-week-in-test/2009/12/16/episode-7-survivors.html">TypeMock recently discussed </a>&#8220;Mocking only what you own&#8221; in response to a cogent though not very helpful post from normally lucid author <a href="http://www.markhneedham.com/blog/2009/12/13/tdd-only-mock-types-you-own/" target="_blank">Mark Needham</a>.</p>
<p>Mark basically said don&#8217;t mock external dependencies SUCH AS Hibernate.  Not any external dependency.  Without getting into the functional versus unit/mock testing discussion I agree with Mark.  Why write tests for an ORM. It should work.  That&#8217;s why we use ORM&#8217;s.</p>
<p>The TypeMock guys butchered the whole thought though suggesting that Mark should have a DAL that Hibernate uses.  Isn&#8217;t the beauty of ORM&#8217;s that is generates the DAL for you?  I really don&#8217;t know where they are coming from with these thoughts &#8211; but it&#8217;s not helpful from a company that makes mocking/type isolator frameworks.</p>
<p>My advice to TypeMock: take a stand.  Say it should be done one way or another, or, if you don&#8217;t understand ORM&#8217;s like hibernate don&#8217;t speak on it.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/129/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/129/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/129/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=129&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2010/01/05/typemock-gets-it-wrong-on-orm/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>
	</item>
		<item>
		<title>The Stories Teams Tell Themselves</title>
		<link>http://blog.ontheheap.com/2009/09/22/the-stories-teams-tell-themselves/</link>
		<comments>http://blog.ontheheap.com/2009/09/22/the-stories-teams-tell-themselves/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 03:11:09 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[essay]]></category>
		<category><![CDATA[teams]]></category>

		<guid isPermaLink="false">http://blog.ontheheap.com/?p=116</guid>
		<description><![CDATA[Teams carry their work with a portent they assume outsiders cannot understand.  An outsider in this instance can be a direct manager, a new team member, or, most likely, other teams within the organization.  This is a common theme – but let’s start with examining it from within a development team first.
The development team may [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=116&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Teams carry their work with a portent they assume outsiders cannot understand.  An outsider in this instance can be a direct manager, a new team member, or, most likely, other teams within the organization.  This is a common theme – but let’s start with examining it from within a development team first.</p>
<p>The development team may feel rushed to produce because the process for project prioritization is loose.  Once this happens a development team can begin to form dissonant beliefs – for instance, that no one understands their plight.</p>
<p>Since development work is highly specialized (i.e. there isn’t a career path from help desk to software developer) development team members can have trouble expressing their frustrations to others outside the team.  And when these producers of work become frustrated their level of dissonance can increase exponentially until they see it as them against everyone else.  Or, really, the beginning of the end.</p>
<p>At the same time another team, like marketing/advertising, can tell themselves that the campaign they are working on is all-important.  Maybe, in their minds, it is an immediate trump card to developer objections to time or effort.   Many non-technical teams see software as being construction only. They fail to recognize that software, though analytical, is still just a communication game – like the rest of business.  But, if the advertising team truly believes this, how can anyone argue a counter position without causing the other to be wrong.</p>
<p><img class="aligncenter" src="http://farm4.static.flickr.com/3281/2685295167_725cd82f42_o.jpg" alt="" width="402" height="337" /></p>
<p>Both teams spend too much time looking out and laying blame rather than looking in.  At the same time, both teams feel that what they do is the most important – but how can the teams be the antithesis of one another?  Wouldn’t that just lead to disaster?  Yes.</p>
<p>They both miss business goals by focusing only on each other and not what they can improve.   Is a new marketing campaign a success if they just sacrificed or compromised their architecture, personnel etc.  Will that ROI get measured?  On the other hand, is the platform upgrade a success if they missed two marketing goals in a row?</p>
<p>Sometimes, <em>A</em> occurs.  And sometimes <em>B</em> occurs.  Trying to figure out why is a losing game because narrating past experiences only takes into account a single viewpoint.  It’s a fallacy.  So, don’t waste time trying to figure out why you can’t execute.  Focus on executing.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/116/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/116/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/116/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=116&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2009/09/22/the-stories-teams-tell-themselves/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>

		<media:content url="http://farm4.static.flickr.com/3281/2685295167_725cd82f42_o.jpg" medium="image" />
	</item>
		<item>
		<title>Martin Fowler is a Regular Guy</title>
		<link>http://blog.ontheheap.com/2009/06/11/martin-fowler-is-a-regular-guy/</link>
		<comments>http://blog.ontheheap.com/2009/06/11/martin-fowler-is-a-regular-guy/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 20:53:59 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[essay]]></category>
		<category><![CDATA[academic]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[process]]></category>

		<guid isPermaLink="false">http://blog.ontheheap.com/?p=106</guid>
		<description><![CDATA[I didn’t think that before I met him, as brief of an encounter as it was. After all, he’s the author of Refactoring, Patterns of Enterprise Application Architecture and UML Distilled. He’s helped set the course of XP/Agile and regularly refers to my personal software hero, Kent Beck, as just “Kent”. Martin Fowler is respected, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=106&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I didn’t think that before I met him, as brief of an encounter as it was. After all, he’s the author of <a href="http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1244740369&amp;sr=8-2" target="_blank">Refactoring</a>, Patterns of Enterprise Application Architecture and UML Distilled. He’s helped set the course of XP/Agile and regularly refers to my personal software hero, Kent Beck, as just “Kent”. Martin Fowler is respected, experienced and his name is dropped in regular software parlance to justify, or condemn, a given practice.</p>
<p>But – he’s still a regular guy. A software engineer. A developer. A coder. Here is why.</p>
<p>I attended a “Friends and Family” <a href="http://www.thoughtworks.com/" target="_blank">ThoughtWorks </a>event at their headquarters in Chicago. The ThoughtWorks office is on the 25th floor of the ever imposing Aon Center building, which as some know, is a twin to the now gone World Trade Center buildings in New York City.</p>
<p>Their office space is designed to do two things: 1) induce violent jealousy of cube workers, and 2) show that they are hip coders and like Ruby. Since ThoughtWorks is a consultancy no one is ever there though. And if they are, you wonder what is wrong with them. However, they get to wear Puma’s, hoodies and generally expensive (a.k.a. designer) jeans. I wear “slacks”.</p>
<p>I attended a TW event before, so I had a general idea of the flow. For instance, I knew they would have some pizza so I didn’t cram my lunch in before I left. I also knew there would be mingling which I was ready for this time. I expected to schmooze with some developers at the CME or some random interactive shop.  Instead, there he was – Martin Fowler &#8211; just walking along. So I engaged him and it went something like this:</p>
<p>Me: “I love your books. I live by Refactoring.” (I’m a fanboy.)<br />
Fowler: “Thank you.” (What else could he say?)<br />
Me: “What are you thinking about nowadays? Like today? What’s on your mind?”<br />
Fowler: “Well, really, I have a problem with my website and I need to fix it. But I have to be here as well. It’s small, but it’s bothering me.”<br />
Me: “Your website?”<br />
Fowler: “Yes, there is a style issue.”<br />
Me: “On your site?”<br />
Fowler: “It’s minor, probably just CSS really.”<br />
Me: “But annoying?”<br />
Fowler: “Frustrating, yes.”<br />
Me: “So, let me get this right, Martin Fowler is concerned about CSS on his website. So, in that way you’re like all the other software engineers here leaving some problem behind at their desk to be here&#8230;”<br />
Fowler: “Very much, except, I don’t do any real work besides writing and talking.”</p>
<p>And so it came and went.  I didn&#8217;t occupy him much longer with additional inane questions and politely excused myself so he could do his expected mingling with the crowd.  After all, even though there was a panel, most people were probably there for him.  Like me.  I paid 8 bucks to take a cab across the Loop to see him and I hoped that shaking his hand would impart some type of wisdom via osmosis to my software skills.</p>
<p>So, he&#8217;s just a regular guy.  I&#8217;m probably not that different in circumstances than him when he really started rolling in the 90&#8217;s.  He has great ideas and the ability to make complex problems simple.  But, at the end of the day, little things like CSS still weigh on him; a web page not displaying correctly or a function not being optimum.  Stuff that software engineers are concerned about.  Like me and like him.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/106/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/106/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/106/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=106&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2009/06/11/martin-fowler-is-a-regular-guy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>
	</item>
		<item>
		<title>Warning!  Career Cancer!</title>
		<link>http://blog.ontheheap.com/2009/02/23/warning-career-cancer/</link>
		<comments>http://blog.ontheheap.com/2009/02/23/warning-career-cancer/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 03:47:18 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[essay]]></category>
		<category><![CDATA[teams]]></category>

		<guid isPermaLink="false">http://blog.ontheheap.com/?p=98</guid>
		<description><![CDATA[I too got mixed up in the comments on StackOverflow that Joel and Jeff  made about Robert Martin&#8217;s S.O.L.I.D. principles &#8211; to the point I was reading Coding Horror threads. (I leave out links and backstory to  Joel and Jeff to spare you the wasted hours of reading.)
While on CodingHorror I was reminded [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=98&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I too got mixed up in the comments on StackOverflow that Joel and Jeff  made about Robert Martin&#8217;s S.O.L.I.D. principles &#8211; to the point I was reading Coding Horror threads. (I leave out links and backstory to  Joel and Jeff to spare you the wasted hours of reading.)</p>
<p>While on CodingHorror I was reminded of the vulgarity that anonymity creates and the attitude of so many people in our industry.  They just don&#8217;t give a crap. They don&#8217;t care that they don&#8217;t know how to code, that there is a difference between awful design and good design.  That objects actually help refactoring and they aren&#8217;t blob classes.  They couldn&#8217;t care less.  Here is an example:</p>
<p>From codinghorror comments<br />
<a href="http://www.codinghorror.com/blog/archives/000856.html" target="_blank"> http://www.codinghorror.com/blog/archives/000856.html</a></p>
<blockquote><p>There&#8217;s one thing you can do trying to keep up with progress or code like you always did. If you started in maybe Fortran, Basic, VB, ASP or maybe PHP &#8211; you continue to script your code in good old plain procedural programming. Too much OO slows you down&#8230;<br />
New shiny thing,,, i don&#8217;t give a damn &#8211; I code it like I used to, get the machine obey my will, not the other way around&#8230;<br />
And you don&#8217;t get more paid if you code spaghetti or nice code when your boss asks for results, time is money!!!<br />
Ideals are good in a perfect world &#8211; I could say the search for programming utopia or something&#8230;</p></blockquote>
<p>Would anyone want this guy on their team?  He purports that he speaks for management&#8230;that they don&#8217;t care&#8230;well, they just don&#8217;t know he is sinking their software deeper and deeper into the mud.</p>
<p>So, I feel it&#8217;s my responsibility to warn you in Jeff Atwood fashion of this pariah. BEWARE!</p>
<p>They will leach onto your project, or you, and pull you down.  They will undermine your work, the progress you make or anything you do in the name of progress, or heaven forbid, process.  And it will all be stated in a backwards apologetic standard: &#8220;one design isn&#8217;t better than the other&#8221; or &#8220;200 line methods are fine, it can&#8217;t be done any other way&#8221;.  And, one of my personal favorites &#8220;no time for TDD. No time, no time&#8221;.</p>
<p>It&#8217;s all stated in a pedestrian manner until you begin to peal away at the onion.  &#8220;Hey, can&#8217;t we all get along.  There is no black or white &#8211; just gray&#8221;. Unfortunately, as in real life, there is black and there is white.  Billy is white and Sam is black.  Deal with it.  In software these folks will seriously suck the ever loving life out of you and then move on with their indecision, ignorance of the industry and belief that all things are equal.</p>
<p>Beware.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/98/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=98&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2009/02/23/warning-career-cancer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>
	</item>
		<item>
		<title>Refactoring Quickly with TDD</title>
		<link>http://blog.ontheheap.com/2009/02/07/refactoring-quickly-with-tdd/</link>
		<comments>http://blog.ontheheap.com/2009/02/07/refactoring-quickly-with-tdd/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 16:33:06 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[technical]]></category>
		<category><![CDATA[composition]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://blog.ontheheap.com/?p=80</guid>
		<description><![CDATA[The situation. I have a class, Edc, that has an interface:
IEdcFinder
It needs to be composed with one of a few data lookup methods. Like a method connecting to SQL or a method connecting to XML.  I don&#8217;t want the caller to have to configure this finder object with the data method.  I&#8217;d like to make [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=80&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>The situation. I have a class, Edc, that has an interface:</p>
<p>IEdcFinder</p>
<p>It needs to be composed with one of a few data lookup methods. Like a method connecting to SQL or a method connecting to XML.  I don&#8217;t want the caller to have to configure this finder object with the data method.  I&#8217;d like to make it easier.  Especially since this finder object is already being injected into another class as a pluggable object.</p>
<p>So, logically, move the construction of the finder to a factory method and compose the data method with it then.  I created a Factory class:</p>
<p>class EdcFinderFactory</p>
<p>But then, we have another class doing work.  So, with TDD, I switched the interface to an abstract class thinking I could use inheritance to mark all subclasses with a private constructor as well &#8211; and made the tests pass.  Good.</p>
<p>I was feeling OK about how things were going, but not thrilled.  I had working code but something smelled.  I realized something: there is only one class implementing IEdcFinder and that is EdcFinder.  Let&#8217;s remove duplication.</p>
<p>Remove: EdcFinderFactory<br />
Remove: IEdc</p>
<p>(There were actually many small steps in here making sure the system still passed.)</p>
<p>Left with:</p>
<p>EdcFinder<br />
public EdcFinder(){..}<br />
public Create(){&#8230;inside here we create an EdcFinder composed with IReadSomeData}</p>
<p>So, EdcFinder became a simple concrete class with it&#8217;s public constructor and the factory method.  And, as always, I ran the tests: Pass.  Then the constructor was marked private. Pass.  Remove the old abstract class (which was an interface to start with).</p>
<p>Now there was less code, less interfaces and easier to read code.  I was able to implement the &#8220;Replace Constructor with Factory Method&#8221; refactoring in just minutes and I know everything still works.</p>
<p>With TDD and my test suites I could change with out fear.</p>
<p>And two days later, I looked again  and removed this entire class realizing it was unnecessary and the data method could be simplified with Func&lt;T&gt;.  I switched everything in about an hour. Red, Green, Refactor.</p>
<p><em>Bon</em>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/80/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/80/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/80/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=80&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2009/02/07/refactoring-quickly-with-tdd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>
	</item>
		<item>
		<title>On Positive Affect and Software</title>
		<link>http://blog.ontheheap.com/2008/12/14/on-positive-affect-and-software/</link>
		<comments>http://blog.ontheheap.com/2008/12/14/on-positive-affect-and-software/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 18:09:30 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[essay]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[teams]]></category>

		<guid isPermaLink="false">http://blog.ontheheap.com/?p=70</guid>
		<description><![CDATA[A brief tale of software developer burnout:
Brandon sits down at his two year old HP workstation and scribbles his mouse across the plastic-laminate desktop.  The twin monitors snap to attention and he logs in without thinking about it; finger memory taking over long ago.  Visual Studio is already open, it’s been for the last month, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=70&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>A brief tale of software developer burnout:<br />
<em>Brandon sits down at his two year old HP workstation and scribbles his mouse across the plastic-laminate desktop.  The twin monitors snap to attention and he logs in without thinking about it; finger memory taking over long ago.  Visual Studio is already open, it’s been for the last month, because the project continues onward like warships of a 1984 Orwellian nightmare.</em></p>
<p><em>He’s worked at the same project for the last 11 months and management tells him the end is in sight.  His inbox describes an alternate view:<br />
Defect #234 -New- Wrong font color in IE 6<br />
Defect #188 &#8211; Reopened- Pricing is incorrect</em></p>
<p><em>Brandon’s usually up beat, but he has seen nothing but build reports and defects for months. His stake-holders haven’t even been reviewing key features &#8211; they’re waiting for the magic release where all feature are included and everything works according to a document that some managers have signed.</em></p>
<p><em>Starting QA after 10 moths didn’t feel like a success.  Nor does closing 30 defects in two weeks.  And now, as the winter starts, he can only look forward to shipping the 50,000 line project on a cold weekend.  It will feel good. Right? To be done with it.  Right? Wash his hands.  Move on.  To the next&#8230;project&#8230;</em></p>
<p>This isn’t an unusual case.  Even with supposed agile practices catching on, organizations like to hold scrums for the development team but the stake-holders choose to wait until it’s complete.  Even with the idea of software being complete an oddity and undefinable end point.  Yet, they’ll wait.</p>
<p>This outlook on software development has caused the most pain for the Brandon’s of the industry because there is a lack of incremental satisfaction.</p>
<p>Nassim Nicholas Taleb sites the idea of hedonic happiness in his book, the Black Swan, to examine the idea of hope in light of big singular rewards.  Meaning, many small rewards have a much greater effect on our overall happiness then one or two big ones very far apart.  This is called positive affect.  Taleb’s example is financially driven, but excellent.  Simply, a person will be happier making $100,000 a year as opposed to making $1,000,000 every ten years.  The amount of tension and angst for those ten long years can not be recouped with the big payout &#8211; especially if it might be another ten years until it happens again.  As humans, we’re simply not wired up like that.</p>
<p>This fits perfectly into the not so modern realm of software development that 90% of organizations participate in.  Remember Brandon waited 11 months before a release.  He waited 10 months until someone would even begin verifying his work.  Therefore, there were 10 months of effort without any reward.  If positive affect is indeed a true nature of humanity, then long development cycles are like a 30 story ledge that developers stand on crying week to week while looking at the cars below.</p>
<p>The Orwellian similitude&#8217;s carry on.  The ruling “Party” of 1984 used doublespeek as a way to control the masses;  simultaneously accepting as true two mutually contradictory beliefs.  I’ve see this in places I’ve worked &#8211; and I’m sure I’m not alone.  For example, the requirement is to be agile and to release all features at once.  To do incremental work, but not test until all increments are complete.  To look at iteration plans but not really care unless a feature might not make it at release day.</p>
<p>Are these contradictory? Indeed.  Are they agile.  Of course not.  We don’t have to wait for a solution.  It’s already been invented and bigger organizations can take advantage of it &#8211; if they will invest in a mindset change that iterations of the product and each one should be complete.  It’s going to take more training and experience for a stakeholder to really understand that an iteration is planned to be a deployable piece of work and not the subgrouping of tasks on a Gantt chart.</p>
<p>I won’t belabor the incremental, agile, continuous integration points.  The amount of literature and case studies is staggering. However, I’ll continue to make a case for the Brandon’s of the world.  Give Brandon some wins.  Schedule QA of the first iteration (even two iterations) of the project so that it’s in a deployable state. Then, and this is acrimonious to some, release it.  Actually, physically release it.  Then start the next set of features.  Help our Brandon’s feel the little frequent successes that nature makes us crave and then watch the productivity of a motivated software team soar.  Use positive affect to the advantage.</p>
<p>George Orwell’s 1984:<br />
<em>“To tell deliberate lies while genuinely believing in them, to forget any fact that has become inconvenient, and then, when it becomes necessary again, to draw it back from oblivion for just so long as it is needed, to deny the existence of objective reality and all the while to take account of the reality which one denies”</em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/70/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=70&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2008/12/14/on-positive-affect-and-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>
	</item>
		<item>
		<title>Speaking of ALM</title>
		<link>http://blog.ontheheap.com/2008/11/11/speaking-of-alm/</link>
		<comments>http://blog.ontheheap.com/2008/11/11/speaking-of-alm/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 03:34:17 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[process]]></category>

		<guid isPermaLink="false">http://ontheheap.wordpress.com/?p=59</guid>
		<description><![CDATA[Last week I spoke on our experiences with Application Lifecycle Management at a Microsoft Partner event (Centare) at the Harley Davidson Museum in Milwaukee.  It was an early morning event, starting at 7:30, which was a challenge for me to get to &#8211; but I enjoy ALM so much I made the trip from [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=59&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Last week I spoke on our experiences with Application Lifecycle Management at a Microsoft Partner event (Centare) at the <a href="http://www.harley-davidson.com/wcm/Content/Pages/HD_Museum/Museum.jsp?locale=en_US" target="_blank">Harley Davidson Museum</a> in Milwaukee.  It was an early morning event, starting at 7:30, which was a challenge for me to get to &#8211; but I enjoy ALM so much I made the trip from Chicago.</p>
<p><img class="alignnone size-full wp-image-61" title="0e99c6db6bec" src="http://ontheheap.files.wordpress.com/2008/11/0e99c6db6bec.jpeg?w=479&#038;h=600" alt="0e99c6db6bec" width="479" height="600" /></p>
<p>My talk was an expanded and more implementation specific version of my article that published in <a href="http://blog.ontheheap.com/2008/09/10/in-ddj/" target="_blank">DDJ</a> this summer.  I try to make it fun &#8211; not everyone finds managing application lifecycles exciting.  In the end I hope the attendees left with a better understanding of what managing an applications life from idea to maintenance means for an organization &#8211; and how it doesn&#8217;t have to be a yawner.</p>
<p><img class="alignnone size-full wp-image-62" title="98f177c28151" src="http://ontheheap.files.wordpress.com/2008/11/98f177c28151.jpeg?w=479&#038;h=600" alt="98f177c28151" width="479" height="600" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/59/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=59&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2008/11/11/speaking-of-alm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>

		<media:content url="http://ontheheap.files.wordpress.com/2008/11/0e99c6db6bec.jpeg" medium="image">
			<media:title type="html">0e99c6db6bec</media:title>
		</media:content>

		<media:content url="http://ontheheap.files.wordpress.com/2008/11/98f177c28151.jpeg" medium="image">
			<media:title type="html">98f177c28151</media:title>
		</media:content>
	</item>
		<item>
		<title>Wrong About TDD</title>
		<link>http://blog.ontheheap.com/2008/10/30/wrong-about-tdd/</link>
		<comments>http://blog.ontheheap.com/2008/10/30/wrong-about-tdd/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 02:55:16 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[essay]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://ontheheap.wordpress.com/?p=54</guid>
		<description><![CDATA[Admitting you’re wrong is anything but easy.   It’s a shot in the arm of the pride that we all hold dear &#8211; in our personal or professional lives &#8211; and often, for better or worse, in both.  Five years of marriage taught me to admit fault or error when it’s valid.  And lately, this humility, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=54&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Admitting you’re wrong is anything but easy.   It’s a shot in the arm of the pride that we all hold dear &#8211; in our personal or professional lives &#8211; and often, for better or worse, in both.  Five years of marriage taught me to admit fault or error when it’s valid.  And lately, this humility, has spilled into my career as a software developer.</p>
<p>One can be wrong in myriad of ways.   There is fault in attitude, fault in actions, and fault in opinion &#8211; with Test Driven Development I was wrong on all three.  Gentle reader, following are the ways I wronged TDD and myself:</p>
<p><strong>Ways I was wrong:</strong><br />
1. The way I write software is fine.<br />
2.  I write complicated software &#8211; this won’t work here.  Object composition and encapsulation precludes TDD’s success.<br />
3.  This will slow me down.<br />
4.  It’s a fad.</p>
<p>Let’s dissect these.  My attitude was prideful (1); my abilities do not need improvement I told myself.  This is the sweet trap of stagnation we knowledge workers lay for ourselves.  Spending so much time creating models in our heads and expressing ideas in a language for machines ripens the opportunity to see our reflection as Turing, Beck or Fowler.</p>
<p>The applications I build are anything but trivial (2).  Is this a true statement?  Sure.  Not yes &#8211; aren’t most applications complicated?  And how would one consistently define one system as being more complex than another?  I could do it via lines of codes or cyclometric complexity &#8211; but that isn’t really what I told myself.  In fact, I belittled TDD as too small for the job because of my boastfulness stemming from fault number one (1).</p>
<p>Asking the question “will this slow me down?” is a trivial scapegoat for avoiding doing any task better (3).  This one is endemic of human nature because it’s difficult to argue the counterpoint &#8211; of course doing something new will be slower at first.  So does drying the dishes before putting them away, but the average domesticate prefers their cabinets not moonlighting as mold spore factories, so they will wipe that Crate and Barrel flower pattern down.</p>
<p>A couple months before I noted to write an essay on the benefits of TDD I planned a counter thesis &#8211; TDD is a fad (and it sucks)(4).  Yes, gentle reader, as egregious as it sounds I was quite comfortable in my anti-TDD stand; after all I was deluding myself with points one, two and three.  In fact, I reacted from cognitive dissonance; if I don’t write software well then TDD can not possibly be of benefit. Stated inversely: if TDD works there is something wrong with the way I write software. That kind of conclusion is demoralizing and my brain rejected it before I could even fully consider the implications.  I rejected TDD  to keep my ego in place for the job I spend my days contributing to.  This of course, led to confirmation bias (Nicholas Taleb terms this platonic confirmation in his book the Black Swan, http://www.fooledbyrandomness.com/) as I sought out evidence &#8211; again, the first three points &#8211; on how I was right and the TDD crowd was wrong.</p>
<p>If you can’t teach an old dog new tricks, like your author, it’s like pulling water from a rock to help a developer change a habit.  Now, tell them to not write cod and then test, but to write tests that write the code.  My struggle persisted.  So, I looked at the advantages &#8211; which are numerous.</p>
<p>Advantages</p>
<p><strong>Advantage #1 &#8211; Consumer Friendly</strong><br />
Aesthetics are more a part of coding than the secretly vain development community would like to admit.  What is the class named?  Does it take the correct parameters?  Is it a subclass of something else?  All these things are figured out iteratively because the test is the code.  In order to write the test “GetAccountNumber” you write what you would like to see in your code.</p>
<p>public void Test_GetAccountNumber()<br />
{<br />
IAccount account = new Account(44444);  //this class does not exist yet!<br />
int a = account.GetAccountNumber();  //this method does not exist yet!<br />
}</p>
<p>This idiom of works produces more readable code because it’s already been thought out and used before it ever hits the application.This is synonymous to building UI first for a UI app.</p>
<p>Start with the consumer.</p>
<p><strong>Advantage #2 &#8211; Interface Based Development</strong><br />
Entire books are written on interface based development.  Composition is preferred to inheritance and interfaces are the way to compose your objects, therefore interfaced based development is preferred.  Writing your tests first give you the opportunity early on to program to an interface, saving much grief later on.</p>
<p><strong>Advantage #3 &#8211; Prove it works the first time</strong><br />
As humans we look for ways to avoid pain and injury.  Which hurts less:  a) writing a method called GetAccountNumber and testing it to fill a drop down on a web page and watching the drop down render as empty, or b) run the unit test for the method and watch it pass or fail.  It is infinitely easier to debug the unit test.  The only parameters for the method GetAccountNumber in the unit test are what actually gets passed to the method; like the primitive number 413.  The parameters for testing the method in the web page are the entire context of the web page &#8211; possibly the entire site &#8211; as any number of run time errors can occur while manipulating other elements.</p>
<p>With TDD, the chances of success the first time a method or class is used in an application greatly increase and application debugging goes down.  They are inversely proportional.</p>
<p><strong>Advantage #4 &#8211; Proof it works after changes.</strong><br />
No matter if the program is a flight simulator, a line of business app or a huge e-commerce platform, all programers struggle with using their classes after they’re written.  Even with some up front class modeling, the first time a class is used is almost always a disastrous event.</p>
<p>For instance, let’s say the class built is called Mortgage. It looks like this:<br />
class Mortgage<br />
{<br />
public Mortgage(datetime startYear, dateTime endYear, double loan)<br />
{<br />
&#8230;.<br />
public datetime GetStartYear()<br />
{<br />
&#8230;<br />
&#8230;.</p>
<p>This is all simple enough.  The Mortgage class is plugged into an existing web app and the methods that it exposes are used by this application. Again, this is the normal course of events for software development the world over for the past, say, 30 years.</p>
<p>Just a week later  a new application feature is needed to calculate the amount of interest paid for the length of the loan &#8211; which requires knowing the interest rate.  Notice though, interest rate was not past in though the constructor.  There are now two options &#8211; 1) overload the constructor with a new version that accepts the interest rate or 2) expose a public property to set the interest rate.</p>
<p>Option 2 does not sound very elegant and can lead to object state issues as the object is not created atomically with all the data it needs to perform it’s behaviors.  So, the new GetInterest method could be called and throw an exception because it does not have the data it needs.  (I’ve done this&#8230;it was a really, really bad idea.)</p>
<p>Option 1 sounds like a golden parachute over the later option.  So, the constructor is overloaded with a new version:</p>
<p>public Mortgage(datetime startYear, dateTime endYear, double loan, double interest)<br />
{<br />
&#8230;</p>
<p>There are now two constructors for this object, and they need to stay this way for the time being because the Mortgage class is already used in 5 different places in the application.  In fact, Joe Developer is using the Mortgage class with the first constructor and adding new methods to the class.  Looking at that fact, it’s thought best not to change that first constructor because who knows what may break, or worse: misbehave at runtime.</p>
<p>The new Interest feature is now coded and approved by whomever approves these kinds of things and everyone is happy &#8211; until iteration 3.  A routine that Joe Developer coded needs to slide that Interest number into a grid.  Joey D thinks “no problem” and calls the GetInterest method: bang, dead.  It blew up.  There isn’t an interest value in the object because he constructed his object with the original constructor.</p>
<p>This could have been avoided by simply eliminating that first constructor which was leaving the object in an invalid state when the GetInterest method was added.  But that was scary.  Since there weren’t any tests on the methods of the Mortgage class it was deemed to risky to change the places where the first constructor was used and now every developer from this point on will run into the same problem.  Of course they can now decide to alter all the instances of the first constructor in the application &#8211; but the damage was already done; defects.</p>
<p><strong>Advantage #5 &#8211; Make the Brownfield easier to navigate.</strong><br />
As a professional we usually work in environments we did not bootstrap ourselves.  The environments are preexisting and have characteristics of their own.  Often, the code isn’t even legacy &#8211; it’s just there.  Any environment like this is referred to as a Brownfield and means integration work.  Integration is difficult because analyzing what may break with new or upgraded features can’t be seen until functional testing.  Writing tests first in a Brownfield will make your life easier &#8211; and the guy who comes next.</p>
<p><strong>Advantage #6 &#8211; Be a professional &#8211; take responsibility for your product</strong><br />
Simple economics dictate the likelihood of having a tester for every coder is the same as successfully writing software using a pencil.  Writing tests that prove code works before testers touch it ups the quality dramatically.  It’s a way to take responsibility for the product being created.</p>
<p><strong>Advantage #7 &#8211; Have fun.  Red, Green, Refactor.</strong><br />
Remember when writing software was fun.  When you referred to it as “coding” or “hacking out some code”?  Replace your TPS reports with TDD and bring a little fun back into the development cycle.</p>
<p>Doing Test Driven Development means that one small piece of functionality is being written and tested at a time.  It’s written. It breaks.  The code that the test is trying to run is written.  It breaks again: Red.  Tweak.  It passes: Green.  Now that it passes go and make it better.  Improving the code is no longer a fantasy.  It’s easily doable because it’s all covered by tests.  Refactor those primitives into an object or replace conditionals with polymorphism.  Or &#8211; this is fun- replace some meddlesome constructors with factory methods.  It’s not a dream with TDD &#8211; changes can be made as long as the test go Green.</p>
<p><strong>Advantage #8 -  Sleep better at night</strong><br />
Turn off the monitor(s), grab the keys and go home assured that things are working.  Pretend that it’s Monday and you cranked out the following code; four new classes and ten new methods.  That’s a good amount of new code introduced into an application in one day.  The build succeeded, good, but you’re still not sure that when your teammates get latest things will functionally work.  Now, pretend you had tests over all that new code and they all were Green when you left.  No worries. Better sleep.</p>
<p><strong>Advantage #9 -  End up with better software.</strong><br />
This is really what it’s all about.  Test Driven Development makes your code refactorable, which means it’s easier to change, which means it’s easer to optimize, which means it runs better which is correlated to less defects, less QA and easier releases.  And all that adds up to better software.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/54/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=54&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2008/10/30/wrong-about-tdd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>
	</item>
		<item>
		<title>The Myth of Enterprise Development</title>
		<link>http://blog.ontheheap.com/2008/09/15/the-myth-of-enterprise-development/</link>
		<comments>http://blog.ontheheap.com/2008/09/15/the-myth-of-enterprise-development/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 02:58:47 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[essay]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[teams]]></category>

		<guid isPermaLink="false">http://ontheheap.wordpress.com/?p=51</guid>
		<description><![CDATA[The term enterprise is consistently shot across conference tables  inside corporate IT and technology marketing departments. The term is most often ascribed to software and hardware systems running the core business; a reservation system for a hotel franchise, or a software package for payroll.  However, this attribution excludes all the software that runs at smaller [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=51&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>The term enterprise is consistently shot across conference tables  inside corporate IT and technology marketing departments. The term is most often ascribed to software and hardware systems running the core business; a reservation system for a hotel franchise, or a software package for payroll.  However, this attribution excludes all the software that runs at smaller companies.  So, what makes a system enterprise ready and which products are left looking in at the glowing warmth of Fortune 1000 server rooms while they desiccate.</p>
<p>Sadly, there isn&#8217;t much empirical evidence separating an enterprise ready app from any other piece of software.  A development manager requiring an enterprise developer doesn&#8217;t make the role anymore real than an engineer claiming to be a &#8220;people person&#8221;.  An HP blade server is no more enterprise ready being racked in a enormous corporate data center than in a startup’s cage at RackSpace.  Let&#8217;s dissect this hypothesis by looking at two very popular web frameworks: ASP.NET and Ruby on Rails.</p>
<p>Microsoft sits in the interesting position of selling the same software that runs small businesses and large enterprises.  This of itself should be enough to prove the term enterprise a loaded marking term &#8211; but let&#8217;s keep going: ASP.NET is Microsoft&#8217;s enterprise web platform.  It, coupled with IIS, provide everything needed to build dynamic multitiered web applications.  It has optimizations for Microsoft SQL Server, session and cache providers, error reporting, performance tuning, remote configuration, etc.  It can do just about anything a web application in 2008 would require.  Again, Microsoft, pundits and analysts say it is enterprise capable.</p>
<p>On the other extreme is Ruby on Rails.  Note, not just Ruby the programming language, but the Rails web framework as well.  What I&#8217;m embarking on is dangerous:  I am not a Rails expert and provide this caveat up front.  Rails is considered by popular opinion to not be enterprise ready.  What does it lack?  As far as I can tell, the only thing it really lacks is a support package, IDE and hordes of corporate programmers.</p>
<p>On it&#8217;s own, ROR is terribly productive.  The Active Record design pattern is built right in as a OR Mapper with the friendly and obvious name of &#8220;Active Record&#8221;.  So, it provides a concise model of objects over data right out of the box (if anything had a box these days).  The framework is based off the of tried and true MVC, model-view-controller, design pattern to provide distinction between data, middle tier and presentation.  This is a simple programming idiom used with GUI development, web applications or the myriad of systems that actually make&#8217;s power arrive to substations to power my MacBook (Pro, thank you very much).</p>
<p>I  provide these contrasts between the frameworks to illustrate the futility of using the term enterprise for one group of software products but not for another.  Because it gets better.  Bigotry of platforms like ROR grows as corporate IT software developers feel more threatened.  Hence their managers feel threatened and when Forester Research shows up all they hear is how platforms like ROR are not enterprise ready.  But it’s not a technology stack that is not ready for development in these corporations.  It’s the people.</p>
<p>In the end it&#8217;s that simple.  When people are not ready they will search for whatever means to prove their disaffection, dissatisfaction or ignorance about a product to be real when it’s empirically false.  This is why the enterprise is difficult to define: because it’s a constantly moving target through the emotions and minds of corporate software developers.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ontheheap.wordpress.com/51/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ontheheap.wordpress.com/51/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=51&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2008/09/15/the-myth-of-enterprise-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>
	</item>
		<item>
		<title>In DDJ</title>
		<link>http://blog.ontheheap.com/2008/09/10/in-ddj/</link>
		<comments>http://blog.ontheheap.com/2008/09/10/in-ddj/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 23:51:18 +0000</pubDate>
		<dc:creator>stephenzr</dc:creator>
				<category><![CDATA[technical]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[teams]]></category>

		<guid isPermaLink="false">http://ontheheap.wordpress.com/?p=48</guid>
		<description><![CDATA[There is something about paper.  In lieu of that, we have blogs.  Summary: I was recently published in Dr. Dobbs and now the online version has appeared.  It was a fun experience writing the article &#8211; it helps when you&#8217;re passionate about the topic of course.  Have a read.

       [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=48&subd=ontheheap&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>There is something about paper.  In lieu of that, we have blogs.  Summary: I was recently <a href="http://ddj.com/architect/210300282" target="_blank">published in Dr. Dobbs</a> and now the online version has appeared.  It was a fun experience writing the article &#8211; it helps when you&#8217;re passionate about the topic of course.  Have a <a href="http://ddj.com/architect/210300282" target="_blank">read</a>.</p>
<p><a href="http://ddj.com/architect/210300282" target="_blank"><img class="aligncenter size-full wp-image-49" title="ddj_cover_110x1491" src="http://ontheheap.files.wordpress.com/2008/09/ddj_cover_110x1491.jpg?w=110&#038;h=149" alt="" width="110" height="149" /></a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/ontheheap.wordpress.com/48/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/ontheheap.wordpress.com/48/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ontheheap.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ontheheap.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ontheheap.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ontheheap.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ontheheap.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ontheheap.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ontheheap.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ontheheap.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ontheheap.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ontheheap.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ontheheap.com&blog=3920892&post=48&subd=ontheheap&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ontheheap.com/2008/09/10/in-ddj/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/8ea0924c46df56baa5216565fc648d50?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Stephen</media:title>
		</media:content>

		<media:content url="http://ontheheap.files.wordpress.com/2008/09/ddj_cover_110x1491.jpg" medium="image">
			<media:title type="html">ddj_cover_110x1491</media:title>
		</media:content>
	</item>
	</channel>
</rss>