<?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>The Rationalist Manifesto &#187; Development</title>
	<atom:link href="http://www.rationalistic.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rationalistic.com</link>
	<description>Memes and other creatures</description>
	<lastBuildDate>Wed, 21 Apr 2010 00:46:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Maven voice notifications on Mac OS X</title>
		<link>http://www.rationalistic.com/2009/04/16/software/maven-voice-notifications-on-mac-os-x/</link>
		<comments>http://www.rationalistic.com/2009/04/16/software/maven-voice-notifications-on-mac-os-x/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 05:32:21 +0000</pubDate>
		<dc:creator>Tal Rotbart</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[mac os x]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[mvn]]></category>
		<category><![CDATA[say]]></category>
		<category><![CDATA[voice]]></category>

		<guid isPermaLink="false">http://www.rationalistic.com/?p=332</guid>
		<description><![CDATA[A quick hack to get the &#8216;mvn&#8217; Maven script to vocally notify &#8216;Success&#8217; or &#8216;Failed&#8217; when the build completes. I find it useful as it grabs my attention when I&#8217;m undertaking other tasks while the build is churning.
Naturally the real solution is getting the build to run in seconds&#8230; Technical debt, thou art a harsh [...]]]></description>
			<content:encoded><![CDATA[<p>A quick hack to get the &#8216;mvn&#8217; Maven script to vocally notify &#8216;Success&#8217; or &#8216;Failed&#8217; when the build completes. I find it useful as it grabs my attention when I&#8217;m undertaking other tasks while the build is churning.</p>
<p>Naturally the real solution is getting the build to run in seconds&#8230; Technical debt, thou art a harsh mistress.</p>
<p>Replace the last couple of lines (starting with &#8216;exec&#8217;) in your mvn script with:</p>
<pre>"$JAVACMD"
  $MAVEN_OPTS
  -classpath "${M2_HOME}"/boot/classworlds-*.jar
  "-Dclassworlds.conf=${M2_HOME}/bin/m2.conf"
  "-Dmaven.home=${M2_HOME}"
  ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS &amp;&amp; say "Success!" || (say "Failed!" &amp;&amp; false)</pre>
<p><span style="text-decoration: underline;">Updated</span>: Changed to avoid incorrectly returning a successful exit code on failure.</p>
<!-- Social Bookmarks BEGIN --><div class="social_bookmark"><em>Bookmark to:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://www.rationalistic.com/2009/04/16/software/maven-voice-notifications-on-mac-os-x/&amp;title=Maven+voice+notifications+on+Mac+OS+X" title="Add 'Maven voice notifications on Mac OS X' to Del.icio.us"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/delicious.png" title="Add 'Maven voice notifications on Mac OS X' to Del.icio.us" alt="Add 'Maven voice notifications on Mac OS X' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://www.rationalistic.com/2009/04/16/software/maven-voice-notifications-on-mac-os-x/&amp;title=Maven+voice+notifications+on+Mac+OS+X" title="Add 'Maven voice notifications on Mac OS X' to digg"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/digg.png" title="Add 'Maven voice notifications on Mac OS X' to digg" alt="Add 'Maven voice notifications on Mac OS X' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://www.rationalistic.com/2009/04/16/software/maven-voice-notifications-on-mac-os-x/&amp;title=Maven+voice+notifications+on+Mac+OS+X" title="Add 'Maven voice notifications on Mac OS X' to reddit"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/reddit.png" title="Add 'Maven voice notifications on Mac OS X' to reddit" alt="Add 'Maven voice notifications on Mac OS X' to reddit" /></a><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://www.rationalistic.com/2009/04/16/software/maven-voice-notifications-on-mac-os-x/" title="Add 'Maven voice notifications on Mac OS X' to Technorati"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/technorati.png" title="Add 'Maven voice notifications on Mac OS X' to Technorati" alt="Add 'Maven voice notifications on Mac OS X' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://www.rationalistic.com/2009/04/16/software/maven-voice-notifications-on-mac-os-x/&amp;t=Maven+voice+notifications+on+Mac+OS+X" title="Add 'Maven voice notifications on Mac OS X' to Yahoo My Web"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/yahoo_myweb.png" title="Add 'Maven voice notifications on Mac OS X' to Yahoo My Web" alt="Add 'Maven voice notifications on Mac OS X' to Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/refer.php?url=http://www.rationalistic.com/2009/04/16/software/maven-voice-notifications-on-mac-os-x/&amp;title=Maven+voice+notifications+on+Mac+OS+X" title="Add 'Maven voice notifications on Mac OS X' to Stumble Upon"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/stumbleupon.png" title="Add 'Maven voice notifications on Mac OS X' to Stumble Upon" alt="Add 'Maven voice notifications on Mac OS X' to Stumble Upon" /></a></div>
<!-- Social Bookmarks END -->]]></content:encoded>
			<wfw:commentRss>http://www.rationalistic.com/2009/04/16/software/maven-voice-notifications-on-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DDD = ?</title>
		<link>http://www.rationalistic.com/2009/04/07/software/ddd/</link>
		<comments>http://www.rationalistic.com/2009/04/07/software/ddd/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 01:40:34 +0000</pubDate>
		<dc:creator>Tal Rotbart</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[domain driven design]]></category>
		<category><![CDATA[law of demeter]]></category>

		<guid isPermaLink="false">http://www.rationalistic.com/?p=328</guid>
		<description><![CDATA[Mark Needham has a very interesting post regarding Domain Driven Design. One paragraph that caught my eye especially is:
As Luis Abreu points out, I don&#8217;t think there is a precise definition of what DDD actually is but for me the essence of DDD is still the same as when I compared it with OO i.e. [...]]]></description>
			<content:encoded><![CDATA[<p>Mark Needham has a very <a href="http://www.markhneedham.com/blog/2009/04/06/ddd-only-for-complex-projects/">interesting post</a> regarding Domain Driven Design. One paragraph that caught my eye especially is:</p>
<blockquote><p>As Luis Abreu points out, I don&#8217;t think there is <a href="http://msmvps.com/blogs/luisabreu/archive/2008/12/10/is-ddd-for-me.aspx">a precise definition of what DDD actually is</a> but for me the essence of DDD is still the same as when I compared it with OO i.e. <strong>Domain Driven Design = Object Oriented Programming + Ubiquitous Language</strong>.</p></blockquote>
<p>I think that Mark is on to a very useful and succinct definition of DDD, yet I feel he overlooked <a href="http://jamesladdcode.com/?p=252">the Law of Demeter</a>. Building on Mark&#8217;s definition I&#8217;d define DDD as <strong>Domain Driven Design = Object Oriented Programming + Ubiquitous Language + The Law of Demeter</strong>. While some would argue that the Law of Demeter is implicit in Object Oriented Programming (or at least of OOP of the good kind&#8230;) I believe that it is important enough for successful Domain Driven Design that it should be explicitly mentioned.</p>
<p>Looking forward to your comments!</p>
<!-- Social Bookmarks BEGIN --><div class="social_bookmark"><em>Bookmark to:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://www.rationalistic.com/2009/04/07/software/ddd/&amp;title=DDD+%3D+%3F" title="Add 'DDD = ?' to Del.icio.us"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/delicious.png" title="Add 'DDD = ?' to Del.icio.us" alt="Add 'DDD = ?' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://www.rationalistic.com/2009/04/07/software/ddd/&amp;title=DDD+%3D+%3F" title="Add 'DDD = ?' to digg"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/digg.png" title="Add 'DDD = ?' to digg" alt="Add 'DDD = ?' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://www.rationalistic.com/2009/04/07/software/ddd/&amp;title=DDD+%3D+%3F" title="Add 'DDD = ?' to reddit"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/reddit.png" title="Add 'DDD = ?' to reddit" alt="Add 'DDD = ?' to reddit" /></a><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://www.rationalistic.com/2009/04/07/software/ddd/" title="Add 'DDD = ?' to Technorati"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/technorati.png" title="Add 'DDD = ?' to Technorati" alt="Add 'DDD = ?' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://www.rationalistic.com/2009/04/07/software/ddd/&amp;t=DDD+%3D+%3F" title="Add 'DDD = ?' to Yahoo My Web"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/yahoo_myweb.png" title="Add 'DDD = ?' to Yahoo My Web" alt="Add 'DDD = ?' to Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/refer.php?url=http://www.rationalistic.com/2009/04/07/software/ddd/&amp;title=DDD+%3D+%3F" title="Add 'DDD = ?' to Stumble Upon"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/stumbleupon.png" title="Add 'DDD = ?' to Stumble Upon" alt="Add 'DDD = ?' to Stumble Upon" /></a></div>
<!-- Social Bookmarks END -->]]></content:encoded>
			<wfw:commentRss>http://www.rationalistic.com/2009/04/07/software/ddd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>&#8216;IT pays&#8217; doesn&#8217;t pay</title>
		<link>http://www.rationalistic.com/2009/03/27/software/it-pays-doesnt-pay/</link>
		<comments>http://www.rationalistic.com/2009/03/27/software/it-pays-doesnt-pay/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 02:00:08 +0000</pubDate>
		<dc:creator>Tal Rotbart</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Process]]></category>

		<guid isPermaLink="false">http://www.rationalistic.com/?p=305</guid>
		<description><![CDATA[Picture this rather common scenario&#8211;
You are in charge of a project for developing an internal application at a large brick-and-mortar company. Your target audience for the application are the employees of a critical business department (here on, Department X). The customer representative is the head of that department and is glad to be involved in [...]]]></description>
			<content:encoded><![CDATA[<p>Picture this rather common scenario&#8211;</p>
<p>You are in charge of a project for developing an internal application at a large brick-and-mortar company. Your target audience for the application are the employees of a critical business department (here on, Department X). The customer representative is the head of that department and is glad to be involved in the planning process and domain knowledge sharing as well as story analysis, hand over and sign-off; Seemingly, an ideal &#8216;customer&#8217;, here on- Mr. X.</p>
<p>Yet at scope planning meetings for the project, Mr X. is insisting that all the feature requirements are &#8216;Must Haves&#8217; and while he agrees that the order of development should be based on &#8216;higher business value first&#8217;, he refuses to de-scope any features, insisting that due to external circumstances their delivery must occur by the project&#8217;s go-live date.</p>
<p>You would accept Mr X’s proposal if he would be willing to increase the budget for project to allow resourcing to meet these requirements. Great! He is willing! But wait &#8212; he can&#8217;t. Why? Because the project is funded out of the IT budget and not out of department X&#8217;s. This is a lose-lose situation, as the project is now set to fail in the eyes of the customer and in turn, harming the IT department&#8217;s reputation &#8211; Department X is not getting what it wants, even though it is willing to pay for it. </p>
<p>The root cause here is the divergence between the beneficiary of the application and the entity that pays for it. The two may have differing goals, priorities, political considerations and machinations and whilst they both work towards the same organisational goals, these two entities operate under different business units with sometimes divergent operating considerations.</p>
<p>Budgeting models for IT departments seem to be based around IT as infrastructure &#8212; which makes sense for, wait for it&#8230; infrastructure: network, VOIP, hardware and the like &#8212; but repeatedly fails for business applications.</p>
<p>While it makes sense for IT departments to harbour the core capabilities and knowledge for software development (&#8230;.development infrastructure&#8230;) it should only act as a cost-effective contractor to the business when developing business applications. Business applications projects should only be undertaken as part of a business case, they should have clear ownership by the benefiting entity and not the IT department.</p>
<p>When analysing teams and projects that clearly &#8217;smell&#8217; and have a hard time changing, my personal experience indicates that in the majority of cases, following the smell to its source leads to this root cause. This is more pronounced in bigger organisations and seems to be proportional to the level of organisational separation between the project beneficiaries and the IT department. More so &#8212; this is almost always the underlying organisational issue that makes it difficult to implement agile methodologies.</p>
<p>This lesson was learned by many organisations, but unfortunately not all &#8212; and it should&#8211;</p>
<p> The &#8216;IT department pays&#8217; model of application development should die.</p>
<!-- Social Bookmarks BEGIN --><div class="social_bookmark"><em>Bookmark to:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://www.rationalistic.com/2009/03/27/software/it-pays-doesnt-pay/&amp;title=%26%238216%3BIT+pays%26%238217%3B+doesn%26%238217%3Bt+pay" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Del.icio.us"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/delicious.png" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Del.icio.us" alt="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://www.rationalistic.com/2009/03/27/software/it-pays-doesnt-pay/&amp;title=%26%238216%3BIT+pays%26%238217%3B+doesn%26%238217%3Bt+pay" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to digg"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/digg.png" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to digg" alt="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://www.rationalistic.com/2009/03/27/software/it-pays-doesnt-pay/&amp;title=%26%238216%3BIT+pays%26%238217%3B+doesn%26%238217%3Bt+pay" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to reddit"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/reddit.png" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to reddit" alt="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to reddit" /></a><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://www.rationalistic.com/2009/03/27/software/it-pays-doesnt-pay/" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Technorati"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/technorati.png" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Technorati" alt="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://www.rationalistic.com/2009/03/27/software/it-pays-doesnt-pay/&amp;t=%26%238216%3BIT+pays%26%238217%3B+doesn%26%238217%3Bt+pay" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Yahoo My Web"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/yahoo_myweb.png" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Yahoo My Web" alt="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/refer.php?url=http://www.rationalistic.com/2009/03/27/software/it-pays-doesnt-pay/&amp;title=%26%238216%3BIT+pays%26%238217%3B+doesn%26%238217%3Bt+pay" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Stumble Upon"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/stumbleupon.png" title="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Stumble Upon" alt="Add '&#8216;IT pays&#8217; doesn&#8217;t pay' to Stumble Upon" /></a></div>
<!-- Social Bookmarks END -->]]></content:encoded>
			<wfw:commentRss>http://www.rationalistic.com/2009/03/27/software/it-pays-doesnt-pay/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cute method_missing hack</title>
		<link>http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/</link>
		<comments>http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/#comments</comments>
		<pubDate>Thu, 06 Mar 2008 05:37:08 +0000</pubDate>
		<dc:creator>Tal Rotbart</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[metaprogramming]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/</guid>
		<description><![CDATA[I love abusing method_missing in Ruby, it is great fun.
 module IsDoesIsntDoesnt

  def method_missing(method, *args)
    m = method.to_s
    if (m =~ /^is_(\w*?\?)$/) &#124;&#124; (m =~ /^does_(\w*?\?)$/)
      real_method = $1.to_sym
      return send(real_method, *args) if respond_to?(real_method)
    elsif (m [...]]]></description>
			<content:encoded><![CDATA[<p>I love abusing method_missing in Ruby, it is great fun.</p>
<pre> module IsDoesIsntDoesnt

  def method_missing(method, *args)
    m = method.to_s
    if (m =~ /^is_(\w*?\?)$/) || (m =~ /^does_(\w*?\?)$/)
      real_method = $1.to_sym
      return send(real_method, *args) if respond_to?(real_method)
    elsif (m =~ /^isnt_(\w*?\?)$/) || (m =~ /^doesnt_(\w*?\?)$/)
      real_method = $1.to_sym
      return !send(real_method, *args) if respond_to?(real_method)
    elsif (m =~ /^(\w*?)s\?$/)
      real_method = "#{$1}?".to_sym
      return send(real_method, *args) if respond_to?(real_method)
    end
    super.method_missing(method, *args)
  end

end

Object.class_eval() do
  include IsDoesIsntDoesnt
end</pre>
<p>Which lends itself to these types of natural statements:</p>
<pre>?&gt; "team".includes?("i")
=&gt; false</pre>
<pre>&gt;&gt; "team".isnt_empty?
=&gt; true</pre>
<p>and:</p>
<pre>&gt;&gt; [].is_empty?
=&gt; true</pre>
<pre>&gt;&gt; [ :stuff ].does_include?(:stuff)
=&gt; true</pre>
<p>While I&#8217;m sure Ruby mavens will think of much nicer ways to implement this type of functionality, I had fun doing it.</p>
<p>An exercise for the reader would be to dynamically add the appropriate method, so the next call doesn&#8217;t rely on method_missing.</p>
<!-- Social Bookmarks BEGIN --><div class="social_bookmark"><em>Bookmark to:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/&amp;title=Cute+method_missing+hack" title="Add 'Cute method_missing hack' to Del.icio.us"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/delicious.png" title="Add 'Cute method_missing hack' to Del.icio.us" alt="Add 'Cute method_missing hack' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/&amp;title=Cute+method_missing+hack" title="Add 'Cute method_missing hack' to digg"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/digg.png" title="Add 'Cute method_missing hack' to digg" alt="Add 'Cute method_missing hack' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/&amp;title=Cute+method_missing+hack" title="Add 'Cute method_missing hack' to reddit"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/reddit.png" title="Add 'Cute method_missing hack' to reddit" alt="Add 'Cute method_missing hack' to reddit" /></a><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/" title="Add 'Cute method_missing hack' to Technorati"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/technorati.png" title="Add 'Cute method_missing hack' to Technorati" alt="Add 'Cute method_missing hack' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/&amp;t=Cute+method_missing+hack" title="Add 'Cute method_missing hack' to Yahoo My Web"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/yahoo_myweb.png" title="Add 'Cute method_missing hack' to Yahoo My Web" alt="Add 'Cute method_missing hack' to Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/refer.php?url=http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/&amp;title=Cute+method_missing+hack" title="Add 'Cute method_missing hack' to Stumble Upon"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/stumbleupon.png" title="Add 'Cute method_missing hack' to Stumble Upon" alt="Add 'Cute method_missing hack' to Stumble Upon" /></a></div>
<!-- Social Bookmarks END -->]]></content:encoded>
			<wfw:commentRss>http://www.rationalistic.com/2008/03/06/development/cute-method_missing-hack/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Selenium Test Tips</title>
		<link>http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/</link>
		<comments>http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/#comments</comments>
		<pubDate>Thu, 05 Apr 2007 05:39:02 +0000</pubDate>
		<dc:creator>Tal Rotbart</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/</guid>
		<description><![CDATA[Selenium is an open-source test tool for web-based applications and sites. Unlike Canoo WebTest, Selenium actually utilizes the browser itself to perform the tests.
Selenium has a Firefox extension that acts as an IDE for recording and editing test cases however there is a significant difference between running the tests in the IDE and running them [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Selenium_%28software%29">Selenium</a> is an open-source test tool for web-based applications and sites. Unlike <a href="http://webtest.canoo.com/webtest/manual/WebTestHome.html">Canoo WebTest</a>, Selenium actually utilizes the browser itself to perform the tests.</p>
<p>Selenium has a Firefox extension that acts as an IDE for recording and editing test cases however there is a significant difference between running the tests in the IDE and running them as part of a build process &#8212; cross-site scripting.</p>
<p>When running tests in the IDE, Selenium is not limited by Firefox cross-site scripting preventative measures and can follow links to external sites (outside your &#8216;base URL&#8217;) and verify that the target has been reached. This is not possible when running it as part of a build process in stand-alone mode.</p>
<p>The reason for this difference is that when running Selenium in stand-alone mode it generates a web-page that contains the test runtime with the actual web-page it is testing residing within an IFRAME. Once you traverse to links outside the domain the Selenium generated web-page is at (usually localhost) then you are subject to cross-site scripting limitations. Put it simply, your top page (Selenium generated) would be in the &#8216;localhost&#8217; domain, and the external page is at another domain thus triggering the cross-site scripting security restrictions.</p>
<p>I&#8217;ll demonstrate what I mean:</p>
<p>In Selenium, a typical link test is done so:</p>
<ol>
<li>A &#8216;click&#8217; Selenium command with the &#8216;link=&#8217; target.</li>
<li>Then a &#8216;waitForPageToLoad&#8217; command</li>
<li>Followed by an &#8216;assertLocation&#8217; with the correct expected URL</li>
</ol>
<p>This test will fail when running in the standalone mode with the link target being external to the domain running the Selenium web-page. Instead of what you expect from the IDE based run you will hit upon permission errors accessing &#8220;document.href&#8221; and other DOM properties. This is simply because your script is from domain &#8220;localhost&#8221; (for example) and does not have access to the DOM of the page from the external domain (say &#8220;rationalistic.com&#8221;)&#8230; Note that  for the same reason you can&#8217;t even call &#8216;goBack&#8217; after the &#8216;click&#8217;.</p>
<p>An alternative to this method that is useful for external links is simply to verify the existence and &#8216;href&#8217; attribute of the link. While this is not ideal (as it doesn&#8217;t take into account Javascript method links) it is, in my opinion enough verification for off-site links. To use this method of testing a link&#8217;s existence and target you must give the &lt;a&gt; element an id, preferably one that starts with &#8220;link_&#8221; and then using the Selenium &#8216;assertElementPresent&#8217; and &#8216;assertAttribute&#8217; commands.</p>
<p>For example, consider a link to my blog site:</p>
<p>&lt;a id=&#8221;link_rationalistic&#8221; href=&#8221;http://www.rationalistic.com&#8221;&gt;The Rationalist Manifesto&lt;/a&gt;</p>
<p>To test it in Selenium you would do this:</p>
<ol>
<li>Use the &#8216;assertElementPresent&#8217; command with a target of &#8216;link_rationalistic&#8217;</li>
<li>Follow with an &#8216;assertAttribute&#8217; command with a target of &#8216;link_rationalistic@href&#8217; and a value of &#8216;http://www.rationalistic.com&#8217;.</li>
</ol>
<p>This testing method provides reasonable confidence that the link exists and leads to the correct location without following it.</p>
<p><u>Note</u>:<br />
This method is also useful for links which have symbol characters in them which may be difficult to locate using the &#8216;link=&#8217; targets.</p>
<!-- Social Bookmarks BEGIN --><div class="social_bookmark"><em>Bookmark to:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/&amp;title=Selenium+Test+Tips" title="Add 'Selenium Test Tips' to Del.icio.us"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/delicious.png" title="Add 'Selenium Test Tips' to Del.icio.us" alt="Add 'Selenium Test Tips' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/&amp;title=Selenium+Test+Tips" title="Add 'Selenium Test Tips' to digg"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/digg.png" title="Add 'Selenium Test Tips' to digg" alt="Add 'Selenium Test Tips' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/&amp;title=Selenium+Test+Tips" title="Add 'Selenium Test Tips' to reddit"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/reddit.png" title="Add 'Selenium Test Tips' to reddit" alt="Add 'Selenium Test Tips' to reddit" /></a><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/" title="Add 'Selenium Test Tips' to Technorati"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/technorati.png" title="Add 'Selenium Test Tips' to Technorati" alt="Add 'Selenium Test Tips' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/&amp;t=Selenium+Test+Tips" title="Add 'Selenium Test Tips' to Yahoo My Web"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/yahoo_myweb.png" title="Add 'Selenium Test Tips' to Yahoo My Web" alt="Add 'Selenium Test Tips' to Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/refer.php?url=http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/&amp;title=Selenium+Test+Tips" title="Add 'Selenium Test Tips' to Stumble Upon"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/stumbleupon.png" title="Add 'Selenium Test Tips' to Stumble Upon" alt="Add 'Selenium Test Tips' to Stumble Upon" /></a></div>
<!-- Social Bookmarks END -->]]></content:encoded>
			<wfw:commentRss>http://www.rationalistic.com/2007/04/05/software/selenium-test-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tech Superstition</title>
		<link>http://www.rationalistic.com/2007/03/18/usability/tech-superstition/</link>
		<comments>http://www.rationalistic.com/2007/03/18/usability/tech-superstition/#comments</comments>
		<pubDate>Sun, 18 Mar 2007 02:55:09 +0000</pubDate>
		<dc:creator>Tal Rotbart</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.rationalistic.com/2007/03/18/usability/tech-superstition/</guid>
		<description><![CDATA[Excellent article about technological superstition by Jeff Raskin.
Bookmark to:
]]></description>
			<content:encoded><![CDATA[<p>Excellent <a href="http://www.acmqueue.com/modules.php?name=Content&amp;pa=showpage&amp;pid=98">article about technological superstition</a> by Jeff Raskin.</p>
<!-- Social Bookmarks BEGIN --><div class="social_bookmark"><em>Bookmark to:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://www.rationalistic.com/2007/03/18/usability/tech-superstition/&amp;title=Tech+Superstition" title="Add 'Tech Superstition' to Del.icio.us"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/delicious.png" title="Add 'Tech Superstition' to Del.icio.us" alt="Add 'Tech Superstition' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://www.rationalistic.com/2007/03/18/usability/tech-superstition/&amp;title=Tech+Superstition" title="Add 'Tech Superstition' to digg"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/digg.png" title="Add 'Tech Superstition' to digg" alt="Add 'Tech Superstition' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://www.rationalistic.com/2007/03/18/usability/tech-superstition/&amp;title=Tech+Superstition" title="Add 'Tech Superstition' to reddit"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/reddit.png" title="Add 'Tech Superstition' to reddit" alt="Add 'Tech Superstition' to reddit" /></a><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://www.rationalistic.com/2007/03/18/usability/tech-superstition/" title="Add 'Tech Superstition' to Technorati"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/technorati.png" title="Add 'Tech Superstition' to Technorati" alt="Add 'Tech Superstition' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://www.rationalistic.com/2007/03/18/usability/tech-superstition/&amp;t=Tech+Superstition" title="Add 'Tech Superstition' to Yahoo My Web"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/yahoo_myweb.png" title="Add 'Tech Superstition' to Yahoo My Web" alt="Add 'Tech Superstition' to Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/refer.php?url=http://www.rationalistic.com/2007/03/18/usability/tech-superstition/&amp;title=Tech+Superstition" title="Add 'Tech Superstition' to Stumble Upon"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/stumbleupon.png" title="Add 'Tech Superstition' to Stumble Upon" alt="Add 'Tech Superstition' to Stumble Upon" /></a></div>
<!-- Social Bookmarks END -->]]></content:encoded>
			<wfw:commentRss>http://www.rationalistic.com/2007/03/18/usability/tech-superstition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rosenberg&#8217;s Law Rephrased</title>
		<link>http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/</link>
		<comments>http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/#comments</comments>
		<pubDate>Sun, 04 Feb 2007 23:09:16 +0000</pubDate>
		<dc:creator>Tal Rotbart</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/</guid>
		<description><![CDATA[The publishing of Scott Rosenberg&#8217;s &#8220;Dreaming in Code&#8221; and the PR circle around it, has prompted Jonathan Rentzsch writing a post which criticizes one of Rosenberg&#8217;s main tenants &#8212; that &#8216;Programmers like to code&#8217; &#8212; and suggests instead that &#8216;Programmers like problem solving&#8217;. Rentzsch goes on to claim that programmers&#8217; urge to rewrite problematic legacy [...]]]></description>
			<content:encoded><![CDATA[<p>The publishing of Scott Rosenberg&#8217;s &#8220;<a href="http://www.dreamingincode.com/">Dreaming in Code</a>&#8221; and the <a href="http://www.salon.com/books/int/2007/02/03/leonard/print.html">PR</a> <a href="http://www.joelonsoftware.com/items/2007/01/21.html">circle</a> around it, has prompted Jonathan Rentzsch <a href="http://rentzsch.com/notes/programmersDontLikeToCode">writing a post</a> which criticizes one of Rosenberg&#8217;s main tenants &#8212; that &#8216;Programmers like to code&#8217; &#8212; and suggests instead that &#8216;Programmers like problem solving&#8217;. Rentzsch goes on to claim that programmers&#8217; urge to rewrite problematic legacy code bases is the desire to understand rather than a desire to code.</p>
<p>I agree with Rentzsch completely on this point, however I do believe that Rosenberg, having come from the wrong direction, has hit a point with &#8220;Rosenberg&#8217;s Law&#8221;:<br />
&#8220;<font></font><font size="3" face="times new roman, times, serif">if you are doing something that has already been done &#8212; then you have a frame of reference to estimate how long it is going to take, and to guess how many people are going to be required&#8221;</font></p>
<p style="text-align: left">I&#8217;d like to rephrase this in Rentzsch&#8217;s &#8220;problem solving&#8221; terms, and paraphrase &#8220;Rosenberg&#8217;s Law&#8221; as:</p>
<p style="text-align: center">&#8220;A relationship between the <em>unfamiliarity</em> of a problem to the <em>difficulty </em>of estimating the required resources to solve it.&#8221;</p>
<p style="text-align: left">Which is not surprising in hindsight, as it is a relationship between one type of uncertainty to another&#8230;</p>
<!-- Social Bookmarks BEGIN --><div class="social_bookmark"><em>Bookmark to:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/&amp;title=Rosenberg%26%238217%3Bs+Law+Rephrased" title="Add 'Rosenberg&#8217;s Law Rephrased' to Del.icio.us"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/delicious.png" title="Add 'Rosenberg&#8217;s Law Rephrased' to Del.icio.us" alt="Add 'Rosenberg&#8217;s Law Rephrased' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/&amp;title=Rosenberg%26%238217%3Bs+Law+Rephrased" title="Add 'Rosenberg&#8217;s Law Rephrased' to digg"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/digg.png" title="Add 'Rosenberg&#8217;s Law Rephrased' to digg" alt="Add 'Rosenberg&#8217;s Law Rephrased' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/&amp;title=Rosenberg%26%238217%3Bs+Law+Rephrased" title="Add 'Rosenberg&#8217;s Law Rephrased' to reddit"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/reddit.png" title="Add 'Rosenberg&#8217;s Law Rephrased' to reddit" alt="Add 'Rosenberg&#8217;s Law Rephrased' to reddit" /></a><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/" title="Add 'Rosenberg&#8217;s Law Rephrased' to Technorati"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/technorati.png" title="Add 'Rosenberg&#8217;s Law Rephrased' to Technorati" alt="Add 'Rosenberg&#8217;s Law Rephrased' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/&amp;t=Rosenberg%26%238217%3Bs+Law+Rephrased" title="Add 'Rosenberg&#8217;s Law Rephrased' to Yahoo My Web"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/yahoo_myweb.png" title="Add 'Rosenberg&#8217;s Law Rephrased' to Yahoo My Web" alt="Add 'Rosenberg&#8217;s Law Rephrased' to Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/refer.php?url=http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/&amp;title=Rosenberg%26%238217%3Bs+Law+Rephrased" title="Add 'Rosenberg&#8217;s Law Rephrased' to Stumble Upon"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/stumbleupon.png" title="Add 'Rosenberg&#8217;s Law Rephrased' to Stumble Upon" alt="Add 'Rosenberg&#8217;s Law Rephrased' to Stumble Upon" /></a></div>
<!-- Social Bookmarks END -->]]></content:encoded>
			<wfw:commentRss>http://www.rationalistic.com/2007/02/05/software/rosenbergs-law-rephrased/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>War story on why C&amp;C management sucks</title>
		<link>http://www.rationalistic.com/2006/08/08/software/war-story-on-why-cc-management-sucks/</link>
		<comments>http://www.rationalistic.com/2006/08/08/software/war-story-on-why-cc-management-sucks/#comments</comments>
		<pubDate>Wed, 09 Aug 2006 06:01:00 +0000</pubDate>
		<dc:creator>Tal Rotbart</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.rationalistic.com/?p=21</guid>
		<description><![CDATA[Joel Spolsky has another lovely article out titled, &#8220;The Command and Control Management Method&#8220;. While he hits the nail on the head for most of the article, I feel he misses one of the main reasons while C&#038;C management does not work for software development teams.
Actually, he misses one of the main reasons the C&#038;C [...]]]></description>
			<content:encoded><![CDATA[<p>Joel Spolsky has another lovely article out titled, &#8220;<a href="http://www.joelonsoftware.com/items/2006/08/08.html">The Command and Control Management Method</a>&#8220;. While he hits the nail on the head for most of the article, I feel he misses one of the main reasons while C&#038;C management does not work for software development teams.</p>
<p>Actually, he misses one of the main reasons the C&#038;C pattern doesn&#8217;t even work for the military.</p>
<p>It all begins with the 1973 (no, seriously) Yom Kipur War between Israel, Egypt and Syria. Having taken Israel by surprise, the Syrian tank divisions storm through the Golan Heights and almost reach Nafah where the headquarters for the Israeli forces were located.</p>
<p>Had the Syrian forces reached Nafah, they would have most likely defeated Israel and conquered the Golan Heights at the very least. But they haven&#8217;t, and didn&#8217;t &#8212; instead, they stopped.</p>
<p>Just before overtaking Nafah (&#8216;on Nafah&#8217;s fences&#8217; as <a href="http://en.wikipedia.org/wiki/Yom_Kippur_War">Wikipedia describes it</a>), the Syrians halted their advance. This allowed time for Israeli reserve forces to arrive en-mass and overturn the tides of war, eventually costing the Syrians their victory. To this day, no one outside Syria (and maybe Israeli Intelligence) knows for certain why the Syrian force stopped so abruptly.</p>
<p>There is a prevailing theory, however. This theory boils down to the difference in management style between Arab armies (Soviet trained) and the IDF. Arab armies are trained for complete Command and Control management, an underling will not make a move without being issued a command. The most initiative he can show is to suggest a course of action to his superior, who might suggest it to his and so forth until the highest authority on the matter is reached, once he makes a decision the order to action travels down the chain of command. As any software engineer will tell you, this upstream-downstream transaction means very high latency.</p>
<p>Israeli military on the other hand, have an altogether different standing order: a soldier without immediate contact to his supervisor is his own chief-of-staff.  This translates to initiative and rapid response during the fog of war.</p>
<p>So imagine that the Syrian tank brigade commander, having surpassed his superiors&#8217; expectations and advanced so quickly into Israeli held territory that he exhausted his current orders. He was not meant to reach Nafah so quickly! As he is trained not to question his orders, and as he is only given very limited information (on a supposed &#8216;need to know basis&#8217;) he can&#8217;t assume that proceeding forward would fit with the larger plan.</p>
<p>Thus our well trained commander jubilantly radios back his headquarters and informs them of his brilliant success and requests further instructions. While his report travels up the command vine, he and his forces are minutes away from victory and are standing completely still.</p>
<p>The next step of the reasoning is quite clear:</p>
<p>Use a command and control management style and you will be the bottleneck of every development step, as every decision beyond what to call the class file will be relegated to you. This is not just hit-and-run micromanagement, this is a semaphore locked development cycle and is hardly an efficient use of your very valuable resources (otherwise known as: people).</p>
<p>While there are many (many!) number of arguments why C&#038;C does NOT work for software development projects (for example: writing good software is a creative process, C&#038;C management hampers creativity) I think the above is the most important and most direct argument against such a style of management.</p>
<p>Having said that, there are places where <a href="http://ve3d.ign.com/articles/720/720448p1.html">C&#038;C is just fine</a>.</p>
<p>Technorati tags: <a rel="tag" href="http://technorati.com/tag/software-development">software-development</a>, <a rel="tag" href="http://technorati.com/tag/management">management</a></p>
<!-- Social Bookmarks BEGIN --><div class="social_bookmark"><em>Bookmark to:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://www.rationalistic.com/2006/08/08/software/war-story-on-why-cc-management-sucks/&amp;title=War+story+on+why+C%26amp%3BC+management+sucks" title="Add 'War story on why C&amp;C management sucks' to Del.icio.us"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/delicious.png" title="Add 'War story on why C&amp;C management sucks' to Del.icio.us" alt="Add 'War story on why C&amp;C management sucks' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://www.rationalistic.com/2006/08/08/software/war-story-on-why-cc-management-sucks/&amp;title=War+story+on+why+C%26amp%3BC+management+sucks" title="Add 'War story on why C&amp;C management sucks' to digg"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/digg.png" title="Add 'War story on why C&amp;C management sucks' to digg" alt="Add 'War story on why C&amp;C management sucks' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://www.rationalistic.com/2006/08/08/software/war-story-on-why-cc-management-sucks/&amp;title=War+story+on+why+C%26amp%3BC+management+sucks" title="Add 'War story on why C&amp;C management sucks' to reddit"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/reddit.png" title="Add 'War story on why C&amp;C management sucks' to reddit" alt="Add 'War story on why C&amp;C management sucks' to reddit" /></a><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://www.rationalistic.com/2006/08/08/software/war-story-on-why-cc-management-sucks/" title="Add 'War story on why C&amp;C management sucks' to Technorati"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/technorati.png" title="Add 'War story on why C&amp;C management sucks' to Technorati" alt="Add 'War story on why C&amp;C management sucks' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://www.rationalistic.com/2006/08/08/software/war-story-on-why-cc-management-sucks/&amp;t=War+story+on+why+C%26amp%3BC+management+sucks" title="Add 'War story on why C&amp;C management sucks' to Yahoo My Web"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/yahoo_myweb.png" title="Add 'War story on why C&amp;C management sucks' to Yahoo My Web" alt="Add 'War story on why C&amp;C management sucks' to Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/refer.php?url=http://www.rationalistic.com/2006/08/08/software/war-story-on-why-cc-management-sucks/&amp;title=War+story+on+why+C%26amp%3BC+management+sucks" title="Add 'War story on why C&amp;C management sucks' to Stumble Upon"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/stumbleupon.png" title="Add 'War story on why C&amp;C management sucks' to Stumble Upon" alt="Add 'War story on why C&amp;C management sucks' to Stumble Upon" /></a></div>
<!-- Social Bookmarks END -->]]></content:encoded>
			<wfw:commentRss>http://www.rationalistic.com/2006/08/08/software/war-story-on-why-cc-management-sucks/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Web applications vs. Web sites, Ruby on Rails and points in between</title>
		<link>http://www.rationalistic.com/2006/07/16/software/web-applications-vs-web-sites-ruby-on-rails-and-points-in-between/</link>
		<comments>http://www.rationalistic.com/2006/07/16/software/web-applications-vs-web-sites-ruby-on-rails-and-points-in-between/#comments</comments>
		<pubDate>Mon, 17 Jul 2006 04:10:00 +0000</pubDate>
		<dc:creator>Tal Rotbart</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.rationalistic.com/?p=19</guid>
		<description><![CDATA[Ruby on Rails is rightfully gaining traction and respect right along with a rapidly growing developer community. This, due to its being the near-perfect match for developing its `home-turf&#8217; software: database backed web site. However, as pleased as I am with RoR&#8217;s success, I&#8217;m beginning to note with apprehension as it is increasingly being used [...]]]></description>
			<content:encoded><![CDATA[<p>Ruby on Rails is rightfully gaining traction and respect right along with a rapidly growing developer community. This, due to its being the near-perfect match for developing its `home-turf&#8217; software: database backed web site. However, as pleased as I am with RoR&#8217;s success, I&#8217;m beginning to note with apprehension as it is increasingly being used for writing the kind of software it is not meant for.</p>
<p>It is not unlike the early Java-rush years in which every tiny in-house web-application seemed to some misguided souls like a nail aching for the punch of the overweight EJB hammer.</p>
<p>Rails development scales very well, so if you are developing a web-site, you&#8217;re in for a pleasant surprise using it. Whether you develop alone or with many team members, whether you deploy for ten concurrent users or ten-thousand, Rails is definitely the right tool for the job. But if you are developing something more state heavy, such as a web-application, then you are in for a nasty headache when your code goes O(spaghetti^2).</p>
<p>Rails is a great tool for what it does, but when you&#8217;re writing software that translates to a different architecture than a thin-state web-site (as rich an experience as it may be!) using Rails will be like trying to fit a square peg into a round hole (when the cliche fits&#8230;)</p>
<p>Web site/app, what&#8217;s the difference?<br />
The difference between the two boils down to the number and complexity of the states of the software&#8230; &#8230;Huh?</p>
<p>Let us demonstrate: A good example for a web-site is IMDb, it aggregates information about movies from various sources including other users. Another example for a web-site is OkCupid.com which allow online matchmaking and interactions between users. Contrast this with a web-application such as Google Spreadsheets which is pretty much a hosted version of Excel + collaboration. Another example for a web-application (although one that is smaller in scale) is an application which allows you to control your home automation remotely via a web browser.</p>
<p>What is a web site?<br />
A classic web-site is a thin view layer unto an expansive schema which is modeled and stored in a database. The use-cases it implements are shallow on their own right but their aggregate creates an experience which is much larger than the sum of its flows.</p>
<p>The main draw of a web-site are the users&#8211; you are not interacting with the software alone, you are part of a grander &#8216;community&#8217; (as much as this word brings a bitter taste to my mouth at times)&#8211; While using a web-site you become part of the network and as a user you give value back to the site by interacting. This is the &#8216;Web 2.0&#8242; vision, a painful buzzword on its own.</p>
<p>Web 2.0-type sites are absolutely ideal candidates for Ruby on Rails and as such there are many success stories to be observed. I&#8217;ll skip the bother of listing them, go to <a href="http://www.rubyonrails.org">RubyOnRails.org</a> and scroll down, I&#8217;m sure you&#8217;ll recognize some of the leading neuvo-web sites.</p>
<p>Now, seeing these successes described in IT Weakly (ha-ha) your average Joe IT Manager figures, &#8216;Hey! This Rails thing does web sites good! We have an in-house application to plan our customers&#8217; parties which we need to upgrade, so let us rewrite it as a web-application using Rails!&#8217;</p>
<p>Gulp! Ding! Big Whoop! No good!</p>
<p>Why?</p>
<p>Because web applications and web sites are not the same thing&#8230; Joe IT is going to use Rails for something it is not meant for and actually quite weak for.</p>
<p>Web-Applications, a primer<br />
To understand what web-applications in a deeper sense, consider the expression itself&#8211; it is naught but the well worn word &#8216;application&#8217; with &#8216;web&#8217; tacked in front. So a web application is simply an application that runs on the web as its platform of choice.</p>
<p>A desktop application&#8217;s experience is one of the user vs. The Software. Perhaps a limited remote resource is utilized, such as a query to the Party Supplies Database for the benefit of the purchase order printing screen but other then that&#8211; it is the user alone who calls the shots.</p>
<p>You can create deep, <a href="http://www.google.com/search?q=define%3Astateful">stateful</a> use-cases that involve selecting a venue for the party and setting up the table locations and seating arrangements. It doesn&#8217;t matter if the experience of using this piece of software is immersive or merely tangential but the main point is that does not involve anyone else but the user himself along with the rich client experience (ah&#8230; Buzzwords). There&#8217;s a heavy statefulness to applications that doesn&#8217;t exist in web-sites.</p>
<p>The Thin Line<br />
AJAX, another aspect of the Web 2.0 paradigm, is bridging the gap between the richness of a desktop application and that of one set on the web. It is also bringing more modal interaction to web-sites. But as thin as the line is, it is still there. And where it is most noticeable is the amount of statefulness of the software.</p>
<p>In a web site the state is maintained in these locations: The URL, the session and the database. You can consider them the short-term, mid-term and long-term memory of the software. For brevity, I&#8217;ll refer to any information which is kept client-side and travels back from the user as the URL, although it may be sent to the server in other parts of the HTTP request (such as forms).</p>
<p>To scale a web-site well, as little state as possible should be maintained in the session (for clustering purposes) and yet the cost of a DB call is also prohibitive so it is best for UI state to be contained in the URL as much as can possibly be managed, while taking care to never trust the user-sent data and to avoid assuming that he will ever traverse the flow chain as expected.</p>
<p>This leaves very, very little place for statefulness in web sites and it is the main reasons why web sites have shorter, shallower flows than do applications.</p>
<p>Don&#8217;t get me wrong&#8211; web-sites may have a rich UI. We are all immersed in the latest trend of enriching web-sites&#8217; UI by creating a more responsive UI using AJAX.</p>
<p>The list that updates without a page refresh, a popup dialog for selecting your state or the modal window which display the clicked-upon photograph, these are just a few of the examples we see daily&#8211; but all this adds nothing to the statefulness of the site &#8212; it doesn&#8217;t turn it into an application and it shouldn&#8217;t!</p>
<p>Rails is ideal for developing web-sites because it deals very well with interpreting  the current state from both sources (URL &#8211;&gt; ActionPack, database -&gt; ActiveRecord) and churning out a view for it. The second you add more statefulness, it gets painful.</p>
<p>Words of Wisdom<br />
I speak from experience&#8212; I learned this painful truth about Rails the hard way by trying (and actually succeeding, through painfully so) to create a rich-flow application with Rails. This application should have been a desktop application by all rights, but seeing as I had recently acquired a hammer, I just had to use it to beat the screw in&#8230;</p>
<p>This application&#8217;s model was simple enough, but the user flow involved the use of resources on the PC itself (the DVD drive, in this case) making it utterly befitting a desktop application, and less so for a web-app&#8230; Blinded as I was by the ease of writing web-sites with Rails, I ignored my own red-lights flashing and went ahead anyway. It turned out well enough, but taught me hard lessons about what Rails makes easy and what it makes hard.</p>
<p>Statefulness&#8230;Blissfulness?<br />
There are frameworks out there which fit a state-rich AJAX web-application much more than Rails. There are many examples and I would not want to mention one for fear of the flames, but feel free to suggest yours in the comments below.</p>
<p>Technorati tags: <a rel="tag" href="http://www.technorati.com/tag/Ruby+On+Rails">Ruby on Rails</a>, <a rel="tag" href="http://www.technorati.com/tag/Development">Development</a>, <a rel="tag" href="http://www.technorati.com/tag/Software">Software</a>, <a rel="tag" href="http://www.technorati.com/tag/web+2.0">Web 2.0</a></p>
<!-- Social Bookmarks BEGIN --><div class="social_bookmark"><em>Bookmark to:</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://www.rationalistic.com/2006/07/16/software/web-applications-vs-web-sites-ruby-on-rails-and-points-in-between/&amp;title=Web+applications+vs.+Web+sites%2C+Ruby+on+Rails+and+points+in+between" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Del.icio.us"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/delicious.png" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Del.icio.us" alt="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://www.rationalistic.com/2006/07/16/software/web-applications-vs-web-sites-ruby-on-rails-and-points-in-between/&amp;title=Web+applications+vs.+Web+sites%2C+Ruby+on+Rails+and+points+in+between" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to digg"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/digg.png" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to digg" alt="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://www.rationalistic.com/2006/07/16/software/web-applications-vs-web-sites-ruby-on-rails-and-points-in-between/&amp;title=Web+applications+vs.+Web+sites%2C+Ruby+on+Rails+and+points+in+between" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to reddit"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/reddit.png" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to reddit" alt="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to reddit" /></a><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://www.rationalistic.com/2006/07/16/software/web-applications-vs-web-sites-ruby-on-rails-and-points-in-between/" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Technorati"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/technorati.png" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Technorati" alt="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://www.rationalistic.com/2006/07/16/software/web-applications-vs-web-sites-ruby-on-rails-and-points-in-between/&amp;t=Web+applications+vs.+Web+sites%2C+Ruby+on+Rails+and+points+in+between" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Yahoo My Web"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/yahoo_myweb.png" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Yahoo My Web" alt="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/refer.php?url=http://www.rationalistic.com/2006/07/16/software/web-applications-vs-web-sites-ruby-on-rails-and-points-in-between/&amp;title=Web+applications+vs.+Web+sites%2C+Ruby+on+Rails+and+points+in+between" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Stumble Upon"><img src="http://www.rationalistic.com/wp-content/plugins/social_bookmarks/stumbleupon.png" title="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Stumble Upon" alt="Add 'Web applications vs. Web sites, Ruby on Rails and points in between' to Stumble Upon" /></a></div>
<!-- Social Bookmarks END -->]]></content:encoded>
			<wfw:commentRss>http://www.rationalistic.com/2006/07/16/software/web-applications-vs-web-sites-ruby-on-rails-and-points-in-between/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
