<?xml version="1.0"?>
<!-- name="generator" content="blosxom/2.0" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
  <channel>
    <title>Red Squirrel Reflections   </title>
    <link>http://redsquirrel.com/cgi-bin/dave</link>
    <description>Dave Hoover explores the psychology of software development</description>
    <language>en</language>

  <item>
    <title>Rails Rumble 2008: Developing Run.Track.Run.</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/10/23#rumble.retrospective</link>
    <description>
&lt;p&gt;
&lt;a href=&quot;http://jasonleahrun.blogspot.com/&quot;&gt;Leah Welty-Rieger&lt;/a&gt; joined Obtiva a couple months ago. She is an apprentice in our &lt;a href=&quot;http://obtiva.com/services/studio&quot;&gt;Software Studio&lt;/a&gt;. (She also recently earned her PhD in Particle Physics from Indiana University.) About a month or so ago, Leah and I were walking back from lunch and started talking about our shared interest in running. Then she told me about an idea she had for making simpler, easier, more informative running software for planning and tracking your training.  A couple weeks later I found a link to &lt;a href=&quot;http://railsrumble.com&quot;&gt;Rails Rumble 2008&lt;/a&gt;. I'd wanted to rumble in the past, because I'm a fairly speedy programmer, and I love competition. But having very little CSS-fu and lacking any inspired 48-hour-sized ideas, I'd never rumbled. Until this year.  I immediately thought of Leah's idea and realized that with the addition of CSS-ninja &lt;a href=&quot;http://twitter.com/dnawara&quot;&gt;Dan Nawara&lt;/a&gt; to our Studio team, we had sufficient skills to rumble. And just because I had the luxury of doing so, I asked &lt;a href=&quot;http://sustainablecode.com/blog/&quot;&gt;Fred Polgardy&lt;/a&gt; to join us as well, because, well, Fred's a genius, particularly with JavaScript.
&lt;/p&gt;&lt;p&gt;
We got together 3 times before the competition to formulate our plan of attack. This helped us start on the same page. We understood the domain model (Users have Runs have Splits), and we knew we were going to integrate with the &lt;a href=&quot;https://buy.garmin.com/shop/shop.do?cID=142&quot;&gt;Garmin Forerunner&lt;/a&gt;, and we knew we were going to use &lt;a href=&quot;http://code.google.com/p/flotr/source/browse/trunk/flotr/&quot;&gt;Flotr&lt;/a&gt; to build the HTML-canvas-based graphs that Leah had specified.  We decided to use &lt;a href=&quot;http://haml.hamptoncatlin.com/&quot;&gt;HAML&lt;/a&gt; and &lt;a href=&quot;http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html&quot;&gt;SASS&lt;/a&gt;, which I had never used, but found perfectly intuitive and productive (and now prefer it).  I decided to stick with good old &lt;a href=&quot;http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html&quot;&gt;test/unit&lt;/a&gt; for TDD.  I'm still much more productive in test/unit than any other Ruby testing framework and I needed something dead simple since I was going to be running low on energy.  I also planned to use TDD strategically.  Basically, I used it to test my models, but developed my controllers without tests. Ironically, this helped keep my controllers really skinny, since I ended up extracting logic into models (such as the Garmin XML file processing and matching scheduled runs to actual runs) and wrapping them in tests.  We also decided on the name for the app: Run.Track.Run.  We were both excited and disappointed to find out a day later that &lt;a href=&quot;http://thinkrelevance.com/&quot;&gt;Relevance&lt;/a&gt; had created &lt;a href=&quot;http://runcoderun.com/&quot;&gt;Run Code Run&lt;/a&gt; and would be offering free continuous integration for rumblers, and thereby leading everyone to assume that we copied their name.
&lt;/p&gt;&lt;p&gt;
The competition started on Friday at 7pm Chicago time. My wife, kids, and I with friends in their house. I rudely, and suddenly grabbed my laptop and bluetooth-enabled modem/mobile-phone and started the process of setting up our &lt;a href=&quot;http://github.com/&quot;&gt;github&lt;/a&gt; repository with &lt;a href=&quot;http://jimneath.org/2008/09/09/bort-base-rails-application/&quot;&gt;Bort&lt;/a&gt;, installed Debian on &lt;a href=&quot;http://www.linode.com/&quot;&gt;Linode&lt;/a&gt; (with Apache+Passenger, MySQL, Postfix), hooked our build into Run Code Run, and pushed our first Capistrano deployment up to the server. The next morning &lt;a href=&quot;http://flickr.com/photos/redsquirrel/2952529185/&quot;&gt;the 4 of us met at the office&lt;/a&gt; and started rumbling as a team. The rest of the story is actually pretty mundane.  I got really pissed off, swearing loudly at the Garmin JavaScript libraries for a while until Fred came over and solved the problem. We did a lot of pair programming. And mostly just kicked ass consistently for 48 hours.  I got to pair with Leah, Dan and Fred (sorted in order of amount of pairing time). I think everyone paired with everyone. And everyone got enough sleep.  And with an hour to go, we were kicking back with beer and making final tweaks.  In the end, we launched &lt;a href=&quot;http://run.r08.railsrumble.com/&quot;&gt;Run.Track.Run.&lt;/a&gt;, which I'm particularly excited about, since &lt;a href=&quot;http://twitter.com/redsquirrel/status/971881906&quot;&gt;I'm one&lt;/a&gt; of the (currently) 75 runners who are already using the application.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Twitter Etiquette</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/10/23#twitter.etiquette</link>
    <description>
I have a couple &lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt; pet peeves. I follow around &lt;a href=&quot;http://twitter.com/redsquirrel/friends&quot;&gt;80 people&lt;/a&gt; on Twitter, and this list has been carefully optimized over time to maximize signal vs. noise. I'm a huge fan of Twitter, I actually have
&lt;a href=&quot;http://twitter.com/redsquirrel&quot;&gt;seven&lt;/a&gt;
&lt;a href=&quot;http://twitter.com/polyglots&quot;&gt;Twitter&lt;/a&gt;
&lt;a href=&quot;http://twitter.com/ppoc&quot;&gt;accounts&lt;/a&gt;
&lt;a href=&quot;http://twitter.com/safariwatir&quot;&gt;for&lt;/a&gt;
&lt;a href=&quot;http://twitter.com/tweetnodes&quot;&gt;the&lt;/a&gt;
&lt;a href=&quot;http://twitter.com/tweetbeats&quot;&gt;splintered&lt;/a&gt;
&lt;a href=&quot;http://twitter.com/geekfest&quot;&gt;fragments&lt;/a&gt;
of my personality. I enjoy Twitter so much that I want to highlight 2 small peeves that I'm hoping we can minimize in order to help all of us maximize our signal.
&lt;ol&gt;
&lt;li&gt;Multi-tweet tweets: &lt;a href=&quot;http://twitter.com/marick&quot;&gt;Brian Marick&lt;/a&gt;, one of the most intelligent, humorous geeks I've had the pleasure of meeting has a long-running habit of allowing his tweets to &lt;a href=&quot;http://twitter.com/marick/status/966358768&quot;&gt;break&lt;/a&gt; &lt;a href=&quot;http://twitter.com/marick/status/966361721&quot;&gt;out&lt;/a&gt; of the 140 character limit. Brian, this is cheating! Embrace constraints!&lt;/li&gt;
&lt;li&gt;Context-less replies: I could point to a lot of offenders (myself included) but I'll point at one of my favorite people, &lt;a href=&quot;http://twitter.com/bil_kleb&quot;&gt;Bil Kleb&lt;/a&gt;.  I often observe people having a glorified instant messaging conversation on Twitter. This can get really &lt;a href=&quot;http://twitter.com/bil_kleb/status/969543939&quot;&gt;noisy&lt;/a&gt; if you're not careful. You want to make sure that each tweet has enough context that your followers know enough to know that they're not interested or compelled to click through a username or tinyurl.&lt;/li&gt;
&lt;/ol&gt;
OK, stepping down from the soapbox...</description>
  </item>
  <item>
    <title>The Me Meme</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/10/03#me.meme</link>
    <description>
I was catching up on my blog reading on the train (sitting in the stairwell) and read &lt;a href=&quot;http://blog.obiefernandez.com/content/2008/10/the-me-meme.html&quot;&gt;Obie's Me Meme post&lt;/a&gt;...

&lt;p&gt;
&lt;img src=&quot;http://redsquirrel.com/dave/mememe.jpg&quot; width=&quot;400&quot; /&gt;
&lt;/p&gt;
Go ahead and follow these instructions if you're into silly memes...

&lt;ol&gt;
&lt;li&gt;Take a picture of yourself right now.&lt;/li&gt;
&lt;li&gt;Don’t change your clothes, don’t fix your hair…just take a picture. (should be super-easy with Photobooth)&lt;/li&gt;
&lt;li&gt;Post that picture with NO editing.&lt;/li&gt;
&lt;li&gt;Post these instructions with your picture&lt;/li&gt; 
&lt;/ol&gt;</description>
  </item>
  <item>
    <title>Obtiva enters Rails Rumble</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/09/29#rails.rumble</link>
    <description>
&lt;a href=&quot;http://railsrumble.com/teams/obtivians&quot;&gt;&lt;img src=&quot;http://blog.railsrumble.com/assets/2008/9/24/RailsRumbleBadge_180_1.png&quot; border=&quot;0&quot;/&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
Looking forward to a fun weekend with &lt;a href=&quot;http://twitter.com/JasonLeahRun&quot;&gt;Leah&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/sentientholon&quot;&gt;Fred&lt;/a&gt;, and &lt;a href=&quot;http://twitter.com/dnawara&quot;&gt;Dan&lt;/a&gt;.</description>
  </item>
  <item>
    <title>Look Ma, No Server-Side!</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/06/12#no.server.goal</link>
    <description>
&lt;p&gt;
When I launched the sexy &lt;a href=&quot;http://polyglotprogrammers.com&quot;&gt;http://polyglotprogrammers.com&lt;/a&gt; page, I decided that it would only serve static HTML and JavaScript.  I thought it would be an interesting constraint that would help me break out of my server-side tendencies.  So I mashed in a Google Calendar and a badge that shows the latest posts from &lt;a href=&quot;http://groups.google.com/group/polyglot-programmers&quot;&gt;our Google Group&lt;/a&gt;.  I was happy with how easy this was.
&lt;/p&gt;&lt;p&gt;
And then we launched &lt;a href=&quot;http://polyglotprogrammers.com/usa/illinois/chicago/&quot;&gt;Polyglot Programmers of Chicago&lt;/a&gt; and had &lt;a href=&quot;http://groups.google.com/group/polyglot-programmers/browse_thread/thread/cdc3c1a50e501f9e&quot;&gt;our first meeting&lt;/a&gt;.  Being the lazy organizer that I am, I didn't ask anyone to RSVP and we ended up ordering too much pizza and stocked too much beer.  I pondered aloud at a recent &lt;a href=&quot;http://obtiva.com&quot;&gt;Obtiva&lt;/a&gt; geekfest about my need for an RSVP system without any server-side dependency and &lt;a href=&quot;http://reborg.tumblr.com/&quot;&gt;Renzo&lt;/a&gt; suggested we use Twitter.  Coming off of a couple weeks of obsessive &lt;a href=&quot;http://tweetnodes.com&quot;&gt;Twitter&lt;/a&gt; &lt;a href=&quot;http://tweetbeats.com&quot;&gt;hacking&lt;/a&gt;, I was keen to try it.  (The Twitter API is a programmer's playground, add a &amp;lt;canvas&gt; tag, and it's a programmer's amusement park.)  So I hacked together our RSVP system in 10 lines of client-side code.  First, I provided the link to submit the RSVP:
&lt;pre&gt;
&amp;lt;a target=&quot;_blank&quot; href=&quot;https://twitter.com/home?status=@polyglots+@ppoc+June+2008&quot;&gt;RSVP to this meeting via Twitter&amp;lt;/a&gt;
&lt;/pre&gt;
Then, I read the RSVP's:
&lt;pre&gt;
&amp;lt;script type=&quot;text/javascript&quot;&gt;
function rsvp(json) {
	var confirmed = document.getElementById(&quot;rsvp&quot;)
	for (var i = 0; i &lt; json.results.length; i++) {
		confirmed.innerHTML += '&amp;lt;img src=&quot;' + json.results[i].profile_image_url + '&quot; /&gt; &amp;lt;a href=&quot;http://twitter.com/' + json.results[i].from_user +  '&quot;&gt;' + json.results[i].from_user + &quot;&amp;lt;/a&gt;&amp;lt;br /&gt;&quot;
	}
}
&amp;lt;/script&gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://summize.com/search.json?&amp;rpp=100&amp;callback=rsvp&amp;q=@polyglots+@ppoc+June+2008&quot;&gt;&amp;lt;/script&gt;
&lt;/pre&gt;
You'll notice I used &lt;a href=&quot;http://summize.com&quot;&gt;Summize&lt;/a&gt;, which sits on top of Twitter and provides an excellent service for searching through Tweets in real-time.  It's funny, when I code stuff like this I feel like I'm cheating.  It's freeing to only need to think about the client-side and let the service providers worry about the rest.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Upcoming Conferences</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/06/10#conferences.2008</link>
    <description>

&lt;p&gt;
Portland in July:  I will be speaking about &lt;a href=&quot;http://en.oreilly.com/oscon2008/public/schedule/detail/2348&quot;&gt;Apprenticeships on Open Source&lt;/a&gt; at &lt;a href=&quot;http://en.oreilly.com/oscon2008/&quot;&gt;OSCON&lt;/a&gt; with &lt;a href=&quot;http://syntatic.wordpress.com&quot;&gt;Brian Tatnall&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Toronto in August:  I will be facilitating a game of &lt;a href=&quot;http://submissions.agile2008.org/node/4854&quot;&gt;Ping Pong Programming&lt;/a&gt; at &lt;a href=&quot;http://agile2008.org&quot;&gt;Agile 2008&lt;/a&gt; with &lt;a href=&quot;http://andymaleh.blogspot.com&quot;&gt;Andy Maleh&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Chicago in September:  I will be attending &lt;a href=&quot;http://www.windycityrails.org/&quot;&gt;WindyCityRails&lt;/a&gt; and will hopefully have an opportunity to talk about the development of &lt;a href=&quot;http://madmimi.com&quot;&gt;Mad Mimi&lt;/a&gt; alongside the product's visionary &lt;a href=&quot;http://madmimi.com/tour/people&quot;&gt;Gary Levitt&lt;/a&gt;.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>How did you get started in programming?</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/06/08#started.programming</link>
    <description>
&lt;p&gt;
&lt;a href=&quot;http://objo.com/2008/6/7/how-did-you-get-started-in-programming&quot;&gt;objo called me out, so I'm answering the questions.&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;How old were you when you started programming? How did you get started in programming? What was your first language? What was your first professional programming gig?&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
9, 13 and 25. When I was in grade school we were introduced to &lt;a href=&quot;http://en.wikipedia.org/wiki/Logo_(programming_language)&quot;&gt;Logo&lt;/a&gt;, which was interesting, but since I could only play with it at certain times at school, I didn't get far with it.  But it definitely sparked an interest.  When I was in junior high we had an Apple IIe.  I loved playing games on it, and when I saw the movie &lt;a href=&quot;http://en.wikipedia.org/wiki/Tron_(film)&quot;&gt;Tron&lt;/a&gt;, I was convinced that I would one day be a programmer like &lt;a href=&quot;http://tron.wikia.com/wiki/Kevin_Flynn&quot;&gt;Flynn&lt;/a&gt;.  I bought a book on &lt;a href=&quot;http://en.wikipedia.org/wiki/BASIC&quot;&gt;Basic&lt;/a&gt; and tried to create some games on the Apple IIe, but mostly just keyed stories into code and had them print to the screen.  I gave up when I couldn't create anything compelling.  It was 1999 when I was wrapping up my master's degree in child and family therapy and I was fascinated by the internet and the way it was changing the world.  My wife and I had just had our first child (who slept in the closet of our one bedroom apartment) and I was looking for ways to supplement my upcoming income.  I taught myself enough HTML to secure a side job as a the Teen Advice guide at About.com.  Over the next year I was a child and family therapist by day, and a HTML wrangler by night, and I began to realize that I &lt;i&gt;really&lt;/i&gt; enjoyed the technical work.  I was surprised that I could sit in front of a computer and feel energized.  Dreams of &lt;a href=&quot;http://tron.wikia.com/wiki/Kevin_Flynn&quot;&gt;Flynn&lt;/a&gt; flooded into the back of my mind and I decided to try programming full-time.  I was hired by Edventions, a startup in Skokie, IL as a content editor.  Over the course of the year I worked there, I taught myself Perl and I worked my way into the programming side of the business.  And by late 2000, I had officially taken the red pill.  I was completely hooked on programming, specifically &lt;a href=&quot;http://perlmonks.org/?node_id=92650&quot;&gt;Perl&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;What was the first real program you wrote?&lt;/b&gt;
&lt;/p&gt;
Most of my early Perl hacking was fixing bugs in or enhancing other people's CGI scripts. The first real program I wrote from scratch was lovingly called &lt;a href=&quot;http://perlgolf.sourceforge.net/&quot;&gt;PGAS&lt;/a&gt;, the Perl Golf Administration System.  Yes, for several months in 2002, I was the main instigator of monthly Perl Golf competitions.  This is the first time I've stated that publicly, and I'm not sure how I feel about that.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;What languages have you used since you started programming?&lt;/b&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Perl&lt;/li&gt;
&lt;li&gt;C&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;Erlang&lt;/li&gt;
&lt;li&gt;Scheme&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;b&gt;If you knew then what you know now, would you have started programming?&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;Absolutely&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;If there is one thing you learned along the way that you would tell new developers, what would it be?&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
Find opportunities to &lt;a href=&quot;http://softwarecraftsmanship.oreilly.com/wiki/show/Chapter+17.+Be+The+Worst&quot;&gt;Be the Worst&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;What’s the most fun you’ve ever had ... programming?&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
The first was in 2004 when I worked for &lt;a href=&quot;http://thoughtworks.com&quot;&gt;ThoughtWorks&lt;/a&gt;.  I was on a team that included &lt;a href=&quot;http://twitter.com/dastels&quot;&gt;Dave Astels&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/obie&quot;&gt;Obie Fernandez&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/aslak_hellesoy&quot;&gt;Aslak Hellesøy&lt;/a&gt;.  Though the weekly travel to Detroit was excruciating, working with those guys changed my career, and was a ton of fun.
&lt;/p&gt;
&lt;p&gt;
The second was in 2007 at &lt;a href=&quot;http://obtiva.com&quot;&gt;Obtiva&lt;/a&gt;.  Our first full-time &lt;a href=&quot;http://obtiva.com/services/studio&quot;&gt;Software Studio&lt;/a&gt; project was &lt;a href=&quot;http://madmimi.com&quot;&gt;madmimi.com&lt;/a&gt;.  This project had many ups and downs, but working with the world-class &lt;a href=&quot;http://madmimi.com/tour/people&quot;&gt;Mad Mimi team&lt;/a&gt; and watching Mad Mimi come to life has been another career-altering experience.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Who am I calling out?&lt;/b&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://syntatic.wordpress.com/&quot;&gt;Brian Tatnall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.aslakhellesoy.com/&quot;&gt;Aslak Hellesøy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sustainablecode.com/blog/&quot;&gt;Fred Polgardy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.talbott.ws/&quot;&gt;Nathaniel Talbott&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://daddy.platte.name/&quot;&gt;Ryan Platte&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  </item>
  <item>
    <title>Polyglot Programming as opposed to Polyglot Programmers</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/06/03#polyglot.programming.programmers</link>
    <description>
&lt;p&gt;
I've needed to clarify something about &lt;a href=&quot;http://memeagora.blogspot.com/2006/12/polyglot-programming.html&quot;&gt;this&lt;/a&gt; &lt;a href=&quot;http://ola-bini.blogspot.com/2008/01/language-explorations.html&quot;&gt;polyglot&lt;/a&gt; &lt;a href=&quot;http://codebetter.com/blogs/david_laribee/archive/2008/04/22/polyglot-programmer-fishbowl.aspx&quot;&gt;meme&lt;/a&gt; to people a few times and I thought it would be a good idea to state it publicly.  There's really not much to it, but I think it's important.
&lt;/p&gt;
&lt;p&gt;
There is a difference between polyglot &lt;i&gt;programming&lt;/i&gt; and a polyglot &lt;i&gt;programmer&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
Ola just wrote another great &lt;a href=&quot;http://ola-bini.blogspot.com/2008/06/fractal-programming.html&quot;&gt;layers of languages&lt;/a&gt; post, and I want to make it clear that he's talking about polyglot &lt;i&gt;programming&lt;/i&gt;.  I also want to make it clear that I am excited about what he's proposing, and after watching &lt;a href=&quot;http://groups.google.com/group/polyglot-programmers/t/cdc3c1a50e501f9e&quot;&gt;Dean's talk last month&lt;/a&gt;, it's also clear to me that this sort of thing is not some hot new trend, it has been going on for decades.  But we should understand that polyglot &lt;i&gt;programming&lt;/i&gt; could potentially be done by a team of single-language specialists working together to create a multi-language system.
&lt;/p&gt;
&lt;p&gt;
A polyglot &lt;i&gt;programmer&lt;/i&gt; is someone who could single-handedly create a multi-language system.  A polyglot &lt;i&gt;programmer&lt;/i&gt; is someone who might choose a single language for an entire system, and they will be more likely than a specialist to pick a language that suits the problem domain.  They might program in a single language for a whole year, and then easily set aside that language and pick up a previous one.  I believe that polyglot programming is best accomplished with polyglot programmers.  I also believe that it's important for more of us programmers to become polyglot programmers, which is why I helped start &lt;a href=&quot;http://polyglotprogrammers.com&quot;&gt;the polyglot programmers user groups&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Like I said, there's not much to this, but I think it's an important distinction to make as the meme continues to spread.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Tweet Nodes</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/04/25#shoving.twitter.into.lvt</link>
    <description>
&lt;p&gt;
I ripped the &lt;a href=&quot;http://wordnet.princeton.edu&quot;&gt;WordNet&lt;/a&gt; server-side integration out of &lt;a href=&quot;http://awordlike.textdriven.com&quot;&gt;The Lightweight Visual Thesaurus&lt;/a&gt; and shoved in the Twitter API to create &lt;a href=&quot;http://redsquirrel.com/dave/tweet_nodes.html&quot;&gt;Tweet Nodes&lt;/a&gt;.  It's still at total hack and only works on Firefox, but it's a fun little Twitter conversation browser.
&lt;/p&gt;
&lt;p&gt;
Here's how olabini's Tweet Nodes look today...&lt;br/&gt;
&lt;a href=&quot;http://redsquirrel.com/dave/tweet_nodes.html?olabini&quot;&gt;&lt;img src=&quot;http://redsquirrel.com/dave/tweetnodes01.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Paul's Statelessness and Jerry's Truthfulness</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/04/23#graham.and.weinberg</link>
    <description>
I enjoyed reading &lt;a href=&quot;http://www.paulgraham.com/&quot;&gt;Paul Graham&lt;/a&gt;'s &lt;a href=&quot;http://www.paulgraham.com/good.html&quot;&gt;Be Good&lt;/a&gt;.  I found this little tidbit of wisdom echoed the words of &lt;a href=&quot;http://www.geraldmweinberg.com/&quot;&gt;Jerry Weinberg&lt;/a&gt;'a &lt;a href=&quot;http://www.dorsethouse.com/books/soc.html&quot;&gt;Secrets of Consulting&lt;/a&gt;...

&lt;blockquote&gt;Being good is a particularly useful strategy for making decisions in complex situations because it's stateless. It's like telling the truth. The trouble with lying is that you have to remember everything you've said in the past to make sure you don't contradict yourself. If you tell the truth you don't have to remember anything, and that's a really useful property in domains where things happen fast. --Paul Graham&lt;/blockquote&gt;

&lt;blockquote&gt;One of the great advantages of not lying to your clients is that you generally don't have to remember what you said. --Jerry Weinberg&lt;/blockquote&gt;</description>
  </item>
  <item>
    <title>Polyglot Programmers User Groups</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/04/05#announce.launch</link>
    <description>
I'm excited to announce the birth of a user group focused on exposing programmers to many different languages and providing a place for programmers to learn how to fit different languages together.  Inspired by &lt;a href=&quot;http://memeagora.blogspot.com/2008/01/c-mvp-polyglot-programmer.html&quot;&gt;Neal Ford&lt;/a&gt;, &lt;a href=&quot;http://ola-bini.blogspot.com/2008/01/language-explorations.html&quot;&gt;Ola Bini&lt;/a&gt;, and our own experiences as language-agnostic programmers, &lt;a href=&quot;http://sustainablecode.com/blog&quot;&gt;Fredrick Polgardy&lt;/a&gt;, &lt;a href=&quot;http://squaremasher.blogspot.com&quot;&gt;Tyler Jennings&lt;/a&gt;, and I are launching the &lt;a href=&quot;http://polyglotprogrammers.com&quot;&gt;Polyglot Programmers User Groups&lt;/a&gt;.  Have a look!</description>
  </item>
  <item>
    <title>A Retrospective on the first year of Obtiva's Apprenticeship Program</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/03/23#apprenticeship.program.first.year</link>
    <description>
&lt;p&gt;
One year ago I stopped doing full-time on-site consulting.  I started on-site consulting in 2004 when I joined ThoughtWorks, and continued through my first client at &lt;a href=&quot;http://obtiva.com&quot;&gt;Obtiva&lt;/a&gt;.  I have done a few multi-day, local stints since Spring 2007, but the vast majority of my days have been spent in a smallish office about a mile from my house in Wheaton, Illinois, USA.  It was a risk to start Obtiva's Craftsmanship Studio and subsequent Apprenticeship Program, but after a ton of hard work, frequent mistakes and mismanagement, I can confidently say these last 12 months have paid off and the future is brilliant.  Let me try to explain what I'm talking about, and why I'm confident about our first year's success.  (And thank you to Michael Hunger for asking for more information on this topic.)
&lt;/p&gt;&lt;p&gt;
What is a Craftsmanship Studio?  I should rephrase that to &quot;What is Obtiva's Craftsmanship Studio?&quot; because I can only speak with authority on that.  First, what does &quot;Craftsmanship&quot; mean in this context?  My best answer to that question is to advise you to go read &lt;a href=&quot;http://search.safaribooksonline.com/0201733862/part03&quot;&gt;Part 3 of &quot;Software Craftsmanship: The New Imperative&quot;&lt;/a&gt;.  Being a self-taught programmer, and coming from a right-brained background, the concept of craftsmanship immediately resonated with me.  It should come as no surprise that when I had the opportunity to create my own practice within Obtiva, I tried to model it after the ideals that inspired me in &lt;a href=&quot;http://search.safaribooksonline.com/0201733862/&quot;&gt;Pete McBreen's book&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Second, what is a &quot;Studio&quot; in this context?  The dictionary tells us that a studio is &quot;an artist's workroom&quot; or &quot;an establishment where an art is taught or studied&quot;.  That sounded right to me and it is supported by the fact that &lt;a href=&quot;http://www.paulgraham.com/knuth.html&quot;&gt;programming as art&lt;/a&gt; has been a strong theme among the leaders in our field for a long time.
&lt;/p&gt;&lt;p&gt;
The above ideas basically summed up the vision for our Craftsmanship Studio:  a place where programming newcomers can come to learn the craft of software development on real-world projects working closely with experienced developers.  Reality was much messier than our vision, and there were too many times when apprentices were isolated or working together without much oversight.  This messiness can be attributed to the fact that I am a journeyman, not a master craftsman, and therefore this year was filled with mistakes as I learned (by trial-and-error) about project management, customer relations, capacity planning, and recruiting.  Thankfully we have had about 50 retrospectives during that time and have adapted our agile principles into a process that continues to improve each week.
&lt;/p&gt;&lt;p&gt;
So if our Craftsmanship Studio is where newcomers and old-timers work, learn, and mentor, what is an Apprentice?  The above reference to Part 3 of Pete's book will quickly introduce you to the concept of apprenticeship...
&lt;/p&gt;&lt;blockquote&gt;
A central tenet of the craft model is that it is hard to pick up a skill just by being told about it. You actually have to practice the skill under realistic conditions and under the watchful eye of an experienced practitioner who is providing feedback. &lt;/blockquote&gt;&lt;p&gt;
This describes the need and the relationship, but in reality, who are these people, these supposed newcomers?  My working definition for someone in an apprenticeship is: a person who is looking to maximize their learning opportunities, even at the cost of other opportunities.  Often this means purposely putting yourself into a &lt;a href=&quot;http://softwarecraftsmanship.oreilly.com/wiki/show/chapter-17-be-the-worst&quot;&gt;Be the Worst&lt;/a&gt; situation, which is exactly what I did when I joined ThoughtWorks.  For Obtiva, this means we're looking at potential and attitude rather than credentials.  These people could probably make more money somewhere else in the short-term but they are making an investment in learning that will pay off in the long-term.
&lt;/p&gt;&lt;p&gt;
I would like to see our Apprenticeship Program mature into a more formal apprenticeship with better feedback mechanisms and milestones.  That said, I can say that the four apprentices who have participated in our Craftsmanship Studio have been very successful despite my shortcomings as a manager.  This year reinforced for me what I learned when I was an apprentice: your apprenticeship is what you make of it.  We had a Perl web developer come to us, learn Ruby and Rails and Java, and leave us writing a multi-threaded Ruby/JRuby/Java/JNI application that leveraged a 16 core machine for a local hedge fund.  We had someone come to us to reboot his career, learn Unix, MySQL, Perl, Ruby and Rails and is now both managing and developing e-commerce deliveries for the Studio's largest client.  We had someone come to us from a local Rails sweatshop, learn technologies like Sphinx, rSpec, god, ActiveMerchant, CruiseControl.rb, along with Perl, who is now introducing Git into the team and will soon be technical lead on his third Rails e-commerce project.  We had a network administrator come to us, who after rapidly delivering several different Rails projects, is now wrangling a large, chaotic Rails codebase under control via rSpec better than many experienced developers I know.
&lt;/p&gt;&lt;p&gt;
What do I attribute our success to?
&lt;ol&gt;
	&lt;li&gt;Co-location: Nothing beats face-to-face teamwork&lt;/li&gt;
	&lt;li&gt;Pair programming: Nothing beats side-by-side development&lt;/li&gt;
	&lt;li&gt;Test-driven development: Nothing beats ping pong programming with tiny feedback loops&lt;/li&gt;
	&lt;li&gt;Agile principles: Constantly re-evaluating our reality with the principles we hold and readjusting our process accordingly&lt;/li&gt;
	&lt;li&gt;Respecting our customers: We work directly with the Goal Donor and use their language to build user stories&lt;/li&gt;
	&lt;li&gt;Great tools: We use Macs with extra flatscreens and regularly bring in new technologies to boost productivity&lt;/li&gt;
	&lt;li&gt;Hard work: Staying focused on our deliveries despite tough conditions&lt;/li&gt;
	&lt;li&gt;Culture: Nothing beats an impromptu team snowball fight in the parking lot to get those creative juices flowing&lt;/li&gt;
&lt;/ol&gt;
All of these have added up to an ever-increasing demand for our servies, which we are getting gradually better at managing, which combined, keeps everything chugging along at a sustainable pace.  This pace is the critical piece because it means we also have lives outside the office that can energize us for our next day of teamwork.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Moving to O'Reilly</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2008/02/13#change.of.venue</link>
    <description>
&lt;p&gt;
After my Lorax-like Apprenticeship rant last year, I've had my nose to a few different grindstones, leading &lt;a href=&quot;http://obtiva.com&quot;&gt;Obtiva&lt;/a&gt;'s Craftsmanship Studio, working on the Apprenticeship Patterns, and attempting to be a good enough husband and father to Staci and the kids.  Things are leveling off now as I'm beginning to understand a bit more about what it takes to manage a Craftsmanship Studio and I'm starting to pick up some momentum on the book writing.  I'm excited to announce that Ade and I have decided that the Apprenticeship Patterns will be &lt;a href=&quot;http://www.oreillynet.com/fyi/blog/2008/02/collaborate_often_watch_it_gro.html&quot;&gt;published by O'Reilly&lt;/a&gt; as &lt;i&gt;Software Craftsmanship: From Apprentice to Journeyman&lt;/i&gt; in their &lt;a href=&quot;http://www.oreilly.com/store/series/theory.csp&quot;&gt;Theory In Practice series&lt;/a&gt;.  One of the main reasons that we chose O'Reilly is their commitment to the web and their alignment with my vision for the web site and community that I wanted to develop around the book.  I'm pleased to say that they have provided an excellent platform (&lt;a href=&quot;http://www.businesswire.com/portal/site/google/index.jsp?ndmViewId=news_view&amp;newsId=20080212005459&amp;newsLang=en&quot;&gt;press release&lt;/a&gt;) to facilitate exactly the sort of situation I wanted: &lt;a href=&quot;http://softwarecraftsmanship.oreilly.com/&quot;&gt;full content of the patterns&lt;/a&gt; available the public, &lt;a href=&quot;http://softwarecraftsmanship.oreilly.com/forum/all&quot;&gt;community forums&lt;/a&gt;, and a &lt;a href=&quot;http://softwarecraftsmanship.oreilly.com/news&quot;&gt;blog&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Most of my blogging attention will be focused on the book, but I will also be posting tidbits of my lower-level day-to-day development work on my &lt;a href=&quot;http://redsquirrel.tumblr.com&quot;&gt;Stumblog&lt;/a&gt;.  If you'd like to continue to follow me via feeds, please subscribe to &lt;a href=&quot;http://softwarecraftsmanship.oreilly.com/news/atom/10441/1bb8a8f7a94c2aaef8094bf717f1ac14469128eb&quot;&gt;the book feed&lt;/a&gt; and the &lt;a href=&quot;feed://feeds.feedburner.com/stumblog&quot;&gt;Stumblog feed&lt;/a&gt;.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>A Call for Apprenticeship</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/08/22#a.call.for.apprenticeship</link>
    <description>
&lt;p&gt;
At &lt;a href=&quot;http://agile2007.com/&quot;&gt;Agile2007&lt;/a&gt; last week, I snuck into the last 30 minutes of &lt;a href=&quot;http://agile2007.com/agile2007/index.php?page=sub/&amp;id=649&quot;&gt;Uncle Bob's talk about Craftsmanship and Professionalism&lt;/a&gt;.  When Uncle Bob talks about Craftsmanship he is generally talking about nitty-gritty details of the craft, such as specific practices and tools, but he did have one slide on apprenticeship.  He ranted a bit about how most universities do not equip graduates with sufficient skills to allow them to  deliver quality software from day one.  (Not to mention the significant number of people who come into software development from other fields and have never even received the inadequate computer science education that Bob was referring to.)  Bob asserted that we need to apprentice these young people, these graduates and newcomers.  Bob asserted that the most effective learning situation is one where a small number of apprentices work alongside an even smaller number of journeyman, who are receiving guidance from a master craftsman.  It was music to my ears until Bob polled the audience for anyone who was working in that environment.
&lt;/p&gt;&lt;p&gt;
I proudly raised my hand, but my heart sank as I looked around and realized I was the only one raising my hand.
&lt;/p&gt;&lt;p&gt;
For the rest of the conference I felt a sense of pride at the revelation that Obtiva's Craftsmanship Studio is such a unique phenomenon.  But I also struggled with a sense of sadness and frustration at the lack of apprenticeship opportunities our industry is providing to graduates and newcomers.  My biggest point of frustration is with small companies (1-20 people) made up entirely of super-experienced, world-class developers, coaches, and trainers.  I understand your compulsion to only hire people with over 5 years of professional experience who have established reputations, but I believe you're hurting the industry by implicitly refusing to take on the responsibility to apprentice a few people along the way.
&lt;/p&gt;&lt;p&gt;
Where do graduates and newcomers go when they're looking for their first gig?  They go where people are hiring entry level people.  This is where we lose some of our greatest potential because people who had the potential for greatness lose heart sitting at the bottom of mediocre, bloated, beaurocratic development organizations.  Imagine if young &lt;a href=&quot;http://blog.talbott.ws/&quot;&gt;Nathaniel Talbott&lt;/a&gt;, inexperienced and unqualified to do much of anything interesting, had found an &quot;entry level&quot; position, rather than becoming the first apprentice of &lt;a href=&quot;http://rolemodelsoftware.com/&quot;&gt;RoleModel Software&lt;/a&gt;.  Sure, someone else would have probably written &lt;a href=&quot;http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html&quot;&gt;test/unit&lt;/a&gt;.  And Nathaniel would probably still have become a good software developer.  But I am convinced that Nathaniel's apprenticeship made an impact on our industry, and we're better because of it.
&lt;/p&gt;&lt;p&gt;
Apprenticeship is more than simply hiring entry level people.  Apprenticeship is coupling an apprentice to a journeyman.  That doesn't mean they're pair programming all the time, but it does mean that the journeyman is overseeing the apprentice's progress and that the apprentice has an experienced developer in close &lt;i&gt;physical&lt;/i&gt; proximity to turn to for guidance.
&lt;/p&gt;&lt;p&gt;
Furthermore, apprentices are not necessarily entry level people.  Our first apprentices generally had a year or two of experience under their belt.  Some are in the middle of college degrees.  Some had recently graduated.  One is re-booting his IT career later in life.  Apprentices are people who are willing to take on a junior role that maximizes their learning opportunities as opposed to people who try to climb as quickly as they can into roles that maximize their financial opportunities.  In my experience, if the apprentice has talent and the right attitude, their financial success will inevitably follow their learning success. 
&lt;/p&gt;&lt;p&gt;
Please consider creating an apprenticeship at your organization.  I believe apprenticeship is our industry's best hope for addressing our talent shortage.
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
I was lucky enough to attend a great university, where I learned much theory (there was less theory back then).  What really made the experience shine, however, was an apprenticeship that I served.  One of the graduate students took me under his wing.  He didn't explicitly teach me, but he showed me by example how a great programmer thinks.  Working next to him month after month, I absorbed more practical knowledge about design, coding, and debugging than any course could impart.
&lt;/p&gt;&lt;p&gt;
Later, I joined a start-up in London where I served a different sort of apprenticeship.  My new boss showed me that software development was as about people as it was about technology.  He helped me understand the business side of the equation and taught me how great development builds personal relationships from a base of technical strength.
&lt;/p&gt;&lt;p&gt;
I &quot;graduated&quot; from these two very different apprenticeships a far, far better developer than I started out.  Based on my personal experience, I'm a believer.  Working with masters is the best way to learn a craft.
&lt;/p&gt;
&lt;a href=&quot;http://pragdave.pragprog.com/&quot;&gt;Dave Thomas&lt;/a&gt; in &lt;a href=&quot;http://www.mcbreen.ab.ca/SoftwareCraftsmanship/&quot;&gt;Software Craftsmanship&lt;/a&gt;, p. xiv
&lt;/blockquote&gt;</description>
  </item>
  <item>
    <title>Rails TDD Boot Camp: a year later, Astels, Google</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/07/10#rails.boot.camp.google.astels</link>
    <description>
&lt;p&gt;
I returned from Manhatten last month after my third running of Obtiva's &lt;a href=&quot;http://www.obtiva.com/index.php?page=rails_course&quot;&gt;Ruby on Rails TDD Boot Camp&lt;/a&gt;.  And for the first time, I wasn't completely exhausted!  Although I'm not a natural-born public speaker, practice does help a lot, and hopefully it showed this time.
&lt;/p&gt;
&lt;p&gt;
It's hard to believe that it was only a year ago that Obtiva was scrambling to meet the Rails training demand as we constructed our curriculum in preparation for our first course.  Since that time the course has run 7 times with &lt;a href=&quot;http://tyler.officialopinion.com/&quot;&gt;Tyler Jennings&lt;/a&gt;, &lt;a href=&quot;http://obiefernandez.com/&quot;&gt;Obie Fernandez&lt;/a&gt;, and myself as trainers in Illinois (Wheaton, Lombard, Chicago and Evanston), California (San Jose), and New York (Manhatten) for a wide variety of businesses (Cisco Systems, Northwestern University, Stony Brook University, Nielsen Media Research to name a few).  It's been an awesome experience to provide these trainings and adapt the course with the changes in the Rails landscape.
&lt;/p&gt;
&lt;p&gt;
I am pleased to announce that our 8th running of this course will be for our newest client &lt;a href=&quot;http://google.com&quot;&gt;Google&lt;/a&gt;.  And I am even more excited to announce that the instructor for this course will be Obtiva's newest team member &lt;a href=&quot;http://blog.daveastels.com/&quot;&gt;Dave Astels&lt;/a&gt;.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>The Vehicle</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/06/24#the.vehicle</link>
    <description>
&lt;p&gt;
This post was going to be an email to a friend who is interested in joining Obtiva, but most of what I was going to tell him were things I've been wanting to blog about, so I figured I'd make it a public-facing message...
&lt;/p&gt;
&lt;p&gt;
After I had been with Obtiva for six months, I experienced a change in perspective that has changed my career, and hopefully, the careers of many other future Obtivians.  At that point I had already delivered &lt;a href=&quot;http://redsquirrel.com/cgi-bin/dave/training/first.obtiva.rails.tdd.completed.html&quot;&gt;my first training course&lt;/a&gt;, and with the help of my fellow Obtivians, I had introduced Ruby and Rails at the J2EE shop of one of our main clients.  I was excited to make an impact, but it began to occur to me that a company as small and as financially stable as Obtiva is more than just a place to work hard and make an impact, &lt;b&gt;&lt;i&gt;it is a vehicle that can be driven&lt;/i&gt;&lt;/b&gt;.  The way that the company is structured provides us with incentive to not only do great work, but to go and create the work we want to do.  And that is exactly what I did.  I subscribed to a bunch of feeds like &lt;a href=&quot;http://gigs.37signals.com/categories/12/gigs.rss&quot;&gt;the 37signals Gig Board&lt;/a&gt; and started winning business.  These wins allowed us to hire 4 of our 11 employees and provided us with the first wave of apprentices for our Craftsmanship Studio in Wheaton.
&lt;/p&gt;
&lt;p&gt;
Nine months later, I am living a dream.  I am riding my bike to work and spending my days with &lt;a href=&quot;http://syntatic.wordpress.com/&quot;&gt;Brian Tatnall&lt;/a&gt;, &lt;a href=&quot;http://violasong.com/&quot;&gt;Victoria Wang&lt;/a&gt;, and Joseph Leddy in the Studio, helping them along their paths toward mastery as we deliver Rails projects to a variety of customers using whatever tools we want.  While I certainly cannot take all of the credit for my good fortune, I can say that I have maximized the situation, and we have room for others to do the same:  &lt;a href=&quot;http://counterflo.ws/&quot;&gt;Gareth&lt;/a&gt; sees the same potential and Obtiva has become a vehicle for him to grow our consulting business into the world of business and finance.
&lt;/p&gt;
&lt;p&gt;
Friend, you will likely have many opportunities to join Obtiva in the coming years, but I am uncertain whether the company will be as malleable as it is today.  You are a multi-talented person, a world-class software developer, to be sure, but you have many other talents that could be leveraged to allow you to use this opportunity as a vehicle to drive you toward exactly the sort of work that you want to be doing, and where you want to be doing it.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Rails moves my Bottleneck in Web Development</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/05/30#moving.the.bottleneck</link>
    <description>
&lt;p&gt;
&lt;a href=&quot;http://nubyonrails.com/articles/2007/05/26/useful-shell-shortcuts&quot;&gt;Geoffrey Grosenbach's latest post&lt;/a&gt; reminded me of something I've grown to appreciate over the last couple years: web development with Rails pushes me out of the confines of my codebase and into the other aspects of web development much more quickly than any other web development environment I've used before.  Rather than slogging through the painful verbosity of a J2EE codebase, on a Rails project I am (like Geoffrey) hopping around on various servers' command lines, configuring Apache, defining CSS, and crafting &lt;a href=&quot;http://www.prototypejs.org/&quot;&gt;Prototype&lt;/a&gt;-inspired JavaScript features.  For whatever reason, these are all aspects of web development that I had grown to belittle in a previous life when I was more interested in &lt;a href=&quot;http://bookshelved.org/cgi-bin/wiki.pl?GoF&quot;&gt;intellectual&lt;/a&gt; &lt;a href=&quot;http://bookshelved.org/cgi-bin/wiki.pl?ObjectOrientedSoftwareConstruction&quot;&gt;pursuits&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
What I'm realizing lately is that while I cherish what I've learned about objects, agile, and patterns, I'm feeling a bit lop-sided (which isn't surprising if you look at my &lt;a href=&quot;http://bookshelved.org/cgi-bin/wiki.pl?DaveHoover&quot;&gt;reading lists over the years&lt;/a&gt;).  Rails has internalized some the ideals that came out of some of the most important software development revolutions of the last few decades. &lt;a href=&quot;http://www.martinfowler.com/bliki/RailsConf2007.html&quot;&gt;Martin notes&lt;/a&gt;:
&lt;blockquote&gt;
...the [R]uby community has formed around the best ideas of the OO and Extreme Programming communities. Listening to the keynote of Jamis Buck and Michael Koziarski I was delighted to reflect on the thought that they were right there in the values of Ward, Kent, and all the other people who've been advocating clean code, well-factored object-oriented design, and testability. These ideas have made a great impact on many other technological communities, but in Ruby-land they are the orthodoxy.
&lt;/blockquote&gt;
Ruby and Rails' intrinsic values mean that my bottleneck has moved away from application code and (as always) I've got some learning to do in the ecosystem that surrounds and supports a successful Rails project.  Thankfully I work on a team of people that have a great diversity of backgrounds and talents. On teams like this, we often have both partners in our pairing sessions switching frequently between student and teacher.  It is a priceless dynamic and one of the great advantages of working with apprentices.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>The Dependencies of a Craftsmanship Studio</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/05/24#essential.foundation</link>
    <description>
&lt;p&gt;
As we continue to expand our Craftsmanship Studio, I am becoming increasingly aware of our dependencies.  In order to grow better as we grow bigger &lt;i&gt;and&lt;/i&gt; maintain a healthy mix of apprentices and journeymen (no masters yet), we are absolutely dependent on the essential attributes of a software developer.  As &lt;a href=&quot;http://toolshed.com&quot;&gt;Andy&lt;/a&gt; said in one of &lt;a href=&quot;http://semantechsguy.blogspot.com/2005/08/andy-hunt-has-started-new-podcast-cool.html&quot;&gt;his long-lost podcasts&lt;/a&gt;, the two most important attributes of a software developer are the ability to communicate well and to learn quickly.  I would add &lt;a href=&quot;http://dis.cipul.us/patterns/NurtureYourPassion&quot;&gt;passion&lt;/a&gt; to that list.
&lt;/p&gt;
&lt;p&gt;
Mentoring apprentices comes in many forms.  Some of it is indirect ... they overhear your conversations ... they read your code ... they read your blog (!).  But some of it needs to be direct, and in those moments, I am sacrificing my productivity on some other activity in order to answer a question, provide guidance, or sketch a domain model.  That sacrifice is an investment.  I believe that 10 minutes now is going to be paid back tenfold in future productivity gains.  And I believe that because it's obvious that our apprentices &lt;a href=&quot;http://violasong.com/&quot;&gt;Victoria&lt;/a&gt; and &lt;a href=&quot;http://syntatic.wordpress.com/&quot;&gt;Brian&lt;/a&gt; have the attributes that Andy was talking about.
&lt;/p&gt;
&lt;p&gt;
A couple of examples ... Victoria's ability to communicate well lightens my workload because as she is implementing features, she can interact directly with our customer, allowing me to stay focused on my development tasks rather than diving into Basecamp or GMail.  Brian's ability to learn quickly was apparent after I reviewed our Rails portfolio with him in his first few days and a week later he had single-handedly retrofitted ActiveRecords (with advanced associations) onto a legacy database on his first Rails project.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Thinking about Portland; Refactoring in Wheaton</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/05/21#refactoring.group.0.0</link>
    <description>
&lt;p&gt;
I just caught up on a bunch of the blogging from RailsConf.  It sounds like it was an excellent time.  But I'm surprised that I didn't hear about anything controversial or earth-shattering.  Perhaps Rails is stabilizing?  Anyway, while part of me yearned to be there, the end of my week in Wheaton turned out to be an excellent experience in its own right (on a smaller scale).
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://violasong.com/&quot;&gt;Victoria&lt;/a&gt; and Brian are working their way through &lt;a href=&quot;http://refactoring.com/&quot;&gt;Refactoring&lt;/a&gt; and we are meeting weekly to discuss what they're learning.  One of the first questions from the first few chapters was &quot;What is an Abstract Class?&quot;  This important and fundamental question launched us into a contrast of Java's Interfaces, Abstract Classes, and Packages with Ruby's Module.  I have always said in our Rails course that Ruby's Modules play double-duty (namespaces + mixin), but this was the first time I had illustrated that point to people who know Ruby better than Java.  It was a good discussion and I feel privileged to be able to guide Victoria and Brian along their path toward mastery and seed a culture of learning at Obtiva.
&lt;/p&gt;
&lt;p&gt;
I then shared some of my reflections on reading through the &lt;a href=&quot;http://c2.com/xp/CodeSmell.html&quot;&gt;Code Smells&lt;/a&gt; with my Ruby hat on.  The ones that stuck out most to me where &lt;a href=&quot;http://c2.com/cgi/wiki?FeatureEnvy&quot;&gt;Feature Envy&lt;/a&gt; and &lt;a href=&quot;http://lists.public.thoughtworks.org/pipermail/rubyrefactoring-devs/2007-March/000026.html&quot;&gt;Incomplete Library Class&lt;/a&gt;.  What struck me about these is how much more freedom Ruby gives you (than Java) to eradicate these smells from your code-base.  Specifically, the &lt;a href=&quot;http://refactoring.com/catalog/moveMethod.html&quot;&gt;Move Method&lt;/a&gt; refactoring can, in Ruby, move code all the way into the class where it belongs, regardless of whether you wrote that class or not.  &lt;a href=&quot;http://dev.rubyonrails.org/browser/trunk/activesupport/lib/active_support/core_ext/&quot;&gt;For example.&lt;/a&gt;
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Establishing our Software Craftsmanship Studio</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/05/11#establishing.the.studio</link>
    <description>
These 20 days of blogging silence were brought to you by...

&lt;ul&gt;
&lt;li&gt;Rolling off of a project at a local client&lt;/li&gt;
&lt;li&gt;Kicking off a project in Obtiva's Wheaton office&lt;/li&gt;
&lt;li&gt;Moving out of a &lt;a href=&quot;http://redsquirrel.com/cgi-bin/dave/projects/watir/rails.seminar.talk.cancelled.html&quot;&gt;flood-prone house&lt;/a&gt; and into a house &lt;i&gt;up&lt;/i&gt; the road&lt;/li&gt;
&lt;li&gt;Brian Tatnall joining Obtiva as hour first full-time software apprentice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Working in the Wheaton office has been a most excellent transition.  While there are &lt;a href=&quot;http://twitter.com/redsquirrel/statuses/46244552&quot;&gt;some mundane details&lt;/a&gt; to take care of, it's all in the name of establishing a Software Craftsmanship Studio we can call our own.  Like any software company that does consulting and training, there will always be some of us at client sites or running trainings in &lt;a href=&quot;http://www.acteva.com/booking.cfm?bevaid=129724&quot;&gt;exotic&lt;/a&gt; &lt;a href=&quot;http://www.acteva.com/booking.cfm?bevaid=134741&quot;&gt;locations&lt;/a&gt;.  But there will also always be a sub-set of us in the office delivering &lt;a href=&quot;http://blog.madmimi.com/&quot;&gt;full-fledged projects&lt;/a&gt; from our Studio.
&lt;/p&gt;
&lt;p&gt;
And that is what Brian and I (and soon &lt;a href=&quot;http://violasong.com/&quot;&gt;Victoria&lt;/a&gt; will be nearly full-time with us!) are establishing.  A place where apprenticeships flourish, where footwear is optional, where collaboration is dialed up to 11, and where we deliver top-notch software to our customers on a daily basis.  It's been intense thus far, and I anticipate some great times ahead.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Ruby has variable scoping</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/04/20#variable.scoping</link>
    <description>
&lt;a href=&quot;http://counterflo.ws/&quot;&gt;Gareth&lt;/a&gt; joined me in the d'oh! club today when I revealed to him the revelation that &lt;a href=&quot;http://twitter.com/redsquirrel/statuses/4890773&quot;&gt;Ryan provided me&lt;/a&gt; back in January.  Ruby has &lt;i&gt;variable&lt;/i&gt; scoping, meaning that this code works just fine:
&lt;pre&gt;
if false
  a = 1
end

puts a # nil
&lt;/pre&gt;
Up until Ryan revealed this to me, I had been merrily (and needlessly) declaring my variables outside the control structures that defined them.  Maybe Gareth and I are the only ones who weren't aware of this aspect of Ruby (and many other dynamic languages), but just in case, I thought I'd share it with you.</description>
  </item>
  <item>
    <title>Tomayko on Scaling with ActiveRecord</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/04/16#tomayko.on.activerecord</link>
    <description>
&lt;a href=&quot;http://tomayko.com/weblog/2007/04/13/rails-multiple-connections&quot;&gt;Ryan says&lt;/a&gt;:
&lt;blockquote&gt;
Frameworks don't solve scalability problems, design solves scalability problems.
&lt;/blockquote&gt;
I agree. Using a tool that gets out of your way (like &lt;a href=&quot;http://wiki.rubyonrails.com/rails/pages/ActiveRecord&quot;&gt;ActiveRecord&lt;/a&gt;) gives you the power to design your own solutions with minimal accidental complexity.
&lt;p&gt;
via &lt;a href=&quot;http://del.icio.us/obie&quot;&gt;Obie&lt;/a&gt;
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Heading to D.C. to demonstrate One-Size-Fits-One</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/04/05#rails.at.agile.2007</link>
    <description>
&lt;a href=&quot;http://tyler.officialopinion.com/&quot;&gt;Tyler&lt;/a&gt; and I will be presenting the fruits of some of Obtiva's Rails work at &lt;a href=&quot;http://www.agile2007.org/&quot;&gt;Agile 2007&lt;/a&gt;.  We have delivered several planning and tracking tools for software development teams using Rails over the last six months.  Through these engagements, we discovered that Rails proficiency and Agile coaching are a killer combination for creating planning tools that you can adapt alongside your process.  While there are plenty of one-size-fits-all agile planning tools out there, they often do too much, too little, or can't adapt to your needs.  If you're an agile team using planning and tracking software (rather than Excel or index cards), you need software that's actually &lt;i&gt;soft&lt;/i&gt;, like an agile process.
&lt;blockquote&gt;
If you follow a
methodology out of the box, you will have one that fits some project in the
world, but probably not yours.
--&lt;a href=&quot;http://alistair.cockburn.us/index.php/Main_Page&quot;&gt;Alistair Cockburn&lt;/a&gt;,
&lt;a href=&quot;http://bookshelved.org/cgi-bin/wiki.pl?AgileSoftwareDevelopment&quot;&gt;Agile Software Development&lt;/a&gt;
&lt;/blockquote&gt; </description>
  </item>
  <item>
    <title>Gareth Reeves joins Obtiva</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/03/26#reeves.hire</link>
    <description>
&lt;p&gt;
&lt;a href=&quot;http://www.ktaylor.name/&quot;&gt;Kevin&lt;/a&gt; introduced me to &lt;a href=&quot;http://counterflo.ws/&quot;&gt;Gareth Reeves&lt;/a&gt; almost a year ago, and Gareth and I quickly hit it off as we carpooled to the first annual RailsConf.  I was excited to meet Gareth because I remember reading some of his &lt;a href=&quot;http://www.rolemodelsoftware.com/moreAboutUs/publications/rulesOfXp.php&quot;&gt;papers on XP&lt;/a&gt; back when I couldn't get enough of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Extreme_Programming&quot;&gt;XP kool-aid&lt;/a&gt;.  Ever since then we've been working on getting Gareth into &lt;a href=&quot;http://obtiva.com/&quot;&gt;Obtiva&lt;/a&gt; and I'm thrilled to announce that we finally have him!
&lt;/p&gt;
&lt;p&gt;
Gareth has been involved with XP from the early days, and was mentored by none other than &lt;a href=&quot;http://en.wikipedia.org/wiki/Kent_Beck&quot;&gt;Kent Beck&lt;/a&gt;.  He brings a mountain of agile and Java and (more recently) Ruby experience with him and we're excited to see where his expertise takes us.  Gareth's first gig will be joining &lt;a href=&quot;http://daddy.platte.name/&quot;&gt;Ryan&lt;/a&gt; for a Rails coaching gig at a nearby hedge fund.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Homesteading and Inshoring in Wheaton</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/03/21#homesteading.and.inshoring.in.wheaton</link>
    <description>
&lt;p&gt;
I'm excited to announce that &lt;a href=&quot;http://redsquirrel.com/cgi-bin/dave/2006to2007.html&quot;&gt;my primary goal for 2007&lt;/a&gt; will come to fruition next month.  Since we opened our Wheaton office in December, I've been splitting time between working on-site at one of our main local clients and leading our Rails projects out of the office.  &lt;a href=&quot;http://obtiva.com/&quot;&gt;Obtiva&lt;/a&gt; just landed a project (yet another &lt;a href=&quot;http://redsquirrel.com/cgi-bin/dave/obtiva/inshoring.html&quot;&gt;coastal gig&lt;/a&gt;) that will allow me to work full-time out of our Wheaton office building our Rails practice and further establishing our Craftsmanship Studio.  Life is very good.
&lt;/p&gt;
&lt;p&gt;
While the project itself is interesting in its own right, one aspect that greatly excites me is that &lt;a href=&quot;http://www.agileproductdesign.com/&quot;&gt;Jeff Patton&lt;/a&gt;, agile product design pundit, is heavily involved.  I am excited to collaborate with Jeff and experience his approach to agile software development on an ambitious &lt;a href=&quot;http://rubyonrails.com/&quot;&gt;Rails&lt;/a&gt; project like this one.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>TextMate is my friend</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/03/15#i.heart.textmate</link>
    <description>
I got a little thrill just now when I wanted to have a look at some changes I've made in one of our Rails projects and it occurred to me that I love &lt;a href=&quot;http://macromates.com/&quot;&gt;TextMate&lt;/a&gt;'s diff view.  I hadn't tried this before so I typed it in and crossed my fingers...

&lt;pre&gt;
svn diff config/* | mate
&lt;/pre&gt;

Which (and I shouldn't be surprised by this) instantly popped up exactly what I wanted:
&lt;p&gt;
&lt;a target=&quot;_blank&quot; href=&quot;/dave/pipe_diff_to_mate.png&quot;&gt;&lt;img border=&quot;0&quot; width=&quot;300&quot; src=&quot;/dave/pipe_diff_to_mate.png&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Tyler's first course</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/03/09#tylers.first.training</link>
    <description>
I was in and out of Obtiva's office in Wheaton all week, so I was able to eavesdrop on &lt;a href=&quot;http://tyler.officialopinion.com/&quot;&gt;Tyler&lt;/a&gt;'s first attempt at instructing our &lt;a href=&quot;http://www.obtiva.com/index.php?page=rails_course&quot;&gt;Rails TDD Boot Camp&lt;/a&gt;.  It has been humbling to watch Tyler pick up the course that I helped develop last year, make it RESTful and 1.2-friendly, and then deliver it with confidence.  Unlike me, who was always on the edge of collapse after day 4 of the course, Tyler was itching for more.  I believe this officially confirms that Tyler is an extrovert.  You can &lt;a href=&quot;http://tyler.officialopinion.com/2007/03/09/reflecting-on-a-week-in-the-instructors-chair/&quot;&gt;read his latest blog post&lt;/a&gt; for his reflections on the experience.
</description>
  </item>
  <item>
    <title>Ideas for Teaching Kids to Program</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/03/02#teaching.kids</link>
    <description>
&lt;p&gt;
&lt;a href=&quot;http://www.devchix.com/2007/03/02/teaching-kids-part-1/&quot;&gt;&lt;img src=&quot;http://violasong.com/files/devchixkid_t.jpg&quot; border=&quot;0&quot; height=&quot;80&quot; align=&quot;right&quot;/&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.devchix.com/2007/03/02/teaching-kids-part-1/&quot;&gt;Victoria is looking for feedback&lt;/a&gt; on her ideas for how to introduce programming to children.  If you have experience or opinions on this, &lt;a href=&quot;http://www.devchix.com/2007/03/02/teaching-kids-part-1/#respond&quot;&gt;post it here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
BTW, the child Victoria is going to be mentoring is Rose, my oldest daughter.  They'll be meeting for the first time next Thursday afternoon.  Pretty cool, huh?
&lt;/p&gt;</description>
  </item>
  <item>
    <title>3.weekdays.from_now</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/02/28#facets.weekdays</link>
    <description>
&lt;pre&gt;
sudo gem install facets
&lt;/pre&gt;

&lt;pre&gt;
require 'rubygems'
require 'facets/more/times'

puts 0.weekdays.from_now # Wednesday (today)
puts 2.weekdays.from_now # This Friday
puts 3.weekdays.from_now # Next Monday
puts 4.weekdays.ago      # Last Thursday
&lt;/pre&gt;

See &lt;a href=&quot;http://facets.rubyforge.org/src/lib/facets/more/times.rb&quot;&gt;http://facets.rubyforge.org/src/lib/facets/more/times.rb&lt;/a&gt; for details.</description>
  </item>
  <item>
    <title>Ruby's Protected Access</title>
    <link>http://redsquirrel.com/cgi-bin/dave/2007/02/23#ruby.protected.access</link>
    <description>
&lt;a href=&quot;http://weblog.jamisbuck.org/&quot;&gt;Jamis&lt;/a&gt; posted &lt;a href=&quot;http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby&quot;&gt;yet another nugget of wisdom&lt;/a&gt;.  This one was about Ruby's method visibility, which can be tricky for people coming to Ruby from Java or C#.  Jamis left one aspect of the protected access level as an exercise for the rest of us, so I figured I'd write up an example that helps illustrate when you would use protected vs. private.

&lt;pre&gt;
class Sibling
  def ask(sib)
    sib.tell
  end
  
  def spy_on(sib)
    sib.secret # will always complain
  end

  protected

  def tell
    secret
  end
  
  private
  
  def secret
    &quot;Charlie tooted&quot;
  end
end

rose  = Sibling.new
ricky = Sibling.new

begin
  puts ricky.tell
rescue
  puts &quot;Ricky will only tell another sibling&quot;
end

begin
  puts rose.spy_on(ricky)
rescue
  puts &quot;Ricky complains when Rose tries to find the secret&quot;
end

puts rose.ask(ricky) # Ricky will tell if Rose asks nicely
&lt;/pre&gt;
One of the main differences for Java developers is that objects of the same class can't see each other's private methods.</description>
  </item>
  </channel>
</rss>