<?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>Doodlehaüs</title>
	
	<link>http://www.doodlehaus.com</link>
	<description />
	<lastBuildDate>Sat, 15 Dec 2012 22:27:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Doodlehaus" /><feedburner:info uri="doodlehaus" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Doodlehaus</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Getting started with BDD, a 1Up Adventure</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/UjEZ0Szg6Sg/</link>
		<comments>http://www.doodlehaus.com/1up-project/getting-started-with-bdd-a-1up-adventure/#comments</comments>
		<pubDate>Sat, 15 Dec 2012 22:08:32 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[1up Project]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[RSpec]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117709</guid>
		<description><![CDATA[Over the past month and half I&#8217;ve been working hard on my TDD skills. Having come from a learn-as-you-go web development background (as a lot of web developers have) I&#8217;ve found the transition to a test-first workflow to be a real challenge. Luckily, I work with a great group of Rubyists and Madison, Wisconsin has [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.doodlehaus.com/1up-project/getting-started-with-bdd-a-1up-adventure/attachment/rspec/" rel="attachment wp-att-117710"><img class="alignnone size-full wp-image-117710" alt="" src="http://www.doodlehaus.com/wp-content/uploads/2012/12/rspec.png" width="500" height="500" /></a></p>
<p>Over the past month and half I&#8217;ve been working hard on my TDD skills. Having come from a learn-as-you-go web development background (as a lot of web developers have) I&#8217;ve found the transition to a test-first workflow to be a real challenge. Luckily, I work with a great group of Rubyists and Madison, Wisconsin has a great Ruby community.</p>
<p><strong>First step: RTFM (or RTFB, in this case)</strong><br />
RSpec is central to my everyday workflow. I work in a Ruby shop and have the luxury of working with people who have already mastered this stuff. While this is great, it also means that most of my experience with RSpec up until now has been with maintaining and extending a test suite, not starting from scratch and driving out features.</p>
<p>To begin my study of RSpec, I picked up the <a href="http://pragprog.com/book/achbd/the-rspec-book">RSpec Book (David Chelimsky)</a>, which is really more of a TDD/BDD book than it is purely RSpec. It does a fantastic job of covering the BDD development cycle and it&#8217;s more of a conicidence that the samples are in Ruby.</p>
<p>The cycle is described as follows:</p>
<ol>
<li>Focus on one scenario (Cucumber)</li>
<li>Red: Write a failing step definition (Cucumber)</li>
<li>Red: Write a failing example (RSpec)</li>
<li>Green: Write code to make the example in #3 pass (RSpec)</li>
<li>Refactor: Refactor your code, ensure your tests continue to pass (RSpec)</li>
<li>Return to Step #2 and continue to through your step definitions until all are passing</li>
<li>Refactor: Refactor your code, keeping both RSpec and Cucumber test suites passing</li>
</ol>
<p>The RSpec Book is worth the money on the merit of its coverage of the BDD cycle alone. I also appreciated that the author, David Chelimsky, chose to use a command-line application as the central example rather than a web app. While Rails is a great framework, I&#8217;m discovering that if you&#8217;re not careful to ground yourself in Ruby fundamentals, you can easily lose your way in the conveniences of the framework and write a lot of bad code. The command-line app gets back to basics and helps liberate the user from having to worry about browsers, databases and servers for awhile and focus on the code itself.</p>
<p><strong>More complex example: Conway&#8217;s Game of Life</strong><br />
The next step in my process was to apply it to test-driving Conway&#8217;s Game of Life. <a href="http://en.wikipedia.org/wiki/Conway's_Game_of_Life">Conway&#8217;s Game of Life</a> is a classic programming exercise used to demonstrate object oriented programming techniques. As I began working on the problem, I was stumped. As I mentioned earlier, most of my experience is in maintaining a mature test suite. This means that much of the infrastructure and helpers have been defined. This was a brand new endeavor: new project, empty test suite and an unfamiliar topic. It was the programming equivalent of writer&#8217;s block.</p>
<p>To get unstuck, I did some searching to see if there were any solutions to this problem that I could study. As luck would have it, there is a great screen cast of <a href="http://vimeo.com/31403388">Ryan Bigg tackling Conway&#8217;s Game of Life using RSpec and Ruby</a>. I watched the video a couple times and was <a href="https://github.com/doodlehaus/game_of_life">able to implement all four rules</a> after getting a feel for how a master approaches TDD.</p>
<p><strong>Global Day of Code Retreat</strong><br />
While it did feel good to get Game of Life functioning, I felt like I had cheated by watching someone else implement the first rule. As luck would have it, I was able to get a ton more practice at the <a href="http://globalday.coderetreat.org/">Global Day of Code Retreat</a>.</p>
<p>The Global Day of Code Retreat, held on December 7th, was a collection of local events around the world where programmers worked together along with a facilitator to practice BDD on (you guessed it) Conway&#8217;s Game of Life. After each 45 minute session, you trash your code. It&#8217;s not about the result, but about putting the principles of BDD into practice. After hacking at the Game of Life from 9am to about 4pm, I learned a valuable lesson: BDD is <a href="http://www.youtube.com/watch?v=frsId3goYYE">about practice</a>.</p>
<p>That&#8217;s all there is to it. I&#8217;m not going to get it all at once. It&#8217;s an approach and an attitude, not a silver bullet. After studying RSpec for a month and a half, I&#8217;ve learned that I&#8217;ll be studying RSpec, or more specifically BDD, for the rest of my career. And that&#8217;s fine by me.</p>
<p><strong>About the 1up Project<br />
</strong><em>The <a href="http://1up.begriffs.com/">1up Project</a> is the brain-child of Joe Nelson. It is a self-directed program of personal-improvement where the participants choose specific topics, study them over a discrete period of time while applying the knowledge gained to a specific project, presentation or blog post.</em></p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2F1up-project%2Fgetting-started-with-bdd-a-1up-adventure%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/UjEZ0Szg6Sg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/1up-project/getting-started-with-bdd-a-1up-adventure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/1up-project/getting-started-with-bdd-a-1up-adventure/</feedburner:origLink></item>
		<item>
		<title>Metaprogramming and the Ruby Object Model</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/LOzmvtZB830/</link>
		<comments>http://www.doodlehaus.com/1up-project/metaprogramming-and-the-ruby-object-model/#comments</comments>
		<pubDate>Fri, 26 Oct 2012 00:18:41 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[1up Project]]></category>
		<category><![CDATA[1up]]></category>
		<category><![CDATA[metaprogramming]]></category>
		<category><![CDATA[Pragmatic Programmers]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117707</guid>
		<description><![CDATA[Having spent the last couple weeks reviewing Pragmatic Programmer&#8217;s screencasts on metaprogramming and the Ruby object model, I discovered one thing for certain. I shouldn&#8217;t be doing any metaprogramming any time soon. It&#8217;s a tricksy endeavor frought with peril, even for seasoned Rubyists. I kind of had a feeling that would be my conclusion based [...]]]></description>
				<content:encoded><![CDATA[<p>Having spent the last couple weeks reviewing <a href="http://pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming">Pragmatic Programmer&#8217;s screencasts on metaprogramming and the Ruby object model</a>, I discovered one thing for certain. I shouldn&#8217;t be doing any metaprogramming any time soon. It&#8217;s a tricksy endeavor frought with peril, even for seasoned Rubyists.</p>
<p>I kind of had a feeling that would be my conclusion based on hearing <a href="http://www.youtube.com/watch?v=pv-DvWQtXvo&amp;feature=share&amp;list=PLE7tQUdRKcyaYfWFMPex97EXoYt7uKq9-">this talk at Madison Ruby by Paolo Perrotta</a>, the guy who wrote <a href="http://pragprog.com/book/ppmetr/metaprogramming-ruby">the book on metaprogramming</a>. In the talk, he shows just how tricky metaprogramming can make your code.</p>
<p>Essentially, because metaprogramming is code that writes code, you can end up with a codebase that has hidden &#8220;gotcha&#8221; methods that are created as if by magic. This often conceals what is actually going on, makes the code hard to read, hard to debug and hard to extend or modify.</p>
<p>Definitely an endeavor left to someone who&#8217;s a bit more of an expert than me.</p>
<p>That&#8217;s not to say that I didn&#8217;t learn anything. Quite the contrary. The series starts with a great overview of the Ruby object model, the call chain for methods, inheritance versus mixins, singleton methods and a whole slew of other great stuff.</p>
<p>I plan to cover a couple of these topics here, but as a note to the reader, a lot more has been written on these topics by people infinitely smarter than me. My coverage of the topics here is intended to be more of an exercise of completion of the section of my 1up project than an attempt at a definitive screed on the subject.</p>
<p><strong>The Call Chain</strong><br />
When you call a method in Ruby, the interpreter looks for the definition of that method in the object that maps to &#8216;self&#8217; in the current context, if that method doesn&#8217;t exist on self, Ruby moves &#8220;up the chain&#8221; and checks self&#8217;s parent class, and so on until it runs out of parent classes. Here&#8217;s an example:</p>
<pre class="wp-code-highlight prettyprint"># define a specific string
my_string = &amp;quot;I&amp;#039;m a string!&amp;quot;
# call #reverse
# 1) this first checks to see if my_string has a method called reverse
# 2) it doesn&amp;#039;t find one
# 3) it then checks for reverse on my_string&amp;#039;s parent class, which is String
# 4) it finds the method and executes it and outputs the following:
my_string.reverse
=&amp;gt; &amp;quot;!gnirts a m&amp;#039;I&amp;quot;

# if we define a singleton method on my_string like so:
def my_string.reverse
  &amp;quot;I&amp;#039;m overriding .reverse&amp;quot;
end
# and then call .reverse on my_string
my_string.reverse
# we get the result of the new method and not that of
# the default behavior of String

my_string.reverse
=&amp;gt; &amp;quot;I&amp;#039;m overriding .reverse&amp;quot;</pre>
<p>This concept becomes important in metaprogramming because the Ruby interpreter has several &#8220;hooks&#8221; for methods, classes and modules, marshalling and coercion that can be used to execute code that extends Ruby&#8217;s functionality. When you use these hooks, you need to be sure where exactly which member of the call chain you&#8217;re attaching your meta-functionality to. For example, in the screencasts, Dave Thomas demonstrates how to attach console tracing to methods by using the <strong>method_added</strong> hook. It&#8217;s really impressive to watch him implement the code, but there are a lot of nuances that he has to work around. A list of all these hook methods can be found here: <a href="http://stackoverflow.com/questions/5127819/is-this-a-comprehensive-list-of-ruby-hook-methods">http://stackoverflow.com/questions/5127819/is-this-a-comprehensive-list-of-ruby-hook-methods</a>.</p>
<p>One of the more well-known uses of these hooks is to use the method_missing hook to create the semantically-rich find_by_xxxx methods in Active Record where xxxx is a model attribute that is essentially a column in a database. (I sure hope I said that right)</p>
<p><strong>You must realize the truth: there are no class methods</strong><br />
Another interesting tidbit that stuck with me was this: class methods are really nothing all that special. In actuality class methods are really just singleton methods on a Class object. The following two examples are essentially the same:</p>
<pre class="wp-code-highlight prettyprint">class Foo
  def self.bar
    puts &amp;quot;I&amp;#039;m at the bar!&amp;quot;
  end
end

# is essentially the same as
Foo = Class.new 
def Foo.bar
  puts &amp;quot;I&amp;#039;m at the bar!&amp;quot;
end</pre>
<p>While this kind of prototype-based development is valid, it&#8217;s not typical Ruby style. The screencast advised that that type of idiom is more prevalent in Javascript, so I&#8217;m going to squirrel that knowledge away for my future 1up investigations into Javascript and it&#8217;s popular libraries like jQuery, Backbone, etc.</p>
<p>I&#8217;m sure there was a ton of information in these screencasts that just didn&#8217;t stick. It&#8217;s my hope that I&#8217;ll learn more on subsequent viewings and more practice. I&#8217;d definitely recommend them to anyone who wants to learn more about the Ruby object model and how important it is to have a deep understanding of those concepts before embarking on any metaprogramming adventures.</p>
<p>Also, if I&#8217;ve made any egregious errors in my explanation of concepts above, please let me know. I really want to keep this stuff straight in my head.</p>
<p>For my next topic, I&#8217;m going to tackle Test Driven Design (TDD) with Ruby and Rspec in an effort to write cleaner, better-designed code. I&#8217;m always amazed when I watch some of the giants in the industry sit down and drive out features and functionality with TDD, and I&#8217;m looking forward to a lot of practice.</p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2F1up-project%2Fmetaprogramming-and-the-ruby-object-model%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/LOzmvtZB830" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/1up-project/metaprogramming-and-the-ruby-object-model/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/1up-project/metaprogramming-and-the-ruby-object-model/</feedburner:origLink></item>
		<item>
		<title>The End of Learn Ruby the Hard Way</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/E3yMyyYkS-0/</link>
		<comments>http://www.doodlehaus.com/1up-project/the-end-of-learn-ruby-the-hard-way/#comments</comments>
		<pubDate>Sat, 13 Oct 2012 14:00:35 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[1up Project]]></category>
		<category><![CDATA[1up]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117705</guid>
		<description><![CDATA[I&#8217;m finished with Learn Ruby the Hard Way. It took me way longer than I thought it would. All in all, it was a really great overview of the Ruby language, test-driven development, and project organization. I found Chapter 37 to be one of the more valuable in the course. It&#8217;s simple enough: go through [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m finished with <a href="http://ruby.learncodethehardway.org/book/">Learn Ruby the Hard Way</a>. It took me way longer than I thought it would. All in all, it was a really great overview of the Ruby language, test-driven development, and project organization.</p>
<p>I found <a href="http://ruby.learncodethehardway.org/book/ex37.html">Chapter 37</a> to be one of the more valuable in the course. It&#8217;s simple enough: go through a few dozen of Ruby&#8217;s symbols and keywords, guess at what they do, look up what they really do, then write some code that shows what they do. While this may sound tedious to some, I found it incredibly valuable to get a better grounding in the Ruby toolbox and a reminder to spend time studying the entirety of the languages I use instead of just nibbling around the edges.</p>
<p>The course involves a good deal of repetition. Revisiting concepts and projects throughout to help drive home the fundamentals of the language. Practice and drilling on fundamentals is something that you don&#8217;t always hear about when people talk about learning to program, but it&#8217;s probably the best way to learn. Like the 10,000 hour rule says: if you want to master something you just have to do it. A lot.</p>
<p>One of the the aspects of the course that didn&#8217;t resonate with me was that the larger exercises focused on creating games of one sort of another. I had a difficult time dreaming up a text-based &#8220;you&#8217;re in a hallway with a door in front of you&#8221; type of game.</p>
<p>Luckily, my office has a mostly-weekly Ruby quiz. One of the challenges was to develop a blackjack program and it coincided nicely with one of the game development chapters. I was excited to dive in and began making good progress. As I implemented rules, the card deck, and other aspects of the game, I discovered something. My code was a mess. Blech. There were instance variables all over the place, methods that did all kinds of different things&#8230;an unmitigated disaster. But it ran!</p>
<p>Great, so I had basically created the AMC Pacer of blackjack programs, the Spruce Goose of Ruby scripts. When it came time to show my code, I told everyone how dissatisfiled I was with the way it turned out. Thankfully, I work with a supportive group of people (MINiSWAN) who had a lot of great suggestions. The most useful feedback I got was the following: &#8220;your code works, but it&#8217;s not clean.&#8221;</p>
<p>So, I&#8217;ve got some things to add to my research list: <a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">SOLID principles</a> and <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=pd_bxgy_b_img_y">Clean Code, by Kent Beck</a>. I hope to return to my blackjack trainwreck and fix it after some practice with these concepts.</p>
<p>It&#8217;s clear that my study of Ruby as a language will take me longer than one month. I had a feeling when I set out to cover a different topic every month that some would probably spill well over that limit. In those cases, I can either &#8220;call it&#8221; and move on or take the extra time, depending on the situation.</p>
<p>In this case, I feel it&#8217;s well worth it to stick with my study of Ruby for at least another month. The next topic I plan to cover is <a href="http://pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming">Pragmatic Programmer&#8217;s screencasts on metaprogramming and the Ruby object model</a>. I&#8217;ve watched a few of these already and I&#8217;m looking forward to going through the rest.</p>
<p>Special thanks to <a href="http://1up.begriffs.com/">Joe Nelson</a> for sending me a virtual pants-kick via Twitter.</p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2F1up-project%2Fthe-end-of-learn-ruby-the-hard-way%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/E3yMyyYkS-0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/1up-project/the-end-of-learn-ruby-the-hard-way/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/1up-project/the-end-of-learn-ruby-the-hard-way/</feedburner:origLink></item>
		<item>
		<title>Learn Ruby the Hard Way – the Halfway Point</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/INGen5htKAU/</link>
		<comments>http://www.doodlehaus.com/1up-project/learn-ruby-the-hard-way-the-halfway-point/#comments</comments>
		<pubDate>Fri, 31 Aug 2012 02:23:10 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[1up Project]]></category>
		<category><![CDATA[1up]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[string interpolation]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117700</guid>
		<description><![CDATA[I&#8217;ve been plugging away at Zed Shaw&#8217;s Learn Ruby the Hard Way and made it to the half-way point tonight. So far, so good. I haven&#8217;t discovered anything earth-shattering just yet. I think the biggest thing that&#8217;s stood out for me thus far is an idiom of string substitution I&#8217;ve not seen before. It involves [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been plugging away at <a title="Learn Ruby the Hard Way, Zed Shaw" href="http://ruby.learncodethehardway.org/book/">Zed Shaw&#8217;s Learn Ruby the Hard Way</a> and made it to the <a href="https://github.com/doodlehaus/1up/tree/master/ruby/ltcthw">half-way point tonight</a>. So far, so good. I haven&#8217;t discovered anything earth-shattering just yet.</p>
<p>I think the biggest thing that&#8217;s stood out for me thus far is an idiom of string substitution I&#8217;ve not seen before. It involves leaving %s or %d within a string and then listing the values to be substituted into the string after closing the string. See the example below:</p>
<pre class="wp-code-highlight prettyprint">
# string substitution
puts &amp;quot;We&amp;#039;d have %s beans, %s jars, and %s crates.&amp;quot; % [jelly_beans, jars, crates]
 
</pre>
<p>Aside from that, I&#8217;m happy to report that nothing has surprised me. I&#8217;m hoping to finish this off this weekend. I realize that I&#8217;m taking a faster pace than is outlined on the site, but I&#8217;ve got quite a few Ruby resources to get through over the next month. If I hit a snag, I&#8217;ll slow down and take the time I need, but for now it&#8217;s full speed ahead.</p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2F1up-project%2Flearn-ruby-the-hard-way-the-halfway-point%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/INGen5htKAU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/1up-project/learn-ruby-the-hard-way-the-halfway-point/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/1up-project/learn-ruby-the-hard-way-the-halfway-point/</feedburner:origLink></item>
		<item>
		<title>The 1-Up Project, Player 2</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/fizQ-0EeEYI/</link>
		<comments>http://www.doodlehaus.com/1up-project/the-1-up-project-player-2/#comments</comments>
		<pubDate>Wed, 29 Aug 2012 00:08:16 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[1up Project]]></category>
		<category><![CDATA[1up]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[self-study]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117698</guid>
		<description><![CDATA[Earlier this summer, Joe Nelson embarked on a quest to become a world-class developer over the course of one year. He calls it his &#8220;1up Project&#8220;. The approach is 2-week iterations of concentrated study on a variety of topics ranging from the HTML5 Canvas to PPC advertising. Each 2-week sprint culminates with a blog post, [...]]]></description>
				<content:encoded><![CDATA[<div id="attachment_117699" class="wp-caption alignnone" style="width: 580px"><a href="http://www.doodlehaus.com/wp-content/uploads/2012/08/20120828_132335.jpg"><img class="size-large wp-image-117699" title="1-up Mind Map" src="http://www.doodlehaus.com/wp-content/uploads/2012/08/20120828_132335-e1346198432746-768x1024.jpg" alt="Plotting my course of study" width="570" height="760" /></a><p class="wp-caption-text">Plotting my course of study for the next year</p></div>
<p>Earlier this summer, <a title="Joe Nelson" href="http://begriffs.com/">Joe Nelson</a> embarked on a quest to become a world-class developer over the course of one year. He calls it his &#8220;<a title="Joe Nelson's 1up Project" href="http://1up.begriffs.com/">1up Project</a>&#8220;. The approach is 2-week iterations of concentrated study on a variety of topics ranging from the HTML5 Canvas to PPC advertising. Each 2-week sprint culminates with a blog post, lighting talk or some other form of knowledge transfer. Learning a topic with the intent of teaching is a great way to truly absorb a subject.</p>
<p>After attending this year&#8217;s <a href="http://madisonruby.org/">Madison Ruby Conference</a>, seeing Joe present his 1-up project and being inspired to level up my own development skills by <a title="2012 Madison Ruby speaker list" href="http://madisonruby.org/speakers">some of the sharpest minds of the Ruby community</a>, I&#8217;ve compiled a list of topics that I want to cover over the next year.</p>
<p>My ambition is not as lofty as Joe&#8217;s. I&#8217;m not sure I can hit world-class developer in a year. Since I&#8217;ve only recently begun working full-time as a Ruby developer, I still need to cement many fundamental concepts and tools of open source development that Joe already has in his toolbelt before I can walk his path.</p>
<p>Given that some of these topics are very broad, I plan to devote a month (or more in come cases) to each topic. I do still intend on developing a blog post after completing each phase of the course with the intent of documenting my path.</p>
<p>I started by mind-mapping the skills that I&#8217;ve observed seasoned developers using as I pair with them at work. From that map, I developed a list of 8 broad topics and then identified resources within each topic that I will use in my course of study. Here is my <a title="Mark Anderson's 1up project" href="https://github.com/doodlehaus/1up">1up list</a>:</p>
<p>* Ruby (gotta start with the basics)<br />
* Rails<br />
* Testing<br />
* Javascript<br />
* Git<br />
* Rails deployment<br />
* Databases<br />
* The *nix shell<br />
* Vim<br />
* And some miscellaneous topics.</p>
<p>So there you have it. Probably a year&#8217;s worth of self-guided study to begin a move towards craftsmanship. For my very first topic, Ruby, I&#8217;m going to go back to the very basics and run through <a title="Learn Ruby the Hard Way, Zed Shaw" href="http://ruby.learncodethehardway.org/">Zed Shaw&#8217;s Learn Ruby the Hard Way</a>. I&#8217;ll let you know how it goes!</p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2F1up-project%2Fthe-1-up-project-player-2%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/fizQ-0EeEYI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/1up-project/the-1-up-project-player-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/1up-project/the-1-up-project-player-2/</feedburner:origLink></item>
		<item>
		<title>Go to UXMad. Seriously. It’s gonna be awesome.</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/8WhMRyvQ4OU/</link>
		<comments>http://www.doodlehaus.com/culture/go-to-uxmad-seriously-its-gonna-be-awesome/#comments</comments>
		<pubDate>Sat, 07 Jul 2012 16:33:44 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Doodle]]></category>
		<category><![CDATA[UXMad]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117690</guid>
		<description><![CDATA[UXMad is coming. Some of the greatest minds in User Experience will be descending on the Overture Center in Madison, Wisconsin on July 19 through the 21st. If your product, application or service has any room for improvement you owe it to yourself to attend. The conference is single-track, so you won&#8217;t miss a thing. [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.doodlehaus.com/wp-content/uploads/2012/07/Page_11.png"><img class="alignnone size-full wp-image-117692" title="Spot the UX Pro" src="http://www.doodlehaus.com/wp-content/uploads/2012/07/Page_11.png" alt="Spot the UX Pro" width="624" height="500" /></a></p>
<p><a title="UXMad, July 19-21, 2012" href="http://uxmad.com/" target="_blank">UXMad is coming</a>. Some of the greatest minds in User Experience will be descending on the Overture Center in Madison, Wisconsin on July 19 through the 21st. If your product, application or service has any room for improvement you owe it to yourself to attend.</p>
<p>The conference is single-track, so you won&#8217;t miss a thing. It&#8217;s put together by the same folks who organize <a href="http://madisonruby.org/">Madison Ruby</a>, which was mind-meltingly awesome last year and promises to be again this summer. There are <a title="UXMad speakers" href="http://uxmad.com/speakers" target="_blank">twenty-one sessions from some of the smartest folks in UX</a>, with backgrounds ranging from application development to healthcare to the music industry. That&#8217;s a whole lotta smart to pack into one conference.</p>
<p>Conference aside, Madison is a great city to visit. Lakes, restaurants, the University of Wisconsin, an abundance of craft beer and legions of smart, friendly people make Madison a great place to visit (or live, for that matter).</p>
<p>So, there you have it. There&#8217;s still time to register. If you don&#8217;t come, I&#8217;m totally not inviting you to my birthday party. Details are at <a href="http://uxmad.com/" target="_blank">UXMad.com</a>.</p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2Fculture%2Fgo-to-uxmad-seriously-its-gonna-be-awesome%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/8WhMRyvQ4OU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/culture/go-to-uxmad-seriously-its-gonna-be-awesome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/culture/go-to-uxmad-seriously-its-gonna-be-awesome/</feedburner:origLink></item>
		<item>
		<title>Priorities</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/lDU9pjsqV3E/</link>
		<comments>http://www.doodlehaus.com/doodle/priorities/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 17:01:51 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[Doodle]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117686</guid>
		<description><![CDATA[A quick reminder on a Friday: nobody&#8217;s dying words are &#8220;I wish I had spent more time at the office.&#8221;]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.doodlehaus.com/wp-content/uploads/2012/01/alien-powerpoints.png"><img class="alignnone size-full wp-image-117687" title="Priorities" src="http://www.doodlehaus.com/wp-content/uploads/2012/01/alien-powerpoints.png" alt="" width="500" height="295" /></a></p>
<p>A quick reminder on a Friday: nobody&#8217;s dying words are &#8220;I wish I had spent more time at the office.&#8221;</p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2Fdoodle%2Fpriorities%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/lDU9pjsqV3E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/doodle/priorities/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/doodle/priorities/</feedburner:origLink></item>
		<item>
		<title>Please Don’t Read Me Your PowerPoint Slides</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/o4BwRrzdh4Y/</link>
		<comments>http://www.doodlehaus.com/culture/hair-brained-scheme/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 13:50:44 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Doodle]]></category>
		<category><![CDATA[hair-brained scheme]]></category>
		<category><![CDATA[photoblog]]></category>
		<category><![CDATA[PowerPoint]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117670</guid>
		<description><![CDATA[Remember, your slides are there to support your talk, to make it more interesting. Find some great images or dynamite illustrations to burn your story into my brain. They are an (and usually hate this word) opportunity for you to turn a boring old talk into a multimedia event akin to the U2 Zooropa tour. [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.doodlehaus.com/wp-content/uploads/2011/12/hair-brained-scheme.png"><img class="alignnone size-full wp-image-117671" title="Hair Brained Scheme" src="http://www.doodlehaus.com/wp-content/uploads/2011/12/hair-brained-scheme.png" alt="" width="500" height="289" /></a></p>
<p>Remember, your slides are there to support your talk, to make it more interesting. Find some great images or dynamite illustrations to burn your story into my brain. They are an (and usually hate this word) opportunity for you to turn a boring old talk into a multimedia event akin to the U2 Zooropa tour. Okay, that may be a stretch.</p>
<p>However, if you must read to me, please bring milk and cookies and offer a nap time afterwards. Or during, for that matter.</p>
<p>P.S. I&#8217;ve perpetrated this odious deed myself. Let&#8217;s all get better together.</p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2Fculture%2Fhair-brained-scheme%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/o4BwRrzdh4Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/culture/hair-brained-scheme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/culture/hair-brained-scheme/</feedburner:origLink></item>
		<item>
		<title>Dead Unicorn – The Horrible Truth About Social Media ROI</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/5cS37ABlXxg/</link>
		<comments>http://www.doodlehaus.com/doodle/dead-unicorn/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 13:00:22 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[Doodle]]></category>
		<category><![CDATA[Manifesto]]></category>
		<category><![CDATA[dead unicorn]]></category>
		<category><![CDATA[photoblog]]></category>
		<category><![CDATA[social media ROI]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117668</guid>
		<description><![CDATA[Every time someone asks, “what’s the ROI of social media?” A unicorn dies. So sayeth Scott Stratten, author of Unmarketing. He’s right. “What’s the ROI of social media?” First of all, it’s too broad a question. “What’s the ROI of high speed internet?” “What’s the ROI of our cash register?” “What’s the ROI of executive [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.doodlehaus.com/wp-content/uploads/2011/12/dead-unicorn.png"><img class="alignnone size-full wp-image-117669" title="Dead Unicorn" src="http://www.doodlehaus.com/wp-content/uploads/2011/12/dead-unicorn.png" alt="" width="500" height="310" /></a></p>
<p>Every time someone asks, “what’s the ROI of social media?” A unicorn dies. So sayeth <a href="http://www.unmarketing.com/">Scott Stratten</a>, author of Unmarketing.</p>
<p>He’s right.</p>
<p><strong>“What’s the ROI of social media?”</strong><br />
First of all, it’s too broad a question. “What’s the ROI of high speed internet?” “What’s the ROI of our cash register?” “What’s the ROI of executive perks?” Are all similarly difficult to answer. All these things are, like it or not, the underpinnings of business as usual.</p>
<p>Unless you’re an Amish woodworker, you need high speed internet. If you sell things at a retail outlet, you need a cash register. And if you have a gaggle of executives, you need to provide them some level of perks on par with their peers or they’ll bolt for one of those companies. Finally, if you have customers, they’re probably talking about you in social media.</p>
<p>Social media is fast becoming THE fundamental communication channel for your customers. Is your plan to pretend it doesn’t exist because it is presently difficult to measure? Your competitors are certainly hoping you will.</p>
<p><strong>Social media is market intelligence<br />
</strong>As I said before, if you have customers, they’re talking bout you in social spaces. They used to do it anyway, it was called the coffee shop, the farmer’s co-op or the local tavern. You need to understand and be prepared to engage your customer in meaningful conversations in social spaces. Today, it’s Facebook and Twitter. Deal with it.</p>
<p>If you must measure the sentiment around your brand, you can start with SocialMention or Google Alerts. They’re free and can help you take the temperature of your brand’s buzz. Do this before you drop a briefcase full of cash one of the big listening packages.</p>
<p><strong>Social media is story-telling<br />
</strong>A Twitter account is free. A Facebook page for your business is free. A YouTube account is free. However, they are, as friend <a href="http://www.fourthand140.com">Tom Buchheim</a> says, “free like a puppy.” You need to be prepared to tell your story in these channels.</p>
<p>Please note, the following is not your story, “be my friend and get some occasional discounts.” That’s boring. That’s a loyalty program.</p>
<p>“I’m in my office.” Also not a story. In fact, that’s not even interesting as a statement.</p>
<p>“Our founder, Phineas Q. Widget, III, created the first prototype for WidgeCo during a 72-hour Mt. Dew-fueled bender in his garage. He started two fires and collapsed in a heap of ecstasy when he first saw it function properly.” That’s a story. Your customer can identify with that. Turn your brand into a serial novel and people will see you as a friend instead of just a commodity.</p>
<p><strong>Social media can help you stretch your advertising dollar<br />
</strong>Social networks know a ton about their users. Web sites have this uncanny way of harvesting data about their likes and dislikes, their hopes and dreams as well as pictures of what they’re having for dinner.</p>
<p>Instead of placing an ad in the local paper might be seen by some of the people who might possibly be slightly interested in what you’re selling, you can place a Facebook Ad that is served only to men from age 18-24 who have “liked” the band Mastodon and the movie Napoleon Dynamite.</p>
<p>Now that’s some serious targeting.</p>
<p><strong>Hop to it, the metrics will come<br />
</strong>Just as people lagged in seeing the value of the Web and email as business technologies (ever work at a company where not all employees had email accounts?), so do they lag on social media. Just as metrics evolved with those technologies, so will they evolve with social.</p>
<p>That said, there are already lots of things you can measure with social media. Tracking codes on links that are specific purchasing calls-to-action can be easily consumed by web analytics packages. There, you’ve got some ROI. Just be careful. Don’t go all Kenny Tarmac and turn your Facebook page into some kind of full-court press hard-sell smarm-a-palooza. Remember you’re telling a story, not selling.</p>
<p>Facebook gives you some great measures of how many people are engaging with your page, all the way down to what kind of content is most viral. Check out <a href="https://developers.facebook.com/docs/insights/">Facebook’s insights</a> immediately, if not sooner.</p>
<p>YouTube, Twitter and LinkedIn all have some sort of reporting that you can combine with some clever web analytics work to paint a picture of your progress.</p>
<p>So don’t use the lack of hyper-sophisticated ROI black boxes for social media as an excuse to ignore social media. Get out there and tell your story, your customer is waiting. <!--EndFragment--></p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2Fdoodle%2Fdead-unicorn%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/5cS37ABlXxg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/doodle/dead-unicorn/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/doodle/dead-unicorn/</feedburner:origLink></item>
		<item>
		<title>Beware Pep Tse, Ancient Master of Product Placement</title>
		<link>http://feedproxy.google.com/~r/Doodlehaus/~3/b5NGcN2dhXE/</link>
		<comments>http://www.doodlehaus.com/culture/beware-pep-tse-ancient-master-of-product-placement/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 08:00:13 +0000</pubDate>
		<dc:creator>Mark Anderson</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Doodle]]></category>
		<category><![CDATA[Manifesto]]></category>
		<category><![CDATA[gurus]]></category>
		<category><![CDATA[manifesto]]></category>
		<category><![CDATA[photoblog]]></category>

		<guid isPermaLink="false">http://www.doodlehaus.com/?p=117662</guid>
		<description><![CDATA[This is a post about Gurus, with a capital G. They have books, they have accessories and they have the answer to everything. If they&#8217;re a big enough Guru, they can become a lifestyle choice in and of themselves. They will sell and resell their &#8220;5 Secrets to Better Pancakes&#8221; or &#8220;12 Simple Steps to a Nutmeg-Free [...]]]></description>
				<content:encoded><![CDATA[<div id="attachment_117663" class="wp-caption alignnone" style="width: 510px"><a href="http://www.doodlehaus.com/wp-content/uploads/2011/10/Pep-Tse.png"><img class="size-full wp-image-117663" title="Pep Tse, master of the ancient art of product placement" src="http://www.doodlehaus.com/wp-content/uploads/2011/10/Pep-Tse.png" alt="Pep Tse, master of the ancient art of product placement" width="500" height="647" /></a><p class="wp-caption-text">Pep Tse, master of the ancient art of product placement</p></div>
<p>This is a post about Gurus, with a capital G. They have books, they have accessories and they have the answer to everything. If they&#8217;re a big enough Guru, they can become a lifestyle choice in and of themselves. They will sell and resell their &#8220;5 Secrets to Better Pancakes&#8221; or &#8220;12 Simple Steps to a Nutmeg-Free Life&#8221;.</p>
<p>But the real secret is that there are no secrets. The Guru makes money off those who want to buy a book instead of doing the work.</p>
<p>If you ever find yourself in a position where you think the only thing standing between you and your dreams is writing a check to a &#8220;Guru&#8221; to unlock the secrets of the universe, do yourself a favor and don&#8217;t. Save your money. Remember that success is very closely bound to hard work and is accelerated by God-given talent. A positive attitude is also a nice-to-have.</p>
<p>Chris Brogan talks about being an <a href="http://www.chrisbrogan.com/what-it-takes-to-be-an-overnight-success/">overnight success</a>. It only took about ten years of non-stop speaking, blogging, writing, networking and entrepreneurship. Chris is no &#8220;Guru&#8221;, he&#8217;s a smart, humble, hard-working guy. It&#8217;s a grind. So you better love what you do, and you have to be willing to do it and do it a lot.</p>
<p>Remember that the mighty Beatles started as a gig band a the Cavern in Hamburg. From 1961 to 1963 The Beatles made 292 appearances there (<a href="http://en.wikipedia.org/wiki/The_Cavern_Club">see Wikipedia</a>). So instead of climbing the mountain to find your guru, find yourself a cavern. Go hone your talent, eventually people will seek <em>you</em> out.</p>
<p>&nbsp;</p>
<iframe id="basic_facebook_social_plugins_likebutton" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.doodlehaus.com%2Fculture%2Fbeware-pep-tse-ancient-master-of-product-placement%2F&amp;layout=standard&amp;show_faces=false&amp;width=&amp;action=like&amp;font=arial&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:px; height:50px"></iframe><img src="http://feeds.feedburner.com/~r/Doodlehaus/~4/b5NGcN2dhXE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.doodlehaus.com/culture/beware-pep-tse-ancient-master-of-product-placement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.doodlehaus.com/culture/beware-pep-tse-ancient-master-of-product-placement/</feedburner:origLink></item>
	</channel>
</rss><!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
