<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Talk Like A Duck: Tag rubyhoedown</title>
    <link>http://talklikeaduck.denhaven2.com/articles/tag/rubyhoedown</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>In Ruby, it's not the dog, it's the tricks!</description>
    <item>
      <title>Aspects of Beauty: Proportion, Integrity, Clarity, and Monkey Patching?</title>
      <description>&lt;p&gt;&lt;img src="http://talklikeaduck.denhaven2.com/files/beauty_small.png" class="tease-image"/&gt;
Besides being a master werewolf, Marcel Molina Jr. gives great presentations!
&lt;p&gt;
In his keynote presentation on the second day of the Ruby Hoedown, Marcel talked about 
&lt;a href="http://rubyhoedown2007.confreaks.com/session09.html"&gt;&amp;#8220;What Makes Code Beautiful&amp;#8221;&lt;/a&gt;,
click on the link for the confreaks video of this session.
&lt;/p&gt;
&lt;p&gt;
The talk started with an exploration of the classical Philosophy of Beauty, from Plato to Descartes.
Marcel summarized this by proposing that beauty lies in the balance between three aspects which, 
at times, either strengthen or oppose each other:&lt;/p&gt;&lt;/p&gt;


&lt;dl&gt;
&lt;dt&gt;Proportion&lt;/dt&gt;&lt;dd&gt;The property that components have the appropriate(relative) size/weight.&lt;/dd&gt;
&lt;dt&gt;Integrity&lt;/dt&gt;&lt;dd&gt;I would summarize this as &amp;#8220;fitness of purpose.&amp;#8221;  Marcel&amp;#8217;s anti-example was a
hammer made out of glass. Although it might be beautifully constructed, and a joy to the eye, it
would be unlikely to serve its intended purpose, and thus would fall short on integrity&lt;/dd&gt;
&lt;dt&gt;Clarity&lt;/dt&gt;The property of being easily grasped as to meaning and function.&lt;/dd&gt;
&lt;/dl&gt;
&lt;h2&gt;Beauty and Ruby&lt;/h2&gt;
&lt;p&gt;About 16 minutes into the talk, Marcel started talking about this view of beauty in the context of Ruby code.  He gave an example of some really &amp;#8220;clever&amp;#8221; code to convert strings to an appropriate
instance of a Ruby class, for example &amp;#8220;true&amp;#8221; would me converted to true, &amp;#8220;false&amp;#8221; to false, and 
strings representing integer or time values to Integers or Times, respectively.&lt;/p&gt;
&lt;p&gt;The code in question, implemented a kind of functional language pattern match against the string.
Marcel suggested that he might have been into studying Haskell at the time he wrote this code.
He used a generator to produce an enumerable collection of patterns to try, and did some &amp;#8220;nice&amp;#8221; 
tricks to allow the result of a pattern match to sometimes be solely the value he wanted, and 
sometimes to be an array with the value as the second element, to handle the special case where the 
desired value was the literal false.  If it sounds complicated, it is, I&amp;#8217;ve placed the code at
the end of this article.  
Some of us in the audience, &amp;#8220;smelled&amp;#8221; this code right away.&lt;/p&gt;
&lt;p&gt;He then critiqued this solution. Although he had originally considered it &amp;#8220;beautiful&amp;#8221; since it was &amp;#8220;elegant&amp;#8221; and &amp;#8220;sophisticated&amp;#8221; he came to smell it too.&lt;/p&gt;
&lt;h2&gt;A Fresh Design&lt;/h2&gt;
&lt;p&gt;Here&amp;#8217;s how the code ultimately was written:&lt;/p&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CoercibleString&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;String&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;coerce&lt;/span&gt;
    &lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;
    &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;true&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;          &lt;span class="constant"&gt;true&lt;/span&gt;
    &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;':&lt;/span&gt;         &lt;span class="constant"&gt;false&lt;/span&gt;
    &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;^&lt;span class="escape"&gt;\d&lt;/span&gt;+$&lt;/span&gt;&lt;span class="punct"&gt;/:&lt;/span&gt;         &lt;span class="constant"&gt;Integer&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="ident"&gt;datetime_format&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;else&lt;/span&gt;
      &lt;span class="constant"&gt;self&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once this much simpler design is unveiled the original &amp;#8220;sophisticated&amp;#8221;, and &amp;#8220;elegant&amp;#8221; design
looks anything but.&lt;/p&gt;
&lt;h2&gt;Measuring against Proportion, Integrity, and Clarity&lt;/h2&gt;
&lt;dl&gt;
&lt;dt&gt;Proportion&lt;/dt&gt;&lt;dd&gt;The original is a total failure, it&amp;#8217;s much too long compared to the final
code.&lt;/dt&gt;
&lt;dt&gt;Integrity&lt;/dt&gt;&lt;dd&gt;Again the original loses on this aspect. The use of the generator, particularly
the early continuation based implementation, causes very slow performance, and leaks memory. Marcel
stated that the simpler version is an order of magnitude faster.&lt;/dt&gt;
&lt;dt&gt;Clarity&lt;/dt&gt;&lt;dd&gt;Do I really have to explore this?&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Marcel had pointed out when describing the original design that one of it&amp;#8217;s &amp;#8220;cool features&amp;#8221; was
extensibility. Adding a new coercion just required adding another call to try in the Generator.new
block.&lt;/p&gt;
&lt;p&gt;In contrast adding a new coercion to the better design just requires adding a when leg to the
case statement.&lt;/p&gt;
&lt;h2&gt;The Questionable Beauty of Making Subclasses of Core Classes&lt;/h2&gt;
&lt;p&gt;While I loved the talk and agree with 99 and 44/100%,  I&amp;#8217;m just a bit troubled by the introduction
of the CoercibleString class.  I think that it falls down on proportion at least.&lt;p&gt;
&lt;p&gt;It seems to me that there&amp;#8217;s some missing code here.  How do you actually coerce a string.
This seems to strongly imply a usage like this:&lt;/p&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;PayloadProcessor&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;process&lt;/span&gt;
    &lt;span class="comment"&gt;# code which extracts a string to be coerced&lt;/span&gt;

    &lt;span class="comment"&gt;#coerce the string referenced by the variable value_str&lt;/span&gt;
    &lt;span class="ident"&gt;value&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;CoercibleString&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;value_str&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;coerce&lt;/span&gt;

    &lt;span class="comment"&gt;#further processing&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;An alternative, and it seems to me to be a better one, although I&amp;#8217;m convinceable otherwise, would
be to just make that method part of the class requiring the conversion, either directly, or through a
module:&lt;/p&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;class PayloadProcessor

  def process
    # code which extracts a string to be coerced

    #coerce the string referenced by the variable value_str
    value = coerce(value_str)

    #further processing
  end

  def coerce(str)
    case str
    when 'true':          true
    when 'false':         false
    when /^\d+$/:         Integer(str)
    when datetime_format: Time.parse(str)
    else
      str
    end
  end

end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now some might argue that the &amp;#8216;functional&amp;#8217; looking coerce method which takes the string
as an argument rather than the receiver seems somehow less &amp;#8216;object oriented&amp;#8217;, but I find this
unconvincing.&lt;/p&gt;
&lt;p&gt;If CoercibleString is a class we need code to create it from a string, something like:&lt;/p&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CoercibleString&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;String&lt;/span&gt;
    &lt;span class="comment"&gt;# Create a new coercible string&lt;/span&gt;
    &lt;span class="comment"&gt;# Note that since the actual value of&lt;/span&gt;
    &lt;span class="comment"&gt;# Ruby strings are not held by an instance variable&lt;/span&gt;
    &lt;span class="comment"&gt;# we need to alter the internal representation&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;source_str&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="constant"&gt;self&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;source_str&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I had a brief conversation with Marcel about whether or not subclassing string really seemed
appropriate, but it lasted all of about a minute. There&amp;#8217;s a bit of supposition here on my
part, so apologies to Marcel if I misunderstood the exchange. He indicated that he would probably 
advocate
defining a method called CoercibleString, in parallel with Kernel#Integer and its ilk.&lt;/p&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Kernel&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;CoercibleString&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;str&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
     &lt;span class="constant"&gt;CoercibleString&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;str&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;But this syntactic sugar, just seems to be tilting the balance towards a less proportional design.
&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Building new classes is often a good idea, but not always.  I&amp;#8217;m not totally convinced that
coerce(str) is more beautiful than CoercibleString.new(str).coerce, or CoercibleString(str).coerce,
but &lt;strong&gt;my&lt;/strong&gt; sense of esthetics tilts me that way.&lt;/p&gt;
&lt;p&gt;Comments?&lt;/p&gt;
&lt;h2&gt;A &amp;#8220;Smelly&amp;#8221; Way to Coerce Strings&lt;/h2&gt;
&lt;p&gt;Here&amp;#8217;s Marcel&amp;#8217;s original code:&lt;/p&gt;
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CoercibleString&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;String&lt;/span&gt;
  &lt;span class="ident"&gt;attr_accessor&lt;/span&gt; &lt;span class="ident"&gt;generator&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;coerce&lt;/span&gt;
    &lt;span class="ident"&gt;attempt&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;
    &lt;span class="keyword"&gt;break&lt;/span&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="ident"&gt;attempt&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;coercions&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;next&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt; &lt;span class="keyword"&gt;while&lt;/span&gt; &lt;span class="ident"&gt;coercions&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;next?&lt;/span&gt;
    &lt;span class="ident"&gt;attempt&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;attempt&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;private&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;coercions&lt;/span&gt;
      &lt;span class="constant"&gt;Generator&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;generator&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;try&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;true&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;             &lt;span class="punct"&gt;}&lt;/span&gt;
        &lt;span class="ident"&gt;try&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt; &lt;span class="punct"&gt;]&lt;/span&gt;  &lt;span class="punct"&gt;}&lt;/span&gt;
        &lt;span class="ident"&gt;try&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="constant"&gt;Integer&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;              &lt;span class="punct"&gt;}&lt;/span&gt;
        &lt;span class="ident"&gt;try&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="constant"&gt;Date&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;           &lt;span class="punct"&gt;}&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;try&lt;/span&gt;
        &lt;span class="ident"&gt;attempt&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;desired&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="keyword"&gt;yield&lt;/span&gt;
        &lt;span class="ident"&gt;generator&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;yield&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;desired&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;nil?&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt; &lt;span class="ident"&gt;attempt&lt;/span&gt; &lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;desired&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;attempt&lt;/span&gt;
    &lt;span class="keyword"&gt;rescue&lt;/span&gt; &lt;span class="constant"&gt;ArgumentError&lt;/span&gt;
        &lt;span class="ident"&gt;generator&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;yield&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 20 Aug 2007 14:25:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:736e1dfe-1fec-46d1-994d-15838271c4eb</guid>
      <author>Rick DeNatale</author>
      <link>http://talklikeaduck.denhaven2.com/articles/2007/08/20/aspects-of-beauty-proportion-integrity-clarity-and-monkey-patching</link>
      <category>ruby</category>
      <category>best_practices</category>
      <category>ruby</category>
      <category>rubyhoedown</category>
      <category>beautiful_code</category>
      <trackback:ping>http://talklikeaduck.denhaven2.com/articles/trackback/456</trackback:ping>
    </item>
    <item>
      <title>Ruby Hoedown TeeVee - &amp;quot;Hee Haw!&amp;quot;</title>
      <description>&lt;p&gt;&lt;img src="http://talklikeaduck.denhaven2.com/files/hoedown.png" class="tease-image"/&gt;
I notice that master werewolves 
Coby Randquist and Carl Youngblood
have gotten all of the 
&lt;a href="http://rubyhoedown2007.confreaks.com/"&gt;videos from the 
inaugural Ruby Hoedown&lt;/a&gt; (at least
in rough cut form) on their confreaks website.
&lt;p&gt;I&amp;#8217;m stoked about this, and the site in general.  
Like the way &lt;a href="http://www.infoq.com/"&gt;infoq web publishes presentations&lt;/a&gt;, confreaks
shows synchronized live action video and the &amp;#8220;slides&amp;#8221;, however I like the confreaks site better.
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;The &amp;#8220;slides&amp;#8221; are directly captured as video from the presenters laptop.  The big plus here is that
live demos are also there.&lt;/li&gt;
&lt;li&gt;The presentation is &amp;#8220;widescreen&amp;#8221; with the two components laid out side by side, which I think 
works better.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As for content, there was lots of good stuff at the hoedown which is now available for viewing on-line.  &lt;a href="http://rubyhoedown2007.confreaks.com/"&gt;Check it out.&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;</description>
      <pubDate>Mon, 20 Aug 2007 10:13:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:3c81445e-94a3-456e-8a4d-c56ad84e26a9</guid>
      <author>Rick DeNatale</author>
      <link>http://talklikeaduck.denhaven2.com/articles/2007/08/20/ruby-hoedown-teevee-hee-haw</link>
      <category>ruby</category>
      <category>rubyhoedown</category>
      <category>conferences</category>
      <trackback:ping>http://talklikeaduck.denhaven2.com/articles/trackback/455</trackback:ping>
    </item>
    <item>
      <title>After the Hoedown is Over, Part 1</title>
      <description>&lt;p&gt;&lt;img src="http://talklikeaduck.denhaven2.com/files/hoedown.png" class="tease-image"/&gt;
The first Ruby Hoedown, sponsored by the Raleigh Ruby brigade, has finally come and gone. I had a great two days, saw some old friends, and made lots of new ones.
&lt;p&gt;Here are my initial thoughts after more than a bit too litle sleep after a night trying to root out werewolves.&lt;/p&gt;


&lt;h2&gt;Deja-Vu All over again&lt;/h2&gt;
&lt;p&gt;I was just a little surprised how often Smalltalk came up during the weekend.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The first instance was in the keynote talk by Bruce Tate, well known as a &lt;a href="http://www.pragmaticprogrammer.com/titles/fr_j2r/index.html"&gt;Java apostate&lt;/a&gt; in which he explored the current state of Ruby, how it got where it is, and where it might go in the future.&lt;p&gt;This was in part a cautionary tale, and the fate of Smalltalk in the mid-late 1990s loomed large.&lt;/p&gt;&lt;p&gt;As one of those heavily involved in the Smalltalk community as a developer and evangelist for &lt;span class="caps"&gt;IBM&lt;/span&gt;, I found it interesting to get an independent perspective.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.rolemodelsoft.com/ken_auer"&gt;Ken Auer&lt;/a&gt; gave a talk on Saturday called &amp;#8220;Does Ruby have a Chasm to cross?&amp;#8221;&lt;/li&gt; which covered much of the same ground as Bruce&amp;#8217;s talk, but really focused on comparing the life paths of Ruby and Smalltalk.
&lt;p&gt;So another independent perspective on what happened to Smalltalk, this time from someone with known credentials as a key member of the Smalltalk community when it was booming. Ken and I go back quite a ways.&lt;/p&gt;
&lt;p&gt;Ken worked at Knowledge Systems Corp back then, which as a company which provided intensive training in object oriented development using Smalltalk via an apprentice program.  Clients would send small development teams to &lt;span class="caps"&gt;KSC&lt;/span&gt; to work on the clients project with the assistance and mentoring of &lt;span class="caps"&gt;KSC&lt;/span&gt; folks.  Efforts such as these were important seeds for what we now know as the agile movement.&lt;/p&gt;
&lt;p&gt;Ken got a lot of things right about what happened to Smalltalk, although I could add some details and corrections from and &amp;#8220;inside &lt;span class="caps"&gt;IBM&lt;/span&gt;&amp;#8221; perspective, which might be food for future articles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
Finally, I &amp;#8220;organized&amp;#8221; a birds-of-a-feather session covering &amp;#8220;Ruby for Smalltalkers, and Smalltalk for Rubyists&amp;#8221; which was well attended and turned out to be mostly a few old &lt;span class="caps"&gt;IBM&lt;/span&gt; Smalltalkers like me, Fred George, and my &lt;a href="http://www-03.ibm.com/developerworks/blogs/page/pmuellr?entry=ruby_hoedown_day_2"&gt;
&amp;#8220;evil twin&amp;#8221;, Pat Mueller&lt;/a&gt; responding to questions from Rubyists about Smalltalk.
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Testing Workshop&lt;/h2&gt;
Stepping back, on Friday morning, Bruce Tate, &lt;a href="http://www.chadfowler.com/2007/8/12/ruby-hoedowned"&gt;
Chad Fowler&lt;/a&gt;, and 
&lt;a href="http://therailsway.com/"&gt;Marcel Molina jr.&lt;/a&gt; ran a charity workshop on test driven development, with proceeds going to the local food bank.
&lt;p&gt;Although I&amp;#8217;m a pretty committed test-driven developer, I found the session very informative, and got a new appreciation for the use of mocks, not only to allow testing before all the code is written, but to keep tests independent even after the components being mocked exist.&lt;/p&gt;
&lt;h2&gt;Watch this space&lt;/h2&gt;
&lt;p&gt;This article has already gotten long enough, I expect to post more about the events of the past weekend in the near future.&lt;/p&gt;</description>
      <pubDate>Tue, 14 Aug 2007 11:03:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:6eb9e44b-b826-4897-829b-2f7a29cba151</guid>
      <author>Rick DeNatale</author>
      <link>http://talklikeaduck.denhaven2.com/articles/2007/08/14/after-the-hoedown-is-over</link>
      <category>ruby</category>
      <category>war_stories</category>
      <category>smalltalk</category>
      <category>rails</category>
      <category>rubyhoedown</category>
      <category>history</category>
      <trackback:ping>http://talklikeaduck.denhaven2.com/articles/trackback/454</trackback:ping>
    </item>
  </channel>
</rss>
