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

<channel>
	<title>Pathfinder Development</title>
	<atom:link href="http://www.pathf.com/blogs/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pathf.com/blogs</link>
	<description>Running commentary about agile development, user experience design and Ajax.</description>
	<pubDate>Fri, 03 Jul 2009 13:28:20 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Elements of Testing Style</title>
		<link>http://www.pathf.com/blogs/2009/07/elements-of-testing-style/</link>
		<comments>http://www.pathf.com/blogs/2009/07/elements-of-testing-style/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 13:28:18 +0000</pubDate>
		<dc:creator>Noel Rappin</dc:creator>
		
		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=3165</guid>
		<description><![CDATA[


Cover image from Amazon.com


It's been way too long since I blathered on about style issues. Today I'd like to talk about testing style. This article assumes you are already writing tests and already using something approaching a Test-Driven Development process -- I'm not here to argue about process, at least not today.
Today the topic is [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<div class="right"><a href="http://www.amazon.com/Elements-Style-50th-Anniversary/dp/0205632645"><br />
<img class="right" src="http://www.pathf.com/blogs/wp-content/uploads/2008/10/a64d7152-eba3-4f25-af5f-d5d102b741bd.jpg" border="0" alt="A64D7152-EBA3-4F25-AF5F-D5D102B741BD.jpg" width="240" height="240" /></a></p>
<p><span class="right" style="font-size: smaller"><br />
<a href="http://www.amazon.com/Elements-Style-50th-Anniversary/dp/0205632645">Cover image from Amazon.com</a><br />
</span></p>
</div>
<p>It's been way too long since I blathered on about style issues. Today I'd like to talk about testing style. This article assumes you are already writing tests and already using something approaching a Test-Driven Development process -- I'm not here to argue about process, at least not today.</p>
<p>Today the topic is the actual construction of individual tests, how to name them, how to group them, where to get data from and the like.</p>
<p>I suspect I'll think of five more things right after I post this, so look for an update sometime in the future. The update will also address all the places where everybody tells me that I'm totally wrong.</p>
<div style="border: thin solid blue; padding: 5px">
	<strong>Self-promotion alert:</strong> More details about Rails testing can be found at <a href="http://www.railsrx.com">Rails Test Prescriptions</a>, there's a free getting started tutorial which contains an extensive section on Cucumber, and a <a href="http://www.lulu.com/content/e-book/rails_test_prescriptions/6418439">nearly 300 pages and counting full book for $9</a>. Thanks. Also, follow <a href="http://www.twitter.com/railsrx">@railsrx</a> on Twitter for a testing tip every weekday.
</div>
<p><span id="more-3165"></span><br />
<h3>Name tests after their expected behavior</h3>
<p>The first part of each test is its name. By now, there's no excuse for still using the <code>def test_underscore_instead_of_spaces</code> naming convention. Rails 2.3.x, Shoulda, and RSpec all support a style where the test name can be an actual string with actual readable spaces and everything.</p>
<p>A test should be named after the expected behavior it verifies. Being specific is helpful here -- the name is potentially important documentation.</p>
<p>GOOD: <code>test "should use last_name, first_name as display"</code></p>
<p>LESS GOOD: <code>test "should correctly display names"</code></p>
<p>BAD: <code>test "name display"</code></p>
<p>If you can't think of an easy name to describe the behavior being tested, this is a strong hint that the test is either a) richly deserving of being split into multiple parts or b) unneeded. Most of the time, it's (a).</p>
<h3>Use contexts to group related tests</h3>
<p>I'm also at the point of feeling like there's no good reason not to use contexts. If you don't want the weight of using Shoulda or RSpec, then just use the <a href="http://github.com/jeremymcanally/context/tree/master">Context</a> gem to get simple contexts. </p>
<p>So, what gets grouped in a context?</p>
<ul>
<li>A set of tests that all share a common data setup</li>
<li>A set of tests that exercise a common method, as in controller tests that all work on the same action</li>
</ul>
<p>Obviously, those two options tend to go together.</p>
<p>The context name should reflect the commonality -- either the name of the method being exercised, or something denoting the common data setup, like "as an administrative user".</p>
<h3>Nesting</h3>
<p>Contexts can also be nested, allowing for setups to be extended. I don't have very strong ideas on when nesting contexts is advisable, my current guidelines look like this:</p>
<ul>
<li>Only nest a context if the inner context uses all of the outer context setup and then adds on (similar to the guideline of only creating an Object subclass if the subclass uses 100% of the parent class data)</li>
<li>Try to keep the distance between the different setup methods as small as possible -- the problem is that having to trace setup code up multiple pages and across several generations of contexts is a real pain.</li>
</ul>
<p>Actually, the problem I'd really like a clean solution for is what to do if I want the inner context setup to be run first -- for example, a controller action that I want tested for multiple user types. The controller action is logically in the parent context, but the login as the various user type, logically in the inner context, needs to happen first. Putting a large context for each user type separates the tests for each action, which I'd rather avoid. Anybody smart got this one solved yet? </p>
<h3>Setting Up Data</h3>
<p>The guideline for creating data for tests is simple: create the minimum amount of unique data that you can while still having a meaningful test. In many cases, a model unit test will only require one object, and in many of those cases only a small number of attributes are actually relevant to the test. (One of the advantages of factory tools is the ability to highlight just those relevant attributes). </p>
<p>Even search and report methods can often be unit-tested with only two models in the database -- one to be found, and one to be ignored. (You'll often need more than one test, but each individual test is small and focused on one unit).</p>
<p>Setup should be as close to the actual test as possible, granted that it often makes sense to group repeated patterns into setup methods.</p>
<h3>Single Assertion Style</h3>
<p>Shoulda has popularized a testing style where most of the test is in the setup and each individual testing method has a single assertion. I have mixed feelings about this style, though I use it sometimes.</p>
<p>Guidelines:</p>
<ul>
<li>If you are going to do single-line tests, definitely use a tool that optimizes single-line tests like <a href="http://github.com/giraffesoft/zebra/tree/master">Zebra</a> or <a href="https://github.com/noelrappin/testbed/tree">Testbed</a>.</li>
<li>I think single-assertion tests work best when setting up relatively simple model tests that don't require a lot of nested contexts.</li>
<li>Especially in controller tests, single assertion tests can lead to a lot of extra calls to the setup and a slower test suite, so that's something to keep an eye on.</li>
</ul>
<h3>When tests should be DRY and other fascinating questions?</h3>
<p>The key thing about tests is that they are also code, so pretty much every style issue that applies to regular code also applies to tests.</p>
<p>That said, tests do have a special place in your application in that they are the part of your code that doesn't actually have tests of their own. So there are some special guidelines for tests.</p>
<p>Don't get cute. There's an old programing truism that if debugging is harder than coding, then by definition any code that is as clever as you can write it is impossible to debug. Similarly, any test written at the edge of your ability is going to be impossible to verify. It's not that metaprogramming and other fancy stuff has no place in testing -- Shoula macros depend on metaprogramming, for example. It's that you probably don't want an individual test to depend on the subtleties of Ruby's object system.</p>
<p>You can repeat yourself a little. I place a higher value in tests on being able to read the whole test in one glance than I do in regular code (I expect regular code to be spread across various methods, I expect a test to be self-contained). As such, I tend to allow somewhat more code duplication in tests than I do in application code, especially in setups. That said, keeping setups short has a value as well, and when the setup is creating enough objects that it's obscuring the point of the test, I'll refactor the setup to a helper method and reuse that. But in application code, I'll generally blast duplication immediately, but in test code, I'll often wait until I have some pain. Is that a good thing? Not sure.</p>
<p>Your turn. Where am I wrong?</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/07/elements-of-testing-style/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Aesthetics and Web Design</title>
		<link>http://www.pathf.com/blogs/2009/07/aesthetics-and-web-design/</link>
		<comments>http://www.pathf.com/blogs/2009/07/aesthetics-and-web-design/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 16:51:05 +0000</pubDate>
		<dc:creator>Sholom Sandalow</dc:creator>
		
		<category><![CDATA[UXD]]></category>

		<category><![CDATA[User Experience]]></category>

		<category><![CDATA[A list apart]]></category>

		<category><![CDATA[data visualization]]></category>

		<category><![CDATA[don norman]]></category>

		<category><![CDATA[eye tracking]]></category>

		<category><![CDATA[jakob nielson]]></category>

		<category><![CDATA[Usability]]></category>

		<category><![CDATA[visual design]]></category>

		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=3160</guid>
		<description><![CDATA[Patrick Lynch over at A list apart has just written a great article about the role of aesthetics in web design.  In it, he specifically deals with the question of how much of a role visual aesthetic design should play in the design of web sites.  To answer the question, he delves into the somewhat [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" align="right" title="Aesthetics" src="http://upload.wikimedia.org/wikipedia/commons/thumb/2/21/Mandel_zoom_00_mandelbrot_set.jpg/322px-Mandel_zoom_00_mandelbrot_set.jpg" alt="" width="180" height="135" />Patrick Lynch over at A list apart has just written a <a href="http://www.alistapart.com/articles/visual-decision-making/" target="_blank">great article</a> about the role of aesthetics in web design.  In it, he specifically deals with the question of how much of a role visual aesthetic design should play in the design of web sites.  To answer the question, he delves into the somewhat controversial notion of visual decision making--the idea that aesthetics can help users in their decision making and aid in general website usability.</p>
<p>The article is written in response to assertions made by one Jakob Nielsson, who, citing numerous <a href="http://www.useit.com/eyetracking/" target="_blank">eye tracking studies</a> that his team has performed over the years, concludes that any images, or other elements on a web page that are not integral to the site's content or function are routinely ignored, and hence superfluous or even distracting.</p>
<p>But the author says no.  Aesthetic elements on websites, while not recognized as helpful in eye tracking studies, do perform a vital role in website usability.  Mr. Lynch cites the work of early 20th century <a href="http://en.wikipedia.org/wiki/Gestalt_psychology" target="_blank">Gestalt</a> psychologists that have proven that the brain responds to images in milliseconds.  And more recent studies of web sites suggest that users make visual impressions of pages in less than 1/20 of a second--before eye tracking movements begin--and that those impressions more or less stay through the length of the visit.</p>
<p>He goes on from there about why "attractive things work better", describing Don Norman's three levels of human psychological processing (Visceral, Behavioral and Reflective), and why they all work together to create an impression of a product like a website.</p>
<p>Read the full article over <a href="http://www.alistapart.com/articles/visual-decision-making/" target="_blank">here</a>.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/07/aesthetics-and-web-design/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Asterisk-Java Testing with Groovy</title>
		<link>http://www.pathf.com/blogs/2009/07/asterisk-and-groovy/</link>
		<comments>http://www.pathf.com/blogs/2009/07/asterisk-and-groovy/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 14:03:28 +0000</pubDate>
		<dc:creator>Ivan Moscoso</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[asterisk]]></category>

		<category><![CDATA[Grails]]></category>

		<category><![CDATA[Groovy]]></category>

		<category><![CDATA[telephony]]></category>

		<category><![CDATA[Test Driven Development]]></category>

		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2540</guid>
		<description><![CDATA[
Recently I have taken a bit of a detour into the world of telephony, working with Asterisk-Java, which by itself is a very valuable tool, and worth knowing a bit about if you are integrating a system with Asterisk.  While it is a Java-based library, I am integrating it into a Grails application.
We have [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<p><img class="right" src="http://www.pathf.com/blogs/wp-content/uploads/2009/07/asterisk1.png" alt="iPhone in Dock" width="140" height="163" /></p>
<p>Recently I have taken a bit of a detour into the world of telephony, working with <a href="http://asterisk-java.org/">Asterisk-Java</a>, which by itself is a very valuable tool, and worth knowing a bit about if you are integrating a system with Asterisk.  While it is a Java-based library, I am integrating it into a Grails application.</p>
<p>We have a fairly comprehensive suite of unit tests asserting that desired behaviors are triggered upon certain events initiated through the Event API.  This is made even easier, as usual, with Groovy-- specifically on the testing front.  Here I show two hypothetical test cases, followed by supporting code that works specifically with the Asterisk-Java classes...</p>
<p><span id="more-2540"></span></p>
<pre class="groovy">&nbsp;
<span style="color: #a1a100;">import org.gmock.GMockTestCase</span>
<span style="color: #a1a100;">import org.asteriskjava.manager.event.JoinEvent</span>
<span style="color: #a1a100;">import org.asteriskjava.manager.event.LeaveEvent</span>
&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> queueObject = <span style="color: #808080; font-style: italic;">// .... some object representing an internal queue</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * Verifies caller entering a call queue will trigger behavior
 */</span>
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20void"><span style="color: #993333;">void</span></a> testCallIAddedToQueue<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  mock<span style="color: #66cc66;">&#40;</span>queueObject<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'SIP/123'</span>, <span style="color: #ff0000;">'3125551234'</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">once</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  dispatchJoinEvent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>channel: <span style="color: #ff0000;">&quot;SIP/123&quot;</span>, callerId: <span style="color: #ff0000;">&quot;3125551234&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/*
 * Verifies caller leaving call queue will trigger behavior
 */</span>
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20void"><span style="color: #993333;">void</span></a> testCallRemovedFromQueue<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    mock<span style="color: #66cc66;">&#40;</span>queueObject<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">remove</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SIP/123&quot;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">once</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    dispatchLeaveEvent<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>channel: <span style="color: #ff0000;">&quot;SIP/123&quot;</span>, dateReceived: <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><span style="color: #000000; font-weight: bold;">new</span></a> <a href="http://www.google.de/search?as_q=Date&num=100&hl=en&as_occt=url&as_sitesearch=java.sun.com%2Fj2se%2F1.5.0%2Fdocs%2Fapi%2F"><span style="color: #aaaadd; font-weight: bold;">Date</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">// ...</span>
&nbsp;</pre>
<p>The testcases above are fairly straightforward, hiding much of the details involved when working with Asterisk-Java.  The 'queueObject' can be anything, really, as long as it contains behavior which we wired into the event-handling system Asterisk-Java provides.  The important part here is how we can easily bind properties to the underlying Event types, and dispatch them so that our behavior is invoked.</p>
<pre class="groovy">&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20private"><span style="color: #000000; font-weight: bold;">private</span></a> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> dispatchJoinEvent<span style="color: #66cc66;">&#40;</span>properties<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  dispatchEvent<span style="color: #66cc66;">&#40;</span>JoinEvent, properties<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20private"><span style="color: #000000; font-weight: bold;">private</span></a> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> dispatchLeaveEvent<span style="color: #66cc66;">&#40;</span>properties<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  dispatchEvent<span style="color: #66cc66;">&#40;</span>LeaveEvent, properties<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20private"><span style="color: #000000; font-weight: bold;">private</span></a> <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> dispatchEvent<span style="color: #66cc66;">&#40;</span>eventType, eventProperties<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
  <a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><span style="color: #000000; font-weight: bold;">def</span></a> event = eventType.<span style="color: #006600;">newInstance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>:<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
  eventProperties.<a href="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20each"><span style="color: #663399;">each</span></a> <span style="color: #66cc66;">&#123;</span> name, value -&gt; event.<span style="color: #ff0000;">&quot;${name}&quot;</span> = value <span style="color: #66cc66;">&#125;</span>
  play <span style="color: #66cc66;">&#123;</span>
    asteriskService.<span style="color: #006600;">connection</span>.<span style="color: #006600;">dispatchEvent</span><span style="color: #66cc66;">&#40;</span>event<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Here I have a 'service' class defined in Grails which I call 'asteriskService'.  It encapsulates access to the Asterisk-Java <a href="http://asterisk-java.org/latest/apidocs/org/asteriskjava/manager/ManagerConnection.html">ManagerConnection</a> instance, which in turn can dispatch specific events.</p>
<p>Of interest to those new with Groovy is the binding of properties within 'dispatchEvent()'.  It looks perhaps a bit more complex than one would hope, but unfortunately JoinEvent and LeaveEvent do not have default constructors, requiring the code to 'new' them up with a placeholder argument, and then set any properties on the fly.</p>
<p>Asterisk-Java is worth checking out, but particularly nice is using a bit of Groovy to tie it in nicely.  While this can benefit the application, you can see how it helps ease testing-- particularly as you start using more and more of what the library offers.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/07/asterisk-and-groovy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>3 Misuses of Code Comments</title>
		<link>http://www.pathf.com/blogs/2009/07/3-misuses-of-code-comments/</link>
		<comments>http://www.pathf.com/blogs/2009/07/3-misuses-of-code-comments/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 13:44:48 +0000</pubDate>
		<dc:creator>Anthony Caliendo</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=3118</guid>
		<description><![CDATA[

Photo Credit: by dpascoe

Not many people talk about good practices to use for comments in code.  Many people see them as an extra or freebie, so not a lot of thought gets put into them.  The truth is, though, that comments are a great tool for giving insight into the thought process when [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<div class="right">
<img src="http://www.pathf.com/blogs/wp-content/uploads/2009/07/hammer-and-screw.jpg" alt="hammer-and-screw" title="hammer-and-screw" width="162" height="120" class="alignnone size-full wp-image-3119" /><br />
<small>Photo Credit: by <a title="Attribution License" href="http://maxamine.files.wordpress.com/2007/10/hammer-and-screw.jpg" target="_blank">dpascoe</a></small>
</div>
<p>Not many people talk about good practices to use for comments in code.  Many people see them as an extra or freebie, so not a lot of thought gets put into them.  The truth is, though, that comments are a great tool for giving insight into the thought process when the code was being written.  Unfortunately like any tool, comments can be misused.</p>
<p>Here are three of the most common misuses of comments which I tend to run into.</p>
<p><span id="more-3118"></span></p>
<p><strong>1. Commenting the Obvious</strong><br />
<em>A.K.A. Superfluous Comments</em><br />
A good rule of thumb for comments is to not comment on what the code is doing, but <u>why</u> it is doing it.  You then try to write the code as self-documenting as possible so that footnotes aren't required to figure out what is going on.  Obviously, there are going to be some times when this rule can't be followed because of the complexity of the situation and in those cases comments about what is going on is valuable.  However, you will sometimes run into comments for code which is easy to understand</p>
<p>Please take a look at the following real live example from some Flex 3 SDK code which sparked the idea for this post.  I would have to assume that anyone familiar with ActionScript would be able to figure it out on their own...<br />
<strong>BAD</strong></p>
<pre class="actionscript">&nbsp;
    <span style="color: #808080; font-style: italic;">//--------------------------------------------------------------------------</span>
    <span style="color: #808080; font-style: italic;">//</span>
    <span style="color: #808080; font-style: italic;">//  Constructor</span>
    <span style="color: #808080; font-style: italic;">//</span>
    <span style="color: #808080; font-style: italic;">//--------------------------------------------------------------------------</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">/**
     *  Constructor.
     */</span>
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> TextInput<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <span style="color: #808080; font-style: italic;">// InteractiveObject variables.</span>
        <span style="color: #0066CC;">tabChildren</span> = <span style="color: #000000; font-weight: bold;">true</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>When I saw that first giant comment, I thought to myself "hey, this just <em>might</em> be a constructor".  When I saw the second comment, I was sold on the idea!  Nestle that third comment about <code>InteractiveObject</code> variables into your mind for the next misuse (misleading comments), but try to focus on the first two for this one.</p>
<p>Commenting on very obvious stuff such as "this is a constructor" just creates clutter which reduces the readability of the code.  Instead of seeing more code at once, I have to scroll past large chunks of useless information.  Whatever "code style" reasons people use as rationalization, these types of comments are unnecessary and don't provide useful additional information or clarity (the whole point of comments).   If you feel you need a map to show where things are located, I would suggest refactoring into smaller classes and/or establishing code formatting guidelines (such as, "static variables go at the top above the constructor").</p>
<p>So, knowing this, what should the comments look like?<br />
<strong>BETTER</strong></p>
<pre class="actionscript">&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> TextInput<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
        <span style="color: #808080; font-style: italic;">// We want our children to be tab-enabled since our TextField</span>
        <span style="color: #808080; font-style: italic;">// child will be handling a lot of the work, so force this</span>
        <span style="color: #808080; font-style: italic;">// value to true to allow that.</span>
        <span style="color: #0066CC;">tabChildren</span> = <span style="color: #000000; font-weight: bold;">true</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Now, my attention is focused on a useful comment and not parsing through a lot of useless comments.</p>
<p><strong>2. Comment Confusion</strong><br />
<em>A.K.A. Incorrect or Misleading Comments</em><br />
There are two main causes for this problem.  The first cause is if the coder will write a comment that is either incorrect or not very obvious.  Sometimes this is because the confusing comment makes sense to the person writing it, and sometimes it is just because the person made a mistake.  The second cause is "code/comment drift"; this is when code is updated but the comments are not.  Code can change over time, but sometimes the comments that explain what is going on are left behind when the code changes to do something else.</p>
<p>Whatever the cause, incorrect or misleading comments can lead to confusion when the comment contradicts the code in subtle (or not so subtle) ways; you have to dig through source control or old requirements (which are sometimes not updated either) to figure out what the code should be doing.  It is an even worse problem if there is no test for the logic in question.</p>
<p>Deleting or updating comments when you change the code seems obvious to most, but I have run into this problem on more than one occasion.  The same goes for writing clear comments.  I could have used the previous example's comment  of "<code>// InteractiveObject variables.</code>" to illustrate this point since that is confusing given what the code which follows it actually does , but I'm going to spoil you with an exaggerated fake example.<br />
<strong>BAD</strong></p>
<pre class="java">&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> count<span style="color: #66cc66;">&#40;</span>List&lt;Something&gt; stuff<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">// the number of foos we find</span>
    <span style="color: #993333;">int</span> barTotal = <span style="color: #cc66cc;">0</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">// count foos</span>
    <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>Something it : stuff<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>it.<span style="color: #006600;">isBar</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            barTotal += <span style="color: #cc66cc;">1</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">// return foo count</span>
    <span style="color: #000000; font-weight: bold;">return</span> barTotal;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Now, judging by the comments, the code has a bug since it should be counting foos and not bars.  In a perfect world, the method would be named better to indicate what needs to be counted (self-documenting code) and there would be a unit test which would prove what should be going on.  But since we don't have any of that, we are left scratching our heads and spending time looking in source control and old requirements documents to try to figure out what needs to be counted.</p>
<p>What would some better comments look like? (N.B. I won't change any of the code's naming, which is really what needs to be done in this case).<br />
<strong>BETTER</strong></p>
<pre class="java">&nbsp;
<span style="color: #808080; font-style: italic;">/**
  * Count the number of bars in the passed list, and return it
  */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> count<span style="color: #66cc66;">&#40;</span>List&lt;Something&gt; stuff<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #993333;">int</span> barTotal = <span style="color: #cc66cc;">0</span>;
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>Something it : stuff<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>it.<span style="color: #006600;">isBar</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            barTotal += <span style="color: #cc66cc;">1</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">return</span> barTotal;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Notice that I made the comment reflect the code.  In the absence of any evidence of what the code should be doing, assume that it is doing the right thing and adjust the comments to reflect that.  This piece of code still needs to be investigated to determine if it is a bug or not (no, seriously, just changing comments is sweeping the problem under the rug), but at least the comment confusion has been removed.</p>
<p><strong>3. Not Enough Comments</strong><br />
<em>A.K.A. Failure to Execute</em><br />
This is probably the most common situation.  When writing code, people don't tend to think about maintaining the code or they have difficultly realizing what "unique knowledge" they have about the situation which makes certain things obvious to them but completely confusing to someone else.  </p>
<p>Knowing when a comment is needed is an art and it is difficult to give direction.  The one piece of advice which I've found useful is to ask yourself the question "if I came back and looked at this code in a year, would I know what is going on?".  If not, try to leave comments which would help your future self figure that out.</p>
<p>Take a look at the following:<br />
<strong>BAD</strong></p>
<pre class="java">&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> handleError<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> errorCode<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>errorCode &lt; <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        errorCode += <span style="color: #cc66cc;">1</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    notify<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;received error&quot;</span> + errorCode<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>Now, why exactly do we need to add one if the error code is less than three?  What sort of madness is behind this?</p>
<p>Without a comment to tell someone what is going on (or remind yourself), this magic math is a mystery.  Do we need to do this?  Has the reason for this apparent hack changed since it was coded up?  Keep in mind that a unit test wouldn't be much help here unless it had comments or a name which implied why this is being done.</p>
<p>Now, let's take a look at the same code which different comments.<br />
<strong>BETTER</strong></p>
<pre class="java">&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> handleError<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> errorCode<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">// to support operations, our error codes need to be translated</span>
    <span style="color: #808080; font-style: italic;">// to their scheme.  the mapping is:</span>
    <span style="color: #808080; font-style: italic;">//     our 3 and up = the same for operations</span>
    <span style="color: #808080; font-style: italic;">//     our 0 = their 1</span>
    <span style="color: #808080; font-style: italic;">//     our 1 = their 2</span>
    <span style="color: #808080; font-style: italic;">//     our 2 = their 3</span>
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>errorCode &lt; <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        errorCode += <span style="color: #cc66cc;">1</span>;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    notify<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;received error&quot;</span> + errorCode<span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>With just a simple comment, the reasoning for this math is now known to anyone who looks at the code.  A year later, you will be able to look at the code and know why that math is being done.<br />
<strong><em>UPDATE: 3:30PM CT</em></strong>: Again, the correct solution to this problem would be to refactor the code to be self-documenting; however, I wanted to focus mainly on the comment aspect of this instead of improving the code itself.  Improving the code would make the comment completely unnecessary, but ignore that for the sake of this example :).</p>
<p>Good coding practices, TDD, and pair programming will play a major role in alleviating comment misuse.  However, keeping in mind the rule of commenting the <em>why</em> and not the <em>what</em> will go a long way to improving comment quality.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/07/3-misuses-of-code-comments/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Fluently NHibernate</title>
		<link>http://www.pathf.com/blogs/2009/06/fluently-nhibernate/</link>
		<comments>http://www.pathf.com/blogs/2009/06/fluently-nhibernate/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 15:50:47 +0000</pubDate>
		<dc:creator>Karthik Muthupalaniappan</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Custom Application Development]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[TechDev]]></category>

		<category><![CDATA[Data Mapper]]></category>

		<category><![CDATA[Fluent]]></category>

		<category><![CDATA[NHibernate]]></category>

		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=3089</guid>
		<description><![CDATA[
Fluent NHibernate is an extension of the widely used and very popular NHibernate framework for Microsoft .NET. It is an open source framework that sits on top of the NHibernate layer and utilises all the core NHibernate methods. This framework provides an alternative to the standard XML based mappings (.hbm xml files) of NHibernate. It lets you define [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<div class="right"><img class="alignnone size-full wp-image-3090" title="logo" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/logo.png" alt="logo" width="200" height="117" /></div>
<p><a href="http://wiki.fluentnhibernate.org/show/GettingStartedIntroduction" target="_blank">Fluent NHibernate</a> is an extension of the widely used and very popular NHibernate framework for Microsoft .NET. It is an open source framework that sits on top of the NHibernate layer and utilises all the core NHibernate methods. This framework provides an alternative to the standard XML based mappings (.hbm xml files) of NHibernate. It lets you define the NHibernate mappings in strongly typed and concise C# code.  For those who are new to NHibernate, <a href="https://www.hibernate.org/343.html" target="_blank">here</a> is more information.</p>
<p><span id="more-3089"></span></p>
<p> <strong>Traditional NHibernate XML mapping</strong></p>
<pre class="xml"> &lt;?xml version="1.0" encoding="utf-8" ?&gt; 
&lt;hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
  namespace="QuickStart" assembly="QuickStart"&gt; 
 
  &lt;class name="Cat" table="Cat"&gt; 
    &lt;id name="Id"&gt; 
      &lt;generator class="identity" /&gt; 
    &lt;/id&gt; 
 
    &lt;property name="Name"&gt; 
      &lt;column name="Name" length="16" not-null="true" /&gt; 
    &lt;/property&gt; 
    &lt;property name="Sex" /&gt; 
    &lt;many-to-one name="Mate" /&gt; 
    &lt;bag name="Kittens"&gt; 
      &lt;key column="mother_id"/&gt; 
        &lt;one-to-many class="Cat"/&gt; 
      &lt;/bag&gt; 
  &lt;/class&gt; 
&lt;/hibernate-mapping&gt; </pre>
<p><strong>Fluent NHibernate equivalent</strong></p>
<pre class="bar">public class CatMap : ClassMap&lt;Cat&gt;  
{  
  public CatMap()  
  {  
    Id(x =&gt; x.Id);  
    Map(x =&gt; x.Name)  
      .WithLengthOf(16)  
      .Not.Nullable();  
    Map(x =&gt; x.Sex);  
    References(x =&gt; x.Mate);  
    HasMany(x =&gt; x.Kittens);  
  }  
}</pre>
<p> Why use Fluent NHibernate? Here are some benefits that it offers:</p>
<ul>
<li>It favors convention over configuration and overcomes the repetitiveness that is there with NHibernate. For instance, NHibernate requires string properties to be not null and have a default value. You don't have to handle this if you go fluent.</li>
<li>By getting rid of XML based mappings, it paves way for easy-to-read code that can be refactored and maintained in a simpler way. The mappings sit along with your code so any refactorings/changes to the code will cause the mappings to be affected as well. This helps catch compile errors/bugs with mappings.</li>
<li>One other obvious benefit is that the XML verbosity of NHibernate can be avoided.</li>
</ul>
<p>I think <a href="http://wiki.fluentnhibernate.org/show/GettingStartedFirstProject" target="_blank">this</a> is a good place to start picking up Fluent. You find a nice little project example that talks about mapping a simple database schema and building an application to read data using the fluent mappings.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/fluently-nhibernate/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Digging a Hole and Covering it with Leaves &#8212; The Software Development Version</title>
		<link>http://www.pathf.com/blogs/2009/06/digging-a-hole-and-covering-it-with-leaves-the-software-development-version/</link>
		<comments>http://www.pathf.com/blogs/2009/06/digging-a-hole-and-covering-it-with-leaves-the-software-development-version/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 11:30:17 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Custom Application Development]]></category>

		<category><![CDATA[Product Strategy]]></category>

		<category><![CDATA[Rich Internet Apps]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Agile Development]]></category>

		<category><![CDATA[Prototyping]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=3018</guid>
		<description><![CDATA[
 photo credit: Marco Arment
Whenever I hear the plan uttered (and in my Wall Street consulting days, I heard this a lot), that we should build an HTML (or Flash) prototype, impress the client and then fill in the back end, an unwanted image comes to mind. We're digging a hole (the missing 80% of [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<div style="float:right;padding:10px"><a title="Leaves on the lawn" href="http://www.flickr.com/photos/7171548@N04/2057792907/" target="_blank"><img src="http://farm3.static.flickr.com/2297/2057792907_161fa3a46c_m.jpg" border="0" alt="Leaves on the lawn" /></a><br />
<small><a title="Attribution License" href="http://creativecommons.org/licenses/by/2.0/" target="_blank"><img src="http://www.pathf.com/blogs/wp-content/plugins/photo-dropper/images/cc.png" border="0" alt="Creative Commons License" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit: <a title="Marco Arment" href="http://www.flickr.com/photos/7171548@N04/2057792907/" target="_blank">Marco Arment</a></small></div>
<p>Whenever I hear the plan uttered (and in my Wall Street consulting days, I heard this a lot), that we should build an HTML (or Flash) prototype, impress the client and then fill in the back end, an unwanted image comes to mind. We're digging a hole (the missing 80% of the back end) and covering it with leaves (the HTML prototype) in the hopes that the client will fall in (impressing the client).</p>
<p>No, this isn't a rant about HTML, Flash or paper prototypes. Those have their place, to be sure. We use them every day in our own software development practice, but they have a short lifespan -- usually less than an iteration on the way to delivering the actual feature that it is prototyping. But when the prototype takes on a life of it's own and becomes a long-term deliverable, that's when you run into problems. What are these problems? They aren't as numerous as fall leaves, but there are plenty.</p>
<p><span id="more-3018"></span></p>
<p><strong>The View from the Bottom of the Hole<br />
</strong></p>
<p>1. The client thinks you're practically done.</p>
<p>The interface is done, right? So you're practically done, no? Well, no. The sort of unsophisticated client that confuses a slick UI for a working system, is not going to have a lot of patience when you explain that you have to fill in that hole with the actual backend and that will take four times as long as the UI you just sold him. This can lead to...</p>
<p>2. The rotten foundation, or, get it done quick.</p>
<div style="float:right;padding:10px"><a title="Calico Ghost Town" href="http://www.flickr.com/photos/44048128@N00/3561090539/" target="_blank"><img src="http://farm4.static.flickr.com/3664/3561090539_b8ce6f8c4f_m.jpg" border="0" alt="Calico Ghost Town" /></a><br />
<small><a title="Attribution-NoDerivs License" href="http://creativecommons.org/licenses/by-nd/2.0/" target="_blank"><img src="http://www.pathf.com/blogs/wp-content/plugins/photo-dropper/images/cc.png" border="0" alt="Creative Commons License" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit: <a title="adamjackson1984" href="http://www.flickr.com/photos/44048128@N00/3561090539/" target="_blank">adamjackson1984</a></small></div>
<p>The pressure is on to complete the back end, so you cut corners and slap together the system like the fake town in High Plains Drifter. The resulting software, like all rush jobs, will be hard to maintain and not win you any points with the client.</p>
<p>3. You can't get there from here.</p>
<p>You've developed some really slick interactions in the prototype. Now in building the actual system, you discover that your idea of a transaction doesn't line up with transactions in some third party system you have to integrate with. You either have to change your interface (time for another layer of leaves!) or try to paper over this difference with a likely complex faux transaction layer in your back end. Blech!</p>
<p>4. We propose, but we don't actually do anything.</p>
<p>Regardless of how high fidelity your prototype, it probably didn't actually do anything. Otherwise, you could have actually developed working software in that same time period. If the prototype just looked good but didn't do anything, there was no opportunity to put it in someones hands and see if it did the job. You end up with something that looks good, but likely doesn't fulfill the needs of the prospective users of the system.</p>
<p>The solution to this mess? Don't develop software this way. Deliver working software every week or two and check against real users to make sure it does the job. If you're in a hole, stop digging.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/digging-a-hole-and-covering-it-with-leaves-the-software-development-version/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Importance of User Experience - Do You Understand It in Your Bones?</title>
		<link>http://www.pathf.com/blogs/2009/06/the-importance-of-user-experience-do-you-understand-it-in-your-bones/</link>
		<comments>http://www.pathf.com/blogs/2009/06/the-importance-of-user-experience-do-you-understand-it-in-your-bones/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 12:51:52 +0000</pubDate>
		<dc:creator>Bernhard Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Custom Application Development]]></category>

		<category><![CDATA[Product Strategy]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[UXD]]></category>

		<category><![CDATA[User Experience]]></category>

		<category><![CDATA[ease of use]]></category>

		<category><![CDATA[simplicity]]></category>

		<category><![CDATA[Usability]]></category>

		<category><![CDATA[user experience design]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=3067</guid>
		<description><![CDATA[Business Week had an article earlier this week on Cloud Computing that made a complete hash of the subject.  However, there was one paragraph that was right on the money:
Apple and Google understand in their bones that simplicity and ease of use are essential to broad adoption of products and services. That lesson doesn't [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<p>Business Week had an article earlier this week on <a href="http://www.businessweek.com/magazine/content/09_24/b4135042942270.htm">Cloud Computing</a> that made a complete hash of the subject.  However, there was one paragraph that was right on the money:</p>
<blockquote><p>Apple and Google understand in their bones that simplicity and ease of use are essential to broad adoption of products and services. That lesson doesn't come so naturally to Microsoft and IBM. </p></blockquote>
<p>That's why we integrate <a href="http://www.pathf.com/services/user-experience-design/">user experience design</a> into the agile development process, and that's why we advise our clients to release the simplest software they can early, so they can learn from real user feedback and continue to make improvements based on that learning.  </p>
<p>It's like John Gruber writes over at <a href=" http://daringfireball.net/2009/04/complex">Daring Fireball</a>:</p>
<blockquote><p><em>“A complex system that works is invariably found to have evolved from a simple system that worked. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work. You have to start over, beginning with a working simple system.”</em><br />
—<strong><a href="http://en.wikipedia.org/wiki/Gall%27s_law">John Gall</a></strong></p>
<p>If there’s a formula to Apple’s success over the past 10 years, that’s it. Start with something simple and build it, grow it, improve it, steadily over time. Evolve it.
</p></blockquote>
<p>Do you understand that in your bones?</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/the-importance-of-user-experience-do-you-understand-it-in-your-bones/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Writing Your Own Protocol With NSURLProtocol</title>
		<link>http://www.pathf.com/blogs/2009/06/working-with-nsurlprotocol/</link>
		<comments>http://www.pathf.com/blogs/2009/06/working-with-nsurlprotocol/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 02:39:36 +0000</pubDate>
		<dc:creator>Ivan Moscoso</dc:creator>
		
		<category><![CDATA[iPhone/Mobile]]></category>

		<category><![CDATA[iPhone SDK]]></category>

		<category><![CDATA[NSURLProtocol]]></category>

		<category><![CDATA[obj-c]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2799</guid>
		<description><![CDATA[
I have a native iPhone application in development which requires me to interact with a server that uses a stateful protocol over a persistent connection to transfer messages over the wire.  This is definitely not a trivial application to write, even though the UI itself is very simple.
The Problem
Stateful protocols and persistent connections are [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<p><img class="right" src="http://www.pathf.com/blogs/wp-content/uploads/2008/12/xcode-apps2.png" alt="iPhone in Dock" width="160" height="158" /></p>
<p>I have a native iPhone application in development which requires me to interact with a server that uses a stateful protocol over a persistent connection to transfer messages over the wire.  This is definitely not a trivial application to write, even though the UI itself is very simple.</p>
<h3>The Problem</h3>
<p>Stateful protocols and persistent connections are often interrelated, but not by design.  My first problem was to divide the original problem in two: how to manage the persistent connection, and how to handle the underlying protocol so that the stateful aspects did not bubble up throughout the UI.</p>
<p><span id="more-2799"></span></p>
<p>Persistent connections can be difficult to manage, particularly when the network topology can change so drastically (such as on mobile devices).  In this sense, there is nothing new here-- while the framework can notify you of connection events, it is still up to the developer to decide on the appropriate action.</p>
<p>The statefulness of the protocol, however, is trickier to deal with.  We must track the state of the connection, and notify the caller of 'certain' errors.  I say 'certain' because there is a class of errors that can be dealt with on behalf of the client in a reliable way, affording the rest of the application to treat the protocol <i>as if it were</i> stateless in most cases.</p>
<p>In dealing with the issue of maintaining the persistent connection, I wanted a solution which prevented me from having to manage separate thread(s), run loops, or NSOperationQueue.  It is not that these approaches could not work, only that I wanted fewer failure points in the code, and experience has shown that many times there is a better way.  Synchronous network calls were obviously not an option (if you didn't get a visceral reaction upon the very idea, just try and go that route-- it is not a happy place to be).</p>
<h3>Managing the Persistent Connection</h3>
<p>Luckily, <a href="http://code.google.com/p/cocoaasyncsocket/">AsyncSocket</a> can do much of this for you.  It's a great library for this sort of work, and I would recommend it over just using the NS connection classes alone.  This library, however, does not do everything for you.  You still have to refer to the connection from your code (either through a shared singleton approach, or as an injected dependency).</p>
<h3>Managing the Stateful Protocol</h3>
<p>I first attempted to create an interface on top of the network protocol, and quickly realized that this path would involve quite a bit of 'target/action' callbacks.  So the choice was to either create a delegate protocol around my interface, or else use the NSNotification model to notify interested parties when certain events completed.  Again, both of these options are possible, but there was just one problem...</p>
<p>...NSURLConnection and NSURLConnectionDelegate provide a lot of this for you.  Knowing this, why <i>wouldn't</i> I want to capitalize on the framework?  No synchronous calls, no extra delegate protocols to write.  You get certain faculties for free using this route as well-- an established architecture for managing credentials, caching strategies, and in some cases, a way in which you can write and test your application against <i>stateless</i> protocols (say, HTTP) in a controlled, test environment, before actually testing against your custom, stateful protocol (let's presume access to the server is limited).</p>
<p>I was sold.</p>
<p><br></br></p>
<h3>The Work</h3>
<p>At this point, the problem became one of first developing a URL scheme for my needs, and then subclassing NSURLProtocol.  My own implementation of NSURLProtocol checks the state of the single, persistent connection on each request, and issues an authentication challenge to the caller if the connection could not be created (this gives the user the ability to intercede, enter a password, or just cancel the connection).</p>
<p>The URL scheme is fairly straightforward, as the 'path' element of NSURL translates directly to commands on the server.  Query parameters represent arguments.</p>
<h3>The Way Forward</h3>
<p>There is still more work to be done, of course, but the architecture is very clear.  As mentioned above, I plan to handle changes in the network connection.  Without this, a slow cellular connection, say, would still be used even when a faster connection type suddenly became available.  Since the handling of the underlying connection is behind the protocol layer, this becomes an easier change to manage than if all parts of the code had to concern themselves with changes in the network connection itself.
</p>
<p>
My experience so far has taught me a few things about both the URL loading system in Cocoa, and how to deploy these kind of apps in the wild.  There are not many examples of NSURLProtocol out there.  This is a common complaint, but the points above, along with the existing sample code, should help steer you in the right direction.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/working-with-nsurlprotocol/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What&#8217;s In Your Dock: iPhone edition</title>
		<link>http://www.pathf.com/blogs/2009/06/whats-in-your-dock-iphone-edition/</link>
		<comments>http://www.pathf.com/blogs/2009/06/whats-in-your-dock-iphone-edition/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 20:29:21 +0000</pubDate>
		<dc:creator>Noel Rappin</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[iPhone/Mobile]]></category>

		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=3024</guid>
		<description><![CDATA[It's been a while since I've been desparate enough to had a chance to do a nice "what's in your toolbox" kind of post. In honor of the iPhone 3.0 upgrade, and Steve Jobs' liver, let's do an iPhone-toolbox post.
I'm unabashedly happy with my phone, because it's strengths and weaknesses mesh pretty well with my [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<p>It's been a while since I've <strike>been desparate enough to</strike> had a chance to do a nice "what's in your toolbox" kind of post. In honor of the iPhone 3.0 upgrade, and Steve Jobs' liver, let's do an iPhone-toolbox post.</p>
<p>I'm unabashedly happy with my phone, because it's strengths and weaknesses mesh pretty well with my actual needs. It's not that great a phone, but I don't use the phone that much. On the other hand, there's never been a better gizmo for whiling away a long train commute.</p>
<p>So, here's some stuff I use:</p>
<h3>Instapaper (free light version, $9.99 pro version currently on sale for $4.99)</h3>
<p>Instapaper has probably changed my web reading habits more than any other app since I started using RSS readers. It's so simple that its almost hard to believe how useful it is. When I come across an article on the web I want to save for later, I click a bookmarklet. Later, launching Instapaper on the phone, the article shows up, with the images stripped away, and the text presented in a reader friendly format. (Sometimes you can help Instapaper out by invoking it from the printer-friendly version of a page...)</p>
<p>Using Instapaper has become kind of second nature -- I always have a few articles ready to go. The Pro version adds a few nice features, including control of the display font and the ability to scroll the article by tilting the phone. The tilt-scroll sounds like you'll need to be a gymnast or something to read an article, but in practice it's a super-clean interface for reading long articles and letting the text scroll at your reading speed. Great app.</p>
<h3>Birdhouse ($3.99)</h3>
<p>Very well designed little app for what seems like a dumb use case -- saving drafts of posts intended for Twitter. I mean, how much do you need to polish that tweet about the ham sandwich you had for lunch, amirite?</p>
<p>But, if you are trying to do a tip a day on Twitter (<a href="http://www.twitter.com/railsrx">@railsrx</a>), then having a nice place to store up ideas for future tips is great. The app also works as a slightly structured note-taking app, since it can email it's existing draft population back to you. </p>
<h3>Stanza / Kindle (Free)</h3>
<p>The two leading general-purpose eBook readers, both of them are easy to use, and manage the task of making text readable on an iPhone. It'd be nice if there was some consistency in formats between the two apps, and also if you could buy books directly from the Kindle App (presumably that's coming).</p>
<h3>MLB At Bat ($9.99)</h3>
<p>Obviously only if you are a baseball fan, but the app gives you access to live box score and play-by-play data, live audio stream of radio broadcast, video highlights, special goodies like condensed game videos a few hours after games and, plus live video streaming on a currently limited basis. That's a lot of stuff. Add in the fact that the app is pretty enough to have won an Apple Design Award, and it's a pretty fabulous package.</p>
<h3>Twitteriffic (Free lite, $3.99 no-ads)</h3>
<p>There are something like a zillion Twitter clients on the iPhone at last count, and which one to pick is basically idiosyncratic. It's a mark of how fast iPhone development is going that Twitteriffic 1.0 won an Apple Design Award in 2008 and was completely blown away by newer clients six months later before regaining strong status with the 2.0 release. I find this has a nice blend of features and interface. (Tweetie, which is my desktop client, is also very good on the iPhone).</p>
<p>Of course, this all sounds serious -- the big winners on the iPhone have all been games, there are all kinds of inexpensive, addictive little games I play. Here are a few: Defender Chronicles, The Creeps, Drop 7, Flight Control, Frenzic, Galcon, Peggle, Strategery.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/whats-in-your-dock-iphone-edition/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Feature Fatigue</title>
		<link>http://www.pathf.com/blogs/2009/06/feature-fatigue/</link>
		<comments>http://www.pathf.com/blogs/2009/06/feature-fatigue/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 12:13:40 +0000</pubDate>
		<dc:creator>Alice Toth</dc:creator>
		
		<category><![CDATA[Custom Application Development]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2905</guid>
		<description><![CDATA[
 photo credit: stuartpilbrow
Your project is going along fine. After the initial bumps, the team has reached max velocity and is running through story points like there’s no tomorrow. The demos are a success, with the client loving how everything is coming together. Communication between the team members and the client is working well, with [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<div style="float:right;padding:10px">
<a href="http://www.flickr.com/photos/26604660@N08/3619143326/" target="_blank"><img src="http://farm4.static.flickr.com/3360/3619143326_5d3d4fffed_m.jpg" alt="flickr photo" border="0" style="border: 1px solid #000;" /></a><br /><small><a href="http://creativecommons.org/licenses/by-sa/2.0/" title="Attribution-ShareAlike License" target="_blank"><img src="http://www.pathf.com/blogs/wp-content/plugins/photo-dropper/images/cc.png" alt="Creative Commons License" border="0"  width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit: <a href="http://www.flickr.com/photos/26604660@N08/3619143326/" title="stuartpilbrow" target="_blank">stuartpilbrow</a></small></div>
<p>Your project is going along fine. After the initial bumps, the team has reached max velocity and is running through story points like there’s no tomorrow. The demos are a success, with the client loving how everything is coming together. Communication between the team members and the client is working well, with enough give and take that all sides feel like they have a genuine stake in the project. In fact, the goal posts are in sight and we’re already scheduling a release plan. And then the client asks for one more feature. Not a tweak of something already built, but a new feature that has to seamlessly incorporate into the application and not look like a last minute add-on.</p>
<p>The initial response? The team to comes to a screeching halt and devolves into something resembling the stages of grief.<span id="more-2905"></span></p>
<ol>
<li><strong>Denial</strong>: “But it’s perfect as it is.”</li>
<li><strong>Anger</strong>: “What!?!?!? We worked so hard to make it work and now they want to junk it up?”</li>
<li><strong>Bargaining</strong>: “Better to release it as is and then develop new features”</li>
<li><strong>Depression</strong>: “Stupid project”</li>
</ol>
<p>Welcome to feature fatigue. Many weeks have gone into creating this software and no one is happy about adding more stuff. I've been through this more than once and it really does seem to be the default reaction. Why? I'm not sure -- too many iterations spent solving problems? Relief that end is in sight only to have it cruelly taken away? Who knows. At some point in your career, you’ll find yourself in this situation and the question is, how to deal with it. </p>
<p>Hopefully, the new request will first have been filtered through the project manager rather than dropped on the team during a demo, as the first path tends to minimize collateral damage. In any event, regardless of how the request is introduced to the team the PM takes on the initial push-back, explains to the client the pros and cons of inserting a new feature at this late date and the effect it’ll have on the release date and/or other areas of the application (not to mention the cost). </p>
<p>It also doesn’t hurt to ask the client for a explanation of their business reason for this latest addition. This isn’t done to make the process difficult (well, not always), but rather to try and figure out if there’s something already built that will meet the business needs. And again, always good to point out the costs of adding in a new feature, especially if existing functionality will meet most or all of the business needs. These discussions will help to determine if this new feature is a “must have” or “nice to have”. It might be that building the new feature is unavoidable, but getting as much background information as possible helps everyone on the team make the best decision.</p>
<p> Once all this information is gathered and presented, the team can then move onto the final stage:</p>
<ol start=5>
<li><strong>Acceptance</strong>: “So fine, what’s the new schedule”</li>
</ol>
<p>followed by, team beers.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/feature-fatigue/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ChicagoRuby meeting &#8216;Test Prescriptions&#8217; recap</title>
		<link>http://www.pathf.com/blogs/2009/06/chicagoruby-meeting-test-prescriptions-recap/</link>
		<comments>http://www.pathf.com/blogs/2009/06/chicagoruby-meeting-test-prescriptions-recap/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 18:41:45 +0000</pubDate>
		<dc:creator>John McCaffrey</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[chicagoruby]]></category>

		<category><![CDATA[chirb windycityrails]]></category>

		<category><![CDATA[factory]]></category>

		<category><![CDATA[fixturereplacement]]></category>

		<category><![CDATA[fixtures]]></category>

		<category><![CDATA[flexmock]]></category>

		<category><![CDATA[mocking]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[railsrx]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[shoulda]]></category>

		<category><![CDATA[tdd]]></category>

		<category><![CDATA[test::unit]]></category>

		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2995</guid>
		<description><![CDATA[
The ChicagoRuby users group (not to be confused with chirb.org another great Chicago Ruby user group) held their second meeting at their downtown location.
While the meetings out in Elmhurst are always informative and helpful,  the downtown location may allow for a bigger crowd, and the weekday time might work better for more people. Plus, the [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<div class="right"><img class="alignright size-full wp-image-2996" title="chicagorubylogo" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/chicagorubylogo.gif" alt="chicagorubylogo" width="240" height="88" /></div>
<p>The <a href="http://www.chicagoruby.org" target="_blank">ChicagoRuby </a>users group (not to be confused with<a href="http://chirb.org/" target="_blank"> chirb.org</a> another great Chicago Ruby user group) held their second meeting at their downtown location.</p>
<p>While the meetings out in Elmhurst are always informative and helpful,  the downtown location may allow for a bigger crowd, and the weekday time might work better for more people. Plus, the <a href="http://www.illinoistech.org/" target="_blank">Illinois Technology Association - Tech Nexus </a> is right next to Union Station which works great for people that still have to go out to the suburbs.</p>
<p><span> </span> <span> </span><a href="http://www.pathf.com/blogs/author/noel-rappin/" target="_blank">Noel Rappin's</a> talk covered some of the most <a href="http://www.pathf.com/blogs/2009/05/rails-testing-frequently-asked-questions-the-non-code-version/" target="_blank">common questions</a> he gets through the <a href="http://www.pathf.com/blogs/" target="_blank">Pathfinder Development Blog</a>, and his own site RailsPrescriptions site <a href="http://railsrx.com/" target="_blank">RailsRX.com</a> dedicated exclusivly to testing.</p>
<p><span> </span>There's too much detail to cover here, but at a high-level, Noel covered:</p>
<ul>
<li>The why, how, when, and where questions that make the foundation of a good testing approach</li>
<li>Testing techniques for legacy projects</li>
<li>A good review of the different testing frameworks, what their differences are, and some discussion about each (test::unit, shoulda, rspec, cucumber)</li>
<li>A solid review of different <a href="http://www.pathf.com/blogs/2009/05/factory-tools-for-fixture-replacement-a-comparison/" target="_blank">factory tools</a> that go beyond standard fixtures (Factory Girl, Fixture Replacement, Machinist, and Object Daddy)</li>
<li>Strategies for migrating from Fixtures</li>
<li>Differences between the <a href="http://www.pathf.com/blogs/2009/05/comparing-ruby-mock-object-libraries/" target="_blank">mocking frameworks</a>:  Flexmock, mocha, rspec, and RR (double ruby)</li>
<li>Finding the right balance, and avoiding the pitfalls of 'over mocking'</li>
<li>Cucumber testing workflow (and where cucumber doesn't work well)</li>
</ul>
<p><span> </span> <span> </span>The audience seemed to have a wide range of experience, but all had opinions to share about what they've learned about testing.  After the talk everyone seemed fell into small groups to network and exchange ideas and contact info, and a group gathered around Ray and Noel as they tossed around some ideas on potential future meeting topics "Ruby IDE/Editor review", "Rails Jumpstart", "Coding Dojo".</p>
<p>The organizers took a stab at hosting the meeting virtually over gotomeeting (not sure if it was recorded or not).</p>
<p>Their next meeting is scheduled for July 18th, details can be found in their <a href="http://www.meetup.com/ChicagoRuby/" target="_blank">meetup.com</a> group.</p>
<div class="right"><img class="alignnone size-full wp-image-2999" title="windy_city_logo" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/windy_city_logo.png" alt="windy_city_logo" width="273" height="60" /></div>
<p>The organizers of the ChicagoRuby.com group are also the organizers of the 2nd annual <a href="http://windycityrails.org/" target="_blank">WindyCityRails </a>Conference right here in Chicago, on Sept, 12th, which Noel <a href="http://www.pathf.com/blogs/2009/06/upcoming-pathfinder-appearances/" target="_blank">will be presenting at</a>.  <span> </span></p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/chicagoruby-meeting-test-prescriptions-recap/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mowing the grass, Revisited</title>
		<link>http://www.pathf.com/blogs/2009/06/mowing-the-grass-revisited/</link>
		<comments>http://www.pathf.com/blogs/2009/06/mowing-the-grass-revisited/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 06:17:56 +0000</pubDate>
		<dc:creator>John McCaffrey</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2980</guid>
		<description><![CDATA[
 photo credit: great_sea
A few weeks ago Alice Toth and I had a conversation about how we can better serve our clients, and while we normally delve into project efficiencies like communication, developer training, and good QA practices, this time we both concluded that we need to do a better job of helping our clients [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<div style="float:right;padding:10px"><a title="After Mowing" href="http://www.flickr.com/photos/62468090@N00/140557217/" target="_blank"><img src="http://farm1.static.flickr.com/51/140557217_3ebe991e53_m.jpg" border="0" alt="After Mowing" /></a><br />
<small><a title="Attribution-ShareAlike License" href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank"><img src="http://www.pathf.com/blogs/wp-content/plugins/photo-dropper/images/cc.png" border="0" alt="Creative Commons License" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit: <a title="great_sea" href="http://www.flickr.com/photos/62468090@N00/140557217/" target="_blank">great_sea</a></small></div>
<p>A few weeks ago <a href="http://www.pathf.com/blogs/author/alice-toth/" target="_blank">Alice Toth</a> and I had a conversation about how we can better serve our clients, and while we normally delve into project efficiencies like communication, developer training, and good QA practices, this time we both concluded that we need to do a better job of helping our clients reach their goals in the most efficient way possible, and sometimes that means talking them 'down' from the specific implementation idea they have, and finding a faster way to get there.</p>
<p>I said that one of our challenges is that sometimes our clients feel they've hired us to just  'Mow the Grass', not discuss the landscape architecture, so we're not always in a place to be heard when it comes to discussing the fundamentals of a project.  Alice <a href="http://www.pathf.com/blogs/2009/05/just-mow-the-grass/" target="_blank">wrote a nice post</a> about what 'Just Mow the Grass' meant to her, and the strategy she's devised to find a nice middle ground.</p>
<h3>Here's how I see it</h3>
<p><span id="more-2980"></span><br />
I was thinking about the times when we encounter projects that are looking for what I call 'commodity software development' which is to say they feel they already have all the requirements, and everything is all figured out, and they just need a fixed-bid project to have it built. The reality though is that most of the time the idea is not fully fleshed out, and needs a good deal of work. While there might be some giant spreadsheet of features, usually the core business goals aren't clear, and many fundamental issues have not been covered.</p>
<p>If the customer thinks they have hired us to just <strong>'mow the grass'</strong>, they aren't in a place to hear any ideas about the big picture, they simply want us to 'build it', and as a consulting company we do need projects, and we want to have happy customers, so it seems we can either just build exactly what they asked for, and hope it turns out for the best, or we can help them confirm the business fundamentals a bit, and verify that the plan will work.</p>
<p><strong>"I didn't hire you to question me"</strong></p>
<p>Its not easy to get into the fundamentals with our customers, but the overall success of our work is dependent on knowing the fundamental assumptions that led to its creation, and in my mind that means we need to explore those ideas and test them out.</p>
<p>The other comparison/metaphor I had been kicking around in my head goes like this:</p>
<p style="padding-left: 30px;">Imagine you are a building contractor. You build buildings to meet the needs of your clients, while adhering to the 'best practices' of your industry. If a client comes to you and wants you to build a new 'asian-fusion' restaurant in an area that you are pretty sure its not going to take off, you could suggest that another location might work better, but in reality, the customer probably isn't interested in what a contractor has to say about the viability of a concept restaurant. If the concept doesn't take off, the contractor still got paid, the builing is still standing and can be used for other purposes, and an outsider would not conclude that the restaurant failed because of anything related to the structure of the building itself. And while it might seem that the contractor doesn't care if the concept restaurant succeeds or not, let's suppose that if it had been successful it would lead to a long and successful relationship where the contractor and the business owner continue to work together on new buildings and projects.</p>
<p>So in this example, the 'building' project has specific and measurable requirements that are independent of the big picture success of the restaurant.</p>
<p>Now comparing that to a software development project that is core to the business. The software product that is created is inextricably linked to the success of big picture, and the software is unlikely to stand on its own and be usable for some other business. In fact if the big picture is not successful often times the software product itself is blamed.</p>
<p>Some of the fundamentals of a project</p>
<ol>
<li>Is this a problem that users care about?</li>
<li>Is this the best way to solve that problem?</li>
<li>Is the business value greater than the cost to build it? (if not, how could we either lower the cost, or increase the value?)</li>
</ol>
<p>I've noticed this fundamental failure to align the proposed features of a product to their expected return more on iPhone projects, and other smaller budget projects. That's not to say that its not present on larger projects, just that its more noticeable on smaller projects.</p>
<h2>Ok, so now what?</h2>
<p>Where as I was suggesting that we need to just dive into the fundamentals of the project and balance out the features relative to their expected value, and that its our job to 'Fight' to make sure we're building the right solution to the right problem, Alice's suggestion was that we need to consistently deliver high-quality results on the tasks we've been charged to do, even if it is just 'Mowing the grass', in order to establish trust and credibility, and earn our place at the 'big table' of advice giving.</p>
<p>What I don't like about Alice's idea is that its simple, elegant, logical, and its not mine!  (There's nothing worse than someone taking something you said and interpreting it to be more positive and cohesive than you realized)</p>
<p>You may have won this round Alice, but what will you do with customers like these?</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_R2a8TRSgzZY&amp;hl=en&amp;fs=1_459474091"
			class="flashmovie"
			width="545"
			height="413">
	<param name="movie" value="http://www.youtube.com/v/R2a8TRSgzZY&amp;hl=en&amp;fs=1" />
	<param name="play" value="true" />
	<param name="loop" value="false" />
	<param name="quality" value="best" />
	<param name="allowscriptaccess" value="always" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.youtube.com/v/R2a8TRSgzZY&amp;hl=en&amp;fs=1"
			name="fm_R2a8TRSgzZY&amp;hl=en&amp;fs=1_459474091"
			width="545"
			height="413">
		<param name="play" value="true" />
		<param name="loop" value="false" />
		<param name="quality" value="best" />
		<param name="allowscriptaccess" value="always" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/mowing-the-grass-revisited/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Agile Fundamentals: The Feedback Loop</title>
		<link>http://www.pathf.com/blogs/2009/06/agile-fundamentals-the-feedback-loop/</link>
		<comments>http://www.pathf.com/blogs/2009/06/agile-fundamentals-the-feedback-loop/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 20:28:11 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Custom Application Development]]></category>

		<category><![CDATA[Rich Internet Apps]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[TechDev]]></category>

		<category><![CDATA[agile]]></category>

		<category><![CDATA[Extreme Programming]]></category>

		<category><![CDATA[Feedback Loop]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2936</guid>
		<description><![CDATA[When you improve a little each day, eventually big things occur. -- John Wooden


 photo credit: mister b 1138
A few weeks ago I had a discussion with some colleagues on the adoption of Agile within large corporations. The consensus was that Agile was almost always adapted rather than adopted -- that is, companies exclude those [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<blockquote><p><span style="font-size: x-small;"><em>When you improve a little each day, eventually big things occur.</em> -- John Wooden<br />
</span></p></blockquote>
<div style="float:right;padding:10px"><a title="DSC02378" href="http://www.flickr.com/photos/13939001@N04/2834229572/" target="_blank"><img src="http://farm4.static.flickr.com/3107/2834229572_d77d1bda34_m.jpg" border="0" alt="DSC02378" /></a><br />
<small><a title="Attribution License" href="http://creativecommons.org/licenses/by/2.0/" target="_blank"><img src="http://www.pathf.com/blogs/wp-content/plugins/photo-dropper/images/cc.png" border="0" alt="Creative Commons License" width="16" height="16" align="absmiddle" /></a> <a href="http://www.photodropper.com/photos/" target="_blank">photo</a> credit: <a title="mister b 1138" href="http://www.flickr.com/photos/13939001@N04/2834229572/" target="_blank">mister b 1138</a></small></div>
<p>A few weeks ago I had a discussion with some colleagues on the adoption of Agile within large corporations. The consensus was that Agile was almost always adapted rather than adopted -- that is, companies exclude those practices that conflict with corporate culture, modify those that seem too impractical or wasteful, and sometimes substitute those internal practices that seem a decent and familiar substitute.</p>
<p>Various schools of Agile thought have different reactions to this adaptation, all negative. The XP folks particularly <a href="http://www.devx.com/architect/Article/32761/1763/page/2" target="_blank">don't like it</a>.</p>
<blockquote><p><em>These [thirteen] practices support one another...and thus care should be taken when modifying any of them, or deciding not to include one or more of these practices in a project.</em></p></blockquote>
<p>I agree that it definitely helps to follow a particular Agile approach closely in the beginning. Once you have the basics down, you can start to improvise. But it helps knowing the fundamental principle which, in my opinion, underlies all of the agile practices, no matter what the flavor. So, the first three commandments of Agile software development are:</p>
<ol>
<li>Feedback loop</li>
<li>Feedback loop</li>
<li>Feedback loop</li>
</ol>
<p><span id="more-2936"></span></p>
<p>Pair programming is about the feedback between two developers that improves code and design quality. Test driven development is about designing testable software that then provides you with feedback when you change the system. Iterative development is about getting feedback from incremental releases of your software. Iteration retrospectives are quite obviously about garnering feedback about how the team and process worked or didn't work.</p>
<p>Whenever something isn't working in your project, try to identify the source of the problem and design a feedback loop to monitor and adjust that source. But be careful. Not all of the feedback is about the same thing. Iterations and releasing software early and often is feedback intended to improve the software product, while iteration retrospectives are intended to improve the development process. They both are about continuous, gradual improvement however. These aren't bandaids or crutches, they are not about fixing something temporarily, but about making it better for the long haul.</p>
<p>Sometimes, the problem isn't the absence of a feedback loop but the fact that it is too long or too arduous. When something doesn't work, you want to know about it now, not in a week. You want it to fail fast. That's why we have short meetings, or scrums at the beginning of every day and why we try to release software every 1 or 2 weeks. Also, the feedback has to be dead simple to get, which is why we automate as much of it as possible. Continuous integration is a good example of this.</p>
<p>Armed with this understanding of the feedback loop, you can now safely adjust an agile process to fit your corporate culture. Feedback has to be quick and automated if it is to be successful. So, if your primary product user travels internationally much of the time, you need to shorten that feedback loop, perhaps by recruiting a proxy user that our international traveler trusts. On the other hand, substituting your company standard practice weekly status meetings for a daily scrum is an example of substituting longer and more arduous feedback. Nobody wants to sit through a 2 hour status meeting once a week, so the practice degrades over time. Five to ten minute daily scrums, on the other hand, are as easy as they are useful.</p>
<p>It sometimes takes a little experience and noodling to figure out what exactly you are trying to improve. You're seeing a high bug rate and lots of build breakages. What is the cause? Perhaps a pair of developers is checking in code every week instead of several times throughout the day. It is breaking the changes of some other developers. The solution might be to put in an automated system in your continuous integration server that warns the team if a particular developer hasn't checked anything in in a while or if they have checked in a huge number of files.</p>
<p>Getting the entire team to be agile feedback detectives is really the way to go. Pride of ownership and self interest -- a good process means no software death marches -- will go a long way toward engaging everyone in process improvement.</p>
<p>I'd love to hear from you about whether you agree that the feedback loop is the core principle of agile, and also any stories -- funny, uplifting or sad -- about adapting agile in a corporate environment.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/agile-fundamentals-the-feedback-loop/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Why I love the Internet, part 87</title>
		<link>http://www.pathf.com/blogs/2009/06/why-i-love-the-internet-part-87/</link>
		<comments>http://www.pathf.com/blogs/2009/06/why-i-love-the-internet-part-87/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 17:34:09 +0000</pubDate>
		<dc:creator>Matt Nolker</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2937</guid>
		<description><![CDATA[Check out the reader comment on this characteristically astute Dvorak screed from 2007. Kudos to MarketWatch for giving readers a voice equal in visual prominence to the headline of the column. Click to view in all its full-sized glory.



via Daring Fireball.

Pathfinder is a software development firm. Hire us to build complex software that's easy to [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<p>Check out the reader comment on this characteristically astute Dvorak screed from 2007. Kudos to MarketWatch for giving readers a voice equal in visual prominence to the headline of the column. Click to view in all its full-sized glory.</p>
<p><P><br />
<a href="http://www.flickr.com/photos/34405694@N00/3654722628/" title="dvorak by mattnolker, on Flickr"><img src="http://farm4.static.flickr.com/3350/3654722628_8cce7d7871.jpg" width="500" height="438" alt="dvorak" /></a><br />
</P></p>
<p>via <a href="http://daringfireball.net/">Daring Fireball</a>.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/why-i-love-the-internet-part-87/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Integrating Design and Agile Development</title>
		<link>http://www.pathf.com/blogs/2009/06/integrating-design-and-agile-development/</link>
		<comments>http://www.pathf.com/blogs/2009/06/integrating-design-and-agile-development/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 23:04:03 +0000</pubDate>
		<dc:creator>Bernhard Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[UXD]]></category>

		<category><![CDATA[User Experience]]></category>

		<category><![CDATA[Agile Development]]></category>

		<category><![CDATA[Design]]></category>

		<category><![CDATA[user driven agile]]></category>

		<category><![CDATA[user experience design]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2904</guid>
		<description><![CDATA[If you liked my colleague Alice Toth's presentation on Agile Requirements, you'll like her talk on integrating design and agile development: 
AGILE AND ME a story with just enough documentation.
A typical waterfall project produces pages and page of end-to-end requirements for the entire project as it is envisioned (but not necessarily as it will be [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<p>If you liked my colleague Alice Toth's presentation on <a href="http://www.pathf.com/ideas/presentations-and-webinars/agile-requirements-writing/">Agile Requirements</a>, you'll like her talk on integrating design and agile development: </p>
<p>AGILE AND ME a story with just enough documentation.</p>
<p>A typical waterfall project produces pages and page of end-to-end requirements for the entire project as it is envisioned (but not necessarily as it will be built). The people compiling these requirements are, of course, part of an assembly with only the most cursory involvement with others outside their department. After all 9,238 lbs. of paper are heaved over the wall with a hearty “good luck!” and a cheery wave, the silos are once again in place and silence is golden.</p>
<p>While agile was taking hold of development, design was still stuck in the waterfall method. So why not blend the two and run the entire project in an agile fashion, starting with requirements? Here's how we do it at Pathfinder:</p>
<div style="width:425px;text-align:left" id="__ss_1569906"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ixdaagileatoth-090611145342-phpapp02&stripped_title=integrating-design-into-agile-development" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ixdaagileatoth-090611145342-phpapp02&stripped_title=integrating-design-into-agile-development" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p>Like what you see?  Check out more of Pathfinder's presentations, whitepapers and articles <a href="http://www.pathf.com/ideas/">here</a>.   </p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/integrating-design-and-agile-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Upcoming Pathfinder Appearances</title>
		<link>http://www.pathf.com/blogs/2009/06/upcoming-pathfinder-appearances/</link>
		<comments>http://www.pathf.com/blogs/2009/06/upcoming-pathfinder-appearances/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 14:14:15 +0000</pubDate>
		<dc:creator>Noel Rappin</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Pathfinder News]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2795</guid>
		<description><![CDATA[



Windy City Rails is September 12, 2009

Here are a couple of upcoming Ruby and Rails-based appearances by Pathfinder personnel:
On Tuesday, June 23, Noel Rappin (referring to himself in the third person) will be the guest speaker at the Chicago Ruby.org monthly meeting. The meeting starts at 6:00 at Chicago Ruby's downtown loop meeting location, see [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<div class="right"><a href="http://www.windycityrails.org"><br />
<img class="right" src="http://windycityrails.org/images/badge_speaker.png" border="0" alt="" /><br />
</a></p>
<p><span class="right" style="font-size: smaller"><br />
<a href="http://www.windycityrails.org">Windy City Rails is September 12, 2009</a><br />
</span></div>
<p>Here are a couple of upcoming Ruby and Rails-based appearances by Pathfinder personnel:</p>
<p>On Tuesday, June 23, Noel Rappin (referring to himself in the third person) will be the guest speaker at <a href="http://www.chicagoruby.org/articles/2009/05/26/rails-test-prescriptions-downtown/">the Chicago Ruby.org monthly meeting</a>. The meeting starts at 6:00 at Chicago Ruby's downtown loop meeting location, see the link for details. The working title of my talk is "I'd Like To Start Testing. Now What?" and it'll be an informal discussion of testing tools and good practice.</p>
<p>The schedule for <a href="http://windycityrails.org/">WindyCityRails</a> was announced this week. The conference is September 12, 2009 at the Westin Chicago River North. <a href="www.pathf.com/blogs/author/john-mccaffrey/">John McCaffrey</a> from Pathfinder will be presenting "Super-easy PDF Generation with Prawn and Prawnto", and I'll be up there with "How To Test Absolutely Anything".</p>
<p>Other speakers include Ryan Singer from 37signals, Ben Scofield from Viget Labs, and Yehuda Katz from Engine Yard.</p>
<p>Registration through August 1st is $99, there are a couple of tutorial sessions also available for purchase.</p>
<p>This was a very well-run regional conference last year, and I'm excited for this year's edition. Hope to see you there.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/upcoming-pathfinder-appearances/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What value isn&#8217;t</title>
		<link>http://www.pathf.com/blogs/2009/06/what-value-isnt/</link>
		<comments>http://www.pathf.com/blogs/2009/06/what-value-isnt/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 16:56:38 +0000</pubDate>
		<dc:creator>Matt Nolker</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Custom Application Development]]></category>

		<category><![CDATA[Product Strategy]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[value]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2780</guid>
		<description><![CDATA["I have tried Campfire, and I'm still not quite sure why people pay for it. I think you can take simplicity too far personally. It could be replicated on a weekend (As was done at google with huddlechat) so I don't see the value proposition there." Source
With apologies to Mike Godwin, I like to think [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<blockquote><p>"I have tried Campfire, and I'm still not quite sure why people pay for it. I think you can take simplicity too far personally. It could be replicated on a weekend (As was done at google with huddlechat) so I don't see the value proposition there." <a href="http://news.ycombinator.com/item?id=618516">Source</a></p></blockquote>
<p>With apologies to Mike Godwin, I like to think of the following as Nolker's Law: <em>As any technical discussion of a web 2.0 product grows longer, the probability of a claim that it can be built in a weekend approaches 1.</em></p>
<p><span id="more-2780"></span><br />
Inevitably, it's part of a larger claim: X is trivial to implement, therefore X is not valuable. You see variations on this argument everywhere: Netbooks are made of cheap components and yesterday's technology, therefore they're a fad. My 6 year old could paint that Rothko.</p>
<p>For the last time:</p>
<p><strong>Cost:</strong> How expensive it is to build.<br />
<strong>Value:</strong> How much your customers will pay for it.</p>
<p><a href="http://crave.cnet.co.uk/gadgets/0,39029552,49296926-6,00.htm">They're</a> <a href="http://www.fuckedcompany.com/">not</a> <a href="http://crave.cnet.co.uk/gadgets/0,39029552,49296926-8,00.htm">even</a> <a href="http://www.excite.com/">close</a> <a href="http://www.pathfinder.com/pathfinder/index.html">to</a> <a href="http://geocities.yahoo.com/">the</a> <a href="http://en.wikipedia.org/wiki/TheGlobe.com">same</a> <a href="http://uk.techcrunch.com/2006/11/24/boocom-to-relaunch/">thing</a>.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/what-value-isnt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to learn a new programming language or framework</title>
		<link>http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/</link>
		<comments>http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 16:03:10 +0000</pubDate>
		<dc:creator>Sharad Jain</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Custom Application Development]]></category>

		<category><![CDATA[Java]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[Grails]]></category>

		<category><![CDATA[Groovy]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/</guid>
		<description><![CDATA[While never untrue, it is more of a necessity now, that a programmer should know more than just one language or framework. After being a focussed Java/J2EE developer for a long time since college, in the last couple of years, I plunged into .NET, Ruby/Rails and then Javascript/prototype/jQuery etc and now onto groovy/grails. With name [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<p><img style="border: 1px solid #000000; margin: 2px; display: inline; float: left; width: 349px; height: 238px;" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/bunny-tutorial.jpg" alt="bunny_tutorial.jpg" width="349" height="238" />While never untrue, it is more of a necessity now, that a programmer should know more than just one language or framework. After being a focussed Java/J2EE developer for a long time since college, in the last couple of years, I plunged into .NET, Ruby/Rails and then Javascript/prototype/jQuery etc and now onto groovy/grails. With name like Erlang, Scala, Compass, git, blueprint, flex flying around us everywhere, it can be overwhelming and we need a plan to pick, peruse, acquire them. Here is a list of things I do when learning a new skill.</p>
<p><span id="more-2772"></span></p>
<p><strong>Start with Basics: Books, Tutorials etc.</strong></p>
<p>Yes, getting hands dirty is the first thing. If you are "programmers don't read manuals" type and/or you know enough about the new language, just download and give it a ride. Or you can pick a book or two, read getting started tutorials and then give it a try. The gist is start relating what we learn to what we already know and ask questions. How can I upload file in the new framework, how do I do testing, how can I write library/reusable-code etc.</p>
<p>All major language framework now-a-days have atleast 2 types of mailing lists: user and developer. It's a good idea to subscribe to user mailing list and start reading it from a few weeks or months ago depending on how fast the language is changing and how relevent the posts are to current version.</p>
<p>All this may get you coding and get by for the day but you haven't really understood the framework. Fear not, here are a couple of things you can do.</p>
<p><strong>Download and Peruse Example Apps</strong></p>
<p>Most frameworks come with an example application where it is being used to exhibit its strengths. If not, it shouldn't be difficult a reputed open-source project even if the framework itself is proprietary. This is a good place to learn best practicies and design patterns as it applies to that framework.</p>
<p><strong>Subscribe to Bug Tracker</strong></p>
<p>Bugs and new feature requests are a great way to learn about the the "other" side of a cool framework, the deficiencies that is. No quick tutorials focus on the internal nitty-gritty that we run into as soon as you start on a non-trivial project. The discussions that happen on whether something is a bug or a design choice becomes clear from this place. Again, not a bad idea to go a little back in timeline to read fixed bugs, and finished features.</p>
<p><strong>Subscribe to Core mailing-list</strong></p>
<p>Peek into the future that is. Here is where the core maintainers discuss what is the next high priority items are and how to implement them. While it may be too early to contribute here, it is a place to learn some advanced stuff.</p>
<p><strong>Download and Peruse Source Code &amp; Tests</strong></p>
<p>This takes time but it has tremendous advantages. The code is the full truth. Besides good coding practices, it also helps us understand the undocumented features of a framework. And, if code is the full truch, tests are the key to that truth. Tests help us understand what was being achieved in a piece of code.</p>
<p><strong>Pair and Ask Questions</strong></p>
<p>Pair with somebody who has had a head start with the new language. This can quickly give us the soft side tools: the efficiencies your pair spent time building and websites, blogs they use.</p>
<p><strong>blogs/wiki/screencasts</strong></p>
<p>Tutorials, API documentations, technical articles has always been there and are important. Blogs and Screencasts are even better since they are the most current and most applicable to current state of affairs with the language or framework.</p>
<p><strong>Blog your experience</strong></p>
<p>Yes, blogging about your experience will help you learn a new framework. Others who read your blog will point out what you have missed and point you in the right direction. It is also a place where you have documented your journey to refer back to.</p>
<p><strong>Work for Consulting Company</strong></p>
<p>No, this is not entirely madeup <img src='http://www.pathf.com/blogs/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> Keeping up with latest technologies is a survival trait for any consulting company and its employees. This is where we can meet other motivated folks with different interests and keep up with what is new out there. With plethora of new languages and frameworks coming and going each day, you have to be able to pick winners to add to your tool box. Blogs, RSS feeds help but a lunch time remarks from experienced gurus can go a lot further.</p>
<p>Photo Credit: <a href="http://www.flickr.com/photos/danielvoyager/">Daniel Voyager</a></p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/how-to-learn-a-new-programming-language-or-framework/feed/</wfw:commentRss>
		</item>
		<item>
		<title>5 things I can do with my windows mobile phone that you can&#8217;t do with your iPhone</title>
		<link>http://www.pathf.com/blogs/2009/06/5-things-i-can-do-with-my-windows-mobile-phone-that-you-cant-do-with-your-iphone/</link>
		<comments>http://www.pathf.com/blogs/2009/06/5-things-i-can-do-with-my-windows-mobile-phone-that-you-cant-do-with-your-iphone/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 00:15:59 +0000</pubDate>
		<dc:creator>John McCaffrey</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[TechDev]]></category>

		<category><![CDATA[iPhone/Mobile]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[iPhone]]></category>

		<category><![CDATA[tether]]></category>

		<category><![CDATA[Windows]]></category>

		<category><![CDATA[windows mobile]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2714</guid>
		<description><![CDATA[
After playing with my friend's iPhone for awhile, and using the company phone for testing out our iPhone applications, I started to get really jealous of how cool it is, and how uncool my samsung windows mobile phone seems by comparison.

The more I used the iPhone, the more I got upset at my windows phone [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<div class="right"><img class="alignright size-full wp-image-2718" title="samsung_blackjack2" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/samsung_blackjack2_lp.jpg" alt="samsung_blackjack2" width="250" height="285" /></div>
<div>After playing with my friend's iPhone for awhile, and using the company phone for testing out our iPhone applications, I started to get really jealous of how cool it is, and how uncool my samsung windows mobile phone seems by comparison.</div>
<div>
The more I used the iPhone, the more I got upset at my windows phone and started demanding "Why can't I do this on my phone?", and the more I found that there were apps out there that I didn't even know existed, as one of big problems with the windows platform is that its not easy to find good apps.</div>
<div>So here's my take on how to make your windows phone better, and what it can do for now that the iPhone can't do.</div>
<p><span id="more-2714"></span></p>
<div><strong>Powerful add on applications that really improve my phone:</strong></div>
<div>
<ol>
<li><a href="http://www.fring.com/" target="_blank"> <img class="attachment-thumbnail" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/fring.png" alt="" width="150" height="74" /> Fring </a>(IM/gmail/twitter all in one tool)</li>
<li><a href="http://www.google.com/mobile/" target="_blank"><img class="attachment-thumbnail" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/latitude-48x48.gif" alt="" width="48" height="48" /> Google mobile</a> tools (maps, gmail, reader, docs)</li>
<li><a href="http://www.evernote.com/" target="_blank"><img class="attachment-thumbnail" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/evernote.gif" alt="" width="150" height="39" /> Evernote</a> (sync pic/audio/video/text notes easily)</li>
<li><img class="alignnone size-full wp-image-2745" title="dashwire" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/dashwire.jpg" alt="dashwire" width="230" height="87" /> <a href="http://www.dashwire.com" target="_blank"> DashWire </a>(sync all of your phone data)</li>
</ol>
</div>
<div><strong>What my phone can do that an iPhone can't:</strong></div>
<ol>
<li>Tether **</li>
<li>Run more than one app at a time (background processing)</li>
<li>Support multiple browsers (IE, <a href="http://www.opera.com/mini/" target="_blank">Opera</a>, <a href="http://www.skyfire.com/" target="_blank">skyfire</a>, <a href="http://www.torchmobile.com/" target="_blank">Iris</a>)</li>
<li>Multimedia messaging **</li>
<li>Use a storage card for music, pics, etc</li>
</ol>
<p>** While there are plans for the iPhone to support tethering and multimedia messaging, AT&amp;T has not yet announced when it will be available.  (whereas I am writing this on the train right now, tethered to my phone, with just a basic data plan).  So I understand that it will be coming soon to the iPhone, but is not available yet.</p>
<p>To be honest I feel strongly that the first 2 are solid points, whereas the rest kind of quickly decrease in value, but I tried my best to come up with 5 things that mater, and I previously had 'Record Video' at #3, but now the iPhone will support that, so I had to take it out.</p>
<p><strong>Tethering</strong></p>
<p>While I saw good reviews of the <a title="Consumer Reports review" href="http://blogs.zdnet.com/cell-phones/?p=375" target="_blank">Samsung BlackJack</a> when I was in the market for a new phone, tethering was the #1 reason I bought the phone instead of an iPhone. Being able to get on the internet with my laptop from anywhere, at anytime is a very big deal for me. I take the train to work, and often have to rush out the door at night in order to make the schedule, but its easy for me to keep working from the train, and finish up my emails, check-in/deploy code, connect to vpn, etc. and that flexibility is huge.</p>
<p>As a consultant it means I can provide assistance to my customers in a more flexible manner. I recently had a customer contact me with an emergency deployment issue while I was on the road, about 20mins into a 4hour drive. While still on the phone with the customer I was able to plug my usb cable in, fire up my laptop, securely connect to their network, view the logs, debug the issue, change the code/configuration, check in to github, deploy and close out the tickets over the course of 2hours, all without losing connectivity (and picking up Wendy's on the way!).</p>
<p>At one point I had tried to find telnet/ssh tools for my phone that would allow me to do some work from the phone directly, but I find its just easier to tether and use all the tools of my laptop.</p>
<p><strong>Running Multiple applications</strong></p>
<p>Being able to run multiple apps at once is more important than I originally realized, as it helps me to be much more productive and connected.</p>
<p>Some recent use cases of mine are:</p>
<ol>
<li>Using Fring to IM a colleague about an important work email, while walking to the subway, drafting a reply to that email, opening a new tab in my browser to check the bus schedule (if its on time I'll take that instead of the train)</li>
<li>Pulling up google Maps while on the road (while someone else is driving of course) to see the route to a friend's house, using Fring to IM that friend that we'll be there soon, and looking up events going on that weekend in the area.</li>
<li>Talking on the speakerphone to a customer while looking for some info in email and google docs</li>
</ol>
<p><strong>Mulitple Browsers (or browser engines)</strong></p>
<p>This might not be a very strong point as the browsing experience on the iPhone is pretty damn good, but I am happy to have:</p>
<ol>
<li>Multiple browsers for different uses (IE for simple mobile browsing, Iris/skyfire for a more powerful experience)</li>
<li>Flash video support in the browser (YouTube, Hulu), with Skyfire</li>
</ol>
<p>* I realize there are different browser options for the iPhone, but my understanding is that they all share the same platform (ie. none of them support flash in the browser)</p>
<p><strong>Conclusion</strong></p>
<p>For me the real lesson here is that I am motivated by  'tool envy', (insert joke _here_). This is just like what I have experienced when pairing with someone using intelliJ when I was on eclipse, or they're on a mac when I'm working on windows and its something that can drive you to look at your environment and ask "how can I make this better?" For windows mobile users I think it takes a bit of effort to find the things that make the phone better, and its a shame that Microsoft hasn't made this process eaiser. Once the iPhone has tethering, and with lower prices coming, its much harder to justify buying anything other than an iPhone.<br />
(oh, and let me know if there is anything else I missed)</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/5-things-i-can-do-with-my-windows-mobile-phone-that-you-cant-do-with-your-iphone/feed/</wfw:commentRss>
		</item>
		<item>
		<title>GWTUML - Just Enough UML for Wikis</title>
		<link>http://www.pathf.com/blogs/2009/06/gwtuml-just-enough-uml-for-wikis/</link>
		<comments>http://www.pathf.com/blogs/2009/06/gwtuml-just-enough-uml-for-wikis/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 15:27:22 +0000</pubDate>
		<dc:creator>Dietrich Kappe</dc:creator>
		
		<category><![CDATA[Agile Ajax]]></category>

		<category><![CDATA[Rich Internet Apps]]></category>

		<category><![CDATA[Software Development]]></category>

		<category><![CDATA[GWT]]></category>

		<category><![CDATA[uml]]></category>

		<guid isPermaLink="false">http://www.pathf.com/blogs/?p=2708</guid>
		<description><![CDATA[Florian Mounier has spent the last six months developing GWT UML, a slick little UML diagramming tool written in, obviously, GWT. It's smooth, good looking, supports class, object and sequence diagrams. You can save your diagram as a url or export it to an SVG. You wouldn't try to do model driven development with it, [...]<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></description>
			<content:encoded><![CDATA[<p><img style="float:right;padding:10px" title="r243screenshot" src="http://www.pathf.com/blogs/wp-content/uploads/2009/06/r243screenshot.png" alt="r243screenshot" width="210" height="117" />Florian Mounier has spent the last six months developing GWT UML, a slick little UML diagramming tool written in, obviously, GWT. It's smooth, good looking, supports class, object and sequence diagrams. You can save your diagram as a url or export it to an SVG. You wouldn't try to do model driven development with it, but for embedding in a development wiki, this thing could rock.</p>
<p>You can find more information at the <a href="http://code.google.com/p/gwtuml/" target="_blank">google code project</a> and check out a demo <a href="http://1.latest.gwtuml.appspot.com/GWTUMLDrawer.html#Start" target="_blank">here</a>.</p>
<p><hr>
<a href="http://www.pathf.com/">Pathfinder is a software development firm. Hire us to build complex software that's easy to use.</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pathf.com/blogs/2009/06/gwtuml-just-enough-uml-for-wikis/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.390 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2009-07-04 13:45:10 -->
