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

<channel>
	<title>With Feeling</title>
	<atom:link href="http://with-feeling.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://with-feeling.com</link>
	<description>Stories about software</description>
	<lastBuildDate>Mon, 14 Nov 2011 23:38:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Solution-oriented problem solving</title>
		<link>http://with-feeling.com/2011/08/14/solution-oriented-problem-solving/</link>
		<comments>http://with-feeling.com/2011/08/14/solution-oriented-problem-solving/#comments</comments>
		<pubDate>Sun, 14 Aug 2011 23:17:59 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Methods]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[problem-solving]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=308</guid>
		<description><![CDATA[The core of solution-oriented problem solving consists of one set of questions TO ask and another set of questions NOT to ask. ]]></description>
			<content:encoded><![CDATA[<p>I like to think of myself as a solution-oriented problem solver, that is, when confronted with a problem, my primary goal is to fix it (find a solution), using whatever tools I can bring to my disposal, to the extent that those tools will help with a solution. And it is definitely the case that, in my professional career, the people I have most admired, respected, learned from, and enjoyed working with can all be described as solution-oriented problem solvers. These words also show up fairly often as desirable management buzz phrases that improve both results and morale.</p>
<p>However, in my experience, solution-oriented problem solving is not all that common. Since it is desirable and rare, one might conclude that it must be very difficult. However, I tried to formulate some recommended best practices for it and realized that it&#8217;s not really difficult at all. The core of solution-oriented problem solving consists of one set of questions TO ask and another set of questions NOT to ask.</p>
<h2>The four questions of solution-oriented problem solving</h2>
<p>Ask these in order whenever any problem comes up.</p>
<ol style="font-size: 16px;">
<li><strong>What happened/is happening?</strong></li>
<li><strong>Why did it happen?</strong></li>
<li><strong>How do we fix it?</strong></li>
<li><strong>How do we prevent similar problems from happening in the future?</strong></li>
</ol>
<h2>Questions that should NOT be asked</h2>
<p>Just as importantly, solution-oriented problem-solving requires that certain types of questions <strong>NOT</strong> be asked. The following questions make people defensive, are not helpful, and get in the way of actually solving the problem. Patterns in individual performance deficiencies, if recurring, may come up as answers to #3 and #4, but all such deficiencies should be looked at in context: were they due to impossible assignments, situational failings such as poor communication, or truly due to deficiencies of the person in the role?</p>
<ul>
<li><strong>• Whose fault is this?</strong></li>
<li><strong>• Why did that person screw up?</strong></li>
<li><strong>• Why is that person so incompetent?</strong></li>
</ul>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2011/08/14/solution-oriented-problem-solving/';
				digg_title = 'Solution-oriented problem solving';
				digg_bodytext = "The core of solution-oriented problem solving consists of one set of questions TO ask and another set of questions NOT to ask. ";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2011/08/14/solution-oriented-problem-solving/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>People will subscribe? Really?</title>
		<link>http://with-feeling.com/2010/12/28/people-will-subscribe-really/</link>
		<comments>http://with-feeling.com/2010/12/28/people-will-subscribe-really/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 05:40:36 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Musings and ramblings]]></category>
		<category><![CDATA[Bodhi Tree Bookstore]]></category>
		<category><![CDATA[charity]]></category>
		<category><![CDATA[donation]]></category>
		<category><![CDATA[spiritual space]]></category>
		<category><![CDATA[subscription]]></category>
		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=304</guid>
		<description><![CDATA[Towards the beginning of the year, I was rather upset to discover that the Bodhi Tree, a New Age bookstore/shop that is a Los Angeles institution, was closing. Not because I have any affinity for New Age anything, or bought any of their books, but because the atmosphere of the place was so amazing. I [...]]]></description>
			<content:encoded><![CDATA[<p>Towards the beginning of the year, I was rather upset to discover that the Bodhi Tree, a New Age bookstore/shop that is a Los Angeles institution, <a title="Bodhi Tree Bookstore to close" href="http://blogs.laweekly.com/informer/2010/01/bodhi_tree_bookstore_to_close.php">was closing</a>. Not because I have any affinity for New Age anything, or bought any of their books, but because the <em>atmosphere</em> of the place was so amazing. I liked to go there sometimes just to wander around, inhale the incense, drink a cup of free herbal tea from 70&#8217;s-vintage Solo cups with liners, and just <em>relax</em>. It was like being in a church that didn&#8217;t place any harsh, morally questionable demands on you. It was what I wanted my living room to be like if I ever got the hang of Feng Shui. It was a <em>spiritual space</em>.</p>
<p>So, I said to myself, how could we save it? It certainly is silly, in this day and ago of Amazon, to expect to make money as a bookstore. But could we save the spiritual space? Needless to say, I never came up with a solution, but the idea I was most fervent about involved making the store a non-profit space, welcome to all, making some money off of assorted sales but mainly supported by tax-deductible subscriptions. &#8220;Because <em>plenty of people</em> would be willing to spend $20 or so a month to ensure the continued existence of such a valuable space!&#8221; &#8212; I asserted passionately any number of times.</p>
<p>Fast-forward much of a year, and it&#8217;s <a title="Support Wikipedia" href="http://wikimediafoundation.org/wiki/Support_Wikipedia/en">Wikipedia&#8217;s fund-drive time</a>. Now, Wikipedia is also a valuable space. It&#8217;s the science fiction dream of accurate information available instantly online, only <em>better,</em> because it&#8217;s not related to any government, it strives to be unbiased, and it is truly available to anyone. If I have any sort of question, scientific, cultural, historical, you name it, I know that they are the most likely place to have the answer &#8212; or at least a good place to start &#8212; from <a href="http://en.wikipedia.org/wiki/Flashforward_(novel)#Plot_summary">the actual supernova that inspired <em>Flashforward</em></a> to a <a href="http://en.wikipedia.org/wiki/Superhero_live-action_television_series">list of TV superheroes (go Buffy!)</a> to a <a href="http://en.wikipedia.org/wiki/Comparison_of_open_source_configuration_management_software">list of open-source configuration management tools</a>. So, yeah, it&#8217;s valuable. And I&#8217;ve donated before because I believe in their value. And then Jimmy Wales sent me an email asking if, this year, I&#8217;d be willing to subscribe to support Wikipedia&#8230;.</p>
<p>And I asked myself, was my belief that people will subscribe to support something valuable just bullshit?</p>
<p>To save you all any worry, it didn&#8217;t take long for me to decide that NO, it WASN&#8217;T, and I am now a proud subscription supporter of Wikipedia. And yeah, you all should donate something too. Just imagine if you had to wade through cdc.gov and the sites of religious nutcases to find out <a href="http://en.wikipedia.org/wiki/Snuppy">details about the first cloned dog</a>.</p>
<p>And maybe then you can help me come up with ideas to promote, and support, an equivalent of the Bodhi Tree&#8230;</p>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2010/12/28/people-will-subscribe-really/';
				digg_title = 'People will subscribe? Really?';
				digg_bodytext = "";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2010/12/28/people-will-subscribe-really/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In defense of worry</title>
		<link>http://with-feeling.com/2010/03/19/in-defense-of-worry/</link>
		<comments>http://with-feeling.com/2010/03/19/in-defense-of-worry/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 03:50:14 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Musings and ramblings]]></category>
		<category><![CDATA[Alex Chilton]]></category>
		<category><![CDATA[goals]]></category>
		<category><![CDATA[Joan Jett]]></category>
		<category><![CDATA[Knocked Up]]></category>
		<category><![CDATA[seth godin]]></category>
		<category><![CDATA[talent]]></category>
		<category><![CDATA[The Runaways]]></category>
		<category><![CDATA[worry]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=291</guid>
		<description><![CDATA[Seth Godin had a post yesterday that reads, in its entirety (omitting the George Orwell quote): &#8220;Anxiety is nothing&#8230; but repeatedly re-experiencing failure in advance. What a waste.&#8221;
As with most of his assertions, this will attract a lot of comments. This time I&#8217;ll contribute some of them, because that assertion is a big fat cream [...]]]></description>
			<content:encoded><![CDATA[<p>Seth Godin had a <a href="http://sethgodin.typepad.com/seths_blog/2010/03/anxiety-is-nothing-but-repeatedly-experiencing-failure-in-advance.html">post</a> yesterday that reads, in its entirety (omitting the George Orwell quote): &#8220;Anxiety is nothing&#8230; but repeatedly re-experiencing failure in advance. What a waste.&#8221;</p>
<p>As with most of his assertions, this will attract a lot of comments. This time I&#8217;ll contribute some of them, because that assertion is a big fat cream puff of a target. Here&#8217;s a revision that I believe to be more accurate:</p>
<p style="text-align: left; padding-left: 60px;">Anxiety is nothing&#8230; but repeatedly re-experiencing failure in<br />
advance <em>hypothetically in your mind, which may allow you to take<br />
actions that prevent failure in reality.</em></p>
<p>That doesn&#8217;t mean that worry is the only thing you should be doing, or that incessant worry doesn&#8217;t have its costs that can prevent you from ever succeeding. However, worry can help prevent failure. Never worrying may result in heedless, repeated, or even unrecoverable failure. There are certainly many other strategies for achieving one&#8217;s goals that are more focused on success that are also essential, and these strategies may be better in terms of the comfort of the actor, but in terms of meeting goals, worry may be part of a well-balanced portfolio of strategies.</p>
<p>In other words, just thinking positive and keeping at it isn&#8217;t a guarantee of success.</p>
<p>Two recent pop-culture items I read yesterday have some bearing on this:</p>
<ol>
<li><a href="http://www.latimes.com/entertainment/news/la-et-runaways19-2010mar19,0,5152199.story">The LA Times review of &#8220;The Runaways&#8221;</a> describes an early scene in which Joan Jett badgers Kim Fowley and &#8220;persuades him to handle her band, which at the moment consists of Joan, her guitar and a vague idea.This didn&#8217;t cause me to think, &#8220;Look, see, anyone can succeed if they are just willing to be pushy enough.&#8221; Instead, what I thought was &#8220;OF COURSE it succeeded. She&#8217;s JOAN JETT! Her talent is so great that with any drive at all it was inevitable that something would work out.&#8221;</li>
<li>The flip side of this is the &#8220;redundant Web site listing movie nude scenes&#8221; that Seth Rogen&#8217;s character was working on in &#8220;Knocked Up&#8221;, which received a passing reference in <a href="http://www.slate.com/id/2248156/">a Slate discussion of &#8220;Greenberg&#8221;</a>. THAT effort was a pathetic failure. Not due to lack of enthusiasm, however. One of the more painful scenes in that movie is where Katherine Heigl tries to help Seth Rogen work on the site, and gets very excited about spotting some extreme nudity. It&#8217;s the same passion that exists in every startup, whether it succeeds or fails. It will not (and does not) help this startup at all. If the idea is dumb and derivative, no amount of passion will make it a success.</li>
</ol>
<p>So, the moral seems to be: you have to work hard and have drive, but it needs to be of service of something that is actually worthwhile, a good idea or something you are actually good at. You can have all the passion and positive thinking in the world, but if you keep applying it to worthless things you will get no results. Much the same way that worrying, in rehearsing failure, has a risk of training your brain to expect it, enthusiastically doing dumb things without any thought, analysis, or attempt at improvement (activities that often are accompanied by, and may be improved by, worry) definitely trains you, even more so, to be very good at doing dumb, useless things, until eventually you might never be able to learn how to do smart, useful things.</p>
<p>So, what&#8217;s the answer? Figure out something to do in which I&#8217;m Joan Jett, I guess. It&#8217;s OK to fail and it&#8217;s necessary to do a lot of work, but it needs to be in service of something with potential, not just any old idea that comes my way.</p>
<p><strong>Postscript:</strong> Yet another example to contemplate is <a href="http://www.latimes.com/entertainment/news/la-et-chilton-appreciation19-2010mar19,0,7880536.story">Alex Chilton</a>, who died on Wednesday of a heart attack. In the 1970&#8217;s he made some brilliant music in the band Big Star that was ahead of its time and completely failed to receive recognition. Unlike some artists, he didn&#8217;t have to die to get recognized: by the mid-80&#8217;s his music was being revered by the next generation of musicians and determinedly hip college students (including me) throughout the country. However, the bitterness of the earlier failure never seemed to leave him. He never did anything as brilliant again, and he had a distinctly ambivalent relationship with both the music of Big Star and with success itself. While he definitely made enough money to live as a musician, he was in no way even moderately well-off, and while he had a firm belief that he was being true to himself always, it was never clear that he was happy.</p>
<p>What does this have to do with worry? Well, many Big Star songs are overwhelmed with worry and pain: there are the obvious later ones such as &#8220;Holocaust&#8221; (about his mother&#8217;s death) and &#8220;Big Black Car&#8221; (featuring the achingly ironic lines &#8220;Nothing can hurt me/Nothing can touch me&#8221;), as well as earlier songs such as &#8220;What&#8217;s Going Ahn&#8221; (&#8220;I resigned everyone, ever since I was young&#8221;) and &#8220;Back of a Car&#8221; (&#8220;Thinking &#8217;bout what to say/Can&#8217;t find a lot&#8221;). His later work was completely lacking in worry: there were snarky blues originals and cheesy Italian pop song covers, all devoid of concern (or much emotion at all). He had stopped worrying, and as a consequence, he had stopped making music that mattered.</p>
<p><strong>Postscript #2:</strong> Much thanks to Arun Srinivasan, who called my attention to the original Seth Godin post and whose email thread with me about it inspired much of this post.</p>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2010/03/19/in-defense-of-worry/';
				digg_title = 'In defense of worry';
				digg_bodytext = "";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2010/03/19/in-defense-of-worry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s only easy if 1-2-3</title>
		<link>http://with-feeling.com/2010/01/18/its-only-easy-if-1-2-3/</link>
		<comments>http://with-feeling.com/2010/01/18/its-only-easy-if-1-2-3/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 02:22:59 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Methods]]></category>
		<category><![CDATA[Musings and ramblings]]></category>
		<category><![CDATA[People]]></category>
		<category><![CDATA[frontal cortex]]></category>
		<category><![CDATA[jonah lehrer]]></category>
		<category><![CDATA[strategies for getting things done]]></category>
		<category><![CDATA[willpower]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=275</guid>
		<description><![CDATA[I recently finished the book How We Decide by Jonah Lehrer, which was recommended to me by my good friend DC of Sentient Meat (he is also a primary inspiration for this blog). One of the studies in it suggested a strategy for effective high-level planning. The strategy itself is not new, but after I realized how the neurobiology supports it, it became much more compelling.]]></description>
			<content:encoded><![CDATA[<p>I recently finished the book <a href="http://www.amazon.com/How-We-Decide-Jonah-Lehrer/dp/0547247990/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1263867224&amp;sr=1-1"><em>How We Decide</em></a> by <a href="http://scienceblogs.com/cortex/">Jonah Lehrer</a>, which was recommended to me by my good friend DC of <a href="http://sentientmeat.net">Sentient Meat</a> (he is also a <a href="http://with-feeling.com/about">primary inspiration for this blog</a>). It&#8217;s an excellent book that covers many interesting topics in the neurobiology of decision-making and it&#8217;s definitely worth reading. One of the studies, however, suggested a little more than that&#8230; it actually suggested a strategy for effective high-level planning. The strategy itself is not new, but after I realized how the neurobiology supports it, it became much more compelling.</p>
<p>The study in question was fairly simple: people were asked to memorize either a 2-digit number or a 7-digit number, and then walked down a hall to another room where their memory of the number would be tested. On the walk, they passed a refreshment table that offered either fruit salad or chocolate cake. The point of the test was to see how the complexity of the memorization task would affect the subjects&#8217; willpower (the proxy for which was whether they chose the healthy fruit salad snack or the unhealthy chocolate cake). 59% of the 7-digit subjects chose the cake, as opposed to only 37% of the 2-digit subjects. Having to memorize 7 digits as opposed to 2 significantly diminished one&#8217;s willpower/ability to resist self-indulgent choices.</p>
<p>The theory behind the experiment is that the frontal cortex is responsible for both memorization and willpower, and the frontal cortex has a very limited capacity (other studies have shown it to be <a href="http://www.musanim.com/miller1956/">7±2</a> on average). So if all of your frontal cortex capacity is being used up holding memorized digits, there is little left over to resist the temptation of chocolate cake. So far, so interesting.</p>
<p><em>However,</em> the obvious application to this study, to me at least, is to strategies for getting things done. Accomplishing hard, complex, energy-intensive tasks, such as delivering a software product, studying for finals, or starting a company requires a <em>lot</em> of willpower: you have to do a lot of things, all of which require energy and many of which aren&#8217;t fun, in a  timely manner, even when you&#8217;re discouraged because something didn&#8217;t work out, even when you just want to hang out with friends, surf the web, or go to sleep. Accomplishing these tasks also requires knowing what subtasks you are working on: you have to have a list of high-priority tasks that you keep in your mind at all times. Thus these tasks require both willpower <em>and</em> memorization.</p>
<p>If your list of high-priority tasks contains 7 or more tasks, then you&#8217;ve used up all of your frontal cortex capacity on the list and have none left over for the willpower you will need to execute the list. In fact, since you&#8217;re going to need a <em>lot</em> of willpower, it&#8217;s probably better to allocate at least 50% of your cortex capacity for that. You can&#8217;t allocate all of it because you do need to keep focused on some high-priority items at all time. Focusing on just one is risky, as you may get stuck on it for a while and if you can&#8217;t immediately switch to another one, you&#8217;ll be less efficient. Each additional item you can add to your priority list decreases the risk of getting stuck: you want to have your list be as long as possible while still leaving space for willpower.</p>
<p>Given all this, the optimal strategy is clear: have a high-priority list of size 3. That&#8217;s the maximum size that will still leave at least 50% of the average frontal cortex capacity available for willpower.</p>
<p>So, if you&#8217;re trying to do something hard and complex, something that has many moving parts and requires lots of willpower, you should make a list of your top three tasks, focus on those, and save the rest of your cortex to provide the willpower. If you have fewer than 3 items you run a higher risk of getting stuck; if you have more, you are likely to run out of willpower before you get any of them done. You need a &#8220;must-do&#8221; list so that you get things done, but a list of 7 &#8220;must-do&#8221; things is just too hard for your brain to handle. A list of three, however, leaves you plenty of brainspace for willpower, and makes it (almost) easy.</p>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2010/01/18/its-only-easy-if-1-2-3/';
				digg_title = 'It&#8217;s only easy if 1-2-3';
				digg_bodytext = "I recently finished the book How We Decide by Jonah Lehrer, which was recommended to me by my good friend DC of Sentient Meat (he is also a primary inspiration for this blog). One of the studies in it suggested a strategy for effective high-level planning. The strategy itself is not new, but after I realized how the neurobiology supports it, it became much more compelling.";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2010/01/18/its-only-easy-if-1-2-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Announcement: associated_named_scope plugin for Rails</title>
		<link>http://with-feeling.com/2009/12/06/announcement-associated_named_scope-plugin-for-rails/</link>
		<comments>http://with-feeling.com/2009/12/06/announcement-associated_named_scope-plugin-for-rails/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 07:40:56 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Open source contributions]]></category>
		<category><![CDATA[named_scope]]></category>
		<category><![CDATA[Rails plugins]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=247</guid>
		<description><![CDATA[History
The overwhelming usefulness of named_scope is common knowledge in the Rails community. Named scopes are so useful that you want to use them everywhere, and that&#8217;s when you begin to encounter one of their frustrations: while they are quite easy to write and use, they are not always so easy to re-use.
Most of the time, [...]]]></description>
			<content:encoded><![CDATA[<h2>History</h2>
<p>The overwhelming usefulness of named_scope is common knowledge in the Rails community. Named scopes are so useful that you want to use them everywhere, and that&#8217;s when you begin to encounter one of their frustrations: while they are quite easy to write and use, they are not always so easy to <em>re</em>-use.</p>
<p>Most of the time, reuse is provided by the (also overwhelmingly useful) chaining feature of named scopes. If you want to use a named scope in an association (has_one, has_many, or belongs_to), you can simply define the association and then chain the scope to it, optionally defining a method to access it if you will be using it often. For example, if you have a named scope published_in_month on the Post class that finds all posts published in a given month, and the User class has_many posts, then the code to find all posts for a given user written in a given month is simply</p>
<pre>user.posts.published_in_month(month)</pre>
<p>If you want to combine two named scopes together, again, you can just chain them (again optionally defining a new method — in this case a class method). If Post has another named scope with_comments that returns posts with comments, then the following code finds all posts published in a given month that have comments:</p>
<pre>Post.published_in_month(month).with_comments</pre>
<p>So far, so very good. But what if you want to define a named scope that reuses a named scope not for the given class, but for one of its associations? To be more precise, what if you have a named scope published_in_month on the Post class that finds all posts published in a given month, and the User class has_many posts, and you want to write a named scope on User to find all users who have posts published in a given month? Sure, you can do</p>
<pre>(Post.published_in_month(month).collect {|post| post.user}).uniq</pre>
<p>but that&#8217;s a little harder to read — <em>and</em> is not itself a named scope, and thus doesn&#8217;t get executed as a single query and doesn&#8217;t have the nice features of named scopes such as chaining.</p>
<p>This problem came up emphatically in some code I was writing recently. In our system, many objects belongs to a user, a user has many addresses that include a travel radius, and an address may be within the range of a given lat/lng point. The SQL to calculate whether an address is in-range is pretty messy, as you&#8217;d expect, and it was showing up all over the code. I refactored to put it in a named scope in_range on Address, but what I really needed was a named scope to find all objects whose addresses (through their user) were within range of a given specific address, and there wasn&#8217;t a clean way to reuse the named scope on Address. And from that need was born this plugin, associated_named_scope.</p>
<p>Note: While looking around online to see if there was already such a thing available, I discovered that this request had been made <a href="http://dev.rubyonrails.org/ticket/11556">before</a> [discussion now moved <a href="http://groups.google.com/group/rubyonrails-core/browse_thread/thread/41e31b7a167b02ca">here</a>]. This plugin doesn&#8217;t exactly provide the syntax as requested there, but it does provide the same functionality.</p>
<h2>The plugin</h2>
<p>associated_named_scope is a Rails plugin that, quite simply, allows (re)using named scopes on child associations to define named scopes in the parent classes. It is available at</p>
<p><a href="http://github.com/Mechaferret/associated_named_scope">http://github.com/Mechaferret/associated_named_scope</a></p>
<h2>Usage</h2>
<p>associated_named_scope adds a new option :association to named_scope, which expects two suboptions:</p>
<ul>
<li>:source &#8212; the source association for the child named scope. You can specify nested associations using standard hash syntax (e.g., {:user=&gt;:addresses} for the addresses of the user of the current model).</li>
<li>:scope &#8212; the named scope itself. You can specify arguments to the scope by using an array [:scope_name, arg1, ...]</li>
</ul>
<p>These scopes chain and in every way behave just like normal named_scopes.</p>
<h2>Examples</h2>
<p>Here&#8217;s a simple example to find all users who have posts published in a given month:</p>
<pre>class Post &lt; ActiveRecord::Base
  belongs_to :user
  named_scope :published_in_month, lambda{|month|
    {:conditions=&gt;["month(posts.publication_date)=?", month]}}
end

class User &lt; ActiveRecord::Base
  has_many :posts
  named_scope :has_posts_for_month, lambda{|month|
    {:association=&gt;{:source=&gt;:posts, :scope=&gt;[:published_in_month, month]}}
  }
end</pre>
<p>And here&#8217;s a more complex example, using a nested association:</p>
<pre>class Address &lt; ActiveRecord::Base
  belongs_to :addressable, :polymorphic =&gt; true

  named_scope :in_range, lambda {|lat, lng, zip_code|
    {:conditions =&gt;
      "(
        (POW(addresses.radius,2) &gt;=
          (POW(69.1*(#{lat}-addresses.lat),2) +
            POW(69.1*(#{lng}-addresses.lng) * cos(#{lat} / 57.3), 2)
          )
        )
        OR (addresses.zip = '#{zip_code}')
      )"
    }}
end

class User &lt; ActiveRecord::Base
  has_one :object_with_user
  has_many :addresses, :as =&gt; :addressable
end

class ObjectWithUser &lt; ActiveRecord::Base
  belongs_to :user
  named_scope :within_range, lambda{|address|
   {:association=&gt;{:source=&gt;{:user=&gt;:addresses},
     :scope=&gt;[:in_range, address.lat, address.lng, address.zip]}}}
end</pre>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2009/12/06/announcement-associated_named_scope-plugin-for-rails/';
				digg_title = 'Announcement: associated_named_scope plugin for Rails';
				digg_bodytext = "";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2009/12/06/announcement-associated_named_scope-plugin-for-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Everyone should update to the new AASM plugin</title>
		<link>http://with-feeling.com/2009/11/27/everyone-should-update-to-the-new-aasm-plugin/</link>
		<comments>http://with-feeling.com/2009/11/27/everyone-should-update-to-the-new-aasm-plugin/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 02:05:57 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AASM]]></category>
		<category><![CDATA[acts_as_state_machine]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Rails plugins]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=211</guid>
		<description><![CDATA[This post is dedicated to lavishing praise on something I had no hand in creating, but which I am very fond of right now: the new AASM update of the acts_as_state_machine plugin. It&#8217;s brilliant. Really. Everyone who uses acts_as_state_machine (which should be everyone who has a Rails app, because there&#8217;s no such thing as a [...]]]></description>
			<content:encoded><![CDATA[<p>This post is dedicated to lavishing praise on something I had no hand in creating, but which I am very fond of right now: the new <a href="http://github.com/rubyist/aasm">AASM update</a> of the acts_as_state_machine plugin. It&#8217;s brilliant. Really. Everyone who uses acts_as_state_machine (which should be everyone who has a Rails app, because there&#8217;s no such thing as a web application without at least one object with complex, business-driven state rules) should go and update it to use AASM <strong><em>right now.</em></strong></p>
<p>Some background: I&#8217;m writing code that needed to create an instance of NewModel for every existing instance of OldModel that was in one particular state (where OldModel implemented acts_as_state_machine). I check the code: sure enough, there are no named scopes to get only objects in that state. I could just write code to cover this case, but given how easy it should be to generate a named scope for each state, that seems like the wrong answer. Thus, I begin the following dialog:</p>
<p style="padding-left: 30px;"><strong>Me:</strong> Does anyone know if acts_as_state_machine can generate named scopes for each state?<br />
<strong>Other developer:</strong> No, I don&#8217;t think it does.<br />
<strong>OD:</strong> That sure would be useful though.<br />
<strong>M:</strong> And pretty easy to write&#8230;. But before I do that, let me check and see if anyone has updated it.<br />
<strong>Other other developer:</strong> I made some modifications to acts_as_state_machine for that model, so that it could transition to multiple states.<br />
<strong>M:</strong> (looking at the code in lib) Cool! It&#8217;s basically an implementation of a nondeterministic state machine.<br />
<strong>OOD:</strong> I didn&#8217;t do it myself, I got it here. (IM&#8217;s me a link to <a href="http://justbarebones.blogspot.com/2007/11/actsasstatemachine-enhancements.html">http://justbarebones.blogspot.com/2007/11/actsasstatemachine-enhancements.html</a>.)<br />
<strong>M:</strong> Now I&#8217;m definitely looking to see what the latest acts_as_state_machine is.</p>
<p>To github I go, where I find AASM at <a href="http://github.com/rubyist/aasm/">http://github.com/rubyist/aasm/</a>. Documentation is weak (I may try to contribute to that), but the code looks promising and has the multiple-state transitions OOD was using, as well as the ability to define specific actions on initial_state/final_state/transition triads. I download it, do a quick check to verify that it does in fact automatically generate named scopes for each state, and pop it in. A few syntax adjustments (everything is now prefixed with “aasm_”) and my new code works great.</p>
<p>Some of the old code, however, has started throwing errors. Why? Because it&#8217;s calling invalid state transitions! Apparently the old acts_as_state_machine just silently ignored them, while this one complains. Which is <em>good</em>, because now I can see that our mandatory email notifications weren&#8217;t getting generated sometimes, specifically in the cases in which the object was in an invalid state for the event that should generate them.</p>
<p>The new AASM allows transitions from a state to itself, and the aforementioned specific actions on initial_state/final_state/transition triads, though, so fixing the newly-discovered bug is as easy as defining a new transition and specific action. And now everything works, correctly, and AASM has helped me fix a bug I didn&#8217;t even know we had.</p>
<p>Summary of advantages of AASM over old acts_as_state_machine that I discovered in about half an hour of usage:</p>
<ol>
<li>AASM generates named scopes for each state.</li>
<li>AASM allows nondeterministic transitions: that is, an object can transition from one state to a list of other states on an event, with the actual final state determined at runtime.</li>
<li>AASM allows specification of actions on initial_state/final_state/transition triads.</li>
<li>AASM actually throws errors on invalid state transitions, thus making debugging easier.</li>
</ol>
<p>I&#8217;m sure there any many more, but that was more than enough to make my coding day much easier. And the actual code activity required to do the update is, as noted above, minimal.</p>
<p>I&#8217;m not sure if the authors think that the new version is <a href="http://rubyi.st/aasm/">completely ready for prime time</a>. But in my experience it&#8217;s so much better than the old one (and also hasn&#8217;t displayed any bugginess), so I don&#8217;t think you need to wait.</p>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2009/11/27/everyone-should-update-to-the-new-aasm-plugin/';
				digg_title = 'Everyone should update to the new AASM plugin';
				digg_bodytext = "";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2009/11/27/everyone-should-update-to-the-new-aasm-plugin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Agile web development and the wisdom of crowds</title>
		<link>http://with-feeling.com/2009/11/23/agile-web-development-and-the-wisdom-of-crowds/</link>
		<comments>http://with-feeling.com/2009/11/23/agile-web-development-and-the-wisdom-of-crowds/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 21:32:58 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Methods]]></category>
		<category><![CDATA[A/B testing]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[lean manufacturing]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[web analytics]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=160</guid>
		<description><![CDATA[In my previous post, I discussed how hard it can be to do the feedback loop for agile development well when the product you are developing is a general-audience web application.
There is one way, however, in which web applications offers a distinct advantage over other types of applications for agile development: measurement. Measurement is a [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://with-feeling.com/2009/11/08/the-feedback-loop-in-agile-web-development">previous post</a>, I discussed how hard it can be to do the feedback loop for agile development well when the product you are developing is a general-audience web application.</p>
<p>There is one way, however, in which web applications offers a distinct advantage over other types of applications for agile development: measurement. Measurement is a <a href="http://en.wikipedia.org/wiki/Lean_manufacturing#Measure"> key part</a> of the feedback cycle for lean processes, but finding the right metrics to optimize value for your customers can be challenging. Web applications, however, can give you incredible amounts of data about what your users actually <em>do</em>: how they reach your site, what they do when they get there, whether they continue an activity or drop off. Everything they do is done through the web application, so everything they do can be retained for further study.</p>
<p>Given this wealth of data, it becomes much easier than in other forms of development to form and test hypotheses about what your users want. You can do &#8220;A/B&#8221; testing, randomly offering them different implementations of the same feature, and seeing which one does better in achieving your desired goal. Or you can do simple analytics: change a feature, and see how much your desired goal changes. You can also easily collect application-specific data, e.g., which products seem to get purchased together, what attributes of a customer make them likely to order the high-end version of a product, the relationship between followup contact with a customer and repeat purchases.</p>
<p>You get to use <em>your entire user base</em> to estimate the value of a given feature for your desired target audience. Because these users are part of your target audience and because of the effect of the <a href="http://en.wikipedia.org/wiki/The_Wisdom_of_Crowds">&#8220;wisdom of crowds&#8221;</a>, their collective evaluation will be far better than the a priori evaluation of your product team.</p>
<p>Of course, I&#8217;m glossing over the difficulty of figuring out in sufficient detail what your goals are and how to measure them. But often the goal is obvious and the results of the basic data can be compelling. We recently experienced this on a web application I&#8217;m currently working on. We were having a debate about exactly how much information to request on an initial inquiry form. Some of the team wanted to request some information on the form that would be of use for a possible future product (but which also could be collected elsewhere), while others wanted to keep the form&#8217;s size to a minimum. The application on production at the time of the debate was collecting the data. In the next release, we stopped collecting the data, and the inquiry completion rate immediately doubled and stayed there. After that, there was no more need for debate about collecting the extra data in the form.</p>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2009/11/23/agile-web-development-and-the-wisdom-of-crowds/';
				digg_title = 'Agile web development and the wisdom of crowds';
				digg_bodytext = "";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2009/11/23/agile-web-development-and-the-wisdom-of-crowds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The feedback loop in agile web development</title>
		<link>http://with-feeling.com/2009/11/08/the-feedback-loop-in-agile-web-development/</link>
		<comments>http://with-feeling.com/2009/11/08/the-feedback-loop-in-agile-web-development/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 06:49:25 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Methods]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[customer development]]></category>
		<category><![CDATA[lean startups]]></category>
		<category><![CDATA[waterfall]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=141</guid>
		<description><![CDATA[If your application is internal and your user base is well-known, collecting and acting on feedback is easy. You have your designated "onsite customer" and maybe a few others use the latest iteration of the product and tell you what they think. But what should you do if your application is a consumer-facing web application with anonymous customers, most of whom are far more likely to go away if they are not receiving value than to fill out a feedback  form?]]></description>
			<content:encoded><![CDATA[<p>Everyone knows that waterfall software development is <strong>bad</strong> and agile software development is <strong>good</strong>.¹ The stated reason for this is that agile development gets working software to customers faster, thus (1) providing them value sooner and (2) allowing earlier feedback, so that there is less wasted effort that does not add value.</p>
<p>But how do you decide what constitutes &#8220;wasted effort that does not add value&#8221;? The accepted non-software touchstone for agile development, <a href="http://en.wikipedia.org/wiki/Lean_manufacturing">&#8220;lean manufacturing&#8221;</a>, defines &#8220;wasted effort&#8221; as &#8220;anything that does not create value for the end customer&#8221;. But how do you know what the end customer values?</p>
<p>Obviously (you say), you figure it out from the &#8220;earlier feedback&#8221;.</p>
<p>Yeah? How?</p>
<p>If your application is internal and your user base is well-known, collecting and acting on feedback is easy. You have your designated &#8220;onsite customer&#8221; and maybe a few others use the latest iteration of the product and tell you what they think. But what should you do if your application is a consumer-facing web application with anonymous customers, most of whom are far more likely to go away if they are not receiving value than to fill out a feedback  form?</p>
<p>Yes, that&#8217;s when it gets interesting.</p>
<p>One clear way <em>not</em> to go is to assume that the internal product team, possibly augmented with IA/UX and usability experts, can figure out what your target users want by applying &#8220;usability standards&#8221; and &#8220;domain knowledge&#8221;. While all of these activities have their uses, the risk is high that the initial concept will not be what the users want. This will result in the following cycle:</p>
<ol style="margin-top: 12px; margin-bottom: 12px;">
<li>Figure out concept of product.</li>
<li>Design product in conjunction with IA/UX experts, taking care that each page is easy-to-use and well-designed.</li>
<li> Take at least 2 months to build the product because each page has to be perfectly designed.</li>
<li>Since you&#8217;re trying to be &#8220;agile&#8221;, don&#8217;t take more than two months; put the team on death march to deliver the completed product on schedule.</li>
<li>Discover that the users don&#8217;t seem to value the new product enough, as measured by the lack of usage or revenue.</li>
<li>Repeat.</li>
</ol>
<p>This is a loop, certainly, but it is hardly a feedback loop. Feedback is not obtained until step (5), and it&#8217;s not very precise: it&#8217;s either &#8220;yay&#8221; (we have users and are making money) or &#8220;boo&#8221; (we&#8217;re not), which gives you very little to go on for the next iteration.</p>
<p>Four of those cycles can easily take up a year without adding any value for the end customer. By then, you might as well have just used the year to develop the product using a waterfall development process: you&#8217;d have created just as much value for the user, and your team wouldn&#8217;t be frazzled with impossible deadlines and frustrated by doing the same thing over and over. In fact, often this process <em>does</em> devolve into a form of waterfall development: the coding process may be agile, but the visual design process of</p>
<p style="text-align: center;">Product feature&#8211;&gt;wireframe&#8211;&gt;Photoshop mockup&#8211;&gt;approved page</p>
<p>is done strictly in sequence, i.e., waterfall.</p>
<p>Happily, this is not a problem without known solutions. The idea of <a href="http://www.startuplessonslearned.com/2008/09/lean-startup.html">&#8220;lean startups&#8221;</a>, incorporating <a href="http://www.slideshare.net/venturehacks/customer-development-methodology-presentation">&#8220;customer development&#8221;</a>, has some excellent strategies for avoiding the above trap: don&#8217;t make product decisions in a vacuum, develop customers in parallel with developing features, find early adopters for feedback and enlist them as your allies, make your first release as early as possible, make subsequent incremental releases near-continuously.</p>
<p>The lean startup method gives you real feedback for your web application as early as possible. It also has the nice side benefit of creating a cadre of enthusiastic evangelists for your product as it works. <em>That</em> is a feedback loop well worth implementing.</p>
<p>¹Assuming that the requirements are not well-understood, that costs of changing the system after release are not unacceptable, <a href="http://agilemanifesto.org/">you know the drill&#8230;.</a></p>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2009/11/08/the-feedback-loop-in-agile-web-development/';
				digg_title = 'The feedback loop in agile web development';
				digg_bodytext = "If your application is internal and your user base is well-known, collecting and acting on feedback is easy. You have your designated "onsite customer" and maybe a few others use the latest iteration of the product and tell you what they think. But what should you do if your application is a consumer-facing web application with anonymous customers, most of whom are far more likely to go away if they are not receiving value than to fill out a feedback  form?";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2009/11/08/the-feedback-loop-in-agile-web-development/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Announcement: sql_crypt plugin for Rails</title>
		<link>http://with-feeling.com/2009/10/24/announcement-sql_crypt-plugin-for-rails/</link>
		<comments>http://with-feeling.com/2009/10/24/announcement-sql_crypt-plugin-for-rails/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 02:51:25 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Open source contributions]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[Rails plugins]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=136</guid>
		<description><![CDATA[sql_crypt is a plugin for Rails which provides two-way encryption of ActiveRecord attributes in a database using database encryption functions (instead of encrypting in code). Currently it only supports MySQL.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just released an open source plugin for Rails called sql_crypt, available at <a href="http://github.com/Mechaferret/sql_crypt"></a></p>
<p><a href="http://github.com/Mechaferret/sql_crypt">http://github.com/Mechaferret/sql_crypt</a></p>
<p>This plugin provides two-way encryption of ActiveRecord attributes in a database using database encryption functions, instead of encrypting in code. This is useful when you are encrypting large numbers of model objects at once, for which Ruby encryption can be too slow, or if other applications written in languages besides Ruby are accessing the encrypted attributes, which would require keeping multiple implementations of the encryption algorithm synchronized.</p>
<h3>Usage</h3>
<p>Using sql_crypt is very simple. The following example will encrypt the &#8220;balance&#8221; attribute of an Account model:</p>
<pre>
<pre>class Account &lt; ActiveRecord::Base
  sql_encrypted :balance, :key =&gt; 'my_secret_key'</pre>
</pre>
<p>You can specify multiple fields on the same line if they are using the same key; use separate lines for different keys, e.g.</p>
<pre>  sql_encrypted :cc_number, :ssn, :key =&gt; 'fIn^nce-dan{}er'
  sql_encrypted :password, :key =&gt; 'password'</pre>
<p>will encrypt &#8220;cc_number&#8221; and &#8220;ssn&#8221; using the key &#8216;fIn^nce-dan{}er&#8217; and &#8220;password&#8221; using the key &#8216;password&#8217;.</p>
<h3>History</h3>
<p>I was working on a payroll application, which obviously needed to have two-way encryption for many different fields: salary, bonuses, reimbursements. The application has a summary page that would fetch data for all employees and display it on a single page. Originally, I implemented the encryption in Ruby using the crypt gem, but with over 100 employees the summary page was getting very slow to load. Thus, I switched to using MySQL&#8217;s aes_encrypt/aes_decrypt, which fixed that problem. Since I had many different attributes that needed encryption, it made sense to create a class method to specify that an attribute would be encrypted, and thus the code for sql_crypt was initially written.</p>
<p>Later, we had two separate applications that were accessing two-way encrypted fields using both Rails and PHP, and we were having some trouble getting the MD5 implementations to match. Reusing the sql_crypt code from the payroll app was the obvious solution. Once that was done, the code was general enough that, with a few tweaks, it seemed like it might be made useful for the general community. I made the tweaks, and sql_crypt is now publicly available.</p>
<p>All comments and suggestions are welcome.</p>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2009/10/24/announcement-sql_crypt-plugin-for-rails/';
				digg_title = 'Announcement: sql_crypt plugin for Rails';
				digg_bodytext = "sql_crypt is a plugin for Rails which provides two-way encryption of ActiveRecord attributes in a database using database encryption functions (instead of encrypting in code). Currently it only supports MySQL.";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2009/10/24/announcement-sql_crypt-plugin-for-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The all-hands meeting: what we have here is a failure to communicate</title>
		<link>http://with-feeling.com/2009/09/28/the-all-hands-meeting-what-we-have-here-is-a-failure-to-communicate/</link>
		<comments>http://with-feeling.com/2009/09/28/the-all-hands-meeting-what-we-have-here-is-a-failure-to-communicate/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 05:13:39 +0000</pubDate>
		<dc:creator>Mechaferret</dc:creator>
				<category><![CDATA[Musings and ramblings]]></category>
		<category><![CDATA[People]]></category>
		<category><![CDATA[all-hands meeting]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[meetings]]></category>
		<category><![CDATA[team-building]]></category>

		<guid isPermaLink="false">http://with-feeling.com/?p=121</guid>
		<description><![CDATA[There is the all-hands meeting that is announced with very little notice and no explanation, that is probably occurring either because the company got sold (and everyone is rich) or the company is doing layoffs (and everyone is unemployed), that has everyone whispering and speculating and wondering....

I'm not talking about that kind of meeting.]]></description>
			<content:encoded><![CDATA[<p>There is the all-hands meeting that is announced with very little notice and no explanation, that is probably occurring either because the company got sold (and everyone is rich) or the company is doing layoffs (and everyone is unemployed), that has everyone whispering and speculating and wondering for the few hours until the meeting itself occurs, a meeting in which everyone <em>definitely</em> wants to know what will be said.</p>
<p>I&#8217;m not talking about that kind of meeting.</p>
<p>Nor am I talking about all-hands meetings in which a bunch of people that work at geographically dispersed locations get together to meet in person and get to know each other (aka &#8220;culture-building&#8221; or &#8220;a party&#8221;) or the all-hands working group meeting, in which a team gets together offsite to do some focused work (aka &#8220;work, but in a more fun location&#8221;).</p>
<p>No, I am talking about the every-quarter-or-so, multi-hour to multi-day meeting with a detailed agenda and attendees sitting in chairs desperately trying not to fall asleep, the one where the people &#8220;up top&#8221; get together with the rank and file to &#8220;explain everything that&#8217;s going on right now&#8221;. The sort of meetings that truly give meetings a bad name and lead to <a title="37signals hates meetings" href="http://37signals.com/svn/archives2/meetings_considered_harmful.php">manifestos like this one</a>.</p>
<p>The main problem with these meetings is that they should <em>never be necessary.</em> The large-scale direction and upcoming products that are discussed in these meetings should be common knowledge to the people who work for you, part of their DNA, inhaled along with the air. I ran an organization of over 25 people for 3 years, and I never once held an all-hands meeting, and yet everyone was quite aware of where the company was going, and what the new products were, and which major customers and markets we were currently focusing on. They knew it because every day, in various scrums, I would mention that &#8220;this feature is for company X&#8221; or &#8220;we might be on a tight deadline next month because we need to release for trade show Y&#8221;. They knew it because I met with my direct reports once a week and planned out what we were doing, and then they told their reports, and so on. They knew it because any time someone was assigned a task, the explanation for the corporate need for the task would accompany the assignment, unless the person already knew it. It&#8217;s not that hard.</p>
<p>If you feel the need to have an all-hands meeting to explain &#8220;what&#8217;s going on&#8221;, you aren&#8217;t communicating adequately on a day-to-day basis. Thus your team is most likely confused and/or apathetic, and is definitely not working together with you towards your common goals, because <em>they don&#8217;t know what the goals are.</em> It is the absolute antithesis of the recipe for productive, high-performance teams.</p>
<p>The other possible explanation for big-bang all-hands meetings is that the team <em>does</em> know what you&#8217;re going to tell them, but you as a manager like to stand up in front of everyone and tell them what&#8217;s going on because you get something out of it, because it reinforces the management hierarchy and your position in it, because you feel like it earns you respect. In that case, instead of failure to communicate, what you have is straight-up poor management. Standing in front of a room full of people telling them things they already know, while they look bored and try not to roll their eyes, does nothing but reinforce belief in the <a href="http://en.wikipedia.org/wiki/Peter_Principle">Peter Principle</a>.</p>
<p>Either way, when corporate management feels the need for periodic, large-scale all-hands meetings, the first question should be &#8220;In what way is company communication or management failing that there seems to be a need to hold this meeting?&#8221; One might consider having the team all get together for &#8220;work, but in a more fun location&#8221; or even &#8220;a party&#8221; to try to answer that question.</p>
		<div style="float:right;margin:10px 10px 0px 0px;">
			<script type="text/javascript">
				digg_url = 'http://with-feeling.com/2009/09/28/the-all-hands-meeting-what-we-have-here-is-a-failure-to-communicate/';
				digg_title = 'The all-hands meeting: what we have here is a failure to communicate';
				digg_bodytext = "There is the all-hands meeting that is announced with very little notice and no explanation, that is probably occurring either because the company got sold (and everyone is rich) or the company is doing layoffs (and everyone is unemployed), that has everyone whispering and speculating and wondering....

I'm not talking about that kind of meeting.";
									digg_skin = '';
													digg_topic = 'software';
													digg_bgcolor = '#ed91f7';
													digg_window = 'new';
											</script>
			<script src="http://digg.com/tools/diggthis.js" type="text/javascript"></script> 		
		</div>
		]]></content:encoded>
			<wfw:commentRss>http://with-feeling.com/2009/09/28/the-all-hands-meeting-what-we-have-here-is-a-failure-to-communicate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

