<?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/"
	>

<channel>
	<title>Ginger Rant</title>
	<atom:link href="http://www.gingerrant.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gingerrant.com</link>
	<description>Just another WordPress site</description>
	<lastBuildDate>Thu, 18 Oct 2012 13:43:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Jumping to conclusions</title>
		<link>http://www.gingerrant.com/2012/10/jumping-to-conclusions/</link>
		<comments>http://www.gingerrant.com/2012/10/jumping-to-conclusions/#comments</comments>
		<pubDate>Sat, 13 Oct 2012 16:21:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Homepage Slideshow]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gingerrant.com/?p=1896</guid>
		<description><![CDATA[Feeling a bit inspired by the recent DirectTV commericals I figured it&#8217;s about time to apply the same rational thought patterns to the waterfall methodology. When have a deadline approaching, you work all night. When you work all night, you don&#8217;t get enough sleep. When you don&#8217;t get enough sleep, you turn into a zombie. When you turn...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gingerrant.com/wp-content/uploads/2012/10/jumptoconclusions.jpg"><img class="size-full wp-image-1912 alignright" title="jumptoconclusions" src="http://www.gingerrant.com/wp-content/uploads/2012/10/jumptoconclusions.jpg" alt="" width="360" height="180" /></a></p>
<p>Feeling a bit inspired by the recent <a href="http://www.youtube.com/watch?v=7udQSHWpL88">DirectTV commericals</a> I figured it&#8217;s about time to apply the same rational thought patterns to the waterfall methodology.</p>
<p>When have a deadline approaching, you work all night.<br />
When you work all night, you don&#8217;t get enough sleep.<br />
When you don&#8217;t get enough sleep, you turn into a zombie.<br />
When you turn into a zombie, you start eating your co-workers.<br />
<strong>Don&#8217;t eat your co-workers, get rid of waterfall.</strong></p>
<p>When you try to generate an accurate project timeline you start guessing.<br />
When you start guessing, you start grasping at straws.<br />
When run out of straws to grasp at, you look for more.<br />
When you look for more straws, you go looking through trash.<br />
When you go looking through trash, you find yourself in a dumpster.<br />
<strong>Don&#8217;t go dumpster diving, get rid of waterfall.</strong></p>
<p>When you plan too much, you can&#8217;t make decisions later.<br />
When you can&#8217;t make decisions later, things will need to change.<br />
When things need to change, you need to change directions.<br />
When you can&#8217;t switch directions, you drive off an oncoming cliff.<br />
<strong>Don&#8217;t drive off a cliff, get rid of waterfall.</strong></p>
<p>When you estimate a feature wrong, your boss wants you to improve.<br />
When your boss wants you to improve, you practice estimating.<br />
When you practice estimating, you estimate how many tacos you can eat.<br />
When you practice eating tacos all day, you spend all night in the bathroom.<br />
<strong>Don&#8217;t spend all night in a bathroom, get rid of waterfall.</strong></p>
<p>When requirements can&#8217;t change, the customer wants to change them.<br />
When the customer can&#8217;t change them, the customer gets mad.<br />
When the customer gets mad at you, you get mad.<br />
When you get mad, you go home mad.<br />
When you go home mad, your mother in-law stops by.<br />
When your mother in-law stops by, she tells you everything you are doing wrong.<br />
When she tells you everything you are doing wrong, you punch her in the face.<br />
<strong>Don&#8217;t punch your mother in-law in the face, get rid of waterfall.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2012/10/jumping-to-conclusions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Morally Lucky Software</title>
		<link>http://www.gingerrant.com/2012/05/morally-lucky-software/</link>
		<comments>http://www.gingerrant.com/2012/05/morally-lucky-software/#comments</comments>
		<pubDate>Thu, 17 May 2012 20:30:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Agile Practices]]></category>
		<category><![CDATA[Business Development]]></category>
		<category><![CDATA[Homepage Slideshow]]></category>
		<category><![CDATA[Lean/Kanban]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gingerrant.com/?p=1878</guid>
		<description><![CDATA[As a culture we are highly focused on results and less so on the path to the result. You can see this mentality throughout our laws. For example given two drunk drivers going home, the first driver gets caught and recieves a DUI, while the second driver as a result of being drunk hits and...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gingerrant.com/wp-content/uploads/2012/05/Yellow-Dice-3-9ITQO6EFGE-1024x768.jpg"><img class="alignright size-medium wp-image-1891" style="margin: 10px;" title="Yellow-Dice-3-9ITQO6EFGE-1024x768" src="http://www.gingerrant.com/wp-content/uploads/2012/05/Yellow-Dice-3-9ITQO6EFGE-1024x768-300x225.jpg" alt="" width="300" height="225" /></a><br />
As a culture we are highly focused on results and less so on the path to the result. You can see this mentality throughout our laws.</p>
<p>For example given two drunk drivers going home, the first driver gets caught and recieves a DUI, while the second driver as a result of being drunk hits and kills another driver will get charged with both a DUI and manslaughter. Now both drivers took the same risks and for chances not under their control had two different results, while we can morally blame both drivers for the same actions we choose to punish them differently.  This is refered to as resultant moral luck, are you building your software with it?</p>
<p>Just because you delivered software last time that was on schedule and worked correctly, was it just moral luck? Knowing that there are ways to improve your development process and improve your code quality as to reduce the risk involved in creating software, are you still not using them? Not using them is not calling your friend to drive you home from the bar, yes you know its a good idea but you got home safetly last time so you don&#8217;t need to this time.</p>
<p>Should you be accepting moral praise for a project from the business, when the result was less in your control then it could have been? Clearly building a trivial website for my hobby has minimal risk but if the software you are building for a business is of importance, must you wait for a the dice to come up against you before you try to do better?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2012/05/morally-lucky-software/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Simple UI testing with node.js &amp; zombie.js</title>
		<link>http://www.gingerrant.com/2012/01/simple-ui-testing-with-node-js-zombie-js/</link>
		<comments>http://www.gingerrant.com/2012/01/simple-ui-testing-with-node-js-zombie-js/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 04:14:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Homepage Slideshow]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.gingerrant.com/?p=1858</guid>
		<description><![CDATA[I have used SpecFlow with both WatiN and Selenium to do testing in .NET before, and after some work and a bit of frustration I was finally able to get some productivity from them. Lately playing around with node.js for awhile I got to the point I wanted to try some UI testing and came...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gingerrant.com/wp-content/uploads/2012/01/zombie-e1326859866310.jpg"><img class="alignright size-medium wp-image-1866" title="zombie" src="http://www.gingerrant.com/wp-content/uploads/2012/01/zombie-300x300.jpg" alt="" width="300" height="300" /></a>I have used SpecFlow with both WatiN and Selenium to do testing in .NET before, and after some work and a bit of frustration I was finally able to get some productivity from them. Lately playing around with node.js for awhile I got to the point I wanted to try some UI testing and came across zombie.js. After a relatively short amount of time I got a working example that ends up being as simple as I wish it was in .NET, so I thought I would share my example tests for anybody else looking for a place to get quick start.</p>
<p>The libraries used:</p>
<ul>
<li><a href="http://zombie.labnotes.org/">zomebie.js</a> &#8211; headless web tester</li>
<li><a href="http://vowsjs.org/">vows</a> - BDD testing framework</li>
<li><a href="http://chaijs.com/">chai</a> - assertion framework</li>
</ul>
<div>The code in coffeescript&#8230;</div>
<pre class="brush: jscript; title: ; notranslate">
vows = require 'vows'
browser = require 'zombie'
expect = require('chai').expect

bingVows = vows.describe('search test')
webBrowser = new browser()

parseResultCount = (text) =&gt;
	text.substring(text.indexOf('of') + 2, text.indexOf('results')).replace(/\s/g, '').replace(/,/g, '')

bingVows.addBatch
	'when binging zombie' :
		topic: -&gt;
			webBrowser.visit 'http://www.bing.com', (err, result, status) =&gt;
				result.fill('#sb_form_q', 'zombie').pressButton('#sb_form_go', this.callback)
		'it returns ok' : (err, result, status) -&gt;
			expect(result.success).to.be.ok
		'it has over 3 million results' : (err, result, status) -&gt;
			numResults = parseResultCount(result.text('#count'))
			expect(numResults).to.be.above('300000000') #fail since there is only ~1.5m

bingVows.export module
</pre>
<p>The code I like to think is pretty self explanatory but we are basically setting up a vow with a topic to load bing.com and search for zombie, once it returns it passes the callback into the two tests to check for 200 status and to check the number of results found. The most complicated piece of this test is parsing the number from the result text.</p>
<p>To run this test you run &#8220;vows bingtest.coffee &#8211;spec&#8221;, the &#8211;spec will put the spec results out to the console so you should see a result similar to this.</p>
<pre class="brush: bash; title: ; notranslate">
♢ search test

  when binging zombie
    ✓ it returns ok
    ✗ it has over 3 million results
      » AssertionError: expected '144000000' to be above 300000000

✗ Broken » 1 honored ∙ 1 broken (1.844s)
</pre>
<p>Next time I need to do some UI testing in .NET I will definitely take my experiences here to work on improving the usability there.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2012/01/simple-ui-testing-with-node-js-zombie-js/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Coffeescript in WinRT</title>
		<link>http://www.gingerrant.com/2011/10/coffeescript-in-winrt/</link>
		<comments>http://www.gingerrant.com/2011/10/coffeescript-in-winrt/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 22:27:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET Programming]]></category>
		<category><![CDATA[Homepage Slideshow]]></category>
		<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[winrt]]></category>

		<guid isPermaLink="false">http://www.gingerrant.com/?p=1851</guid>
		<description><![CDATA[I recently decided to take WinRT (javascript edition) for a spin but instead of using the built-in libraries from MS I wanted to see what tools I could reuse (jQuery, backbone.js, etc..). I have become somewhat of a CoffeeScript addict so after about a dozen &#8216;close resig&#8217;s I knew I had to get it working...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gingerrant.com/wp-content/uploads/2011/10/double-rainbow.800w_600h.jpg"><img class="size-medium wp-image-1852 alignright" style="border-style: initial; border-color: initial; border-width: 0px;" title="double-rainbow.800w_600h" src="http://www.gingerrant.com/wp-content/uploads/2011/10/double-rainbow.800w_600h-300x225.jpg" alt="" width="300" height="225" /></a>I recently decided to take WinRT (javascript edition) for a spin but instead of using the built-in libraries from MS I wanted to see what tools I could reuse (jQuery, backbone.js, etc..). I have become somewhat of a CoffeeScript addict so after about a dozen &#8216;close resig&#8217;s I knew I had to get it working as well.</p>
<p>In a .NE T web app I normally use the very nice <a href="http://www.mindscapehq.com/products/web-workbench">Web Workbench from Mindscape</a>, however there is no custom tool available for the project files in the javascript project.</p>
<p>So I decided to take a runtime approach to the situation, I grabbed the javascript compiler from the <a href="https://github.com/jashkenas/coffee-script/blob/master/extras/coffee-script.js">github source</a> and included it in my js folder. Now including this script in your page will compile any script on the page you have, which is fine but you don&#8217;t really want to be putting all of your code on the html page.</p>
<p>But we can instead use the jQuery AJAX request to dynamically load the .coffee file like so&#8230;</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
     $.get &quot;/js/default.coffee&quot;,
          (src) -&gt;
               CoffeeScript.run src
&lt;script&gt;
&lt;script src=&quot;/js/coffee-script.js&quot;&gt;&lt;/script&gt;
</pre>
<p>What happens here is that once the coffee-script.js file is loaded it compiles the &#8220;text/coffeescript&#8221; which runs the jQuery get method to download the .coffee file and then pass it into the compiler. You could add as many scripts here as you would like to load. Runtime coffee script is not my favorite because you find out so late if you have syntax errors but this works for now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2011/10/coffeescript-in-winrt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exposure to CoffeeScript</title>
		<link>http://www.gingerrant.com/2011/09/exposure-to-coffeescript/</link>
		<comments>http://www.gingerrant.com/2011/09/exposure-to-coffeescript/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 02:42:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.NET Programming]]></category>
		<category><![CDATA[Homepage Slideshow]]></category>
		<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.gingerrant.com/?p=1827</guid>
		<description><![CDATA[If you love JavaScript but hate the bitter aftertaste when you look back at it and its sea of brackets and functions, then you owe it to yourself to try a unique blend called CoffeeScript. It&#8217;s easy to learn and immediately rewarding, you can start fresh with a new script but its dead simple to even convert existing...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gingerrant.com/wp-content/uploads/2011/09/cs_exposure.jpg"><img class="alignright size-medium wp-image-1829"title="cs_exposure" src="http://www.gingerrant.com/wp-content/uploads/2011/09/cs_exposure-300x250.jpg" alt="" width="300" height="250" /></a></p>
<p>If you love JavaScript but hate the bitter aftertaste when you look back at it and its sea of brackets and functions, then you owe it to yourself to try a unique blend called <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a>. It&#8217;s easy to learn and immediately rewarding, you can start fresh with a new script but its dead simple to even convert existing scripts over. That&#8217;s probably the easiest way to get a feel for how to use it, so lets get to the converting!</p>
<h2>Getting Setup</h2>
<p>From a .NET project there are two main ways to CoffeeScript working for you, either at runtime via an HttpHandler or at design time via IDE support. There are several options on NuGet for the first option such as <a href="http://nuget.org/List/Packages/SassAndCoffee">SassAndCoffee</a> or for the latter approach there is <a href="http://www.mindscapehq.com/products/web-workbench">Web Workbench</a>. For me I prefer to use the web workbench extension and that is what I suggest at least while you are in the early learning phase because having test your code by accessing it through the browser is a lot more painful than simply hitting save.</p>
<h2>Some Small Examples</h2>
<p>To convert existing Javascript there are only a few things that you HAVE to do to get it to &#8220;compile&#8221;. Since as they say &#8220;It&#8217;s Just Javascript!&#8221; then most of your code will work just fine without being cleaned up the CoffeeScript way.</p>
<p>A few things you must do</p>
<ol>
<li><strong>Remove var</strong>, since CoffeeScript enforces scoping you need to remove all var keywords. It also encloses all script in an anonymous function so you have to work extra hard to pollute the global namespace.</li>
<li><strong>Replace function keyword</strong>, it has its own notation for declaring functions.</li>
<li><strong>Remove if {}&#8217;s and function {}&#8217;s</strong>, it&#8217;s parser does not like it you leave them in at all.</li>
</ol>
<h3>Simple Example 1</h3>
<pre class="brush: jscript; title: ; notranslate">
  $(function() {
    $(&quot;#addCardLink&quot;).click(function() {
      $(&quot;#cardForm&quot;).slideToggle();
    });
    $(&quot;#addLaneLink&quot;).click(function() {
      $(&quot;#laneForm&quot;).slideToggle();
    });
    $(&quot;input[data-watermark]&quot;).each(function() {
      $(this).val($(this).data(&quot;watermark&quot;));
      $(this).addClass(&quot;watermarked&quot;);
    }).focus(function() {
      if ($(this).val() === $(this).data(&quot;watermark&quot;)) {
        $(this).val(&quot;&quot;);
        $(this).removeClass(&quot;watermarked&quot;);
      }
    }).blur(function() {
      if ($(this).val() === &quot;&quot;) {
        $(this).val($(this).data(&quot;watermark&quot;));
        $(this).addClass(&quot;watermarked&quot;);
      }
    });
  });
</pre>
<p>Nothing two complex there, a couple of click events and a watermark<br />
After the minimum conversion you will get</p>
<pre class="brush: jscript; title: ; notranslate">
$( -&gt;
    $(&quot;#addCardLink&quot;).click(-&gt;
        $(&quot;#cardForm&quot;).slideToggle());

    $(&quot;#addLaneLink&quot;).click(-&gt;
        $(&quot;#laneForm&quot;).slideToggle());

    $(&quot;input[data-watermark]&quot;)
        .each( -&gt;
            $(this).val($(this).data(&quot;watermark&quot;));
            $(this).addClass(&quot;watermarked&quot;);)
        .focus( -&gt;
            if ($(this).val() == $(this).data(&quot;watermark&quot;))
                $(this).val(&quot;&quot;);
                $(this).removeClass(&quot;watermarked&quot;);
             )
        .blur( -&gt;
            if ($(this).val() == &quot;&quot;)
                $(this).val($(this).data(&quot;watermark&quot;));
                $(this).addClass(&quot;watermarked&quot;);
            );
);
</pre>
<p>I wanted to show you that to display how little changes are needed to get working base, all we did is replaced function with -&gt; and removed {}&#8217;s for ifs and functions.<br />
But we can do even better, now we will remove all unnecessary ()&#8217;s ;&#8217;s to clear up some of the remaining noise.</p>
<pre class="brush: jscript; title: ; notranslate">
$ -&gt;
    $(&quot;#addCardLink&quot;).click -&gt;
        $(&quot;#cardForm&quot;).slideToggle()

    $(&quot;#addLaneLink&quot;).click -&gt;
        $(&quot;#laneForm&quot;).slideToggle()

    $(&quot;input[data-watermark]&quot;)
        .each -&gt;
            $(this).val $(this).data(&quot;watermark&quot;)
            $(this).addClass &quot;watermarked&quot;
        .focus -&gt;
            if $(this).val() == $(this).data(&quot;watermark&quot;)
                $(this).val &quot;&quot;
                $(this).removeClass &quot;watermarked&quot;
        .blur -&gt;
            if $(this).val() == &quot;&quot;
                $(this).val $(this).data(&quot;watermark&quot;)
                $(this).addClass &quot;watermarked&quot;
</pre>
<h3>Simple Example 2</h3>
<p>A standard jquery AJAX post</p>
<pre class="brush: plain; title: ; notranslate">
$.post(&quot;/lane/create&quot;,
  {name: boardModel.newLaneName, board: boardModel.board, position: $(&quot;#newLanePosition&quot;).val()},
  function(data) {
    return boardModel.lanes.splice(data.Position, 0, new lane(data.Id, data.Name, []));
 });
</pre>
<p>After&#8230;</p>
<pre class="brush: jscript; title: ; notranslate">
$.post &quot;/lane/create&quot;,
    name: boardModel.newLaneName, board: boardModel.board, position: $(&quot;#newLanePosition&quot;).val(),
    (data) -&gt;
        boardModel.lanes.splice(data.Position, 0, new lane(data.Id, data.Name, []))
</pre>
<h3>Simple Example 3</h3>
<p>This is a small script that loops over a list of lists to find the desired one.</p>
<pre class="brush: jscript; title: ; notranslate">
var findLaneWithCard = function(cardId) {
    var lanes = this.lanes();
    for (var i = 0, var len = lanes.length; i &lt; len; i++) {
        var lane = lanes[i];
        for (var j = 0, var len2 = lane.Cards().length; j &lt; len2; j++) {
            card = cards[j];
            if (card.Id === cardId) {
                return lane;
            }
        }
    }
}
</pre>
<p>It&#8217;s about as simple as it can be in plain old JavaScript but can be vastly improved&#8230;</p>
<pre class="brush: jscript; title: ; notranslate">
    findLaneWithCard: (cardId) -&gt;
        for lane in this.lanes()
            for card in lane.Cards()
                return lane if card.Id == cardId
</pre>
<h3>And beyond!</h3>
<p>There are still a lot of things that are possible for trimming down your code to a more fluent and functional style but the CoffeeScript page does a great job of reviewing them so I will let you defer to it for even more samples.</p>
<h2>You&#8217;ve gone&#8230;. too far!</h2>
<p>The whole reason to use CoffeeScript is to make your code more readable and maintainable, it&#8217;s not a minifier so don&#8217;t try to use it like one to remove every last possible character you can. It&#8217;s actually the opposite, the code it creates can be more verbose/longer than handcoded so it&#8217;s still a good idea to run the output through a minifier.</p>
<p>Just the same way its easy to get carried away with lambda and LINQ statements and create unwieldy &#038; hard to read code, the same is possible with CoffeeScript.</p>
<p>Take this snippet for example&#8230;</p>
<pre class="brush: jscript; title: ; notranslate">
boardModel.newCards.splice 0, 1, new card &quot;NewCardTemplate&quot;, ko.observable(&quot;&quot;), ko.observable &quot;&quot;
boardModel.newCards.splice(0, 1, new card(&quot;NewCardTemplate&quot;, ko.observable(&quot;&quot;), ko.observable(&quot;&quot;)))
</pre>
<p>While the first line is valid and semantically equivalent to the second line its much harder to follow the chain of parameters and figure out who&#8217;s getting passed to what.</p>
<h2>Out on a good note</h2>
<p>To leave you with a bigger example I have converted the javascript from NerdDinner into CoffeeScript. You can view the original javascript <a href="http://nerddinner.codeplex.com/SourceControl/changeset/view/69772#874293">here</a>.</p>
<p>I hope you now feel at least a little bit compelled to give CoffeeScript a go on your existing scripts, if not, I am sorry that I have failed you. <img src='http://www.gingerrant.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<pre class="brush: jscript; title: ; notranslate">
window.NerdDinner =
    MapDivId: 'theMap'
    _map: null
    _points: []
    _shapes: []
    ipInfoDbKey: ''
    BingMapsKey: ''

    LoadMap: (latitude, longitude, onMapLoaded) -&gt;
        this._map = new VEMap(this.MapDivId)
        options = new VEMapOptions()
        options.EnableBirdseye = false

        ###Makes the control bar less obtrusize.###
        this._map.SetDashboardSize(VEDashboardSize.Small);

        this._map.onLoadMap = onMapLoaded if onMapLoaded?
        center = new VELatLong(latitude, longitude) if latitude? and longitude
        this._map.LoadMap center, null, null, null, null, null, null, options

    ClearMap: -&gt;
        _map?.Clear()
        this._points = []
        this._shapes = []

    LoadPin: (LL, name, description, draggable) -&gt;
        return if LL.Latitude is 0 or LL.Longitude is 0

        shape = new VEShape(VEShapeType.Pushpin, LL)

        if draggable
            shape.Draggable = true
            shape.onenddrag = this.onEndDrag

        ###Make a nice Pushpin shape with a title and description###
        shape.SetTitle &quot;&lt;span class=\&quot;pinTitle\&quot;&gt; &quot; + escape(name) + &quot;&lt;/span&gt;&quot;

        shape.SetDescription(&quot;&lt;p class=\&quot;pinDetails\&quot;&gt;&quot; + escape(description) + &quot;&lt;/p&gt;&quot;) if description?

        this._map.AddShape shape
        this._points.push LL
        this._shapes.push shape

    FindAddressOnMap: (where) -&gt;
        numberOfResults = 1
        setBestMapView = true
        showResults = true
        defaultDisambiguation = true

        this._map.Find &quot;&quot;, where, null, null, null,
                                numberOfResults, showResults, true, defaultDisambiguation,
                                setBestMapView, this._callbackForLocation

    _callbackForLocation: (layer, resultsArray, places, hasMore, VEErrorMessage) -&gt;
        this.ClearMap

        if !places?
            this._map.ShowMessage(VEErrorMessage)
            return

        ###Make a pushpin for each place we find###
        $.each places, (i, item) -&gt;
            description = &quot;&quot;
            description = item.Description if item?
            LL = new VELatLong item.LatLong.Latitude, item.LatLong.Longitude

            window.NerdDinner.LoadPin LL, item.Name, description, true

        ###Make sure all pushpins are visible###
        window.NerdDinner._map.SetMapView(window.NerdDinner._points) if window.NerdDinner._points.length &gt; 1

        ###If we've found exactly one place, that's our address.
        lat/long precision was getting lost here with toLocaleString, changed to toString###
        if window.NerdDinner._points.length is 1
            $(&quot;#Latitude&quot;).val window.NerdDinner._points[0].Latitude.toString()
            $(&quot;#Longitude&quot;).val window.NerdDinner._points[0].Longitude.toString()

    FindDinnersGivenLocation: (where) -&gt;
        this._map.Find &quot;&quot;, where, null, null, null, null, null, false, null, null, this._callbackUpdateMapDinners

    FindMostPopularDinners: (limit) -&gt;
        $.post &quot;/Search/GetMostPopularDinners&quot;, { &quot;limit&quot;: limit }, this._renderDinners, &quot;json&quot;

    _callbackUpdateMapDinners: (layer, resultsArray, places, hasMore, VEErrorMessage) -&gt;
        center = window.NerdDinner._map.GetCenter()

        $.post &quot;/Search/SearchByLocation&quot;, { latitude: center.Latitude, longitude: center.Longitude }, window.NerdDinner._renderDinners, &quot;json&quot;

    _renderDinners: (dinners) -&gt;
        $(&quot;#dinnerList&quot;).empty()
        this.ClearMap

        $.each dinners, (i, dinner) -&gt;
            LL = new VELatLong dinner.Latitude, dinner.Longitude, 0, null

            ###Add Pin to Map###
            window.NerdDinner.LoadPin LL, _getDinnerLinkHTML(dinner), _getDinnerDescriptionHTML(dinner), false

            ###Add a dinner to the &lt;ul&gt; dinnerList on the right###
            $(&quot;#dinnerList&quot;).append($(&quot;&lt;li/&gt;&quot;)
                            .attr(&quot;class&quot;, &quot;dinnerItem&quot;)
                            .append(_getDinnerLinkHTML(dinner))
                            .append($(&quot;&lt;br/&gt;&quot;))
                            .append(_getDinnerDate(dinner, &quot;mmm d&quot;))
                            .append(&quot; with &quot; + _getRSVPMessage(dinner.RSVPCount)))

        ###Adjust zoom to display all the pins we just added.###
        window.NerdDinner._map.SetMapView(this._points) if this._points.length &gt; 1

        ###Display the event's pin-bubble on hover.###
        $(&quot;.dinnerItem&quot;).each (i, dinner) -&gt;
            $(dinner).hover(
                -&gt; window.NerdDinner._map.ShowInfoBox window.NerdDinner._shapes[i] ,
                -&gt; window.NerdDinner._map.HideInfoBox window.NerdDinner._shapes[i] )

        _getDinnerDate (dinner, formatStr) -&gt;
            '&lt;strong&gt;' + _dateDeserialize(dinner.EventDate).format(formatStr) + '&lt;/strong&gt;'

        _getDinnerLinkHTML (dinner) -&gt;
            '&lt;a href=&quot;' + dinner.Url + '&quot;&gt;' + dinner.Title + '&lt;/a&gt;'

        _getDinnerDescriptionHTML (dinner) -&gt;
            '&lt;p&gt;' + _getDinnerDate(dinner, &quot;mmmm d, yyyy&quot;) + '&lt;/p&gt;&lt;p&gt;' + dinner.Description + '&lt;/p&gt;' + _getRSVPMessage(dinner.RSVPCount)

        _dateDeserialize (dateStr) -&gt;
            eval 'new' + dateStr.replace(/\//g, ' ')

        _getRSVPMessage (RSVPCount) -&gt;
            rsvpMessage = &quot;&quot; + RSVPCount + &quot; RSVP&quot;
            rsvpMessage += &quot;s&quot; if RSVPCount &gt; 1

    onEndDrag: (e) -&gt;
        $(&quot;#Latitude&quot;).val e.LatLong.Latitude.toString()
        $(&quot;#Longitude&quot;).val e.LatLong.Longitude.toString()

    getLocationResults: (locations) -&gt;
        if locations?
            currentAddress = $(&quot;#Address&quot;)
            if locations[0].Name != currentAddress
                answer = confirm(&quot;Bing Maps returned the address '&quot; + locations[0].Name + &quot;' for the pin location. Click 'OK' to use this address for the event, or 'Cancel' to use the current address of '&quot; + currentAddress.val() + &quot;'&quot;)
                currentAddress.val(locations[0].Name) if answer

    getCurrentLocationByIpAddress: -&gt;
        $.getJSON &quot;http://api.ipinfodb.com/v3/ip-city/?format=json&amp;callback=?&amp;key=&quot; + this.ipInfoDbKey,
                    (data) -&gt;
                        $('#Location').val(data.regionName + ', ' + data.countryName) if data.RegionName != ''

    getCurrentLocationByLatLong: (latitude, longitude) -&gt;
        requestUrl = 'http://dev.virtualearth.net/REST/v1/Locations/' + latitude + ',' + longitude + '?key=' + this.BingMapsKey + '&amp;jsonp=?'
        $.getJSON requestUrl,
                    (result) -&gt;
                        $(&quot;#Location&quot;).val(result.resourceSets[0].resources[0].address.formattedAddress) if result.resourceSets[0].estimatedTotal &gt; 0
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2011/09/exposure-to-coffeescript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lean &amp; Agile : A Panel Discussion</title>
		<link>http://www.gingerrant.com/2011/08/lean-agile-a-panel-discussion/</link>
		<comments>http://www.gingerrant.com/2011/08/lean-agile-a-panel-discussion/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 18:02:11 +0000</pubDate>
		<dc:creator>Brian Wigfield</dc:creator>
				<category><![CDATA[Agile Practices]]></category>
		<category><![CDATA[Homepage Slideshow]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Lean]]></category>

		<guid isPermaLink="false">http://www.adventuretechgroup.com/?p=1732</guid>
		<description><![CDATA[Today we have short Q&#38;A about agile practices with out esteemed guests Winston Churchill, Albert Einstein, Mark Twain, Martin Luther King, Jr, Gandhi, Bruce Lee, &#38; Franklin D. Roosevelt. &#160; Question: Why do you believe there is benefits in building &#38; watching metrics and then projecting dates versus utilizing pre-defined project dates? Churchill: The farther...]]></description>
			<content:encoded><![CDATA[<p>Today we have short Q&amp;A about agile practices with out esteemed guests Winston Churchill, Albert Einstein, Mark Twain, Martin Luther King, Jr, Gandhi, Bruce Lee, &amp; Franklin D. Roosevelt.</p>
<p>&nbsp;</p>
<h3>Question: Why do you believe there is benefits in building &amp; watching metrics and then projecting dates versus utilizing pre-defined project dates?</h3>
<blockquote><p><strong><em>Churchill: </em></strong>The farther backward you can look, the farther forward you are likely to see.</p>
<p><strong><em>Albert Einstein: </em></strong>A man should look for what is, and not for what he thinks should be.</p></blockquote>
<h3>Question: Is this because full discovery early on is hard to achieve?</h3>
<blockquote><p><strong><em>Martin Luther King, Jr.: </em></strong>Everything that we see is a shadow cast by that which we do not see.</p>
<p><strong><em>Albert Einstein:</em></strong> Occurrences in this domain are beyond the reach of exact prediction because of the variety of factors in operation, not because of any lack of order in nature.</p></blockquote>
<h3>Question: The what did you tell your project manager the last time he asked you for an accurate estimate?</h3>
<blockquote><p><em><strong>Gandhi:</strong></em> I do not want to foresee the future. I am concerned with taking care of the present. God has given me no control over the moment following.</p>
<p><strong><em>Mark Twain:</em></strong> I was gratified to be able to answer promptly, and I did. I said I didn&#8217;t know.</p></blockquote>
<h3>Question: Some managers like to create their own artificial estimates to fit their plans, does this work out well in some cases?</h3>
<blockquote><p><strong><em>Albert Einstein:</em></strong> No problem can be solved from the same level of consciousness that created it.</p>
<p><strong><em>Mark Twain: </em></strong>Get your facts first, then you can distort them as you please.</p></blockquote>
<h3>Question: But wouldn’t it be fair to say that without a estimate to hold somebody to, that the work item will not be completed in a timely manner.</h3>
<blockquote><p><strong><em>Bruce Lee: </em></strong>Notice that the stiffest tree is most easily cracked, while the bamboo or willow survives by bending with the wind.</p></blockquote>
<h3>Question: If there are shortcomings in the waterfall methodology, should those just be addressed in the methodology instead of creating entire new development method?</h3>
<blockquote><p><strong><em>Albert Einstein: </em></strong>Any intelligent fool can make things bigger and more complex&#8230; It takes a touch of genius &#8211; and a lot of courage to move in the opposite direction.</p></blockquote>
<h3>Question: Do you believe in following Scrum as prescribed or do you believe “Scrum But” is acceptable?</h3>
<blockquote><p><strong><em>Bruce Lee:</em></strong> Learn the principle, abide by the principle, and dissolve the principle. In short, enter a mold without being caged in it. Obey the principle without being bound by it.</p>
<p><strong><em>Franklin D. Roosevelt: </em></strong>One thing is sure. We have to do something. We have to do the best we know how at the moment&#8230; If it doesn&#8217;t turn out right, we can modify it as we go along.</p></blockquote>
<h3>Question: What would attract a team to using an Agile approach with a loose definition of procedure such as KanBan or “Scrum But”</h3>
<blockquote><p><strong><em>Churchill:</em></strong> To improve is to change; to be perfect is to change often.</p>
<p><strong><em>Bruce Lee: </em></strong>All fixed set patterns are incapable of adaptability or pliability. The truth is outside of all fixed patterns.</p>
<p><strong><em>Gandhi:</em></strong> Constant development is the law of life, and a man who always tries to maintain his dogmas in order to appear consistent drives himself into a false position.</p></blockquote>
<h3>Question: If you have gathered metrics using an Agile approach and your manager demands you to complete a feature in a timespan that your metrics say is not possible, how do handle a response telling them that?</h3>
<blockquote><p><strong><em>Churchill<span style="text-decoration: underline;">:</span></em></strong> The truth is incontrovertible, malice may attack it, ignorance may deride it, but in the end; there it is.</p>
<p><strong><em>Mark Twain:</em></strong> Let us make a special effort to stop communicating with each other, so we can have some conversation.</p></blockquote>
<h3>Question: It is popular to display a large visual task board so that the team is transparent to anybody interested, why is this information important to be constantly available?</h3>
<blockquote><p><strong><em>Churchill:</em></strong> A lie gets halfway around the world before the truth has a chance to get its pants on.</p>
<p><strong><em>Gandhi:</em></strong> An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it.</p></blockquote>
<h3>Question: When starting a new project do you like to create detailed documentation before hand to make development easier?</h3>
<blockquote><p><strong><em>Franklin D. Roosevelt: </em></strong>Are you laboring under the impression that I read these memoranda of yours? I can&#8217;t even lift them.</p></blockquote>
<h3>Question: Ok so you may not like a lot of documentation but how can you get started with none?</h3>
<blockquote><p><strong><em>Martin Luther King, Jr.</em></strong>: You don&#8217;t have to see the whole staircase, just take the first step.</p>
<p><em><strong>Franklin D. Roosevelt:</strong> </em>There are many ways of going forward, but only one way of standing still.</p>
<p><strong><em>Bruce Lee: </em></strong>Be like water making its way through cracks. Do not be assertive, but adjust to the object, and you shall find a way round or through it. If nothing within you stays rigid, outward things will disclose themselves.</p></blockquote>
<h3>Question: Having removed so many potential roles and overhead in a development team, should people in those roles be in fear of losing their job?</h3>
<blockquote><p><strong><em>Franklin D. Roosevelt:</em></strong> The only thing we have to fear is fear itself.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2011/08/lean-agile-a-panel-discussion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using The Easy Button</title>
		<link>http://www.gingerrant.com/2011/07/using-the-easy-button/</link>
		<comments>http://www.gingerrant.com/2011/07/using-the-easy-button/#comments</comments>
		<pubDate>Fri, 29 Jul 2011 15:55:43 +0000</pubDate>
		<dc:creator>Brian Wigfield</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.adventuretechgroup.com/?p=1716</guid>
		<description><![CDATA[A common phrase around our shop and one that I try to follow is to “Do the simplest thing that works”. It sounds like a simple thing to follow but to me it more accurately means, provide the simplest solution that meets the customers needs. We use it as a reminder not to gold plate,...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gingerrant.com/wp-content/uploads/2011/07/easy-button.png"><img class="alignright size-medium wp-image-1760" title="easy-button" src="http://www.gingerrant.com/wp-content/uploads/2011/07/easy-button-300x300.png" alt="" width="300" height="300" /></a><br />
A common phrase around our shop and one that I try to follow is to “Do the simplest thing that works”. It sounds like a simple thing to follow but to me it more accurately means, provide the simplest solution that meets the customers needs. We use it as a reminder not to gold plate, but it’s an easy thing to take to far and provide an inadequate solution.</p>
<p>Everyday we make decisions on the quality of things we surround ourselves with.  When getting groceries you can decide to purchase organic food or items put on “manager’s special”, how important is your health and how much money can you afford to spend? The cheapest food is the simplest thing than gets you fed, but it may have unwanted health consequences. Ideally you try to balance just enough quality so that you don’t waste resources.</p>
<p>But custom software development doesn’t have the same side effects of food so how do you know the difference between the simplest thing and to simple? Unlike the nature of retail you don’t get to devise your own quality standards and let the customer decide which product suits them. It is a very important to get this information from the customer when building their software, and you can’t simply ask “what kind of quality would you like” because they will always tell you the quality should be high. You need to know the correct questions to ask in order to decide the quality of the system the customer actually needs. When the car salesman asks you “What will you be using the car for?”, “Do you have any kids?” they are trying to help determine what car will be a good fit for you. Just the same it is up to you to ask revealing questions to help build a system to meet the customers needs.</p>
<p>“How current does the data need to be to be relevant?”, “How important is it this system is online”, “How many people will be using it”, “How often will you be using the data?”</p>
<p>The answers to all of those questions are revealing in telling you how often you need to process any needed data, how reliable the system needs to be, the user capacity it needs to support,  and how fast it needs to serve content. It might feel natural to gauge the quality the customer is looking for by they money they are looking to spend, but that is a great way to deliver something to the customer that doesn’t meet their expectations. If a customer can not afford the system they need then don’t be afraid to stand your ground and potentially loose the work, it benefits no one to deliver a failed solution. I would always advocate cutting quantity of features instead of quality of features.</p>
<p>Another concept is to deliver the solution that is easiest to change, this is also a good practice to follow. I like to think of it as its resale value, when you are shopping for a car you are interested in getting a car with a good resale value because it makes it cheaper for you to change vehicles later. We know customers software needs change all the time, and making it easy to replace a solution with a new one that offers needed features is a good thing to strive for.</p>
<p><strong>Build it simple, but remember to build it right.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2011/07/using-the-easy-button/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Breaking the rules</title>
		<link>http://www.gingerrant.com/2011/04/breaking-the-rules/</link>
		<comments>http://www.gingerrant.com/2011/04/breaking-the-rules/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 15:49:22 +0000</pubDate>
		<dc:creator>Brian Wigfield</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.adventuretechgroup.com/?p=1473</guid>
		<description><![CDATA[Scenario 1 – You approach a 4 way stop sign, with exceptional visibility in all directions. You have to decide if you will roll through the stop sign, or be a ‘good driver’ and come to a full stop. Since you see no benefit in fully stopping you decide to roll on through. As you...]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://www.gingerrant.com/wp-content/uploads/2011/04/stoplight.jpg"><img class="alignright size-medium wp-image-1785" title="stoplight" src="http://www.gingerrant.com/wp-content/uploads/2011/04/stoplight-300x220.jpg" alt="" width="300" height="220" /></a>Scenario 1</strong> – You approach a 4 way stop sign, with exceptional visibility in all directions. You have to decide if you will roll through the stop sign, or be a ‘good driver’ and come to a full stop. Since you see no benefit in fully stopping you decide to roll on through. As you drive on a motorcycle officer pops out from behind a bush and writes you a ticket for not complying with the law.</p>
<p><strong>Scenario 2 </strong>– You need to finish a new feature on a project, so evaluating the design options and impact of them. You can either follow the standard approach that your team uses or save half the time and implement it in a much simpler way. After realizing half the effort for the same effect is the best value for the customer you decide to use the simple implementation. As you finish up and commit your changes into source control, the commit notification alerts the resident ‘architect’ and they scold you for not following standards.</p>
<p>The point I am trying to convey is that rules/standards should only be in place to help people that need guidance, either from a lack of knowledge, or lack of a clear choice. Unfortunately the inflexible nature from the bodies of governance stem from a lack of trust. If you don’t have trust in your developers decisions making capabilities then you have a broken system, and your rules are more constraining then they are helpful.</p>
<p>To sum it up in one line, if you are familiar with the <a href="http://en.wikipedia.org/wiki/Serenity_Prayer">Serenity Prayer</a> then this format might sound familiar…</p>
<p>Grant me the serenity to follow the rules, courage to defy the rules , and the wisdom to know when to do which.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2011/04/breaking-the-rules/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Software development guarantees</title>
		<link>http://www.gingerrant.com/2011/04/software-development-guarantees/</link>
		<comments>http://www.gingerrant.com/2011/04/software-development-guarantees/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 01:52:07 +0000</pubDate>
		<dc:creator>Brian Wigfield</dc:creator>
				<category><![CDATA[Agile Practices]]></category>
		<category><![CDATA[Homepage Slideshow]]></category>

		<guid isPermaLink="false">http://www.adventuretechgroup.com/?p=1378</guid>
		<description><![CDATA[Engaged in an agile software project you can find yourself fighting, nearly daily, a customer asking for guarantees about what you are building. They want to know: Everything you plan to build How you plan to build it How long you will take to build it How much it will cost to build &#160; These...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.gingerrant.com/wp-content/uploads/2011/04/tommy-boy-quote-need-a-little-wind-here.jpg"><img class="alignright size-medium wp-image-1773" title="tommy-boy-quote-need-a-little-wind-here" src="http://www.gingerrant.com/wp-content/uploads/2011/04/tommy-boy-quote-need-a-little-wind-here-300x236.jpg" alt="" width="300" height="236" /></a><br />
Engaged in an agile software project you can find yourself fighting, nearly daily, a customer asking for guarantees about what you are building.</p>
<p>They want to know:</p>
<ul>
<li>Everything you plan to build</li>
<li>How you plan to build it</li>
<li>How long you will take to build it</li>
<li>How much it will cost to build</li>
</ul>
<p>&nbsp;</p>
<p>These are reoccurring questions you will get from a customer you are already engaged with. While not bad questions, the connotations that come along with them are. Every time you provide an answer to one of these you need to prefix it, suffix it, get written verification and audio confirmation that these are estimates and not guarantees.</p>
<p>However when working on a new customer engagement, these can be even harder realizations that they see as excuses since, in their other hand resides a second proposal stating precise (read not accurate) answers that are ‘guaranteed’.</p>
<p>There are numerous arguments, diagrams and case studies that can back up your approach to providing software as a vendor. In lieu of delivering on those points to the customer I would, just once, love to play one of my favorite movie clips from Tommy Boy to express my feelings…</p>
<p><span style="text-decoration: underline;"><strong>Tommy</strong></span>: Let&#8217;s think about this for a sec, Ted. Why would somebody put a guarantee on a box? Hmmm, very interesting.<br />
<span style="text-decoration: underline;"><strong>Ted Nelson, Customer</strong></span>: Go on, I&#8217;m listening.<br />
<span style="text-decoration: underline;"><strong>Tommy</strong></span>: Here&#8217;s the way I see it, Ted. Guy puts a fancy guarantee on a box &#8217;cause he wants you to feel all warm and toasty inside.<br />
<span style="text-decoration: underline;"><strong>Ted Nelson, Customer</strong></span>: Yeah, makes a man feel good.<br />
<span style="text-decoration: underline;"><strong>Tommy</strong></span>: &#8216;Course it does. Why shouldn&#8217;t it? Ya figure you put that little box under your pillow at night, the Guarantee Fairy might come by and leave a quarter, am I right, Ted?<br />
<span style="text-decoration: underline;"><strong>Ted Nelson, Customer</strong></span>: [<em>impatiently</em>] What&#8217;s your point?<br />
<span style="text-decoration: underline;"><strong>Tommy</strong></span>: The point is, how do you know the fairy isn&#8217;t a crazy glue sniffer? &#8220;Building model airplanes&#8221; says the little fairy; well, we&#8217;re not buying it. He sneaks into your house once, that&#8217;s all it takes. The next thing you know, there&#8217;s money missing off the dresser, and your daughter&#8217;s knocked up. I seen it a hundred times.<br />
<span style="text-decoration: underline;"><strong>Ted Nelson, Customer</strong></span>: But why do they put a guarantee on the box?<br />
<span style="text-decoration: underline;"><strong>Tommy</strong></span>: Because they know all they sold ya was a guaranteed piece of shit. That&#8217;s all it is, isn&#8217;t it? Hey, if you want me to take a dump in a box and mark it guaranteed, I will. I got spare time. But for now, for your customer&#8217;s sake, for your daughter&#8217;s sake, ya might wanna think about buying a quality product from me.</p>
<p><strong>When you purchase a product do you make a decision based on the company’s guarantee, or upon their ability to deliver a quality product?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2011/04/software-development-guarantees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fighting atrophy</title>
		<link>http://www.gingerrant.com/2011/03/fighting-atrophy/</link>
		<comments>http://www.gingerrant.com/2011/03/fighting-atrophy/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 15:17:17 +0000</pubDate>
		<dc:creator>Brian Wigfield</dc:creator>
				<category><![CDATA[Business Development]]></category>

		<guid isPermaLink="false">http://www.adventuretechgroup.com/?p=1216</guid>
		<description><![CDATA[You have ideas and beliefs on how software should be developed and you spend hours a week researching the newest development practices, going to conferences/user groups to hear experts talk about a subject that challenges what you thought you knew. When you finally start to get “on board” the sources you were taking your inspiration...]]></description>
			<content:encoded><![CDATA[<p>You have ideas and beliefs on how software should be developed and you spend hours a week researching the newest development practices, going to conferences/user groups to hear experts talk about a subject that challenges what you thought you knew. When you finally start to get “on board” the sources you were taking your inspiration from before now are telling you something else, in direct opposition to what you just learned.</p>
<p>The truth is that you were doing it wrong before, your doing it wrong now and you will be doing it wrong tomorrow. This an important realization that you need to grasp before you can continue to grow as a developer, the ability to accept that you don’t have the best answer but you are willing to fight towards it using what you know today. But just because you know you are not right should not stop you from acting like you are, developing software is an an exercise in learning and you learn more from being wrong that you do from being right.</p>
<p>To quote <a href="http://en.wikipedia.org/wiki/House_(TV_series)">House</a> when asked “How is it that you always assume you&#8217;re right?” he responded &#8220;I don&#8217;t, I just find it hard to operate on the opposite assumption. And why are you so afraid of making a mistake?”</p>
<p>The longer you are involved with software development the harder this is to swallow, you have a tendency to believe that once you reach a certain maturity in your career that you just have it figured out.</p>
<p><a href="http://localhost:4455/wp-content/uploads/2011/03/software_evolution2.png"><img style="background-image: none; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="software_evolution" src="http://localhost:4455/wp-content/uploads/2011/03/software_evolution_thumb2.png" alt="software_evolution" width="350" height="276" align="left" border="0" /></a>To me a graph of the continuous evolution of software would look similar to this. With every new wave comes good useable ideas &amp; techniques that should be kept but without knowing when it has reached the apex you will continue to follow it down the rabbit hole until until it leads you to a place you don’t want to be. If you do this very many times you will convince yourself that the newest fad in software development is not worth following because you have been burned by trying to be on the “bleeding edge” before.</p>
<p>Depending on your situation, how much risk you are able to take on will vary. It is understandable that not every business can afford to follow the movements and instead decide to stick with the establishment, however you must not find yourself stuck below the orange line watching all the movements come and go without integrating lessons learned from the people who are taking the risks.</p>
<p>If you are in the movement don’t get discouraged that you must take one step back to take two steps forward.</p>
<p>If you are in the establishment, what you hold dear today came from a movement yesterday, so don’t forget to pay attention to what’s happening around you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gingerrant.com/2011/03/fighting-atrophy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
