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

<channel>
	<title>ryan norris</title>
	<atom:link href="http://www.ryannorris.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ryannorris.com</link>
	<description>managing software teams and delivering great results</description>
	<lastBuildDate>Fri, 25 Jun 2010 13:44:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Apple seemingly leaves iPhone 3G users completely forsaken in iOS release</title>
		<link>http://www.ryannorris.com/2010/06/25/apple-seemingly-leaves-iphone-3g-users-completely-forsaken-in-ios-release/</link>
		<comments>http://www.ryannorris.com/2010/06/25/apple-seemingly-leaves-iphone-3g-users-completely-forsaken-in-ios-release/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 13:38:17 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=175</guid>
		<description><![CDATA[Eventually, I will certainly upgrade my iPhone to &#8211; well, I was thinking the iPhone 4. I&#8217;ve never had a problem with the iPhone 3G. Until now. I made the plunge the other day and upgraded my phone to iOS.  I wasn&#8217;t expecting huge improvements as a 3G user.  My phone is slower and isn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Eventually, I will certainly upgrade my iPhone to &#8211; well, I was thinking the iPhone 4.  I&#8217;ve never had a problem with the iPhone 3G.</p>
<p>Until now.</p>
<p><span id="more-175"></span>I made the plunge the other day and upgraded my phone to iOS.  I wasn&#8217;t expecting huge improvements as a 3G user.  My phone is slower and isn&#8217;t as cool as the 3Gs or the 4G &#8211; I get that.  But I figured folders would be worth it, as well as a few other things (naming your own playlists, etc.)</p>
<p>The upgrade took forever, and I began playing around.  Yeah, nothing too exciting &#8211; made some folders, noticed the new accounts view in Mail.  Whatever.  I go to switch my desktop (not lock screen) wallpaper.</p>
<p>Nope, can&#8217;t do that.  Not on the iPhone 3G at least.  This struck me as odd &#8211; I&#8217;m not really feeling that having desktop wallpaper would really challenge the performance capabilities of the device, but c&#8217;est la vie.  I also noticed that when paired up with my bluetooth car radio that I can now control the volume on the iPhone itself.  You couldn&#8217;t do this before.  I didn&#8217;t think much of it &#8211; it felt like change for change sake to me.</p>
<p>Then things started to go sideways.</p>
<p>I&#8217;m listening to my iPod while I&#8217;m reading some Mail, and a terrible song comes on.  I double tap the home button to get the iPod controls &#8211; the window pops up.  But low and behold &#8211; the controls aren&#8217;t there.  Nor is the the song information.  My forehead wrinkles a bit, and I move on.</p>
<p>Later, I&#8217;m at work and listening to music again.  A coworker comes up and taps my shoulder &#8211; so I double tap the home button on the now locked iPhone to get the iPod controls on the lock screen.  They appear &#8211; and everything seems fine, save the fact that the Play/Pause button is the Play arrow.  Note, <em>my music is playing</em>.  I touch the play button, and the music indeed pauses &#8211; but the iconography doesn&#8217;t change.  It&#8217;s still the play button.  I touch the play button again, and play resumes.  My eye twitches a bit, and I turn to my coworker with an iPhone 3GS.  He had moved to iOS recently, as well.</p>
<p><a href="http://blog.ryannorris.com/wp-content/uploads/2010/06/IMG_0455.png"><img class="size-full wp-image-181 alignright" title="iPod Controls" src="http://www.ryannorris.com/wp-content/uploads/2010/06/IMG_0455.png" alt="" /></a></p>
<p>Have you had this issue?</p>
<p>Now, the first problem doesn&#8217;t exist on the 3GS because they&#8217;re privileged enough to get the fancy new iPod controls while not in the iPod app itself.  But the lock screen issue didn&#8217;t exist for him.  In fact, his experience seems fantastic.</p>
<p>On the way home, there&#8217;s a daily podcast I listen to, and I usually stream it via iTunes because I don&#8217;t sync with my PC at work.  So I start it up as I typically do.  At a traffic light, a text message from my wife comes in &#8211; and I go in to quickly reply (yeah, I know, shouldn&#8217;t do that in the car).  I click reply.</p>
<p>The audio stops.</p>
<p>At first I think it was just some unique glitch.  So I go through the sequence again to see if it&#8217;s a reproducible item.  What do you know &#8211; it is.  Apparently in iOS, or at least on the iPhone 3G &#8211; you can&#8217;t stream audio and do <em>anything else at the same time</em>.</p>
<p><img class="size-full wp-image-180 alignleft" title="Paused?" src="http://www.ryannorris.com/wp-content/uploads/2010/06/IMG_0456.png" alt="" /></p>
<p>It could be a regression, but I&#8217;m betting my coworker doesn&#8217;t have these problems.</p>
<p>Dear Apple &#8211; I like your products.  I have an iMac at home, have had iPhones since the first generation phone, I even own an Apple TV.  It&#8217;s a bit disconcerting though that you&#8217;ve shown such disregard for current users of your products though in your furor to maximize upgrade revenue.  iPhone 2G users I know have always been patient with the fact that for various reasons, you won&#8217;t offer them all of the software upgrades that you offered us in the past.  I can appreciate being in their boat now being two revisions behind in hardware.  But it&#8217;s unacceptable that the overall quality of your software would be secondary for users of older devices.  I&#8217;ll have to think long and hard before I can convince myself that I can trust you enough to invest additional dollars into your impressive line of mobile products.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2010/06/25/apple-seemingly-leaves-iphone-3g-users-completely-forsaken-in-ios-release/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adobe: Apple&#8217;s Vietnam</title>
		<link>http://www.ryannorris.com/2010/05/30/adobe-apples-vietnam/</link>
		<comments>http://www.ryannorris.com/2010/05/30/adobe-apples-vietnam/#comments</comments>
		<pubDate>Sun, 30 May 2010 17:38:47 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[itunes]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=173</guid>
		<description><![CDATA[The iPhone OS 4 SDK licensing agreement has been, well, unpopular.  To anyone who has paid attention to Apple over the past 20 years, it&#8217;s certainly not surprising that they want to lock down the ecosystem.  This has been their modus operendi for as long as I can remember.  So while Apple&#8217;s &#8220;take the ball [...]]]></description>
			<content:encoded><![CDATA[<p>The iPhone OS 4 SDK licensing agreement has been, well, unpopular.  To anyone who has paid attention to Apple over the past 20 years, it&#8217;s certainly not surprising that they want to lock down the ecosystem.  This has been their modus operendi for as long as I can remember.  So while Apple&#8217;s &#8220;take the ball and go home&#8221; strategy certainly generates a roll of the eyes from many, what&#8217;s surprising is the indignation that Adobe developer&#8217;s have expressed in being locked out of Apple&#8217;s poker game.</p>
<p>That indignation seemed to find an ally in Google.  At <a title="Google I/O" href="http://code.google.com/events/io/2010/" target="_blank">Google I/O 2010</a>, there was much ballyhoo about open standards and open platforms.  There was direct mention of Flash being an important part of the internet at large, and Adobe fans seemed to have found a Mao for their Ho Chi Minh.  Outside of sharp words, Adobe had very little ammunition in this battle.  Adding Google as a key ally seemed at least to justify their position &#8211; even solidify a dynamic place in the marketplace for media delivery.</p>
<p>The politics of this war are less about openness of platform, however.  Apple&#8217;s exclusivity practices in the past few decades have been largely about limiting competition and thus maximizing margins from a niche product.  When the product suffered and competition increased in the early 90&#8242;s from Microsoft and others, Apple was only able to recover not by changing their strategy but by executing on the fundamentals that allowed this strategy to succeed in the first place &#8211; high quality.  Today, Apple has maximized the potential for the platform itself &#8211; whether it be a mobile device, laptop, or media center, to sustain it&#8217;s own profitability.  But with the computer and handheld market on lengthy cycles between purchases, maximizing revenue opportunity becomes a challenge of ensuring that customers are purchasing Apple product more frequently.  This is where the iTunes Music Store is so critically important to Apple&#8217;s strategy.</p>
<p>Flash as a platform is flawed, says Steve Jobs.  His arguments have some merit, particularly on handheld devices.  But once again, this is a proxy argument.  The problem with Flash isn&#8217;t that Jobs can&#8217;t control the content developed in the platform.  The problem is that by allowing Flash into the Apple ecosystem, Jobs would be opening a wormhole into an alternative media delivery platform.  Flash is a development tool &#8211; but by leaps and bounds it&#8217;s greatest claim in the frontier of the internet is multimedia content delivery.  YouTube, Brightcove, and Vimeo are all powered by Flash and all deliver the same content for free that Apple wants to be able to charge for.  This is where Apple dogma and Google dogma meet, and Adobe is simply a place for this war to be fought.</p>
<p>Adobe cannot win and remain sovereign in this battle.  Apple&#8217;s desktop platform is the chosen home for many creative&#8217;s who use Adobe&#8217;s landmark products like Photoshop and Fireworks.  Google owns YouTube, has <a title="GWT" href="http://www.ryannorris.com/category/gwt/" target="_self">built it&#8217;s own rich internet application framework</a>, and fully backs the HTML5 standard that allows the modern web browser to do all of the things one could only do with the support of Flash in the past.  Google has Adobe smiling with a knife at their back.  For Google, the relationship is convenient to buy time until Android devices overtake Apple devices (likely in 2011).  Apple&#8217;s aggression gives Adobe little choice but to ally with the greater but less immediate threat.</p>
<p>Apple&#8217;s fatal flaw in this fight is not the control over development for their devices, but how users will get media delivery to those devices.  It&#8217;s not that Google is on the opposite side of the debate &#8211; they simply don&#8217;t care.  Google is a data company that is using mobile platforms as another tool for understanding their users as to maximize the ad revenue that has made them so successful.  Whether or not the user buys their content from Amazon or Apple or Walmart is inconsequential.  If the user clicked an ad for one of those companies to buy an MP3 and Google made $.05 from that click &#8211; it&#8217;s been a successful day for Google.  The Google approach is open solely because it maximizes revenue potential by maximizing the channels that can generate that revenue &#8211; not because of some religious developer fervor.</p>
<p>So Adobe can scream and yell at Apple all they want about openness and freedom.  They have the backing now of a much stronger, much better positioned ally that could turn on them at any minute.  One move for Adobe could be to find a way to exclusively integrate their products with iTMS.  Such a move would at least leverage them against any passive Google aggression.  But ultimately they are but a proxy in the coming Apple/Google apocalypse.  To me, it&#8217;s more curious that Apple has decided to bring this battle to such an intermediary first, rather than to try to stunt the emergent competition in Google head on.  It could well be that the cost of such a direct war would be so great to Apple that they&#8217;d rather not play offense but instead focus on defense &#8211; ensuring exclusivity of content delivery on Apple platforms.  It could also well be that we&#8217;ll be watching TV on our Android devices in 2015 and forwarding through the &#8220;I&#8217;m an Android.  I&#8217;m an iPhone.&#8221; commercials.  Only John Hodgman will be wearing the Steve Jobs mock turtleneck.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2010/05/30/adobe-apples-vietnam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Baseball Manager and Agile:  How America&#8217;s Game Forces It&#8217;s Decision Makers to Be Responsive</title>
		<link>http://www.ryannorris.com/2010/03/22/the-baseball-manager-and-agile-how-americas-game-forces-its-decision-makers-to-be-responsive/</link>
		<comments>http://www.ryannorris.com/2010/03/22/the-baseball-manager-and-agile-how-americas-game-forces-its-decision-makers-to-be-responsive/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 02:41:05 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[baseball]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=164</guid>
		<description><![CDATA[Among the various extra-curriculars that take up my downtime, baseball is up there.  Baseball was a passion for much of my youth.  As I got older and my attention turned towards my career and the world at large, the dawn of Michael Lewis&#8217; &#8220;Moneyball&#8221; changed my view on baseball entirely.  Baseball became, for better or [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Among the various extra-curriculars that take up my downtime, baseball</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">is up there.  Baseball was a passion for much of my youth.  As I got older and my attention turned towards my career and the world at large, the dawn of Michael Lewis&#8217; &#8220;Moneyball&#8221; changed my view on baseball entirely.  Baseball became, for better or for worse &#8211; less interesting to watch for 180 days a year and more intrigiung to capture in the snapshots of statistics and numbers that engulfed baseball in the early 2000&#8242;s.  Lewis was demonstrating not a new approach to how baseball was played, but how Oakland A&#8217;s manager Billy Beane was simpy exploiting an efficiency that none of his contemporaries had (yet) uncovered.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">So recently I found myself thinking about the role of the manager in baseball.  As other teams began looking at the Oakland model for constructing successful, cost-conscious rosters, many copied their formula.  Others began to look for other efficiencies.  But the manager role &#8211; the ultimate &#8220;chicken&#8221; contrasted to the players as pigs, has only had cursory evalution for their affect on the outcome of the game.  These evaluations are subjective by and large, and have all concluded in one way or form that managers tend to have zero net effect on the success or failure of a team.  But baseball managers are perhaps one of the most agile practitioners today.  They must be responsive, they must have enough foresight to plan only enough in that they can mitigate risk, but not so much as to commit themselves to a shortsighted approach.  Their sprints are innings, their releases are games.  They create ample time to adjust and replan.  They are agile creatures &#8211; perhaps the original agile management style.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Every Game is a Release</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Before every game, the manager has a plan to build.  The lineup is first and foremost.  It ultimately has very little affect on the outcome of the game, provided that the manager has planned for his best hitters to be part of the game.  Additionally and potentially irrelevant statistically &#8211; the manager will prioritize his lineup which will offer the most potential value for that game.  The catcher amy be different depending on his own starting pitcher.  Lefthanded hitters, statistically vulnerable to left-handed pitching may sit on the bench to start the game while statistically inferior players fill-in for the handicapped lefthander.  Some players may be removed from the roster entirely, optioned to a monior league affiliate to allow for superior options to be available in the case the need arises.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">The analogy here, is release planning.  Just like the manager has an assortment of players, we have a backlog.  Each story offers value that may change from one sprint to the next.  Each story may shuffle in priority from one sprint to the next.  But the focus is always on ensuring that during a release we are planning to ensure that we are successful in every area of our sprints during the release while aiming to maximize the success of our teams over the entirety of the release.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Every Inning is a Sprint</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Baseball is a strange game in that every inning, the defense controls the ball.  There are 9 innings in a game, and 3 outs per inning.  These are our resources.  As a manager, my job is to allow my team to execute while intervening only when resource mismanagement is certain.  I may pinch hit for a hitter in order to maximize run production while minimizing outs.  Conversely, I may change pitchers frequently to ensure my competition is least able to use their resources to their fullest.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Managing sprints is a task in managing your resources optimally.  Each sprint we start with our planning meeting where we identify what resources are available for the current sprint.  Then, based on various factors &#8211; we figure in what we can get done during the sprint.  How we get there may change, but the goal is always part of a theme.  In baseball, this is a touch of a stretch &#8211; but it&#8217;s hard to think that a manager going into the 9th down by 3 isn&#8217;t planning his decisions on maximizing on-base percentage that inning with the prospect of his best power hitter in the dugout.  Often times when a team hasn&#8217;t scored the tying or lead run but is threatening to score, the bullpen will warm up, a proactive response to something which may not be certain.  A lot of baseball management is about thinking foreward just far enough to be prepared for what you know is next and not focusing too much on the possibilities in September while it&#8217;s still May.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Baseball Teams Are Self-Managing</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">This is more hypothetically true than true in reality.  It&#8217;s not unheard of for players to be managers as well.  But unlike professional American football where the level of specialization and differentiation between offensive and defensive roles is stark, or professional basketball where the players can succeed independently of the team, even if the team fails &#8211; baseball players are incredibly independent in their affect on any given contest.  While Michael Jordan and Kobe Bryant may have singlehandedly one NBA titles for their respective teams, Derek Jeter and Curt Schilling would have not won their rings were it not for the complimentary (but not cooperative) talents of the players that surround them.  They exhibit classic examples of game theory where the benefits of the strength of their performance are best realized by them only when realized by all.  That is a key trait of the self-organizing team.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">What Baseball Can Tell Us About Software</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">While these two things are markedly different, baseball managers and players are clear examples of self-sufficient and practical agile applications.  Managers aim to minimize risk and maximize prdocution while only planning for the factors that are at hand or probable rather thah trying to account for any possible scenario.  This is not too indifferent from how a ScrumMaster must operate.  If baseball managers went into game 1 concerned about game 60, they would be accused of guesswork and incompetence.  Uncertainty would doom their plan, the pundits would not.  This is not at all indifferent from Agile software teams that learn from recent results and apply the lessons from the most recent experiences immediately.</div>
<p>Among the various extra-curriculars that take up my downtime, baseball is up there.  Baseball was a passion for much of my youth.  As I got older and my attention turned towards my career and the world at large, the dawn of Michael Lewis&#8217; &#8220;Moneyball&#8221; changed my view on baseball entirely.  Baseball became, for better or for worse &#8211; less interesting to watch for 180 days a year and more intriguing to capture in the snapshots of statistics and numbers that engulfed baseball in the early 2000&#8242;s.  Lewis was demonstrating not a new approach to how baseball was played, but how Oakland A&#8217;s manager Billy Beane was simply exploiting an efficiency that none of his contemporaries had (yet) uncovered.</p>
<p>So recently I found myself thinking about the role of the manager in baseball.  As other teams began looking at the Oakland model for constructing successful, cost-conscious rosters, many copied their formula.  Others began to look for other efficiencies.  But the manager role &#8211; the ultimate &#8220;chicken&#8221; contrasted to the players as pigs, has only had cursory evaluation for their affect on the outcome of the game.  These evaluations are subjective by and large, and have all concluded in one way or form that managers tend to have zero net effect on the success or failure of a team.  But baseball managers are perhaps one of the most agile practitioners today.  They must be responsive, they must have enough foresight to plan only enough in that they can mitigate risk, but not so much as to commit themselves to a shortsighted approach.  Their sprints are innings, their releases are games.  They create ample time to adjust and re-plan.  They are agile creatures &#8211; perhaps the original agile management style.</p>
<p><span id="more-164"></span></p>
<p><strong>Every Game is a Release</strong></p>
<p>Before every game, the manager has a plan to build.  The lineup is first and foremost.  It ultimately has very little affect on the outcome of the game, provided that the manager has planned for his best hitters to be part of the game.  Additionally and potentially irrelevant statistically &#8211; the manager will prioritize his lineup which will offer the most potential value for that game.  The catcher amy be different depending on his own starting pitcher.  Lefthanded hitters, statistically vulnerable to left-handed pitching may sit on the bench to start the game while statistically inferior players fill-in for the handicapped lefthander.  Some players may be removed from the roster entirely, optioned to a minor league affiliate to allow for superior options to be available in the case the need arises.</p>
<p>The analogy here, is release planning.  Just like the manager has an assortment of players, we have a backlog.  Each story offers value that may change from one sprint to the next.  Each story may shuffle in priority from one sprint to the next.  But the focus is always on ensuring that during a release we are planning to ensure that we are successful in every area of our sprints during the release while aiming to maximize the success of our teams over the entirety of the release.</p>
<p><strong>Every Inning is a Sprint</strong></p>
<p>Baseball is a strange game in that every inning, the defense controls the ball.  There are 9 innings in a game, and 3 outs per inning.  These are our resources.  As a manager, my job is to allow my team to execute while intervening only when resource mismanagement is certain.  I may pinch hit for a hitter in order to maximize run production while minimizing outs.  Conversely, I may change pitchers frequently to ensure my competition is least able to use their resources to their fullest.</p>
<p>Managing sprints is a task in managing your resources optimally.  Each sprint we start with our planning meeting where we identify what resources are available for the current sprint.  Then, based on various factors &#8211; we figure in what we can get done during the sprint.  How we get there may change, but the goal is always part of a theme.  In baseball, this is a touch of a stretch &#8211; but it&#8217;s hard to think that a manager going into the 9th down by 3 isn&#8217;t planning his decisions on maximizing on-base percentage that inning with the prospect of his best power hitter in the dugout.  Often times when a team hasn&#8217;t scored the tying or lead run but is threatening to score, the bullpen will warm up, a proactive response to something which may not be certain.  A lot of baseball management is about thinking forward just far enough to be prepared for what you know is next and not focusing too much on the possibilities in September while it&#8217;s still May.</p>
<p><strong>Baseball Teams Are Self-Managing</strong></p>
<p>This is more hypothetically true than true in reality.  It&#8217;s not unheard of for players to be managers as well.  But unlike professional American football where the level of specialization and differentiation between offensive and defensive roles is stark, or professional basketball where the players can succeed independently of the team, even if the team fails &#8211; baseball players are incredibly independent in their affect on any given contest.  While Michael Jordan and Kobe Bryant may have single handedly one NBA titles for their respective teams, Derek Jeter and Curt Schilling would have not won their rings were it not for the complimentary (but not cooperative) talents of the players that surround them.  They exhibit classic examples of game theory where the benefits of the strength of their performance are best realized by them only when realized by all.  That is a key trait of the self-organizing team.</p>
<p><strong>What Baseball Can Tell Us About Software</strong></p>
<p>While these two things are markedly different, baseball managers and players are clear examples of self-sufficient and practical agile applications.  Managers aim to minimize risk and maximize production while only planning for the factors that are at hand or probable rather than trying to account for any possible scenario.  This is not too indifferent from how a Scrum-Master must operate.  If baseball managers went into game 1 concerned about game 60, they would be accused of guesswork and incompetence.  Uncertainty would doom their plan, the pundits would not.  This is not at all indifferent from Agile software teams that learn from recent results and apply the lessons from the most recent experiences immediately.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2010/03/22/the-baseball-manager-and-agile-how-americas-game-forces-its-decision-makers-to-be-responsive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Looking at Google Buzz</title>
		<link>http://www.ryannorris.com/2010/02/19/looking-at-google-buzz/</link>
		<comments>http://www.ryannorris.com/2010/02/19/looking-at-google-buzz/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 19:21:00 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[Social Media]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=159</guid>
		<description><![CDATA[I tried Google Buzz this morning. My general impression when it was first announced was like many others: I don&#8217;t need another outlet for random thoughts.  I don&#8217;t need yet another source for random socialization.  I use Twitter.  I use Facebook. So when I posted an innocuous message questioning the value of the tool I [...]]]></description>
			<content:encoded><![CDATA[<p>I tried Google <em>Buzz </em>this morning.  My general impression when it was first announced was like many others: <em>I don&#8217;t need another outlet for random thoughts.   I don&#8217;t need yet another source for random socialization.  I use Twitter.  I use Facebook.</em></p>
<p>So when I posted an innocuous message questioning the value of the tool I had just used, I got an immediate response.  To me, this is the type of gratification that people get (or used to get) from setting their Facebook status.  Or Tweeting.  Social media, from the consumer&#8217;s perspective &#8211; is virtual screaming.  Just without the caps lock key.  It&#8217;s everyone&#8217;s way of saying <em>look over here, it&#8217;s me, I like politics and I love books and I have a cold and does anyone want to grab a drink tonight?</em> What Facebook realizes increasingly (and Twitter, always resistant to changing their innate simplicity, has gave a moment&#8217;s thought to) is that eventually you have so many contacts, so many friends, so many followers, so many people who follow you that the signal to noise becomes unbearable without some sort of filter.  All of the conversations, statuses, likes, fandoms, retweets, hashtags, and groups eventually just become an incessant buzz, and we stop paying attention to a lot of it.</p>
<p>The immediate response was a result of having all of 14 people paying attention.  Compare that to the 150 people I&#8217;m connected to on Facebook.  Or the paltry 80 or so followers I have on Twitter.  My satisfaction with the experience with Google Buzz at that moment was purely a result of it&#8217;s infancy. But the buzz grew immediately louder.  I then noticed that the buzz had gotten into my GMail inbox.  To a guy who likes the mantra of <em>Inbox: 0</em>, this was distressing.  Part of the deal with Twitter which elevates it appeal over Facebook is that it is a pretty passive social media.  Direct messages infect your inbox, but those are fairly rare.  Simple replies to your tweets or even mentions can just fade to noise.  But now that there was a level of replication between ubiquitous social exchange and my more formal communication in email &#8211; Buzz had taken the most invasive and distracting part about Facebook and actively decided to emulate it.</p>
<p>At least Google Wave, while useless for my everyday interactions (though potentially useful elsewhere) lived out on an island that I could blissfully ignore.</p>
<p>I think that Wave, <em>Buzz</em>, and GMail eventually need to work out whether or not they&#8217;re the same thing or different things.  Facebook is looking to build a &#8220;GMail Killer,&#8221; and so it seems there is some idea out there that people don&#8217;t like email and would rather live in a world where the overwhelming noise of social media permeates everything.  It&#8217;s clear that for Google, taking email and putting eyes on the inbox with greater frequency will lead to more exposure to advertisers and inherently, more ad revenue.  But Facebook has ALWAYS had this model and hasn&#8217;t been able to consistently demonstrate that users will give advertisers the chance through all of the other noise.</p>
<p>It&#8217;s tempting to say that people will ultimately reject this model and the invisible hand of the market will demonstrate that when the inbox becomes too busy, people will just tune it out.  Google has provided options for getting <em>Buzz </em>out of your inbox.  But given the potential upside, particularly in Google&#8217;s business model, I&#8217;m also unconvinced they won&#8217;t try to force this particular feature right down their user&#8217;s throats.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2010/02/19/looking-at-google-buzz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No, You Can&#8217;t Override JavaScriptObject.equals() in GWT.  Not Yours.</title>
		<link>http://www.ryannorris.com/2010/01/22/no-you-cant-overload-javascriptobject-equals-in-gwt-not-yours/</link>
		<comments>http://www.ryannorris.com/2010/01/22/no-you-cant-overload-javascriptobject-equals-in-gwt-not-yours/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 12:24:30 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[equals]]></category>
		<category><![CDATA[hashCode]]></category>
		<category><![CDATA[ood]]></category>
		<category><![CDATA[oop]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=152</guid>
		<description><![CDATA[Sigh. For reasons that may or may not be sensible, equals() and hashCode() are finalized in GWT&#8217;s JavaScriptObject. This is an unfortunate discovery.  While there is no inherent equals() or hashCode() in the Javascript language itself (unless I&#8217;ve missed something) that doesn&#8217;t mean GWT couldn&#8217;t make one for me.  JavaScriptObject#equals(&#8230;) instead calls super.equals().  Which is [...]]]></description>
			<content:encoded><![CDATA[<p>Sigh.  For reasons that may or may not be sensible, <code>equals()</code> and <code>hashCode()</code> are finalized in GWT&#8217;s JavaScriptObject.</p>
<p><span id="more-152"></span>This is an unfortunate discovery.  While there is no inherent equals() or hashCode() in the Javascript language itself (unless I&#8217;ve missed something) that doesn&#8217;t mean GWT couldn&#8217;t make one for me.  JavaScriptObject#equals(&#8230;) instead calls super.equals().  Which is really Object#equals(&#8230;) and that&#8217;s really just triple-equality (==).  In object oriented programming, this is what is technically referred to as <em>an </em><em>absolute pain in the ass.</em> It renders JRE emulation of java.util.Set around JSO&#8217;s almost useless.  And it really highlights something that I&#8217;ve had in my head a while now:</p>
<p>If you can&#8217;t use GWT-RPC, you use JSON at your own peril.  JavaScriptOverlay types, while nifty in concept are simply not first-class objects in GWT.  They&#8217;re more akin to a struct or map.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2010/01/22/no-you-cant-overload-javascriptobject-equals-in-gwt-not-yours/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common Java Idiom, Lousy GWT Bug</title>
		<link>http://www.ryannorris.com/2010/01/15/common-java-idiom-lousy-gwt-bug/</link>
		<comments>http://www.ryannorris.com/2010/01/15/common-java-idiom-lousy-gwt-bug/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 04:49:29 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java Development]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[strategypattern]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=145</guid>
		<description><![CDATA[I have to get around to shipping this one to the GWT committers, but this one bit me hard. Let&#8217;s say you have interface Driveable: public interface Driveable &#123; public void accelerate&#40;&#41;; &#160; public void brake&#40;&#41;; &#160; public void tuneRadio&#40;&#41;; &#125; Awesome. Now let&#8217;s say you have class AbstractDriveable: public abstract class AbstractDriveable implements Driveable [...]]]></description>
			<content:encoded><![CDATA[<p>I have to get around to shipping this one to the GWT committers, but this one bit me hard.</p>
<p><span id="more-145"></span>Let&#8217;s say you have interface Driveable:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Driveable <span style="color: #009900;">&#123;</span>
 <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> accelerate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> brake<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> tuneRadio<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Awesome. Now let&#8217;s say you have class AbstractDriveable:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> AbstractDriveable <span style="color: #000000; font-weight: bold;">implements</span> Driveable <span style="color: #009900;">&#123;</span>
 <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> accelerate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #003399;">Window</span>.<span style="color: #006633;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Vroom vroom!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
 <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> brake<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #003399;">Window</span>.<span style="color: #006633;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Screeeeeech!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Totally cool.  And then you love your favorite FM station in ConcreteDriveable:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConcreteDriveable <span style="color: #000000; font-weight: bold;">extends</span> AbstractDriveable <span style="color: #009900;">&#123;</span>
 <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> tuneRadio<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #003399;">Window</span>.<span style="color: #006633;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Rockin' the oldies!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Then we launch into development mode with whatever our application is, and&#8230;something explodes.</p>
<p>So we debug, and upon looking at the code that cleverly calls <code>tuneRadio</code> polymorphically &#8211; we notice that our debugger drops into a catch block for a <code>NoSuchMethodError</code>.</p>
<p>It appears that GWT seems to lose track of this common idiom &#8211; use an interface to define behavior, realize that interface on an abstract class to create default behaviors, and then strategize those behaviors in concrete implementations.</p>
<p>The workaround is simple: redeclare your unrealized interface method in the abstract class.  But this is a pretty nasty little bug.  The GWT guys know this, but it&#8217;s rather critical to GWT that it follow the practices of Java as best as possible.  Otherwise it&#8217;s YAL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2010/01/15/common-java-idiom-lousy-gwt-bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Technology Grudges and the Cult of Building Your Own Software</title>
		<link>http://www.ryannorris.com/2010/01/05/technology-grudges-and-the-cult-of-building-your-own-software/</link>
		<comments>http://www.ryannorris.com/2010/01/05/technology-grudges-and-the-cult-of-building-your-own-software/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 04:36:28 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[Building Better Software]]></category>
		<category><![CDATA[Building It Better]]></category>
		<category><![CDATA[Consulting]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=141</guid>
		<description><![CDATA[It has come to pass that in my travels, I have been introduced to or worked with people with certain grudges in the technology realm.  Myself included, it is pretty simple to run into a problem in an experience that sours you on a particular tool.  Hell, my father-in-law held a pretty decent grudge against [...]]]></description>
			<content:encoded><![CDATA[<p>It has come to pass that in my travels, I have been introduced to or worked with people with certain grudges in the technology realm.  Myself included, it is pretty simple to run into a problem in an experience that sours you on a particular tool.  Hell, my father-in-law held a pretty decent grudge against Honda automobiles until the early 90&#8242;s.  The reason&#8217;s for his slight towards the maker of the Accord was a bit different from the people I come across who hold technologies in low regard &#8211; the people who roll their eyes at Java, the religious fanatics who loathe all things Microsoft, the experienced programmers who will never touch Perl.  We tend to be shaped more by our poor experiences than our positive ones.  The technologist &#8220;grudge&#8221; is the burden some people carry with them for a lifetime after a poor experience, and while it&#8217;s understandable and to an extend prudent to adopt a <em>once bitten, twice shy </em>perspective, it is more valuable to take that experience and either improve the subject technology (particularly in the instances of community software) or evaluate alternatives that exist.</p>
<p>But some of the weary techies I&#8217;ve worked with (particularly middle-management types, for some reason) go off the deep end.  I like to say that when you encounter a technical challenge &#8211; there&#8217;s likely someone else who has also needed to solve a similar problem.  In the instances where that isn&#8217;t the case &#8211; you&#8217;re in a pretty good position to gain something from solving it yourself.  But truth be told, there are very few large problems out there that people aren&#8217;t solving.  And yet IT organizations continue to re-invent the wheel &#8211; even when economics and time tell them that they should look for an off-the-shelf solution.  This only leaves one real driver for making the build decision when the buy decision is so apparent: politics.  And often it&#8217;s the politics of the grudge.</p>
<p>I firmly believe that every shop I&#8217;ve walked into that has rolled their own MVC framework, or RIA framework, or rules framework contains an individual who truly believes that the cost of supporting, maintaining, and continuously developing that software is still less than the cost of taking a turnkey solution &#8211; either one that is commercial or open source.  I recently had a manager tell me that there was an increasing drive through the IT management structure that the enterprise should own the source and rights to all of the systems that it supports.  This was a crazy notion &#8211; are their boundaries to this doctrine?  Will we be writing our own application servers?  RDBMS?  Messaging systems?  Where does this cult draw the line?  And with a little more digging, and without much surprise &#8211; I found that this manager had spearheaded a campaign to adopt a particular Javascript framework for client development that ultimately failed and cost the company several millions of dollars.  His dogma seemed crazy, and it was. But it was completely motivated out of fear that technology selection, no matter where the accountability lay &#8211; was an avoidable cost of enterprise IT, even if it meant adopting the more extensive cost of building all solutions from the ground up whenever the need arose.</p>
<p>I guess the moral of the story is really that as an IT manager, it&#8217;s important to recognize the power of the crowd (the community if you will) and the value it can add at virtually no cost to your organization.  That it&#8217;s important to understand why a 3rd party tool has been selected.  That it&#8217;s general limitations are known early on.  That your organization is prepared to adopt the tool as if it were it&#8217;s very own.  This means hiring experts who have used those technologies.  And above and beyond anything else, that when you fail &#8211; the goal must be to marginalize the cost of that failure.  You can hedge your bets, you can reduce risk.  But when the dust settles and a selected technology has failed the organization &#8211; be sure to take a good hard look in the mirror and be open about where the selection process has failed.</p>
<p>Sometimes it is the captain, and not the ship.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2010/01/05/technology-grudges-and-the-cult-of-building-your-own-software/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RPC Objects in GWT Now MUST be Serializable</title>
		<link>http://www.ryannorris.com/2009/12/13/rpc-objects-in-gwt-now-must-be-serializable/</link>
		<comments>http://www.ryannorris.com/2009/12/13/rpc-objects-in-gwt-now-must-be-serializable/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 04:42:15 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java Development]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=134</guid>
		<description><![CDATA[Okay, so maybe it&#8217;s always been this way and I&#8217;ve just not been paying attention &#8211; but it appears that GWT 2.0 now requires one to make RPC objects that will go across the wire explicitly implement java.io.Serializable. A bland RPC implementation that was based on past work I&#8217;ve done was barfing all over me [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, so maybe it&#8217;s always been this way and I&#8217;ve just not been paying attention &#8211; but it appears that GWT 2.0 now requires one to make RPC objects that will go across the wire explicitly implement <code>java.io.Serializable</code>.</p>
<p>A bland RPC implementation that was based on past work I&#8217;ve done was barfing all over me at GWT compile-time today:</p>
<pre><span>Rebinding com.<span>ryannorris</span>.staffing.client.project.<span>ProjectCreatorService</span>

Invoking com.google.<span>gwt</span>.<span>dev</span>.<span>javac</span>.<span>StandardGeneratorContext</span>@9b32fe

Generating client proxy for remote service interface 'com.<span>ryannorris</span>.staffing.client.project.ProjectCreatorService'

[ERROR] com.<span>ryannorris</span>.staffing.client.Action&lt;T&gt; has no available <span>instantiable</span> subtypes. (reached via com.<span>ryannorris</span>.staffing.client.Action&lt;T&gt;)

[ERROR]    subtype com.<span>ryannorris</span>.staffing.client.Action&lt;T&gt; is not <span>instantiable</span>

[ERROR]    subtype com.<span>ryannorris</span>.staffing.client.project.<span>ProjectCreatorAction</span> is not assignable to 'com.google.<span>gwt</span>.user.client.<span>rpc</span>.IsSerializable' or 'java.<span>io</span>.Serializable' nor does it have a custom field <span>serializer</span> (reached via com.<span>ryannorris</span>.staffing.client.Action&lt;T&gt;)

[ERROR] com.<span>ryannorris</span>.staffing.client.project.<span>ProjectCreatorAction</span> is not assignable to 'com.google.<span>gwt</span>.user.client.<span>rpc</span>.IsSerializable' or 'java.<span>io</span>.Serializable' nor does it have a custom field <span>serializer</span> (reached via com.<span>ryannorris</span>.staffing.client.Action&lt;T&gt;)</span></pre>
<p>I can&#8217;t say I ever had the pleasure of dealing with this bit of attention to detail from the GWT Compiler in the past.  And while I will readily admit I haven&#8217;t read every change to the underlying architecture that comes with 2.0, this would seem to be a piece that might be worthy of some special mention.</p>
<p><span>It is, of cour<span>se</span>, nearly common sen<span>se</span> to make sure that your RPC objects can go across the wire in the proper way, and thus simply respecting the semantics of java.<span>io</span>.<span>Serializable</span> the same way we would in EJB per <span>se</span>, is pretty reasonable.  Just a little more heads up would have been nice.</span></p>
<p><strong>Update 1: </strong>There seems to be some mention of <a title="RPC Compilation Feedback" href="http://code.google.com/p/google-web-toolkit/issues/detail?id=3461" target="_blank">fixing compiler feedback around RPC serialization here</a>.  But this defect doesn&#8217;t suggest changes that might have actually altered behavior or requirements of the compiler since 1.7.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2009/12/13/rpc-objects-in-gwt-now-must-be-serializable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Simple GWT Validation Framework Using Great Design Patterns and MVP</title>
		<link>http://www.ryannorris.com/2009/11/27/validation-in-gwt-with-mvp-and-patterns/</link>
		<comments>http://www.ryannorris.com/2009/11/27/validation-in-gwt-with-mvp-and-patterns/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 13:51:08 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[Enterprise Architecture]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[google web toolkit]]></category>
		<category><![CDATA[mvp]]></category>
		<category><![CDATA[ria]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=113</guid>
		<description><![CDATA[I&#8217;ve been writing a bit about Google Web Toolkit lately. It undeniably is disrupting traditional browser-based RIA development. But it does lack some features out of the box that most developers have grown accustomed to from frameworks like Flex and Ext. Field validation is one such feature. While the gwt-validation project exists to solve this [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been writing a bit about Google Web Toolkit lately.  It undeniably is disrupting traditional browser-based RIA development.  But it does lack some features out of the box that most developers have grown accustomed to from frameworks like Flex and Ext.  Field validation is one such feature.  While the gwt-validation project exists to solve this very problem, an approach leveraging a good chunk of the existing GWT infrastructure can give you a robust, test-driven, and MVP-friendly approach for validation.<span id="more-113"></span></p>
<p>To get started, let&#8217;s break down our validation needs along the standard lines that we see in frameworks today.  Widgets need to be able to be <em>Validatable</em>.  That is to say, Widgets must be able to be externally seen as having the capability to execute logic which validates their current state.  In my approach, I&#8217;ve chosen to <em>strategize</em> my widgets rather than visit them in order to validate their data.  This decision is largely to enforce contract-driven development and ensure a high level of testability.</p>
<p><strong>Validatable</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Validatable <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Execute validation on the implementing component
	 *
	 * @return true if validation succeeded, false if validation failed
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> validate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>We also now need an interface that will provide the rules for how validation logic should occur.  Something that is <em>Validatable </em>should be able to validate itself with multiple sets of rules.  Our <strong>Validator</strong> interface gives us this flexible cardinality, and has a familiar ring to it.</p>
<p><strong>Validator</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> Validator <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Execute the implemented validation logic
	 *
	 * @return true if validation succeeded, false otherwise
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> validate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Yes, these two interfaces are the same besides their name.  They are both command interfaces, allowing us to abstract logic behind a single method that we can cope with polymorphically.  The idea remember is that <em>Validatable</em> components can re-use many different <em>Validator</em> implementations.</p>
<p>So let&#8217;s write a simple <em>Validator </em>and <em>Validatable </em>interface.  In this case, we&#8217;ll be validating date input.</p>
<p><strong>DateFormatValidator</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.validator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.i18n.client.DateTimeFormat</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.user.client.ui.HasValue</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.Validator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> DateFormatValidator <span style="color: #000000; font-weight: bold;">implements</span> Validator <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> HasValue<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>String<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> _value<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> DateTimeFormat _format<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Create a validator that will verify that the given string is compliant
	 * with the pattern
	 *
	 * @param format
	 *            The format to validate against, per the specification in
	 *            {@link DateTimeFormat}
	 * @param value
	 *            The value to validate
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> DateFormatValidator<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> pattern, HasValue<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>String<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		_format <span style="color: #339933;">=</span> DateTimeFormat.<span style="color: #006633;">getFormat</span><span style="color: #009900;">&#40;</span>pattern<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Set the value to be validated
	 *
	 * @param value a string, nominally representing a date
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> setValue<span style="color: #009900;">&#40;</span>HasValue<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span>String<span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		_value <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">/*
	 * (non-Javadoc)
	 *
	 * @see com.ryannorris.gwt.validation.client.Validator#validate()
	 */</span>
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> validate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			_format.<span style="color: #006633;">parse</span><span style="color: #009900;">&#40;</span>_value.<span style="color: #006633;">getValue</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IllegalArgumentException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// the value couldn't be parsed by the pattern, return false</span>
			<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>So, now I have a <em>Validator. </em>How do I now make a widget, let&#8217;s say a simple TextBox, <em>Validatable?</em></p>
<p>Harkon back earlier when I said I was chosing to <em>strategize</em> my Widgets.  That&#8217;s only partially true.  Because we&#8217;re aiming for good TDD, and hence we want to rely on dependency injection &#8211; we will in fact be decorating them as well.  We will <em>strategize </em>around their ability to be validated, while we will <em>decorate </em>them with the <em>Validators</em> that interest us.  This is important, as we wouldn&#8217;t want to have 20 different TextBox implementations that handle various <em>Validation</em> permutations.  We would rather one, <em>decoratable</em> TextBox that can be managed by the presenter in our MVP implementation.  So what does our initial stab at a <em>ValidatableTextBox </em>look like?</p>
<p><strong>ValidatableTextBox</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.widget</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.user.client.ui.TextBox</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.Validatable</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.validator.DateFormatValidator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ValidatableTextBox <span style="color: #000000; font-weight: bold;">extends</span> TextBox <span style="color: #000000; font-weight: bold;">implements</span> Validatable <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> validate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		DateFormatValidator validator <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateFormatValidator<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mm/DD/yyyy&quot;</span>,
				getText<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">return</span> validator.<span style="color: #006633;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wait, you say.  <em>This isn&#8217;t at all what you just described!  This is a text box that will only execute one validator for one date pattern! </em>Well, you&#8217;re right.  We need to find a way to enable decoration of our TextBox in a way that can be nicely tested and extensible.  GWT makes extensive use of decorator pattern, and really strives for testability.  We see this in the various <em>Has</em> interfaces, which are added to classes to give them additional behaviors (such as <em>HasText </em>or <em>HasClickHandler</em>).  So, we will follow suit and create our decorator interface <em>HasValidators.</em></p>
<p><strong>HasValidators</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> HasValidators <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Add a validator to the decorated component
	 *
	 * @param validator The validator to be added
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> addValidator<span style="color: #009900;">&#40;</span>Validator validator<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>And now our updated <em>ValidatableTextBox.</em></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.widget</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Set</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.user.client.ui.TextBox</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.HasValidators</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.Validatable</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.Validator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ValidatableTextBox <span style="color: #000000; font-weight: bold;">extends</span> TextBox <span style="color: #000000; font-weight: bold;">implements</span> Validatable, HasValidators <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Set</span> _validators<span style="color: #339933;">;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> addValidator<span style="color: #009900;">&#40;</span>Validator validator<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		_validators.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>validator<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> validate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">boolean</span> valid <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span>Validator validator <span style="color: #339933;">:</span> _validators<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> validator.<span style="color: #006633;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				valid <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> valid<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>So, that&#8217;s pretty sweet. I have a collection of <em>Validators</em> as a member of the component &#8211; in fact I have a set of them as to ensure no <em>Validator</em> exists more than once on the component.  My <em>validate</em> method now loops through the set of validators and maintains the local state of the validation, allowing the entire validation to fail if any one <em>Validator</em> fails.</p>
<p>A highly testable <em>passive view</em> implementation with this component may look something like:</p>
<p><strong>MySampleValidatableView</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * 
 */</span>
<span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.event.dom.client.HasKeyPressHandlers</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.user.client.ui.HasValue</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * @author ryan
 * 
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> MySampleValidatableView <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Get the {@link HasValidators} behavior of the date box.
	 * 
	 * @return a {@link HasValidators} behavior
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> HasValidators getDateValidators<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Get the {@link Validatable} behavior of the date box.
	 * 
	 * @return a {@link Validatable} behavior
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Validatable getDateValidatable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Return the {@link HasValue} behavior of the date box. This allows us to
	 * access the value of the control.
	 * 
	 * @return a {@link HasValue} behavior
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> HasValue<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span> getDate<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Return the {@link HasKeyPressHandlers} behavior of the date box. When the
	 * user types a key in the field, we will use this event to validate the
	 * current value;
	 * 
	 * @return
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> HasKeyPressHandlers getDateKeyUp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Toggle the visual state of the date box so the user receives feedback
	 * when their date is valid
	 * 
	 * @param valid
	 *            Whether or not the control should reflect a valid date entry
	 *            (true) or an invalid one (false)
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> toggleValidDateBox<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">boolean</span> valid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A lot going on here, and it&#8217;s seems verbose &#8211; but it&#8217;s not, it&#8217;s just highly testable!  We need to be able to access the various behaviors of our text box so that we can test how our presenter<em> collaborates </em>with these behaviors.  We also need to be able to push the passive display functionality back to our view implementation so that our unit tests don&#8217;t inadvertently require a hosted environment to run.  So our presenter needs to be built to:</p>
<ol>
<li>Create a <em>DateFormatValidator</em> with the appropriate pattern and a reference to the component holding the text value to validate;</li>
<li><em>Decorate</em> the component in the view through the <em>HasValidators</em> behavior;</li>
<li>Execute validation whenever the user changes the value of the widget through the <em>HasKeyPressHandlers</em> interface;</li>
<li>Alter the visual display of the component by calling the <em>toggleValidDateBox</em> method.</li>
</ol>
<p>So last but not least, our presenter:</p>
<p><strong>MySamplePresenter</strong></p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.event.dom.client.KeyPressEvent</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.event.dom.client.KeyPressHandler</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.ryannorris.gwt.validation.client.validator.DateFormatValidator</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> MySamplePresenter <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> MySamplePresenter<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> MySampleValidatableView view<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		DateFormatValidator validator <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DateFormatValidator<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mm/DD/yyyy&quot;</span>,
				view.<span style="color: #006633;">getDate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		view.<span style="color: #006633;">getDateValidators</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">addValidator</span><span style="color: #009900;">&#40;</span>validator<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		view.<span style="color: #006633;">getDateKeyUp</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">addKeyPressHandler</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> KeyPressHandler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onKeyPress<span style="color: #009900;">&#40;</span>KeyPressEvent event<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				view.<span style="color: #006633;">toggleValidDateBox</span><span style="color: #009900;">&#40;</span>view.<span style="color: #006633;">getDateValidatable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>So there you have it &#8211; a highly testable base for validation in a GWT application using MVP.</p>
<p>In my next post, I&#8217;ll add an event framework to validation, allowing asynchronous validation and abstraction between overall error handling and validation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2009/11/27/validation-in-gwt-with-mvp-and-patterns/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Does GWT Harkon the End of Javascript?</title>
		<link>http://www.ryannorris.com/2009/11/20/does-gwt-harkon-the-end-of-javascript/</link>
		<comments>http://www.ryannorris.com/2009/11/20/does-gwt-harkon-the-end-of-javascript/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 12:07:45 +0000</pubDate>
		<dc:creator>Ryan Norris</dc:creator>
				<category><![CDATA[Building Better Software]]></category>
		<category><![CDATA[Consulting]]></category>

		<guid isPermaLink="false">http://www.ryannorris.com/?p=109</guid>
		<description><![CDATA[Javascript isn&#8217;t going away. But neither are 1&#8242;s and 0&#8242;s.  But one has to wonder what type of project or team that was looking to grow and build web-based, rich-client applications would actively choose to use Javascript on it&#8217;s own now. For my part, there&#8217;s only so much patience I have taking on the burden [...]]]></description>
			<content:encoded><![CDATA[<p>Javascript isn&#8217;t going away.  But neither are 1&#8242;s and 0&#8242;s.  But one has to wonder what type of project or team that was looking to grow and build web-based, rich-client applications would actively choose to use Javascript on it&#8217;s own now.</p>
<p>For my part, there&#8217;s only so much patience I have taking on the burden of supporting multiple browsers and dealing with performance issues.  Particularly if I&#8217;m Agile, and I&#8217;m focusing on delivering so much value so quickly, it&#8217;s very hard to explain to a client that the underlying technology creates significant overhead that adds drag to the project.  This is an even tougher sell &#8211; particularly when you&#8217;re open with your client, when alternatives that meet the non-functional needs exist.</p>
<p>For your standard web applications that aren&#8217;t as client-centric as today&#8217;s RIA applications, it&#8217;s certainly true that you are barking up the wrong tree with GWT.  Rails, Grails, and Zend can all give you the non-enterprise delivery tools that accelerate development from the server-side and leave the Javascript problem to be solved in a less holistic, more tactical way.</p>
<p>But it&#8217;s hard to argue now that anything short of the compilation semantics of GWT is useful in the RIA realm (without the need for a intermediate runtime, of course.)  Javascript is too costly and too brittle in large-scale applications to be subject to human hands.  If you&#8217;ve hired a contractor to build you a web-based RIA and they&#8217;re not using GWT &#8211; it&#8217;s well worth your wallet to ask them why.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ryannorris.com/2009/11/20/does-gwt-harkon-the-end-of-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
