<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>the cloudspace blog</title>
	
	<link>http://www.cloudspace.com/blog</link>
	<description>All things cloudspacious</description>
	<lastBuildDate>Wed, 25 Aug 2010 18:43:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/cloudspace" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="cloudspace" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Agile Principle #11: The best architectures, requirements, and designs emerge from self-organizing teams.</title>
		<link>http://www.cloudspace.com/blog/2010/08/25/agile-principle-11-the-best-architectures-requirements-and-designs-emerge-from-self-organizing-teams/</link>
		<comments>http://www.cloudspace.com/blog/2010/08/25/agile-principle-11-the-best-architectures-requirements-and-designs-emerge-from-self-organizing-teams/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 18:43:06 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=746</guid>
		<description><![CDATA[The best architectures, requirements, and designs emerge from self-organizing teams
Although  Cloudspace works mostly with startups (which are small almost by  definition), this principle is worth commenting on as a general rule. As  startups grow in size, this rule becomes increasingly relevant.
The people who make the best decisions are the ones who are [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>The best architectures, requirements, and designs emerge from self-organizing teams</p></blockquote>
<p>Although  Cloudspace works mostly with startups (which are small almost by  definition), this principle is worth commenting on as a general rule. As  startups grow in size, this rule becomes increasingly relevant.</p>
<p>The people who make the best decisions are the ones who are closest  to the causes and effects of that decision. If you&#8217;re a part of a team,  working in the thick of it, you&#8217;ll make a better decision than someone  removed from the situation. You can see this principle applied in our  rule that we have engineers estimating work &#8212; they&#8217;re closest to the  code so they make better decisions on how long it will take to change  things. This also applies to product changes &#8212; community managers can  help make informed decisions because they are close to the users who are  experiencing pain points.</p>
<p>Believing in this principle implies that if you&#8217;re not on the team  designing a system or a process, you should avoid imposing rules or  demands whenever possible. You have to sell people on your ideas, and  convince them that what you&#8217;re proposing is good. If you can&#8217;t convince  them, then you need to consider that you might have been wrong, or  change the way you&#8217;re explaining it.</p>
<p>An example of this is at Apple. Apple&#8217;s OS is composed of a number  of components, each built by a separate team. The OS project managers  don&#8217;t dictate any project-wide processes. From version control to code  standards to testing &#8212; there are no externally imposed rules on teams.  As long as they deliver good results, they can work in any manner they  want. If a project manager wants a team to change their process, it&#8217;s up  to them to convince the teams one at a time. They don&#8217;t impose mandates  because mandates don&#8217;t work.</p>
<p>This principle isn&#8217;t to say that teams can&#8217;t take any input from the  outside &#8212; obviously external forces (like the client and users) shape  the direction of the project. They provide the broad strokes, and the  team fills in the details. Strategy vs Execution.</p>
<p>The point is to focus on the true requirements, not how they are  done. It&#8217;s helpful to think about things in terms of &#8220;I don&#8217;t care as  long as SIMPLE_OUTCOME_HERE&#8221;. For example, one of our requirements is  that the process for deploying/redeploying be quickly reproducible. This  usually means automated deployments, runbooks, and notes. But, the  teams are able to use whatever solution that fits the projects needs.  Usually these are the same across many of our projects, but there are  exceptions, and self-organizing teams handle them well. In this case, I  don&#8217;t care as long as code can get pushed to the server quickly and  reliably.</p>
<p>This ties back into <a href="http://www.cloudspace.com/blog/2009/09/08/agile-principle-5-a-team-of-motivated-individuals/">the issue of trust</a>.  Communication makes sure that the teams organize correctly, but there  has to be trust, and the confidence of understanding that there are many  ways to solve the same problem.</p>
<p>There&#8217;s a quote from General Patton that I like. Patton was a man  whose ability to get results from a team speaks for itself. He said  &#8220;Never tell people how to do things. Tell them what to do and they will  surprise you with their ingenuity.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/08/25/agile-principle-11-the-best-architectures-requirements-and-designs-emerge-from-self-organizing-teams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patching with “git format-patch” and “git am”</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 it happens. Most of the time, the fix is pretty small and you can just go [...]]]></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 &#8216;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>Millenials and social networks</title>
		<link>http://www.cloudspace.com/blog/2010/06/24/millenials-and-social-networks/</link>
		<comments>http://www.cloudspace.com/blog/2010/06/24/millenials-and-social-networks/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 17:03:59 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=714</guid>
		<description><![CDATA[88% of a sample of Gen Y-ers voiced support for a law that would require websites to delete captured information. Sixty-two percent of them wanted the right to know everything a website knows about them.
From Do You Trust Your Social Network? at HBR
]]></description>
			<content:encoded><![CDATA[<blockquote><p>88% of a sample of Gen Y-ers voiced support for a law that would require websites to delete captured information. Sixty-two percent of them wanted the right to know everything a website knows about them.</p></blockquote>
<p>From <a href="http://blogs.hbr.org/hbr/nayar/2010/06/do-you-trust-your-social-netwo.html">Do You Trust Your Social Network?</a> at HBR</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/06/24/millenials-and-social-networks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Instance Variables with Cucumber Steps</title>
		<link>http://www.cloudspace.com/blog/2010/06/23/using-instance-variables-with-cucumber-steps/</link>
		<comments>http://www.cloudspace.com/blog/2010/06/23/using-instance-variables-with-cucumber-steps/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 13:08:43 +0000</pubDate>
		<dc:creator>michaelorr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[instance variable]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[webrat]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=690</guid>
		<description><![CDATA[I was recently helping a developer test a feature using cucumber.  He was using mostly webrat steps and basic Rails features like dynamic finder methods. He knew that he could use local variables in steps but didn&#8217;t know he could use instance variables to simplify the process of finding all of the objects he needed [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently helping a developer test a feature using <a href="http://cukes.info/">cucumber</a>.  He was using mostly <a href="http://github.com/brynary/webrat">webrat</a> steps and basic Rails features like <a href="http://blog.hasmanythrough.com/2006/8/13/how-dynamic-finders-work">dynamic finder methods</a>. He knew that he could use <a href="http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Variables_and_Constants#Local_Variables">local variables</a> in steps but didn&#8217;t know he could use <a href="http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Variables_and_Constants#Instance_Variables">instance variables</a> to simplify the process of finding all of the objects he needed to test.</p>
<p>Let&#8217;s say you need to test for a value that you store in the database but you can not find on any page in your application. Perhaps you needed to have setup several users and test that one particular user has a valid internal <a href="http://en.wikipedia.org/wiki/Globally_Unique_Identifier">GUID</a> set on it.  You could just select the user into a local variable by a known label to test it.</p>
<pre style="font-size: smaller; margin-left: 30px;">Then /^the test user should have a valid guid$/ do
  user = User.find_by_login("test_user")
  user.guid.should =~ /\w{8}\-\w{4}\-\w{4}\-\w{4}\-\w{12}/
end</pre>
<p>This works pretty well for a time, but it closely couples the test to the actual login used to create the user.  The step can&#8217;t be used to test a user with any other login value and you may find the need to change your test user&#8217;s login when writing a new test.  It&#8217;s never fun to have to rewrite a bunch of your tests to for something minor and you don&#8217;t want to clutter your step definitions with tiny variations on the same test. The example step above also has to pull the user object from the database every time. Extra find methods running  all over your test suite can defintely slow it down.</p>
<p>If you assign an instance variable to an object in the &#8220;Given&#8221; step when you create the object, then you can test that object&#8217;s values in a &#8220;Then&#8221; step later on.</p>
<pre style="font-size: smaller; margin-left: 30px;">Given /^a user "(.+)" with password "(.+)"$/ do |login, password|
  @test_user = User.create(:login =&gt; login
                           , :password =&gt; password
                           , :password_confirmation =&gt; password)
end</pre>
<p>You can test the values of the instance variable in a later step.</p>
<pre style="font-size: smaller; margin-left: 30px;">Then /^the test user should have a valid guid$/ do
  @test_user.guid.should =~ /\w{8}\-\w{4}\-\w{4}\-\w{4}\-\w{12}/
end</pre>
<p>Now you could give your test user any login value that you want.  Smart usage of instance variables can add flexibility to the steps in your test suite and cut down the time it takes your tests to run.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/06/23/using-instance-variables-with-cucumber-steps/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Startups are the new R&amp;D</title>
		<link>http://www.cloudspace.com/blog/2010/06/08/startups-are-the-new-rd/</link>
		<comments>http://www.cloudspace.com/blog/2010/06/08/startups-are-the-new-rd/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 15:47:36 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=683</guid>
		<description><![CDATA[Many years ago, a friend of mine told me that he wanted to go into R&#38;D as a career. At the time, I was surprised to learn that you could actually make a career of R&#38;D &#8212; taking ideas and building them out to figure out if they&#8217;re useful to lots of people. I mean, [...]]]></description>
			<content:encoded><![CDATA[<p>Many years ago, a friend of mine told me that he wanted to go into R&amp;D as a career. At the time, I was surprised to learn that you could actually make a career of R&amp;D &#8212; taking ideas and building them out to figure out if they&#8217;re useful to lots of people. I mean, <a href="http://en.wikipedia.org/wiki/Bell_Labs">Bell Labs</a> at it&#8217;s peak was doing exactly this, and they&#8217;re practically responsible for inventing the technology that makes the modern world&#8230;well, modern. Unfortunately we hear so much about how R&amp;D budgets have been decimated in the quest for earnings, but they&#8217;ve been replaced by a new budget item: acquisitions.</p>
<p>It&#8217;s not like people have stopped innovating. It just goes by a different name. From DNA startups, web startups, electric car startups, alternative energy startups &#8212; startups are the new R&amp;D. It&#8217;s a more focused, market-oriented R&amp;D, but ultimately dollars are being spent to build and discover the next big thing. And with every startup win comes a bunch of new rich startup people who want to funnel money into the next round of ventures &#8212; continuing the cycle.</p>
<p>Part of the reason that startups innovate &#8212; and big companies don&#8217;t &#8212; is the idea of sustaining change versus disruptive change (<a href="http://www.amazon.com/Innovators-Dilemma-Revolutionary-Business-Essentials/dp/0060521996">The Innovators Dilemma</a>). Big companies don&#8217;t do it well, small companies do &#8212; and the smallest company of all is a startup.</p>
<p>So as a car lover, it&#8217;s nice to see <a href="http://earth2tech.com/2010/06/04/gm-launches-venture-capital-arm-starting-with-100m/">General Motors (the hippest of all the conglomerates) dropping $100-million into a venture capital fund</a>. R&amp;D is back! GM is too big to <span style="text-decoration: line-through;">fail</span> innovate, so they&#8217;re pushing money into a small organization that can get behind relatively smaller wins, prove the new idea/market, and then get scaled up with the financial resources that GM can provide.</p>
<p>Just like the web startup world, where small groups try out new ideas, then get big money to take the idea to the next level. Remember the old adage &#8212; &#8220;scaling problems get funded&#8221;.</p>
<p>(And yes, Edan. I agree &#8212; <span style="text-decoration: line-through;">R&amp;D is</span> startups are badass.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/06/08/startups-are-the-new-rd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML5 Link Prefetching (or “The Most Dangerous Tag”)</title>
		<link>http://www.cloudspace.com/blog/2010/06/03/html5-link-prefetching-or-the-most-dangerous-tag/</link>
		<comments>http://www.cloudspace.com/blog/2010/06/03/html5-link-prefetching-or-the-most-dangerous-tag/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 14:08:56 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Clients]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[HTML element]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[Server (computing)]]></category>
		<category><![CDATA[WWW]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=678</guid>
		<description><![CDATA[Check this out!
&#60;link rel="next" href="page2.html"&#62;
With HTML5, that&#8217;s all you&#8217;ve got to do to preload a page. Hat tip to Conner over at keyboardy for pointing this out. It&#8217;s like cheating on behalf of your users, to get them faster page loads. Of course, this is what &#8220;web accelerators&#8221; have done for years, so it&#8217;s good [...]]]></description>
			<content:encoded><![CDATA[<p>Check this out!</p>
<p><code>&lt;link rel="next" href="page2.html"&gt;</code></p>
<p>With HTML5, that&#8217;s all you&#8217;ve got to do to preload a page. Hat tip to <a href="http://keyboardy.com/programming/html5-link-prefetching/">Conner over at keyboardy</a> for pointing this out. It&#8217;s like cheating on behalf of your users, to get them faster page loads. Of course, this is what &#8220;web accelerators&#8221; have done for years, so it&#8217;s good of the W3C to add this feature to the spec.</p>
<p>He mentions a few example use cases to get the creative juices flowing, and more importantly, points out that this technique can dramatically change your server stats. So, if you&#8217;re using a package to analyze web server logs, you&#8217;ll need to account for pages being preloaded. Right now only Firefox supports this next/preload feature, and it sends a custom header with the request. I imagine other browser makers will too. Still &#8212; use of this feature could mean all old and unmaintained stats packages are useless &#8212; aren&#8217;t you glad you use open source and can edit the package to account for the new header? <img src='http://www.cloudspace.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>One thing that he didn&#8217;t mention is the implications for your server. Let&#8217;s say every page has a single &#8220;next&#8221; page referenced &#8212; just one and no more. If you&#8217;ve got a bounce rate of 50%, you&#8217;ll be serving a lot of pages that no one will ever see. Static sites don&#8217;t have to be concerned &#8212; serving flat files is a no-brainer. But, if you&#8217;ve got a dynamic site, lots of uncached data, and a service that&#8217;s routinely around 60-70% capacity on a normal day, you could overload a web or DB server. Put more than one prefetch instruction per page, and the load goes up even more. Ops teams take note &#8212; a bad template or front-end decision could easily double your traffic overnight, without the upside of gaining additional users. This potential for crashing means we could be talking about the single most dangerous HTML tag  &#8212; worse than &lt;blink&gt; and &lt;marquee&gt;.</p>
<p>Edit: mcotton, a Hacker News commenter pointed out that <a href="http://news.ycombinator.com/item?id=1405388">a nice solution is to configure your server to ignore requests with the preload header if they are above a certain load</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/06/03/html5-link-prefetching-or-the-most-dangerous-tag/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>This just in! Rentwiki hits it big; buys us all lunch.</title>
		<link>http://www.cloudspace.com/blog/2010/04/23/this-just-in-rentwiki-hits-it-big-buys-us-all-lunch/</link>
		<comments>http://www.cloudspace.com/blog/2010/04/23/this-just-in-rentwiki-hits-it-big-buys-us-all-lunch/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 21:06:08 +0000</pubDate>
		<dc:creator>ninatalley</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=675</guid>
		<description><![CDATA[Long time Cloudspace client, Rentwiki, is finally getting the kind of recognition they deserve! Antares Capital Corporation has announced they have closed a multimillion dollar investment deal with the social media rental startup. Congratulations! Months of blood, sweat, and tears have finally paid off! We expect a very exotic fruit basket.
Source - http://awe.sm/53rPt
]]></description>
			<content:encoded><![CDATA[<p>Long time Cloudspace client, Rentwiki, is finally getting the kind of recognition they deserve! <a title="Antares Capital" href="http://www.antarescapital.com/" target="_blank">Antares Capital</a> Corporation has announced they have closed a <strong>multimillion </strong>dollar investment deal with the social media rental startup. Congratulations! Months of blood, sweat, and tears have finally paid off! We expect a very exotic fruit basket.</p>
<p>Source - <a href="http://awe.sm/53rPt" target="_blank">http://awe.sm/53rPt</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/04/23/this-just-in-rentwiki-hits-it-big-buys-us-all-lunch/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 of our 13 year history — even before it had a formal name. [...]]]></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 month or two. On the second time I started to talk to Corey about my [...]]]></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>Javascript Widget Performance</title>
		<link>http://www.cloudspace.com/blog/2010/02/19/javascript-widget-performance/</link>
		<comments>http://www.cloudspace.com/blog/2010/02/19/javascript-widget-performance/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 21:19:00 +0000</pubDate>
		<dc:creator>Todd Sampson</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Content delivery network]]></category>
		<category><![CDATA[FAQs  Help  and Tutorials]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[MyBlogLog]]></category>
		<category><![CDATA[widgets]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=629</guid>
		<description><![CDATA[I received the following question today from Rustin over at The Blog Frog, a cool community service for mommy bloggers:
Like MBL, we use external javascript that is referenced from the blog.  If our site ever goes down, even for 2 minutes, browsers try to load the javascript and pause for 30 seconds.  Publishers [...]]]></description>
			<content:encoded><![CDATA[<p>I received the following question today from <a title="Rustin Banks" href="http://blog.rustinbanks.com/">Rustin</a> over at <a title="The Blog Frog" href="http://theblogfrog.com/">The Blog Frog</a>, a cool community service for mommy bloggers:</p>
<blockquote><p>Like MBL, we use external javascript that is referenced from the blog.  If our site ever goes down, even for 2 minutes, browsers try to load the javascript and pause for 30 seconds.  Publishers then get upset that we are blocking their blog and take us off.  How did you get around this with MBL?  How did you display real-time data (when user visits their picture immediately shows up), but decouple from the database (which I assume was necessary)?</p></blockquote>
<p>Since we have been asked this question more times than I can count, I figured it was time to post a quick response on the blog so anyone who is interested could benefit&#8230;</p>
<div class="zemanta-img" style="margin: 1em; display: block;">
<div>
<dl class="wp-caption alignright" style="width: 205px;">
<dt class="wp-caption-dt"><a href="http://www.crunchbase.com/company/mybloglog"><img title="Image representing MyBlogLog as depicted in Cr..." src="http://www.crunchbase.com/assets/images/resized/0001/5755/15755v2-max-250x250.png" alt="Image representing MyBlogLog as depicted in Cr..." width="195" height="59" /></a></dt>
<dd class="wp-caption-dd zemanta-img-attribution" style="font-size: 0.8em;">Image via <a href="http://www.crunchbase.com">CrunchBase</a></dd>
</dl>
</div>
</div>
<p>Keeping the javascript from slowing sites down was absolutely the biggest  technical challenge on <a class="zem_slink" title="MyBlogLog" rel="homepage" href="http://www.mybloglog.com">MyBlogLog</a>.  Once we sold MyBlogLog to Yahoo! we designed a massive, redundant architecture across multiple colos and countries to solve the  performance issues.  That said, there are a number of things that anyone can do  on the cheap to improve performance.  Off the top of my head, you could do any/all of the  following:</p>
<ol>
<li> Move to an ajax/asynchronous load of the javascript widget.</li>
<li>Move the main javascript to a <a class="zem_slink" title="Content delivery network" rel="wikipedia" href="http://en.wikipedia.org/wiki/Content_delivery_network">CDN</a> where you shouldn&#8217;t have slowdowns.</li>
<li>Have the CDN javascript call your servers to populate data, but  gracefully timeout if it doesn&#8217;t get a fast enough response.</li>
<li>Move all member data into Memcached or similar memory caching layer  on your servers.</li>
<li>Make sure all javascript tags are set to defer load &#8212; though  browsers don&#8217;t always implement this correctly.</li>
<li>Use AmazonAWS or similar to setup multiple colos near users on the  cheap.</li>
<li>Move the tracking script lower in the page so it doesn&#8217;t slow things  down.</li>
</ol>
<p>Finally, and most importantly, <strong>the system doesn&#8217;t need to *be*  real-time.  It just needs to *act* like it is real-time.</strong> We had a line  in the javascript on MyBlogLog that automatically showed the current  user visiting the site at the top of the list.  No database calls were  needed.  Even better, since the user didn&#8217;t have a clue who had  visited the site just before them, we could cache the list of recent  visitors every minute &#8212; longer for sites with low traffic &#8212; and show it below the current user.  This had a  significant improvement in the end-user experience while costing us  nothing.</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/6d1cc8ff-86c1-4bf8-9528-d8083cc3215c/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=6d1cc8ff-86c1-4bf8-9528-d8083cc3215c" 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/19/javascript-widget-performance/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
