<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Self Modifying.</title>
	<atom:link href="http://blog.selfmodifying.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.selfmodifying.com</link>
	<description>The weblog of Ryan Garver.  A coffee nut.  An agile freak.</description>
	<lastBuildDate>Tue, 02 Feb 2010 01:38:33 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='blog.selfmodifying.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/dd4961a826989b7a52e1ae8fbe14143a?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Self Modifying.</title>
		<link>http://blog.selfmodifying.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.selfmodifying.com/osd.xml" title="Self Modifying." />
	<atom:link rel='hub' href='http://blog.selfmodifying.com/?pushpress=hub'/>
		<item>
		<title>User Stories and Mind Mapping</title>
		<link>http://blog.selfmodifying.com/2010/02/02/user-stories-and-mind-mapping/</link>
		<comments>http://blog.selfmodifying.com/2010/02/02/user-stories-and-mind-mapping/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 01:38:33 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[agility]]></category>
		<category><![CDATA[mind map]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[agile process]]></category>
		<category><![CDATA[mind maps]]></category>
		<category><![CDATA[requirement collection]]></category>
		<category><![CDATA[user story]]></category>

		<guid isPermaLink="false">http://blog.selfmodifying.com/?p=83</guid>
		<description><![CDATA[I read an article recently by Robert Dempsey about how he has recently discovered mind mapping as a way to manage user stories.  His technique was interesting and it gave me the excuse I needed to take another shot at mind mapping.
I&#8217;ve tried mind mapping in the past and it never really stuck for me. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=83&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I read an <a href="http://blog.adsdevshop.com/2010/01/29/use-mindmapping-to-craft-user-stories/" target="_blank">article</a> recently by Robert Dempsey about how he has recently discovered mind mapping as a way to manage user stories.  His technique was interesting and it gave me the excuse I needed to take another shot at mind mapping.</p>
<p>I&#8217;ve tried mind mapping in the past and it never really stuck for me.  It was a little too free form.  I needed some structure for my ideas, that&#8217;s why I was looking for something in the first place.  Robert&#8217;s post briefly describes the structure that he has used for forming user stories.  The method made the idea click a little bit better.  Basically he starts with the project in the center and then the ring out is the different actors.  Hanging off the actors are the actions that they should be doing.</p>
<p>I downloaded the 30 day trial of <a href="http://www.mindjet.com/products/mindmanager-8-mac/overview" target="_blank">MindJet MindManager</a> and tried Robert&#8217;s technique out on my current project.  It was a lot easier to get started that it had been on previous attempts with mind mapping, but I kept feeling like something was missing.  Here&#8217;s what finally clicked for me: <strong>what the user does is less important than why they want to do it</strong>.</p>
<p>In the classic user story we have an actor, an action, and a business value that the story provides (As an &lt;actor&gt; I want to &lt;action&gt; so I can &lt;business value&gt;).  I slightly modified Robert&#8217;s approach and added a level for business value &#8212; the &#8220;so I can&#8221; clause of a user story.  Now I have the project in the center, next the actors, and then I start listing out the business value that each actor wants to get from the app that we are building.  Under each of these leaves I can then start describing actions that would provide the actor with the business value.</p>
<p>This really make things click.  My ideas started to come together and I feel like the result is clear user stories that are customer business value focused.  I need to thank Robert again for convincing me to dig in to mind maps again.  I think this will be a big help in focusing my ideas in to something communicable and implementable.</p>
<br />Filed under: <a href='http://blog.selfmodifying.com/category/agility/'>agility</a>, <a href='http://blog.selfmodifying.com/category/mind-map/'>mind map</a>, <a href='http://blog.selfmodifying.com/category/software-design/'>software design</a> Tagged: <a href='http://blog.selfmodifying.com/tag/agile-process/'>agile process</a>, <a href='http://blog.selfmodifying.com/tag/mind-maps/'>mind maps</a>, <a href='http://blog.selfmodifying.com/tag/requirement-collection/'>requirement collection</a>, <a href='http://blog.selfmodifying.com/tag/user-story/'>user story</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=83&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2010/02/02/user-stories-and-mind-mapping/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>
	</item>
		<item>
		<title>Up and running with MagLev</title>
		<link>http://blog.selfmodifying.com/2009/11/21/up-and-running-with-maglev/</link>
		<comments>http://blog.selfmodifying.com/2009/11/21/up-and-running-with-maglev/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 17:58:05 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[maglev]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[smalltalk]]></category>

		<guid isPermaLink="false">http://blog.selfmodifying.com/?p=74</guid>
		<description><![CDATA[The MagLev alpha was released recently.  Before I get too far in to this post I need to make it clear that I&#8217;m not affiliated with the MagLev development team.  I&#8217;m not really even much of a Ruby interpreter hacker.  I&#8217;m a curious ruby developer that has heard some interesting things about the project and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=74&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://groups.google.com/group/maglev-discussion/browse_thread/thread/1102993e9e21492a" target="_blank">The MagLev alpha was released recently</a>.  Before I get too far in to this post I need to make it clear that I&#8217;m not affiliated with the MagLev development team.  I&#8217;m not really even much of a Ruby interpreter hacker.  I&#8217;m a curious ruby developer that has heard some interesting things about the project and wanted to get it up and running now that it&#8217;s available.  I decided to make this post because the install and setup procedure is anything but standard.  It&#8217;s not complicated, just not what you normally would expect.</p>
<p>First lets get the code:</p>
<pre class="brush: bash;">
$ git clone git://github.com/MagLev/maglev.git

Initialized empty Git repository in /Users/rgarver/Sources/maglev/.git/
remote: Counting objects: 28955, done.
remote: Compressing objects: 100% (12671/12671), done.
remote: Total 28955 (delta 15669), reused 28427 (delta 15200)
Receiving objects: 100% (28955/28955), 14.97 MiB | 539 KiB/s, done.
Resolving deltas: 100% (15669/15669), done.
Checking out files: 100% (2180/2180), done.
Initialized empty Git repository in /Users/rgarver/Sources/maglev/.git/remote: Counting objects: 28955, done.remote: Compressing objects: 100% (12671/12671), done.remote: Total 28955 (delta 15669), reused 28427 (delta 15200)Receiving objects: 100% (28955/28955), 14.97 MiB | 539 KiB/s, done.Resolving deltas: 100% (15669/15669), done.Checking out files: 100% (2180/2180), done.

$ cd maglev
</pre>
<p>Great, we have the code.  Next step is to do a base install.  This installs the base libraries and GemStone which is the fabled persistence layer that MagLev has integrated.  <a href="http://en.wikipedia.org/wiki/Gemstone_Database_Management_System">GemStone</a> is a object persistence layer originally built for Smalltalk.  If you haven&#8217;t ever played with Smalltalk or some of the variants (eg: Squeak) I recommend it.  It will turn your head upside down.</p>
<pre class="brush: bash;">
$ ./install.sh
[Info] Starting installation of MagLev-22578.MacOSX on sirius.local
Password:
Sat Nov 21 09:22:44 PST 2009
[Info] Setting up shared memory
  Total memory available is 4096 MB
  Max shared memory segment size is 4 MB
  Max shared memory allowed is 4 MB
[Info] Increasing max shared memory segment size to 2048 MB
kern.sysv.shmmax: 4194304 -&gt; 2147483648
[Info] Increasing max shared memory allowed to 2048 MB
kern.sysv.shmall: 1024 -&gt; 524288
[Info] Adding the following section to /etc/sysctl.conf
# kern.sysv.shm* settings added by MagLev installation
kern.sysv.shmmax=2147483648
kern.sysv.shmall=524288
kern.sysv.shmmin=1
kern.sysv.shmmni=32
kern.sysv.shmseg=8
[Info] Setting up GemStone netldi service port
[Info] Adding &quot;gs64ldi  51456/tcp&quot; to /etc/services
[Info] Downloading GemStone archive using /opt/local/bin/wget
--2009-11-21 09:22:44--  http://glass-downloads.gemstone.com/maglev/GemStone-22578.MacOSX.zip
Resolving glass-downloads.gemstone.com... 207.171.185.197
Connecting to glass-downloads.gemstone.com|207.171.185.197|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 74858717 (71M) [application/zip]
Saving to: `GemStone-22578.MacOSX.zip'

100%[==========================================================================&gt;] 74,858,717   847K/s   in 1m 45s

2009-11-21 09:24:32 (694 KB/s) - `GemStone-22578.MacOSX.zip' saved [74858717/74858717]

[Info] Uncompressing GemStone archive into /Users/rgarver/Sources
[Info] Linking gemstone to /Users/rgarver/Sources/GemStone-22578.MacOSX
[Info] updating MSpec, RubySpec, and RBS submodules
Submodule 'benchmark' (git://github.com/acangiano/ruby-benchmark-suite.git) registered for path 'benchmark'
Submodule 'spec/mspec' (git://github.com/rubyspec/mspec.git) registered for path 'spec/mspec'
Submodule 'spec/rubyspec' (git://github.com/rubyspec/rubyspec.git) registered for path 'spec/rubyspec'
Initialized empty Git repository in /Users/rgarver/Sources/maglev/benchmark/.git/
remote: Counting objects: 7332, done.
remote: Compressing objects: 100% (5521/5521), done.
remote: Total 7332 (delta 1595), reused 6917 (delta 1274)
Receiving objects: 100% (7332/7332), 9.90 MiB | 578 KiB/s, done.
Resolving deltas: 100% (1595/1595), done.
Submodule path 'benchmark': checked out 'd807eea7f7b2f38240bc177a0c22e599081882ea'
Initialized empty Git repository in /Users/rgarver/Sources/maglev/spec/mspec/.git/
remote: Counting objects: 2745, done.
remote: Compressing objects: 100% (1080/1080), done.
remote: Total 2745 (delta 1848), reused 2484 (delta 1644)
Receiving objects: 100% (2745/2745), 378.57 KiB | 383 KiB/s, done.
Resolving deltas: 100% (1848/1848), done.
Submodule path 'spec/mspec': checked out 'bcec47c70e0678a29fd0c1345358c4daf7b971a3'
Initialized empty Git repository in /Users/rgarver/Sources/maglev/spec/rubyspec/.git/
remote: Counting objects: 26787, done.
remote: Compressing objects: 100% (8705/8705), done.
remote: Total 26787 (delta 18332), reused 25672 (delta 17482)
Receiving objects: 100% (26787/26787), 3.71 MiB | 520 KiB/s, done.
Resolving deltas: 100% (18332/18332), done.
Submodule path 'spec/rubyspec': checked out 'b0a18cf80dc706d39ee550831b8b941224b60fb6'
[Info] Creating new default 'maglev' repository
[Info] Generating the MagLev HTML documentation
[Info] Finished upgrade to MagLev-22578.MacOSX on sirius.local

[Info] MagLev version information:
maglev 0.6 (ruby 1.8.6) (2009-11-20 rev 22578-1067) [x86_64-linux]
GEMSTONE: 3.0.0 Build: 64bit-22578
MONTICELLO: MagLev-ao.1067.mcz
MAGLEV: commit e2a4fe2e0f7ca85cdcb141e6b56913eba802eefd
        Author: Allen Otis &lt;otisa@abaco.gemstone.com&gt;
        Date:   Thu Nov 19 19:57:09 2009 -0800
[Info] GemStone version information:
GemStone/S 64 Bit
3.0.0 Build: 64bit-22578
Fri Nov 20  8:22:00 2009

[Info] Adding these to your .bashrc will make it easier to run MagLev
export MAGLEV_HOME=/Users/rgarver/Sources/maglev
export PATH=$MAGLEV_HOME/bin:$PATH

[Info] After you complete this upgrade and verify MagLev is working, run
  rake stwrappers
to generate the .rb files for the GemStone/Smalltalk FFI
in MAGLEV_HOME/lib/ruby/site_ruby/1.8/smalltalk/
</pre>
<p>As you can see on OS X it will build everything for 64bit which is pretty cool.  It also downloaded a bunch of support libraries and updated all of the submodules.  If you ever update the code locally you are supposed to run &#8216;$ ./update.sh&#8217; to rebuild everything and get it all up and running.</p>
<p>Once you have it installed you should add the following lines to your .profile or .bashrc</p>
<pre class="brush: bash;">
export MAGLEV_HOME=/Users/rgarver/Sources/maglev
export PATH=$MAGLEV_HOME/bin:$PATH
</pre>
<p>You&#8217;ll need to make sure you run those lines on the command line also.  Once the environment is setup you can run &#8216;$ rake maglev:start&#8217;.  This command apparently boots up the core MagLev engine.</p>
<pre class="brush: bash;">
$ rake maglev:start
(in /Users/rgarver/Sources/maglev)
startstone[Info]: Starting Stone repository monitor &quot;maglev&quot;.
startstone[Info]: GemStone server 'maglev' has been started.
</pre>
<p>Once that is started you are good to go:</p>
<pre class="brush: bash;">
$ maglev-irb
/Users/rgarver/.irbrc
error , no such file to load -- readline,
          during /Users/rgarver/Sources/maglev/lib/ruby/1.8/irb/completion.rb
error , no such file to load -- readline,
          during /Users/rgarver/.irbrc
irb(main):001:0&gt; puts 'hi'
hi
=&gt; nil
irb(main):002:0&gt;
</pre>
<br />Posted in programming Tagged: howto, install, maglev, programming, ruby, smalltalk <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/74/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=74&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2009/11/21/up-and-running-with-maglev/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>
	</item>
		<item>
		<title>SPDY looks&#8230; possible</title>
		<link>http://blog.selfmodifying.com/2009/11/19/spdy-looks-possible/</link>
		<comments>http://blog.selfmodifying.com/2009/11/19/spdy-looks-possible/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 02:42:56 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[latency]]></category>
		<category><![CDATA[spdy]]></category>
		<category><![CDATA[web applications]]></category>

		<guid isPermaLink="false">http://blog.selfmodifying.com/?p=72</guid>
		<description><![CDATA[Google recently announced their SPDY protocol that they&#8217;ve been working on to address a number of inherent non-performant aspects of the HTTP protocol that most of the web depends on.  In the last few years the web has shifted much more towards real-time applications.  Web application development is starting to think about interaction experiences much [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=72&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Google recently announced their <a href="http://dev.chromium.org/spdy">SPDY protocol</a> that they&#8217;ve been working on to address a number of inherent non-performant aspects of the HTTP protocol that most of the web depends on.  In the last few years the web has shifted much more towards real-time applications.  Web application development is starting to think about interaction experiences much closer to desktop apps.  It&#8217;s not out of bounds to consider the response times of certain queries on a website in terms of keystrokes (~200ms).  Moving the request/transmission protocols to catchup with this change makes sense.</p>
<p>One thing that I am happy about with SPDY is that is appears to be built with deployment clearly in mind.  This isn&#8217;t the first attempt to improve web speeds, it&#8217;s not even the best, but it does appear to be the simplest to deploy in to the wild and see rapid adoption.  If Apache and Firefox gained support for SDPY out of the box, and it was show that using the protocol would improve server throughput, it would be enough to shift most websites over.  That&#8217;s only two players.  That&#8217;s pretty promising.</p>
<br />Posted in programming, software design Tagged: deployment, http, latency, spdy, web applications <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/72/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/72/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/72/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=72&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2009/11/19/spdy-looks-possible/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>
	</item>
		<item>
		<title>Unanticipated Externalities or The 6 Week Collapse</title>
		<link>http://blog.selfmodifying.com/2009/11/15/unanticipated-externalities-or-the-6-week-collaps/</link>
		<comments>http://blog.selfmodifying.com/2009/11/15/unanticipated-externalities-or-the-6-week-collaps/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 17:17:49 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[agility]]></category>
		<category><![CDATA[acceptance criteria]]></category>
		<category><![CDATA[agile process]]></category>
		<category><![CDATA[estimation]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[requirement collection]]></category>
		<category><![CDATA[sprint]]></category>
		<category><![CDATA[strategic pressure point]]></category>
		<category><![CDATA[team]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://blog.selfmodifying.com/?p=58</guid>
		<description><![CDATA[Our development team recently went through a transition period that involved the introduction of a couple of team members.  We aggressively track velocity week to week.  These numbers not only help in planning releases, but also to gauge the health of the team and process.  I generally disregard the first few sprints (sprint = 1 week) [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=58&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Our development team recently went through a transition period that involved the introduction of a couple of team members.  We aggressively track velocity week to week.  These numbers not only help in planning releases, but also to gauge the health of the team and process.  I generally disregard the first few sprints (sprint = 1 week) for the team to get comfortable with each other and the tools.</p>
<p>I should note here that the team is using a fibonacci scale of estimates and generally has features between 1 and 5 points.  This project is also made up of significant legacy code and is being &#8220;stabilized&#8221;.  Bugs come in regularly and don&#8217;t get estimated.  Big changes to the application need to take in to account existing users and their similarly legacy data. (Legacy here means old and originally developed with minimal QA and tight time constraints)</p>
<p style="text-align:center;"><img class="alignnone size-full wp-image-65" title="Velocity" src="http://selfmodifying.files.wordpress.com/2009/08/velocitystruggle1.png?w=500&#038;h=297" alt="Velocity" width="500" height="297" /></p>
<p style="text-align:left;">The first 5 sprints for this team were quite encouraging.  After a 3 week bootstrapping period there was a strong sense that the team was building up to a strong pace.  The team had a rough sprint 6, but they seemed to bounce back the following week.  Sprint 8 had another collapse.  By this point we were looking at 4 weeks and only completing 20 points.  What is going on?  Sprint 4 had us expecting twice that pace.</p>
<p style="text-align:left;">I&#8217;m very fortunate to have a reliable team, a very skilled and experienced team lead, and a patient set of stakeholders.  As we began seeing the fluctuating velocities for what they were (a problem with our process) all of us began looking for causes and solutions.  I&#8217;ve seen this before.  The team got about 6 weeks in to the project, everyone was beginning to feel confident that we were doing things right, and then we started to lose control.  We&#8217;d nail one sprint only to completely miss on the next one.  It was frustrating and demoralizing.</p>
<p style="text-align:left;">We got through it.</p>
<p style="text-align:left;">The root cause came down to unanticipated externalities.  That means that a task would get held up because we needed an icon from the designers, or we needed content for the new email, or our acceptance criteria were vague enough that developers couldn&#8217;t quite tell if they were done until QA approved or rejected the work.  The team wasn&#8217;t quite sure if their work was done and tasks would get rejected at the end of every sprint for often minor issues.</p>
<p style="text-align:left;">What did we do to fix it?</p>
<p style="text-align:left;">The biggest change was to add detail to the acceptance criteria and make sure our QA process would verify exactly to the acceptance criteria.  This ultimately was my fault and by getting QA to strictly focus on the ACs it put pressure on me to get as much in to the ACs as I could, otherwise I&#8217;d need to create a new user story to tune it and that may mess up my timelines.  I like to call this approach &#8220;strategic pressure points&#8221;.  The goal is to strategically put positive and negative pressure and side effects to encourage those best practices that we all say we should follow but often lose motivation after a few times.</p>
<p style="text-align:left;">The other shift in think came more as a side effect of the first.  That was to hold on to user stories until I had all of the content and graphics ready to go with it.  In an ideal world we&#8217;d be able to drop a designer directly on the team and turn the graphics problem from an external issue to an internal one.  This gives the team (plus one designer) control over their ability to complete the stories that they accept in to a sprint.</p>
<p style="text-align:left;">The key to this turnaround is a return to the basics.  What do the numbers say?  What is going wrong or right; what is causing frustration in the team members?  And, what can you do to make things incrementally better?  Keeping our eyes on the metrics that we are collecting helped us track the instability of our process and allowed us to focus on specifics when looking for problems.  Constantly looking for things that aren&#8217;t working perfectly and finding ways to make them slightly more perfect helped us respond to the problems rationally and see rapid recovery from the issues that were affecting us.</p>
<br />Posted in agility Tagged: acceptance criteria, agile process, estimation, metrics, requirement collection, sprint, strategic pressure point, team, velocity <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/58/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=58&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2009/11/15/unanticipated-externalities-or-the-6-week-collaps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>

		<media:content url="http://selfmodifying.files.wordpress.com/2009/08/velocitystruggle1.png" medium="image">
			<media:title type="html">Velocity</media:title>
		</media:content>
	</item>
		<item>
		<title>Google Wave looks ground breaking</title>
		<link>http://blog.selfmodifying.com/2009/05/29/google-wave-looks-ground-breaking/</link>
		<comments>http://blog.selfmodifying.com/2009/05/29/google-wave-looks-ground-breaking/#comments</comments>
		<pubDate>Fri, 29 May 2009 06:31:57 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://blog.selfmodifying.com/?p=54</guid>
		<description><![CDATA[I just finished watching the Google IO demo of the new system Google Wave.  This is really an amazing piece of software.  Check it out.

Posted in Uncategorized Tagged: google, tools      <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=54&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I just finished watching the Google IO demo of the new system Google Wave.  This is really an amazing piece of software.  Check it out.</p>
<p><span style="text-align:center; display: block;"><a href="http://blog.selfmodifying.com/2009/05/29/google-wave-looks-ground-breaking/"><img src="http://img.youtube.com/vi/v_UyVmITiYQ/2.jpg" alt="" /></a></span></p>
<br />Posted in Uncategorized Tagged: google, tools <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/54/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/54/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/54/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=54&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2009/05/29/google-wave-looks-ground-breaking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>

		<media:content url="http://img.youtube.com/vi/v_UyVmITiYQ/2.jpg" medium="image" />
	</item>
		<item>
		<title>Podcast.local &#8211; localhost podcasting</title>
		<link>http://blog.selfmodifying.com/2009/05/17/podcast-local-localhost-podcasting/</link>
		<comments>http://blog.selfmodifying.com/2009/05/17/podcast-local-localhost-podcasting/#comments</comments>
		<pubDate>Sun, 17 May 2009 18:13:20 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[agility]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[agile process]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryui]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://blog.selfmodifying.com/?p=48</guid>
		<description><![CDATA[Last week I discovered a set of mp3&#8217;s covering Lean practices and principles.  You can access them here.  I&#8217;ve been on a bit of a management optimization stint lately and Lean is a very natural extension of Agile software development in to a broader management context.  It largely predates modern software techniques and represents one [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=48&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Last week I discovered a set of mp3&#8217;s covering Lean practices and principles.  You can access them <a title="Lean Enterprise Institute Webinar Library" href="http://www.lean.org/Events/WebinarHome.cfm" target="_blank">here</a>.  I&#8217;ve been on a bit of a management optimization stint lately and Lean is a very natural extension of Agile software development in to a broader management context.  It largely predates modern software techniques and represents one of the early generalizations of the <a href="http://en.wikipedia.org/wiki/Toyota_Production_System" target="_blank">Toyota Production System</a>.</p>
<p>In any case that is not what I&#8217;m here to talk to you about.  In looking through these mp3&#8217;s the list of webinars was not collected in to any sort of podcast format.  This is frustrating because this would be ideal commute time listening on my iPhone.  Out of this frustration came <a title="Podcast.local" href="http://github.com/rgarver/podcast.local" target="_blank">podcast.local</a>.  Podcast.local is a simple Rails application (really simple) that allows you quickly create a podcast through a series of forms.  The name comes from the naming convention provided by the <a href="http://www.fngtps.com/passenger-preference-pane" target="_blank">Passenger preference pane</a> on OS X.  If you set it up through the pref pane you will just need to go to http://podcast.local.  From there you can create your podcast one episode at a time and then subscribe to them through your iTunes.  The coole thing is that because it&#8217;s on the web iTunes just picks it and starts downloading episodes.</p>
<p>Like I said above, this application is too simple to go in to much detail.  I used it to do some experimentation with a few technologies that I haven&#8217;t had much time to mess around with.  Namely <a href="http://www.blueprintcss.org/" target="_blank">Blueprint CSS</a>, <a href="http://jquery.com" target="_blank">jQuery</a>, <a href="http://ui.jquery.com" target="_blank">jQuery UI</a>, and <a href="http://github.com/thoughtbot/paperclip/" target="_blank">Paperclip</a>.  Enjoy!</p>
<br />Posted in agility, programming Tagged: agile process, jquery, jqueryui, programming, ruby on rails, tools <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=48&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2009/05/17/podcast-local-localhost-podcasting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>
	</item>
		<item>
		<title>It&#8217;s not the size of the tool</title>
		<link>http://blog.selfmodifying.com/2009/03/06/its_not_the_size_of/</link>
		<comments>http://blog.selfmodifying.com/2009/03/06/its_not_the_size_of/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 20:28:38 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[agility]]></category>
		<category><![CDATA[agile process]]></category>
		<category><![CDATA[gtd]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://selfmodifying.wordpress.com/?p=43</guid>
		<description><![CDATA[
I&#8217;ve been having discussions recently with some coworkers about finding better tools for various aspects of our business. A lot of our discussions are looking at how to organize our development process, but every once in a while it diverges to a different set of issues, especially how we track our developer/designer/account managers&#8217; hours.
If you&#8217;ve [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=43&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div id="preview">
<p>I&#8217;ve been having discussions recently with some coworkers about finding better tools for various aspects of our business. A lot of our discussions are looking at how to organize our development process, but every once in a while it diverges to a different set of issues, especially how we track our developer/designer/account managers&#8217; hours.</p>
<p>If you&#8217;ve known me for a while, you&#8217;ll know that I get a kick out of trying out new apps and services. I like to find ways to make myself more efficient and better at my job and life in general. Usually I end up throwing these tools away after a few weeks. But every once in a while I find something that lasts. A great example of this is OmniFocus. I had been trying to implement a good approximation of <a href="http://en.wikipedia.org/wiki/Getting_Things_Done">GTD</a> for several years, and in that time I&#8217;ve tried probably 15 different tools and online services that implement various approximations of GTD. But it wasn&#8217;t until I started using OmniFocus that I really found a sustainable process and a tool that empowered me.</p>
<p>Coming from the agile community the common reaction to &#8220;What tools should I use to organize my development process?&#8221; is whiteboards, poster paper, and ample note cards. While I do appreciate this tactic from first hand experience, this has some obvious flaws as soon as your team members are not co-located.</p>
<p>Our current suite of tools have a number of failings for a number of different reasons. The reaction that I&#8217;ve been hearing lately from my colleagues is that we need to find a single tool that handles all of our major needs. The theory—I presume—is that having fewer tools will mean less manual work maintaining the tools and their content.</p>
<p>I&#8217;m not a big fan of this philosophy for a few reasons:</p>
<ol>
<li>It is not likely we will find a single tool that fits all of our business requirements without it being too complex or expensive (or both), therefore our processes and practices will need to be adjusted for the tool. The realist in me is OK with the idea of adapting to the tool to an extent, sometimes the tool can give you a better process that you didn&#8217;t know before (eg: OmniFocus), but that&#8217;s pretty rare.</li>
<li>There are a few tools that are actually working very well for us, however the &#8220;one tool to rule them all&#8221; model creates artificial value in eliminating that independent tool for a consolidated one that may be less effective.</li>
<li>It impairs a teams ability to experiment with new work patterns and tools by adding cultural pressure and often bureaucratic overhead around tool choice. If agile software development is about expecting change and continuously adapting to it, then I want to have the flexibility to adapt everything down to the tools the I use.</li>
<li>I&#8217;m not convinced that maintenance overhead is entirely due to the number of tools. I think it has more to do with not using the right tools.</li>
</ol>
<p>Modern application development approaches have really focused on the idea of specialized tools that solve a small set of problems. The old model of monster apps that can be customized to do what you want, but not quite perfectly, is being phased out for interoperability and APIs. Our Github account can send post-commit notifications to our Campfire account, our Acunote account integrates with our bug tracking system, and just about everything will send an email to keep you up to date.</p>
<p>The moral of the story: Why use one tool that does everything just OK when you can have many tools that to their own things really well and will talk to each other?</p></div>
<br />Posted in agility Tagged: agile process, gtd, tools <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=43&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2009/03/06/its_not_the_size_of/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>
	</item>
		<item>
		<title>Back to jQuery</title>
		<link>http://blog.selfmodifying.com/2009/02/10/back_to_jquery/</link>
		<comments>http://blog.selfmodifying.com/2009/02/10/back_to_jquery/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 20:24:14 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jqueryui]]></category>
		<category><![CDATA[themeroller]]></category>

		<guid isPermaLink="false">http://selfmodifying.wordpress.com/?p=39</guid>
		<description><![CDATA[
So I tried Red for a while (short while) and was all excited and thought it was really cool and I&#8217;d be using it forever. Then I tried to make a Ajax call to a rails app and got back JSON, crap. Red doesn&#8217;t support parsing JSON. I eventually figured it out and made a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=39&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div id="preview">
<p>So I tried Red for a while (short while) and was all excited and thought it was really cool and I&#8217;d be using it forever. Then I tried to make a Ajax call to a rails app and got back JSON, crap. Red doesn&#8217;t support parsing JSON. I eventually figured it out and made a pretty cool billing summary widget using Red. But that took me a few days. And it was really hard. Much harder than it needed to be.</p>
<p>I like what Red was trying to do, but looking back I think I knew it was too good to be true. It&#8217;s not quite there and requires a lot of hacking to do most practical things. I&#8217;m now using <a href="http://jquery.com/">jQuery</a>. I reimplemented the billing summary using jQuery in a couple of hours, and most of that time was spent re-learning jQuery. I&#8217;m actually pretty happy with it after using it for a few weeks. I thought I would always return to Prototype.</p>
<p>In my excitement for learning a new tool I discovered the extension <a href="http://ui.jquery.com/">jQuery UI</a> and their <a href="http://ui.jquery.com/themeroller/">Themeroller</a>. This has got to be one of the cooler javascript library extensions that I&#8217;ve seen. ExtJS tries to provide a will UI toolkit and has a theme API, but the Themeroller for jQuery UI is really sweet and super simple. As a basis for a back office admin it is ideal, and I can see a number of opportunities in a broader set of situations. The icon library alone has made producing simple, intuitive interfaces really easy.</div>
<br />Posted in programming Tagged: javascript, jquery, jqueryui, programming, themeroller <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/39/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/39/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/39/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=39&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2009/02/10/back_to_jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>
	</item>
		<item>
		<title>JSON for Red</title>
		<link>http://blog.selfmodifying.com/2009/01/03/json_for_red/</link>
		<comments>http://blog.selfmodifying.com/2009/01/03/json_for_red/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 20:11:26 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://selfmodifying.wordpress.com/?p=35</guid>
		<description><![CDATA[I&#8217;ve been playing around more with Red.  I alternate between really liking it and totally pulling my hair out.  On a order form app that I&#8217;m building I made some very quick work of a dynamically updating billing summary div.  It came together very quickly until I added the AJAX piece.  AJAX support in Red [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=35&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing around more with <a href="http://github.com/jessesielaff/red/tree/master" target="_blank">Red</a>.  I alternate between really liking it and totally pulling my hair out.  On a order form app that I&#8217;m building I made some very quick work of a dynamically updating billing summary div.  It came together very quickly until I added the AJAX piece.  AJAX support in Red is actually very good, but JSON support is non-existent.  This made Ryan a sad boy.  I dug around to see what other people have done and found that they haven&#8217;t done much.  There is some stub code for a Request::JSON that my be what I&#8217;m looking for at some point, but I need it now.  So <a href="http://gist.github.com/42953" target="_blank">here</a> is what I did:</p>
<pre class="brush: ruby;">
class Module
  def define_method(sym, &amp;block)
    `this.prototype['m$'+sym.__value__]=block.__block__.__unbound__`
    `Red.updateChildren(this)`
    `Red.updateIncluders(this)`
    return `block`
  end
end

class Object
  def self.from_json(text)
    ret = Object.new
    meths = []
    `var v = eval(&quot;(&quot;+#{text}.__value__+&quot;)&quot;)`
    `for(var member in v){#{meths}.push(new Array($q(member), $q(v[member])))}`
    meths.each do |meth|
      ret.class.send(:define_method, meth[0]) do
        meth[1]
      end
    end
    return ret
  end
end
</pre>
<p>Now doing a simple AJAX call that returns JSON becomes really easy:</p>
<pre class="brush: ruby;">
@req = Request.new(:url =&gt; '/orders')
@req.upon(:response) do |response|
  new_data = Object.from_json(response.text)
  @summary = new_data.summary
  @subtotal = new_data.subtotal
  @total = new_data.total
end
@req.execute(:data =&gt; {'plan_id' =&gt; @plan, 'promo' =&gt; @promo})
</pre>
<p>A few things to note here.  The section that defines `define_method` on `Module` is actually back ported from the current master branch of Red.  This works pretty well, though I haven&#8217;t tried it with a JSON string that describes a living object.  But I don&#8217;t think it&#8217;s too far from being able to handle that.</p>
<br />Posted in programming Tagged: javascript, programming, ruby <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/35/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=35&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2009/01/03/json_for_red/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>
	</item>
		<item>
		<title>Should I use an instance variable?</title>
		<link>http://blog.selfmodifying.com/2008/11/17/should_i_use_an_instance_variable/</link>
		<comments>http://blog.selfmodifying.com/2008/11/17/should_i_use_an_instance_variable/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 20:07:04 +0000</pubDate>
		<dc:creator>Ryan Garver</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://selfmodifying.wordpress.com/?p=31</guid>
		<description><![CDATA[No.
If you are in a position to ask this question I humbly recommend you default to: &#8220;No, I do not need this as an instance variable right now.&#8221;  There is a tendency to plan for every potentiality when doing software development and this is a prime example of such a situation.  Resist the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=31&subd=selfmodifying&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>No.</p>
<p>If you are in a position to ask this question I humbly recommend you default to: &#8220;No, I do not need this as an instance variable right now.&#8221;  There is a tendency to plan for every potentiality when doing software development and this is a prime example of such a situation.  Resist the temptation.</p>
<p>Instance variables represent state associated with an object in memory.  When you declare an instance variable you are saying to all future developers: &#8220;This piece of state needs to last for the life time of this object because it will be used elsewhere.&#8221;  Think very hard about that.  We are saying loudly here that this variable is coupled to other fragments of code.  Which code?  Dunno, do a global search <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>This is called tight coupling.  I will go so far to say that coupling is the source of all evil and complexity that we deal with as programmers.  With every step that we, as programmers, take in building a system should be with an eye to reduce or at least not increase the coupling in the system that we are working on.  The fewer instance variables that we have in a Rails controller the smaller the potential coupling between the view and other method calls that have access to those instance variables.  Each method, each action in a controller, should be as self contained as possible.  The less leakage of state out of a function the better.  Generally your view doesn&#8217;t need to see that temp variable of the calculations that you made to set a model attribute keep it local, drop the &#8220;@&#8221;.  Worst case scenario you go back and refactor your code to include that &#8220;@&#8221;.</p>
<br />Posted in programming, software design Tagged: programming, ruby, ruby on rails <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/selfmodifying.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/selfmodifying.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/selfmodifying.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/selfmodifying.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/selfmodifying.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/selfmodifying.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/selfmodifying.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/selfmodifying.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/selfmodifying.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/selfmodifying.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.selfmodifying.com&blog=7311382&post=31&subd=selfmodifying&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://blog.selfmodifying.com/2008/11/17/should_i_use_an_instance_variable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d928b55d9910cba3360cda7f214cf6e3?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">Ryan</media:title>
		</media:content>
	</item>
	</channel>
</rss>