<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Ethan Gunderson</title>
	
	<link>http://www.ethangunderson.com</link>
	<description />
	<lastBuildDate>Sat, 30 Jan 2010 15:00:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/MemoirsOfASoftwareApprentice" /><feedburner:info uri="memoirsofasoftwareapprentice" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Fun with Delegate Methods</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/OvXxYieSMBk/fun-with-delegate-methods</link>
		<comments>http://www.ethangunderson.com/fun-with-delegate-methods#comments</comments>
		<pubDate>Sat, 30 Jan 2010 15:00:51 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[delegate]]></category>
		<category><![CDATA[method_missing]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=450</guid>
		<description><![CDATA[Earlier this week, I needed to expose methods on an instance variable in a Rails Model. The details of why I needed to aren&#8217;t as interesting as the options for implementation. Lets&#8217;s take a look.
The first option is to create individual methods that delegate to the instance variable. This option is probably the easiest to [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this week, I needed to expose methods on an instance variable in a Rails Model. The details of why I needed to aren&#8217;t as interesting as the options for implementation. Lets&#8217;s take a look.</p>
<p>The first option is to create individual methods that delegate to the instance variable. This option is probably the easiest to understand, but verbose. We can do better.<br />
<script src="http://gist.github.com/289862.js"></script></p>
<p>Another option is to use Ruby&#8217;s method missing. I really liked this option, but it felt too much like black magic, and it didn&#8217;t leave me with any control of the methods that are being implemented.</p>
<script src="http://gist.github.com/289844.js"></script>
<p>How it works: By overriding method missing, we can check to see if our instance variable responds to the method trying to be invoked. If not, we simply call the super. If it does, great, invoke the method via <a href="http://ruby-doc.org/core/classes/Object.html#M000332">send</a> by passing the method name and params. </p>
<p>The last option, and the one that I chose, is to use Active Support&#8217;s built in <a href="http://railsapi.com/doc/rails-v2.3.5/classes/Module.html#M002977">delegate</a> method. While not as cool as method missing, this option lets me control which methods are being exposed. Implementing this is also pretty easy to comprehend.</p>
<script src="http://gist.github.com/289880.js"></script>
<p>How it works: Under the covers, the delegate method works in a similar fashion to the method missing option. When called, the delegate method writes out a function(using the send method to pass the parms and a block, to whatever the value of the :to key is in the options hash) and then evaluates the new function with Ruby&#8217;s <a href="http://ruby-doc.org/core/classes/Module.html#M001649">module_eval</a>. You can view the full implementation details <a href="http://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/delegation.rb">here</a>  (hooray open source!).</p>
<p>Enjoy!</p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/OvXxYieSMBk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/fun-with-delegate-methods/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/fun-with-delegate-methods</feedburner:origLink></item>
		<item>
		<title>Haml and Sass: An Introduction</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/hMUBa2QB6-Q/haml-and-sass-an-introduction</link>
		<comments>http://www.ethangunderson.com/haml-and-sass-an-introduction#comments</comments>
		<pubDate>Sat, 02 Jan 2010 04:20:14 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Presentations]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=421</guid>
		<description><![CDATA[An introduction to the templating languages Haml and Sass. Given at my first milestone for my apprenticeship at Obtiva.
Haml and Sass Introduction
View more presentations from Ethan Gunderson.

]]></description>
			<content:encoded><![CDATA[<p>An introduction to the templating languages Haml and Sass. Given at my first milestone for my apprenticeship at Obtiva.</p>
<div style="width:425px;text-align: left" id="__ss_2814543"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/ethangunderson/haml-and-sass-introduction" title="Haml and Sass Introduction">Haml and Sass Introduction</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=haml-100101215526-phpapp02&#038;rel=0&#038;stripped_title=haml-and-sass-introduction" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=haml-100101215526-phpapp02&#038;rel=0&#038;stripped_title=haml-and-sass-introduction" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/ethangunderson">Ethan Gunderson</a>.</div>
</div>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/hMUBa2QB6-Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/haml-and-sass-an-introduction/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/haml-and-sass-an-introduction</feedburner:origLink></item>
		<item>
		<title>2009 Retrospective and 2010 Goals</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/C99Ojc12JCM/2009-retrospective-and-2010-goals</link>
		<comments>http://www.ethangunderson.com/2009-retrospective-and-2010-goals#comments</comments>
		<pubDate>Thu, 31 Dec 2009 16:40:04 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Personal]]></category>
		<category><![CDATA[Continuous Learning]]></category>
		<category><![CDATA[death march]]></category>
		<category><![CDATA[ecruby]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[goals]]></category>
		<category><![CDATA[ignitious]]></category>
		<category><![CDATA[retrospective]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=377</guid>
		<description><![CDATA[2009 Retrospective
Let me start by saying, 2009 was one hell of a year. It was full of some incredibly high points, and one terribly low point.


My first framework
This year saw the 1.0 release of the first framework I&#8217;ve ever participated in developing. Since it&#8217;s proprietary, very few of you will ever use it, however, it [...]]]></description>
			<content:encoded><![CDATA[<h2>2009 Retrospective</h2>
<p>Let me start by saying, 2009 was one hell of a year. It was full of some incredibly high points, and one terribly low point.<br />
<span id="more-377"></span></p>
<ul>
<li><b>My first framework</b>
<p>This year saw the 1.0 release of the first framework I&#8217;ve ever participated in developing. Since it&#8217;s proprietary, very few of you will ever use it, however, it was a great experience. It was my first real experience using design patterns in a way that they were actually useful.</p>
</li>
<li><b>Death March</b>
<p>This spring was also the wrap up of the <a href="http://en.wikipedia.org/wiki/Death_march_%28software_development%29">death march</a> project from hell.  The project was riddled with months of wasted time, poor planning, unrealistic timelines, and a real lack of communication.</p>
<p>The project ended up being ~20 days behind, which is something I consider a slight miracle all things considered. The real tragedy was that the finished program wasn&#8217;t what the business had envisioned, which resulted in 3 additional iterations and, even worse, my manager was demoted due to the project&#8217;s failure. That&#8217;s something that still pisses me off when I think about it.</p>
<p> I came out of the experience learning three key things:</p>
<ol>
<li>Waterfall methodology <i>doesn&#8217;t work</i> <b>at all</b></li>
<li>Large corporate IT departments just aren&#8217;t my cup of tea</li>
<li>I needed a new job</li>
</ol>
</li>
<li><b>Apprenticeship</b>
<p>After the death project, I started taking a serious look at other job opportunities, which led to this <a href="http://twitter.com/ethangunderson/status/1590752762">tweet</a>. That tweet triggered the events leading up to my apprenticeship. Epic win.</p>
</li>
<li><b>Eau Claire Ruby</b>
<p>While I&#8217;m no longer an active member, it was fun helping the group get up and running. It&#8217;s awesome to know that the group is still growing, and may even put on an event soon. If you&#8217;re in the Eau Claire area, make sure to check them <a href="http://ecruby.org">out</a>.</p>
</li>
</ul>
<h2>2010 Goals</h2>
<p>  I&#8217;m a believer that making goals public ends up have a net benefit.  So here are mine:</p>
<ul>
<li><b>Ignitious</b>
<p>The goal is to have <i>some sort</i> of launch by February 1st and have at least one paying customer by the end of the year.  One paying customer will let me know that it solves a problem for at least one person or group.  That&#8217;s a win in my book.</p>
</li>
<li><b>Continuous Learning</b>
<p>I have very little experience in front-end design and development. In an effort to change that, I will be attempting to do all of the UX design and development for Ignitious.</p>
</li>
<li><b>Ruby (on Rails)</b>
<p>It seems everyday I learn of some new helper method in Rails, or a feature of Ruby that I didn&#8217;t know about.  That shit has to end.</p>
</li>
<li><b>Public Speaking</b>
<p>I will speak to at least one user group or code camp this year.  Public speaking is something I&#8217;ve struggled with, so this will be a milestone.</p>
</li>
<li><b>Publication</b>
<p>In my attempt to become a better writer, I will write at least one article for <a href="http://railsmagazine.com/">Rails Magazine</a> (or some other publication), as well as continuing to write more frequently here.</p>
</li>
<li><b>Reading</b>
<p>My <a href="http://jessicaellingson.com/">girlfriend</a> keeps nagging me to read more fiction novels (I only read 2 in 2009). So while not a technical goal, this year I&#8217;ll try and read 6.</p>
</li>
</ul>
<p>So that&#8217;s my year in a nutshell and my goals for next year.<br />
How was your year?<br />
What are your goals?</p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/C99Ojc12JCM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/2009-retrospective-and-2010-goals/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/2009-retrospective-and-2010-goals</feedburner:origLink></item>
		<item>
		<title>Encapsulation With Named Scopes</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/L-aomwL69kE/encapsulation-with-named-scopes</link>
		<comments>http://www.ethangunderson.com/encapsulation-with-named-scopes#comments</comments>
		<pubDate>Mon, 21 Dec 2009 14:30:25 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[code smell]]></category>
		<category><![CDATA[encapsulation]]></category>
		<category><![CDATA[named scope]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=341</guid>
		<description><![CDATA[Named Scopes.  What's not to love?]]></description>
			<content:encoded><![CDATA[<p>While working on <a href="obtiva-apprenticeship-pet-project">Ignitious</a>, I wrote some code that looked something like this:</p>
<pre name="code" class="ruby">
class Commit < ActiveRecord::Base
  has_many :files, :class_name => 'CommitFile'
  has_many :added_files, :class_name => 'CommitFile', :conditions => {:state => 'added'}
  has_many :removed_files, :class_name => 'CommitFile', :conditions => {:state => 'removed'}
  has_many :modified_files, :class_name => 'CommitFile', :conditions => {:state => 'modified'}
end

class CommitFile < ActiveRecord::Base
  belongs_to :commit
end

'Created new records like this:'
Commit.files.create(:name => 'foo', :state => 'added')
</pre>
<p>Then I realized, using named scopes, I could move all state logic into the CommitFile class like so:</p>
<pre name="code" class="ruby">
class Commit < ActiveRecord::Base
  has_many :files, :class_name => 'CommitFile'
end

class CommitFile < ActiveRecord::Base
  belongs_to :commit
  named_scope :added, :conditions => {:state => 'added'}, :order => 'filename'
  named_scope :removed, :conditions => {:state => 'removed'}, :order => 'filename'
  named_scope :modified, :conditions => {:state => 'modified'}, :order => 'filename'
end

'Create new records like this:'
Commit.files.added.new(:name => 'foo')
</pre>
<p>That&#8217;s it!  The Commit class no longer cares about the implementation of the status logic.  It&#8217;s a subtle change, but one that I think will help with future refactorings.</p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/L-aomwL69kE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/encapsulation-with-named-scopes/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/encapsulation-with-named-scopes</feedburner:origLink></item>
		<item>
		<title>Obtiva Apprenticeship: Pet Project</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/v125v7g2B6A/obtiva-apprenticeship-pet-project</link>
		<comments>http://www.ethangunderson.com/obtiva-apprenticeship-pet-project#comments</comments>
		<pubDate>Sun, 20 Dec 2009 15:00:11 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Obtiva Apprenticeship]]></category>
		<category><![CDATA[code review]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[pet project]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=308</guid>
		<description><![CDATA[This is part of a series on my apprenticeship at Obtiva.  The full series can be found here.

A major part of Obtiva&#8217;s Apprenticeship program is the pet project.  So for my project, I&#8217;ve decided to develop an online code review tool.  This is an app that I&#8217;ve wanted to write for awhile [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This is part of a series on my apprenticeship at <a href="http://obtiva.com">Obtiva</a>.  The full series can be found <a href="http://ethangunderson.com/category/obtiva-apprenticeship">here</a>.</em></p></blockquote>
<p><img src="http://www.ethangunderson.com/wp-content/uploads/2009/12/logowhite.png" alt="logowhite" title="logowhite" width="308" height="123" class="aligncenter size-full wp-image-311" /><br />
A major part of Obtiva&#8217;s Apprenticeship program is the pet project.  So for my project, I&#8217;ve decided to develop an online code review tool.  This is an app that I&#8217;ve wanted to write for awhile now, so I&#8217;m thrilled to have the opportunity to do so.<br />
<span id="more-308"></span><br />
Ignitious<em>(ig-nish-us)</em> is an opinionated tool with a couple of goals in mind:</p>
<ul>
<li><strong>Dead simple to use &#8211; </strong>I&#8217;ve made some assumptions on how I think code reviews should be done, this helps trim down on required clicks to do some tasks.</li>
<li><strong>Go from signup to reviewing code as quickly as possible &#8211; </strong>Just register with a username and password and you&#8217;re ready to start reviewing code.  Doesn&#8217;t get any easier than that!</li>
<li><strong>Complete Github integration &#8211; </strong>Uses your <a href="http://github.com">Github</a> username to pull available repositories.  Commit code and a review is created automatically by utilizing Github&#8217;s post receive hook.</li>
<li><strong>Free for open source &#8211; </strong>In the spirit of giving back, any public repository on Github is able to be imported into Ignitious.</li>
</ul>
<p>My goal is to launch a beta on February 1st, so if you would like to be kept in the loop, sign up at <a href="http://ignitious.com"><strong>ignitious.com</strong></a>.</p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/v125v7g2B6A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/obtiva-apprenticeship-pet-project/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/obtiva-apprenticeship-pet-project</feedburner:origLink></item>
		<item>
		<title>Obtiva Apprenticeship: Solutions Discovery</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/gCo6ldwaaxo/obtiva-apprenticeship-solutions-discovery</link>
		<comments>http://www.ethangunderson.com/obtiva-apprenticeship-solutions-discovery#comments</comments>
		<pubDate>Thu, 19 Nov 2009 17:43:23 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Obtiva Apprenticeship]]></category>
		<category><![CDATA[agile planning]]></category>
		<category><![CDATA[clients]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[simple tools]]></category>
		<category><![CDATA[Solutions Discovery]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=281</guid>
		<description><![CDATA[This is part of a series on my apprenticeship at Obtiva.  The full series can be found here.
Earlier this week I sat down with Todd Webb to discuss my pet project (more on that soon).  He put me through a process Obtiva calls &#8220;Solutions Discovery&#8221;.  This is the third time I have [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This is part of a series on my apprenticeship at <a href="http://obtiva.com">Obtiva</a>.  The full series can be found <a href="http://ethangunderson.com/category/obtiva-apprenticeship">here</a>.</em></p></blockquote>
<p>Earlier this week I sat down with <a href="http://toddwebb.wordpress.com/">Todd Webb</a> to discuss my pet project (more on that soon).  He put me through a process Obtiva calls &#8220;Solutions Discovery&#8221;.  This is the third time I have been present in this process, the first two with clients.  I really like this process, I have a feeling past projects would have been significantly easier following something like this.<br />
<span id="more-281"></span><br />
During a Solutions Discovery, Obtiva gets together with a client, over the course of anywhere from half a day to a couple of days, and helps the client define what their business goals are, who their users are, stories for possible iterations, etc.</p>
<p><strong>Simple Tools</strong><br />
The process uses very simple tools that anyone can pick up and start using.  A marker board is used to draw and explain ideas that words may have a hard time with.  Index cards are used to define business goals, user stories, etc.  The best part of the index card?  It&#8217;s an index card!  If it needs to be reprioritized, move it.  If it doesn&#8217;t make sense anymore, rip it up.  </p>
<p><strong>Business Goals</strong><br />
Index cards are used to define what the client considers business goals.  These are then prioritized according to what the client considers important.  I think these can do a really good job of preventing feature creep.  When planning an iteration, it helps guide the client to only including the features that matter to the business goal that is being tackled.  For instance, AJAX effects may be shiny and cool, but will they help you generate revenue?</p>
<p><strong>Personas</strong><br />
Personas are used to describe anyone who the client expects to interact with the product.  They list the whys and the hows of the interaction, and are then prioritized.  This creates a common language for the client and Obtiva to communicate.  Instead of referring to a faceless support analyst, we can say &#8220;Sally Support&#8221;, and everyone in the meeting knows exactly what type of user we are talking about.  These also help during iteration planning.  If it comes down to picking one feature over the other, the client can simply pick the one that satisfies the persona that is prioritized higher.</p>
<p><strong>User Stories</strong><br />
Index cards are used to define user stories for the different personas.  Together, Obtiva and the client list out all of the different ways that a persona would want to interact with the product.  During the process, the index cards can be reprioritized and moved around depending on what new scenarios are uncovered in the process.  </p>
<p>Once everything is layout out, work begins on reaching a minimum viable product, or in other words, what is the minimum that the product has to do before someone will use it.  Stories are stripped out, into what will later be another iteration, until that minimum product is reached.  It&#8217;s really amazing how a giant list of 30 &#8216;need to haves&#8217; can be dwindled down to just a few.</p>
<p>There are a couple of other things that may happen during a Solutions Discovery, like legacy code reviews.  However, this is the meat and potatoes of why I like the process so far.</p>
<p>Here is the, very blurry, result of my Solutions Discovery.  Business goals are the pink cards on the right.  The top cards are stories that will be included in the first release, and the stories pulled to the bottom will be scheduled in subsequent releases.</p>
<p><img src="http://www.ethangunderson.com/wp-content/uploads/2009/11/0_IMAG0120.jpg" alt="0_IMAG0120" title="0_IMAG0120" width="640" height="480" class="aligncenter size-full wp-image-285" /></p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/gCo6ldwaaxo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/obtiva-apprenticeship-solutions-discovery/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/obtiva-apprenticeship-solutions-discovery</feedburner:origLink></item>
		<item>
		<title>Obtiva Apprenticeship: Pair Programming</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/JUN7VmX7tAQ/obtiva-apprenticeship-pair-programming</link>
		<comments>http://www.ethangunderson.com/obtiva-apprenticeship-pair-programming#comments</comments>
		<pubDate>Fri, 13 Nov 2009 05:50:16 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Obtiva Apprenticeship]]></category>
		<category><![CDATA[cubicles]]></category>
		<category><![CDATA[development environment]]></category>
		<category><![CDATA[pair programming]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=228</guid>
		<description><![CDATA[This is part of a series on my apprenticeship at Obtiva.  The full series can be found here.
Over the last couple of days, I&#8217;ve managed to get my hands a little dirty with some client work.  I paired with Sean Iams to add a CSV parser into a client&#8217;s rails application.  I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This is part of a series on my apprenticeship at <a href="http://obtiva.com">Obtiva</a>.  The full series can be found <a href="http://ethangunderson.com/category/obtiva-apprenticeship">here</a>.</em></p></blockquote>
<p>Over the last couple of days, I&#8217;ve managed to get my hands a little dirty with some client work.  I paired with <a href="http://twitter.com/smiams">Sean Iams</a> to add a CSV parser into a client&#8217;s rails application.  I&#8217;ve pair programmed at previous jobs before, but never as productive as this.</p>
<p>Previously, one person would usually be doing all of the coding while the other tried to look at the total scope of what needed to be done.  This works well in theory, but I&#8217;ve found that the other person usually degrades to a human compiler/spell checker after awhile, or worse, stops paying attention all together.<br />
<span id="more-228"></span><br />
<div id="attachment_243" class="wp-caption alignleft" style="width: 216px"><img src="http://www.ethangunderson.com/wp-content/uploads/2009/11/pair-programming-206x300.png" alt="Figure 1" title="pair-programming" width="206" height="300" class="size-medium wp-image-243" /><p class="wp-caption-text">Figure 1</p></div></p>
<p>However, I don&#8217;t think that&#8217;s entirely the fault of the developers.  In a lot of programming environments, each developer is conveniently packed into a cubicle.  So, just let me just say something about cubicles:</p>
<p><b>Cubicles suck, but they really suck for pair programming.</b>  </p>
<p>With a cubicle, your environment dictates how you code.  As you can see by my highly technical diagram to the left, pair programming in a cubicle forces one person to literally take a step back.  How can you be actively involved in collaborating on code if you have to peer over someones shoulder to even see?  I just doesn&#8217;t work.</p>
<p>At the Obtiva Studio, we all sit a together (no half walls or any of that garbage) at long, wide desks.  Perfect for pair programming.  Sean and I were both unfamiliar with the application, so we both needed to be looking at real code, figuring things out.  Our environment didn&#8217;t dictate that this is how it should be done, but it allowed us to do so. </p>
<p>In the end we were able to add this functionality in just a couple of days, much less time than it would have taken me by myself.  Since Sean has a lot more experience with Textmate and OSX, I also got the side benefit of learning several keyboard shortcuts that I wouldn&#8217;t have picked up on in the &#8220;sit back and dink around&#8221; cubicle approach.</p>
<p>I&#8217;m looking forward to more of this in the future.</p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/JUN7VmX7tAQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/obtiva-apprenticeship-pair-programming/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/obtiva-apprenticeship-pair-programming</feedburner:origLink></item>
		<item>
		<title>Obtiva Apprenticeship: Initial Thoughts</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/0jbhGUAVknM/obtiva-apprenticeship-initial-thoughts</link>
		<comments>http://www.ethangunderson.com/obtiva-apprenticeship-initial-thoughts#comments</comments>
		<pubDate>Mon, 09 Nov 2009 02:04:12 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Obtiva Apprenticeship]]></category>
		<category><![CDATA[apprenticeship]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[culture]]></category>
		<category><![CDATA[professional development]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=168</guid>
		<description><![CDATA[This is part of a series on my apprenticeship at Obtiva.  The full series can be found here.
Apprenticeship?
I suppose I should start by explaining what this apprenticeship is all about, so let&#8217;s start from the beginning&#8230; 
I had a relatively stable job, people looked to me for ideas and advice, my opinion was respected. [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em>This is part of a series on my apprenticeship at <a href="http://obtiva.com">Obtiva</a>.  The full series can be found <a href="http://ethangunderson.com/category/obtiva-apprenticeship">here</a>.</em></p></blockquote>
<h1>Apprenticeship?</h1>
<p>I suppose I should start by explaining what this apprenticeship is all about, so let&#8217;s start from the beginning&#8230; </p>
<p>I had a relatively stable job, people looked to me for ideas and advice, my opinion was respected.  And therein lies the problem, I was quickly becoming king (well maybe not king, but higher royalty) of the hill, but I didn&#8217;t feel like I should be at that level.  And worse yet, I was starting to stagnate in my personal learning.<br />
<span id="more-168"></span><br />
So I did something that some said was foolish, I left that position to take on the role as a software apprentice.  A role that places me at the bottom of the proverbial hill, where I am, by leaps and bounds, <a href="http://redsquirrel.com/dave/work/a2j/patterns/BeTheWorst.html">the worst</a>.  </p>
<p>I couldn&#8217;t be happier.</p>
<p>Over the next six months, I&#8217;ll be working at Obtiva as a software apprentice.  Obtiva&#8217;s apprenticeship program takes people who are passionate about software development, someone with lots of potential, but not a whole lot of marketable skills, and guides them into being a software craftsman.</p>
<p>Here&#8217;s an excerpt from Obtiva&#8217;s <a href="http://obtiva.com/careers/software-apprentice/">website</a>:</p>
<blockquote><p>Joining Obtiva as a Software Apprentice means that you&#8217;ll be working shoulder-to-shoulder with experienced Obtiva craftsmen on exciting client projects. A successful apprentice is focused, passionate and hungry for knowledge. Our apprenticeship program has proven that our one-on-one teaching, directed study, and client projects leads to rapid growth in the skills and abilities of our apprentices.</p></blockquote>
<p>The end goal of this apprenticeship is to prove that I have what it takes to be a consultant at Obtiva.  Which, judging from the massive amount of talent they have acquired, I&#8217;ll have my hands full.  I&#8217;ll be working on a variety of things over the next 6 months to get to that point, but there will be an overall pet project that will be used to asses my growth as a developer.  Over the next couple of days I plan to iron out the details of this project, I&#8217;ll be sure to post when that is finalized.</p>
<h1>Change in Culture</h1>
<p>One of the things that has been the hardest to get acclimated to, is the change in culture.  I went from a company that employed thousands of people in all different business aspects, software just happened to be something that needed to be done, much like accounting and janitorial duties.  Don&#8217;t get me wrong, I learned an incredible amount during my time there, but it did leave me wanting more from my place of employment.  Transitioning into a small agile company that not only lives off the software they develop, but is also deeply passionate about it, has been refreshing so far.</p>
<p>One major cultural difference I noted, happens to be something rather insignificant.  At my previous employer, I couldn&#8217;t take a piss or get a drink of water without punching out, so you can imagine my shock when I learned that Obtiva <em>provides</em> soda(!).  It&#8217;s the little things like that which tell employees, &#8220;Hey, you&#8217;re a real person, not just a code producing blob that sits in a chair&#8221;.  </p>
<p>I&#8217;m sure this is a topic that I will revisit a lot over the next six months.  I&#8217;ve always found the ways employers treat their employees and general office culture a fascinating thing to write about.</p>
<h1>Moving Forward</h1>
<p>After writing this post, I&#8217;ve come to the realization that weekly installments may not work as nicely as I thought.  There&#8217;s just too many topics to write about.  Writing about a whole week leaves the post feeling strained and unorganized.  In the future I&#8217;ll probably do several posts with specific topics in mind.</p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/0jbhGUAVknM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/obtiva-apprenticeship-initial-thoughts/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/obtiva-apprenticeship-initial-thoughts</feedburner:origLink></item>
		<item>
		<title>My Laptop Only Development Setup</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/IGOi6boWtyg/my-laptop-only-development-setup</link>
		<comments>http://www.ethangunderson.com/my-laptop-only-development-setup#comments</comments>
		<pubDate>Thu, 15 Oct 2009 03:33:08 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development environment]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=107</guid>
		<description><![CDATA[After reading Kevin&#8217;s two posts on his development setup, I decided that I should chime in with my current setup.  For the last two years, my primary machine has been a laptop.  At first, this wasn&#8217;t by choice.  My custom built desktop bit the dust after 3 years of use, leaving me [...]]]></description>
			<content:encoded><![CDATA[<p>After reading <a href="http://twitter.com/gisikw">Kevin</a>&#8217;s <a href="http://www.kevingisi.com/2009/10/running-on-fumes-why-less-is-more/">two</a> <a href="http://www.kevingisi.com/2009/10/tools-of-the-trade-conservative-edition/">posts</a> on his development setup, I decided that I should chime in with my current setup.  For the last two years, my primary machine has been a laptop.  At first, this wasn&#8217;t by choice.  My custom built desktop bit the dust after 3 years of use, leaving me only with my newly purchased laptop.  At first this was a pain, but it has grown on me to the point that I can&#8217;t even imagine working on a desktop again.<br />
<span id="more-107"></span><br />
Here&#8217;s a quick rundown:</p>
<p><strong>Hardware</strong></p>
<ul>
<li>HP dv2000 Laptop &#8211; $500 Best Buy open box haggle special
<ul>
<li>15.4 inch screen</li>
<li>AMD Turion 64 X2 1.9 GHz</li>
<li>120 GB HDD</li>
<li>3 GB RAM</li>
</ul>
</li>
<li>22&#8243; Acer LCD Monitor &#8211; woot.com is your friend</li>
<li>Microsoft wireless laptop mouse</li>
</ul>
<p><strong>Software</strong></p>
<ul>
<li>Ubuntu &#8211; This is my primary operating system.  A little bloated, but until #! Linux matures a bit, it will do</li>
<li>Windows Vista &#8211; I don&#8217;t care what you all say, I&#8217;ve never had a problem with Vista</li>
<li>Redcar &#8211; <a href="http://redcareditor.com">Redcar</a> aims to be a Textmate like editor for Ubuntu. It&#8217;s got a lot of growing up to do, but I&#8217;m liking it so far</li>
<li>Visual Studio 2008 &#8211; For those times that I need to do some C# work while in Windows, it can&#8217;t be beat</li>
<li>MonoDevelop &#8211; This one is new to my arsenal, but the more time I spend in it, the more I enjoy it</li>
<li>Firefox &#8211; The one area that I&#8217;m not a minimalist.  I couldn&#8217;t live without my hundreds of extensions</li>
</ul>
<p><strong>Hosting</strong></p>
<ul>
<li>ZenSix &#8211; Dirt cheap hosting for static web sites</li>
<li>SliceHost &#8211; Great VPS providers with a ton of tutorials for setting up a server (I need all the help I can get in that area)</li>
</ul>
<p>As you can see, my hardware setup is very minimal.  I would say 70% of the time I don&#8217;t even have my external monitor or wireless mouse hooked up.  I love the flexibility this gives me.  It&#8217;s no longer a hassle to go down to the local coffee house to work, just grab the laptop and go.  Downtime waiting for a plane?  No problem, just pull out the laptop and it&#8217;s the same as if I were at home.</p>
<p>Granted this setup isn&#8217;t for everyone, but I think it will be awhile before I find the need for a desktop again.</p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/IGOi6boWtyg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/my-laptop-only-development-setup/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/my-laptop-only-development-setup</feedburner:origLink></item>
		<item>
		<title>A Craftsman’s Bookshelf: The Passionate Programmer</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/-ETwdJLVPW0/a-craftsmans-bookshelf-the-passionate-programmer</link>
		<comments>http://www.ethangunderson.com/a-craftsmans-bookshelf-the-passionate-programmer#comments</comments>
		<pubDate>Thu, 15 Oct 2009 02:41:28 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[A Craftsman's Bookshelf]]></category>
		<category><![CDATA[book review]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[professional development]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=77</guid>
		<description><![CDATA[
I just finished reading The Passionate Programmer*, and it is already one of my favorite programming books.  The Passionate Programmer is a great set of guidelines that is a must read for anyone looking to cultivate an awesome career in software development.

While I was pleasantly surprised to see that most of the guidelines described [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/1934356344?ie=UTF8&#038;tag=memoofasoftap-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=1934356344"><img alt="" src="https://images-na.ssl-images-amazon.com/images/I/41fyjTVARFL._SL160_.jpg" class="alignleft" width="106" height="160" style="border: 2px solid black" /></a></p>
<p>I just finished reading <a href="http://www.amazon.com/gp/product/1934356344?ie=UTF8&#038;tag=memoofasoftap-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=1934356344">The Passionate Programmer</a>*, and it is already one of my favorite programming books.  The Passionate Programmer is a great set of guidelines that is <strong>a must read for anyone looking to cultivate an awesome career in software development.</strong><br />
<span id="more-77"></span><br />
While I was pleasantly surprised to see that most of the guidelines described are things that I just instinctively do, it kind of shocked me that they needed to be listed at all.  Things like practicing your craft and choosing what language/platform to specialize in seems like it should be common sense.  With that being said, I think that Chad Fowler does an excellent job of outlining a path from turning your job into a career using a mix of real life stories (like the origin story of <a href="http://github.com">Github</a>) and practical advice (like not investing entirely on one platform).  </p>
<p>I really enjoyed the &#8220;Act on it!&#8221; sections at the end of each chapter.  They provide ways to take the advice and guidelines from the chapter and apply it to your daily life almost instantly.  I think this fills a gap that a lot of other books miss.  Without being able to clearly see a way to apply what they&#8217;re reading to their daily lives, I think a lot of readers get lost in the warm fuzzy feeling they get when reading about how great they <em>will</em> be.</p>
<p>My only criticism is that some of the chapters do seem to be lacking, specifically the &#8220;Make Yourself a Map&#8221; chapter.  The chapter explains why you should create yourself a map to the career you wish to have.  The only issue is that he doesn&#8217;t explain how to create this map.  Maybe it&#8217;s my lack of creativity, but I can&#8217;t envision how this map should look, so an example would have been nice.</p>
<p><small><em>*Yes, the Amazon link is a referral link.  Any revenue generated will be used to fund various user groups, code camps and open source projects that catch my attention.</em></small></p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/-ETwdJLVPW0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/a-craftsmans-bookshelf-the-passionate-programmer/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/a-craftsmans-bookshelf-the-passionate-programmer</feedburner:origLink></item>
	</channel>
</rss>
