<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>Code Softly</title>
    <link rel="alternate" type="text/html" href="http://www.codesoftly.com/" />
    
    <id>tag:www.codesoftly.com,2009-05-06:/1</id>
    <updated>2009-07-07T04:37:36Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.25</generator>

<link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-nd/2.0/" /><logo>http://codesoftly.aaronoliver.com/code_softly_owl.jpg</logo><link rel="self" href="http://feeds.feedburner.com/CodeSoftly" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
    <title>"It Feels Better" is a Use Case</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/Rv4rPapC_Us/it-feels-better-is-a-use-case.html" />
    <id>tag:www.codesoftly.com,2009://1.129</id>

    <published>2009-07-07T04:18:36Z</published>
    <updated>2009-07-07T04:37:36Z</updated>

    <summary>I was poking around with Selenium and wanted to write some assertions about a page not being a 404. I did a quick Google search, and came upon a thread where a maintainer kept pressing people for “a valid use...</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="humaneinterfaces" label="humane interfaces" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="selenium" label="selenium" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tdd" label="tdd" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="testing" label="testing" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="usecases" label="use cases" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;I was poking around with &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt; and wanted to write some assertions about a page not being a 404. I did a quick Google search, and came upon &lt;a href="http://jira.openqa.org/browse/SRC-563;jsessionid=359DBAA3F3E77423685870E4A76BCB3D?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel"&gt;a thread&lt;/a&gt; where a maintainer &lt;a href="http://jira.openqa.org/browse/SRC-563#action_17674"&gt;kept pressing people for &amp;#8220;a valid use case&amp;#8221;&lt;/a&gt; for adding an explicit method to test HTTP response codes. His logic being that one could test for various page elements to see if it&amp;#8217;s a 404 or not.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Still no meaningful use case has been provided.
  Instead of checking the HTTP response you should make assertions on the content of the page - this is what the user faces and not the codes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is true. One &lt;em&gt;could&lt;/em&gt; check DOM elements to see if the page was found, but it &lt;strong&gt;feels better&lt;/strong&gt; to have a simple yes or no answer to &amp;#8220;Is the page even there?&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Doing it the current way might look like this, where your company&amp;#8217;s pages have h1&amp;#8217;s with class &amp;#8220;logo&amp;#8221;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;assert(selenium.is_element_present("//h1[@class='logo']"))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is perfectly ok, but it&amp;#8217;s little tricky to know exactly what&amp;#8217;s going on. My brain reads that as &amp;#8220;Check to see if our (hopefully) universal h1 class value appears on the page, and if it does, assume it&amp;#8217;s not a 404.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s what the same assertion might look like, but using the requested function from the thread:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;assert(selenium.status_is_not(404))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is much cleaner and more expressive: &amp;#8220;if it&amp;#8217;s a 404, fail the test. Don&amp;#8217;t bother checking anything else&amp;#8221;.&lt;/p&gt;

&lt;p&gt;They&amp;#8217;re both a single line, and not too complicated, but the second version feels better. It expresses the idea more clearly.&lt;/p&gt;

&lt;p&gt;Writing code is communication. The tough part is that we write for machines &lt;em&gt;and&lt;/em&gt; people at the same time. I think it&amp;#8217;s a good idea to throw humans the occasional bone, and make things as &lt;a href="http://martinfowler.com/bliki/HumaneInterface.html"&gt;humane as possible&lt;/a&gt;.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=Rv4rPapC_Us:Qxu0LSFejPU:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=Rv4rPapC_Us:Qxu0LSFejPU:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/Rv4rPapC_Us" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/07/it-feels-better-is-a-use-case.html</feedburner:origLink></entry>

<entry>
    <title>Grow or Die</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/apdfCsk622s/grow-or-die.html" />
    <id>tag:www.codesoftly.com,2009://1.127</id>

    <published>2009-07-02T03:34:09Z</published>
    <updated>2009-07-02T04:01:13Z</updated>

    <summary>Programmers often emphasize mastery, wisdom, and skill. We'll even say "I love to learn new things". 

Awesome. High five. Learning new things is good, but  take care to avoid becoming *just* a sponge. Growth is important, and different from learning. 
</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="brucemau" label="bruce mau" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="design" label="design" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="growth" label="growth" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="manifesto" label="manifesto" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="thinking" label="thinking" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;&lt;a href="http://www.flickr.com/photos/54288707@N00/324287907/" title="MASSIVE CHANGE by bluman, on Flickr"&gt;&lt;img src="http://farm1.static.flickr.com/134/324287907_6c4c7987b1.jpg" width="395" height="500" alt="MASSIVE CHANGE" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Programmers often emphasize mastery, wisdom, and skill. We&amp;#8217;ll even say &amp;#8220;I love to learn new things&amp;#8221;. &lt;/p&gt;

&lt;p&gt;Awesome. High five. Learning new things is good, but  take care to avoid becoming &lt;em&gt;just&lt;/em&gt; a sponge. Growth is important, and different from learning. &lt;/p&gt;

&lt;p&gt;I can learn Scala, and I can learn Django; but the mere act of learning doesn&amp;#8217;t really help me grow as a creator of awesomeness. I need to do that on my own. &lt;/p&gt;

&lt;p&gt;My brother is an architect by trade, and we often talk about how designing buildings and making software are the same. In my&lt;a href="http://www.codesoftly.com/2009/06/just-effing-do-it.html"&gt; previous post&lt;/a&gt;, he pointed out  &lt;a href="http://www.brucemaudesign.com/incomplete_manifesto.html"&gt;Bruce Mau&amp;#8217;s Manifesto for Growth&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.brucemaudesign.com/incomplete_manifesto.html"&gt;Bruce&amp;#8217;s list&lt;/a&gt; is excellent reading. Here are some of my favorites:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Allow events to change you.
  You have to be willing to grow. Growth is different from something that happens to you. You produce it. You live it. The prerequisites for growth: the openness to experience events and the willingness to be changed by them.&lt;/p&gt;
  
  &lt;p&gt;Collaborate.
  The space between people working together is filled with conflict, friction, strife, exhilaration, delight, and vast creative potential.&lt;/p&gt;
  
  &lt;p&gt;Coffee breaks, cab rides, green rooms.
  Real growth often happens outside of where we intend it to, in the interstitial spaces &amp;#8212; what Dr. Seuss calls &amp;#8220;the waiting place.&amp;#8221; Hans Ulrich Obrist once organized a science and art conference with all of the infrastructure of a conference &amp;#8212; the parties, chats, lunches, airport arrivals &amp;#8212; but with no actual conference. Apparently it was hugely successful and spawned many ongoing collaborations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The target audience is visual designers (so ignore the one about &amp;#8220;avoid software&amp;#8221;), but the similarity to how our brains are forced to work as programmers is impressive.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=apdfCsk622s:cdYoLYl-Ggg:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=apdfCsk622s:cdYoLYl-Ggg:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/apdfCsk622s" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/07/grow-or-die.html</feedburner:origLink></entry>

<entry>
    <title>Just Effing Do It</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/jvKF2yy_nnw/just-effing-do-it.html" />
    <id>tag:www.codesoftly.com,2009://1.126</id>

    <published>2009-06-30T13:50:31Z</published>
    <updated>2009-07-01T02:17:26Z</updated>

    <summary>The first chapter of Ben Hunt’s book Save the Pixel contains a great snippet of advice: Once you’re clear what needs to be done, stop all analysis, and apply the JFDI process (“Just F*ing Do It”). I love this. I’ve...</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="benhunt" label="ben hunt" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lean" label="lean" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="meetings" label="meetings" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="methodology" label="methodology" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="savethepixel" label="save the pixel" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="softwareengineering" label="software engineering" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;The &lt;a href="http://savethepixel.org/save_the_pixel_ch1.pdf"&gt;first chapter&lt;/a&gt; of Ben Hunt&amp;#8217;s book &lt;a href="http://savethepixel.org/"&gt;Save the Pixel&lt;/a&gt; contains a great snippet of advice:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Once you&amp;#8217;re clear what needs to be done, stop all analysis, and apply the JFDI process (&amp;#8220;Just
  F&lt;em&gt;*&lt;/em&gt;ing Do It&amp;#8221;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I love this. I&amp;#8217;ve been developing an analysis allergy over the past few years. In design meetings, I can&amp;#8217;t help but think how much quicker it would be to just &lt;em&gt;try&lt;/em&gt; one of the options, or &lt;strong&gt;ALL&lt;/strong&gt; of them, and find out the best design by experimentation.&lt;/p&gt;

&lt;p&gt;Now, when I feel like I&amp;#8217;m stuck in a rut, I start writing code. It crystallizes my understanding of the problem and has the pleasant side-effect of producing something useful.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=jvKF2yy_nnw:NZtwWOx59xw:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=jvKF2yy_nnw:NZtwWOx59xw:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/jvKF2yy_nnw" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/just-effing-do-it.html</feedburner:origLink></entry>

<entry>
    <title>Fat Setups, Skinny Tests</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/FsKf2mQyR7I/fat-setup-skinny-test.html" />
    <id>tag:www.codesoftly.com,2009://1.124</id>

    <published>2009-06-25T12:33:25Z</published>
    <updated>2009-06-25T16:56:56Z</updated>

    <summary>Write better unit tests by putting lots of code in the setup, then write very focused test methods to assert the outcomes of the operation.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="code" label="code" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="fatsetup" label="fatsetup" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mocks" label="mocks" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="skinnytest" label="skinnytest" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tdd" label="tdd" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="testing" label="testing" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;&lt;a href="http://www.traceback.org/"&gt;Dave Stanek&lt;/a&gt; recently turned me on to a different style of &lt;a href="http://code.google.com/p/python-nose/"&gt;unit testing&lt;/a&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;write a test class for each scenario&lt;/li&gt;
&lt;li&gt;put all the execution in the &lt;code&gt;setup&lt;/code&gt; method&lt;/li&gt;
&lt;li&gt;verify outcomes in tiny test methods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I&amp;#8217;m sure someone has a better name for this, but I think of it as &lt;strong&gt;fat-setup/skinny-test&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;A Simple Example&lt;/h3&gt;

&lt;p&gt;Here&amp;#8217;s a fictional class that is good at finding &lt;a href="http://starwars.wikia.com/wiki/Jedi"&gt;Jedi&lt;/a&gt; of both good and evil inclination. It&amp;#8217;s main job is to return a tuple containing a list of light jedi, and another list of dark. Empty lists mean no matches.&lt;/p&gt;

&lt;p&gt;Unfortunately, the adapter &lt;code&gt;JediFinder&lt;/code&gt; uses returns &lt;code&gt;None&lt;/code&gt; when there are no matches, so our class need to do a little logic to detect that and return empty lists instead.&lt;/p&gt;

&lt;h4&gt;JediFinder&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;class JediFinder(object):
    """A class good at finding different kinds of Jedi in the Universe"""
    def __init__(self, search_adapter):
        self.search_adapter = search_adapter

    def find_jedi(self):
        light_jedi, dark_jedi = self.search_adapter.find()
        if light_jedi is None:
            light_jedi = []
        if dark_jedi is None:
            dark_jedi = []
        return light_jedi, dark_jedi
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;The Tests&lt;/h4&gt;

&lt;p&gt;So now we want to test our finder. Here&amp;#8217;s one way I might do fat setups. First I have a base test class that sets up things used in many/all of the test cases:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;from mock import Mock
class JediFinderTest(object):
    def setup(self):
        self.search_adapter = Mock()
        self.finder = JediFinder(self.search_adapter)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now I can define other test cases, each based on a different scenario. In this case, making sure the code does the right then when no jedi are found, when only dark side jedi are found, only light side, and when both are found.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class TestWithNoResults(JediFinderTest):
    def setup(self):
        JediFinderTest.setup(self)
        self.search_adapter.find.return_value = (None, None)
        self.results = self.finder.find_jedi()

    def test_returns_empty_lists(self):
        assert self.results == ([], [])

class TestOnlyLightJediFound(JediFinderTest):
    def setup(self):
        JediFinderTest.setup(self)
        self.search_adapter.find.return_value = (["Obi-Wan"], None)
        self.results = self.finder.find_jedi()

    def test_light_is_obiwan(self):
        assert self.results[0] == ["Obi-Wan"]

    def test_dark_is_empty(self):
        assert self.results[1] == []

class TestOnlyDarkFound(JediFinderTest):
    def setup(self):
        JediFinderTest.setup(self)
        self.search_adapter.find.return_value = (None, ["Vader"])
        self.results = self.finder.find_jedi()

    def test_dark_is_vader(self):
        assert self.results[1] == ["Vader"]

    def test_light_is_empty(self):
        assert self.results[0] == []

class TestLighAndDarkFound(JediFinderTest):
    def setup(self):
        JediFinderTest.setup(self)
        self.search_adapter.find.return_value = (["Obi-Wan"], ["Vader"])
        self.results = self.finder.find_jedi()

    def test_dark_is_vader(self):
        assert self.results[1] == ["Vader"]

    def test_light_is_obiwan(self):
        assert self.results[0] == ["Obi-Wan"]
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Better?&lt;/h3&gt;

&lt;p&gt;I like this style because the smaller test methods get right to the point. They express what the test is verifying, not filling lines with setup and configuration. &lt;/p&gt;

&lt;p&gt;Another developer can come along, pretty much ignore the setups, and just look at test methods to learn what&amp;#8217;s going on.&lt;/p&gt;

&lt;p&gt;I think it also helps with maintenance. You can add new test methods to each case when new features are added without refactoring or duplicating test setups.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=FsKf2mQyR7I:YnBl_aFTzzY:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=FsKf2mQyR7I:YnBl_aFTzzY:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/FsKf2mQyR7I" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/fat-setup-skinny-test.html</feedburner:origLink></entry>

<entry>
    <title>Nature Hates Your Project</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/raEFpa7vPL0/nature-hates-your-project.html" />
    <id>tag:www.codesoftly.com,2009://1.122</id>

    <published>2009-06-22T03:37:32Z</published>
    <updated>2009-06-22T04:20:34Z</updated>

    <summary>The Universe wants your project to fail. Here's a few ways that Nature issues the beat-down.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="agile" label="agile" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="entropy" label="entropy" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lean" label="lean" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rant" label="rant" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="softwareengineering" label="software engineering" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="galaxy.jpg" src="http://www.codesoftly.com/images/galaxy.jpg" width="448" height="222" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;The Universe wants your project to fail. Here&amp;#8217;s a few ways that Nature issues the beat-down:&lt;/p&gt;

&lt;h3&gt;Entropy&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Entropy"&gt;All things tend toward chaos&lt;/a&gt;. Software by it&amp;#8217;s nature is the organizing of thoughts, procedures, and electrons. Very unnatural. &lt;strong&gt;Advantage:Nature&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;The Relative Rarity of Psychic Powers in Humans&lt;/h3&gt;

&lt;p&gt;Your big project plan assumes you have some reasonable skill at predicting the future. Sadly, &lt;a href="http://www.37signals.com/svn/posts/1750-the-planning-fallacy"&gt;humans are bad at this&lt;/a&gt;.&lt;strong&gt;Advantage:Nature&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;The Inexorable Progression of Time&lt;/h3&gt;

&lt;p&gt;Time doesn&amp;#8217;t take a break. So every minute you&amp;#8217;re sleeping and NOT coding, the Universe pulls ahead. Oh, and those new features you want to add in the same amount of time? Sorry. No deal.&lt;strong&gt;Advantage:Natire&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;WTF?&lt;/h3&gt;

&lt;p&gt;Is it any wonder that &lt;a href="http://www.codinghorror.com/blog/archives/000588.html"&gt;software projects have dismal success rates&lt;/a&gt; with the odds stacked so high?&lt;/p&gt;

&lt;p&gt;One of the awesome things about Agile/Lean/XP/&lt;your non-waterfall methodology here&gt; is that it &lt;strong&gt;admits defeat in each of these cases&lt;/strong&gt;. Rather than beating heads against these monumental obstacles, they slice and dice our activities to minimize the damage nature can do to our fragile efforts. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Can&amp;#8217;t predict the future&lt;/em&gt;?
Use sprints to limit your focus to shorter time spans. Our guesses get more accurate as the time we need to predict gets lowered.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hard to fit all your features in before the deadline&lt;/em&gt;? Don&amp;#8217;t focus on finishing everything before your deadline. Ensure you work on the most important features, and that those features work.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Code turning to mush&lt;/em&gt;? 
Refactor. Refactor. Refactor. This one is a drag-out brawl with entropy. You have keep up on this, and there&amp;#8217;s no good way around it. Left to itself, your codebase will rot into a steaming pile of poo. You mow your lawn every week. Refactor your code regularly.&lt;/p&gt;

&lt;p&gt;And so on. This is why many projects are so painful to developers. We&amp;#8217;re being asked to undo the very fabric of the Universe and deliver on time. Of course, that&amp;#8217;s &lt;a href="http://stackoverflow.com/questions/107867/what-was-your-best-heroic-moment"&gt;exactly what we do&lt;/a&gt;, but it hurts like hell. Why not go for something a little more fun?&lt;/p&gt;

&lt;p&gt;[photo courtesy of &lt;a href="http://www.flickr.com/photos/jonwiley/"&gt;Jon Wiley&lt;/a&gt; &lt;a href="http://creativecommons.org/licenses/by-nc/2.0/"&gt;some rights reserved&lt;/a&gt;]&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=raEFpa7vPL0:CBeXrZJsHaY:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=raEFpa7vPL0:CBeXrZJsHaY:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/raEFpa7vPL0" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/nature-hates-your-project.html</feedburner:origLink></entry>

<entry>
    <title>Dojo Codeswarm</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/E-IwQRySX4E/dojo-codeswarm.html" />
    <id>tag:www.codesoftly.com,2009://1.120</id>

    <published>2009-06-16T21:33:52Z</published>
    <updated>2009-06-16T21:46:03Z</updated>

    <summary>I love codeswarms. Though their utility may be questioned, it's neat to see your hard work translated into organically moving points of light.

It's also a useful way to help people understand just how much activity goes into software. So, I was very happy to see the Dojo codeswarm on Alex Russel's blog.
</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="codeswarm" label="codeswarm" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dojo" label="dojo" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="visualization" label="visualization" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;&lt;a href="http://www.codesoftly.com/2008/06/cool-python-code-swarm-visualization.html"&gt;I love codeswarms&lt;/a&gt;. Though their utility may be questioned, it&amp;#8217;s neat to see your hard work translated into organically moving points of light.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s also a useful way to help people understand just how much activity goes into software.&lt;/p&gt;

&lt;p&gt;So, I was very happy to see the &lt;a href="http://alex.dojotoolkit.org/2009/06/a-visual-history-of-dojo/"&gt;Dojo codeswarm on Alex Russel&amp;#8217;s blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LSZsMEIvOe4&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/LSZsMEIvOe4&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve actually rigged one for our project at work. It&amp;#8217;s not too hard if you follow &lt;a href="http://code.google.com/p/codeswarm/wiki/GeneratingAVideo"&gt;the instructions&lt;/a&gt; and have a little patience.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=E-IwQRySX4E:9AiXOoWxPXM:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=E-IwQRySX4E:9AiXOoWxPXM:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/E-IwQRySX4E" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/dojo-codeswarm.html</feedburner:origLink></entry>

<entry>
    <title>11 Characters Make The Difference</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/Hs7M2bgDYQI/11-characters-make-the-difference.html" />
    <id>tag:www.codesoftly.com,2009://1.119</id>

    <published>2009-06-12T02:00:23Z</published>
    <updated>2009-06-12T03:10:02Z</updated>

    <summary>Jakob Nielsen has an awesome post about the importance of the first 2 words of a link. He sets the cutoff at eleven characters. Users typically see about 2 words for most list items; they’ll see a little more if...</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="11characters" label="11 characters" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="greasemonkey" label="greasemonkey" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="headlines" label="headlines" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="informationarchitecture" label="information architecture" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="readability" label="readability" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;&lt;a href="http://www.useit.com/"&gt;Jakob Nielsen&lt;/a&gt; has an awesome post about the &lt;a href="http://www.useit.com/alertbox/nanocontent.html"&gt;importance of the first 2 words of a link&lt;/a&gt;. He sets the cutoff at eleven characters. &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Users typically see about 2 words for most list items; they&amp;#8217;ll see a little more if the lead words are short, and only the first word if they&amp;#8217;re long. Of course, people don&amp;#8217;t see exactly 11 characters every time, but we picked this number to ensure uniformity across the sites we tested.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This prompted me to write a (bad) &lt;a href="http://www.codesoftly.com/first11.user.js"&gt;greasemonkey script that shows only the first 11 characters of hyperlinks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After I installed it, I visited a few blogs to see how post titles looked.&lt;/p&gt;

&lt;p&gt;I found that &amp;#8220;good&amp;#8221; titles tended to have exotic or unique words, and make you want to click:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;#8220;Ready, Aim.&amp;#8221;&lt;/li&gt;
&lt;li&gt;&amp;#8220;Best Mac Ev&amp;#8221;&lt;/li&gt;
&lt;li&gt;&amp;#8220;Maps of tun&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad headlines tend to have boring or null words, and feel as if they&amp;#8217;ve been cut short:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;#8220;Build Your&amp;#8221; &lt;/li&gt;
&lt;li&gt;&amp;#8220;Why it&amp;#8217;s wi&amp;#8221;&lt;/li&gt;
&lt;li&gt;&amp;#8220;A Reminder&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give &lt;a href="http://www.codesoftly.com/first11.user.js"&gt;the script&lt;/a&gt; a shot, and see if you have a similar experience.&lt;/p&gt;

&lt;p&gt;(And to save you the trouble, the first 11 characters of this post&amp;#8217;s title are &amp;#8220;&lt;strong&gt;11 Characte&lt;/strong&gt;&amp;#8221;. Riveting.)&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=Hs7M2bgDYQI:w6b8QcLJl3o:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=Hs7M2bgDYQI:w6b8QcLJl3o:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/Hs7M2bgDYQI" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/11-characters-make-the-difference.html</feedburner:origLink></entry>

<entry>
    <title>What If We Bought Everything Like It Was Enterprise Software?</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/4BZRCEkZqjQ/what-if-we-bought-everything-like-it-was-enterprise-software.html" />
    <id>tag:www.codesoftly.com,2009://1.118</id>

    <published>2009-06-09T12:37:30Z</published>
    <updated>2009-06-09T12:42:02Z</updated>

    <summary>Just saw this well-made video that explores what things must be like for enterprise software companies. It’s easy and fun to vilify vendors, but this is a nice look at things from their perspective. [via Scofield Editorial]...</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="enterprise" label="enterprise" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="funny" label="funny" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="vendors" label="vendors" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="video" label="video" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;Just saw this well-made video that explores what things must be like for enterprise software companies. It&amp;#8217;s easy and fun to vilify vendors, but this is a nice look at things from their perspective.&lt;/p&gt;

&lt;p&gt;&lt;object width="560" height="340"&gt;&lt;param name="movie" value="http://www.youtube.com/v/R2a8TRSgzZY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/R2a8TRSgzZY&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;[via &lt;a href="http://www.vendorclientvideo.com/"&gt;Scofield Editorial&lt;/a&gt;]&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=4BZRCEkZqjQ:tCDXCvaIKJU:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=4BZRCEkZqjQ:tCDXCvaIKJU:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/4BZRCEkZqjQ" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/what-if-we-bought-everything-like-it-was-enterprise-software.html</feedburner:origLink></entry>

<entry>
    <title>Wow. IMVU Runs 1 Million Automated Tests a Day</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/iZ6GicObh90/wow-imvu-runs-1-million-automated-tests-a-day.html" />
    <id>tag:www.codesoftly.com,2009://1.116</id>

    <published>2009-06-08T02:34:21Z</published>
    <updated>2009-06-08T02:44:03Z</updated>

    <summary>I was blown away when I read about how IMVU runs a million tests a day in the course of about 50(!) production deployments. The way it happens is downright shuttle-like : The code is rsync’d out to the hundreds...</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="automation" label="automation" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="continuousdeployment" label="continuous deployment" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="imvu" label="imvu" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;I was blown away when I read about how &lt;a href="http://timothyfitz.wordpress.com/2009/02/10/continuous-deployment-at-imvu-doing-the-impossible-fifty-times-a-day/"&gt;IMVU runs a million tests a day&lt;/a&gt; in the course of about 50(!) production deployments.&lt;/p&gt;

&lt;p&gt;The way it happens is downright &lt;a href="http://www.codesoftly.com/2009/01/solid-gold-plated-software-for-the-shuttle.html"&gt;shuttle-like&lt;/a&gt; :&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The code is rsync&amp;#8217;d out to the hundreds of machines in our cluster. Load average, cpu usage, php errors and dies and more are sampled by the push script, as a basis line. A symlink is switched on a small subset of the machines throwing the code live to its first few customers. A minute later the push script again samples data across the cluster and if there has been a statistically significant regression then the revision is automatically rolled back. If not, then it gets pushed to 100% of the cluster and monitored in the same way for another five minutes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I freaking LOVE that. The &lt;strong&gt;machine&lt;/strong&gt; dipping its toes in the water before moving code, then again after to make sure things are OK. &lt;a href="http://www.pragprog.com/titles/tpp/the-pragmatic-programmer"&gt;The Pragmatic Programmer&lt;/a&gt; talks about ubiquitous automation, but this is something approaching a whole new level, man.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=iZ6GicObh90:M842c5ZXHX8:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=iZ6GicObh90:M842c5ZXHX8:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/iZ6GicObh90" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/wow-imvu-runs-1-million-automated-tests-a-day.html</feedburner:origLink></entry>

<entry>
    <title>Wiki in Four Lines of Perl is Short, Cryptic</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/Eip27zK4aJM/wiki-in-four-lines-short-cryptic.html" />
    <id>tag:www.codesoftly.com,2009://1.111</id>

    <published>2009-06-04T17:22:26Z</published>
    <updated>2009-06-05T02:33:04Z</updated>

    <summary>I think we can all admit to taking a shot or two at Perl Guys from time to time: I like to do it with a thick east-European accent. “Vat? You need billing system? I write in Perl. Ten lines.”...</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="funny" label="funny" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="perl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="softwareengineering" label="software engineering" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;I think we can all admit to taking a shot or two at Perl Guys from time to time: I like to do it with a thick east-European accent. &amp;#8220;Vat? You need billing system? I write in Perl. Ten lines.&amp;#8221;  &lt;/p&gt;

&lt;p&gt;Well who&amp;#8217;s laughing now? Here&amp;#8217;s &lt;a href="http://c2.com/cgi/wiki?SigWik"&gt;Sig Wik, a wiki in four lines of Perl&lt;/a&gt;. &lt;strong&gt;Four&lt;/strong&gt;!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl
use CGI':all';path_info=~/\w+/;$_=`grep -l $&amp;amp; *`.h1($&amp;amp;).escapeHTML$t=param(t)
||`dd&amp;lt;$&amp;amp;`;open F,"&amp;gt;$&amp;amp;";print F$t;s/htt\S+|([A-Z]\w+){2,}/a{href,$&amp;amp;},$&amp;amp;/eg;
print header,pre"$_&amp;lt;form&amp;gt;",submit,textarea t,$t,9,70
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This all comes courtesy of the &lt;a href="http://c2.com/cgi/wiki?ShortestWikiContest"&gt;Shortest Wiki Contest&lt;/a&gt;. Good food for thought in the whole &lt;a href="http://weblog.jamisbuck.org/2007/1/5/brevity-vs-clarity"&gt;brevity vs. clarity&lt;/a&gt; thing.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=Eip27zK4aJM:uwk0GsywE9Y:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=Eip27zK4aJM:uwk0GsywE9Y:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/Eip27zK4aJM" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/wiki-in-four-lines-short-cryptic.html</feedburner:origLink></entry>

<entry>
    <title>Stop Showing Me that Damn Triangle</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/SInsOexEch0/stop-showing-me-that-damn-triangle.html" />
    <id>tag:www.codesoftly.com,2009://1.107</id>

    <published>2009-06-03T15:30:59Z</published>
    <updated>2009-06-04T03:35:44Z</updated>

    <summary> The next time someone quotes me the Project Triangle, I will set fire to the conference room. Seriously. A grade-school student understands this thing. If I spend less time buildng this ramp for my BMX bike, it won’t be...</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="projecttriangle" label="project triangle" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="projects" label="projects" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rant" label="rant" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="softwareengineering" label="software engineering" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="die_project_triangle.jpg" src="http://www.codesoftly.com/images/die_project_triangle.jpg" width="550" height="396" class="mt-image-none" style="" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;The next time someone quotes me the &lt;a href="http://en.wikipedia.org/wiki/Project_triangle"&gt;Project Triangle&lt;/a&gt;, I will set fire to the conference room.&lt;/p&gt;

&lt;p&gt;Seriously. A grade-school student understands this thing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If I spend less time buildng this ramp for my &lt;a href="http://www.youtube.com/watch?v=t5lhnr0DM04"&gt;BMX bike&lt;/a&gt;, it won&amp;#8217;t be as good.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I could pay for a fancy pre-fab ramp and save myself some time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I could take two weeks and make one from twigs I collect from the ditch.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Knowing about the triangle it isn&amp;#8217;t the problem. The challenge is in how you &lt;strong&gt;deal with it&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;When you show someone that triangle, you&amp;#8217;re telling them something they already know: &lt;strong&gt;software projects are hard&lt;/strong&gt;. Hell, &lt;em&gt;all&lt;/em&gt; projects are hard. &lt;/p&gt;

&lt;p&gt;If something is easy, we call it a game and serve beer.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=SInsOexEch0:8dsGnTS8zao:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=SInsOexEch0:8dsGnTS8zao:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/SInsOexEch0" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/stop-showing-me-that-damn-triangle.html</feedburner:origLink></entry>

<entry>
    <title>3D With Reflection is the New Dropshadow</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/XWt4rzDySL8/3d-with-reflection-is-the-new-dropshadow.html" />
    <id>tag:www.codesoftly.com,2009://1.110</id>

    <published>2009-06-03T04:47:22Z</published>
    <updated>2009-06-03T04:59:27Z</updated>

    <summary>n my nascent quest to resurrect Code Soflty, I've stumbled upon a great set of 3D icons for things like rss feeds and twitter accounts.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="3d" label="3d" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="graphics" label="graphics" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="icons" label="icons" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rss" label="rss" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="twitter" label="twitter" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;In my &lt;a href="http://www.codesoftly.com/2009/05/the-bird-is-back.html"&gt;nascent quest to resurrect Code Soflty&lt;/a&gt;, I&amp;#8217;ve stumbled upon &lt;a href="http://blog.insicdesigns.com/2009/05/free-aji-3d-social-media-icon-set-1-2/"&gt;a great set of 3D icons&lt;/a&gt; for things like rss feeds and twitter accounts. Pretty sweet for zero dollars. You can check out the &lt;a href="http://feeds2.feedburner.com/CodeSoftly"&gt;rss&lt;/a&gt; and &lt;a href="http://twitter.com/aaron_oliver"&gt;Twitter&lt;/a&gt; versions in my kickass sidebar to the right &amp;#8212;&gt;&lt;/p&gt;

&lt;p&gt;[link] &lt;a href="http://blog.insicdesigns.com/2009/05/free-aji-3d-social-media-icon-set-1-2/"&gt;Free AJI 3D social media icon set #1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[link] &lt;a href="http://blog.insicdesigns.com/2009/05/free-3d-social-media-icon-set-2-by-aji/"&gt;Free 3D social media icon set #2 - by AJI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.insicdesigns.com/2009/05/free-aji-3d-social-media-icon-set-1-2/"&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="3d-icon-set.jpg" src="http://www.codesoftly.com/images/3d-icon-set.jpg" width="565" height="630" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=XWt4rzDySL8:75jEXgQ-0wg:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=XWt4rzDySL8:75jEXgQ-0wg:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/XWt4rzDySL8" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/3d-with-reflection-is-the-new-dropshadow.html</feedburner:origLink></entry>

<entry>
    <title>Replace Technical Design Meetings With Behavior Tests</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/KJ2Uusxv0EM/replace-technical-design-meetings-with-behavior-tests.html" />
    <id>tag:www.codesoftly.com,2009://1.109</id>

    <published>2009-06-02T00:39:20Z</published>
    <updated>2009-06-02T01:24:03Z</updated>

    <summary>If you're frustrated by endless technical design meetings, try short-circuiting one with some behavioral tests.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="bdd" label="BDD" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="behavioraltests" label="behavioral tests" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="testing" label="testing" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;If you&amp;#8217;re frustrated by endless technical design meetings, try short-circuiting one with some &lt;a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development"&gt;behavioral tests&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.codesoftly.com/2009/02/in-a-conference-room-no-one-can-hear-you-scream.html"&gt;Meetings hurt&lt;/a&gt;. They take precious time away from building things. &lt;strong&gt;Technical design meetings are especially painful&lt;/strong&gt; because we know we could use that time to write code. Instead, we come out of the hour (or two!) bleary-eyed and with little to show.&lt;/p&gt;

&lt;p&gt;If you feel this pain, try replacing &lt;em&gt;some&lt;/em&gt; of those meetings with behavioral tests. These tests can demonstrate the interface or behavior you&amp;#8217;re trying to design, then live on as verification and documentation.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve discovered some ground rules for doing this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No business-folk&lt;/strong&gt;. You&amp;#8217;re writing code, not prose. This is for developers only.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Be flexible&lt;/strong&gt;. Your initial tests are brainstorms and &lt;a href="http://en.wikipedia.org/wiki/Straw_man_proposal"&gt;straw men&lt;/a&gt; to get the conversation going.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep your tests alive&lt;/strong&gt;. It&amp;#8217;s important that these initial tests survive through to implementation, and remain valuable as verification AND documentation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;An example&lt;/strong&gt;:
Pretend we&amp;#8217;re building a web front-end for a system that books hotel rooms. The back end is responsible for looking up availability and is to be built by another team. We need to design the interface to be invoked by the web code, which has collected the information about the room, to the backend code, which can look it up. I might write an initial behavior test like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class TestRoomChecker(object):
    def should_get_available_single_room(self):
        checker = RoomChecker()
        room = checker.check(beds=2, start="12/1/2009", duration=4)
        assert room is not null
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Even with this rinky-dink test, I&amp;#8217;m communicating TONS of useful things to the backend team:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The name of the method the front end will invoke to look for rooms&lt;/li&gt;
&lt;li&gt;That I want to send the date as a string, and not a &lt;code&gt;datetime&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;That I&amp;#8217;ve forgotten about smoking rooms, accessible rooms, and bed size.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is all great stuff that came about because I wrote my behavioral test &lt;strong&gt;before meeting with people&lt;/strong&gt; to discuss technical details. Now when we do get together and discuss the test, I can add TODO&amp;#8217;s directly in code to note the issues and immediately  update my tests to reflect them.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s easy for someone from the backend team to look at this and point out all the flaws and defects. If you&amp;#8217;re really feeling your oats, ask them to stay at your desk and write a few more with them looking over your shoulder. You&amp;#8217;ll end up with a rich set of tests that &lt;strong&gt;define and verify&lt;/strong&gt; the new interface.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=KJ2Uusxv0EM:AK9oyDsYB5M:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=KJ2Uusxv0EM:AK9oyDsYB5M:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/KJ2Uusxv0EM" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/06/replace-technical-design-meetings-with-behavior-tests.html</feedburner:origLink></entry>

<entry>
    <title>Zed Shaw, Digital Patriot</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/pnidblNQg_I/zed-shaw-digital-patriot.html" />
    <id>tag:www.codesoftly.com,2009://1.108</id>

    <published>2009-05-31T01:41:57Z</published>
    <updated>2009-05-31T02:51:26Z</updated>

    <summary>A lot of people don’t like Zed Shaw. He comes off as abrasive, arrogant, and annoying. It’s too bad, because I love what he does (beyond his technical contributions to the Universe). Most recently, Zed has turned his sights to...</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rant" label="rant" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="zedshaw" label="zed shaw" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;A lot of people don&amp;#8217;t like &lt;a href="http://www.zedshaw.com/"&gt;Zed Shaw&lt;/a&gt;. He comes off as &lt;a href="http://www.zedshaw.com/essays/programmer_stats.html"&gt;abrasive&lt;/a&gt;, arrogant, and &lt;a href="http://www.techcrunch.com/2008/01/01/zed-shaw-puts-the-smack-down-on-the-rails-community/"&gt;annoying&lt;/a&gt;. It&amp;#8217;s too bad, because I love what he does (beyond his &lt;a href="http://mongrel.rubyforge.org/"&gt;technical contributions to the Universe&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Most recently, Zed has turned his sights to Python. He recently published &lt;a href="http://www.zedshaw.com/blog/2009-05-29.html"&gt;some criticism of Python&lt;/a&gt;. As a Java to Python convert, a lot of it resonated with me.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I need to do some documenation for the Lamson APIs, so I figured that PyDoc could generate them in HTML. This turned into a 2 hour yak shaving expedition into Python documentation tools which demonstrated that all of them just either don&amp;#8217;t work, or seriously miss the basics of what a real programmer needs to generate documentation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was not happy with &lt;a href="http://twitter.com/gvanrossum/status/1968271345"&gt;Guido&amp;#8217;s response to the issues raised&lt;/a&gt;. Rather than 1.) saying &amp;#8220;yeap. there are still a few kinks to work out, or 2.)&amp;#8221;here&amp;#8217;s why things are like that&amp;#8221;, he resorted to an attitude of &amp;#8220;well, until you fix it, your complaints aren&amp;#8217;t legit&amp;#8221;. &lt;/p&gt;

&lt;p&gt;First, let me declare that &lt;a href="http://www.zazzle.com/i_heart_love_guido_hat-148550772630254840"&gt;I heart Guido&lt;/a&gt;. He is awesome, as is Python. That&amp;#8217;s why I&amp;#8217;m so sad. I want Guido to be a shining beacon of EVERYTHING, huility and openness included.&lt;/p&gt;

&lt;p&gt;Even if he didn&amp;#8217;t mean to be flip, it&amp;#8217;s very easy to interpret Guido as &lt;a href="http://en.wikipedia.org/wiki/Comic_Book_Guy"&gt;the comic book guy from The Simpsons&lt;/a&gt;. Worst. Python. Critique. Ever. &lt;/p&gt;

&lt;p&gt;In the end, I would  like to see legitimate, and relatively politely put crticisms by someone with as much nerd-cred as Zed, responded to with a teeny bit more thought than &amp;#8220;well you&amp;#8217;re an idiot&amp;#8221;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m glad Zed exists. I&amp;#8217;m glad he cares enough to take people to task and question things.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=pnidblNQg_I:nd3-rhADYJ8:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=pnidblNQg_I:nd3-rhADYJ8:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/pnidblNQg_I" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/05/zed-shaw-digital-patriot.html</feedburner:origLink></entry>

<entry>
    <title>The Bird is Back</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/PzpWW2jNVlw/the-bird-is-back.html" />
    <id>tag:www.codesoftly.com,2009://1.105</id>

    <published>2009-05-28T01:31:16Z</published>
    <updated>2009-05-29T01:54:50Z</updated>

    <summary><![CDATA[It's been a while. An unfortunate database accident blew away all my articles &amp; stuff that powered my Movable Type instance (along with a few other projects). Let this be a lesson on properly naming your databases... Anyway, I finally...]]></summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;It's been a while. An &lt;a href="http://twitter.com/aaron_oliver/status/1412186622"&gt;unfortunate database accident&lt;/a&gt; blew away all my articles &amp;amp; stuff that powered my &lt;a href="http://www.movabletype.org/"&gt;Movable Type&lt;/a&gt; instance (along with a few other projects). Let this be a lesson on properly naming your databases...&lt;/p&gt;

&lt;p&gt;Anyway, I finally managed to write a decent enough script to spider the old site and scrape the posts (yay static publishing!), then rip them into an import for this new instance. So here we are.&lt;/p&gt;

&lt;p&gt;I also moved Code Softly &lt;a href="http://codesoftly.com"&gt;onto it's own domain&lt;/a&gt;. No more sharing with &lt;a href="http://www.aaronoliver.com"&gt;aaronoliver.com&lt;/a&gt;.&lt;/p&gt; 

&lt;p&gt;I haven't really had time to style things up, so the site is in a very basic state. Pretty much the skeleton. It's ok, though. Kinda like that episode of Knight Rider when KITT fell in acid and was completely white.&lt;/p&gt;

&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hySGCIHZLyk&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/hySGCIHZLyk&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;

&lt;p&gt;Until the aesthetics are all worked out, I'll try to resume regular posts.&lt;/p&gt;
        
    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=PzpWW2jNVlw:4L0jeoYb2q8:wiPeWybXnrw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=PzpWW2jNVlw:4L0jeoYb2q8:wiPeWybXnrw" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/PzpWW2jNVlw" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2009/05/the-bird-is-back.html</feedburner:origLink></entry>

</feed>
