<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>GIS and .NET Development</title>
	<atom:link href="http://briannoyle.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://briannoyle.wordpress.com</link>
	<description>Rants on GIS, .NET, and life in general</description>
	<lastBuildDate>Wed, 07 Oct 2009 21:29:09 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='briannoyle.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/225df8dae95bdf577aca1035b38e2bf2?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>GIS and .NET Development</title>
		<link>http://briannoyle.wordpress.com</link>
	</image>
			<item>
		<title>Usability and the GeoWeb Part 4: Make it Fast</title>
		<link>http://briannoyle.wordpress.com/2009/10/07/usability-and-the-geoweb-part-4-make-it-fast/</link>
		<comments>http://briannoyle.wordpress.com/2009/10/07/usability-and-the-geoweb-part-4-make-it-fast/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 20:50:49 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[General GIS]]></category>
		<category><![CDATA[GeoWeb]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Caching]]></category>
		<category><![CDATA[GIS]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/10/07/usability-and-the-geoweb-part-4-make-it-fast/</guid>
		<description><![CDATA[It&#8217;s taken me awhile to get to it due to a variety of work and family obligations but we&#8217;ve finally reached what will be my final post on usability and the geoweb&#8230;for now at least.  I haven&#8217;t covered all possible usability issues and scenarios, but have hit the high points and &#8220;big win&#8221; factors over [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=260&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>It&#8217;s taken me awhile to get to it due to a variety of work and family obligations but we&#8217;ve finally reached what will be my final post on usability and the geoweb&#8230;for now at least.  I haven&#8217;t covered all possible usability issues and scenarios, but have hit the high points and &#8220;big win&#8221; factors over the course of this series of posts.  To this point we&#8217;ve dealt with<a href="http://briannoyle.wordpress.com/2009/07/03/useability-and-the-geoweb-part-1-of/" target="_blank"> hiding complexity from our users</a>, <a href="http://briannoyle.wordpress.com/2009/07/10/usability-and-the-geoweb-part-2-provide-feedback/" target="_blank">providing users with consistent, meaningful feedback</a> within an application, and <a href="http://briannoyle.wordpress.com/2009/07/29/usability-and-the-geoweb-part-3-protect-your-users-from-themselves/" target="_blank">protecting users from themselves</a>.  The lesson plan for this last installment will focus on application performance and its criticality in the overall user experience.</p>
<p><img src="http://briannoyle.files.wordpress.com/2009/10/istock_000001885215small.jpg?w=500&#038;h=333" alt="iStock_000001885215Small" width="500" height="333" /></p>
<p>Fact: One of the most critical components of a highly usable software system is that it be highly performant&#8230;in other words, fast.  In the realm of the GeoWeb, this means that applications should load fast initially, and that responses to user activity within the application should be as quick as possible.  We now live in a world of instant gratification when it comes to our news, our hobbies, our finances, and above all our interactions with computers. Users don&#8217;t like to be kept waiting for 5 seconds every time they use your app to request information, input data, or perform other common processing tasks.  Gone are the days when watching the blue bar move in a web app, or watching the cursor spin on a wireless app were the status quo.  And frankly with the amount that we, as consultants, get paid to build custom software, the user shouldn&#8217;t have to wait.</p>
<p>Headlong into the breach then for our fourth and final lesson&#8230;</p>
<p><span id="more-260"></span></p>
<h2>Lesson 4: Maximize Real and Perceived Performance</h2>
<p>In all my years of software development, I&#8217;ve never had a user or a client come to me and say,</p>
<blockquote><p>&#8220;Ya&#8217; know Brian, this app is just too fast&#8230;please slow it down.&#8221;</p></blockquote>
<p>No matter how much time architects, developers, and UX folks spend designing and building the sexiest GeoWeb app you&#8217;ve ever seen, all that work is wasted if the user base is frustrated by long wait times to execute functions within the application.  It doesn&#8217;t matter how well you automate a customer&#8217;s workflow if they&#8217;re left sitting and twiddling their thumbs for 5-10 seconds every time they push a button.</p>
<h3>Real Performance</h3>
<p>There are a whole host of tools in the IT and software professional&#8217;s toolbox that help us maximize application and database performance.  Processing power and RAM, faster network, server farm configurations, database indexing and denormalization, etc., etc.  Those standard tools are beyond the scope of this article as they are relatively well understood.  What I&#8217;m most interested in covering is how to squeeze more performance out of our maps given a fixed IT configuration.  Real performance in our mapping realm means configuring map services to be fast from the start, caching whenever possible, and applying novel techniques to handle large datasets.</p>
<h5>Fewer Layers, Appropriate Symbology and Annotation</h5>
<p>I covered this point in the<a href="http://briannoyle.wordpress.com/2009/07/03/useability-and-the-geoweb-part-1-of/" target="_blank"> first post in the usability series back in July</a>.  The idea that users need to see all of the layers in your geodatabase to accomplish a task is ridiculous.  No matter how big your server farm is, no matter how fast your processors are or how much RAM you have, large numbers of map layers are going to slow the system down.  Focus applications on 3-5 operational layers over a base tile cache to reap significance performance gains over the kitchen sink style application paradigm.</p>
<p><img src="http://briannoyle.files.wordpress.com/2009/10/fixmapclick.png?w=500&#038;h=417" alt="FixMapClick" width="500" height="417" /></p>
<p>Another trend that we frequently see in diagnosing map-related performance issues is a map that contains complex symbology and excessive annotation in the absence of a defined business need.  A dynamic map service showing highway signs over the highways is neat but these symbols need to be rendered in four parts on the server (red, white, blue, and text) and take much longer than standard line types.  In most cases, variance in line weight and color, coupled with scale dependent rendering by road type would convey the same information to the user without the performance hit.  Save the complexity for cached services and be as simple as possible in dynamic map services.</p>
<p>Annotation is a valuable tool for adding information to maps beyond the spatial relationships conveyed by the feature geometries.  It is also frequently misused.  Applications that annotate large numbers of layers with all manner of non-critical information rapidly become cluttered and unusable, in addition to incurring the performance hit associated with rendering all that annotation in the map.  Do parcels really need: PIN, dimensions, area, address, owner name, the names of the owner&#8217;s seven children and summaries of the last 5 years tax returns?  Probably not.  Keep the annotation appropriate for the map scale and germane to the information you are trying to convey.  If it isn&#8217;t relevant to the business problem at hand&#8230;leave it out.</p>
<h5>Caching</h5>
<p>One of the primary tools in our toolbox for maximizing the performance of GeoWeb style applications is the map tile cache.  Think back to just a few years ago (pre-February 2005) and the thought of using a system of cached tiles in the era of &#8220;Web GIS&#8221; was unthinkable.  As geo-technologists we were &#8220;special&#8221; and our data was simply too critical to have any latency.  Our apps had to show that parcel split or that new forest boundary seconds after it came into existence.  I think we can all agree that in February 2005, Google Maps showed us all that this line of thinking was just a bunch of hooey.</p>
<p><img src="http://briannoyle.files.wordpress.com/2009/10/caching.png?w=500&#038;h=400" alt="Caching" width="500" height="400" /></p>
<p>Nearly all emerging applications in the GeoWeb realm wind up leveraging a tile cache for base maps within the application.  However in many of the more recent systems we have worked on, we have arrived at the assertion that you should cache as much as possible. With the exception of real time battlefield applications for the military, emergency response applications, and a very few other notable exceptions, we hold that you should cache everything.  It is a relatively simple thing to set up an automated process the update a map cache of dynamic data at a time when everyone has gone home from the office and system utilization is typically low or nonexistent.  Trust us, your users will wait 24 hrs to see that parcel update&#8230;really.</p>
<p>So, select a server side technology that supports caching map tiles for representation in the client, use a client side map viewer that will efficiently render cached map tiles, and automate cache creation/refresh if necessary to maximize map performance out of the gate.</p>
<h5>Cluster Large Datasets</h5>
<p>One of the challenges that we routinely face as developers in the age of the GeoWeb is how to deal with the representation of large numbers of geometries in the client.  Direct rendering of geometries in the client becomes the preferred method of visual representation when we need those geometries and their attributes in the client for speedy response to user action: mouse over balloons, etc.  While Flex and Silverlight offer opportunities to render larger numbers of geometries in the client efficiently, JavaScript based applications begin to experience performance degradation in the client after a couple hundred features or so.   Start dealing with complex polygon geometries and the number is less than that.  And even Silverlight and Flex aren&#8217;t going to get you speedy rendering of thousands of geometries.</p>
<p><img src="http://briannoyle.files.wordpress.com/2009/10/gains.png?w=500&#038;h=381" alt="GAINS" width="500" height="381" /></p>
<p>Consider the application shown above.  This application supports a global surveillance network monitoring avian flu (H5N1) and is built using Microsoft Bing Maps(TM) and copious amounts of JavaScript.  If we attempted to actually render global sample locations on the map, we&#8217;d likely crash the client as we&#8217;re dealing with approximately 50,000 sample locations.  Instead, we elected to cluster sampling points, aggregating data at small map scales and gradually showing additional sample locations as the user zooms in to larger map scales.  The process looks something like that shown below:</p>
<p><img src="http://briannoyle.files.wordpress.com/2009/10/clustering.png?w=500&#038;h=354" alt="Clustering" width="500" height="354" /></p>
<p>This approach allows us to determine the map extent, select the points that fall within the current map extent, and then apply a clustering algorithm to aggregate points near one another before sending the details back to the browser.  Another key point that we discovered is that spatial isn&#8217;t always better.  To perform the above tasks with data stored in ArcSDE, the average compute time was ~5 seconds.  Using SQL Server 2008 Spatial data types natively got us down to about 2 seconds, while simply maintaining sample points as X and Y columns with the rest of the non-spatial data got us to less than 1/3 of a second response time.  Don&#8217;t be afraid to leave traditional spatial technologies behind when you can improve performance without sacrificing data integrity!</p>
<p>Using the approach described above, we were able to render points on the map AS FAST as the Bing(TM) tiles come into the browser.</p>
<h3>Perceived Performance</h3>
<p>Another powerful and underutilized means of improving the user experience within an application is to leverage implementation methods that provide perceived performance gains from the user&#8217;s perspective.  Because users seldom, if ever, care about the implementation details that solve their problem, we are able to use a bit of slight-of-hand to make a data intensive application very responsive.</p>
<p>The basic message for tweaking perceived performance is actually very simple: be lean on the wire.  If you are building a data heavy app, and most of the line of business apps we build are, then take small bites rather than trying to ship down everything the user &#8220;might&#8221; ask for at once.</p>
<p>JSON and GeoJSON have become two popular and related formats for shipping data to the client for further processing and rendering, but if performance is the name of the game, don&#8217;t be afraid to depart from standards and use a custom JSON formatter to send only the necessary data down to the client.  In this case custom == fast==good!</p>
<p><img src="http://briannoyle.files.wordpress.com/2009/10/gainsjson.png?w=500&#038;h=373" alt="GAINSJson" width="500" height="373" /></p>
<p>Let&#8217;s return to our H5N1 application for just a moment and consider what happens when we return all those points to the browser.  Our custom JSON formatter returns only the information necessary to properly render points over the map.  But at the same time, a user expects to see additional detail on sample sites when they mouse over a point so what&#8217;s a developer to do?  Sending all information for all points down and storing it in the client is certainly one option, however the odds that a user is going to mouse over all of the hundreds of points typically in any given map extent is miniscule so why send all that data over the wire? As shown in the example immediately above, when the user hovers their mouse over a sample point, we quickly shoot off a tiny XHR call to get a subset of the details.  If they want more, they can click the View Details link in the mouse over window to get more information.</p>
<p>As another example, let&#8217;s consider what happens when a user requests all the details for a site.  The site flow dictates that we render the full sampling details in a tree view to the right of the map.  For our purposes we selected the Yahoo! YUI tree view for reasons that will become apparent in just a moment.</p>
<p><img src="http://briannoyle.files.wordpress.com/2009/10/gainstreeview.png?w=500&#038;h=373" alt="GAINSTreeView" width="500" height="373" /></p>
<p>When the user requests detailed information on an H5N1 sample site, we go to the server again via XHR call and get only the top level information that you see rendered above.  This is why we selected the YUI tree view over other JS-based tree views.  Dojo, JQuery, etc. either work on a full data store to render information or want to bind to a JSON object that has been fully filled.  YUI lets us load information on a node by node basis and this is critical to maximizing perceived performance in this case because, again, the likelihood of a user clicking on every single bird species in small.  If the user clicks on a species in the tree view, we go fetch only the next node of information, and so on, and so on.  Be lean on the wire.</p>
<h3>Parting Shots</h3>
<p>So here endeth the homily, go forth and develop some more.  Have I hit all the critical points? Probably not.  The field of usability and UX carries with it a substantial set of principles for buidling killer apps with great interfaces and my periodic usability rants are less a codex and more an appeal to the wider development community to continue to hold web GIS at arms length and continue to the march toward more highly performant, usable, focused applications.  The take away from all this should be that we, as a community, need to focus more effort on providing our user base with relevant information right now, and less effort on flexing our GIS muscles by seeing how much crap we can cram into a browser.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/260/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/260/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/260/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/260/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/260/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/260/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=260&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/10/07/usability-and-the-geoweb-part-4-make-it-fast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/10/istock_000001885215small.jpg" medium="image">
			<media:title type="html">iStock_000001885215Small</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/10/fixmapclick.png" medium="image">
			<media:title type="html">FixMapClick</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/10/caching.png" medium="image">
			<media:title type="html">Caching</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/10/gains.png" medium="image">
			<media:title type="html">GAINS</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/10/clustering.png" medium="image">
			<media:title type="html">Clustering</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/10/gainsjson.png" medium="image">
			<media:title type="html">GAINSJson</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/10/gainstreeview.png" medium="image">
			<media:title type="html">GAINSTreeView</media:title>
		</media:content>
	</item>
		<item>
		<title>Usability and the GeoWeb Part 3: Protect Your Users From Themselves</title>
		<link>http://briannoyle.wordpress.com/2009/07/29/usability-and-the-geoweb-part-3-protect-your-users-from-themselves/</link>
		<comments>http://briannoyle.wordpress.com/2009/07/29/usability-and-the-geoweb-part-3-protect-your-users-from-themselves/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 21:23:50 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[General GIS]]></category>
		<category><![CDATA[GeoWeb]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[user]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/07/29/usability-and-the-geoweb-part-3-protect-your-users-from-themselves/</guid>
		<description><![CDATA[As I write this post, I&#8217;m attending the GeoWeb 2009 Conference in Vancouver, BC.  This is then a pretty appropriate time to drop part 3 in the Usability and the GeoWeb series.  Part 1 in the series discussed the importance of hiding unnecessary complexity from the user, while Part 2 focused on the importance of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=248&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>As I write this post, I&#8217;m attending the GeoWeb 2009 Conference in Vancouver, BC.  This is then a pretty appropriate time to drop part 3 in the Usability and the GeoWeb series.  <a href="http://briannoyle.wordpress.com/2009/07/03/useability-and-the-geoweb-part-1-of/">Part 1</a> in the series discussed the importance of hiding unnecessary complexity from the user, while <a href="http://briannoyle.wordpress.com/2009/07/10/usability-and-the-geoweb-part-2-provide-feedback/">Part 2</a> focused on the importance of never leaving your users guessing and providing them with consistent, meaningful feedback.  In an effort to encourage the incorporation of key usability features into emerging web mapping applications, the lesson plan this time focuses on key application elements designed to protect the users from themselves.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/istock_000002826586small.jpg"><img src="http://briannoyle.files.wordpress.com/2009/07/istock_000002826586small_thumb.jpg?w=450&#038;h=251" alt="bottleneck" width="450" height="251" /></a></p>
<p>While that statement may sound a little rough (nobody should be out insulting their customers and clients after all) it is not meant as such.  <strong>I most certainly am not</strong> saying your users are foolish, stupid, or otherwise deficient in any way.  Recall Scott Karp&#8217;s assertion that in the age of Google,</p>
<blockquote><p>&#8220;&#8230;there are no stupid users, only inadequate designs&#8221;</p></blockquote>
<p>On the contrary, I simply mean that otherwise well-meaning users frequently do things within an application that the application does not expect or that create coding/logic challenges for the developer.  Our task then in building next generation systems to support/integrate with the GeoWeb requires that we anticipate as many corner cases or unexpected results as possible, and architect and code solutions to prevent the user from becoming frustrated at best, and destroying critical information at worst.  Keep the user focused on the application, and put out fires before they arise</p>
<p>With that intro, here&#8217;s lesson 3&#8230;</p>
<p><span id="more-248"></span></p>
<h2>Lesson 3: Protect Users from Themselves</h2>
<p>So you&#8217;ve built your shiny new GeoWeb application, and you&#8217;ve done everything right&#8230;required field validators, dynamically enabling/disabling input fields to prevent spurious results, targeting distinct workflows to reduce errors introduced by open and undefined function execution, enabling/disabling map tools appropriately.  Your turn the users loose on your application and what happens?  Defects start to roll in.  Well, not really defects so much as comments of frustration and questions on &#8220;How do I make this work?&#8221;.  Turns out, the application needs more work: user&#8217;s have been entering incorrectly formatted dates, and your click function to select a point on a route is nearly unusable.  Explaining to a run-of-the-mill user that a point has no size and a line has no width so selecting a line feature exactly by point is difficult is a fool&#8217;s errand.  Prevalidation of inputs, and novel approaches to handling open-ended map interactions (like clicking a point to select a road) are required to prevent users from creating invalid data, removing critical data accidentally, or entering an endless loop of retries when interacting with spatial data.</p>
<h3>Validate as Soon as Possible</h3>
<p>Ever bought plane tickets from a certain large travel site? The basic workflow is that after the user has gone through the multiple screens to purchase tix, just as the purchase is about to go through, they get a validation message telling them they need to go back to page 2 because the middle initial field is required&#8230;or some other ridiculous message that should never occur.  Even better, when the user returns to said page, the offending field may be highlighted, but data in the other 20 required fields was never cached and is now gone.  How fun is that?</p>
<p>Our roadway manager from Lessons 1 and 2 has been such a good an enlightening sport on the subject of usability that we&#8217;re going to leverage her experience again here.  Consider the figure below.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/beginrefentry.png"><img style="border-width:0;" src="http://briannoyle.files.wordpress.com/2009/07/beginrefentry_thumb.png?w=454&#038;h=343" border="0" alt="BeginRefEntry" width="454" height="343" /></a></p>
<p>Our roadway project manager is updating a road segment to reflect the correct extent of her paving project.  In this case, she&#8217;s going to manually enter the beginning point (mile number) of her project on the highlighted segment.  In this case, she indicates that her project starts at mile 90 on Route 40.  Focus on the data entry text box is lost as she goes on to do other work and what happens next is shown below.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/invalidentryaction.png"><img style="border-width:0;" src="http://briannoyle.files.wordpress.com/2009/07/invalidentryaction_thumb.png?w=454&#038;h=343" border="0" alt="InvalidEntryAction" width="454" height="343" /></a></p>
<p>Uh-oh!  Let&#8217;s look at what happened here.  We have, in the browser, knowledge of the start and end mile markers for our PM&#8217;s road segment so we can help her out a little.  The system has done some quick validation and noted that 90 is less than the allowed minimum mile number for this road segment, shown a red &#8216;X&#8217; which is almost universally understood to mean something has gone awry, and has displayed a message telling her what&#8217;s wrong with the data.  In addition, another important thing has taken place.  We have reset the value in the input box to the <strong>original</strong> value.  We have not destroyed or altered any data, nor have we asked out user to remember what the original value was.  Much like the medical profession, we as developers must &#8220;first do no harm&#8221; to our client&#8217;s data.</p>
<p>And when did all this good validation happen?  Right now!  We didn&#8217;t let the user play with the structures grid at the bottom of the page, we didn&#8217;t let her make any other changes only to warn her five minutes from now.  We caught the issue early, provided her with a visual cue, preserved the data, and gave her a potential solution to her problem&#8230;all with a little JavaScript.</p>
<p>Validate as soon as you possibly can to maintain data integrity and reduce/eliminate user frustration with your app.</p>
<h3>Prevalidate Whenever Possible</h3>
<p>If validating early is good, prevalidating to avoid problems entirely is even better.  So I know it&#8217;s painful but we&#8217;re going to leave the realm of the roadway project manager for a second in favor of world health issues.  We&#8217;ve built, and continue to enhance, a system for a prominent world wide NPO to track H5N1 (bird flu) incidence around the world.  The system is used by personnel in multiple countries around the world which presents some special issues surrounding data entry&#8230;for this specific example let&#8217;s consider the entry of dates.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/datepicker.png"><img style="border-width:0;" src="http://briannoyle.files.wordpress.com/2009/07/datepicker_thumb.png?w=454&#038;h=470" border="0" alt="DatePicker" width="454" height="470" /></a></p>
<p>While folks in the US are used to entering date information as MM/DD/YYYY or some variant thereof, other countries like DD/MM/YYYY or YYYY/MM/DD.  Heck some countries (Nepal comes to mind) have entirely different calendars that map by mathematical formula to the Gregorian calendar we&#8217;re all familiar with.  While we could simply format date entries to UTC, etc. on the server side, this requires logic at the server to accept information on where in the world the user is entering their data, and complex client logic to turn that UTC into a date that is meaningful to the local user on the other end.  No so fun to deal with.  Why not just use an internationalized date picker?  This is prevalidation at it&#8217;s best, the date picker shows a calendar to the user, and when the user picks a date, it is formatted and transmitted in the appropriate format for the local users.  The use of a simple JS widget completely eliminates any chance of an invalid date, or a correct date incorrectly formatted, from squeaking into the system and frustrating or confusing users.  At the same time, the picker knows that a date entered in Europe needs to be formatted differently for a user in the US.</p>
<h3>Short Circuit Open or Vague Inputs</h3>
<p>So we&#8217;re going to jump back to check in on our friendly roadway project manager for our last point in the lesson.  She&#8217;s back in our system setting the segments up for a roadway project and telling the system where her paving project is at.  This time, she will be setting up her project road segments by clicking on the map.  This is where things can get interesting because the user can click anywhere she wants.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/errantmapclick.png"><img style="border-width:0;" src="http://briannoyle.files.wordpress.com/2009/07/errantmapclick_thumb.png?w=454&#038;h=379" border="0" alt="ErrantMapClick" width="454" height="379" /></a></p>
<p>In the figure immediately above, the user has clicked, whether accidentally or intentionally, a point that is nowhere near the roadway she is working on.  Now, we could try to write code to maximize the efficacy of buffering the point to intersect with the line based on map scale but things can get pretty complex when scale dependent buffers etc. are involved.  A run of the mill user is going to get red faced quickly if we keep telling them to &#8220;try again you&#8217;re not close enough&#8221;.  So why not do something like the result shown in the figure below?</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/fixmapclick.png"><img style="border-width:0;" src="http://briannoyle.files.wordpress.com/2009/07/fixmapclick_thumb.png?w=454&#038;h=379" border="0" alt="FixMapClick" width="454" height="379" /></a></p>
<p>In response to a less than optimal map click for setting the end reference of a roadway project, we simply snap to the closest point on the selected segment.  We&#8217;ve avoided coding complex scale dependent buffer/intersect logic that the user will never understand anyway, we&#8217;ve avoided the potential for an infinite click-retry loop for the user, and we still get a value that, while it may be incorrect from the user&#8217;s perspective, is still a valid point on the segment.  If she doesn&#8217;t like it she can enter the mile marker by hand or simply click again.  Low friction protection for the user and it short circuits a whole series of potential outcomes, all of which are bad.</p>
<h3>Up Next&#8230;</h3>
<p>Since I&#8217;ve yet to meet a client or user that says their system is too fast, our next usability topic(s) will deal with both real and perceived performance in your GeoWeb application and how to maximize each of these critical performance factors. Stay tuned&#8230;</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/248/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/248/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/248/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/248/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/248/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/248/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/248/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/248/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/248/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/248/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=248&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/07/29/usability-and-the-geoweb-part-3-protect-your-users-from-themselves/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/istock_000002826586small_thumb.jpg" medium="image">
			<media:title type="html">bottleneck</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/beginrefentry_thumb.png" medium="image">
			<media:title type="html">BeginRefEntry</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/invalidentryaction_thumb.png" medium="image">
			<media:title type="html">InvalidEntryAction</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/datepicker_thumb.png" medium="image">
			<media:title type="html">DatePicker</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/errantmapclick_thumb.png" medium="image">
			<media:title type="html">ErrantMapClick</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/fixmapclick_thumb.png" medium="image">
			<media:title type="html">FixMapClick</media:title>
		</media:content>
	</item>
		<item>
		<title>Usability and the GeoWeb Part 2: Provide Feedback</title>
		<link>http://briannoyle.wordpress.com/2009/07/10/usability-and-the-geoweb-part-2-provide-feedback/</link>
		<comments>http://briannoyle.wordpress.com/2009/07/10/usability-and-the-geoweb-part-2-provide-feedback/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 20:32:17 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[General GIS]]></category>
		<category><![CDATA[GeoWeb]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/07/10/usability-and-the-geoweb-part-2-provide-feedback/</guid>
		<description><![CDATA[This post is the second in a multi-part series on usability in web-mapping applications.  Dave has spoken extensively on this topic of late&#8230;and much of this is just putting fingers to keyboard on the issues we&#8217;ve been harping on for some months now.  The first post in the series asserted that we, as developers and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=231&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>This post is the second in a multi-part series on usability in web-mapping applications.  <a href="http://www.dtsagile.com/media/presentations" target="_blank">Dave has spoken extensively on this topic of late</a>&#8230;and much of this is just putting fingers to keyboard on the issues we&#8217;ve been harping on for some months now.  <a href="http://briannoyle.wordpress.com/2009/07/03/useability-and-the-geoweb-part-1-of/" target="_blank">The first post in the series</a> asserted that we, as developers and architects of these systems have a tendency to make things too complex and flood the user with all manner of features, functions, and data layers they don&#8217;t need.  In essence, the age of GIS in a browser is ending (I sincerely hope) and we&#8217;re moving toward highly performant, intuitive, and focused applications in a browser that serve a particular purpose, and do it very well.  Why? Because someone else is bound to be offering the same stuff you are, and if they can provide the information faster, they win&#8230;bye, bye users and bye, bye clients.</p>
<p>Part 1 discussed hiding unnecessary complexity from the user, while our lesson plan this time around uses extensive feedback mechanisms within a site to keep the user on our side and make them feel comfortable when visiting our site.  A confident user is a comfortable user. A comfortable user gets what they need and gets back out fishing, golfing, spending time with their kids, or otherwise doing something else besides staring blankly at your interface.<span id="more-231"></span></p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/hendrix.png"><img style="border-bottom:0;border-left:0;border-top:0;border-right:0;" src="http://briannoyle.files.wordpress.com/2009/07/hendrix_thumb.png?w=454&#038;h=342" border="0" alt="Hendrix" width="454" height="342" /></a></p>
<p>With that, here&#8217;s lesson 2&#8230;</p>
<h2>Lesson 2: Provide Feedback to the User</h2>
<p>Nothing presents a bigger usability hurdle than a mapping application that leaves the user wondering, “Well this looks cool, but what do I do?” This is the principal downfall of applications that try to shove GIS into a browser.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/browsergis.png"><img style="border-bottom:0;border-left:0;border-top:0;border-right:0;" src="http://briannoyle.files.wordpress.com/2009/07/browsergis_thumb.png?w=454&#038;h=293" border="0" alt="BrowserGIS" width="454" height="293" /></a></p>
<p>Geodevelopers know exactly what to do with three different toolbars and four menus containing all manner of map navigation, query, buffer, and analysis tools but open workflow applications with no guidance are intimidating to line of business users and the public. The web mapping industry at large must learn to develop applications that satisfy specific workflows and to lead users through those workflows within the application with visual cues and feedback in the UI.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/figure2.png"><img style="border-bottom:0;border-left:0;border-top:0;border-right:0;" src="http://briannoyle.files.wordpress.com/2009/07/figure2_thumb.png?w=454&#038;h=418" border="0" alt="Figure2" width="454" height="418" /></a></p>
<p>The roadway manager introduced in Lesson 1, uses the interface shown above to specify the begin and end points of a roadway project. First, note the simple informational panels that appear in the right hand column of the site to explain how to use the features on this page. Second, accept that a GIS professional knows that when they click a pencil icon, they expect to draw something on a map, but a roadway manager does not necessarily connect these two actions. Thus when the user clicks the pencil icon to set the begin or end point, information appears below the map telling our roadway manager what to do next. “Click the map to set the begin point.” It’s as simple as showing or hiding a &lt;div /&gt; element in the page, and it is a critical usability feature that is often overlooked.</p>
<h3>Hold the User&#8217;s Hand</h3>
<p>I&#8217;ve recently read a couple of typical user workflows for web mapping applications that read something like this:</p>
<table border="0" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td width="69" valign="top"><strong>Step</strong></td>
<td width="329" valign="top"><strong>User Action</strong></td>
</tr>
<tr>
<td width="69" valign="top">1</td>
<td width="329" valign="top">Draw a polygon on the screen</td>
</tr>
<tr>
<td width="69" valign="top">2</td>
<td width="329" valign="top">Intersect polygon with parcels</td>
</tr>
<tr>
<td width="69" valign="top">3</td>
<td width="329" valign="top">Create report on parcels within polygon</td>
</tr>
<tr>
<td width="69" valign="top">4</td>
<td width="329" valign="top">Find a facility by name</td>
</tr>
<tr>
<td width="69" valign="top">5</td>
<td width="329" valign="top">Turn on critical infrastructure layer(s)</td>
</tr>
<tr>
<td width="69" valign="top">6</td>
<td width="329" valign="top">Find electrical infrastructure by id and zoom to it</td>
</tr>
<tr>
<td width="69" valign="top">7</td>
<td width="329" valign="top">Close application</td>
</tr>
</tbody>
</table>
<p>First of all, in my book this is actually two workflows but that&#8217;s beside the point.  What really grinds my gears is that when you look at the application built to satisfy this workflow, the architect/developer elected to provide a separate tool to do each of these actions so that the user is free to wander around the site and do things in any order they please.  Not only does the user need to know which tools to pick from, they need to know the correct order.  While eventually the user will figure out the &#8220;happy path&#8221;, that&#8217;s a lot of moving around the app and a big learning curve that is just going to frustrate and turn the user off.  If we know the user is going to perform these actions to get information each time they visit, why don&#8217;t we just write a widget that does exactly that???</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/holdusershand.png"><img style="border-bottom:0;border-left:0;border-top:0;border-right:0;" src="http://briannoyle.files.wordpress.com/2009/07/holdusershand_thumb.png?w=454&#038;h=360" border="0" alt="HoldUsersHand" width="454" height="360" /></a></p>
<p>Now have a gander at the app shown above.  The workflow that this particular application functionality supports is as follows:</p>
<table border="0" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td width="69" valign="top"><strong>Step</strong></td>
<td width="329" valign="top"><strong>User Action</strong></td>
</tr>
<tr>
<td width="69" valign="top">1</td>
<td width="329" valign="top">Draw a polygon on the screen</td>
</tr>
<tr>
<td width="69" valign="top">2</td>
<td width="329" valign="top">Intersect polygon with parcels</td>
</tr>
<tr>
<td width="69" valign="top">3</td>
<td width="329" valign="top">Enter attributes for polygon</td>
</tr>
<tr>
<td width="69" valign="top">4</td>
<td width="329" valign="top">Intersect polygon with parcels/infrastructure</td>
</tr>
<tr>
<td width="69" valign="top">5</td>
<td width="329" valign="top">Turn on critical infrastructure layer(s)</td>
</tr>
<tr>
<td width="69" valign="top">6</td>
<td width="329" valign="top">Generate report of affected facilities</td>
</tr>
<tr>
<td width="69" valign="top">7</td>
<td width="329" valign="top">Close application</td>
</tr>
</tbody>
</table>
<p>To support this workflow we could build a drawing tool with a data entry interface, an a generic intersect tool, a TOC, and a reporting tool, but why in the world would we do that? This is an emergency response application which means we don&#8217;t want our user&#8217;s hunting and pecking for tools when they could be busy making bad things stop&#8230;immediately.  The entire workflow is encapsulated in a single dojo dijit.</p>
<ol>
<li>When the user activates the dijit by clicking on a menu item, they are prompted immediately to draw a shape and are informed on how to close the shape/stop drawing&#8230;a double click.</li>
<li>Once the user closes the shape, the data entry interface pops up and says &#8220;Hey, I need some data!&#8221;.</li>
<li>As each field is filled in, the form keeps squawking for more data until it has what it needs.</li>
<li>Since we already know the user is going to want to generate a report after we do our intersect and save all this data in the database, we ask them which one they want from the get go.</li>
<li>On &#8216;OK&#8217; the system goes away, saves the polygon and attributes, does a bunch of processing steps and pops up the needed report.</li>
</ol>
<p>We have held the user&#8217;s hand, led them through a well defined workflow, and given them the information they needed without all the noise and distraction of 2 menus, 3 buttons, a cup of coffee and two trips to the bathroom.</p>
<h3>Reassure the User</h3>
<p>When a GIS Professional executes an attribute query or runs an intersect operation, they typically understand that sometimes, the result set is empty. The public, or some other non-GIS user, gets very nervous when they perform an action and are either presented with an empty UI, or are otherwise redirected to something they didn’t expect. Did they delete something important? Is the request still processing? Did the site crash? “What the heck happened to my data?!?”</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/figure3.png"><img style="border-bottom:0;border-left:0;border-top:0;border-right:0;" src="http://briannoyle.files.wordpress.com/2009/07/figure3_thumb.png?w=454&#038;h=343" border="0" alt="Figure3" width="454" height="343" /></a></p>
<p>The importance of reassuring the user anytime something out of the ordinary happens cannot be over stated. Continuing with the roadway manager example, the figure above illustrates a case where the user has selected a project with no location information. Rather than showing the user an empty interface, leaving her to worry about what has happened, the map interface is zoomed to the general area of the project (known from tabular information) and an informational dialog explains that there is no need to worry and provides instructions on how to remedy the missing data issue. There is no need for a complicated exception or null case scenario; a simple modal dialog addresses the usability issue and keeps the user on the right track.</p>
<h3>Up Next</h3>
<p>Stay tuned for part 3 in the series dealing with strategies for protecting the user from themselves.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/231/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=231&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/07/10/usability-and-the-geoweb-part-2-provide-feedback/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/hendrix_thumb.png" medium="image">
			<media:title type="html">Hendrix</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/browsergis_thumb.png" medium="image">
			<media:title type="html">BrowserGIS</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/figure2_thumb.png" medium="image">
			<media:title type="html">Figure2</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/holdusershand_thumb.png" medium="image">
			<media:title type="html">HoldUsersHand</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/figure3_thumb.png" medium="image">
			<media:title type="html">Figure3</media:title>
		</media:content>
	</item>
		<item>
		<title>Usability and the GeoWeb: Part 1 of ?</title>
		<link>http://briannoyle.wordpress.com/2009/07/03/useability-and-the-geoweb-part-1-of/</link>
		<comments>http://briannoyle.wordpress.com/2009/07/03/useability-and-the-geoweb-part-1-of/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 15:45:08 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[General GIS]]></category>
		<category><![CDATA[GeoWeb]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[complexity]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/07/03/useability-and-the-geoweb-part-1-of/</guid>
		<description><![CDATA[Myself and my partner in crime, Dave Bouwman, have talked incessantly in trade publications and at conferences of late about the Geospatial Web or &#8220;GeoWeb&#8221; and what it means to GIS professionals and software developers.  This post is the first in a several part series on usability issues and concerns when designing and building applications [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=220&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Myself and my partner in crime, <a href="http://blog.davebouwman.com/" target="_blank">Dave Bouwman</a>, have talked incessantly in <a href="http://www.esri.com/news/arcuser/0609/aspnetmvc.html" target="_blank">trade publications</a> and <a href="http://www.dtsagile.com/media/presentations" target="_blank">at conferences of late</a> about the Geospatial Web or &#8220;GeoWeb&#8221; and what it means to GIS professionals and software developers.  This post is the first in a several part series on usability issues and concerns when designing and building applications for the GeoWeb.  How many parts will the series have?  Well that all depends upon how worked up I get and how often and long I want to rant.</p>
<p>It is my sincere hope that we, as a community, are finally moving on from the era of exposing buckets of complex GIS functionalities in the browser.  <a href="http://briannoyle.wordpress.com/2009/06/15/standard-architecture-for-the-geoweb-give-it-a-rest/" target="_blank">As noted in a previous post</a>, the GeoWeb is, in essence, all things Web 2.0 writ large on a map. For ESRI customers it is REST, JavaScript, Flex, and Silverlight APIs for ArcGIS Server.  Beyond the ESRI realm it is Microsoft Bing Maps, Google Maps, Google Earth, or myriad FOSS offerings.</p>
<p><span id="more-220"></span></p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/geoweb.png"><img src="http://briannoyle.files.wordpress.com/2009/07/geoweb_thumb.png?w=450&#038;h=328" alt="GeoWeb" width="450" height="328" /></a></p>
<p>Since internet users now have a myriad of choices in where they go for information, we as professionals should be designing highly usable systems that give users relevant information…and give it to them right now. If we don’t, they’ll simply go somewhere else. What this means for all of us as architects, and developers, and project managers in the mapping industry, is that usability trumps features. Since our customers are foresters, real estate agents, state troopers, and roadway managers, not GIS professionals, we need to hide GIS complexity, provide determinate, task oriented interfaces, and answer the user’s question with a minimum of friction and interaction.</p>
<p>While quick performance and a killer site skin with an open, uncluttered layout are certainly important in the age of the GeoWeb, they are only part of the equation. Based on my unscientific observations, geodevelopers are still challenged on the usability front in that the typical application with buckets of data and loads of tools with an unconstrained workflow is still making it out the door and into the market in many cases. Creating great apps for public facing or line of business sites serving non-GIS professionals requires a lesson plan that focuses on the user and on the mental model of how the user interacts with functionality that the geodeveloper exposes.</p>
<h2>But I need a full featured GIS in my browser</h2>
<p>Oh no you don&#8217;t.  We at <a href="http://www.dtsagile.com" target="_blank">DTSAgile</a> maintain that there are very few situations that actually call for a web-based GIS. When these web applications are built, they are so complex that only GIS professionals understand how to use them. Perversely, the performance and technical limitations of web development make these applications too limited to be useful for GIS professionals! Give GIS professionals access to professional GIS tools &#8211; desktop GIS applications. Citrix or Terminal Services technologies provide an excellent means to do this in a distributed environment. This allows all the GIS applications and data to be co-located in a single data-center, while still having a “desktop” experience at remote locations. Having designed, architected and developed several large implementations, we’ve seen how it can deliver powerful desktop GIS functionality across an enterprise very cost effectively.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/gisinbrowser.png"><img style="border-width:0;" src="http://briannoyle.files.wordpress.com/2009/07/gisinbrowser_thumb.png?w=454&#038;h=446" border="0" alt="GISInBrowser" width="454" height="446" /></a></p>
<p>If however your goal is to service the public or users in a specific line of business, then you would do well in creating focused applications which help a user solve a specific problem easily – which is exactly what GeoWeb style applications do. The next generation of spatial applications is now arriving on the scene and starting to leverage real GIS analytical capabilities <em>behind</em> the scenes. While the tendency to mimic the indeterminate workflows of desktop GIS packages in a browser has noble goals, implementation, performance, and usability issues usually run rampant and completely swamp any cool-factor. Instead, focus on solving specific business problems by building tools that are tailored to the actual end user.</p>
<p>With that introduction&#8230;here&#8217;s lesson 1.</p>
<h2>Lesson 1: Stash complexity away</h2>
<p>Foresters know trees, state troopers know law enforcement, the County Auditor knows real estate assessment, the public knows a whole variety of things, but likely none of these user groups knows specifically what a buffer, intersect, union, or thiessen polygon is. When a roadway project manager asks for all structures near her project, without knowing it she really means,</p>
<blockquote><p>“Locate point features in the Structures layer that fall within 1 mile of the section of Route 6A between mile posts 12 and 25.”</p></blockquote>
<p>A GIS professional would know that getting this information requires an initial point selection, followed by a buffer, an intersection with a second layer (roads), followed by a buffer of the resulting road segment, followed by an intersection of the second buffer with the structures layer. The roadway project manager does not know this, nor should she.  Furthermore, why in name of Pete would we give her 5 or 6 separate tools and ask her to figure out that process in the correct order?</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/fewerlayers.png"><img style="border-width:0;" src="http://briannoyle.files.wordpress.com/2009/07/fewerlayers_thumb.png?w=454&#038;h=370" border="0" alt="FewerLayers" width="454" height="370" /></a></p>
<p>Consider the application shown in the figure above.  For those keeping track, the app is an ASP.NET MVC implementation consuming data via the WMS capabilities of ArcGIS Server 9.2 within the OpenLayers client interface.</p>
<h3>Fewer Layers</h3>
<p>Note how few layers are in the map.  I&#8217;m sorry to say so, but if you think your users need or want to see all 150 layers in your Geodatabase, you are dead wrong.  Unless your application operates on or depends on that really detailed point layer of GPS&#8217;d mailbox locations for correct function, leave it at home and let&#8217;s keep it simple okay?</p>
<p>Consider using a base tile cache with some sexy cartography, and then roll in 3-5 operational layers that contain only the information that the user needs to accomplish their goal.  The example above contains roadways, separated into scale appropriate layers for display purposes, and counties to provide locational context.  To our roadway manager, everything else is noise in the system and doesn&#8217;t contribute substantially to her ability to do her job so it is left out.  Using fewer layers also has the side effect of dramatically increasing map rendering performance&#8230;which is topic for a separate post in this series dealing with real and perceived performance.</p>
<h3>Hide the Details</h3>
<p>Check out the minimalist map navigation at the top left of the map and the conspicuous lack of multiple tool buttons, menus, legends, layer lists, etc. in our example above. This application is used by State DOT roadway project managers and all these folks need to do their job is to:</p>
<ul>
<li>Specify what road segment a project is on</li>
<li>List structures along the road (culverts, mast arms, etc.) impacted by a project</li>
</ul>
<p>Highly useable systems hide complex GIS operations from the user and get the desired answer quickly. The selection, buffers, and intersections that get the roadway manager the information she needs to do her job are hidden inconspicuously behind the “Search for Structures” button highlighted below.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/07/figure1.png"><img style="border-width:0;" src="http://briannoyle.files.wordpress.com/2009/07/figure1_thumb.png?w=454&#038;h=370" border="0" alt="Figure1" width="454" height="370" /></a></p>
<p>Once the project road segment is selected, this search button becomes enabled, and a single click returns a list of affected structures to the user in approximately 0.3 seconds in this application allowing her to get back to what’s really important&#8230;spending that stimulus check.</p>
<h2>Future Zen</h2>
<p>Keep checking back here for additional posts on usability, performance, etc. for building the next generation of web mapping applications.  Future posts will deal with feedback to the user, user reassurance, protecting users from negative outcomes in your app, real and perceived performance, and anything else I can think of that irks me when I look at some of the &#8220;Web GIS&#8221; sites I see rolling out onto the internet.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/220/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=220&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/07/03/useability-and-the-geoweb-part-1-of/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/geoweb_thumb.png" medium="image">
			<media:title type="html">GeoWeb</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/gisinbrowser_thumb.png" medium="image">
			<media:title type="html">GISInBrowser</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/fewerlayers_thumb.png" medium="image">
			<media:title type="html">FewerLayers</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/07/figure1_thumb.png" medium="image">
			<media:title type="html">Figure1</media:title>
		</media:content>
	</item>
		<item>
		<title>Standard Architecture for the GeoWeb: Give it a REST</title>
		<link>http://briannoyle.wordpress.com/2009/06/15/standard-architecture-for-the-geoweb-give-it-a-rest/</link>
		<comments>http://briannoyle.wordpress.com/2009/06/15/standard-architecture-for-the-geoweb-give-it-a-rest/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 20:05:31 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[GeoWeb]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[ROA]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/06/15/standard-architecture-for-the-geoweb-give-it-a-rest/</guid>
		<description><![CDATA[Author&#8217;s note: This post was prepared in advance of an architecture panel I will be participating in at the GeoWeb conference July 27-31, 2009 in Vancouver.&#160; At the request of conference organizers, myself and the other panel participants have all prepared posts on our &#8220;pet&#8221; architectural style.&#160; This year I drew the REST straw while [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=211&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><em>Author&#8217;s note: This post was prepared in advance of an architecture panel I will be participating in at the GeoWeb conference July 27-31, 2009 in Vancouver.&nbsp; At the request of conference organizers, myself and the other panel participants have all prepared posts on our &#8220;pet&#8221; architectural style.&nbsp; This year I drew the REST straw while Ian Painter of Snowflake Software will vigorously defend SOAP/RPC and Hans Shoebach of Galdos Systems will do battle for P2P/Event Driven architecture.&nbsp; This post will be cross posted over on the </em><a href="http://geowebconference.org/press-media/2009-blog/" target="_blank"><em>GeoWeb 2009 blog as well</em></a><em>.&nbsp; </em></p>
<p>The Geospatial Web, the current darling of location based technologies and neogeography, has been variously described as: </p>
<ul>
<li>web mapping &#8211; the generation and publication of highly performant web applications that include a map</li>
<li>mashups &#8211; combining spatial data with abstract information to produce novel representations</li>
<li>a distributed GIS for the web &#8211; essentially the combination of elements of traditional GIS technologies with advanced web development tools</li>
<li>equivalent or synonymous with relatively new technologies such as Google Earth, Microsoft Bing Maps, Yahoo Maps, etc.</li>
<li>communal or user-generated geospatial content</li>
</ul>
<p>While each of these descriptions is both incomplete and an oversimplification, I assert that at its core the GeoWeb is a technical foundation of information services and collaborative tools built upon or merged with data that provide a spatial context&#8230;a location.&nbsp; It is indeed shiny &#8220;slippy&#8221; maps, Web 2.0 application layouts, nano-formats, mashups, LBS, service-based spatial information sharing, but it is also the hardware, software, information architecture, advanced web application techniques, and people who come together to make such an organic endeavor possible.</p>
<p>The number of organizations working with GeoWeb technologies is already large and growing daily.&nbsp; It seems only logical then, that as a community we engage in an open debate about how exactly all of these databases, services, clients, and functionalities are ultimately going to communicate, integrate, and grow. My endeavor, in the context of this post and in preparation for an architecture panel at the GeoWeb 2009 conference, is to espouse <a href="http://rest.blueoxen.net/cgi-bin/wiki.pl?RestInPlainEnglish" target="_blank">Representational State Transfer (REST)</a> as a standard architectural pattern for the GeoWeb. I&#8217;ll try to keep my points brief here with hope of stimulating discussion that will continue at the <a href="http://geowebconference.org/" target="_blank">GeoWeb conference in Vancouver at the end of July</a>.</p>
<p><span id="more-211"></span>
<p>&nbsp;</p>
<h3>REST is Best #1: Adopt the architecture of the medium</h3>
<p>Continuing my trend of oversimplication, the GeoWeb is simply the web + geo right?&nbsp; While it is indeed more than just web mapping, at it&#8217;s core the GeoWeb commonly leverages the World Wide Web for information access and representation in a client application.&nbsp; The web is the poster child for RESTful architectures as articulated in <a href="http://en.wikipedia.org/wiki/Roy_Fielding" target="_blank">Roy Fielding&#8217;s</a> doctoral dissertation.&nbsp; So the pragmatist in me says that if we&#8217;re going to build a network of loosely coupled systems to support the Geospatial Web and we&#8217;re going to use the web to provide access, why wouldn&#8217;t we leverage the architecture of our good friend &#8220;dubya, dubya, dubya&#8221;?&nbsp; GET, PUT, POST, and DELETE.&nbsp; The semantics are well defined and well understood (okay, POST can be a little wonky due to issues of <a href="http://en.wikipedia.org/wiki/Idempotent" target="_blank">idempotency</a> but I think my point holds). </p>
<p>Every single application exposes its resources through exactly the same interface&#8230;the HTTP specification.&nbsp; Would you, as a developer of a service or a client rather work with 4 HTTP verbs, or would you rather need to discover, proxy, and understand myriad SOAP contracts?&nbsp; Written a WSDL lately? Read one? I thought so&#8230;</p>
<h3>REST is Best #2:&nbsp; It&#8217;s about resources</h3>
<p>REST-based services (or REST resources for my &#8220;high-REST&#8221; friends in the audience) are true &#8220;web services&#8221; in every sense of the term since they&#8217;re based entirely on HTTP and URIs.&nbsp; Map images of downtown Las Vegas, your running route, drill pad locations, the location of the nearest Starbucks, parcel boundaries, a street level image of some guy mooning the Google van; all just pieces of information when it comes right down to it.&nbsp; What we store, exchange, represent, draw on a map, and recombine into novel information combinations are simply resources&#8230;and that&#8217;s what REST is all about.&nbsp; Why make it any more complex than it has to be.&nbsp; Why would I POST&nbsp; to a SOAP method or consume an event from a service agent when all I want to know is http://www.myTranspoSite.com/projects/532. (In English: &#8220;Get me the location, status, and funding information of the stimulus transportation project going on at the end of my street.&#8221;)&nbsp; </p>
<p>&#8220;But what about my complex geoprocessing operation,&#8221; you say?&nbsp; Well, spatial statistics or complex operations that produce a result (buffer, linear referencing operations, etc.) are all fine and dandy for us technologists, but the GeoWeb isn&#8217;t just for GIS professionals anymore.&nbsp; Why expose your client developer, or worse a run of the mill user, to such complexities.&nbsp; A user doesn&#8217;t know what a buffer is and neither does the Dojo ninja that&#8217;s consuming your resourcein his JavaScript client&#8230;they just want to know how many crimes where committed in their neighborhood in the last 6 months.&nbsp; Hide complexity within the REST resource and give a simple answer to a complex question.</p>
<p>In an ROA effectively adhering to a RESTful architecture, all I need to know to get the information I want is a URI and an action.&nbsp; Do I have to negotiate a proxy?&nbsp; Am I getting cached information? Is there a gateway or firewall in the way?&nbsp; How do I negotiate that P2P thingy again? Do I need to do a buffer followed by an intersect followed by a 12th level of hell whatchamacallit? Who cares?&nbsp; Just give me the information I want so I can go play golf, spend time with my kids, wax the car, take a nap, or do any number of other things I&#8217;d rather be doing.</p>
<h3>REST is Best #3: Serving many masters </h3>
<p>The beauty of REST is that you get the standard interface provided by HTTP, with no limitation on data representation.&nbsp; Why is this important for the Geospatial Web?&nbsp; Because browsers like HTML and JSON. Because machines like XML, binary, or code on demand.&nbsp; Humans like pretty pictures and PDFs. And sometime down the line machines and browsers and humans may all change their minds and like some other format.&nbsp; That&#8217;s right folks, the GeoWeb ain&#8217;t just for browsers anymore and that means we as architects and developers need to keep multiple resource representations foremost in our minds.&nbsp; REST is absolutely critical as an architectural pattern for the GeoWeb because it provides a low friction way for us to provide information formats that better match consuming clients and performance requirements.&nbsp; And as new content types come to light and get defined, REST lets you add support for these novel formats without impacting support for existing/older content types.&nbsp; </p>
<h3>REST is Best #4: Now where did I put that..?</h3>
<p>So if the GeoWeb is about publishing, consuming, transforming, sharing, visualizing data with a spatial component, it stands to reason that we need a mechanism by which to discover said information.&nbsp; And we&#8217;d probably also like a way to get back to the information once we&#8217;ve been there once.&nbsp; Or send it to our boss, or forward it to grandma, or shoot it out the list-serv that we&#8217;re on. </p>
<p>In short, REST makes the information driving the GeoWeb portable. Once I find a resource I like I can bookmark it to return later, I can throw it in an email and share it with others, I can embed it in my application to be consumed and acted upon in novel ways.&nbsp; It also means that we don&#8217;t need a separate discovery mechanism for our resources because resources can be embedded as content in other resources.&nbsp;&nbsp; A country resource can provide information on state resources which can provide information on county resources, etc.&nbsp; Imagine that; an entire network of information and functional resources interconnected by URIs&#8230;huh.</p>
<h3>REST is Best #5: Performance and Scalability</h3>
<p>For most RESTful services (I know, I know&#8230;resources) the majority of requests to the resource are probably GET requests.&nbsp; Do I have numbers to back that up?&nbsp; Of course not&#8230;I&#8217;m an architect.&nbsp; But the logic of the assertion is that presumably many more people are allowed to read/view information than are allowed to create, update, or delete information.&nbsp; Even in scenarios with lots of resource editors, the GET is still likely to far exceed PUT, POST, and DELETE request counts.&nbsp; One of the central tenets of the REST architectural style is that whenever possible, information should be cached.&nbsp; REST gets it&#8217;s performance and scalability from this cache-ability, coupled with statelessness. </p>
<p>What this means for the GeoWeb is that we can cache GET requests against a resource.&nbsp; Thus if I visit a resource URL and ask for information on a highway project, and 2 seconds later my neighbor asks for information on the same project&#8230;my GET results will be cached so that my neighbor&#8217;s request does not incur the penalty of a database hit, business logic enforcement, object formatting, etc.&nbsp; Does it matter for a system with 100 users on appropriately sized servers? Probably not.&nbsp; Does it matter for a large interconnected network of resources with hundreds of thousands or millions of users?&nbsp; You betcha&#8217;.</p>
<p>Statelessness means that a server hosting data or functionalities for the GeoWeb should service requests in a manner that does not depend on context or state between requests or between services.&nbsp; If you say to a REST resource, &#8220;Give me a map of all preschools within 5 miles of my home&#8221;.&nbsp; You cannot simply make a follow up requests that says &#8220;Now buffer them&#8221;.&nbsp; The statelessness of the resource on the server means it no longer remembers anything about the 20 preschool points it just handed you as JSON&#8230;in fact, the server doesn&#8217;t even know who you are anymore and wants your credentials again.&nbsp; Why is this good?&nbsp; Because RESTful architectures don&#8217;t typically have to contend with maintenance of session state, a server can be swapped out with another in the event of a failure, a sys admin can decide to add three new servers to a farm on Wednesday without existing clients knowing any different, or a group of servers can be allocated to service different types of requests.</p>
<p>Caching and statelessness = performance and scalability all in one neat little package.&nbsp; Sort of a big deal for people building LOB or otherwise critical applications for the GeoWeb dontchathink?</p>
<h3>Parting Shots</h3>
<p>Did I miss something in my initial hypothesis that REST is the critical architectural style for the GeoWeb?&nbsp; Probably.&nbsp; Did I get something wrong or use semantics likely to raise the hackles of true, dyed-in-the-wool RESTafarians?&nbsp; Probably&#8230;I tend to be more pragmatism than dogma anyway.&nbsp; Consider joining us for GeoWeb 2009 July 27-31 and see if I can avoid making a complete fool out myself whilst fighting the good fight to make RESTful architectures an integrated part of the evolving GeoWeb. Find a glaring hole in my argument or something I missed?&nbsp; Leave a comment here so I can study up before doing battle with the SOA/SOAP and P2P/Event Driven folks in July.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/211/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=211&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/06/15/standard-architecture-for-the-geoweb-give-it-a-rest/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>
	</item>
		<item>
		<title>Teaching an old dog new tricks: Dojo</title>
		<link>http://briannoyle.wordpress.com/2009/05/20/teaching-an-old-dog-new-tricks-dojo/</link>
		<comments>http://briannoyle.wordpress.com/2009/05/20/teaching-an-old-dog-new-tricks-dojo/#comments</comments>
		<pubDate>Wed, 20 May 2009 22:58:43 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[General GIS]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[DOJO]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[learning]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/05/20/teaching-an-old-dog-new-tricks-dojo/</guid>
		<description><![CDATA[Over the last two weeks, I&#8217;ve been waist deep in what has been, for me, a completely new client side development platform.&#160; We have several projects underway at present that leverage Dojo as the framework for rich client GeoWeb applications and, simply put, we&#8217;ve got more Dojo work than our two resident experts can handle [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=210&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Over the last two weeks, I&#8217;ve been waist deep in what has been, for me, a completely new client side development platform.&nbsp; We have several projects underway at present that leverage Dojo as the framework for rich client GeoWeb applications and, simply put, we&#8217;ve got more Dojo work than our two resident experts can handle at present.&nbsp; Time to roll up my sleeves and learn something new!</p>
<p><img height="338" alt="iStock_000001541503XSmall" src="http://briannoyle.files.wordpress.com/2009/05/istock_000001541503xsmall.jpg?w=450&#038;h=338" width="450"> </p>
<p>Since I&#8217;m a botanist by training, and not a classically trained programmer by any stretch, I don&#8217;t typically look at a new technology and say &#8220;Gee Whiz, this looks an awful lot like &lt;pick your poison&gt; that I learned back in University&#8221;.&nbsp; I&#8217;ve got sort of a free form learning process that works for me, and usually get&#8217;s me up and running and useful in a relatively short period of time&#8230;a matter of days if I have examples and a pattern rather than weeks.&nbsp; And after doing this for 10 years or so, it seems that you still can teach an old dog new tricks.</p>
<p><span id="more-210"></span>
</p>
<h3>The cone of silence</h3>
<p>The learning process, especially at age 35, does not benefit from distractions.&nbsp; I still can&#8217;t believe I could sit on my couch and watch a movie while studying in college or camp out in a noisy coffee shop and write portions of my thesis in graduate school.&nbsp; Now, it&#8217;s less about the TV or background noise and more about email barrages, social networks, and the new, new thing on YouTube.&nbsp; Perhaps the single worst feature of my Twitter client (TweetDeck) is that it is constantly squawking when new updates roll in.&nbsp; When I need to learn something new from the ground up, the cone of silence get&#8217;s invoked.&nbsp; </p>
<p><img height="338" alt="Amy16" src="http://briannoyle.files.wordpress.com/2009/05/amy16.jpg?w=450&#038;h=338" width="450"> </p>
<p>This doesn&#8217;t mean I don&#8217;t talk to my coworkers or answer my wife&#8217;s calls&#8230;quite the contrary, I&#8217;m usually asking coworkers plenty of questions and since my son has a health condition I always take calls from the wife.&nbsp; What it does mean is that I shut down my Twitter client, fire off a courtesy email to the rest of the company (and stop answering email), and buckle down for a day, or two days, or three if that&#8217;s what it takes.&nbsp; If a coworker is physically on fire and I have the only fire extinguisher, I respond.&nbsp; If not, then it&#8217;s going to be a day or two before I can get to that proposal you want me to work on.&nbsp; There are no <em>ad hoc</em> requests allowed from outside the office I physically sit in.&nbsp; Removing all extraneous distraction keeps me focused on the task at hand and allows me the deep dive that I require to wrap my head around something new.&nbsp; This cone of silence is also an excellent tool when up against a deadline on any project.</p>
<h3>Find room to spread out</h3>
<p>I can&#8217;t learn a new technology at home after work.&nbsp; I can read a book about it and make some notes and commit some of it to memory, but I can&#8217;t kick back, spread out, and mentally digest things.&nbsp; Wife, two dogs, cat, four year old&#8230;you get the picture.&nbsp; There&#8217;s a lot going on at home and working there usually means a single monitor machine or the netbook, and not a lot of room to make a mess.&nbsp; Learning something new is when our developer rigs at DTSAgile really shine:&nbsp; Comfy chair for exercising the typical bad posture of a developer;&nbsp; Big desks with plenty of room for scribbling things down in a notebook or two; Three monitors to spread out your IDE, Google, help system or API documentation, sample databases, etc., etc.; Additional desk space reserved from the latest offerings from O&#8217;Reilly or Wrox; Real estate for half drunk coffee from yesterday as well as today&#8217;s lukewarm addition to the collection.</p>
<p><img height="298" alt="gadgets" src="http://briannoyle.files.wordpress.com/2009/05/gadgets.png?w=450&#038;h=298" width="450"> </p>
<p>I need room to roll up my sleeves and work.&nbsp; Having multiple information sources in front of my face at the same time speeds the learning process for me and is simply more time efficient.&nbsp; I&#8217;ve gotten to the point now where it&#8217;s actually an annoyance to have to hunt and peck on the Windows taskbar&nbsp; to find that great Google search result or pull up one of 5 sample VS.NET solutions I&#8217;ve got going.&nbsp; Call it ADD, call it information overload, it works for me&#8230;but it only works if I&#8217;ve got room to spread out, both in the digital world, and the physical one. If I&#8217;m truly going to leverage the wealth of information that&#8217;s available, I certainly need a big palette to work from, and an even bigger canvas to spread it on.</p>
<h3>Know where you&#8217;re going</h3>
<p>It helps immensely to have an example of how things ought to look when I&#8217;m done writing code.&nbsp; This doesn&#8217;t necessarily mean the user experience manifested in the UI or in the behavior of the service boundary, but rather the appearance and organization of the code. Knowing enough to write a dojo.subscribe() is one thing, but where is the best location to put that code given the context in which it will run? In a *.js file for a widget? In the page itself? In some generic widget controller?&nbsp; Dojo can be used to simply add a few shiny bits to a web client, but it is frequently used as a fully object oriented client application framework, making good patterns and practices very important.&nbsp; </p>
<p><img height="294" alt="iStock_000002769942Small" src="http://briannoyle.files.wordpress.com/2009/05/istock_000002769942small.jpg?w=450&#038;h=294" width="450"> </p>
<p>Having reference implementation code, either from a previous project my team has done, or from another source is usually critical.&nbsp; If the technology I&#8217;m learning is fresh in the market, then I&#8217;m happy to give things a little more thought and blaze new trails, but if someone has gone down the path before me, then I definitely want a fully wired example to work from.&nbsp; Fortunately in this case, my coworkers had been doing Dojo development for awhile so I had a couple of good solutions to work from.&nbsp; Cheating? Lazy? Maybe, but why in the world would I not try to benefit from the previous experiences of others.&nbsp; It&#8217;s just good sense to know where you&#8217;re going&#8230;that way at least you&#8217;ll know when you&#8217;ve arrived. </p>
<h3>Breaking stuff</h3>
<p>I&#8217;m a tinkerer, and have been since childhood.&nbsp; What good is a perfectly working model, RC car, or a piece of software if you haven&#8217;t taken it apart, broken it, and put it back together again?&nbsp; One of my best resources during the learning process on a new technology is my tendency to tinker, pull things apart, and see what makes them work.&nbsp; Sure you could read about about the difference between dojo.hitch() and dojo.connect(), but it is infinitely more revealing to test drive both methods to see what works and what doesn&#8217;t.</p>
<p><img height="398" alt="complex-machine" src="http://briannoyle.files.wordpress.com/2009/05/complex-machine.jpg?w=450&#038;h=398" width="450"> </p>
<p>My shop is in the consulting business, which means we need to be experts in lots of different technologies and we need to achieve that level of expertise quickly as technology evolves. The long and short of it, is that I learn best when I&#8217;ve gotten to the point of a working piece of software&#8230;and then go one step further.&nbsp; I have found over the years that the difference between kinda&#8217; getting something, and really grok-ing what&#8217;s going on, lies in my tendency to want to break stuff and then put it back together so that I know what all of the component pieces and parts are doing.&nbsp; In the long run, this generally increases my code quality and readability because not only have I taken the time to learn what to do with a given technology, but I&#8217;ve also learned what not to do.</p>
<h3>References and tutorials </h3>
<p>I don&#8217;t think it&#8217;s too much of a stretch to say that for most developers these days, Google is the most valuable reference book on their desktop.&nbsp; However, those of you who have already jumped into the deep end of the Dojo swimming pool probably realize that:</p>
<ol>
<li>The API is not particularly well documented with comprehensive explanations and examples when compared to other APIs (JQuery, Prototype, etc.)
<li>There are two chief resources online for Dojo:&nbsp; <a href="http://www.dojocampus.org">The Dojo Campus (www.dojocampus.org)</a> and the <a href="http://www.dojotoolkit.org">Dojo Toolkit Site (www.dojotoolkit.org)</a>, neither of which sits on a particularly speedy server or offers a comprehensive how-to library.</li>
</ol>
<p>All Dojo peculiarities aside, even if I was learning ASP.NET MVC, Entity Framework, PERL, Python, Ruby or any number of other well documented technologies or APIs, I certainly wouldn&#8217;t rely entirely on what online resources could teach me.&nbsp; </p>
<p><img height="324" alt="terminology" src="http://briannoyle.files.wordpress.com/2009/05/terminology.jpg?w=450&#038;h=324" width="450"> </p>
<p>Perhaps it&#8217;s because I was raised at a time when you still went to the local bookstore to find a good read, or perhaps it is because of the countless hours I spent working in my grandmother&#8217;s small town bookstore, I still like to have reference books around.&nbsp; Having two or three books on the technologies I&#8217;m actively working in means I can take a book to lunch and read up on a particularly hairy topic, I can look long and hard and dissect an example without blinding myself staring at the LCD, or I can take a volume home and read before nodding off at night.&nbsp; Absorbing information from multiple sources can only help the cause of learning new technology, and for me the thumbing of pages will always hold something that a scrolling a mouse wheel never will. </p>
<h3>Conclusions</h3>
<p>So there it is&#8230;you can in fact teach an old dog new tricks.&nbsp; While my learning process is probably not as organized and logical as that of others, it does work for me, and has allowed me to keep pace with what is turning out to be a rapidly changing technological landscape.&nbsp; What&#8217;s next?&nbsp; Well, the cone of silence is off so there&#8217;s probably a couple of proposals in my near future, but the Dojo work is nearing completion, it works well, and I can see Silverlight 3, Entity Framework, ADO.NET Data Services, and probably some Flex in my near future.&nbsp; I think I need a cup of coffee and a fourth monitor. </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/210/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=210&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/05/20/teaching-an-old-dog-new-tricks-dojo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/istock_000001541503xsmall.jpg" medium="image">
			<media:title type="html">iStock_000001541503XSmall</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/amy16.jpg" medium="image">
			<media:title type="html">Amy16</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/gadgets.png" medium="image">
			<media:title type="html">gadgets</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/istock_000002769942small.jpg" medium="image">
			<media:title type="html">iStock_000002769942Small</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/complex-machine.jpg" medium="image">
			<media:title type="html">complex-machine</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/terminology.jpg" medium="image">
			<media:title type="html">terminology</media:title>
		</media:content>
	</item>
		<item>
		<title>Getting yer&#8217; Agile on at a discount: Upcoming course</title>
		<link>http://briannoyle.wordpress.com/2009/05/12/getting-yer-agile-on-at-a-discount-upcoming-course/</link>
		<comments>http://briannoyle.wordpress.com/2009/05/12/getting-yer-agile-on-at-a-discount-upcoming-course/#comments</comments>
		<pubDate>Tue, 12 May 2009 14:26:08 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/05/12/getting-yer-agile-on-at-a-discount-upcoming-course/</guid>
		<description><![CDATA[Come on out and join us to drink the agile kool-aid, take your agile medicine, learn what agile can do for your team or organization, or have a skills refresher for experienced agile practitioners.
 
Dave Bouwman and myself will be collaborating to give a one day Agile Project Management training seminar on Friday, June 26, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=203&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Come on out and join us to drink the agile kool-aid, take your agile medicine, learn what agile can do for your team or organization, or have a skills refresher for experienced agile practitioners.</p>
<p><a href="http://briannoyle.files.wordpress.com/2009/05/agile-pills.png"><img height="302" alt="agile-pills" src="http://briannoyle.files.wordpress.com/2009/05/agile-pills_thumb.png?w=450&#038;h=302" width="450"></a> </p>
<p><a href="http://blog.davebouwman.net" target="_blank">Dave Bouwman</a> and myself will be collaborating to give a one day Agile Project Management training seminar on Friday, June 26, 2009 near Denver, CO.&nbsp; This course will cover both project management practices and development/engineering practices.&nbsp; We&#8217;ll begin with an introduction to agile practices and rapidly progress to specific methodology examples (Scrum), cover roles and responsibilities, project controls, and how to scale the agile process in your organization.&nbsp; In addition, we&#8217;ll introduce specific software development processes that mesh well with the agile process including automation for code documentation and unit testing, design patterns, refactoring tools, and automated builds and continuous integration.&nbsp; Throughout the course we&#8217;ll give you specific examples, the good, the bad, and the ugly, from our own experiences using the methodology in our shop.</p>
<p><span id="more-203"></span>
<p>&nbsp;</p>
<p>Traditionally, this is a course for which DTSAgile typically charges $1200 per student.&nbsp; However, through the fine folks at Rocky Mountain URISA, you can join us for this course at a very steep discount.&nbsp; Cost for URISA members is $135 and the cost for non-members is still only $150.&nbsp; What does that mean to you?&nbsp; Well, if you live in the continental US (and some places in Canada) you can attend one of our Agile training seminars including plane fare and hotel for less than we typically charge for the course.&nbsp; And that, ladies and gentlemen, is what we call a very good deal.&nbsp; If you&#8217;re in Colorado, particularly the Greater Denver region, it&#8217;s a no brainer. But it&#8217;s still a steal even if you need to travel in from points afar.</p>
<h3>Course Details:</h3>
<p><strong>Course Material:</strong> Introduction to Agile: Project Management and Development</p>
<p><strong>Date:</strong> Friday, June 26, 2009</p>
<p><strong>Location:</strong> USGS Mtg Room, Fed Center, Lakewood CO</p>
<p><strong>More Information:</strong> <a href="http://www.rm-urisa.org/news.html">www.rm-urisa.org/news.html</a></p>
<p>Please use the &#8220;more information&#8221; link above to read the full course abstract and get additional details including how to register, maps of how to get there, etc.&nbsp; Please consider joining us in June!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/203/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=203&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/05/12/getting-yer-agile-on-at-a-discount-upcoming-course/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/agile-pills_thumb.png" medium="image">
			<media:title type="html">agile-pills</media:title>
		</media:content>
	</item>
		<item>
		<title>Fun with Dojo filtering selects</title>
		<link>http://briannoyle.wordpress.com/2009/05/11/fun-with-dojo-filtering-selects/</link>
		<comments>http://briannoyle.wordpress.com/2009/05/11/fun-with-dojo-filtering-selects/#comments</comments>
		<pubDate>Mon, 11 May 2009 17:34:07 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/05/11/fun-with-dojo-filtering-selects/</guid>
		<description><![CDATA[While the Dojo JavaScript libraries are really an excellent resource for building rich internet applications (RIAs), sometimes Dojo just makes things harder than they have to be.&#160; Last week I was working on public map viewer, based on our custom implementation of ESRI&#8217;s JavaScript API starter kit,&#160; for one of our clients.&#160; The site is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=199&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>While the Dojo JavaScript libraries are really an excellent resource for building rich internet applications (RIAs), sometimes Dojo just makes things harder than they have to be.&nbsp; Last week I was working on public map viewer, based on our custom implementation of ESRI&#8217;s JavaScript API starter kit,&nbsp; for one of our clients.&nbsp; The site is really pretty basic in terms of functionality with one of the tools allowing the user to configure and execute a multi-criteria search for information and have that information displayed on a map.&nbsp; The user interface looks something like the following screen cap:</p>
<p><img height="394" alt="dojoSearch" src="http://briannoyle.files.wordpress.com/2009/05/dojosearch.png?w=464&#038;h=394" width="464"> </p>
<p>In this user interface example, the combo boxes for counties and cities are Dojo FilteringSelect controls.&nbsp; The FilteringSelect extends the typical html drop down so that you get an intellisense/autocomplete of sorts when the user starts typing in the combo box.&nbsp; In addition, in the event that the user types a value rather than using the drop down list, the FilteringSelect will validate manual text entries to ensure they are in the select list.&nbsp; All of this prevalidation is important because it allows us to reduce the potential for errors in searches by constraining the user&#8217;s input to a list of valid values pulled from database lookup tables.&nbsp; It&#8217;s a pretty neat little control&#8230;until you have to clear it.</p>
<p><span id="more-199"></span><br />
<h3>The issue:</h3>
<p>There are basically two possible scenarios where we need to clear information from a Dojo FilteringSelect on our search form in this example.&nbsp; The first is obviously when the user clicks the <strong>Clear</strong> button to clear the search form and start over.&nbsp; The second case is when we need to reload and reset the data driving the city FilteringSelect box if the user makes or changes a county selection in the county FilteringSelect box.&nbsp; </p>
<p>The user click of the <strong>Clear</strong> button to clear all search form values is sufficient to illustrate the issue so I&#8217;ll expand on that a bit.&nbsp; The wiring for events like the typical &#8220;onClick&#8221; for a button in Dojo is extremely simple:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; this.connects.push(dojo.connect(this.widgets.clearLocateButton, &#8220;onClick&#8221;, </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; this, &#8220;onClearLocateButtonClick&#8221;));</p>
<p>Breifly, the line of code shown above uses <strong>dojo.connect()</strong> to assign a function called <strong>onClearLocateButtonClick</strong> to be the event handler for the click event of a button on our widget with an ID of <strong>clearLocateButton</strong>.&nbsp; The onClearLocateButtonClick function is equally straightforward, simply clearing any user entered values from the input boxes on the widget.</p>
<p>&nbsp;&nbsp;&nbsp; //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />&nbsp;&nbsp;&nbsp; // Handle event raised when user clicks the Clear<br />&nbsp;&nbsp;&nbsp; // button on the Address UI. Resets user input <br />&nbsp;&nbsp;&nbsp; // controls.<br />&nbsp;&nbsp;&nbsp; //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />&nbsp;&nbsp;&nbsp; onClearLocateButtonClick: function(evt) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // reset user inputs<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.countyComboBox.reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.propertyTextBox.reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.addressTextBox.reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.cityComboBox.reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.loadCityLookup();
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (err) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.error(&#8220;Error clearing address information&#8221;, err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }
<p>Each input control in the widget receives a reset call which is supposed to clear any entered value for the control.&nbsp; The problem?&nbsp; Let&#8217;s say a user has selected <strong>County = Larimer</strong> and <strong>City= Fort Collins</strong> in the above UI.&nbsp; Clicking the clear button resets all widget controls to empty as expected however the county and city FilteringSelect controls will end up having validation errors displayed.&nbsp;
<p><img height="350" alt="dojoSearchError" src="http://briannoyle.files.wordpress.com/2009/05/dojosearcherror.png?w=464&#038;h=350" width="464">
<p>But there is no validation error because the user consciously asked for all the information to be cleared.&nbsp; None of the fields is required so the validation error shouldn&#8217;t be there.&nbsp;<br />
<h3>The solution:</h3>
<p>After a variety of configuration changes, at least three Google searches and some hair pulling, I did arrive at the following solution to get rid of the validation errors when FilteringSelects are cleared using the reset method.&nbsp; The solution is basically to change the way we reset the values in a filtering select box within our onClearLocateButtonClick event handler.</p>
<p>&nbsp;&nbsp;&nbsp; //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />&nbsp;&nbsp;&nbsp; // Handle event raised when user clicks the Clear<br />&nbsp;&nbsp;&nbsp; // button on the Address UI. Resets user input <br />&nbsp;&nbsp;&nbsp; // controls.<br />&nbsp;&nbsp;&nbsp; //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />&nbsp;&nbsp;&nbsp; onClearLocateButtonClick: function(evt) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // reset user inputs<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.propertyTextBox.reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.addressTextBox.reset(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //need to manually reset the city and county boxes for some reason<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.countyComboBox._hasBeenBlurred=false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.countyComboBox.attr(&#8216;displayedValue&#8217;, &#8221;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.cityComboBox._hasBeenBlurred = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.widgets.cityComboBox.setDisplayedValue(&#8221;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.loadCityLookup(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (err) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.error(&#8220;Error clearing address information&#8221;, err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>I actually dug in to the API documentation and found that the setting the <strong>_hasBeenBlurred</strong> property to false and then manually setting the value of the control solves the issue.&nbsp; Presto!&nbsp; The offending validation error is gone from our widget when the user clears the search parameters.&nbsp; Note the example code uses both the <strong>.attr()</strong> method and the <strong>.setDisplayedValue</strong> method simply as an example of two ways to accomplish the task.&nbsp; I would note however that <strong>setDisplayedValue</strong> has been deprecated and will be removed from the Dojo API at version 2.</p>
<p>Now, I&#8217;m relatively new to the world of Dojo so this may or may not be the preferred method of tackling this issue. The use of _hasBeenBlurred is a bit of a code smell from my perspective because the &#8216;_&#8217; indicates a method that is supposed to be private.&nbsp; However, sometimes we wind up trapped between doing things the absolutely right way and absolutely getting something done.&nbsp; In this case I chose the latter.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/199/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/199/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/199/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=199&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/05/11/fun-with-dojo-filtering-selects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/dojosearch.png" medium="image">
			<media:title type="html">dojoSearch</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/dojosearcherror.png" medium="image">
			<media:title type="html">dojoSearchError</media:title>
		</media:content>
	</item>
		<item>
		<title>Calling all Silverlight and dojo gurus: Hiring again</title>
		<link>http://briannoyle.wordpress.com/2009/05/11/calling-all-silverlight-and-dojo-gurus-hiring-again/</link>
		<comments>http://briannoyle.wordpress.com/2009/05/11/calling-all-silverlight-and-dojo-gurus-hiring-again/#comments</comments>
		<pubDate>Mon, 11 May 2009 17:23:58 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[General GIS]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[DTSAgile]]></category>
		<category><![CDATA[Employment]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/05/11/calling-all-silverlight-and-dojo-gurus-hiring-again/</guid>
		<description><![CDATA[That&#8217;s right, DTSAgile is again looking to expand our team building next generation RIAs and GeoWeb applications in our Fort Collins, CO office.

As we have a backlog of projects that use diverse technologies, we&#8217;re looking for an excellent developer with one of the following skill sets.
SL, EF, ADO.NET Data Services
If you have bona fide project [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=195&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>That&#8217;s right, DTSAgile is again looking to expand our team building next generation RIAs and GeoWeb applications in our Fort Collins, CO office.</p>
<p style="text-align:center;"><a href="http://briannoyle.files.wordpress.com/2009/05/desk_ea3994db-ea01-4f54-ab0c-40eda9bfef80.jpg"><img class="aligncenter" style="border-width:0;" src="http://briannoyle.files.wordpress.com/2009/05/desk_ea3994db-ea01-4f54-ab0c-40eda9bfef80_thumb.jpg?w=286&#038;h=217" border="0" alt="desk_ea3994db-ea01-4f54-ab0c-40eda9bfef80" width="286" height="217" /></a></p>
<p>As we have a backlog of projects that use diverse technologies, we&#8217;re looking for an excellent developer with one of the following skill sets.</p>
<h3>SL, EF, ADO.NET Data Services</h3>
<p>If you have bona fide project level experience with Silverlight 2, Entity Framework, and ADO.NET Data Services or NHibernate, DTSAgile wants to talk to you.  We are not looking for an entry level developer or someone who can learn on the job, we are seeking developers who have real world experience implementing this technology stack.  We&#8217;re looking for someone who can make an immediate impact, show us how this stack should be implemented, and tell us how to avoid the pitfalls.</p>
<h3>JavaScript, Dojo, CSS, etc.</h3>
<p>Alternatively, if you have mastered the zen of dojo, JavaScript, CSS and all things client-side we&#8217;d also like to receive your resume and review your credentials.  Actual project experience implementing mapping technologies using ESRI&#8217;s JavaScript API including the starter kit will be reviewed favorably. Again, we&#8217;re not looking for entry level folks here&#8230;you&#8217;ll be asked to come in and put fingers to the keyboard relatively quickly out of the gate and show us what you&#8217;ve got.</p>
<h3>Other fun stuff you should grok</h3>
<ul>
<li>Agility. No, you don&#8217;t have to do backflips or crazy stretches in an interview setting. As our name implies, we&#8217;re a group of consultants pretty committed to Agile processes on our projects.  At minimum you should have some background knowledge regarding Agile and an interest in working on an Agile team</li>
<li>Favorite patterns. ASP.NET MVC is high on our list of happy shiny things that we like to work with.  Many of our projects are and will continue to be architected with ASP.NET MVC in the mix.  Real world project experience with it will be be reviewed favorably.</li>
<li>Unit testing.  We&#8217;re big on tests&#8230;lot&#8217;s of &#8216;em.  Some of our projects are run in TDD fashion while others have a test-late lifecycle.  Regardless, we unit test everything that goes out the door thoroughly.  NUnit, MBUnit, TestDriven.net, mocking frameworks such as Rhino mocks, and IoC/DI principles should all be on your resume.</li>
<li>The Geo.  We primarily target mapping related projects so exposure to GIS, the GeoWeb, etc. in the form of the ESRI product stack, VE, Google Maps, Open Layers, Geoserver, Mapserver, PostGIS, etc. will be viewed favorably but is not required.</li>
<li>Information exchange and social networking.  We&#8217;re software architects and developers, and we&#8217;re also bloggers, presenters, and participants in growing social networks.  Run a blog? Participate in Twitter? Grasp the finer points of presentation zen and really good Powerpoint? Great, you&#8217;ll fit in just fine.</li>
</ul>
<p>Still interested?  Drop a line to myself or <a href="http://blog.davebouwman.net" target="_blank">Dave</a> and we&#8217;ll have a gander at your qualifications and see if you might be a fit for our current needs.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/195/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/195/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/195/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/195/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/195/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=195&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/05/11/calling-all-silverlight-and-dojo-gurus-hiring-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/05/desk_ea3994db-ea01-4f54-ab0c-40eda9bfef80_thumb.jpg" medium="image">
			<media:title type="html">desk_ea3994db-ea01-4f54-ab0c-40eda9bfef80</media:title>
		</media:content>
	</item>
		<item>
		<title>The Agile Process: What my 3 year old taught me</title>
		<link>http://briannoyle.wordpress.com/2009/04/16/the-agile-process-what-my-3-year-old-taught-me/</link>
		<comments>http://briannoyle.wordpress.com/2009/04/16/the-agile-process-what-my-3-year-old-taught-me/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 17:11:53 +0000</pubDate>
		<dc:creator>homebrutrout</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://briannoyle.wordpress.com/2009/04/16/the-agile-process-what-my-3-year-old-taught-me/</guid>
		<description><![CDATA[I love spending time with my son.  He frequently reminds me that sometimes, life perceived through the eyes of a child is a pretty acceptable way to go.  I was a bit naive going into father hood and thought that I&#8217;d be the one doing all of the teaching. Yet every day I spend with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=190&subd=briannoyle&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I love spending time with my son.  He frequently reminds me that sometimes, life perceived through the eyes of a child is a pretty acceptable way to go.  I was a bit naive going into father hood and thought that I&#8217;d be the one doing all of the teaching. Yet every day I spend with my son teaches me something new about how to look at work or personal life in a different way.</p>
<p style="text-align:center;"><a href="http://briannoyle.files.wordpress.com/2009/04/istock-000005012679small.jpg"><img class="aligncenter" src="http://briannoyle.files.wordpress.com/2009/04/istock-000005012679small-thumb.jpg?w=240&#038;h=160" alt="iStock_000005012679Small" width="240" height="160" /></a></p>
<p><a href="http://blog.davebouwman.net" target="_blank">Dave</a> and I are in the process of collaborating to produce a new version of our Agile Training Course and I&#8217;ve had the chance to sit and reflect a bit on the Agile Process.  When you&#8217;re deep into project execution, it&#8217;s easy to loose site of the forest for the trees and it&#8217;s good to take a step back now again (distinct and separate from your post-mortems) and look at the big picture.  Of late, I&#8217;ve been mentally musing about how to look at the process through the eyes of a child, and what that view can teach us as Agile practitioners and trainers.</p>
<p><span id="more-190"></span></p>
<h3>Story time is where it&#8217;s at</h3>
<p>My son loves story time&#8230;alot.  He likes it so much that he usually forgets that the next logical step after story time is bedtime (which he doesn&#8217;t like so much).  Grabbing a few books or the latest Highlights High Five issue and curling up on the couch with mom and dad makes his day.  And for us it&#8217;s fun to watch him learn in the process; letters, numbers, words, and getting the moral of the story.  He asks questions, he recognizes inconsistencies when we try to shortcut or gloss over story elements, etc.</p>
<p style="text-align:center;"><img class="aligncenter" src="http://briannoyle.files.wordpress.com/2009/04/istock-000004104183small.jpg?w=240&#038;h=198" alt="iStock_000004104183Small" width="240" height="198" /></p>
<p>For Agile practitioners, story time is definitely where it&#8217;s at.  User stories and their prioritization/refinement over time are your backlog, your requirements, your road map for what you&#8217;re going to build.  YOU SHOULD LOVE STORY TIME.  The initial generation of backlog, while important, takes a back seat IMHO to the sprint planning session.  This critical planning period at the beginning of each iteration is your &#8220;story time&#8221;. It is your shot at learning all the letters, numbers, and semantics of what is important to your project owner, and by extension your users.  And it&#8217;s important because the outcomes of story time are going to govern your work days for the next iteration.  So, grab your backlog, ask questions, point out inconsistencies, and really focus on learning all the details that will make your team successful over the next iteration.  And don&#8217;t worry, bedtime is a full two weeks away.</p>
<h3>The best made plans&#8230;</h3>
<p>Most, if not all, parents already know this, but it bears repeating for expecting or adoptive parents: Get used to being late or having plans foiled at the last minute.  Illness, tantrums, an innate desire to not wear pants today&#8230;I&#8217;ve seen it all.  I&#8217;ve even left a half-full cart of groceries in the Whole Foods aisle (sorry stock persons!) and walked out to try again later.</p>
<blockquote><p>You&#8217;re screaming right now and I understand you&#8217;re upset.  But you can scream in the car on the way home, not in the grocery store.</p></blockquote>
<p>We can&#8217;t always control what our children do, but we can certainly control where they do it and clearly illustrate the consequences of their actions.</p>
<p style="text-align:center;"><a href="http://briannoyle.files.wordpress.com/2009/04/istock-000005955051small.jpg"><img class="aligncenter" src="http://briannoyle.files.wordpress.com/2009/04/istock-000005955051small-thumb.jpg?w=240&#038;h=160" alt="Laying on the floor" width="240" height="160" /></a></p>
<p>The Agile process embraces change during the development cycle of a project.  This is a standard Agile 101 statement.  It embraces change by allowing change to happen (adding/removing stories from backlog, changing priorities, etc.) at predefined points in the cycle.  Still, some Agile teams get a little bit antsy when a client or project owner starts talking about wholesale changes to their process.  This nervous response can happen for a couple of reasons. Is the Scrum Master doing his/her job? Why is the team hearing from the project owner mid-sprint? Another option is simply the ingrained aversion for changing horses mid-stream.  I see this on teams who have switched from a sequential delivery model in their recent past.  Message: change happens. Get used to it. You can&#8217;t control what your clients want&#8230;but Agile gives you a toolbox to control when change happens, and provides metrics for you to illustrate for your clients the consequences of their decisions.  Use these tools and enforce the process!</p>
<h3>Open your ears and listen</h3>
<p>Betcha&#8217; thought this was the section where I talk about getting my son to listen?  On the contrary&#8230;My son and I were spending some time together the other day and under his watchful eye I was helping him build an enormous house of blocks.  I take direction pretty well, but I was apparently frustrating the heck out him by building the ramparts on the roof into a really neat and symmetrical pattern that I thought anyone might like.  Finally, I got the hook&#8230;via blood curdling scream to stop what I was doing.  I was present with him and engaging in some good old fashioned child&#8217;s play, but I wasn&#8217;t listening to what he wanted.  Once I mashed the blocks up on the roof into the pattern he wanted, all was well in the universe.</p>
<p style="text-align:center;"><a href="http://briannoyle.files.wordpress.com/2009/04/istock-000005243833small.jpg"><img class="aligncenter" style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://briannoyle.files.wordpress.com/2009/04/istock-000005243833small-thumb.jpg?w=188&#038;h=244" border="0" alt="iStock_000005243833Small" width="188" height="244" /></a></p>
<p>How often do we, as architects or developers, build a really neat function or feature that we like, but turns out to be the antithesis of what the client wanted? Far too often.  We love tools and widgets and gadgets and technical challenges but the client doesn&#8217;t care.  I worked on a project at a previous company where I spent two hours elaborating a user story into a several child user stories with tons of tasks that was going to turn into a really cool technical solution that was going to take me a week to build and test.  The client looked at it and said,</p>
<blockquote><p>Ummm, all I want you to do is add my ABC layer to the map.</p></blockquote>
<p>Curses!  Esoteric technical solution foiled again by selfish client. Wrong!  Once I stopped to listen to what the client wanted, I was able to deliver the correct solution in as long as it took to fire up ArcMap, add a layer, and bounce the ArcGIS Server service.  Stop and take a listen every once in awhile and you may be amazed at what you learn.</p>
<h3>It&#8217;s OK to say &#8220;No&#8221;</h3>
<p>One of the things I really struggle with as a parent is the actual act of being a &#8220;<strong>P</strong>arent&#8221; when I need to be.  I want my son to think I&#8217;m fun and cool and to always say he loves me and it took me a lot of frustrated evenings after bed time to learn what so many parents already have: I can be his friend later, I need to be his parent now.  This means not starting a wrestling match when mom is trying to get him into the bath. It means not flying off the handle when he says I&#8217;m mean or he doesn&#8217;t like me.  It means saying &#8220;No&#8221; sometimes even when I know that &#8220;Yes&#8221; will bring a smile or a giggle.</p>
<p style="text-align:center;"><a href="http://briannoyle.files.wordpress.com/2009/04/istock-000004205749small.jpg"><img class="aligncenter" style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://briannoyle.files.wordpress.com/2009/04/istock-000004205749small-thumb.jpg?w=164&#038;h=244" border="0" alt="iStock_000004205749Small" width="164" height="244" /></a></p>
<p>I like numbers.  I was a math geek in school even though that wasn&#8217;t my chosen major so I love the numbers that our Agile instrumentation generates for me throughout a project.  Why?  Because they help me say &#8220;No&#8221; when I need to.  Even better, it allows me to say it and illustrate why diplomatically and matter-of-fact-ly without the typical posturing and table slapping between client and consultant.  If my team&#8217;s velocity and resource allocation is determined by 6 or 7 actual productive working hours during a day, and there are 10 days in an iteration, then I can show the client a fixed number of hours and the allocation of those hours to what my team feels is achievable.</p>
<blockquote><p>No, based on current story prioritization and available resources you cannot have that <em>super-duper-new-fangled-thing-you-just- thought-of</em>.  However we can enter it as a high priority item for the next iteration and reprioritize other stories accordingly.  If you wish to increase velocity I can add an additional developer to the team next iteration and we can discuss the financial impact of that change.</p></blockquote>
<p>In addition to being the servant leader, it&#8217;s OK for the Scrum Master to be a good parent and say &#8220;No&#8221; once in awhile. If the project owner throws a tantrum, please see &#8220;The best laid plans&#8230;&#8221; above.</p>
<h3>Relax, Regression is Natural</h3>
<p>Having spent a couple of years watching my son grow and change, my wife and I have recognized that he goes through cycles of development where there are short bursts of physical growth or learning in a particular area.  If he&#8217;s growing like a weed, that energy isn&#8217;t going into learning new words or actually hitting the toilet at potty time.  When he&#8217;s sponging up new words, writing skills, etc., then he&#8217;s not physically growing as fast.  And occasionally, word enunciation or behavior will regress because his body or his brain are busy doing other important kid things.</p>
<p style="text-align:center;"><img class="aligncenter" src="http://briannoyle.files.wordpress.com/2009/04/istock-000003269650small.jpg?w=240&#038;h=160" alt="iStock_000003269650Small" width="240" height="160" /></p>
<p>Regression in this case is not regression of the code base or feature set of an application.  What I mean by regression for the purposes of this post, is the natural ebb and flow of successes and productivity that occurs an any Agile team.  Things can go pretty rough on a new Agile team&#8230;poor acceptance or backlog achievement stats, uncertainty at certain points in the process, etc.  All these growing pains typically work themselves out.  As an Agile team becomes more mature, planning and velocity get better and things really start to hum.  Stories get spontaneously added to backlog by your team, individuals swoop in take backlog from others if they finish early, team members pull more backlog into an iteration mid-stream, etc.  But even on teams that have been doing this stuff for awhile, there is regression.  A completely new or unforeseen technical issue rears its head, a team member is out with an extended illness. Death in the family, job stress&#8230;Hey, maybe you&#8217;re just having a bad week.  The key here is to never blame the process for your team&#8217;s inability to succeed.  Energy is being put elsewhere to ensure a healthy, mature team over the longer term. Regression happens, relax.</p>
<h3>The rules apply to everybody</h3>
<p>We eat dinner as a family at the kitchen table every night.  TV off, no distractions, just the three of us and the two begging canines circling the mobile food delivery system that is my 3 year old.  We&#8217;ve been working on table manners lately: use your utensils, chew with your mouth closed, use a napkin, the standard stuff.  So the other night I&#8217;m correcting my son for some infraction that I no longer recall and while I&#8217;m talking to him I slouch to one side and bring my elbows up on the table.  I am promptly interrupted by, &#8220;Papa you sit up straight and keep your elbows off the table!&#8221;  Momentarily defeated, I am reminded that there can&#8217;t be two sets of rules in the house.</p>
<p style="text-align:center;"><a href="http://briannoyle.files.wordpress.com/2009/04/kidsrunn.jpg"><img class="aligncenter" style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://briannoyle.files.wordpress.com/2009/04/kidsrunn-thumb.jpg?w=244&#038;h=184" border="0" alt="KIDSRUNN" width="244" height="184" /></a></p>
<p>Ever work on team where the rules don&#8217;t apply to everybody?  Maybe it&#8217;s a team member that is chronically late for, or <em>jesu forfend</em>, skips stand ups entirely.  Maybe it&#8217;s the scrum master who decides you&#8217;re going to skip the post mortem this time. Maybe it&#8217;s allowing a project owner to interject major issues in the middle of a sprint.  First of all,  the ground rules should have all been dealt with during the project fit check, just before inception. Second, the same rules apply to every body.  I don&#8217;t care if you&#8217;ve got the most seniority, I don&#8217;t care if you&#8217;ve been &#8220;12th level black belt scrum master certified&#8221;, and I certainly don&#8217;t care if you think you&#8217;re the smartest or most productive one on the team.  We all succeed and fail as a unit and therefore, we all follow the same rules.  In short, it doesn&#8217;t matter what the specific nuts and bolts of your particular Agile process are; it matters most that the entire team realizes they all play by the same rules, none of which are optional.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/briannoyle.wordpress.com/190/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/briannoyle.wordpress.com/190/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/briannoyle.wordpress.com/190/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/briannoyle.wordpress.com/190/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/briannoyle.wordpress.com/190/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/briannoyle.wordpress.com/190/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/briannoyle.wordpress.com/190/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/briannoyle.wordpress.com/190/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/briannoyle.wordpress.com/190/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/briannoyle.wordpress.com/190/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=briannoyle.wordpress.com&blog=2469140&post=190&subd=briannoyle&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://briannoyle.wordpress.com/2009/04/16/the-agile-process-what-my-3-year-old-taught-me/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17c19e9c10d596422fcce4443f3a6a56?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">homebrutrout</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/04/istock-000005012679small-thumb.jpg" medium="image">
			<media:title type="html">iStock_000005012679Small</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/04/istock-000004104183small.jpg" medium="image">
			<media:title type="html">iStock_000004104183Small</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/04/istock-000005955051small-thumb.jpg" medium="image">
			<media:title type="html">Laying on the floor</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/04/istock-000005243833small-thumb.jpg" medium="image">
			<media:title type="html">iStock_000005243833Small</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/04/istock-000004205749small-thumb.jpg" medium="image">
			<media:title type="html">iStock_000004205749Small</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/04/istock-000003269650small.jpg" medium="image">
			<media:title type="html">iStock_000003269650Small</media:title>
		</media:content>

		<media:content url="http://briannoyle.files.wordpress.com/2009/04/kidsrunn-thumb.jpg" medium="image">
			<media:title type="html">KIDSRUNN</media:title>
		</media:content>
	</item>
	</channel>
</rss>