<?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://codesoftly.com/" />
    
    <id>tag:codesoftly.com,2009-05-06:/1</id>
    <updated>2013-01-15T15:14:50Z</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>Did I Just Spot CSS In a Tron:Uprising Episode?</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/6Ll57HvmLEM/did-i-just-spot-css-in-a-tronuprising-episode.html" />
    <id>tag:codesoftly.com,2013://1.389</id>

    <published>2013-01-15T02:45:33Z</published>
    <updated>2013-01-15T15:14:50Z</updated>

    <summary>I'm pretty sure I just saw a mysterious fragment of CSS show up on a cyber-train door in the computer-generated cartoon Tron:Uprising. I'm not sure why it's there.</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="cartoon" label="cartoon" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="css" label="css" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tron" label="tron" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tv" label="tv" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="uprising" label="uprising" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://codesoftly.com/">
        &lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://codesoftly.com/20130114_223005.jpg"&gt;&lt;img alt="tron_uprising_css_train.jpg" src="http://codesoftly.com/assets_c/2013/01/20130114_223005-thumb-550x412-41.jpg" width="550" height="412" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m pretty sure I just saw a mysterious fragment of CSS show up on a cyber-train door in the computer-generated cartoon Tron:Uprising. I&amp;#8217;m not sure why it&amp;#8217;s there.&lt;/p&gt;

&lt;p&gt;First, a few confessions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I watch &lt;a href="http://en.wikipedia.org/wiki/Tron:_Uprising"&gt;Tron:Uprising&lt;/a&gt; on the Disney XD channel. I knew it was on Disney XD because I saw the commercial for it during an episode of Doc McStuffin&amp;#8217;.&lt;/li&gt;
&lt;li&gt;I DVR the show so I can watch it alone, because nobody else in the family is interested in what goes on in &lt;a href="http://tron.wikia.com/wiki/Grid"&gt;The Grid&lt;/a&gt;. Ever.&lt;/li&gt;
&lt;li&gt;I pay VERY close attention to how code is depicted in films and TV shows. I tend to notice it whenever it shows up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this culminated three days ago when I was watching a DVR&amp;#8217;ed episode, &lt;a href="http://www.imdb.com/title/tt2593020/"&gt;&amp;#8220;Welcome Home&amp;#8221;&lt;/a&gt;. The characters are in a train, and as the car doors slide open and closed, I noticed a flash of what looked like CSS below the number painted on the door.&lt;/p&gt;

&lt;p&gt;Rewinding and freezing the frame proved me correct. On the door is what appears to be at least a fragment of CSS style rules. Here&amp;#8217;s the closeup:&lt;/p&gt;

&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="tron_renegade_css.jpg" src="http://codesoftly.com/photo.jpg" width="550" height="328" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;My theories on how it got there:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It&amp;#8217;s an easter egg&lt;/strong&gt;, put there by the show&amp;#8217;s artists, who are maybe also web nerds. This was my first guess, but looking at the CSS, there&amp;#8217;s nothing terribly clever about it. It doesn&amp;#8217;t cry out &amp;#8220;I&amp;#8217;m from the TRON homepage!&amp;#8221; or look like something from &lt;a href="http://tron.wikia.com/wiki/Flynn's_Arcade"&gt;Flynn&amp;#8217;s Arcade&lt;/a&gt; website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It&amp;#8217;s an artifact of how the text was put on the door in the show&amp;#8217;s graphical tools&lt;/strong&gt;. I have no clue if this is legit, but maybe the tools that put text on 3D computer-modeled stuff uses CSS to style that text, and the artist didn&amp;#8217;t close a style tag? I have a hard time believing that&amp;#8217;s the case. I mean, I doubt Pixar has to worry about web-fonts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Someone copy/pasted the door text from something that had style rules&lt;/strong&gt;. In a classic case where the clipboard carries over style information, someone was careless and yanked the door number from some other source, pasted it, and didn&amp;#8217;t get around to deleting the style text&lt;/p&gt;

&lt;p&gt;Needless to say, I have no confidence in any of these explanations, and web searches are turning up nothing for me, so &lt;strong&gt;please have a look and help me out&lt;/strong&gt;.&lt;/p&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=6Ll57HvmLEM:wMRUL6eOdII:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=6Ll57HvmLEM:wMRUL6eOdII:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=6Ll57HvmLEM:wMRUL6eOdII: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=6Ll57HvmLEM:wMRUL6eOdII:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=6Ll57HvmLEM:wMRUL6eOdII:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=6Ll57HvmLEM:wMRUL6eOdII:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=6Ll57HvmLEM:wMRUL6eOdII:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/6Ll57HvmLEM" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://codesoftly.com/2013/01/did-i-just-spot-css-in-a-tronuprising-episode.html</feedburner:origLink></entry>

<entry>
    <title>I Was at CodeMash BEFORE It Was Cool</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/mqX8JwtXEgk/i-was-at-codemash-before-it-was-cool.html" />
    <id>tag:codesoftly.com,2013://1.388</id>

    <published>2013-01-09T23:45:34Z</published>
    <updated>2013-01-10T20:04:54Z</updated>

    <summary>I’ll admit it, I was at CodeMash WAY back in the day. Before it filled up the whole conference center. When you could get a ticket. While most of the team is at CodeMash this week, I’m reflecting on the...</summary>
    <author>
        <name>Aaron Oliver</name>
        <uri>http://www.aaronoliver.com</uri>
    </author>
    
    <category term="codemash" label="CodeMash" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="conferences" label="conferences" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://codesoftly.com/">
        &lt;p&gt;I&amp;#8217;ll admit it, I was at &lt;a href="http://codemash.org"&gt;CodeMash&lt;/a&gt; WAY &lt;a href="http://codesoftly.com/2009/01/i-was-gamed-on-google-maps-trying-to-get-to-codemash.html"&gt;back in the day&lt;/a&gt;. Before it filled up the whole &lt;a href="http://www.kalahariresorts.com/ohio"&gt;conference center&lt;/a&gt;. When you could get a ticket.&lt;/p&gt;

&lt;p&gt;While most of the team is at CodeMash this week, I&amp;#8217;m reflecting on the value of such conferences. In no particular order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Renewed Motivation&lt;/strong&gt; - being surrounded by nerds facing similar problems is always good for morale. You are not alone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New Ideas&lt;/strong&gt; - One good thing about CodeMash is that it is &lt;a href="http://codemash.org/about#AntiHarassmentPolicy"&gt;inclusive&lt;/a&gt; and language-agnostic. It&amp;#8217;s surprising what you can learn from other implementations,. Even more surprising is learning what you have in common.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Networking&lt;/strong&gt; - You&amp;#8217;ll meet people. Good people. These are folks that you&amp;#8217;ll tweet, email, and Link-in. This is a good thing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fun&lt;/strong&gt; - part of the appeal is having fun with people who make money doing the same thing as you. The nice benefit of programmers is that they tend to genuinely enjoy their work, so it&amp;#8217;s not too far of a stretch to get along.&lt;/li&gt;
&lt;/ol&gt;

        

    &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=mqX8JwtXEgk:yu9vaPTu2dM:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=mqX8JwtXEgk:yu9vaPTu2dM:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=mqX8JwtXEgk:yu9vaPTu2dM: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=mqX8JwtXEgk:yu9vaPTu2dM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=mqX8JwtXEgk:yu9vaPTu2dM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=mqX8JwtXEgk:yu9vaPTu2dM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=mqX8JwtXEgk:yu9vaPTu2dM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/mqX8JwtXEgk" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://codesoftly.com/2013/01/i-was-at-codemash-before-it-was-cool.html</feedburner:origLink></entry>

<entry>
    <title>Breaking It All Down: Simplify Solutions</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/qmkLPk_czw8/simplify-solutions.html" />
    <id>tag:www.codesoftly.com,2013://1.387</id>

    <published>2013-01-01T15:30:50Z</published>
    <updated>2013-01-01T15:43:08Z</updated>

    <summary>I think there are some creative ways to break up seemingly monolithic features into bite-sized, achievable, and incremental steps. Here's a few questions I often meditate upon when facing a largish feature request. 
</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="softwareengineering" label="software engineering" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://codesoftly.com/">
        &lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="7725858124_61533e47a6.jpg" src="http://www.codesoftly.com/7725858124_61533e47a6.jpg" width="500" height="333" 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 think there are some creative ways to break up seemingly monolithic features into bite-sized, achievable, and incremental steps. Here&amp;#8217;s a few questions I often meditate upon when facing a largish feature request (&lt;strong&gt;pro-tip: they can usually be combined&lt;/strong&gt;): &lt;/p&gt;

&lt;h3&gt;1 - Can we hardcode it?&lt;/h3&gt;

&lt;p&gt;Take a page from the &lt;a href="http://gmarik.info/notes/programming/test-driven-development-kent-beck"&gt;Test-Driven Development&lt;/a&gt; playbook. If your feature is big because of complex computations that need to take place, see if there&amp;#8217;s a way to hard-code the behavior for the most popular flavors. Ignore the other ones for now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An Example:&lt;/strong&gt;
For a route-planning application, instead of writing logic to calculate a nice bike route between 2 arbitrary locations, show a map that lets the user pick the routes from the center of town to the ten most-popular bike destinations.&lt;/p&gt;

&lt;h3&gt;2 - Can we just do one?&lt;/h3&gt;

&lt;p&gt;Similar to hard-coding, doing one is nice when you have a feature that needs to work for a large and diverse set of items. In these cases, you might get a lot of bang for the buck by picking the simplest item or class of items from the catalog, and do your feature just for that one. &lt;/p&gt;

&lt;p&gt;This lets you side-step some of the complexity of crafting a solution that works for the entire population. You can learn what a really good implementation takes in the simplest case. You can also hedge risk by getting the feature in front of customers early, so you can decide if it&amp;#8217;s even &lt;em&gt;*WORTH *&lt;/em&gt;all the extra effort to expand to the rest of the catalog. On top of that, you can get some good numbers around how long things will take: &amp;#8220;&lt;em&gt;It took us fifteen days to build it for that one product, and there was a lot of hard-coding, so let&amp;#8217;s say it will be double that to make it work for EVERYTHING&lt;/em&gt;&amp;#8221;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need to show a 3D HTML5 rendering of purses on the site with zoom, mouse-over highlights, and hotspots, do it first for a single purse in the catalog. Hardcode it to be really amazing for just that bag, and don&amp;#8217;t even bother showing the 3D option for the other 2,000 bags on the site.&lt;/p&gt;

&lt;h3&gt;3 - Can we skip part(s) of it?&lt;/h3&gt;

&lt;p&gt;This one is kind of obvious, but it&amp;#8217;s surprisingly easy to forget about. It can be helpful to focus on a single aspect of a feature, knowing the plan is to roll out the rest of it later. It&amp;#8217;s always handy to think about this before spending a whole lot of time designing and building. If you can strip out the non-essential parts, you can deliver &lt;em&gt;something&lt;/em&gt;, then enhance it. Also be sure to &lt;a href="http://codesoftly.com/2011/04/wheres-the-off-switch-on-this-thing.html"&gt;put in an on/off switch&lt;/a&gt;, so it can be deployed, but disabled if necessary.&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="http://flickr.com/photos/bobbivie/"&gt;bobbi vie&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=qmkLPk_czw8:XPylWvwznGM:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=qmkLPk_czw8:XPylWvwznGM:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=qmkLPk_czw8:XPylWvwznGM: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=qmkLPk_czw8:XPylWvwznGM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=qmkLPk_czw8:XPylWvwznGM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=qmkLPk_czw8:XPylWvwznGM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=qmkLPk_czw8:XPylWvwznGM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/qmkLPk_czw8" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://codesoftly.com/2013/01/simplify-solutions.html</feedburner:origLink></entry>

<entry>
    <title>3 Selfish Features</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CodeSoftly/~3/yVZ44oXWQUk/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://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=yVZ44oXWQUk:_WCxmNADZIc:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=yVZ44oXWQUk:_WCxmNADZIc:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=yVZ44oXWQUk:_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=yVZ44oXWQUk:_WCxmNADZIc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=yVZ44oXWQUk:_WCxmNADZIc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=yVZ44oXWQUk:_WCxmNADZIc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=yVZ44oXWQUk:_WCxmNADZIc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/yVZ44oXWQUk" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/_MoM14se9mA/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://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=_MoM14se9mA:00xWP9XvuWo:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=_MoM14se9mA:00xWP9XvuWo:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=_MoM14se9mA: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=_MoM14se9mA:00xWP9XvuWo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=_MoM14se9mA:00xWP9XvuWo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=_MoM14se9mA:00xWP9XvuWo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=_MoM14se9mA:00xWP9XvuWo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/_MoM14se9mA" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/zBP-MTUe7ic/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://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=zBP-MTUe7ic:iG2VcoYL42k:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=zBP-MTUe7ic:iG2VcoYL42k:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=zBP-MTUe7ic: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=zBP-MTUe7ic:iG2VcoYL42k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=zBP-MTUe7ic:iG2VcoYL42k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=zBP-MTUe7ic:iG2VcoYL42k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=zBP-MTUe7ic:iG2VcoYL42k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/zBP-MTUe7ic" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/GX54iR6H1eg/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://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=GX54iR6H1eg:OSX9u9u1_Tk:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=GX54iR6H1eg:OSX9u9u1_Tk:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=GX54iR6H1eg: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=GX54iR6H1eg:OSX9u9u1_Tk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=GX54iR6H1eg:OSX9u9u1_Tk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=GX54iR6H1eg:OSX9u9u1_Tk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=GX54iR6H1eg: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/GX54iR6H1eg" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/YZQKuFNY5Pg/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://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=YZQKuFNY5Pg:aizkoloNUXw:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=YZQKuFNY5Pg:aizkoloNUXw:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=YZQKuFNY5Pg: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=YZQKuFNY5Pg:aizkoloNUXw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=YZQKuFNY5Pg:aizkoloNUXw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=YZQKuFNY5Pg:aizkoloNUXw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=YZQKuFNY5Pg:aizkoloNUXw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/YZQKuFNY5Pg" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/3mLASjjFfaw/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://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=3mLASjjFfaw:aGsDAZCM6Fo:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=3mLASjjFfaw:aGsDAZCM6Fo:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=3mLASjjFfaw: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=3mLASjjFfaw:aGsDAZCM6Fo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=3mLASjjFfaw:aGsDAZCM6Fo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=3mLASjjFfaw:aGsDAZCM6Fo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=3mLASjjFfaw:aGsDAZCM6Fo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/3mLASjjFfaw" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/bqdMXCIuFZg/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://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=bqdMXCIuFZg:mo73wyxEoAk:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=bqdMXCIuFZg:mo73wyxEoAk:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=bqdMXCIuFZg: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=bqdMXCIuFZg:mo73wyxEoAk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=bqdMXCIuFZg:mo73wyxEoAk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=bqdMXCIuFZg:mo73wyxEoAk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=bqdMXCIuFZg:mo73wyxEoAk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/bqdMXCIuFZg" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/p5MtO5jhNXk/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://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=p5MtO5jhNXk:sAmK123iDcM:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=p5MtO5jhNXk:sAmK123iDcM:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=p5MtO5jhNXk: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=p5MtO5jhNXk:sAmK123iDcM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=p5MtO5jhNXk:sAmK123iDcM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=p5MtO5jhNXk:sAmK123iDcM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=p5MtO5jhNXk:sAmK123iDcM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/p5MtO5jhNXk" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/8zT2ilQ2iMA/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://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=8zT2ilQ2iMA:5PrUmLCUXxg:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=8zT2ilQ2iMA:5PrUmLCUXxg:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=8zT2ilQ2iMA: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=8zT2ilQ2iMA:5PrUmLCUXxg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=8zT2ilQ2iMA:5PrUmLCUXxg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=8zT2ilQ2iMA:5PrUmLCUXxg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=8zT2ilQ2iMA:5PrUmLCUXxg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/8zT2ilQ2iMA" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/qYyuQRE95Ow/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://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=qYyuQRE95Ow:aPtESfH5gko:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=qYyuQRE95Ow:aPtESfH5gko:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=qYyuQRE95Ow: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=qYyuQRE95Ow:aPtESfH5gko:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=qYyuQRE95Ow:aPtESfH5gko:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=qYyuQRE95Ow:aPtESfH5gko:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=qYyuQRE95Ow:aPtESfH5gko:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/qYyuQRE95Ow" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/fyh8kx58EQ4/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://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=fyh8kx58EQ4:7LTirZ1Pg4w:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=fyh8kx58EQ4:7LTirZ1Pg4w:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=fyh8kx58EQ4: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=fyh8kx58EQ4:7LTirZ1Pg4w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=fyh8kx58EQ4:7LTirZ1Pg4w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=fyh8kx58EQ4:7LTirZ1Pg4w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=fyh8kx58EQ4:7LTirZ1Pg4w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodeSoftly/~4/fyh8kx58EQ4" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://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/PZ1OPXg_kb8/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://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=PZ1OPXg_kb8:JBy-Z6RpRe8:qGnKG0F2iaY"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=PZ1OPXg_kb8:JBy-Z6RpRe8:qGnKG0F2iaY" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=PZ1OPXg_kb8: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=PZ1OPXg_kb8:JBy-Z6RpRe8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=PZ1OPXg_kb8:JBy-Z6RpRe8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CodeSoftly?a=PZ1OPXg_kb8:JBy-Z6RpRe8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CodeSoftly?i=PZ1OPXg_kb8: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/PZ1OPXg_kb8" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://codesoftly.com/2011/03/no-more-parking-lots.html</feedburner:origLink></entry>

</feed>
