<?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>Mon, 10 May 2010 06:17:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<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>Obtiva Apprenticeship: Finish</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/O-VW8NqDWjY/obtiva-apprenticeship-finish</link>
		<comments>http://www.ethangunderson.com/obtiva-apprenticeship-finish#comments</comments>
		<pubDate>Mon, 10 May 2010 06:17:33 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Obtiva Apprenticeship]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=517</guid>
		<description><![CDATA[I&#8217;ll be the first to admit that I&#8217;ve been pretty terrible at keeping this blog up to date, but despite that, my formal apprenticeship is officially over. It&#8217;s been a really fun, and exhausting six months. I&#8217;ve had the opportunity to work, and live, with a lot of really smart, awesome people. People like Ryan [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll be the first to admit that I&#8217;ve been pretty terrible at keeping this blog up to date, but despite that, my formal apprenticeship is officially over. </p>
<p>It&#8217;s been a really fun, and exhausting six months. I&#8217;ve had the opportunity to work, and live, with a lot of really smart, awesome people. People like Ryan Briones (who I owe a lot of the success of my apprenticeship to), Joe Banks, Chad Pry and Dave Hoover all made a tremendous impact on my experience as an apprentice. Obtiva does a really good job of providing their apprentices with everything they need to be successful, surrounding them with excellent people is no exception.</p>
<p>I managed to accomplish quite a bit too. I developed and launched a beta of my first rails <a href="http://ignitious.com">app</a>, became way more involved with the community, will be published in Rails Magazine, worked on client projects like <a href="http://madmimi.com">Madmimi</a> and <a href="http://eventwax.com">Eventwax</a>, committed to <a href="http://rspec.info/">RSpec</a>, released some open source projects of my <a href="http://github.com/ethangunderson">own</a>, and started a <a href="http://chicagodb.com">user group</a>.</p>
<p>To wrap up the apprenticeship, I had my final milestone on the 27th of April. It started with an overview of Ignitious, looking at the interface, talking about the features, and what I plan to do with it in the future. From there we took a look at the code, the good and the bad. We spent some time looking at the tests, and where I need to refactor some ugly code.</p>
<p>After that I gave a presentation on an overview of things that I&#8217;ve learned while developing Rails applications (and some things that I&#8217;ve re-learned). Going into the milestone, I wasn&#8217;t too happy with the presentation, but it went a lot better than expected. I&#8217;ll be taking the feedback I got on it, and giving it again at a future Geekfest, and maybe at a local user group as well.</p>
<p>Overall I thought the milestone went really well. I got some good feedback on areas that I excelled at, and more importantly the areas that need improving. Apparently I wasn&#8217;t the only one who thought it went well either, because after everything was said and done, I was made a job offer to become a Developer at Obtiva.</p>
<p>So, while my formal apprenticeship may be over, I realize I have a long ways before I&#8217;ll ever consider myself passed the level of apprentice. In closing, I&#8217;ll leave you with a series of tweets that got me where I am today:</p>
<div style="text-align: center;">
  <img src="http://img.skitch.com/20100507-8fmtnnh839dpypaphmse9shb9d.jpg" alt="" /></p>
<p>  <img src="http://img.skitch.com/20100507-nsit63ug7jsfccybqcaseegy5p.jpg" alt="" /></p>
<p>  <img src="http://img.skitch.com/20100507-nn1yxpiq58y8yh7dtw9jf4h9qa.jpg" alt="" />
</div>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/O-VW8NqDWjY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/obtiva-apprenticeship-finish/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/obtiva-apprenticeship-finish</feedburner:origLink></item>
		<item>
		<title>Skimming the Fat from Your Product</title>
		<link>http://feedproxy.google.com/~r/MemoirsOfASoftwareApprentice/~3/ZTM3KOFWOHU/skimming-the-fat-from-your-product</link>
		<comments>http://www.ethangunderson.com/skimming-the-fat-from-your-product#comments</comments>
		<pubDate>Mon, 15 Mar 2010 13:00:23 +0000</pubDate>
		<dc:creator>Ethan Gunderson</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[competitive advantage]]></category>
		<category><![CDATA[mvp]]></category>
		<category><![CDATA[product development]]></category>

		<guid isPermaLink="false">http://www.ethangunderson.com/?p=487</guid>
		<description><![CDATA[When I first started building Ignitious, I thought I had a pretty slimed down Minimal Viable Product. Users would be able to create accounts, add repositories to be tracked, manage those repositories, review code. This was completely wrong. I spent a ton of time architecting how the system would manage repositories. While this feature does [...]]]></description>
			<content:encoded><![CDATA[<p>When I first started building <a href="http://ignitious.com">Ignitious</a>, I thought I had a pretty slimed down <a href="http://en.wikipedia.org/wiki/Minimum_viable_product">Minimal Viable Product</a>. Users would be able to create accounts, add repositories to be tracked, manage those repositories, review code.</p>
<p><strong>This was completely wrong.</strong></p>
<p>I spent a ton of time architecting how the system would manage repositories. While this feature does add business value, it isn&#8217;t unique, it offers no competitive advantage over other code review tools. My time would have been much better spent polishing the actual review process.</p>
<p>In hindsight, I should have only allowed for single files to be reviewed, either by uploading or copy paste. This would have let me focus on the review process, and add repositories later down the road.  The application would have ended up being the same (more or less), it just would have arrived on a different path. Hindsight is always 20/20 though, right? <img src='http://www.ethangunderson.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';)' class='wp-smiley' /> It&#8217;s obviously too late for this product, but I think it was a very important lesson to learn first hand. </p>
<p>It&#8217;s far too easy to fall in love with features, blinding you to what is necessary and what is fat. Next time you find yourself spending a lot of time on a feature, ask yourself, does this add business value? Does this give me a competitive advantage? If not, skim it. You can always add the feature later in the product life cycle, but leave it out of the initial version. You&#8217;ll be better off.</p>
<img src="http://feeds.feedburner.com/~r/MemoirsOfASoftwareApprentice/~4/ZTM3KOFWOHU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ethangunderson.com/skimming-the-fat-from-your-product/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.ethangunderson.com/skimming-the-fat-from-your-product</feedburner:origLink></item>
		<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 [...]]]></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 [...]]]></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 now, so [...]]]></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 been present [...]]]></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 pair programmed [...]]]></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 [...]]]></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>
	</channel>
</rss>
