<?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>Cloudspace &#124; Blog &#187; agile development</title>
	<atom:link href="http://www.cloudspace.com/blog/category/agile-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cloudspace.com/blog</link>
	<description>All things cloudspacious</description>
	<lastBuildDate>Mon, 16 Jan 2012 22:58:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>How to build a Lean product and UX (with examples)</title>
		<link>http://www.cloudspace.com/blog/2011/07/20/how-to-build-a-lean-product-and-ux-with-examples/</link>
		<comments>http://www.cloudspace.com/blog/2011/07/20/how-to-build-a-lean-product-and-ux-with-examples/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 17:41:11 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[product development]]></category>
		<category><![CDATA[user experience]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=1087</guid>
		<description><![CDATA[I&#8217;m a big fan of the Lean philosophy for building things: businesses, products, user experiences, software, etc. This is one of the reasons I help organize the Lean Coffee meeting in SF (Tuesday mornings, come out and join!) Simple prototypes &#8230; <a href="http://www.cloudspace.com/blog/2011/07/20/how-to-build-a-lean-product-and-ux-with-examples/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a big fan of the Lean philosophy for building things: businesses, products, user experiences, software, etc. This is one of the reasons I help organize the <a href="http://www.meetup.com/Lean-Coffee/" target="_blank">Lean Coffee meeting in SF</a> (Tuesday mornings, come out and join!) Simple prototypes can be used to test things, rather than building a complete first version to validate an idea (which produces Waste, which Lean is designed to avoid).</p>
<p>This is why I&#8217;m so pleased to see my friends at Lumatic (the company formerly known as <a href="http://www.omniar.com/" target="_blank">Omniar</a>) taking advantage of this for their product and UX.</p>
<p style="text-align: center;"><a href="http://www.cloudspace.com/blog/wp-content/uploads/2011/07/lumatic1.jpeg"><img class="aligncenter size-full wp-image-1089" style="border: 1px solid black;" title="lumatic" src="http://www.cloudspace.com/blog/wp-content/uploads/2011/07/lumatic1.jpeg" alt="" width="320" height="491" /></a></p>
<p>They built <a href="http://demo.lumatic.com/" target="_blank">a static HTML version of the product</a> that simulates many of the user interactions and the interface. At the end, they use a free survey from SurveyMonkey to collect feedback. Even better, they&#8217;re building a mobile app, and have still prototyped using HTML.</p>
<p>This is a great way of collecting thoughts from users, instead of only sitting down with users one-on-one (which they&#8217;re also doing). They can find out if there are missing features, or if people are interested in the features that are there.</p>
<p>I&#8217;ve seen other effective prototypes done using paper &#8212; if you&#8217;re going to be collecting information from users that might have privacy implications, you can test out resistance to it with a sheet of paper (or another free SurveyMonkey form). Another startup gave potential users a small notebook to see if they would write their thoughts during the day on a subject (which simulated a part of their upcoming product).</p>
<p>Figure out what&#8217;s most risky in your new venture, then find a way of cheaply testing it so you can reduce the risk. Feel free to discuss in the comments, or email me if you have questions &#8212; tim @ cloudspace.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2011/07/20/how-to-build-a-lean-product-and-ux-with-examples/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Patching with &#8220;git format-patch&#8221; and &#8220;git am&#8221;</title>
		<link>http://www.cloudspace.com/blog/2010/07/14/patching-with-git-format-patch-and-git-am/</link>
		<comments>http://www.cloudspace.com/blog/2010/07/14/patching-with-git-format-patch-and-git-am/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 17:30:09 +0000</pubDate>
		<dc:creator>michaelorr</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[bugfix]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=727</guid>
		<description><![CDATA[Why Patch? Sometimes you just have to do it live! Sometimes a fix is so crucial that you head directly to the production server, edit the code, save the file, and restart the server. It&#8217;s not an ideal situation but &#8230; <a href="http://www.cloudspace.com/blog/2010/07/14/patching-with-git-format-patch-and-git-am/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Why Patch?</strong></p>
<p>Sometimes you just have to do it live! Sometimes a fix is so crucial that you head directly to the production server, edit the code, save the file, and restart the server. It&#8217;s not an ideal situation but it happens. Most of the time, the fix is pretty small and you can just go to your local repository after things are fixed on the live server and remake the changes to your code base and commit them. When the fix is more complex, you may want to commit the code on your production server and create a patch to apply your changes to the code in the repository. If your repository is in <a href="http://git-scm.com/">git</a>, here are some instructions on how to use &#8216;<a href="http://www.kernel.org/pub/software/scm/git/docs/git-format-patch.html">git format-patch</a>&#8216; and &#8216;<a href="http://www.kernel.org/pub/software/scm/git/docs/git-am.html">git am</a>&#8216; to bring everything back in sync.</p>
<p>Patching can be useful for more than just hot fixes.  Sometimes you don&#8217;t need to work on a live server, you just want to and by &#8220;live&#8221; I mean on an actual server just like the production box instead of your local machine. This can be very useful for anything from starting a new project to working on v2 of an enormous live system. Rather than mess with a local copy of the code (and trying to get some advanced technology working on your mac) or trying to configure a virtual machine (or several) to let you interact with a duplicate environment of what your production server will be, you can just build the server, deploy to it once and edit in place. You don&#8217;t have to worry about differences between when your development and production environments when you are working on an exact copy of the production system.  You can just make changes to the code and restart the application to see them. Of course you&#8217;ll want to commit your work regularly and make sure to get it into the repository. You can do this by creating patches with git as well.</p>
<p><strong>Can you follow these instructions? </strong></p>
<p>Go to your local repository, make sure you are on your master branch, &#8216;git pull&#8217; to make sure you have all recent changes and view &#8216;git log&#8217; to find the ID of your latest commit. Save this value for later. Hopefully all of these commits have already been deployed to production, let&#8217;s check. Go to the production server and go into your project&#8217;s current folder and view &#8216;git log&#8217;. If your production server has all of the same commits then you are good to go. It is okay if the production server has more commits because you&#8217;ve already committed the new code on the production server, as long as they are all after the commits that are in your local repository. If you have extra commits on the master branch of your local repository these instructions will not work exactly as printed, take some time to read up on git am and git format-patch though and you can figure it out. (Try keeping your work off the master branch and only merge your working branches back into the master when you are ready to deploy.)</p>
<p><strong>Patching Instructions</strong></p>
<p>Step 1) Commit Code on Production Box First, go ahead and commit the changes you made to the code on the deploy branch on the production server if you haven&#8217;t already. You can commit it all at once, or split it into multiple commits if that makes more sense for the changes you have made. For the sake of this demo we&#8217;ll say that you put everything into one commit with the commit message &#8220;my fix&#8221; which is a horrible commit message but works great for example purposes.</p>
<pre style="font-size: smaller; margin-left: 25px;">git commit -m "my fix"</pre>
<p>Step 2) Create Patches On the production server go into your application&#8217;s current directory. Using the ID of the last commit you have in your local repository run the command to create the patches.</p>
<pre style="font-size: smaller; margin-left: 25px;">git format-patch LAST_LOCAL_COMMIT_ID
(*replacing the LAST_LOCAL_COMMIT_ID with the value saved before
 -- should look like 48aa02be08fd5f2ed641b50f5611b968ff2699a7)</pre>
<p>This tells git to create a patch file for each commit that happened since the specified commit. With our one commit, this would create one file named &#8217;0001-my-fix.patch&#8217;</p>
<p>Step 3) Get Patches Now download the patches to your local computer with your protocol of choice (scp, sftp, etc) and put them in the root directory of your local repository.</p>
<p>Step 4) Run Patches Go into your local repository and run the patches</p>
<pre style="font-size: smaller; margin-left: 25px;">git am -s 0001-my-fix.patch
(*replacing 0001-my-fix.patch with the correct file name)</pre>
<p>Path files tend to be named starting with ordered numbers (0001, 0002, etc) so if you made multiple commits on the production server, you may need to run multiple patch files. You can run them each individually or you can run them all at once like so</p>
<pre style="font-size: smaller; margin-left: 25px;">git am -s 0*
(*assuming no other files in the directory start with a 0 [zero])</pre>
<p>Step 5) Push Patched Commits to Remote Branch</p>
<p>Now the commits have been applied to your local repository and you need to push them to the remote.</p>
<pre style="font-size: smaller; margin-left: 25px;">git push origin master</pre>
<p>Ta-da! Now the repository is back in sync with the code actually running on the server.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Enhanced by Zemanta" href="http://www.zemanta.com/"><img class="zemanta-pixie-img" style="border: none; float: right;" src="http://img.zemanta.com/zemified_e.png?x-id=c4bff88b-cb4e-401f-a5ef-0c109edd2baf" alt="Enhanced by Zemanta" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/07/14/patching-with-git-format-patch-and-git-am/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How We Got Pair Programming Wrong</title>
		<link>http://www.cloudspace.com/blog/2010/03/24/how-we-got-pair-programming-wrong/</link>
		<comments>http://www.cloudspace.com/blog/2010/03/24/how-we-got-pair-programming-wrong/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 20:46:04 +0000</pubDate>
		<dc:creator>Todd Sampson</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[cloudspace]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[Pair Programming]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Training]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=655</guid>
		<description><![CDATA[We admit it, Cloudspace made a mistake. We got pair programming wrong. We did it with the best of intentions, but our plan completely backfired. Let me explain&#8230; We have been using versions of Agile Development at Cloudspace for most &#8230; <a href="http://www.cloudspace.com/blog/2010/03/24/how-we-got-pair-programming-wrong/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>We admit it, <a title="Cloudspace Website" href="http://cloudspace.com">Cloudspace</a> made a mistake.  We got pair programming wrong.  We did it with the best of intentions, but our plan completely backfired.  Let me explain&#8230;</p>
<p>We have been using versions of <a class="zem_slink" title="Agile software development" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://en.wikipedia.org/wiki/Agile_software_development');" rel="wikipedia" href="http://en.wikipedia.org/wiki/Agile_software_development">Agile Development</a> at Cloudspace for most of our 13 year history — even before it had a formal name.  However, we didn’t implement pair programming, or <a class="zem_slink" title="Extreme Programming" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://en.wikipedia.org/wiki/Extreme_Programming');" rel="wikipedia" href="http://en.wikipedia.org/wiki/Extreme_Programming">extreme programming</a> (XP) as it is sometimes called, at the company until more recently.  One of the driving factors for moving to pair programming was the rapid growth of our business working with tech startups.  In order to serve these clients, we needed to grow the team rapidly.  As we started discussing options, implementing pair programming came up.  Pairing junior developers with more senior developer on the team to mentor them through on the job training sounded like a good idea.  In fact, we thought this was so much of a good move that we carved out specific team roles for Jr. Developers and Pair Leads.</p>
<p>Guess what?  It didn’t work.</p>
<p>The “Pair Leads” got frustrated trying to bring the junior guys, good developers with Comp-Sci degrees and industry experience, up to speed on our system of development.  And the junior guys weren’t learning half as fast as we hoped.  In fact, they weren’t learning half as fast as they did with the old non-pair programming system.  We tried a few things to improve the process overall, but nothing seemed to work.  Unfortunately, compared to computer systems, debugging people issues are very hard.  But sometimes, you guys get lucky.</p>
<p>In a conversation last week, Steven Covey’s book <a class="zem_slink" title="The 7 Habits of Highly Effective People" onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.amazon.com/Habits-Highly-Effective-People/dp/0743269519%3FSubscriptionId%3D0G81C5DAZ03ZR9WH9X82%26tag%3Dzemanta-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0743269519');" rel="amazon" href="http://www.amazon.com/Habits-Highly-Effective-People/dp/0743269519%3FSubscriptionId%3D0G81C5DAZ03ZR9WH9X82%26tag%3Dzemanta-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0743269519">The 7 Habits of Highly Effective People</a> came up.  I can’t remember how or why this came up, but I’m glad it did.  The person I was talking with said that they tried to read the book but gave up because it felt dated.  I hadn’t read the book since business school, but could still remember quite a bit of subject matter.  I started spouting them off a few of the habits (as best I remembered them):</p>
<blockquote><p>Sharpen the saw.</p></blockquote>
<blockquote><p>Seek first to understand, then to be understood.</p></blockquote>
<p>Then I said:</p>
<blockquote><p>In order to be interdependent, you must first be independent.</p></blockquote>
<p>I said it and I just froze.  That was it!  We were trying to throw junior guys who were not first independent working in the Cloudspace system into a pairing relationship which requires two highly effective developers to work interdependently.  We totally blew it and now I knew why.</p>
<p>When used properly with skilled engineers you can’t beat pair programming for solving hard problems; creating high quality code; and, as Covey would said, making 1 + 1 = 3.  But it is absolutely the wrong way to get junior developers trained.</p>
<p>Hindsight being 20/20, I now see the two types of pairing as 180 degrees from each other.  When highly effective developers pair program the conversation is around system performance, best practices, tech trends — discussions of craft which often break into passionate arguments about the best way to achieve an objective.  When one of the developers is not yet up-to-speed, the discussion is completely different and easy to spot.  This type of pairing primarily involves discussion of syntax, improving skills, following processes &amp; procedures, “let me do that for you to save time.”  Basically, anything but craft is discussed.  Yes, pair programming helps keep the developers focused and catch errors at every skill level.  But I no longer believe that this is worth using pairing as a form of training.</p>
<p>So where do we go from here?  At Cloudspace we are now re-tooling our training (we have some very cool stuff in the works on this front), ongoing developer development, and career paths.  New recruits will go through training and then work independently on simple projects that really shouldn’t need pairs — all while receiving a high level of feedback; especially in the form of code reviews.  They will only graduate to pair programming after they have demonstrated a basic level of mastery of their craft.  (One member of the team has suggested that we bring developers into a dark room with tiki torches and read their fate from slips of paper written by senior developers Survivor style; but we aren’t there quite yet.)</p>
<p>Overall, we think that Cloudspace will be much better for making the change.  And, as always, we wanted to share our thinking and screw-ups as publicly as possible so that everyone else can learn from our mistakes.  Hope this one helps.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/03/24/how-we-got-pair-programming-wrong/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>On Getting Started</title>
		<link>http://www.cloudspace.com/blog/2010/02/25/on-getting-started/</link>
		<comments>http://www.cloudspace.com/blog/2010/02/25/on-getting-started/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 20:48:11 +0000</pubDate>
		<dc:creator>michaelorr</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubyonrails]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[Comic book]]></category>
		<category><![CDATA[Comics]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=631</guid>
		<description><![CDATA[I wanted to build an application where I could log my comic book reading habits to replace the paper system I was using. I had been mulling the idea over and just talking about various aspects with people for a &#8230; <a href="http://www.cloudspace.com/blog/2010/02/25/on-getting-started/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I wanted to build an application where I could log my comic book reading habits to replace the paper system I was using. I had been mulling the idea over and just talking about various aspects with people for a month or two. On the second time I started to talk to Corey about my idea, I asked him what he thought about which user authentication gem I should use.</p>
<p>“Don’t worry about it. Start. Begin,” he replied.</p>
<p>He was right. I had made a classic mistake and in doing so I was ignoring <a href="http://www.cloudspace.com/howwework.php">our work processes</a> with my own pet project idea.  I had &#8216;gone huge&#8217; with the idea from the very beginning.  I was planning user accounts, graphs, how to handle variant covers (a recent favorite variant for <a href="http://www.mycomicshop.com/comicbooks/item?IID=19783588">Green Lantern 51</a>), and complex relationships for keeping a single master library of existing comic issues that would be separate from each user’s collection and reading log. Don&#8217;t get me wrong, it is good to be passionate about your idea and to know what challenges may be in your future but do not let that get in the way of getting your project going. Start small. Do the simplest thing possible. Constantly adapt your plans to your application&#8217;s needs. Be Agile.</p>
<p>That day I stopped mulling about things like how to order numbers that sometimes had letters on the end (see <a href="http://www.mycomicshop.com/comicbooks/item?IID=9019951">Batman 700U</a>) and took my project agile. I started by building the simplest thing possible. I got going with no users, just an entry form with blank fields for comic title, issue number and date.  Since then I’ve added a pop-up date selector, notes fields, the ability to enter ranges at one time, different collection views and a few other features. It has been almost a month but I’ve only worked on my application for 15-20 hours, at least 10 of them in the last couple of days.  The ComicReads application is usable. It rocks! You could clone <a href="http://github.com/imightbeinatree/comicreads">the ComicReads github repo</a>, rake create &amp; migrate your database, run ‘script/server’, and be ready to log your own collection but I don&#8217;t expect you to do so.</p>
<p>The most exciting part is that I have stopped logging my comic reading on notecards this past weekend and am now exclusively using my new application on my virtual machine. I haven’t added users yet, switched to mysql or solved several sticky issues— but I’m on my way. By starting with the  features I needed— the ability to log the simplest and most essential parts of my comic book reading— I’ve made my project more exciting. Now that I have a working version, I find myself trying to work on it more and more. One day I will add user support, grab a URL, get a better design, and throw the system up for public use. Not this week though, I&#8217;ve got too much else to do.</p>
<p>Go ahead and get started. Begin! Throw out the users, forget connecting your application to twitter or facebook accounts, don’t worry about which database you are going to need, just go for it. Start by solving the problems that make your application interesting.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/89380253-21fc-4408-9489-e11386983b68/"><img class="zemanta-pixie-img" style="border: none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=89380253-21fc-4408-9489-e11386983b68" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/02/25/on-getting-started/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Principle #5: A team of motivated individuals</title>
		<link>http://www.cloudspace.com/blog/2009/09/08/agile-principle-5-a-team-of-motivated-individuals/</link>
		<comments>http://www.cloudspace.com/blog/2009/09/08/agile-principle-5-a-team-of-motivated-individuals/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 12:58:47 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[trust]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=523</guid>
		<description><![CDATA[Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done. This Agile principle is such good business advice, I could approach it from many other non-Agile directions. It almost &#8230; <a href="http://www.cloudspace.com/blog/2009/09/08/agile-principle-5-a-team-of-motivated-individuals/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Build projects around motivated individuals.<br />
Give them the environment and support they need,<br />
and trust them to get the job done.</p></blockquote>
<p>This Agile principle is such good business advice, I could approach it from many other non-Agile directions. It almost transcends business and applies to all human endeavors.</p>
<p>Starting with the motivation issue. Larry Bossidy, one of the world&#8217;s top CEOs, says that when hiring, a person with absolute determination to succeed will always do better than someone with a high IQ and elite education who is cruising.</p>
<p>Approaching this from a different direction, I recently read a football coaching book, and one of NCAA coaches who contributed to the book said that given the choice between a player with solid technique and a player who is 100% motivated, he will pick the motivated player 9 out of 10 times. This advice is coming from a top performer in an industry that is incredibly well-scrutinized with clear outcomes and performance metrics. This gives me good reason to trust it.</p>
<p>So, speaking of trust, let&#8217;s move to that. I think that motivation can be universally agreed on as valuable, and if you don&#8217;t believe me, you&#8217;re probably not motivated enough to post a comment and debate it. <img src='http://www.cloudspace.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Trust is tricky. A favorite Warren Buffet quote of mine is that &#8220;it takes 20 years to build a reputation and five minutes to ruin it.&#8221; How can you quickly decide if a team is trustworthy? Of course we&#8217;ve all got markers for trust, but I think that a track record of similar and successful projects is a good place to start developing trust. If you can get access to the person who filled the &#8220;product guy&#8221; or client roles, ask them how they felt the team handled it. Did they feel that the team made intelligent decisions, but kept the client in the loop? Most importantly, did the team provide good value for the dollar spent?</p>
<p>Another thing that can help identify trustworthy people is talking directly to them. Are their answers clear and specific, or vague and filled with jargon? Do they make an effort to understand the client&#8217;s business and perspective, or do they insist on a particular solution no matter what the context?</p>
<p>Since trust is something that naturally has to build over time, don&#8217;t wait for 100% trust. If you&#8217;re always waiting for the perfect conditions, you&#8217;ll never get anything done. Jump in and give them a shot. This is one place where Cloudspace takes advantage of fast delivery and iterative development. Our process is based off single weeks of work. Of course, we&#8217;d love to work with you for several months, but if you have 10 weeks of work, start off for a week or two and see if you&#8217;re happy. Our clients are free to leave at any point, so this makes for an environment where we consistently perform and deliver. It also makes for an incredibly simple contract.</p>
<p>The last parts of this principle relate to the environment and support. I think this primarily involves internal teams, although a smooth client relationship is always helped when the client trusts the technology decisions and doesn&#8217;t second guess how things are constructed. There&#8217;s a balance between understanding the infrastructure and guiding the project, versus micromanaging and dictating. If you were going for surgery, you wouldn&#8217;t tell the doctor to use a #5 scalpel because you read an article on WebMD. You&#8217;d ask the doctor what is going on, expect clear and intelligent answers, then give the doctor space to work.</p>
<p>With respect to internal teams: Cloudspace helps create a healthy environment for our engineers by treating them both as engineers whose skills need to be kept current, and as human beings who have higher needs (think Maslow&#8217;s hierarchy). Because we treat our people well, our clients get great results from them.</p>
<p>To keep technical skills sharp and communication healthy, we have daily standups that last about 15 minutes where everyone gets a turn to share what they did since yesterday&#8217;s standup, and anything new they learned. We have weekly &#8220;hack sessions&#8221; where we review a new technology, or spend time cross-training (teaching things that are immediately relevant to our projects). We constantly talk to people and make sure they are happy with the progress of their project, and to identify things that may limit progress. We&#8217;re all in a private IRC channel so that we can instantly tap collective team knowledge, or jump to a public channel and tap the knowledge of the community.</p>
<p>Also, good milk comes from happy cows (I know this; I saw them gazing out at the ocean at Point Reyes a few weeks ago in California before eating some of the amazing cheese their milk produced at Cowgirl Creamery). We have team outings where we&#8217;ll go out for beers, bowling, laser tag, go-karting, or a movie. We have a comfortable dress code &#8212; sandals and shorts are common in our Florida summers &#8212; but we still respect our clients enough to put on a collar to greet them. Since we pair program our Agile projects and have to communicate, we don&#8217;t wear headphones, but it&#8217;s typical to trade off on choosing music to put on the speakers (I personally love <a href="http://www.pandora.com">Pandora</a>, <a href="http://listen.grooveshark.com/">Grooveshark</a>, and <a href="http://hypem.com">The Hype Machine</a>).</p>
<p>All of these things add up to a lean and effective team that has what it needs to execute client strategy and deliver great code. We trust our engineers to do a great job &#8212; we don&#8217;t micromanage them. Our turnover is virtually zero and we&#8217;re proud of it. That&#8217;s the value of a good environment and healthy support.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/09/08/agile-principle-5-a-team-of-motivated-individuals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Principles #4: Product Owner and Engineer relationships</title>
		<link>http://www.cloudspace.com/blog/2009/08/31/agile-principles-4-product-owner-and-engineer-relationships/</link>
		<comments>http://www.cloudspace.com/blog/2009/08/31/agile-principles-4-product-owner-and-engineer-relationships/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 16:53:28 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[team cloudspace]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[engineers]]></category>
		<category><![CDATA[product owners]]></category>
		<category><![CDATA[Project management]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=508</guid>
		<description><![CDATA[Time for Agile principle number four, where we talk about the relationship between product owner and engineer: Business people and developers must work together daily throughout the project. In the post on agile principle number two, I gave the example &#8230; <a href="http://www.cloudspace.com/blog/2009/08/31/agile-principles-4-product-owner-and-engineer-relationships/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Time for Agile principle number four, where we talk about the relationship between product owner and engineer:</p>
<blockquote><p>Business people and developers must work<br />
together daily throughout the project.</p></blockquote>
<p>In the post on <a href="http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/">agile principle number two</a>, I gave the example of a Secret Santa management system, as an example of how being able to accommodate changing requirements can benefit a project. As a refresher, here&#8217;s the key story points of the project:</p>
<ul>
<li> A user should be able to sign up</li>
<li>A user should be able to log in</li>
<li>A user should be able to get a recipient assigned</li>
<li>A user should be able to add notes to their recipient</li>
<li>There should be an &#8220;Add Amazon product&#8221; link that searches on Amazon</li>
<li>There should be a &#8220;Buy on Amazon&#8221; button</li>
</ul>
<p>I&#8217;m going to reuse this example to show the value of business people working closely with developers. You can refer to <a href="http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/">the original blog post</a> if you like. I&#8217;m going to be counting the number of product owner-engineering interactions in the Agile scenario:</p>
<ol>
<li> Meeting with the dev team to decide that sign up and login functionality are essential</li>
<li>Being notified of the sign up and login completion/deployment</li>
<li>Verifying sign up and login</li>
<li>Being notified of the recipient selection completion/deployment</li>
<li>Verifying recipient selection</li>
<li>Being notified of the notes completion/deployment</li>
<li>Verifying notes</li>
<li>Having developers stop work</li>
</ol>
<p>That&#8217;s 8 different product manager-engineer interactions, and this is a tiny hypothetical product &#8212; we only did 4 story points! This doesn&#8217;t include questions or clarifications that inevitably come up in all projects while the developers are at work. You show me a client that thinks it&#8217;s okay for each of these interactions to wait for the weekly (or longer) review and I&#8217;ll show you a client who is overpaying for bored developers.</p>
<p>So what if you&#8217;re concerned that these interactions suck up time? Given that other than planning meetings (which occur in waterfall too) the interactions generally last 30 seconds for a quick question or notification, or 5-15 minutes for verification. I&#8217;ve never met a client who was too busy for this. Also these frequent interactions give you frequent input. That lets you guide your project &#8212; think about driving a car that you can only steer every 30 seconds. It&#8217;s worth it.</p>
<p>This is actually one area where Cloudspace adds it&#8217;s own flavor to Agile. Pure Agile processes mean an onsite customer, working as a product manager full time. We realize that when working with startups, they don&#8217;t always have the time or resources to devote a full person to being available immediately. So we give our clients flexibility. We find out why the software is valuable and what the business goals are so that we can make good decisions if we reach a point where the product manager is unavailable but we need to move forward. Of course, sometimes the good decision is to hold off on one ticket and be productive on another. Clients are always consulted on key decisions. We&#8217;re also good at batching these interactions into the daily meetings &#8212; a 15 minute meeting or email where we update the client on the day.</p>
<p>From the developer side of things, having easy access to answers is great. There&#8217;s nothing worse than trying to guess how an entire feature should work, and then having to rewrite the whole feature due to a difference in perspectives. Remember: happy engineers are productive engineers.</p>
<p>Speaking of happy engineers and productive engineers, in my next post we&#8217;ll be talking about the 5th principle of Agile: trusting a team of motivated engineers.</p>
<p>P.S.  If you are one of those rocking motivated engineers, <a href="http://www.cloudspace.com/careers.php">Cloudspace is hiring!</a></p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/a53d885a-4386-4726-b517-565250bb8eb0/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=a53d885a-4386-4726-b517-565250bb8eb0" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/08/31/agile-principles-4-product-owner-and-engineer-relationships/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mashable Impressed by Tweetpo.st</title>
		<link>http://www.cloudspace.com/blog/2009/07/23/486/</link>
		<comments>http://www.cloudspace.com/blog/2009/07/23/486/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 15:07:38 +0000</pubDate>
		<dc:creator>Theresa Sampson</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[Facebook Connect]]></category>
		<category><![CDATA[Mashable]]></category>
		<category><![CDATA[Tweetpo.st]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=486</guid>
		<description><![CDATA[This week Mashable featured Tweetpo.st on their &#8220;10 Impressive New Implementations of Facebook Connect&#8221; list.]]></description>
			<content:encoded><![CDATA[<p>This week Mashable featured <a href="http://www.tweetpo.st">Tweetpo.st</a> on their <a href="http://mashable.com/2009/07/21/facebook-connect-new/?utm_campaign=snowball&amp;utm_content=site-basic&amp;utm_medium=awe.sm-twitter&amp;utm_source=twitter.com">&#8220;10 Impressive New Implementations of Facebook Connect&#8221;</a> list.</p>
<p><img class="aligncenter size-full wp-image-485" title="Tweetpo.st" src="http://www.cloudspace.com/blog/wp-content/uploads/2009/07/tweetpost.jpg" alt="Tweetpo.st" width="490" height="361" style="border:1px solid black"></p>
<div class="zemanta-pixie" style="margin-top:10px;height:15px"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/6d2596f5-7c22-4e59-922b-f839ae2ac7ed/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=6d2596f5-7c22-4e59-922b-f839ae2ac7ed" alt="Reblog this post [with Zemanta]" style="border:none;float:right"></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/07/23/486/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Replacing Ruby&#8217;s URI with Addressable</title>
		<link>http://www.cloudspace.com/blog/2009/05/26/replacing-rubys-uri-with-addressable/</link>
		<comments>http://www.cloudspace.com/blog/2009/05/26/replacing-rubys-uri-with-addressable/#comments</comments>
		<pubDate>Tue, 26 May 2009 15:22:29 +0000</pubDate>
		<dc:creator>michaelorr</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubyonrails]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[RubyGems]]></category>
		<category><![CDATA[Standard library]]></category>
		<category><![CDATA[Uniform Resource Identifier]]></category>
		<category><![CDATA[Uniform Resource Locator]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=476</guid>
		<description><![CDATA[Corey and I have been seriously tearing apart some URLs in our recent work and found that the standard URI library in ruby just wasn&#8217;t cutting it. It didn&#8217;t parse and merge exactly like we expected, sometimes even dropping parts &#8230; <a href="http://www.cloudspace.com/blog/2009/05/26/replacing-rubys-uri-with-addressable/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Corey and I have been seriously tearing apart some URLs in our recent work and found that the <a href="http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/">standard URI library in ruby</a> just wasn&#8217;t cutting it.  It didn&#8217;t parse and merge exactly like we expected, sometimes even dropping parts of the URL. It also had problems handling special characters in URLs like these: ™ ‘ ’ ° ®.  We found the <a href="http://github.com/sporkmonger/addressable/tree/master">Addressable</a> ruby gem from <a href="http://sporkmonger.com/">sporkmonger</a> on git hub. From the description it sounded like exactly what we needed, &#8220;Addressable is a replacement for the URI implementation that is part of Ruby&#8217;s standard library. It more closely conforms to the relevant RFCs and adds support for IRIs and URI templates.&#8221;</p>
<p>We took a look at the <a href="http://addressable.rubyforge.org/api/">documentation</a> and the library seemed to implement the same functionality as ruby&#8217;s standard library and then some.  It even supports <a href="http://en.wikipedia.org/wiki/Punycode">punycode</a>!  We installed the gem and tested it in irb with the URLs that had given us problems.  It worked perfectly.</p>
<p>For the most part, just config the gem in your environment.rb file and append &#8220;Addressable::&#8221; before any instance of &#8220;URI.&#8221; in your code.  Instead of &#8220;URI.parse(url)&#8221; you&#8217;ll now have &#8220;Addressable::URI.parse(url)&#8221;.  But be sure to take a glance at the documentation because there are a few methods that don&#8217;t exist one-to-one in the libraries.  For example: instead of calling URI.decode you would call Addressable::URI.unencode.&#8217;</p>
<p>We decided to run a test using ruby&#8217;s built in <a href="http://www.ruby-doc.org/core/classes/Benchmark.html">Benchmark library</a> and compare the parse methods in each since that was the method used most often in our code.  We started by requiring all the neccessary bits and whipping up an array of 1 million random URLs.</p>
<pre>array = (1..1000000).map {
  "http://cloudspace.com/#{rand}?#{rand}=#{rand}\##{rand}"
 }

require 'rubygems'
require 'uri'
require 'addressable/uri'</pre>
<p>Then here is the code to run the benchmark:</p>
<pre>Benchmark.bmbm do |x|
  x.report("uri") { array.each { |u| URI.parse(u) } }
  x.report("add") { array.each { |u| Addressable::URI.parse(u) } }
end</pre>
<p>And here is the result (the values are in seconds):</p>
<pre>Rehearsal ---------------------------------------
uri  65.660000  23.670000  89.330000 ( 97.630597)
add 128.030000  22.270000 150.300000 (161.927209)
---------------------------- total: 239.630000sec

          user     system      total        real
uri  65.170000  23.140000  88.310000 ( 93.674252)
add 127.920000  22.600000 150.520000 (166.662719)</pre>
<p>With a little bit of math on our own</p>
<table style="width: 400px; text-align: left; margin-left: 20px; margin-bottom: 20px;" border="0">
<caption style="font-weight: normal;">Average Computation Time Per URL over 1 million URLs</caption>
<tbody>
<tr>
<th style="font-weight: normal; text-align: left;">URI.parse</th>
<td>0.093674252 ms</td>
</tr>
<tr>
<th style="font-weight: normal; text-align: left;">Addressable::URI.parse</th>
<td>0.166662718 ms</td>
</tr>
</tbody>
</table>
<p>Addressable takes almost twice as long as URI to parse the URLs.  In our case, the time difference is still a minimal concern considering the benefits of having the URLs parsed to the more modern RFC.  So we went for it and it is working great for us!  Thanks Sporkmonger!</p>
<div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/ac88a30b-8ed7-4be4-9498-f1222f41e12b/" title="Reblog this post [with Zemanta]"><img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=ac88a30b-8ed7-4be4-9498-f1222f41e12b" alt="Reblog this post [with Zemanta]"></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/05/26/replacing-rubys-uri-with-addressable/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Agile Principles #3 &#8211; Be Quick</title>
		<link>http://www.cloudspace.com/blog/2009/04/29/agile-principles-3-be-quick/</link>
		<comments>http://www.cloudspace.com/blog/2009/04/29/agile-principles-3-be-quick/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 04:17:07 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[requirements]]></category>
		<category><![CDATA[verification]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=439</guid>
		<description><![CDATA[My last two posts have both had the word &#8220;dodeca-thalon&#8221; in the first paragraph. Dodecathalon means a series of 12 things. Those 12 things are the 12 Agile Principles. So far I&#8217;ve covered the first two. If you haven&#8217;t read &#8230; <a href="http://www.cloudspace.com/blog/2009/04/29/agile-principles-3-be-quick/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>My last two posts have both had the word &#8220;dodeca-thalon&#8221; in the first paragraph. Dodecathalon means a series of 12 things. Those 12 things are the <a href="http://agilemanifesto.org/principles.html">12 Agile Principles</a>. So far I&#8217;ve covered the <a href="http://www.cloudspace.com/blog/2009/03/02/agile-manifesto-principles/">first</a> <a href="http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/">two</a>. If you haven&#8217;t read them, please do. And then, read this one, #3.</p>
<blockquote><p>Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.</p></blockquote>
<p>As I mentioned with the last principle, we welcome change. We count on change happening, and we use it, Judo-style, to our advantage. But, part of the success to navigating change is feedback. You need quick feedback. And, when you&#8217;re developing software, feedback comes from delivery.</p>
<p>In my last post, I used the <a href="http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/">example of a project whose requirements changed midstream</a>, and as a result, was able to be delivered under time and under budget. The requirements were able to be changed because the software was delivered throughout the project.</p>
<blockquote><p>&#8220;They add the recipient selection feature, which takes a day, and then the notes feature, which also takes a day. Of course, they&#8217;ve deployed the entire project for your verification after each of these steps&#8221;</p></blockquote>
<p>This demonstrates two other advantage of frequent deliveries.</p>
<ol>
<li>Verification</li>
<li>Usage</li>
</ol>
<h3>Verification</h3>
<p>Although I manage the Agile team at Cloudspace, I spend most of my time writing code. I will tell you from experience that the best time to verify that something was done correctly is right after the developer has finished the ticket. Even with well-written and documented code, the benefit of having that portion of the system fresh in the developer&#8217;s mind saves you on restart/context switch costs, however small they may be. Frequent deployment lets you verify changes during this golden period. I&#8217;ve heard of some clients verifying a feature months (even years!) after the code was written &#8212; it&#8217;s not pretty. If you&#8217;re paying for the development work, you want to verify things ASAP.</p>
<h3>Usage</h3>
<p>Let&#8217;s say your development team finishes the login/registration system on an internal company app first. Great! Now you&#8217;re free to go ahead and create accounts for everyone at your company. You&#8217;ve got to do it anyways; may as well do it in parallel with development. The same number of man-hours will be used, but the system will overall be usable in less calendar-hours. Plus, by using that part of the system, *you&#8217;re verifying that it works!* Awesome! You know it will make sense and work for the end user. Can&#8217;t do that if the code is sitting on a development server or in a version control system.</p>
<p>At Cloudspace, we facilitate frequent delivery by starting with existing base functionality, and deploying to a production server as soon as possible in the app lifecycle &#8212; usually within the first two days. Even if you don&#8217;t have a domain ready, we make sure you&#8217;re able to start moving through the app; I&#8217;ve even gone so far as to point a personal domain at a client&#8217;s project so that they could start playing around. We&#8217;ve also got custom deployment scripts to make sure that the process is easy and painless for our developers. Given the frequency of deployment, anything more than a single command is too much friction.</p>
<p>So, I think I&#8217;ve given a few compelling reasons for frequent deployment being a good thing. The time and money savings are direct, and as a consequence of fast verification, you&#8217;ll notice bugs or user experience issues very quickly. This translates into happier users, and more success for your project.</p>
<p>If you&#8217;ve had success stories as a result of continuous delivery of working software, or if you think I&#8217;m full of hot air, I&#8217;m interested to read your thoughts in the comments. Fire away!</p>
<p>Keep an eye out for the next post in the series, where I explain why business people should talk with the developers. Don&#8217;t be scared of their non-existent tans, or the fact that they work in darkened offices. Developers are your friends!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/04/29/agile-principles-3-be-quick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Principles #2 &#8211; Change</title>
		<link>http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/</link>
		<comments>http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 17:08:48 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Agile Manifesto]]></category>
		<category><![CDATA[Agile software development]]></category>
		<category><![CDATA[Secret Santa]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=391</guid>
		<description><![CDATA[In my last post, I said that I was committing to a dodeca-thalon of posts on the Agile Manifesto &#8212; one for each Agile principle. I think this is great stuff that everyone should be exposed to. If you use &#8230; <a href="http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In my last post, I said that I was committing to <a href="http://www.cloudspace.com/blog/2009/03/02/agile-manifesto-principles/">a dodeca-thalon of posts on the Agile Manifesto &#8212; one for each Agile principle</a>. I think this is great stuff that everyone should be exposed to. If you use Agile, or wonder why people are so hot for Agile, this series is for you.</p>
<p>And with that intro, here&#8217;s #2 of 12</p>
<blockquote><p>Welcome changing requirements, even late in development. Agile processes harness change for the customer&#8217;s competitive advantage.</p></blockquote>
<p>Everything changes. Software is not <a href="http://en.wikipedia.org/wiki/Grand_Canyon">set in stone, and even if it was set in stone, it would <em>still</em> change</a>. So, we need a process that gracefully handles change. Part of this trick is by getting rid of the idea of a 12-week project, and instead having 12, 1-week projects. You want to have small, frequent plans.</p>
<p>Let&#8217;s take a sports analogy. If you found out a football coach was trying to plan out every single play for the whole game during the first quarter, you&#8217;d laugh yourself off the bleachers. There&#8217;s too many contingencies to account for. Instead, you want a coach that&#8217;s going to break their planning down. Each play is a new project. Each project is planned quickly, executed quickly, and learned from&#8230;quickly.</p>
<p>So, this sprint-based planning is intuitively better. Let&#8217;s work with a more real, software world example.</p>
<p>Let&#8217;s say you&#8217;re responsible for a system so that your company&#8217;s users can coordinate their <a href="http://en.wikipedia.org/wiki/Secret_Santa">Secret Santa gift giving</a>. You&#8217;d have your requirements:</p>
<ul>
<li>A user should be able to sign up</li>
<li>A user should be able to log in</li>
<li>A user should be able to get a recipient assigned</li>
<li>A user should be able to add notes to their recipient</li>
</ul>
<p>Now, since Amazon.com is super cool, and lots of people buying their gifts do so online, so you definitely need Amazon integration.</p>
<ul>
<li>There should be an &#8220;Add Amazon product&#8221; link that searches to Amazon</li>
<li>There should be a &#8220;Buy on Amazon&#8221; button</li>
</ul>
<p>OK, so we&#8217;re good on the requirements. So, let&#8217;s play this out through two scenarios. The first is a regular, waterfall-based project. The second, is Agile.</p>
<h3>Waterfall</h3>
<p>You go to your dev team, and find out that they think the sign up and log in features will take 3 days, the recipient selection/notes feature will take 2 days, and the Amazon stuff will take 4 days. 9 days of development time. Not bad. That&#8217;s just under two weeks. So, you let them have at it.</p>
<p>One of the devs starts working on the sign up process, and the other starts looking into the Amazon APIs, for the integration. They go back and forth a bit, each working on their parts, the Amazon researcher adding information to the docs, then doing some coding on that part of the project, and 9 days later, they are miraculously done on schedule.</p>
<p>You being the proud project manager, you put it out there. Sally in Accounting notices that the Amazon integration doesn&#8217;t always work right when she presses enter on the text field, so there&#8217;s a day of debugging that. OK, 10 days. Not great, there&#8217;s about an 11% overrun on days, but not bad either. All is well.</p>
<h3>Agile</h3>
<p>You go to your dev team. You decide that the sign up and log in functionality is essential to the project, so that gets implemented. This takes 3 days. Your Agile dev team deploys the code so that you can verify the features. Sign up and log in both work. Awesome.</p>
<p>The dev team continues. They add the recipient selection feature, which takes a day, and then the notes feature, which also takes a day. Of course, they&#8217;ve deployed the entire project for your verification after each of these steps.</p>
<p>Since you started on Monday, and it&#8217;s been 5 days, that makes today Friday. That&#8217;s perfect! Next week, finish up the integration with Amazon, and you&#8217;re done.</p>
<p>Since your dev team has done such a great job, and the code is out there and running, you decide to send an email to the management team at your company, showing the progress so far.</p>
<p>You come in on Monday, and find an email from the company president in your Inbox.</p>
<p>&#8220;Hey, great job on the Secret Santa project. I love the notes feature, I&#8217;ve been able to search Amazon for gift ideas and just paste the URLs into the notes section for my recipient. Everyone else has been using the product already, and is really impressed. Great job!&#8221;</p>
<p>Wait, what? We had a spec document and haven&#8217;t even implemented all the features. The project isn&#8217;t even done!</p>
<p>Oh yes it is. Tell your devs to stop working. It&#8217;s 100% usable, because your requirements changed. The project is done, you adapted to the change, and you got it done in 5 out of the 9 days. That&#8217;s a 44% *underrun* in time. Go ahead and give that extra 44% back to the accounting department, and enjoy the shocked look on their faces.</p>
<hr />This might not have been a real project, but it does demonstrate how adapting to change can benefit you. It also demonstrates the advantage of frequent releases of working software. The best way to know what you need is to have a semi-working version that you can test. As a friend says, &#8220;I know I&#8217;m wrong. I don&#8217;t know how I&#8217;m wrong, but I know I&#8217;m wrong. So, I try something quick, and see what I need to change.&#8221; True.</p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/68265077-f552-4fa5-9ec2-6d712162dd7e/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=68265077-f552-4fa5-9ec2-6d712162dd7e" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

