<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Virtuous Code</title>
	
	<link>http://avdi.org/devblog</link>
	<description>"...the three great virtues of a programmer: laziness, impatience, and hubris." -- Larry Wall</description>
	<lastBuildDate>Mon, 26 Jul 2010 18:42:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/VirtuousCode" /><feedburner:info uri="virtuouscode" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>VirtuousCode</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>RPCFN Solution</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/rtHd5V-ju-c/</link>
		<comments>http://avdi.org/devblog/2010/07/21/rpcfn-solution/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 13:26:24 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=733</guid>
		<description><![CDATA[For the curious, my personal reference solution to my Ruby Challenge is now online. More commentary to come later.]]></description>
			<content:encoded><![CDATA[<p>For the curious, my personal reference solution to <a href="http://rubylearning.com/blog/2010/04/29/rpcfn-interactive-fiction-9/">my Ruby Challenge</a> is now <a href="http://github.com/avdi/rpcfn-interactive-fiction/blob/solution/bin/play.rb">online</a>. More commentary to come later.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/yQj0LHTFLJkaBZsa060bDRNvOuk/0/da"><img src="http://feedads.g.doubleclick.net/~a/yQj0LHTFLJkaBZsa060bDRNvOuk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/yQj0LHTFLJkaBZsa060bDRNvOuk/1/da"><img src="http://feedads.g.doubleclick.net/~a/yQj0LHTFLJkaBZsa060bDRNvOuk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=rtHd5V-ju-c:vH_xxFM9KzA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=rtHd5V-ju-c:vH_xxFM9KzA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=rtHd5V-ju-c:vH_xxFM9KzA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=rtHd5V-ju-c:vH_xxFM9KzA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=rtHd5V-ju-c:vH_xxFM9KzA:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=rtHd5V-ju-c:vH_xxFM9KzA:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=rtHd5V-ju-c:vH_xxFM9KzA:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/rtHd5V-ju-c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/07/21/rpcfn-solution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/07/21/rpcfn-solution/</feedburner:origLink></item>
		<item>
		<title>Greenletters: Painless automation and testing for command-line applications</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/d9Mth8fhyr8/</link>
		<comments>http://avdi.org/devblog/2010/07/19/greenletters-painless-automation-and-testing-for-command-line-applications/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 15:25:46 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=727</guid>
		<description><![CDATA[Did you ever use Expect to automate a complex command-line procedure, like an FTP upload? Expect is handy &#8211; and very powerful &#8211; but for Ruby projects it sure would be nice to be able to automate console apps directly from Ruby. You may not have known it, but Ruby actually ships with a tiny [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-728" title="539px-IBM-3279" src="http://avdi.org/devblog/wp-content/uploads/2010/07/539px-IBM-3279.jpg" alt="539px-IBM-3279" width="539" height="600" /></p>
<p>Did you ever use <a href="http://directory.fsf.org/project/expect/">Expect</a> to automate a complex command-line procedure, like an FTP upload? Expect is handy &#8211; and very powerful &#8211; but for Ruby projects it sure would be nice to be able to automate console apps directly from Ruby.</p>
<p>You may not have known it, but Ruby actually ships with a tiny Expect clone called <a href="http://koders.com/ruby/fid31E61088C10EBB90329CB14D4306D52041F1F54F.aspx?s=expect.rb#L2">expect.rb</a>. Unfortunately it&#8217;s more of a proof of concept than a fully functional automation tool.</p>
<p>Enter <a href="http://github.com/avdi/greenletters">Greenletters</a>. Greenletters begins to bring some of the power of Expect to Ruby, with a simple, straightforward API. For example, here&#8217;s a scripted interaction with the classic <a href="http://en.wikipedia.org/wiki/Colossal_Cave_Adventure">Colossal Cave Adventure</a>:</p>
<pre name="code" class="ruby">
  require 'greenletters'

  adv = Greenletters::Process.new("adventure", :transcript =&gt; $stdout)

  # Install a handler which may be triggered at any time
  adv.on(:output, /welcome to adventure/i) do |process, match_data|
    adv &lt; &lt; "no\n"
  end

  puts "Starting adventure..."
  adv.start!

  # Wait for the specified pattern before proceeding
  adv.wait_for(:output, /you are standing at the end of a road/i)
  adv &lt;&lt; "east\n"
  adv.wait_for(:output, /inside a building/i)
  adv &lt;&lt; "quit\n"
  adv.wait_for(:output, /really want to quit/i)
  adv &lt;&lt; "yes\n"
  adv.wait_for(:exit)
  puts "Adventure has exited."
</pre>
<p>Greenletters also ships with some simple Cucumber steps, so you can immediately start using it to specify the behavior of your command-line apps:</p>
<pre class="plain" name="code">    Given process activity is logged to "greenletters.log"
    Given a process "adventure" from command "adventure"
    Given I reply "no" to output "Would you like instructions?" from process "adventure"
    Given I reply "yes" to output "Do you really want to quit" from process "adventure"
    When I execute the process "adventure"
    Then I should see the following output from process "adventure":
    """
    You are standing at the end of a road before a small brick building.
    Around you is a forest.  A small stream flows out of the building and
    down a gully.
    """
    When I enter "east" into process "adventure"
    Then I should see the following output from process "adventure":
    """
    You are inside a building, a well house for a large spring.
    """</pre>
<p>Want to give it a try? Then:</p>
<pre>gem install greenletters</pre>
<p>And check out the examples/ directory for inspiration. Let me know what you think!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/yspEo1YdhuWlDNO-L-8Q94bt3y4/0/da"><img src="http://feedads.g.doubleclick.net/~a/yspEo1YdhuWlDNO-L-8Q94bt3y4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/yspEo1YdhuWlDNO-L-8Q94bt3y4/1/da"><img src="http://feedads.g.doubleclick.net/~a/yspEo1YdhuWlDNO-L-8Q94bt3y4/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=d9Mth8fhyr8:J9-sF9qE9rg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=d9Mth8fhyr8:J9-sF9qE9rg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=d9Mth8fhyr8:J9-sF9qE9rg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=d9Mth8fhyr8:J9-sF9qE9rg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=d9Mth8fhyr8:J9-sF9qE9rg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=d9Mth8fhyr8:J9-sF9qE9rg:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=d9Mth8fhyr8:J9-sF9qE9rg:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/d9Mth8fhyr8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/07/19/greenletters-painless-automation-and-testing-for-command-line-applications/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/07/19/greenletters-painless-automation-and-testing-for-command-line-applications/</feedburner:origLink></item>
		<item>
		<title>Announcing Firetower – A command-line interface to Campfire</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/w-gvB8acS9Y/</link>
		<comments>http://avdi.org/devblog/2010/07/11/announcing-firetower-a-command-line-interface-to-campfire/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 04:25:14 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[campfire]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=713</guid>
		<description><![CDATA[OK, this is pretty early stuff but it&#8217;s already usable and I think it has a lot of potential. Firetower is a command-line interface to Campfire. It&#8217;s currently for Linux systems only, but there&#8217;s no reason it can&#8217;t be extended to work on OS X as well. I created it because I needed a command-line [...]]]></description>
			<content:encoded><![CDATA[<p>OK, this is pretty early stuff but it&#8217;s already usable and I think it has a lot of potential.</p>
<p style="text-align: left;"><a href="http://en.wikipedia.org/wiki/Firetower"><img class="size-full wp-image-714 aligncenter" title="BaldMountainLookout" src="http://avdi.org/devblog/wp-content/uploads/2010/07/BaldMountainLookout.jpg" alt="BaldMountainLookout" width="364" height="400" /></a><a href="http://github.com/avdi/firetower">Firetower is a command-line interface to Campfire</a>. It&#8217;s currently for Linux systems only, but there&#8217;s no reason it can&#8217;t be extended to work on OS X as well.</p>
<p>I created it because I needed a command-line interface to Campfire that supported the current <a href="http://developer.37signals.com/campfire/streaming">streaming Campfire API</a>. I also wanted a bit more flexibility than existing tools provided.</p>
<p>You can read all the details <a href="http://github.com/avdi/firetower">at the Github page</a>, but in a nutshell Firetower provides two services:</p>
<ol>
<li>A way to post messages and code snippets to Campfire from the command line; and</li>
<li>A daemon which will monitor any number of campfire rooms (in any number of accounts) and take user-configurable action when events (such as new messages) occur.</li>
</ol>
<p>The latter service is particularly flexible: it can be used to do anything from playing a sound when someone says something in a Campfire room, to implementing IRC-style bots which monitor rooms for keywords and respond accordingly.</p>
<p>For instance, here&#8217;s a simple (and HIGHLY UNSAFE!) Ruby eval-bot which you could drop into ~/.firetower/firetower.conf:</p>
<pre class="ruby">receive do |session, event|
  if event['type'] == 'TextMessage' &#038;&#038; event['body'] =~ /^!eval (.*)$/
    event.room.account.paste!(event.room.name, "Eval result:\n" + eval($1).to_s)
  end
end</pre>
<p>Which is triggered when anyone in the room prefaces a message with &#8220;!eval&#8221;:</p>
<p><img class="aligncenter size-full wp-image-723" title="campfire_eval2" src="http://avdi.org/devblog/wp-content/uploads/2010/07/campfire_eval2.png" alt="campfire_eval2" width="221" height="118" /></p>
<p>Patches, suggestions, and bug reports welcome!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/JMBdQqdeEiOgkutHDIBY3CoqojE/0/da"><img src="http://feedads.g.doubleclick.net/~a/JMBdQqdeEiOgkutHDIBY3CoqojE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/JMBdQqdeEiOgkutHDIBY3CoqojE/1/da"><img src="http://feedads.g.doubleclick.net/~a/JMBdQqdeEiOgkutHDIBY3CoqojE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w-gvB8acS9Y:XpDkp5KmITU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w-gvB8acS9Y:XpDkp5KmITU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=w-gvB8acS9Y:XpDkp5KmITU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w-gvB8acS9Y:XpDkp5KmITU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=w-gvB8acS9Y:XpDkp5KmITU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w-gvB8acS9Y:XpDkp5KmITU:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=w-gvB8acS9Y:XpDkp5KmITU:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/w-gvB8acS9Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/07/11/announcing-firetower-a-command-line-interface-to-campfire/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/07/11/announcing-firetower-a-command-line-interface-to-campfire/</feedburner:origLink></item>
		<item>
		<title>Rack-Test and Capybara are uneasy bedfellows</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/FFhGoStTMaE/</link>
		<comments>http://avdi.org/devblog/2010/06/18/rack-test-and-capybara-are-uneasy-bedfellows/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 20:27:29 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[capybara]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[rack-test]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails3]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=700</guid>
		<description><![CDATA[I&#8217;m using Capybara on a new project because apparently it&#8217;s the new hotness. Today I found out that all is not peaceful in the Cucumber/Capybara/Rack-Test stack. There is a cold war going on, and both Capy and Rack-test are jealously guarding their own cookie jars. Why does this matter? Well, say you use post '/some_callback', [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m using Capybara on a new project because apparently it&#8217;s the new hotness. Today I found out that all is not peaceful in the Cucumber/Capybara/Rack-Test stack. There is a cold war going on, and both Capy and Rack-test are jealously guarding their own cookie jars.</p>
<p>Why does this matter? Well, say you use <code>post '/some_callback', :some => "data"</code> in your tests to simulate a callback from an external service like <a href="http://www.janrain.com/products/engage">Janrain</a>. Then you use  <code>visit '/'</code> to simulate the user loading a page after the callback.</p>
<p><em>Any</em> cookies set during the <code>post</code> will be ignored by the visit call, because like I said earlier, Capy and Rack-Test don&#8217;t share cookies. So if that callback action set up a user session, that session is now lost from the point of view of Capybara (and all the Cucumber steps that use Capybara).</p>
<p>Putting this out there in case anyone else runs into it and is as befuddled as I was.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/Tcdg3PeLQPCoD5CQwWkTQnnuD4A/0/da"><img src="http://feedads.g.doubleclick.net/~a/Tcdg3PeLQPCoD5CQwWkTQnnuD4A/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Tcdg3PeLQPCoD5CQwWkTQnnuD4A/1/da"><img src="http://feedads.g.doubleclick.net/~a/Tcdg3PeLQPCoD5CQwWkTQnnuD4A/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=FFhGoStTMaE:0NCFd6teuMQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=FFhGoStTMaE:0NCFd6teuMQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=FFhGoStTMaE:0NCFd6teuMQ:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=FFhGoStTMaE:0NCFd6teuMQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=FFhGoStTMaE:0NCFd6teuMQ:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=FFhGoStTMaE:0NCFd6teuMQ:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=FFhGoStTMaE:0NCFd6teuMQ:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/FFhGoStTMaE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/06/18/rack-test-and-capybara-are-uneasy-bedfellows/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/06/18/rack-test-and-capybara-are-uneasy-bedfellows/</feedburner:origLink></item>
		<item>
		<title>Rails 3 resource routes with dots; or, how to make a Ruby developer go a little bit insane</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/8DMZOynmZno/</link>
		<comments>http://avdi.org/devblog/2010/06/18/rails-3-resource-routes-with-dots-or-how-to-make-a-ruby-developer-go-a-little-bit-insane/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 08:58:35 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dot]]></category>
		<category><![CDATA[period]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rails3]]></category>
		<category><![CDATA[routes]]></category>
		<category><![CDATA[routing]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=697</guid>
		<description><![CDATA[This one cost me at least an hour of frustration. So apparently the Rails router has considered the dot (&#8220;.&#8221;) to be a &#8220;separator&#8221; character along with the slash (&#8220;/&#8221;) since version 1.2. I don&#8217;t know in what context this ever seemed like a good idea, but whatever. It&#8217;s not the sort of thing that&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>This one cost me at least an hour of frustration.</p>
<p>So apparently the Rails router has considered the dot (&#8220;.&#8221;) to be a &#8220;separator&#8221; character along with the slash (&#8220;/&#8221;) since version 1.2. I don&#8217;t know in what context this ever seemed like a good idea, but whatever. It&#8217;s not the sort of thing that&#8217;s going to bite you every day, but when it does it will be in very weird ways. To wit:</p>
<p>First, a simple routes.rb.</p>
<pre name="code" class="ruby">
  resources :users do
    resources :projects
  end
</pre>
<p>Fill in some typical values, and you get a path:</p>
<pre name="code">
irb(main):009:0> app.user_projects_path("avdi")
=> "/users/avdi/projects"
</pre>
<p>Now fill in a value with a period in it, and watch it explode:</p>
<pre name="code">
irb(main):010:0> app.user_projects_path("avdi.grimm")
ActionController::RoutingError: No route matches {
  :user_id=>"avdi.grimm", :action=>"create", :controller=>"projects"
}
</pre>
<p><code>:action => "create"</code>? What?!! Who said anything about <strong>create</strong>?!</p>
<p>As it turns out, there is an invocation in your routes file which will fix this:</p>
<pre name="code" class="ruby">
  resources :users, :constraints => { :id => /.*/ } do
    resources :projects
  end
</pre>
<pre name="code">
irb(main):013:0> app.user_projects_path("avdi.grimm")
=> "/users/avdi.grimm/projects"
</pre>
<p>Now I know what you&#8217;re thinking. &#8220;That&#8217;s so obvious, why didn&#8217;t he think of that immediately?&#8221; What can I say, some days I&#8217;m slow.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/hHlNvNgDrmTteLs4lltPSYb5nQk/0/da"><img src="http://feedads.g.doubleclick.net/~a/hHlNvNgDrmTteLs4lltPSYb5nQk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/hHlNvNgDrmTteLs4lltPSYb5nQk/1/da"><img src="http://feedads.g.doubleclick.net/~a/hHlNvNgDrmTteLs4lltPSYb5nQk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=8DMZOynmZno:I3TRp8ua24I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=8DMZOynmZno:I3TRp8ua24I:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=8DMZOynmZno:I3TRp8ua24I:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=8DMZOynmZno:I3TRp8ua24I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=8DMZOynmZno:I3TRp8ua24I:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=8DMZOynmZno:I3TRp8ua24I:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=8DMZOynmZno:I3TRp8ua24I:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/8DMZOynmZno" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/06/18/rails-3-resource-routes-with-dots-or-how-to-make-a-ruby-developer-go-a-little-bit-insane/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/06/18/rails-3-resource-routes-with-dots-or-how-to-make-a-ruby-developer-go-a-little-bit-insane/</feedburner:origLink></item>
		<item>
		<title>Open for business!</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/jt9jIeXmZr0/</link>
		<comments>http://avdi.org/devblog/2010/06/11/open-for-business/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 22:16:00 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[consulting]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=687</guid>
		<description><![CDATA[I am pleased to announce that ShipRise LLC, my consulting company, is now accepting work effective immediately. I am available for services including: Ruby on Rails Application Development. I&#8217;ve been writing Ruby code for almost ten years, and Rails applications since 2007. Whether it&#8217;s a building a green-field app or evolving an existing application, I [...]]]></description>
			<content:encoded><![CDATA[<p>I am pleased to announce that <a href="http://shiprise.net">ShipRise LLC</a>, my consulting company, is now accepting work effective immediately. I am available for services including:</p>
<ul>
<li><strong>Ruby on Rails Application Development</strong>. I&#8217;ve been writing Ruby code for almost ten years, and Rails applications since 2007. Whether it&#8217;s a building a green-field app or evolving an existing application, I can add value quickly, pragmatically, and sustainably.</li>
<li><strong>Hard Problems. </strong>Do you have a problem that goes beyond the typical web application stack? Need to build a distributed service, or interface with legacy systems? <a href="mailto:avdi@shiprise.net">Talk to me</a>. I have experience with everything from resource-constrained embedded systems, to high performance IP networking middleware, to cloud-based distributed processing and more.</li>
<li><strong>Dispersed team facilitation.</strong> I&#8217;ve been managing and working with widely distributed teams for years. And I&#8217;ve talked with numerous distributed teams about how they do remote work effectively. If you have a distributed team or are thinking of creating one, I can help you make it work.</li>
</ul>
<p>If you&#8217;ve ever benefited from my writing, Open Source work, or talks I&#8217;d really appreciate it if you&#8217;d help me out by by telling your friends, retweeting this post, etc. Thanks!</p>
<p>UPDATE: For anyone who is wondering, yes, I am still working with <a href="http://wearetitans.net">We Are Titans</a> as well.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/fvxVJoQsZsbsur2kJb3zRI4mrb8/0/da"><img src="http://feedads.g.doubleclick.net/~a/fvxVJoQsZsbsur2kJb3zRI4mrb8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/fvxVJoQsZsbsur2kJb3zRI4mrb8/1/da"><img src="http://feedads.g.doubleclick.net/~a/fvxVJoQsZsbsur2kJb3zRI4mrb8/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=jt9jIeXmZr0:BOFuQFxFqxM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=jt9jIeXmZr0:BOFuQFxFqxM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=jt9jIeXmZr0:BOFuQFxFqxM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=jt9jIeXmZr0:BOFuQFxFqxM:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=jt9jIeXmZr0:BOFuQFxFqxM:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=jt9jIeXmZr0:BOFuQFxFqxM:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=jt9jIeXmZr0:BOFuQFxFqxM:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/jt9jIeXmZr0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/06/11/open-for-business/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/06/11/open-for-business/</feedburner:origLink></item>
		<item>
		<title>Announcing Wide Teams</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/CUWSYp8psso/</link>
		<comments>http://avdi.org/devblog/2010/06/07/announcing-wide-teams/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 06:42:22 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[railsconf]]></category>
		<category><![CDATA[wideteams]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=683</guid>
		<description><![CDATA[Just in time for RailsConf 2010, I&#8217;m very pleased to introduce my new project: Wide Teams &#8211; the blog for geographically dispersed organizations. This site has been a dream of mine for a long time. I&#8217;ve worked with geographically distributed teams for a few years now, and this what I&#8217;ve observed: more and more software [...]]]></description>
			<content:encoded><![CDATA[<p>Just in time for <a href="http://en.oreilly.com/rails2010">RailsConf 2010</a>, I&#8217;m very pleased to introduce my new project: <a href="http://wideteams.com/">Wide Teams &#8211; the blog for geographically dispersed organizations</a>.</p>
<p>This site has been a dream of mine for a long time. I&#8217;ve worked with geographically distributed teams for a few years now, and this what I&#8217;ve observed: more and more software companies are embracing remote work, but there is no dedicated space for sharing stories, best practices, and lessons learned. Wide teams is an effort to fill this gap. I&#8217;ll be sharing what I&#8217;ve learned, but more importantly I&#8217;ll be gathering and sharing the experiences of other remote workers and leaders of distributed teams.</p>
<p>To kick off the knowledge sharing, I&#8217;ll be wandering the halls of RailsConf all week, microphone in hand and silly hat on my head, collecting stories from anyone who will talk to me. I&#8217;ll be looking for any and all experiences with remote work &#8211; successes, failures, and everything in between. These interviews will be published over the coming months in the form of a podcast.</p>
<p>If you are interested in the world of dispersed teams, I hope you&#8217;ll <a href="http://wideteams.com">visit the blog</a>, subscribe to the <a href="http://feeds.feedburner.com/WideTeams">RSS feed</a>, and follow the <a href="http://twitter.com/wideteams">@wideteams</a> account on Twitter. And if you&#8217;re at RailsConf and see me, please do introduce yourself!</p>

<p><a href="http://feedads.g.doubleclick.net/~a/vOSYh95mOYR70ky9jjenZpIhj2s/0/da"><img src="http://feedads.g.doubleclick.net/~a/vOSYh95mOYR70ky9jjenZpIhj2s/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/vOSYh95mOYR70ky9jjenZpIhj2s/1/da"><img src="http://feedads.g.doubleclick.net/~a/vOSYh95mOYR70ky9jjenZpIhj2s/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=CUWSYp8psso:BRFN403haEE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=CUWSYp8psso:BRFN403haEE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=CUWSYp8psso:BRFN403haEE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=CUWSYp8psso:BRFN403haEE:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=CUWSYp8psso:BRFN403haEE:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=CUWSYp8psso:BRFN403haEE:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=CUWSYp8psso:BRFN403haEE:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/CUWSYp8psso" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/06/07/announcing-wide-teams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/06/07/announcing-wide-teams/</feedburner:origLink></item>
		<item>
		<title>YAGNI: Answers to some common objections to dropping out</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/9bMbQ6o8pc8/</link>
		<comments>http://avdi.org/devblog/2010/05/27/yagni-answers-to-some-common-objections-to-dropping-out/#comments</comments>
		<pubDate>Fri, 28 May 2010 05:31:14 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[education]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=663</guid>
		<description><![CDATA[As a follow-up to this post, here are some common objections to the argument that a young software developer is better off dropping out. (For the uninitiated, YAGNI is short for You Aren&#8217;t Gonna Need It. It is one of the core principles of the eXtreme Programming methodology) First, some numbers: $28,080 (or the price [...]]]></description>
			<content:encoded><![CDATA[<p>As a follow-up to <a href="http://avdi.org/devblog/2010/05/24/turn-on-tune-in-drop-out/">this post</a>, here are some common objections to the argument that a young software developer is better off dropping out. (For the uninitiated, <a href="http://c2.com/xp/YouArentGonnaNeedIt.html">YAGNI</a> is short for You Aren&#8217;t Gonna Need It. It is one of the core principles of the eXtreme Programming methodology)</p>
<p>First, some numbers: <strong>$28,080</strong> (or the price of a brand-new top-of-the-line <a href="http://www.toyota.com/prius-hybrid/trims-prices.html#/?view=showroom&amp;vehicle=3">Prius</a>) is the average four-year tuition at a state school as of 2010. <strong>$105,092</strong> (or the price of owning a starter home free and clear) is the average cost of tuition at a private university. Let&#8217;s split the difference and say <strong>$67,000</strong> is the monetary cost of a four-year degree.</p>
<p>EDIT: One commenter objects to the use of the median number $67,700 in this article. If you have the same problem, I invite you to replace every instance of &#8220;<strong>$67,000&#8243;</strong> with either of the numbers cited above, or simply with the phrase <strong>&#8220;a metric fuckload of moolah&#8221;</strong>. My arguments stand regardless of which figure you use.<br />
Now, on to the objections.</p>
<blockquote><p>Most people won&#8217;t get the educational equivalent of four years of concentrated focus on algorithms, OO design, performance analysis, compiler design, etc. while on the job.</p></blockquote>
<p>There are a few fallacies going into this argument.</p>
<p>First, I&#8217;ve spoken to dozens of developers about their college educations, and the <em>universal</em> consensus has been that once in the working world, they only used a fraction of what they learned in college &#8211; and then needed to learn many more things that <em>hadn&#8217;t</em> been on the curriculum. Let&#8217;s be charitable and say that you&#8217;ll use 10% of what you learned in school on the job. 10% of four years, that&#8217;s, let&#8217;s see, 21 weeks worth of schooling.</p>
<p>So what we&#8217;re really asking is whether it&#8217;s possible to get the equivalent of <strong>five months</strong> of higher education on the job. It starts to seem a little more reasonable, doesn&#8217;t it?</p>
<p>Second is a fallacy that I run into constantly in education discussions. It&#8217;s the idea that the time it takes to learn a new skill is constant, regardless of context. It&#8217;s exemplified by the argument &#8220;that took me six months to learn when I was in school, so if you haven&#8217;t spent six months on it, you haven&#8217;t really learned it&#8221;.</p>
<p>But this simply isn&#8217;t true. Graduates can (and do) come out of school with a still-hazy understanding of how Object-Oriented design applies to real-world problems. But give them three months with a team of more experienced developers writing software to manage a nationwide logistics system, and they&#8217;ll know the subject backwards and forwards. You can learn more in a week of watching an expert engineer dissect and address a problem than you can in a whole semester of lecture and canned exercises.</p>
<p>Finally, the implication with this objection is that while it may be <em>possible</em> to get educated on the job, most developers simply won&#8217;t avail themselves of the opportunity and will remain at a disorganized code-monkey state of ability.</p>
<p>My answer to this is simple: such developers probably wouldn&#8217;t have integrated more knowledge if they <em>had</em> finished a four-year program, and they don&#8217;t belong on my team or any team that wants to ship quality software. Period.</p>
<p>Ask any senior developer what they look for in a job candidate, and I guarantee that one of their top three attributes will be &#8220;a fast learner&#8221;. The nature of this industry is that if you want to stay on the cutting edge<strong>, you have to effectively re-learn everything you know every five years</strong>. If you can&#8217;t or won&#8217;t learn the ropes on your own initiative, chances are you&#8217;re not going to keep up when the game changes in five years. Better to get out of the game now.</p>
<blockquote><p>Maybe you can learn most skills on the job, but what about the fundamentals of computing? A great professor can give you a solid foundation that you might miss in haphazard just-in-time learning.</p></blockquote>
<p>The one course that I&#8217;ve seen consistently remembered as a important or even life-changing by CS grads is the introductory course based on <a href="http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&amp;tid=3305">Structure and Interpretation of Computer Programs</a>, aka the Wizard Book. As it happens, both <a href="http://mitpress.mit.edu/sicp/">the book</a> and <a href="http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/">video of the lectures</a> by the authors are available online for free, along with much of MIT&#8217;s <a href="http://ocw.mit.edu/OcwWeb/web/home/home/index.htm">other courseware</a>. Problem solved.</p>
<p>Which reminds me, I really need to pick up watching those videos again&#8230;</p>
<blockquote><p>Even if it doesn&#8217;t do much for your career, college is a unique experience which grows your perspectives and knowledge of yourself.</p></blockquote>
<p>There are any number of things you could choose to do upon graduating high school. Here are a few ideas:</p>
<ul>
<li>Join the Peace Corp, and do humanitarian work overseas.</li>
<li>Hitchhike around the country, couch-surfing and busking on street corners with a guitar and a harmonica.</li>
<li>Take a job on a farm. Sling hay bales, deliver calves, and go line-dancing on the weekends.</li>
<li>Backpack across Europe.</li>
<li>Go to college.</li>
</ul>
<p>Any of these choices will expand your horizons, introduce you to new people, and teach you more about yourself. Only one of them will cost you <strong>$67,000</strong>.</p>
<p>The notion that college is a way to broaden your perspective early in life is absolutely true. The idea that it&#8217;s the <em>only</em> way is silly. It&#8217;s certainly not the cheapest way.</p>
<blockquote><p>College is an important social experience.</p></blockquote>
<p>We&#8217;re a little off-track now, since the question at hand is whether college is a worthwhile preparation for a programming career, not whether it will get you laid. But it&#8217;s true that this is my biggest regret in not going to a four-year school. I&#8217;m frankly envious of the college social experiences a lot of my peers had while I was working.</p>
<p>But if you&#8217;re making this argument, it behooves you to at least be honest about it: you&#8217;re telling a student to spend $67,000 over four years in order to socialize. Is it worth it?</p>
<h3>Conclusion</h3>
<p>What I hope you take away from these articles is that the decision to go to college, like any other major life decision, should be subject to a cost/benefit analysis. I&#8217;ve done the math for my particular industry, and found the argument for getting a degree wanting. On the benefit side you have a marginal amount of work preparedness, all of which could be gathered in other ways; and an increasingly irrelevant piece of paper. On the cost side you have tens of thousands either in out-of-pocket cost or student loan debt, plus four years time, salary, networking, and vital hands-on experience lost. It just doesn&#8217;t add up.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/z1sx7o7HJzHuwutyzxP3WXW1tfA/0/da"><img src="http://feedads.g.doubleclick.net/~a/z1sx7o7HJzHuwutyzxP3WXW1tfA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/z1sx7o7HJzHuwutyzxP3WXW1tfA/1/da"><img src="http://feedads.g.doubleclick.net/~a/z1sx7o7HJzHuwutyzxP3WXW1tfA/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9bMbQ6o8pc8:epDwxf7CcWg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9bMbQ6o8pc8:epDwxf7CcWg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=9bMbQ6o8pc8:epDwxf7CcWg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9bMbQ6o8pc8:epDwxf7CcWg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=9bMbQ6o8pc8:epDwxf7CcWg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9bMbQ6o8pc8:epDwxf7CcWg:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=9bMbQ6o8pc8:epDwxf7CcWg:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/9bMbQ6o8pc8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/05/27/yagni-answers-to-some-common-objections-to-dropping-out/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/05/27/yagni-answers-to-some-common-objections-to-dropping-out/</feedburner:origLink></item>
		<item>
		<title>Turn on, tune in, drop out</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/HygxS1tdpWo/</link>
		<comments>http://avdi.org/devblog/2010/05/24/turn-on-tune-in-drop-out/#comments</comments>
		<pubDate>Mon, 24 May 2010 13:24:32 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[education]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=632</guid>
		<description><![CDATA[Seth Godin: Why do colleges send millions (!) of undifferentiated pieces of junk mail to high school students [...]? Biggest reason: So the schools can reject more applicants. The more applicants they reject, the higher they rank in US News and other rankings. [...] Why bother making your education more useful if you can more [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-633" title="Turn On Tune In Drop Out" src="http://avdi.org/devblog/wp-content/uploads/2010/05/leary_cover.gif" alt="Turn On Tune In Drop Out" width="574" height="527" /></p>
<p><a href="http://sethgodin.typepad.com/seths_blog/2010/04/the-coming-meltdown-in-higher-education-as-seen-by-a-marketer.html">Seth Godin</a>:</p>
<blockquote>
<p style="margin-top: 10px; margin-bottom: 10px; text-align: left;">Why do colleges send millions (!) of undifferentiated pieces of junk mail to high school students [...]? Biggest reason: So the schools can reject more applicants. The more applicants they reject, the higher they rank in US News and other rankings. [...] Why bother making your education more useful if you can more easily make it <strong>appear</strong>to be more useful?[...] a degree (from one of those famous schools, with or without a football team) doesn&#8217;t translate into significantly better career opportunities, a better job or more happiness than a degree from a cheaper institution.[...] A lot of these ills are the result of uniform accreditation programs that have pushed high-cost, low-reward policies on institutions and rewarded schools that churn out young wanna-be professors instead of experiences that turn out leaders and problem-solvers.</p>
<p style="margin-top: 10px; margin-bottom: 10px; text-align: left;">[...]there are tons of ways to get a cheap, liberal education, one that exposes you to the world, permits you to have significant interactions with people who matter and to learn to make a difference (start <a style="text-decoration: underline; color: #cc6600;" href="http://www.amazon.com/DIY-Edupunks-Edupreneurs-Transformation-Education/dp/1603582347/permissionmarket">here</a>). Most of these ways, though, aren&#8217;t heavily marketed nor do they involve going to a tradition-steeped two-hundred-year old institution with a wrestling team.</p>
</blockquote>
<p style="margin-top: 10px; margin-bottom: 10px; text-align: left;"><a href="http://reason.com/archives/2010/05/20/whats-a-diploma-worth">Tim Cavanaugh</a>:</p>
<blockquote>
<p style="margin-top: 10px; margin-bottom: 10px; text-align: left;">Student borrowing has more than doubled since the end of the 20th century, according to the College Board, with $85 billion in loans in 2008, up from $41 billion in 1998. And as the rising rate of defaults indicates, borrowers in aggregate are not making the kind of mone&#8211;i.e. twice as much as a decade ago&#8211;they would need to pay those loans back [....] we have too much money going into an asset, not enough value coming out, a massive increase in leverage, and a large taxpayer liability for the difference. [...]The traditional university of ivied walls, lecture halls, and full-dress balls is heading for a crisis. [...] If diplomas are going to continue costing more and losing value, then at least the customers should have more choice when shopping around for them.</p>
</blockquote>
<p><a href="http://gilesbowkett.blogspot.com/2010/05/college-is-bullshit-i-am-future.html">Giles Bowkett</a>:</p>
<blockquote><p>Wages have not risen since the 1970s for workers with college degrees. Wages have <em>diminished</em> since the 70s for workers without college degrees. However, in that same period of time, CEO pay has gone from 40 times worker pay to 500 times worker pay. What&#8217;s happening here is class distinctions growing tremendously, and in a society where class distinctions matter a great deal, the <em>perceived</em> value of a college degree skyrockets, even as the economic advantage that it used to give you deteriorates into nothing. In a society where social class and family background can profoundly distort economic achievement, a mark of prestige like a college degree goes way up in price, because without it, you&#8217;re just a member of the working class. (Oh noez!) Colleges are selling liferafts on a sinking ship, and that gives them a license to print money.</p></blockquote>
<p><a href="http://davetroy.com/posts/will-that-be-on-the-test">Dave Troy</a>:</p>
<blockquote>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">The unrelenting message is, &#8220;If you don&#8217;t go to college, you won&#8217;t be successful.&#8221; [...]</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">There&#8217;s no doubt that everyone is different; not everyone is suited for the same kind of work &#8212; thankfully. But western society has perverted that simple beautiful fact &#8212; and the questions it prompts about college education &#8212; into &#8220;<strong><a style="padding-top: 1px; padding-right: 0px; padding-bottom: 1px; padding-left: 0px; color: #d2382c; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-color: #a2b09d; margin: 0px;" href="http://www.nytimes.com/2010/05/16/weekinreview/16steinberg.html">Not everyone is cut out for college</a>,&#8221;</strong> as though college was the pinnacle of achievement, and everybody else has to work on Diesel engines or be a blacksmith. <em>Because mechanics and artists are valuable too.</em></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">That line of thinking is the most cynical, evil load of horse-shit to ever fall out of our educational system. <strong>Real-life learning is not linear.</strong> It can be <strong>cyclical</strong> and <strong>progressive</strong> and it takes side-trips, U-turns, mistakes, and apprenticeships to experience everything our humanity offers us.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">The notion that a college education is a safety net that people must have in order to avoid a life of destitution, that &#8220;it makes it more likely that you will always have a job&#8221; is also utterly cynical, and uses fear to scare people into not relying on themselves. <strong>Young people should be confident and self-reliant</strong>, not told that they will fail.</p>
</blockquote>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">I have a an admitted bias in this discussion. My only higher education experience was a few part-time semesters of community college. I started writing software full-time at age 18, when most of my peers were entering college.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">For years I felt guilty about that. Everyone advised me to get back into school at my earliest opportunity. My bosses freely admitted that while I was working above my grade, they were unable to promote me because I didn&#8217;t have a degree. At one point I even enrolled in a continuing education school, and almost immediately got a massive pay raise on the mere <em>prospect</em> that I was going to go &#8220;legitimate&#8221; and get the piece of paper stating that I knew how to do the job I&#8217;d been performing for years. Meanwhile, I learned more about the practice of software development from <a href="http://www.amazon.com/gp/product/1556154844?ie=UTF8&amp;tag=thlafa-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1556154844">books</a><img style="border:none !important; margin:0px !important;" src="http://www.assoc-amazon.com/e/ir?t=thlafa-20&amp;l=as2&amp;o=1&amp;a=1556154844" border="0" alt="" width="1" height="1" />, <a href="http://c2.com/cgi/wiki">free online resource</a>s, and hands-on experience than the college fresh-outs had learned in four years of school.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">All this time my advice to aspiring developers was still to ignore my example and finish school.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">Then one day I took a good long look at my career and realized that while I had an immense amount of respect for the people who were telling me to get my degree, I didn&#8217;t envy their <em>careers</em> in the slightest. I realized that the one thing a degree would buy me was a management-track career in the sort of organization that discriminates against employees because of a piece of paper. I also noticed that the kids who were going to school were coming out saddled with student loans that they would spend the next couple decades repaying. With the economy going down the tubes as a result of a credit crisis, this started to seem like less and less of an auspicious way to start out a career.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">I realized, too, that my time was limited, and that any after-hours time I spent in classes and on homework was time I wasn&#8217;t going to be spending attending users groups, writing Open Source software, and networking. And that it was those latter activities that were measurably more likely to move my career forward in the direction I wanted it to take.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">I dropped all pretense of &#8220;going back to school someday&#8221;. Instead I focused on contributing the software community, building my network of contacts, and becoming the best at my craft. The results of this strategy speak for themselves: for the past several years I have enjoyed steadily increasing job satisfaction, <a href="http://wearetitans.net/">worked with amazing people</a>, enjoyed community recognition, and realized my dreams of working from home, surrounded by my family.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">Today my advice to a young developer who is passionate about building great software is to <strong>drop out</strong>. Spend your time learning by doing, attending your local users groups, participating in mailing lists, contributing patches to Open Source software. Don&#8217;t <em>learn</em> to write software and work in teams; <em>write software, and build teams. </em>The paid work will come to you.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">Of course, this only applies if you want a career like mine. If you want to do pure CS research, stay in school. If you want to work for a larger, older organization (including Google), get that degree. And if you&#8217;re only in a CS program because you heard there&#8217;s good money in software, well, frankly you should get the hell out of this industry and find something you genuinely enjoy. There are plenty of software wage-slaves in the developing world who would be happy to do a mediocre job at a fraction of the salary you&#8217;re expecting to earn.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">Of course, YMMV. Results are not guaranteed. Consult your doctor, therapist, or priest to determine if this path is right for you. Just remember that your elders are coming from a time when having a degree was actually correlated with having a better life.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">On the larger question of how to improve the education situation, I agree with Dave Troy and Seth Godin that we need new models of education, not simply reform of colleges. Toward that end, signs point to apprenticeship as the most promising model to build on. I&#8217;ve been hearing of more and more forward-thinking software companies embracing apprenticeship, and I think it&#8217;s a move in the right direction.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">I don&#8217;t know how applicable my path or the apprenticeship model is to fields outside of software development. Giles Bowkett is right that the accredited college system isn&#8217;t just going to fade away into irrelevance. But in true Internet fashion, I look forward to seeing alternative approaches route around the establishment entirely.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">UPDATE: John Trupiano points me to <a href="http://www.codeanthem.com/blog/2010/05/what-is-a-ms-in-computer-science-worth/">a related post</a> about the sense of entitlement that often comes along with a CS degree. I think what we&#8217;re seeing here is a generational clash: the old rules about greater education automatically conferring an elevated position simply don&#8217;t apply to this industry. Unfortunately, like light from a dead star the messages young developers get are still coming from that old, vanished world. One of my motivations in writing this article is that I&#8217;ve noticed while most people in the industry recognize this shift, few will come right out and tell aspiring programmers that they&#8217;d be better off dropping out.</p>
<blockquote>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.5385em; margin-left: 0px; padding: 0px;">
</blockquote>
<p><br/><script type="text/javascript"><!--
google_ad_client = "pub-6820402738462489";
/* InlinePost */
google_ad_slot = "0165803319";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>

<p><a href="http://feedads.g.doubleclick.net/~a/lo-0WrNLgdNb1-jESgFx98FGPlc/0/da"><img src="http://feedads.g.doubleclick.net/~a/lo-0WrNLgdNb1-jESgFx98FGPlc/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/lo-0WrNLgdNb1-jESgFx98FGPlc/1/da"><img src="http://feedads.g.doubleclick.net/~a/lo-0WrNLgdNb1-jESgFx98FGPlc/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=HygxS1tdpWo:iW8ZK5XJHwU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=HygxS1tdpWo:iW8ZK5XJHwU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=HygxS1tdpWo:iW8ZK5XJHwU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=HygxS1tdpWo:iW8ZK5XJHwU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=HygxS1tdpWo:iW8ZK5XJHwU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=HygxS1tdpWo:iW8ZK5XJHwU:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=HygxS1tdpWo:iW8ZK5XJHwU:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/HygxS1tdpWo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/05/24/turn-on-tune-in-drop-out/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/05/24/turn-on-tune-in-drop-out/</feedburner:origLink></item>
		<item>
		<title>Ruby Tempfiles in Depth</title>
		<link>http://feedproxy.google.com/~r/VirtuousCode/~3/qBaJzoH9a1Q/</link>
		<comments>http://avdi.org/devblog/2010/05/20/ruby-tempfiles-in-depth/#comments</comments>
		<pubDate>Thu, 20 May 2010 13:47:00 +0000</pubDate>
		<dc:creator>avdi</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://avdi.org/devblog/?p=629</guid>
		<description><![CDATA[I have an article about using temp files in Ruby up at the brand spanking new We Are Titans website. I cover some features of the Tempfile class that you may not know about. In other news, there is still time to submit an entry to my Ruby Challenge! You know you&#8217;ve always wanted to [...]]]></description>
			<content:encoded><![CDATA[<p>I have <a href="http://wearetitans.net/blog/2010/05/18/ruby-temp-files-in-depth/">an article about using temp files in Ruby</a> up at the brand spanking new We Are Titans website. I cover some features of the <code>Tempfile</code> class that you may not know about.</p>
<p>In other news, there is still time to submit an entry to <a href="http://rubylearning.com/blog/2010/04/29/rpcfn-interactive-fiction-9/">my Ruby Challenge</a>! You know you&#8217;ve always wanted to implement your very own Interactive Fiction engine, and now&#8217;s your chance! All the instructions are <a href="http://github.com/avdi/rpcfn-interactive-fiction">on Github</a>.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/bHo6jtHbyNjDDc-SaGBIM7EIefw/0/da"><img src="http://feedads.g.doubleclick.net/~a/bHo6jtHbyNjDDc-SaGBIM7EIefw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/bHo6jtHbyNjDDc-SaGBIM7EIefw/1/da"><img src="http://feedads.g.doubleclick.net/~a/bHo6jtHbyNjDDc-SaGBIM7EIefw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=qBaJzoH9a1Q:a1eEv6nnqGI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=qBaJzoH9a1Q:a1eEv6nnqGI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=qBaJzoH9a1Q:a1eEv6nnqGI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=qBaJzoH9a1Q:a1eEv6nnqGI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?i=qBaJzoH9a1Q:a1eEv6nnqGI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=qBaJzoH9a1Q:a1eEv6nnqGI:cGdyc7Q-1BI"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=cGdyc7Q-1BI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/VirtuousCode?a=qBaJzoH9a1Q:a1eEv6nnqGI:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/VirtuousCode?d=bcOpcFrp8Mo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/VirtuousCode/~4/qBaJzoH9a1Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://avdi.org/devblog/2010/05/20/ruby-tempfiles-in-depth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/us/</creativeCommons:license>
	<feedburner:origLink>http://avdi.org/devblog/2010/05/20/ruby-tempfiles-in-depth/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.431 seconds --><!-- Cached page served by WP-Cache -->
