<?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>2012-01-03T23:02:48Z</updated>
    <subtitle>A programming blog by Aaron Oliver focusing on practical, humane software development</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.25</generator>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/CodeSoftly" /><feedburner:info uri="codesoftly" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><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><entry>
    <title>3 Selfish Features</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/ZwPC3U7to-k/selfish-features.html" />
    <id>tag:www.codesoftly.com,2012://1.384</id>

    <published>2012-01-03T23:00:52Z</published>
    <updated>2012-01-03T23:02:48Z</updated>

    <summary>Selfish features make your staff happy and efficient, but have **nothing** to do with helping your audience. Remember them? The people who are going to make or break you? **The people for whom your site exists in the first place?**</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <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;Selfish features make your staff happy and efficient, but have &lt;strong&gt;nothing&lt;/strong&gt; to do with helping your audience. Remember them? The people who are going to make or break you? &lt;strong&gt;The people for whom your site exists in the first place?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a few features I consider &amp;#8220;selfish&amp;#8221;:&lt;/p&gt;

&lt;h4&gt;1 - Content Management Systems (CMS)&lt;/h4&gt;

&lt;p&gt;CMS&amp;#8217;s are great, and critical for creating new information for your audience. Keep in mind that you &lt;em&gt;could&lt;/em&gt; read a book and learn to write HTML, or maybe even pay the geeky kid down the street to update a bunch of static pages for you. &lt;/p&gt;

&lt;p&gt;Don&amp;#8217;t wait for a CMS to start your site. Put SOMETHING up while you&amp;#8217;re rigging the internals of your authoring tool.&lt;/p&gt;

&lt;h4&gt;2 - Analytics Dashboards&lt;/h4&gt;

&lt;p&gt;Dashboards are sexy. They combine lot of impressive looking charts and figures into one place. &lt;/p&gt;

&lt;p&gt;Sadly, dashboards are time-consuming for developers to build &lt;strong&gt;and test&lt;/strong&gt;, and people rarely look at them. &lt;/p&gt;

&lt;p&gt;Try waiting until you find yourself saying &amp;#8220;Boy, if we only had metric X, I&amp;#8217;ll bet we could make 15% more&amp;#8221;, and THEN ask for the report or dashboard. Remember, time spent on reports is time NOT spent on features for your customers.&lt;/p&gt;

&lt;h4&gt;3 - Rich Text Editors&lt;/h4&gt;

&lt;p&gt;This goes along with the CMS selfish feature. People want their authoring experience to be &amp;#8220;just like using Word&amp;#8221;. &lt;strong&gt;Reality Alert&lt;/strong&gt;: &lt;em&gt;authoring HTML is not the same as authoring a term paper&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Rich text editors almost never work. They create bloated, crazy markup that messes with page styles, have unpredictable image placement and layout, and pretty much cause more trouble than they&amp;#8217;re worth. Consider &lt;a href="http://daringfireball.net/projects/markdown/"&gt;markdown&lt;/a&gt; or a similarly humane syntax that helps the author out, but doesn&amp;#8217;t try to candy-coat the reality of what they&amp;#8217;re doing.&lt;/p&gt;

&lt;p&gt;&lt;br/&gt;
&lt;br/&gt;&lt;/p&gt;

&lt;p&gt;There are many more. You get the idea.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not advocating that we &lt;em&gt;never&lt;/em&gt; build selfish features, but it&amp;#8217;s important to recognize them for what they are: indulgences to make life easier for you, and not for your audience. &lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=ZwPC3U7to-k:_WCxmNADZIc:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=ZwPC3U7to-k:_WCxmNADZIc:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=ZwPC3U7to-k:_WCxmNADZIc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=ZwPC3U7to-k:_WCxmNADZIc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=ZwPC3U7to-k:_WCxmNADZIc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=ZwPC3U7to-k:_WCxmNADZIc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=ZwPC3U7to-k:_WCxmNADZIc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/ZwPC3U7to-k" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2012/01/selfish-features.html</feedburner:origLink></entry>

<entry>
    <title>Don't Forget to Optimize</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/lziLRPKSevY/dont-forget-to-optimize.html" />
    <id>tag:www.codesoftly.com,2011://1.383</id>

    <published>2011-11-28T04:56:10Z</published>
    <updated>2011-11-28T05:13:54Z</updated>

    <summary>"Avoid premature optimization" is a popular and effective mantra. It's a defense against the temptation to worry about speed &amp; performance before you even have a working feature. Often, this ends up being "forget about optimization", and that's a big honking mistake. </summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="prematureoptimization" label="premature optimization" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="softwareengineering" label="software engineering" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="speed" label="speed" 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="muscle_engine.jpg" src="http://www.codesoftly.com/images/muscle_engine.jpg" width="500" height="309" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8220;&lt;a href="http://c2.com/cgi/wiki?PrematureOptimization"&gt;Avoid premature optimization&lt;/a&gt;&amp;#8221; is a popular and effective mantra. It&amp;#8217;s a defense against the temptation to worry about speed and performance before you even have a working feature. Sadly, this often ends up interpreted as &lt;strong&gt;&amp;#8220;forget about optimization&amp;#8221;&lt;/strong&gt;, and that&amp;#8217;s a big honking mistake. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://googleresearch.blogspot.com/2009/06/speed-matters.html"&gt;Speed matters&lt;/a&gt;. The magic number has changed over time, but the basic rule hasn&amp;#8217;t: the longer a page takes to load, the less likely people are to use it.&lt;/p&gt;

&lt;p&gt;Too often programmers quote The Mantra and then neglect to ever optimize. The idea is to avoid focusing on speed &lt;strong&gt;too soon&lt;/strong&gt;, but not &lt;strong&gt;forever&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The best way to avoid forgetting about performance is to &lt;a href="http://www.codinghorror.com/blog/2011/06/performance-is-a-feature.html"&gt;make it a feature&lt;/a&gt;. When building your backlog, pop in a story that goes like this:&lt;/p&gt;

&lt;p&gt;&lt;blockqoute&gt;&lt;em&gt;As a user I want the homepage to load in under two seconds so I can quickly view the upcoming concert schedule&lt;/em&gt;
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;That way, everyone understands the value of speed, and it doesn&amp;#8217;t get sacrificed for more easily visible features.&lt;/p&gt;

&lt;p&gt;Image by &lt;a href="/photos/ragingmike/"&gt;Mike L Photo&amp;#8217;s&lt;/a&gt; &lt;a href="http://creativecommons.org/licenses/by/2.0/"&gt;&lt;img src="http://l.yimg.com/g/images/cc_icon_attribution_small.gif"  border="0" alt="Attribution" title="Attribution"&gt;&lt;/a&gt; &lt;a href="http://creativecommons.org/licenses/by/2.0/" title="Attribution License"&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=lziLRPKSevY:00xWP9XvuWo:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=lziLRPKSevY:00xWP9XvuWo:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=lziLRPKSevY:00xWP9XvuWo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=lziLRPKSevY:00xWP9XvuWo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=lziLRPKSevY:00xWP9XvuWo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=lziLRPKSevY:00xWP9XvuWo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=lziLRPKSevY:00xWP9XvuWo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/lziLRPKSevY" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/11/dont-forget-to-optimize.html</feedburner:origLink></entry>

<entry>
    <title>Tool Thrash</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/g6eXY9E8IT4/tool-thrash.html" />
    <id>tag:www.codesoftly.com,2011://1.382</id>

    <published>2011-11-26T01:59:52Z</published>
    <updated>2011-11-26T05:16:56Z</updated>

    <summary>At work we're looking into new tools to manage workflow, tasks, and status. I realized that it's useful to work with something cumbersome to help learn what you really value in a tool.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="tools" label="tools" 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="tools.jpg" src="http://www.codesoftly.com/images/tools.jpg" width="500" height="309" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;At &lt;a href="http://firstpier.com"&gt;work&lt;/a&gt; we&amp;#8217;re looking for a new tool to manage workflow, tasks, and status. We haven&amp;#8217;t been thrilled with our current system, but decided to live with it until it became to painful and/or costly to keep around. &lt;/p&gt;

&lt;p&gt;I think living with the bad tool has been instrumental in learning what we want in a great system.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s always a strong temptation to discard something that pisses you off and try something new ASAP. When you do this, you learn what you hate, but very little about what you &lt;strong&gt;value&lt;/strong&gt;. You might go through three or four tools before you get a handle on the core features that mean the most.&lt;/p&gt;

&lt;p&gt;Living in pain, on the other hand, cultivates wisdom. You start learning &lt;strong&gt;why&lt;/strong&gt; you can&amp;#8217;t stand the lack of a quality workflow system, how important project setup is, and if you care about how fast it is. &lt;/p&gt;

&lt;p&gt;With a list of grievances, there&amp;#8217;s little room for &amp;#8220;well, that&amp;#8217;s just, like, your opinion, man&amp;#8221;, and more experience-based decisions emerge naturally: &amp;#8220;Remember how much you hate that tiny text field?&amp;#8221;. It&amp;#8217;s much clearer when a good choice presents itself.&lt;/p&gt;

&lt;p&gt;Once you learn these things, you can pick your next (and hopefully last) tool. Fingers crossed.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://l.yimg.com/g/images/cc_icon_attribution_small.gif"  border="0" alt="Attribution" title="Attribution"&gt;&lt;img src="http://l.yimg.com/g/images/cc_icon_noncomm_small.gif"   border="0" alt="Noncommercial" title="Noncommercial"&gt; Photo by &lt;a href="http://flickr.com/photos/nhankamer/"&gt;Noel C. Hankamer&lt;/a&gt; &lt;a href="http://creativecommons.org/licenses/by-nc/2.0/" title="Attribution-NonCommercial License"&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=g6eXY9E8IT4:iG2VcoYL42k:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=g6eXY9E8IT4:iG2VcoYL42k:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=g6eXY9E8IT4:iG2VcoYL42k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=g6eXY9E8IT4:iG2VcoYL42k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=g6eXY9E8IT4:iG2VcoYL42k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=g6eXY9E8IT4:iG2VcoYL42k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=g6eXY9E8IT4:iG2VcoYL42k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/g6eXY9E8IT4" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/11/tool-thrash.html</feedburner:origLink></entry>

<entry>
    <title>CSS Sanity: Frameworks</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/I3ZICJH8q9Q/css-sanity-frameworks.html" />
    <id>tag:www.codesoftly.com,2011://1.380</id>

    <published>2011-09-28T22:34:46Z</published>
    <updated>2011-09-28T22:48:28Z</updated>

    <summary>Ever spend more than 45 minutes trying to align three page elements in a horizontal row? </summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="blueprint" label="blueprint" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="css" label="css" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="semanticweb" label="semantic web" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tools" label="tools" 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="table.jpg" src="http://www.codesoftly.com/table.jpg" width="200" height="323" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Ever spend more than 45 minutes trying to align three page elements in a horizontal row? Of course you have. &lt;/p&gt;

&lt;p&gt;Like most developers, you refuse to use the &lt;code&gt;table&lt;/code&gt; element for layout. The problem is that &lt;a href="http://oppugn.us/posts/1287608776.html"&gt;CSS stinks&lt;/a&gt; for horizontal layout. So we&amp;#8217;re left fighting block and inline display rules, temperamental width issues, absolute vs. relative positioning, and browser quirks (wtf is the box model, anyway?).&lt;/p&gt;

&lt;p&gt;CSS frameworks to the rescue. They let you do fairly semantic markup, have minimal sizes, are multi-browser compatible, and make it easy to align page elements. &lt;/p&gt;

&lt;p&gt;My personal favorite it &lt;a href="http://www.blueprintcss.org/"&gt;Blueprint&lt;/a&gt;, but there are &lt;a href="http://speckyboy.com/2008/03/28/top-12-css-frameworks-and-how-to-understand-them/"&gt;a bunch of others&lt;/a&gt;. &lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=I3ZICJH8q9Q:OSX9u9u1_Tk:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=I3ZICJH8q9Q:OSX9u9u1_Tk:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=I3ZICJH8q9Q:OSX9u9u1_Tk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=I3ZICJH8q9Q:OSX9u9u1_Tk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=I3ZICJH8q9Q:OSX9u9u1_Tk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=I3ZICJH8q9Q:OSX9u9u1_Tk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=I3ZICJH8q9Q:OSX9u9u1_Tk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/I3ZICJH8q9Q" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/09/css-sanity-frameworks.html</feedburner:origLink></entry>

<entry>
    <title>Beware the Immovable Deadline</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/G2w8LPxU9C8/beware-the-immovable-deadline.html" />
    <id>tag:www.codesoftly.com,2011://1.379</id>

    <published>2011-09-27T23:32:44Z</published>
    <updated>2011-09-28T00:30:46Z</updated>

    <summary>Almost every software development deadline is movable. 
if your company set the deadline, your company can move it.
Compare that to a deadline that is IMPOSSIBLE to move, no matter how much you or your company wants it. </summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="deadlines" label="deadlines" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="planning" label="planning" 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="eclipse.jpg" src="http://www.codesoftly.com/eclipse.jpg" width="500" height="308" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Almost every software development deadline is movable. Even if the CEO of your Fourtune 50 company has promised via international press conference your product will ship August 1st, the deadline can move.&lt;/p&gt;

&lt;p&gt;Of course, your CEO will scream at you and be pissed, the public might be disappointed, people may be fired, but if your company set the deadline, your company can move it.&lt;/p&gt;

&lt;p&gt;Compare that to a deadline that is IMPOSSIBLE to move, no matter how much you or your company wants it. &lt;/p&gt;

&lt;p&gt;If your product release is tied to a national holiday, astrological event, or similarly externally imposed temporal happening, be very careful how you build. &lt;/p&gt;

&lt;p&gt;Be paranoid. Build, test, and deploy &lt;strong&gt;only the bare essentials&lt;/strong&gt;. Start immediately. There&amp;#8217;s always time to add on further enhancements once you have &lt;em&gt;something&lt;/em&gt; live.&lt;/p&gt;

&lt;p&gt;Need to build a home search site in time for a local leather festival&amp;#8217;s parade? Start with a static HTML page that lists all the properties in alphabetical order. &lt;/p&gt;

&lt;p&gt;Need a site that lets people track an upcoming NASA mission? Just publish a static timetable of the launch events. Build the interactive streaming video stuff once that&amp;#8217;s up.&lt;/p&gt;

&lt;p&gt;Having zero features at the deadline is utterly unacceptable, so get something greater than zero deployed ASAP. Remember that any number of catastrophes can happen between now and your deadline (the one you can&amp;#8217;t miss), so get it out of the way. &lt;/p&gt;

&lt;p&gt;This also has the nice side effect of acting as a kind of minimum viable product, and you can get early-users&amp;#8217; feedback to help drive the other features. It would suck to spend months building an &lt;a href="http://youtu.be/ZKw_Mp5YkaE"&gt;augmented reality&lt;/a&gt; feature for &lt;a href="http://www.luxurytravelmagazine.com/news-articles/celebrate-11-11-11-in-luxury-16381.php"&gt;11/11/11&lt;/a&gt; day, only to find out three people used it.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=G2w8LPxU9C8:aizkoloNUXw:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=G2w8LPxU9C8:aizkoloNUXw:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=G2w8LPxU9C8:aizkoloNUXw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=G2w8LPxU9C8:aizkoloNUXw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=G2w8LPxU9C8:aizkoloNUXw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=G2w8LPxU9C8:aizkoloNUXw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=G2w8LPxU9C8:aizkoloNUXw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/G2w8LPxU9C8" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/09/beware-the-immovable-deadline.html</feedburner:origLink></entry>

<entry>
    <title>Dear Facebook, That Was Smart </title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/54Jq9XfFNFk/dear-facebook-that-was-smart.html" />
    <id>tag:www.codesoftly.com,2011://1.378</id>

    <published>2011-09-24T13:05:37Z</published>
    <updated>2011-09-24T13:17:18Z</updated>

    <summary>I'm pretty sure Facebook's f8 conference this year was scheduled AFTER they had all their ducks in a row for the new Timeline and OpenGraph features. That's pretty dang smart if you're dedicated to quality products.
</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="facebook" label="facebook" 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&amp;#8217;m pretty sure Facebook&amp;#8217;s &lt;a href="http://f8.facebook.com"&gt;f8 conference&lt;/a&gt; this year was scheduled AFTER they had all their ducks in a row for the new &lt;a href="http://www.facebook.com/about/timeline"&gt;Timeline&lt;/a&gt; and &lt;a href="http://developers.facebook.com/blog/post/564/"&gt;OpenGraph&lt;/a&gt; features. That&amp;#8217;s pretty dang smart if you&amp;#8217;re dedicated to quality products.&lt;/p&gt;

&lt;p&gt;This year&amp;#8217;s F8 conference wasn&amp;#8217;t announced until about 30 days before it happened. That&amp;#8217;s a little weird for a major tech event. Often they&amp;#8217;re set up a year or more in advance. &lt;/p&gt;

&lt;p&gt;I was puzzled until I started thinking about the pressure that must have been on the Facebook development teams to finish the features in time to have them ready for zillions of people to use the instant Mark finished his keynote. Then I realized what probably happened.&lt;/p&gt;

&lt;p&gt;What makes the most sense to me is that Facebook finished Timeline and OpenGraph, and THEN scheduled f8. &lt;/p&gt;

&lt;p&gt;Genius! No rushing at the end to cram in half-finished features. No shortening of the test cycle. It&amp;#8217;s so much healthier to keep refining a product, and have someone watching to determine when it&amp;#8217;s &amp;#8220;done enough&amp;#8221;, and THEN go scheduling announcements, rollouts, and other dramatic things.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=54Jq9XfFNFk:aGsDAZCM6Fo:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=54Jq9XfFNFk:aGsDAZCM6Fo:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=54Jq9XfFNFk:aGsDAZCM6Fo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=54Jq9XfFNFk:aGsDAZCM6Fo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=54Jq9XfFNFk:aGsDAZCM6Fo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=54Jq9XfFNFk:aGsDAZCM6Fo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=54Jq9XfFNFk:aGsDAZCM6Fo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/54Jq9XfFNFk" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/09/dear-facebook-that-was-smart.html</feedburner:origLink></entry>

<entry>
    <title>Leftover Soap and Team Size</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/zSGlYm8c3Ig/leftover-soap-and-team-size.html" />
    <id>tag:www.codesoftly.com,2011://1.374</id>

    <published>2011-05-10T10:30:08Z</published>
    <updated>2011-05-10T10:38:36Z</updated>

    <summary>I've noticed that when our family's bar of Zest is reduced to a certain size, it becomes ineffective. There's still soap in there, but it just doesn't seem to produce any quality lather. I suspect the same is true of small software development teams.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="methodology" label="methodology" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="soap" label="soap" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="softwareengineering" label="software engineering" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="teams" label="teams" 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="soap.jpg" src="http://www.codesoftly.com/images/soap.jpg" width="299" height="364" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve noticed that when our family&amp;#8217;s bar of Zest is reduced to a certain size, it becomes ineffective. There&amp;#8217;s still soap in there, but it just doesn&amp;#8217;t seem to produce any quality lather. I suspect the same is true of small software development teams.&lt;/p&gt;

&lt;p&gt;A team of one or two programmers is small and nimble, but &lt;strong&gt;susceptible to external forces&lt;/strong&gt;. If a team member gets sick, goes on vacation, or takes another job, your team is reduced by 50% or 100% for that time. That&amp;#8217;s a lot. The remaining team member is almost certainly forced into some extremely inefficient task-switching, further reducing throughput.&lt;/p&gt;

&lt;p&gt;I think it&amp;#8217;s OK to dedicate a very small number of people to a task, as long as they&amp;#8217;re &lt;strong&gt;part of a larger team&lt;/strong&gt; with members who can help out in a pinch. Plus the team will naturally cross-train as they ask each other for help or advice.  &lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=zSGlYm8c3Ig:mo73wyxEoAk:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=zSGlYm8c3Ig:mo73wyxEoAk:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=zSGlYm8c3Ig:mo73wyxEoAk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=zSGlYm8c3Ig:mo73wyxEoAk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=zSGlYm8c3Ig:mo73wyxEoAk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=zSGlYm8c3Ig:mo73wyxEoAk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=zSGlYm8c3Ig:mo73wyxEoAk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/zSGlYm8c3Ig" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/05/leftover-soap-and-team-size.html</feedburner:origLink></entry>

<entry>
    <title>OF COURSE! Put Your Call To Action in the Terminal Area</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/Qt_mg_57f_k/of-course-put-your-call-to-action-in-the-terminal-area.html" />
    <id>tag:www.codesoftly.com,2011://1.375</id>

    <published>2011-05-06T02:56:59Z</published>
    <updated>2011-05-06T03:04:27Z</updated>

    <summary>Here's a post that explains how your site's call to action should go where it does the most good, in the terminal area (it's science, yo)</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="buttons" label="buttons" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="calltoaction" label="call to action" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="design" label="design" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="usability" label="usability" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;I am by no means a user interface expert, but I like to have some clue as to what works and what doesn&amp;#8217;t, and so I find the occasional nugget of practical design interesting.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s &lt;a href="http://uxmovement.com/buttons/why-users-click-right-call-to-actions-more-than-left-ones"&gt;a post&lt;/a&gt; that explains how your site&amp;#8217;s &lt;a href="http://www.smashingmagazine.com/2009/10/13/call-to-action-buttons-examples-and-best-practices/"&gt;call to action&lt;/a&gt; should go where it does the most good, in the terminal area (it&amp;#8217;s science, yo):&lt;/p&gt;

&lt;blockquote&gt;
A but­ton in the ter­mi­nal area is a com­pelling call to action because it&amp;#8217;s placed at the end of the user&amp;#8217;s view­ing pat­tern. When it&amp;#8217;s at the end of their view­ing pat­tern, users don&amp;#8217;t have to look around to find your call to action but­ton. Putting your call to action but­ton in any other area could get you clicks, but not as effec­tively as putting it in the ter­mi­nal area.
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://uxmovement.com/buttons/why-users-click-right-call-to-actions-more-than-left-ones"&gt;Why Users Click Right Call to Actions More Than Left Ones&lt;/a&gt; [UX Movement]&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=Qt_mg_57f_k:sAmK123iDcM:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=Qt_mg_57f_k:sAmK123iDcM:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=Qt_mg_57f_k:sAmK123iDcM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=Qt_mg_57f_k:sAmK123iDcM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=Qt_mg_57f_k:sAmK123iDcM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=Qt_mg_57f_k:sAmK123iDcM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=Qt_mg_57f_k:sAmK123iDcM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/Qt_mg_57f_k" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/05/of-course-put-your-call-to-action-in-the-terminal-area.html</feedburner:origLink></entry>

<entry>
    <title>The Tourniquet Pattern Explained</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/V8SAUERTik4/the-tourniquet-pattern-explained.html" />
    <id>tag:www.codesoftly.com,2011://1.373</id>

    <published>2011-05-04T02:09:12Z</published>
    <updated>2011-05-04T10:57:27Z</updated>

    <summary>Today Mike Pirnat and I were discussing a particularly nasty piece of legacy code we often have to interface with. I described one technique he had used as the Tourniquet Pattern. 

This Tourniquet is when you declare a section of your system to be too complex to directly work with or improve safely, and so you seal it off behind cleaner interfaces.
</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="patterns" label="patterns" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="softwareengineering" label="software engineering" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tourniquet" label="tourniquet" 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="Bandage" src="http://www.codesoftly.com/images/image.jpg" width="500" height="488" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Today &lt;a href="http://mike.pirnat.com/"&gt;Mike Pirnat&lt;/a&gt; and I were discussing a particularly nasty piece of legacy code we often have to interface with. I described one technique he had used as the &lt;strong&gt;Tourniquet Pattern&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;This Tourniquet is when you declare a section of your system to be too complex to directly work with or improve safely, and so you seal it off behind cleaner interfaces.&lt;/p&gt;

&lt;h3&gt;When You Need A Tourniquet&lt;/h3&gt;

&lt;p&gt;A favorite interview question of mine is &amp;#8220;Do you always refactor and fix legacy code when you come across it?&amp;#8221;. This is by no means a clear issue. A person can get lost in refactoring, turning a one-day activity into three weeks of hacking, with no guaranteed results.&lt;/p&gt;

&lt;p&gt;Some legacy systems, though, are so arcane, so &lt;strong&gt;toxic&lt;/strong&gt;, that the safest thing is to get in, make changes, and &lt;strong&gt;get the eff out&lt;/strong&gt; before anyone gets hurt.&lt;/p&gt;

&lt;p&gt;This is the kind of system that may require the Tourniquet.&lt;/p&gt;

&lt;h3&gt;When You Don&amp;#8217;t Need A Tourniquet&lt;/h3&gt;

&lt;p&gt;Just as in real life, if you need a tourniquet, things are dire. For the sake of the larger system, you&amp;#8217;re cutting off a section of code. &lt;/p&gt;

&lt;p&gt;You don&amp;#8217;t need the Tourniquet if you&amp;#8217;re writing new modules or if you have any practical way to refactor or rebuild the problem systems. Use it sparingly, and always as part of a larger improvement plan.&lt;/p&gt;

&lt;h3&gt;An Example: Man-Purse Purchasing System&lt;/h3&gt;

&lt;p&gt;Our &lt;a href="http://codesoftly.com/2010/03/solved-the-ask-for-many-got-some-problem.html"&gt;man-purse store&lt;/a&gt; has a purchasing system we inherrited from the previous owner. It&amp;#8217;s gnarly, and was written with total disregard for human life or maintainability. It&amp;#8217;s interface looks like this:&lt;/p&gt;

&lt;pre class="brush:python"&gt;

class MPPS():

    def __init__(self, a, x, qw="default", roching="", extra=True):
         ...

    def buy_it_now(self, itema, itemb, opt_itemc, coupon="FX"):
        if self.isnt_debugging:
            self._do_spanish_purchase()
        else:
            if self._has_blue():
              ...
        # and so on for ~ 1000 lines or so
&lt;/pre&gt;

&lt;p&gt;This kind of setup makes it almost impossible to cleanly add new features, especially when that module gets to be a few hundred or thousands of lines long (please, stop sighing in disgust, you know you&amp;#8217;ve seen something like this).&lt;/p&gt;

&lt;p&gt;To apply a Tourniquet, we might pull out the calls we know about and make them easier to call:&lt;/p&gt;

&lt;pre class="brush:python"&gt;

class PurchaseHandler(object):

    def __init__(self, legacy_purchaser, new_purchaser):
        self.legacy_purchaser = legacy_purchaser
        self.new_purchaser = new_purchaser

    def buy_hat(hat_sku):
        """a new feature! we sell hats now

        """
        self.new_purchaser.buy(hat_sku)

    def buy_spanish_purse(purse_sku):
        """an old feature, but with a cleaner interface.

        """ 
        self.legacy_purchaser.isnt_debugging = True
        self.legacy_purchaser.buy_it_now(purse_sku)

    def buy_other(self, a, x, qw="default", roching="", extra=True):
        """ support the old gross interface until we're done porting it all

        """
        return self.legacy_purchaser.buy_it_now(a, x, qw, roching, extra)

&lt;/pre&gt;

&lt;p&gt;In this case we&amp;#8217;ve picked out a case where the new feature is added, and we leave the rest of it alone, making better interfaces where possible, or just acting like the old module everywhere else. &lt;/p&gt;

&lt;p&gt;Over time, the newer, cleaner methods should replace the older ones. The Tourniquet has given us a place to start to gradually and safely make things better.&lt;/p&gt;

&lt;h3&gt;Hey, You&amp;#8217;re Just Hiding BAD CODE&lt;/h3&gt;

&lt;p&gt;Life is full of hard choices. If we had unlimited time, we could bite the bullet and re-engineer systems from the ground up as they mature. Sadly, we almost never have that luxury. This pattern &lt;strong&gt;admits that the code is bad&lt;/strong&gt;, but at least provides a clean cut from which to build newer and better stuff.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=V8SAUERTik4:5PrUmLCUXxg:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=V8SAUERTik4:5PrUmLCUXxg:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=V8SAUERTik4:5PrUmLCUXxg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=V8SAUERTik4:5PrUmLCUXxg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=V8SAUERTik4:5PrUmLCUXxg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=V8SAUERTik4:5PrUmLCUXxg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=V8SAUERTik4:5PrUmLCUXxg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/V8SAUERTik4" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/05/the-tourniquet-pattern-explained.html</feedburner:origLink></entry>

<entry>
    <title>Two Developer Perspectives on the AWS Failure</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/sUKYr3QDT80/two-developer-perspectives-on-the-aws-failure.html" />
    <id>tag:www.codesoftly.com,2011://1.372</id>

    <published>2011-04-27T02:27:16Z</published>
    <updated>2011-04-27T02:36:20Z</updated>

    <summary>Yes, Amazon’s recent issues were a bit of a spectacle, but a couple of posts I read went beyond the typical Nelson-esque “Heaaaah Haaaa” and looked at things from the perspective of those who design and run the client systems....</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="amazon" label="Amazon" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="aws" label="AWS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="codinghorror" label="codinghorror" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="fail" label="fail" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jeffatwood" label="jeff atwood" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="softwareengineering" label="software engineering" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="teddzubia" label="ted dzubia" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;Yes, Amazon&amp;#8217;s recent issues were a bit of a spectacle, but a couple of posts I read went beyond the typical &lt;a href="http://en.wikipedia.org/wiki/Nelson_Muntz"&gt;Nelson&lt;/a&gt;-esque &amp;#8220;Heaaaah Haaaa&amp;#8221; and looked at things from the perspective of those who design and run the client systems.&lt;/p&gt;

&lt;h3&gt;Y&amp;#8217;all Got What You Deserve&lt;/h3&gt;

&lt;p&gt;Ted Dziuba&amp;#8217;s post indicates that you relying upon the cloud is destined to fail.&lt;/p&gt;

&lt;blockquote&gt;
Pain is nature&amp;#8217;s way of telling you that you have just fucked up. It&amp;#8217;s a hint to your future self that maybe you should never do that again. Yet, you dumbasses continue to host things full-bore in Amazon. 
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://teddziuba.com/2011/04/amazon-the-purpose-of-pain.html"&gt;Amazon &amp;#8212; The Purpose of Pain&lt;/a&gt; [Ted Dziuba]&lt;/p&gt;

&lt;h3&gt;We&amp;#8217;re Living Proof&lt;/h3&gt;

&lt;p&gt;Jeff Attwood illustrates Netflix&amp;#8217;s counterexample, VERY interesting because Netflix has a program (on purpose!) that runs around destroying things to make sure it&amp;#8217;s all fault-tolerant. Pretty gutsy&amp;#8230;&lt;/p&gt;

&lt;blockquote&gt;
Which, let&amp;#8217;s face it, seems like insane advice at first glance. I&amp;#8217;m not sure many companies even understand why this would be a good idea, much less have the guts to attempt it. Raise your hand if where you work, someone deployed a daemon or service that randomly kills servers and processes in your server farm.
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/2011/04/working-with-the-chaos-monkey.html"&gt;Working With the Chaos Monkey&lt;/a&gt; [Coding Horror]&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=sUKYr3QDT80:aPtESfH5gko:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=sUKYr3QDT80:aPtESfH5gko:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=sUKYr3QDT80:aPtESfH5gko:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=sUKYr3QDT80:aPtESfH5gko:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=sUKYr3QDT80:aPtESfH5gko:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=sUKYr3QDT80:aPtESfH5gko:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=sUKYr3QDT80:aPtESfH5gko:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/sUKYr3QDT80" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/04/two-developer-perspectives-on-the-aws-failure.html</feedburner:origLink></entry>

<entry>
    <title>Where's The OFF Switch on This Thing?</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/q9Fcfhum7Pc/wheres-the-off-switch-on-this-thing.html" />
    <id>tag:www.codesoftly.com,2011://1.369</id>

    <published>2011-04-02T00:00:19Z</published>
    <updated>2011-04-02T00:01:27Z</updated>

    <summary>As I enter the golden years of my software-rigging career, I find that I REALLY value having a convenient off-switch for new features.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="deployments" label="deployments" 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="on_off.jpg" src="http://www.codesoftly.com/images/on_off.jpg" width="550" height="413" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;As I enter the golden years/era of my software-rigging career, I find that I REALLY value having a convenient off-switch for new features.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re working in a shop of moderate to large size, chances are you can&amp;#8217;t get code changed in the production environment in under 30 minutes and without considerable stress. This is when it pays to have a &lt;strong&gt;toggle switch&lt;/strong&gt; to enable and disable your feature/site/nuclear-release-countdown.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s one of those things that&amp;#8217;s easy to build but often ignored. When you have the off-switch, you take some of the stress out of production moves. &lt;/p&gt;

&lt;p&gt;If things start going south, you just flip the switch and reassess. You &lt;strong&gt;don&amp;#8217;t&lt;/strong&gt; need to back out an entire release, or run around screaming for an hour and a half, trying to convince people that your changes need to be backed out or hacking a hasty patch.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=q9Fcfhum7Pc:7LTirZ1Pg4w:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=q9Fcfhum7Pc:7LTirZ1Pg4w:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=q9Fcfhum7Pc:7LTirZ1Pg4w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=q9Fcfhum7Pc:7LTirZ1Pg4w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=q9Fcfhum7Pc:7LTirZ1Pg4w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=q9Fcfhum7Pc:7LTirZ1Pg4w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=q9Fcfhum7Pc:7LTirZ1Pg4w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/q9Fcfhum7Pc" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/04/wheres-the-off-switch-on-this-thing.html</feedburner:origLink></entry>

<entry>
    <title>No More Parking Lots</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/FvvPSFMECco/no-more-parking-lots.html" />
    <id>tag:www.codesoftly.com,2011://1.368</id>

    <published>2011-03-21T20:12:33Z</published>
    <updated>2011-03-21T22:53:53Z</updated>

    <summary>Try making a to-do list instead of a parking lot in meetings.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <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="parkinglot" label="parking lot" 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="parking_lot.jpg" src="http://www.codesoftly.com/images/parking_lot.jpg" width="550" height="413" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;When you have meetings, do you make a &amp;#8220;parking lot&amp;#8221;? A section of the whiteboard where you put unanswerable questions that arise during the meeting? Try making a to-do list instead. &lt;/p&gt;

&lt;p&gt;The difference is subtle but important. A parking lot is a list of shoulder-shrugs. It&amp;#8217;s codified procrastination. Parking lot items say &amp;#8220;We don&amp;#8217;t know but surely someone will figure this out later&amp;#8221;. You might even write them down, but what are the odds someone will follow up?&lt;/p&gt;

&lt;p&gt;Better to define &lt;strong&gt;tasks&lt;/strong&gt; that resolve the questions.&lt;/p&gt;

&lt;p&gt;For example, a parking lot item might read &lt;/p&gt;

&lt;blockquote&gt;
&amp;#8220;Do we need to support multiple languages and locales?&amp;#8221;
&lt;/blockquote&gt;

&lt;p&gt;This is bad because it&amp;#8217;s not clear how this can be answered, or who&amp;#8217;s supposed to do it.&lt;/p&gt;

&lt;p&gt;A better  to-do would be&lt;/p&gt;

&lt;blockquote&gt;
&amp;#8220;Ask Joel Q if we need to support multiple languages&amp;#8221;
&lt;/blockquote&gt;

&lt;p&gt;Maybe also stick on a post-it identifying who&amp;#8217;s going to do it. Now you&amp;#8217;ve got a good idea of what&amp;#8217;s going to happen next and solve the mystery.&lt;/p&gt;

&lt;p&gt;This applies to lots of other items, too. Ever make a list of &amp;#8220;Areas for Improvement&amp;#8221;? Instead nebulous problem statements like &amp;#8220;Too many bugs&amp;#8221;, use actionable to-do&amp;#8217;s like &amp;#8220;Ensure all test cases pass in the test environment before moving on to the next feature&amp;#8221;.&lt;/p&gt;

&lt;p&gt;[image courtesy &lt;a href="http://www.flickr.com/photos/murphyj/"&gt;sortofbreakit&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=FvvPSFMECco:JBy-Z6RpRe8:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=FvvPSFMECco:JBy-Z6RpRe8:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=FvvPSFMECco:JBy-Z6RpRe8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=FvvPSFMECco:JBy-Z6RpRe8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=FvvPSFMECco:JBy-Z6RpRe8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=FvvPSFMECco:JBy-Z6RpRe8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=FvvPSFMECco:JBy-Z6RpRe8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/FvvPSFMECco" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/03/no-more-parking-lots.html</feedburner:origLink></entry>

<entry>
    <title>Get Your Facebook Application Access Token</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/x4sv2gNIz-o/how-to-get-your-facebook-application-access-token.html" />
    <id>tag:www.codesoftly.com,2011://1.367</id>

    <published>2011-03-21T00:07:37Z</published>
    <updated>2011-03-21T00:38:46Z</updated>

    <summary>I recently needed to create some test Facebook users, so had to dredge up some info on how to do it. I ended up searching a bit and experimenting. Turns out all you need is your application id and secret, which is right there on your application profile page (if your the developer for it). </summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="facebook" label="facebook" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="oauth" label="oauth" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tips" label="tips" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;I recently needed to create some &lt;a href="http://developers.facebook.com/docs/test_users/"&gt;test Facebook users&lt;/a&gt;, but ran into a problem when I needed to get my application&amp;#8217;s access token. So I ended up searching a bit and experimenting, and it&amp;#8217;s simple. Turns out all you need is your application id and secret, which is right there on your application profile page (if your the developer for it). Then you just hit the oauth/authorize endpoint of the graph API, and you get back the access token:&lt;/p&gt;

&lt;pre&gt;
curl "https://graph.facebook.com/oauth/access_token
    ?grant_type=client_credentials
    &amp;client_id=11111111
    &amp;client_secret=9999999999"
&lt;/pre&gt;

&lt;h3&gt;When You Need An Application Access Token&lt;/h3&gt;

&lt;p&gt;You need to use a Facebook application access token when you have a process that acts on behalf of the application, rather than on behalf of a particular user. This happens when you access your &lt;a href="http://www.facebook.com/help/?page=914"&gt;Facebook Insights&lt;/a&gt; data for your app via the graph, and also when you want to create test Facebook users for your app.&lt;/p&gt;

&lt;p&gt;Sadly, the documentation for this is buried in the &lt;a href="http://developers.facebook.com/docs/authentication/"&gt;authentication guide&lt;/a&gt; for the Facebook graph API.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=x4sv2gNIz-o:5F9LXkfhh4k:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=x4sv2gNIz-o:5F9LXkfhh4k:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=x4sv2gNIz-o:5F9LXkfhh4k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=x4sv2gNIz-o:5F9LXkfhh4k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=x4sv2gNIz-o:5F9LXkfhh4k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=x4sv2gNIz-o:5F9LXkfhh4k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=x4sv2gNIz-o:5F9LXkfhh4k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/x4sv2gNIz-o" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/03/how-to-get-your-facebook-application-access-token.html</feedburner:origLink></entry>

<entry>
    <title>Are Queues Un-Monitorable?</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/kCOB3olNS6E/are-queues-un-monitorable.html" />
    <id>tag:www.codesoftly.com,2011://1.366</id>

    <published>2011-03-19T12:39:20Z</published>
    <updated>2011-03-19T12:48:22Z</updated>

    <summary>In his post on monitoring, Ted Dzuiba mentions in passing how queue's are a crutch that cannot be effectively monitored, and that you're better off doing synchronous, load-balanced work.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="design" label="design" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="monitoring" label="monitoring" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="queues" label="queues" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="teddzubia" label="ted dzubia" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.codesoftly.com/">
        &lt;p&gt;In his &lt;a href="http://teddziuba.com/2011/03/monitoring-theory.html"&gt;post&lt;/a&gt; on monitoring Ted Dziuba mentions that queues are a crutch that cannot be effectively monitored, and that you&amp;#8217;re better off doing synchronous, load-balanced work.&lt;/p&gt;

&lt;blockquote&gt;
End to end, how do you check that this system is OK? The logical entry point for a monitor is the producer, send a job through the system and check that it gets processed by a consumer, but the asynchronous queue makes that determination a judgment call. What if it takes a minute? What if it takes an hour? Is the system still OK if the time from job production to job completion is a day?
&lt;/blockquote&gt;

&lt;p&gt;I guess I&amp;#8217;d like to think about this a a bit more, since it resonates with my &amp;#8220;You should think about testability when designing&amp;#8221; senses.&lt;/p&gt;

&lt;p&gt;Of course, I&amp;#8217;m no queue or synchronized consumer expert, so I&amp;#8217;m all ears on opinions and experiences&lt;/p&gt;

&lt;p&gt;&lt;a href="http://teddziuba.com/2011/03/monitoring-theory.html"&gt;Monitoring Theory&lt;/a&gt; - [Ted Dziuba]&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=kCOB3olNS6E:K6aa7YGaPCk:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=kCOB3olNS6E:K6aa7YGaPCk:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=kCOB3olNS6E:K6aa7YGaPCk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=kCOB3olNS6E:K6aa7YGaPCk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=kCOB3olNS6E:K6aa7YGaPCk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=kCOB3olNS6E:K6aa7YGaPCk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=kCOB3olNS6E:K6aa7YGaPCk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/kCOB3olNS6E" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/03/are-queues-un-monitorable.html</feedburner:origLink></entry>

<entry>
    <title>Ferrari or Smart Car? Quality vs. Class</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/SHFhUD0MfeM/ferrarri-or-smartcar.html" />
    <id>tag:www.codesoftly.com,2011://1.364</id>

    <published>2011-03-17T01:43:06Z</published>
    <updated>2011-03-17T02:35:19Z</updated>

    <summary>As developers, we need to dispel the myth that sacrificing quality is a good method for getting quicker results. We should instead stress that if you want something fast, perhaps a solution of a different class is in order.</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="cars" label="cars" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="methodology" label="methodology" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="quality" label="quality" 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="ferrari_599_GTO_2011.jpg" src="http://www.codesoftly.com/images/ferrari_599_GTO_2011.jpg" width="500" height="309" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;As developers and product owners, we often confuse quality and class. &lt;/p&gt;

&lt;p&gt;&amp;#8220;We need a quick and dirty version to try this all out&amp;#8221;. This phrase is often interpreted as &amp;#8220;Build a quick, crappy solution. Commit as many sins as you like. Just get me my features by Monday&amp;#8221;.&lt;/p&gt;

&lt;p&gt;As developers, we need to dispel the myth that sacrificing quality is a good method for getting quicker results. We should instead stress that &lt;strong&gt;if you want something fast, perhaps a solution of a different class is in order&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;Quality and Class&lt;/h3&gt;

&lt;p&gt;A &lt;a href="http://www.ferrari.com/English/GT_Sport%20Cars/CurrentRange/599-GTO/Pages/599GTO.aspx"&gt;2011 Ferrari GTO&lt;/a&gt; goes 200 miles-per-hour and does zero to sixty in about three seconds.  It is awesome. It also costs about $500K. I&amp;#8217;m not sure exactly how they&amp;#8217;re made, but I&amp;#8217;ll bet it&amp;#8217;s at the hands of three or four grizzled master machinists in a stone building on a mountainside somewhere in Italy. I&amp;#8217;ll bet it takes about 23 months.&lt;/p&gt;

&lt;p&gt;The 2011 smart Car &lt;a href="http://www.smartusa.com/models/passion-coupe/overview.aspx"&gt;Passion Coupe&lt;/a&gt; might go 65 mph during strong wind gusts. It runs about $15K and is probably made by robots and extruded from recycled plastic shopping bags.&lt;/p&gt;

&lt;p&gt;These vehicles are of two &lt;strong&gt;very different classes&lt;/strong&gt;, but they share identical core features. They transport people, have reliable brakes, meet all safety standards, etc, etc.&lt;/p&gt;

&lt;p&gt;My point is that when someone at smart USA said &amp;#8220;Let&amp;#8217;s make a really cheap car&amp;#8221;, they didn&amp;#8217;t build a car with a 400hp engine but bad brakes and no crumple zones. That would be sacrificing quality for the sake of class. &lt;/p&gt;

&lt;p&gt;Instead they built a high-quality vehicle of a class that stresses economy over brute performance. I&amp;#8217;d call it low-class, but that implies it&amp;#8217;s bad or something. There&amp;#8217;s all kinds of good-but-cheap-and-simple things. Think about that piece of Ikea furniture you bought eight years ago that&amp;#8217;s still going strong.&lt;/p&gt;

&lt;h3&gt;Don&amp;#8217;t Sacrifice Quality For the Sake of Class&lt;/h3&gt;

&lt;p&gt;When we talk about software features, we often ask things like &amp;#8220;So do you want this to integrate with OpenID, Facebook Connect, and our own LDAP?&amp;#8221; This is like asking &amp;#8220;Do you want a Ferrari?&amp;#8221; The answer will always be &amp;#8220;YES&amp;#8221;. &lt;strong&gt;Everyone wants a Ferrari&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sometimes we&amp;#8217;ll also say things like &amp;#8220;Well, we can get it done fast, but it won&amp;#8217;t be maintainable, and the next person who touches it will have a stroke when they see the code&amp;#8221;. This is the same as promising a ultra-high speed car with shitty brakes. &lt;/p&gt;

&lt;p&gt;What we should be doing is helping people understand that a good way to get quick results is to alter the class of the solution, rather than sacrificing quality.&lt;/p&gt;

&lt;p&gt;Keep in mind that it&amp;#8217;s OK for someone to want a high-class solution.&lt;/p&gt;

&lt;p&gt;When the IPhone was first imagined, Mister Jobs probably declared aloud that it needed to be a game-changing device. He set a high bar for class, and that&amp;#8217;s just fine.&lt;/p&gt;

&lt;p&gt;Most often, though, we can do with something a bit less involved that the best &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt; system ever made. It probably boils down to having the discipline to always produce a high-quality product, even if its class isn&amp;#8217;t top of the line.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=SHFhUD0MfeM:g_gLlZb00-U:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=SHFhUD0MfeM:g_gLlZb00-U:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=SHFhUD0MfeM:g_gLlZb00-U:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=SHFhUD0MfeM:g_gLlZb00-U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=SHFhUD0MfeM:g_gLlZb00-U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=SHFhUD0MfeM:g_gLlZb00-U:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=SHFhUD0MfeM:g_gLlZb00-U:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/SHFhUD0MfeM" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.codesoftly.com/2011/03/ferrarri-or-smartcar.html</feedburner:origLink></entry>

</feed>

