<?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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Eden Development Staff Notes</title>
	
	<link>http://edendevelopment.co.uk/blogs</link>
	<description>Eden's combined feed of notes</description>
	<lastBuildDate>Mon, 06 Sep 2010 15:28:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</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/EdenDevelopment" /><feedburner:info uri="edendevelopment" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Which toolboxes do you have?</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/jfUr2N-hy-8/</link>
		<comments>http://blog.nexwerk.com/2010/09/06/which-toolboxes-do-you-have/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 15:28:44 +0000</pubDate>
		<dc:creator>Enrique Comba Riepenhausen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[comments]]></category>
		<category><![CDATA[craftsmanship]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[meme]]></category>
		<category><![CDATA[professionalism]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[value]]></category>

		<guid isPermaLink="false">http://blog.nexwerk.com/?p=446</guid>
		<description><![CDATA[A couple of days ago Ade (Adewale Oshineye, co-author of Apprenticeship Patterns) gave me a puzzling question, that I had trouble answering, although I did. What this question did actually was to kick in my thinking, helping me to reflect on myself for a couple of days, which I really appreciated. Thanks Ade! Now, his [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of days ago <a href="http://www.oshineye.com/">Ade</a> (<a href="http://www.oshineye.com/">Adewale Oshineye</a>, co-author of <a href="http://oreilly.com/catalog/9780596518387">Apprenticeship Patterns</a>) gave me a puzzling question, that I had trouble answering, although I did.</p>
<p>What this question did actually was to kick in my thinking, helping me to reflect on myself for a couple of days, which I really appreciated. Thanks <a href="http://www.oshineye.com/">Ade</a>! <img src='http://blog.nexwerk.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Now, his question was, as you&#8217;d expected, the following <strong>Which toolboxes do you have?</strong></p>
<p>My first thought was to answer with all sorts of technical skills I have, but I thought a bit more and gave a different answer, which I will expand on this post.</p>
<p><strong>So, what are my toolboxes?</strong></p>
<ul>
<li>Software Development</li>
<li>Photography</li>
<li>Communication skills</li>
<li>Empathy</li>
<li>Writing</li>
<li>Languages</li>
<li>Learning (or knowledge acquisition)</li>
<li>Psychology/Sociology</li>
</ul>
<p>As you can see this <em>toolboxes</em> are very broad. They are not in any particular order either.<br />
Each of this boxes contains more tools and, in some cases, even more little boxes.</p>
<p>I have been developing software for some years now and I have acquired a broad spectrum of tools that help me in my day to day work while developing software (such as TDD, various languages, and other practices that I call mine). </p>
<p>As another example I speak and understand a few languages (two as a native speaker), in fact it is a passion of mine (I am currently learning japanese).</p>
<p>A way of seeing your toolboxes is practices that you can call yours because you have internalized them in a way that they become part of who you are and you almost act instinctively on them.</p>
<p>A few months back I did the <a href="http://strengths.gallup.com/110440/About-StrengthsFinder-2.aspx">Strengths Finder 2.0 questionnaire</a> as an exercise <a href="http://pa.rsons.org">Chris</a>, <a href="http://twitter.com/edentodd">Todd</a> and myself wanted to do to figure out our strengths and how we can best play them as a team (now every <a href="http://www.edendevelopment.co.uk">Edenite</a> has done this exercise <img src='http://blog.nexwerk.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ).</p>
<p>I think that mine map, strangely enough, very well into my toolboxes.</p>
<p>Here is a list of my strengths (with some explanation to them):</p>
<ul>
<li><strong>Learner</strong>: People who are especially talented in the Learner theme have a great desire to learn and want to continuously improve. In particular, the process of learning, rather than the outcome, excites them.</li>
<li><strong>Intellection</strong>: People who are especially talented in the Intellection theme are characterised by their intellectual activity. They are introspective and appreciate intellectual discussions.</li>
<li><strong>Achiever</strong>: People who are especially talented in the Achiever theme have a great deal of stamina and work hard. They take great satisfaction from being busy and productive.</li>
<li><strong>Input</strong>: People who are especially talented in the Input theme have a craving to know more. Often they like to collect and archive all kinds of information.</li>
<li><strong>Activator</strong>: People who are especially talented in the Activator theme can make things happen by turning thoughts into action. They are often impatient.</li>
</ul>
<p>During the course of a day I use many different tools from my toolboxes. I also strive to better myself in many areas that I think I lack knowledge (one sample being my maths, specially the mathematical representation of algorithms) focusing my learning and reflection around this areas.</p>
<p>Now I will pass the ball to you&#8230; <strong>What are your toolboxes?</strong></p>
<img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/jfUr2N-hy-8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.nexwerk.com/2010/09/06/which-toolboxes-do-you-have/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.nexwerk.com/2010/09/06/which-toolboxes-do-you-have/</feedburner:origLink></item>
		<item>
		<title>Rails alphabetical pagination</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/zbV0SeMJ0GU/</link>
		<comments>http://edendevelopment.co.uk/blogs/aimee/2010/08/25/rails-alphabetical-pagination/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 16:10:10 +0000</pubDate>
		<dc:creator>aimee</dc:creator>
				<category><![CDATA[gem]]></category>
		<category><![CDATA[i use tags, not categories]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://edendevelopment.co.uk/blogs/aimee/?p=118</guid>
		<description><![CDATA[A common problem we often run into at eden is paginating a list of things alphabetically. I thought it was possible with will_paginate but apparently not, so yesterday we created our own simple solution, and today we rolled it into a plugin.
Here&#8217;s a little tutorial of how to use it.
So i have a nice simple [...]]]></description>
			<content:encoded><![CDATA[<p>A common problem we often run into at eden is paginating a list of things alphabetically. I thought it was possible with <a href="http://github.com/mislav/will_paginate">will_paginate</a> but apparently not, so yesterday we created our own simple solution, and today we rolled it into a plugin.</p>
<p>Here&#8217;s a little tutorial of how to use it.</p>
<p>So i have a nice simple view of Gowalla pins ordered by name. Please forgive the scaffolding! ;)</p>
<p><a href="http://www.flickr.com/photos/sermoa/4926297071/" title="Gowalla pins by sermoa, on Flickr"><img src="http://farm5.static.flickr.com/4121/4926297071_c65f2a76b5.jpg" width="500" height="356" alt="Gowalla pins" style="border: 1px solid silver" /></a></p>
<p>This page is quite long. Of course, we could use standard pagination to make it 10 per page or something, but it wouldn&#8217;t be very helpful if you were looking for a pin with a particular name. You&#8217;d have to click through the pages to find it. Wouldn&#8217;t it be neat to list a page for each letter?</p>
<p>Enter <a href="http://github.com/edendevelopment/paginate_alphabetically">paginate_alphabetically</a>!</p>
<p>Simply install it as a plugin:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rails plugin <span style="color: #c20cb9; font-weight: bold;">install</span> http:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>edendevelopment<span style="color: #000000; font-weight: bold;">/</span>paginate_alphabetically.git</pre></div></div>

<p>Enable pagination in the model:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Pin <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  paginate_alphabetically <span style="color:#ff3333; font-weight:bold;">:by</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:name</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Make the controller fetch the right pins:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> PinsController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
  <span style="color:#9966CC; font-weight:bold;">def</span> index
    <span style="color:#0066ff; font-weight:bold;">@pins</span> = Pin.<span style="color:#9900CC;">alphabetical_group</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:letter</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Add pagination links in the view:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;ul class='pagination'&gt;
  &lt;strong&gt;Jump to:&lt;/strong&gt;
  &lt;%- Pin.pagination_letters.each do |letter| -%&gt;
    &lt;li&gt;&lt;%= link_to(letter, pins_path(:letter =&gt; letter)) %&gt;&lt;/li&gt;
  &lt;%- end -%&gt;
&lt;/ul&gt;</pre></div></div>

<p>Perhaps a touch of CSS:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">ul<span style="color: #6666ff;">.pagination</span> <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">list-style</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> lightgray<span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1em</span> <span style="color: #933;">0.5em</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
ul<span style="color: #6666ff;">.pagination</span> strong <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">black</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
ul<span style="color: #6666ff;">.pagination</span> li <span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">inline</span><span style="color: #00AA00;">;</span>
  <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1.1em</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
ul<span style="color: #6666ff;">.pagination</span> li<span style="color: #3333ff;">:before </span><span style="color: #00AA00;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">content</span><span style="color: #00AA00;">:</span> <span style="color: #ff0000;">'| '</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>And here it is:</p>
<p><a href="http://www.flickr.com/photos/sermoa/4926946868/" title="Gowalla pins beginning with E by sermoa, on Flickr"><img src="http://farm5.static.flickr.com/4077/4926946868_0910fcc97d.jpg" width="500" height="302" alt="Gowalla pins beginning with E" style="border: 1px solid silver" /></a></p>
<p>The cool thing is you can add this to any of your models, and paginate by any attribute you wish.</p>
<p>Tested with Rails 2.3.5 and Rails 3 release candidate.</p>
<p>Get it from github: <a href="http://github.com/edendevelopment/paginate_alphabetically">http://github.com/edendevelopment/paginate_alphabetically</a><br />
or RubyGems: <a href="http://rubygems.org/gems/paginate_alphabetically">http://rubygems.org/gems/paginate_alphabetically</a></p>
<p>Thanks to <a href="http://www.tcrayford.net/">Tom</a>, <a href="http://ecomba.org/">Enrique</a> and <a href="http://tooky.github.com/">tooky</a> for their help making this.</p>
<img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/zbV0SeMJ0GU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://edendevelopment.co.uk/blogs/aimee/2010/08/25/rails-alphabetical-pagination/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://edendevelopment.co.uk/blogs/aimee/2010/08/25/rails-alphabetical-pagination/</feedburner:origLink></item>
		<item>
		<title>David Good in the Wandering Book</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/fof_SJG4kmY/</link>
		<comments>http://blog.nexwerk.com/2010/08/22/david-good-in-the-wandering-book/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 10:10:04 +0000</pubDate>
		<dc:creator>Enrique Comba Riepenhausen</dc:creator>
				<category><![CDATA[NexWerk]]></category>
		<category><![CDATA[Software Craftsmanship]]></category>
		<category><![CDATA[apprenticeship]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[craftsmanship]]></category>
		<category><![CDATA[manifesto]]></category>
		<category><![CDATA[the wandering book]]></category>

		<guid isPermaLink="false">http://blog.nexwerk.com/?p=424</guid>
		<description><![CDATA[It has been a while since David Good wrote his entry in The Wandering Book and I am the sole culprit of not sharing my ideas here on it. I have been caught up with many different things lately that prevented me from writing my thoughts about his entry down. David&#8217;s entry starts by giving [...]]]></description>
			<content:encoded><![CDATA[<p>It has been a while since David Good wrote <a href="http://nexwerk.com/the_wandering_book/view?page=12">his entry</a> in <a href="http://nexwerk.com/the_wandering_book">The Wandering Book</a> and I am the sole culprit of not sharing my ideas here on it. I have been caught up with many different things lately that prevented me from writing my thoughts about his entry down.</p>
<p><img src="http://www.nexwerk.com/system/datas/34/large/Page2.png?1280896159" alt="David Good's entry" /></p>
<p>David&#8217;s entry starts by giving us a glimpse of craftsmanship outside our craft, talking about Sauder, Maloof, O&#8217;Sullivan and Stickley, four remarkable furniture craftsmen. He uses these four woodworkers to explain that <a href="http://manifesto.sofrwarecraftsmanship.org">Software Craftsmanship</a> is not about the companies that adhere to it, but about the individuals who craft.</p>
<p>I think that in a way he is right. Our customers remember our names, the people who crafted their products and the relationship we have build with them over time. Our company is just the frame in which excellent people come to work together as a team to reach this goal.</p>
<p>Further into his entry David asserts that craftsmen are passionate about what they do and try to find ways to improve their techniques and toolset. Many people do so (maybe not as many as they should), but, as he explains further a craftsman makes sure he passes his knowledge on to his apprentices, enabling therefore the evolution of our craft.</p>
<p>I do agree with this statement. A craftsman is not only trying to improve himself and his craft, he also shares his knowledge and passes it on to other aspiring craftsmen willing to learn and move the craft forward.</p>
<p>Are you sharing what you learn? Are you seeking the advice from people who know more than you?</p>
<img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/fof_SJG4kmY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.nexwerk.com/2010/08/22/david-good-in-the-wandering-book/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.nexwerk.com/2010/08/22/david-good-in-the-wandering-book/</feedburner:origLink></item>
		<item>
		<title>What’s a pomodoro?</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/FmegG331vfA/</link>
		<comments>http://edendevelopment.co.uk/blogs/aimee/2010/08/20/whats-a-pomodoro/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 15:44:44 +0000</pubDate>
		<dc:creator>aimee</dc:creator>
				<category><![CDATA[i use tags, not categories]]></category>
		<category><![CDATA[pair programming]]></category>
		<category><![CDATA[pomodoro]]></category>
		<category><![CDATA[time management]]></category>

		<guid isPermaLink="false">http://edendevelopment.co.uk/blogs/aimee/?p=111</guid>
		<description><![CDATA[At eden, we often use the Pomodoro Technique&#8482; to manage our time effectively. What exactly is a pomodoro? You could find out on the Dizionario di Italiano but i&#8217;ll give you a clue: it&#8217;s a tomato.

A tomato?! How does a tomato help us manage time and increase our productivity? Well when we talk about pomodoros, [...]]]></description>
			<content:encoded><![CDATA[<p>At eden, we often use the Pomodoro Technique&trade; to manage our time effectively. What exactly is a pomodoro? You could <a href="http://dizionari.corriere.it/dizionario_italiano/P/pomodoro.shtml">find out on the <em>Dizionario di Italiano</em></a> but i&#8217;ll give you a clue: it&#8217;s a tomato.</p>
<p><a href="http://twitpic.com/2ghpnr" title="Share photos on twitter with Twitpic"><img src="http://twitpic.com/show/thumb/2ghpnr.jpg" width="150" height="150" alt="Share photos on twitter with Twitpic"></a></p>
<p>A tomato?! How does a tomato help us manage time and increase our productivity? Well when we talk about pomodoros, we&#8217;re actually talking about a 25-minute block of time followed by a 5-minute break to reflect and assess how we&#8217;re doing and what we will do in the next 25 minutes. After four of these we take a longer break. If we&#8217;re really serious about the technique, we aim to do 12 pomodoros in a day.</p>
<p>This is <a href="http://www.pomodorotechnique.com/">the Pomodoro Technique</a> created by Francesco Cirillo in 1992. It is called Pomodoro because Francesco used one of those kitchen timers shaped like a tomato.</p>
<p>These are the five simple steps of the Pomodoro Technique: </p>
<ol>
<li>Choose a task to be accomplished</li>
<li>Set the Pomodoro to 25 minutes (the Pomodoro is the timer)</li>
<li>Work on the task until the Pomodoro rings, then put a check on your sheet of paper</li>
<li>Take a short break (5 minutes is OK)</li>
<li>Every 4 Pomodoros take a longer break</li>
</ol>
<p>We don&#8217;t actually use a kitchen timer (though i think it would be cool to have some!) but we use software tools instead. We use <a href="http://www.apple.com/downloads/macosx/development_tools/pomodoro.html">Apple&#8217;s Pomodoro timer</a> which has Growl integration and keeps track of tasks and interruptions. When pairing remotely we use <a href="http://tomatoi.st/">http://tomatoi.st/</a> which enables both people to see the time as it counts down.</p>
<p>At eden, pomodoro time is highly respected in terms of not interrupting unless it is really urgent. It&#8217;s very easy to say, <em>&#8220;We&#8217;re on a pomodoro&#8221;</em> and people know that you&#8217;ll talk to them in your next break.</p>
<p>We find that the Pomodoro Technique increases our focus, keeps us on track with what we&#8217;re doing, and keeps us in control of our time, rather than time controlling us. For ideas and resources, visit <a href="http://pomodorotechnique.com/">PomodoroTechnique.com</a>.</p>
<img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/FmegG331vfA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://edendevelopment.co.uk/blogs/aimee/2010/08/20/whats-a-pomodoro/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://edendevelopment.co.uk/blogs/aimee/2010/08/20/whats-a-pomodoro/</feedburner:origLink></item>
		<item>
		<title>Reactive Data Integrity</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/OdtA8fFSjaQ/</link>
		<comments>http://edendevelopment.co.uk/blogs/guest/2010/08/19/reactive-data-integrity/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 10:44:12 +0000</pubDate>
		<dc:creator>Xavier Shay</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[data integrity]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[database constraints]]></category>
		<category><![CDATA[dbisyourfriend]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[xaviershay]]></category>

		<guid isPermaLink="false">http://edendevelopment.co.uk/blogs/guest/?p=4</guid>
		<description><![CDATA[This is a guest post by Xavier Shay, who is running a course about using your database to write rock solid applications at Eden Development on the 22nd September.
The common tools used to ensure data integrity, such as not null constraints and foreign keys, are not always available to us. They may be too expensive [...]]]></description>
			<content:encoded><![CDATA[<p><em>This is a guest post by Xavier Shay, who is running a <a href="http://www.dbisyourfriend.com/" >course about using your database to write rock solid applications</a> at Eden Development on the 22nd September.</em></p>
<p>The common tools used to ensure data integrity, such as not null constraints and foreign keys, are not always available to us. They may be too expensive to retrofit on to an existing application (for example, foreign keys tend to break test suites with lots of fixtures and mocking), or the data store may not provide them, such as is the case with most NoSQL databases. In these cases, another technique is required to give confidence in the integrity of the data.</p>
<p>Database constraints are <strong>proactive</strong>. They prevent invalid data from ever reaching the database and are the strongest method to ensure integrity, but as noted they are not always available. In this case, <strong>reactive</strong> techniques can be used. You may not be able to prevent invalid data from entering the data store, but at least you can detect when it happens promptly, rather than three months down the track when it starts causing errors.</p>
<p>One of the simplest ways to implement reactive checks in Rails is by creating a test suite that runs against your production data. Aside from a bit of setup to give the environment access to the data &#8212; either load up a production dump or point it at a read-only slave &#8212; it is quite a basic concept.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># For whatever reason this relationship doesn't have a foreign key constraint</span>
test <span style="color:#996600;">'all tractors should have an owner'</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  sql = <span style="color:#006600; font-weight:bold;">&lt;&lt;-</span>EOS
    <span style="color:#CC0066; font-weight:bold;">SELECT</span> tractors.<span style="color:#9900CC;">id</span>
    FROM tractors
    LEFT JOIN owners ON owner_id = owners.<span style="color:#9900CC;">id</span>
    WHERE owners.<span style="color:#9900CC;">id</span> IS NULL
  EOS
  orphans = <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>.<span style="color:#9900CC;">connection</span>.<span style="color:#9900CC;">execute</span><span style="color:#006600; font-weight:bold;">&#40;</span>sql<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">map</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>x<span style="color:#006600; font-weight:bold;">|</span> x<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'id'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  assert orphans.<span style="color:#9900CC;">empty</span>?, <span style="color:#996600;">&quot;Tractors do not have owners: #{orphans.join(', ')}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>That&#8217;s really it! Told you it was basic. Some things to keep in mind:</p>
<ul>
<li>Keep these tests separate from your main suite in a new folder.</li>
<li>Use SQL (or a native data store query) where possible rather than iterating using ActiveRecord. It is far more efficient especially when there are a large number of records.</li>
<li>Ensure the error message helps you fix the error. &#8220;Orphans was not empty&#8221; is not helpful, &#8220;Tractor orphans: 3, 6&#8243; is.</li>
</ul>
<p>Reactive integrity checks are another tool that can be used to increase confidence in your production data. You should use proactive checks where possible, since they are much stronger and more efficient, but reactive checks can reach areas proactive ones cannot cover and can be far cheaper to implement, especially on existing projects.</p>
<p><em><a href="http://www.dbisyourfriend.com" >Register</a> for &#8220;Your Database Is Your Friend&#8221; training at Eden Development on 22nd September. It covers this sort of thing and much more, including design and concurrency issues. See <a href="http://www.dbisyourfriend.com" >www.dbisyourfriend.com</a> for more detail.</em></p>
<img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/OdtA8fFSjaQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://edendevelopment.co.uk/blogs/guest/2010/08/19/reactive-data-integrity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://edendevelopment.co.uk/blogs/guest/2010/08/19/reactive-data-integrity/</feedburner:origLink></item>
		<item>
		<title>Using Cucumber to test concurrency issues</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/EjoKSDYi1os/</link>
		<comments>http://edendevelopment.co.uk/blogs/aimee/2010/08/12/using-cucumber-to-test-concurrency-issues/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 14:34:20 +0000</pubDate>
		<dc:creator>aimee</dc:creator>
				<category><![CDATA[concurrency]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[i use tags, not categories]]></category>
		<category><![CDATA[pair programming]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://edendevelopment.co.uk/blogs/aimee/?p=101</guid>
		<description><![CDATA[Recently i encountered a concurrency problem of the type where there is a queue of things to do, and users press a button to be automatically assigned the next item in the queue. The bug report was that two users could get assigned the same item.
My pair programmer and i tried to reproduce the problem [...]]]></description>
			<content:encoded><![CDATA[<p>Recently i encountered a concurrency problem of the type where there is a queue of things to do, and users press a button to be automatically assigned the next item in the queue. The bug report was that two users could get assigned the same item.</p>
<p>My pair programmer and i tried to reproduce the problem using two computers, but we couldn&#8217;t. We were only running one Rails instance, but we know that in the production environment there are multiple load-balanced servers pointing to one database, so we had an inkling that we&#8217;d be able to produce it using multi-threading.</p>
<p>To give it a test, we wrote a Rake task which we ran in two terminal windows to mimic the simultaneous access. The Rake task looked something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">'..'</span>, <span style="color:#996600;">'..'</span>, <span style="color:#996600;">'config'</span>, <span style="color:#996600;">'environment.rb'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
namespace <span style="color:#ff3333; font-weight:bold;">:test</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  task <span style="color:#ff3333; font-weight:bold;">:take_next_for</span>, <span style="color:#ff3333; font-weight:bold;">:login</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>t, args<span style="color:#006600; font-weight:bold;">|</span>
    user = User.<span style="color:#9900CC;">find_by_login</span><span style="color:#006600; font-weight:bold;">&#40;</span>args<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:login</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    user.<span style="color:#9900CC;">take_next_item</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> user.<span style="color:#9900CC;">item</span>.<span style="color:#9900CC;">inspect</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>This is easily called by running:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rake <span style="color: #7a0874; font-weight: bold;">test</span>:take_next_for<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #ff0000;">'ann'</span><span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

<p>We ran it for two users simultaneously and inspected the output. Sure enough they were being assigned the same item.</p>
<p>Since there is only one database, we knew that we could fix it with a carefully placed transaction and lock on the database. But we wanted to add a Cucumber feature so that we could be sure it was working, and to give us confidence that the bug would not come back again in the future.</p>

<div class="wp_syntax"><div class="code"><pre class="cucumber" style="font-family:monospace;">  Scenario: Two users take next item simultaneously
    Given a user with login &quot;ann&quot;
    And a user with login &quot;bob&quot;
    And an available item called &quot;Item 1&quot;
    And an available item called &quot;Item 2&quot;
    When two users attempt to take the next item at the same time
    Then they should each have taken different items</pre></div></div>

<p>Notice we can&#8217;t actually say who gets which item &#8211; it&#8217;s a race condition. We can only check that both of them have an item and that they are not the same item. We could alternatively check that both of the items have successfully been taken.</p>
<p>Testing this concurrency issue in Cucumber turned out to be somewhat tricky. We tried using simple Ruby threads in Cucumber, but it wasn&#8217;t properly simultaneously. I guess the single Cucumber environment still only does one thing at a time. So it was back to the Rake task.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^two users attempt to take the <span style="color:#9966CC; font-weight:bold;">next</span> item at the same time$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  t1 = <span style="color:#CC00FF; font-weight:bold;">Thread</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#996600;">`RAILS_ENV=cucumber rake test:take_next_for['ann']`</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  t2 = <span style="color:#CC00FF; font-weight:bold;">Thread</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#996600;">`RAILS_ENV=cucumber rake test:take_next_for['bob']`</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  t1.<span style="color:#9900CC;">join</span>
  t2.<span style="color:#9900CC;">join</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>We &#8216;join&#8217; the two threads to make sure they&#8217;ve both finished before carrying on.</p>
<p>It&#8217;s slow because it loads up a whole new Rails environment for each of the Rake tasks, but that is exactly what we want to do, to mimic the concurrency of the production system.</p>
<p>The next problem we encountered was that Cucumber scenarios are run inside a transaction which means that a Rake task running outside of it cannot see the users and items we just created. So we had to tag the scenario as <code>@no-txn</code> so that they would be available externally and <code>@clean-up-afterwards</code> so that we could remove them from the database.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">After <span style="color:#996600;">&quot;@clean-up-afterwards&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  User.<span style="color:#9900CC;">destroy_all</span>
  Item.<span style="color:#9900CC;">destroy_all</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>With this in place the Cucumber scenario failed as we hoped it would! Then it was simply a matter of creating a transaction from the moment we find the next item (with a database lock) until we have successfully assigned the item. This is a simplified version of what we ended up with:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  has_one <span style="color:#ff3333; font-weight:bold;">:item</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> take_next_item
    transaction <span style="color:#9966CC; font-weight:bold;">do</span>
      item = Item.<span style="color:#9900CC;">available</span>.<span style="color:#9900CC;">by_priority</span>.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:first</span>, <span style="color:#ff3333; font-weight:bold;">:lock</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">item</span> = item
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>The Cucumber scenario passed and the problem was solved. In the live system, if two users now try to take an item at the same time, one of them has to wait a moment until the database has finished assigning to the first user so that it can assign a different item to the second user.</p>
<p>How would you have tested a concurrency issue like this? Are there better ways of imitating a multi-server production environment than the solution we came up with?</p>
<img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/EjoKSDYi1os" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://edendevelopment.co.uk/blogs/aimee/2010/08/12/using-cucumber-to-test-concurrency-issues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://edendevelopment.co.uk/blogs/aimee/2010/08/12/using-cucumber-to-test-concurrency-issues/</feedburner:origLink></item>
		<item>
		<title>My Polyphasic Sleep Experiment</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/_y9QF9L5MII/polyphasic-sleep-experiment</link>
		<comments>http://chrismdp.github.com/2010/07/polyphasic-sleep-experiment#comments</comments>
		<pubDate>Thu, 29 Jul 2010 08:45:00 +0000</pubDate>
		<dc:creator>Chris Parsons</dc:creator>
				<category><![CDATA[life]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[sleep]]></category>

		<guid isPermaLink="false">http://chrismdp.github.com/2010/07/polyphasic-sleep-experiment</guid>
		<description><![CDATA[I've always been one to try new things, and screwing with my sleep patterns to attempt to cram more into my day seemed like a fun thing to try :) I had a go at it a few weeks back, and wanted to share my experience.
Polyphasic sleep is something that c...]]></description>
			<content:encoded><![CDATA[<p><i>I've always been one to try new things, and screwing with my sleep patterns to attempt to cram more into my day seemed like a fun thing to try :) I had a go at it a few weeks back, and wanted to share my experience.</i></p>
<p>Polyphasic sleep is something that caught my eye a year ago, when I heard about the idea from <a href='http://twitter.com/ntalbott'>Nathaniel Talbott</a> at Bizconf last year. The idea is that you take a much shorter night&#8217;s sleep (perhaps 3-5 hours) and make up for it with 20 minute naps spaced out during the day. There are some fixed schedules that have been shown to work, but the basic rule is that the shorter your nightly (or &#8220;core&#8221;) sleep, the more naps you need and the more fixed your nap schedule has to be during the day.</p>

<p>The idea of getting loads more time in my day really appealed, so I finally decided to give it a go after I saw <a href='http://twitter.com/slagyr'>Micah Martin</a> was trying it too.</p>

<h2 id='my_experience'>My experience</h2>

<p>I went for a 3 hour core sleep from 10:30pm to 1:00am, with 3 naps spaced out during the day: one at 6 - 6:20am, one at 12:10pm - 12:30pm, and one at 5:10pm - 5:30pm. The idea was that I could get my first nap in before my kids awoke at 7am, and then nap once at lunchtime, and once just before I came home.</p>

<p>Full of anticipation of hours of extra time, I went to bed on Sunday night at 10:30pm, setting my alarm for 1am.</p>

<p>Sure enough, the alarm went off and I dragged myself out of bed. I felt euphoric at the thought of having all this time, and my <a href='http://chrismdp.github.com/2010/07/seven-hundred-and-fifty-words'>750 words</a> for the day proudly exclaimed the virtues of this sort of living. (I&#8217;m afraid I&#8217;m a serial <a href='http://chrismdp.github.com/2009/12/jekyll'>kool-aid drinker</a>. I took my naps at normal times, and it all worked wonderfully. My naps weren&#8217;t wonderful: we have a very <a href='http://www.flickr.com/photos/edendevelopment/sets/72157622880494016/'>open office</a> and I couldn&#8217;t easily find a good place to sleep for 20 minutes. I felt a little tired, but not too bad to be honest. That is, until 10:30pm where I promptly crashed. The fact that my baby daughter was asleep by then was great (later I found that this was a happy coincidence :). I slept very deeply until 1am the following day.</p>

<p>Tuesday to Friday I felt much more tired, and found that I really needed my naps at the appointed time. It was like my body began to shut down at around midday and I knew I needed to go and sleep. The nights were much worse though. It was a real struggle to keep my eyes open between 1:00am and 6:00am after only three hours core sleep. I managed it though, and only had one short oversleep.</p>

<h2 id='why_i_stopped'>Why I stopped</h2>

<p>The real problem, the one that ultimately caused me to abort after a week, was not the tiredness. I think that I could have gone on and persevered throught that. <em>The problem was scheduling the naps, the life adjustment and the flexibility.</em></p>

<p>Whilst you&#8217;re adapting, it&#8217;s really important not to deviate from your set nap schedule, yet I have three kids and a busy work schedule. Often this causes me to be out on trips at the weekend, and in London meeting clients midweek. I was looking at my diary a week ahead and thinking: &#8220;How on earth am I going to survive Wednesday? And Saturday? Oh, and Sunday?&#8221;</p>

<p>If I skipped a nap whilst adjusting, it would effectively had set me back several days in the adaptation process, and with my schedule I couldn&#8217;t guarantee that I&#8217;d ever finish adapting. Some sleep deprivation is acceptable during adaptation, but go on for too long and it begins to affect your health.</p>

<p>Another difficulty: it was great to be awake in the middle of the night, the same time as my three-week old girl, and my wife got a good deal more sleep than she would have done normally. However it was difficult at 10:30pm: I simply had to be asleep at that time for it to work, and often the baby still needed settling around them. My wife was pretty good about this, but she was tired too, and it felt like I wasn&#8217;t doing her any favours. I was basically getting more time for me, at the expense of being flexible for the family during the day/evening. As long as it didn&#8217;t affect them much it was fine, but after a certain point I&#8217;m just being selfish.</p>

<p>So, for multiple different reasons, I decided to call time on the experiment after about five days.</p>

<p>It&#8217;s important to stress that people who successfully implement a polyphasic sleep schedule persevere longer than I did, and have more success scheduling their naps. If I worked from home, with less commitments and meetings during the day, I can see how I might have been able to make it work. Ultimately, my life just isn&#8217;t fundamentally set up for this sleep pattern, and to a certain extent that&#8217;s reflected in society. It would have been difficult to find a place to crash for 20 minutes in central London, and it&#8217;s not something I could easily have explained to people.</p>

<h2 id='what_did_i_learn'>What did I learn?</h2>

<p><em>I got much better at napping.</em> I&#8217;m able to fall asleep more easily now, for short periods, when I need to.</p>

<p>I learnt that <em>our society isn&#8217;t set up for daytime naps.</em> This might improve in the future if it catches on, who knows?</p>

<p><em>Your cognitive performance is super impaired when your brain thinks you should be sleeping.</em> This sounds obvious :) but I didn&#8217;t think of it before starting: I was expecting to have lots of tasks done, but looking through my list at 3am when I was super tired only elicted perhaps one or two things I could manage. A lot of my work requires a fair amount of concentration, and I just couldn&#8217;t manage it.</p>

<p>This would hopefully have ceased to be a problem after a couple of weeks when I&#8217;d have stopped feeling so tired, but it also threw up another problem, and the biggest lesson I learnt: <em>many of the old tasks on your list aren&#8217;t incomplete through lack of time, but through lack of motivation.</em> If you remove lack of time from the equation, you start to see what you&#8217;ve been procrastinating about because you really just don&#8217;t want to do it. That was a challenge, and led me to think deeper about some of the things on my list that I&#8217;ve been putting on.</p>

<h2 id='would_i_try_it_again'>Would I try it again?</h2>

<p>Perhaps. I think the life circumstances would need to be right, and the need for that extra time would need to be extreme. I don&#8217;t regret the experience though, and I&#8217;m grateful for the lessons learnt.</p>

<p>That was my story: what&#8217;s yours? Have you tried and succeeded, or failed? Any tips to share?</p><img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/_y9QF9L5MII" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://chrismdp.github.com/2010/07/polyphasic-sleep-experiment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://chrismdp.github.com/2010/07/polyphasic-sleep-experiment</feedburner:origLink></item>
		<item>
		<title>Card Of The Day: Actually Do Retrospective Actions</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/jLN9s051DTI/card-of-the-day</link>
		<comments>http://chrismdp.github.com/2010/07/card-of-the-day#comments</comments>
		<pubDate>Thu, 22 Jul 2010 09:45:00 +0000</pubDate>
		<dc:creator>Chris Parsons</dc:creator>
				<category><![CDATA[agile]]></category>
		<category><![CDATA[index cards]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[retrospectives]]></category>

		<guid isPermaLink="false">http://chrismdp.github.com/2010/07/card-of-the-day</guid>
		<description><![CDATA[

Our current Card Of The Day board at Eden

Retrospectives are something we&#8217;ve been doing regularly for quite a while at Eden, but we&#8217;ve hit a problem. It&#8217;s very easy to come up with a great list of actionable items, and then very ea...]]></description>
			<content:encoded><![CDATA[<p><img src='http://chrismdp.github.com/files/card-of-the-day-1.png' alt='Current cards of the day at eden' /></p>

<p><em>Our current Card Of The Day board at Eden</em></p>

<p>Retrospectives are something we&#8217;ve been doing regularly for quite a while at Eden, but we&#8217;ve hit a problem. It&#8217;s very easy to come up with a great list of actionable items, and then very easy never to look at them again. Don&#8217;t tell me you&#8217;ve never done this :)</p>

<p>We&#8217;ve started doing something slightly different at Eden to try and stop this happening: we&#8217;re using a method we&#8217;ve called Card Of The Day.</p>

<p>When the retrospective is finished, we take all of the cards with <a href='http://en.wikipedia.org/wiki/SMART_criteria'>SMART</a> action goals and put them on our company kanban board to ensure they&#8217;re done. Then we take all the cards that are a little more hazy (the sort of cards that say: &#8220;Be better at X&#8221;), we pin them up on the wall, and every morning after standup we read one out at random to the team.</p>

<p>Normally this has a &#8220;ahh, yes&#8221; effect on the team. Sometimes it generates a conversation, sometimes an action we hadn&#8217;t thought of yet and something else to go on the Backlog. There&#8217;s always something that comes out of it.</p>

<p>It&#8217;s not a perfect method, but it&#8217;s working better than the alternative: feeling guilty at the beginning of the next retrospective about all the terribly important things we haven&#8217;t done.</p>

<p>Have you tried something similar? Or do you have an alternative way to remember to do retrospective actions?</p><img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/jLN9s051DTI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://chrismdp.github.com/2010/07/card-of-the-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://chrismdp.github.com/2010/07/card-of-the-day</feedburner:origLink></item>
		<item>
		<title>Agile UX and Design – What’s in it for me?</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/kAYkaR88JWI/</link>
		<comments>http://designeronrails.com/design/eden/ui/ux/2010/07/20/agile-ux-and-design/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 04:00:00 +0000</pubDate>
		<dc:creator>Spencer Turner</dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[eden]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://designeronrails.com/design/eden/ui/ux/2010/07/20/agile-ux-and-design</guid>
		<description><![CDATA[A friend nudged me on twitter to write a blog post about this, which was great for two reasons, firstly I was having a bad case of writers block (or at least procrastination), lots of things had made me nearly write a blog post, but not quite catalysed...]]></description>
			<content:encoded><![CDATA[<p>A friend nudged me on twitter to write a blog post about this, which was great for two reasons, firstly I was having a bad case of writers block (or at least procrastination), lots of things had made me <em>nearly</em> write a blog post, but not quite catalysed. (UX of Riverford&#8217;s new store, Should you try and make your copy SMART? etc.) Secondly, we are going to a UX retreat this weekend, and I think this might be a topic I want to discuss there, so thank you <a href='http://twitter.com/ohthatjames'>James</a> for the timely inspiration.</p>

<h2 id='creatives_and_agile__the_smell_of_fear'>Creatives and agile – The smell of fear&#8230;</h2>

<p>When I first started at Eden; in the designer part of my role, faced with an agile developer asking me to commit to short iterations, my gut instinct was panic. Not because I felt incapable, but because creativity isn&#8217;t something you always have, or can turn on, on demand. This was of course not the right reaction, or even justified. It was however, I suspect what most &#8216;creatives&#8217; feel when faced for the first time with seemingly short iterations.</p>

<h2 id='reality_check'>Reality Check</h2>

<p>It&#8217;s true, creativity waxes and wanes, but we cope with this all the time.</p>

<p>What are the tricks we use to do this?</p>

<ul>
<li>Limiting the fidelity that we work at (In the traditional design world, Marker visuals, Lorem ispum, Photoshop comps, low-res thumbnails of photos)</li>

<li>Trying our ideas out as quickly as possibly and discarding LOTS of bad ones. You still scribble stuff, right?</li>

<li>Slowly refining and enhancing ideas and designs (thumbnails, to mockups, to proofs etc.)</li>

<li>Working with a team to get things done quicker</li>

<li>Only presenting part of the solution (e.g. We need the Brochure first, lets start there)</li>

<li>Getting feedback from the client and refining at each stage.</li>

<li>Building some extra time into the deadline to make sure there is &#8216;wriggle room&#8217;</li>
</ul>

<h2 id='hmmm__maybe_its_not_so_bad_breathe'>Hmmm - Maybe it&#8217;s not so bad&#8230; Breathe.</h2>

<h3 id='you_are_already_doing_it'>You are already doing it!</h3>

<ul>
<li>Limiting fidelity, Agile Story Cards are a lo-fi method of capturing the idea of a piece of functionality.</li>

<li>Slow refinement - well that&#8217;s iterative development</li>

<li>Working with a team - You are part of the team (and maybe have your own team as well - double win!)</li>

<li>Only present part of the solution - Work on a small chunk of functionality at a time</li>

<li>Getting feedback early - Weekly (or even daily or less) releases mean constant feedback.</li>

<li>Wriggle room - You should be in the planning meeting and state if you can do it in time.</li>
</ul>

<h2 id='but_whats_in_it_for_me'>But What&#8217;s in it for me?</h2>

<ol>
<li><strong>Shorter time-frames add focus.</strong> Given longer, I won&#8217;t actually get more done, I&#8217;ll procrastinate until I have a looming deadline, then find focus.</li>

<li><strong>You&#8217;ll have happy customers</strong> At the end of the day, we all want to deliver things customers are happy with. The problem is that at the beginning of most projects, the customers think they know what that is (and don&#8217;t) and you think you undertsnd what they want (and don&#8217;t). If you do Agile design right, you can combat this by really establishing what the needs are and then delivering a solution to the real problem.</li>

<li><strong>Built in Fail.</strong> Sounds odd, I know, but it is liberating to acknowledge that you don&#8217;t have a crystal ball, and it&#8217;s not reasonable to expect to <em>entirely</em> acurately understand every problem and therfore, it&#8217;s impossible to provide a correct solution first time, every time.</li>

<li><strong>When you do get to see the whole, you have something real to design</strong> If you&#8217;ve iterated on your project, and kept the design (skinning) to a minimum, you can at the last responsible moment, start doing PSDs with the benefit of a working prototype which removes the &#8216;we&#8217;ll probably need a twitter widget here&#8217; page filling that creating PSDs often induces.</li>
</ol>

<h2 id='what_techniques_can_i_use'>What techniques can I use.</h2>

<p>This is a blog-post (or series) in itself. However, we&#8217;ve been trying out <a href='http://www.agileproductdesign.com/blog/the_new_backlog.html'>Story Mapping</a>, and <a href='http://www.adaptivepath.com/ideas/essays/archives/000863.php'>Sketchboarding</a>, both of which we&#8217;ve found pretty helpful.</p>

<p>My main tips are:</p>

<ol>
<li>
<p><strong>Pens and paper</strong> Scribble your ideas, perfect drawing is not required (anyone can draw a box!) and use it as a tool to facilitate conversation about your ideas.</p>
</li>

<li>
<p><strong>Conversation</strong> You need to talk. To your client, to thier stakeholders, to your team, to your developers and ideally along the line, you should talk to users (a lot).</p>
</li>

<li>
<p><strong>Avoid Photoshop early on</strong> We&#8217;ve found that photoshop gives a false impression of a finished solution. Unless your stakeholders need Photoshop visuals to get buy in, we say avoid them. Try and steer them towards wireframing. If they need them for buy-in (which many do) be very clear that they are an indication of what could be. Nothing more.</p>
</li>
</ol>

<h3 id='caveat_lector'>Caveat lector</h3>

<p>No amount of Agile allows you to not have to think. You still need an overview of the whole project in the back of your mind, when you are working on a small piece.</p>

<p>You&#8217;ll have to have an understanding not just of the problem, but of the solution, the technologies, the implications of decisions on the team and budget.</p>

<p>You will have to push back against developers and customers from time to time. That&#8217;s OK. Defend the things you genuinely feel are required.</p>

<h2 id='you_are_part_of_the_team'>You are part of the team</h2>

<p>Agile is all about collaboration. You need to be one of the team. Seriously, the siloing of creative vs. technical is just rubbish. Developers are unlikely to have your skills and vice versa. You will learn and teach a lot (as will they). Share your skills liberally, and everyone will benefit.</p>

<p>I think there is a whole post in how you get &#8216;on the team&#8217; and as it&#8217;s late and this is already a long post, I&#8217;ll come back to that another time.</p><img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/kAYkaR88JWI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://designeronrails.com/design/eden/ui/ux/2010/07/20/agile-ux-and-design/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://designeronrails.com/design/eden/ui/ux/2010/07/20/agile-ux-and-design/</feedburner:origLink></item>
		<item>
		<title>Learn to Type – Day 4</title>
		<link>http://feedproxy.google.com/~r/EdenDevelopment/~3/zQURWtuBe7Q/</link>
		<comments>http://edendevelopment.co.uk/blogs/aimee/2010/07/15/learn-to-type-day-4/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 19:15:09 +0000</pubDate>
		<dc:creator>aimee</dc:creator>
				<category><![CDATA[i use tags, not categories]]></category>
		<category><![CDATA[learn to type week]]></category>
		<category><![CDATA[practice]]></category>

		<guid isPermaLink="false">http://edendevelopment.co.uk/blogs/aimee/?p=96</guid>
		<description><![CDATA[I had a day off work today, so i&#8217;ve only just come to do my 5-minute test just now. 88wpm, hands covered, not so good as yesterday, but i am really tired at the end of a lovely exciting day.
I think i&#8217;ll go do a few powertyping exercises, followed by a few rounds of typeracer. [...]]]></description>
			<content:encoded><![CDATA[<p>I had a day off work today, so i&#8217;ve only just come to do my 5-minute test just now. 88wpm, hands covered, not so good as yesterday, but i am really tired at the end of a lovely exciting day.</p>
<p>I think i&#8217;ll go do a few powertyping exercises, followed by a few rounds of typeracer. In the meantime, enjoy this video that Enrique made: it&#8217;s me and Tom playing typeracer yesterday lunchtime!</p>
<p><a href="http://vimeo.com/13332121">Type Racers</a> from <a href="http://vimeo.com/ecomba">Enrique Comba Riepenhausen</a></p>
<p>I scored 102 words per minute, at 100% accuracy!!</p>
<img src="http://feeds.feedburner.com/~r/EdenDevelopment/~4/zQURWtuBe7Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://edendevelopment.co.uk/blogs/aimee/2010/07/15/learn-to-type-day-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://edendevelopment.co.uk/blogs/aimee/2010/07/15/learn-to-type-day-4/</feedburner:origLink></item>
	</channel>
</rss>
