<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>tag:airbladesoftware.com,2009:/</id>
  <title type="text">AirBlade Software</title>
  <updated>2012-05-07T00:00:00+00:00</updated>
  <generator uri="http://effectif.com/nesta">Nesta, modified by AirBlade</generator>
  <link href="http://airbladesoftware.com/feed/notes.xml" rel="self"/>
  <link href="http://airbladesoftware.com" rel="alternate"/>
  <subtitle type="text"></subtitle>
  <icon>/attachments/favicon.ico</icon>
  <author>
    <name>Andy Stewart</name>
    <uri>http://airbladesoftware.com</uri>
    <email>boss@airbladesoftware.com</email>
  </author>
  <entry>
    <id>tag:airbladesoftware.com,2012-05-07:/notes/what-everybody-needs</id>
    <title>What Everybody Needs</title>
    <updated>2012-05-07T00:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/what-everybody-needs" type="text/html" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;First, I am really busy.  I barely have enough time for the people who rely on me.  Honestly, I don&#8217;t have any spare time to give away.  (On the other hand, I need more time.  If you can give me more time, then I&#8217;ll almost certainly buy your product.)&lt;/p&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;&lt;cite&gt;Scott Porad, &lt;a href="http://www.scottporad.com/2012/04/25/making-effective-cold-calls"&gt;Making Effective Cold Calls&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
</content>
    <published>2012-05-07T00:00:00+00:00</published>
    <category term="Quotations"/>
  </entry>
  <entry>
    <id>tag:airbladesoftware.com,2012-05-03:/notes/papertrail-transfer</id>
    <title>Does Anyone Want To Take Over PaperTrail?</title>
    <updated>2012-05-03T00:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/papertrail-transfer" type="text/html" rel="alternate"/>
    <content type="html">&lt;p&gt;I can&amp;rsquo;t seem to find enough time these days to give &lt;a href="https://github.com/airblade/paper_trail"&gt;PaperTrail&lt;/a&gt; the attention it deserves.  Does anyone want to take it over?&lt;/p&gt;

&lt;p&gt;Here&amp;rsquo;s what you&amp;rsquo;d be signing up for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The domain model has stood the test of time pretty well, but I think it could be a little more intuitive (&lt;a href="https://github.com/airblade/paper_trail/issues/115"&gt;#115&lt;/a&gt;, &lt;a href="https://github.com/airblade/paper_trail/issues/124"&gt;#124&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The code is clean and well commented.&lt;/li&gt;
&lt;li&gt;The test code is harder to read than it should be.  It uses an old version of Shoulda and has lots of nested contexts.&lt;/li&gt;
&lt;li&gt;There are one or two edge cases to fix (&lt;a href="https://github.com/airblade/paper_trail/issues/131"&gt;#131&lt;/a&gt;, &lt;a href="https://github.com/airblade/paper_trail/issues/88"&gt;#88&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The big, unsolved problem is handling associations (&lt;a href="https://github.com/airblade/paper_trail/issues/12"&gt;#12&lt;/a&gt;, &lt;a href="https://github.com/airblade/paper_trail/issues/44"&gt;#44&lt;/a&gt;, &lt;a href="https://github.com/airblade/paper_trail/issues/121"&gt;#121&lt;/a&gt;, &lt;a href="https://github.com/airblade/paper_trail/issues/148"&gt;#148&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The code is tied to Rails 3.  It would be nice to generalise it to support, say, Sinatra (&lt;a href="https://github.com/airblade/paper_trail/issues/119"&gt;#119&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;If you&amp;rsquo;re interested, please let me know &lt;a href="https://github.com/airblade/paper_trail/issues/155"&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
    <published>2012-05-03T00:00:00+00:00</published>
    <category term="PaperTrail"/>
  </entry>
  <entry>
    <id>tag:airbladesoftware.com,2012-04-13:/notes/filter-rails-logs</id>
    <title>Filter Rails Logs</title>
    <updated>2012-04-13T14:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/filter-rails-logs" type="text/html" rel="alternate"/>
    <content type="html">&lt;p&gt;Rails logs each request over multiple lines.  It&amp;rsquo;s nice to have so much information but it invariably makes searching the logs a messy process.&lt;/p&gt;

&lt;p&gt;Some people are writing &lt;a href="http://www.paperplanes.de/2012/3/14/on-notifications-logsubscribers-and-bringing-sanity-to-rails-logging.html"&gt;drop-in replacements&lt;/a&gt; for the Rails logger which log each request on a single line.&lt;/p&gt;

&lt;p&gt;In the meantime I use &lt;a href="https://github.com/airblade/bin/blob/master/cack"&gt;cack&lt;/a&gt; to search/filter my Rails logs.  Give it a pattern and it will pull out every request block matching the pattern.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cack PATTERN LOGFILE
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Typical scenario&lt;/h2&gt;

&lt;p&gt;Sometimes customers phone me with a problem.  Each customer has their own subdomain, which I &lt;a href="logging-subdomains-in-rails-3"&gt;log for every request&lt;/a&gt;.  &lt;code&gt;cack&lt;/code&gt; lets me extract their activity from the log, making it much easier to see what&amp;rsquo;s going on.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ cack customer-subdomain production.log
$ vim production.log.out
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It&amp;rsquo;s already helped me solve several customer problems faster.&lt;/p&gt;

&lt;p&gt;I&amp;rsquo;ve also used &lt;code&gt;cack&lt;/code&gt; to filter by IP address and controller action.&lt;/p&gt;

&lt;h2&gt;Caveats&lt;/h2&gt;

&lt;p&gt;The script has a few limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It writes to a file rather than stdout.&lt;/li&gt;
&lt;li&gt;You can&amp;rsquo;t configure the output filename.&lt;/li&gt;
&lt;li&gt;You can only pass it one filename at a time.&lt;/li&gt;
&lt;/ul&gt;

</content>
    <published>2012-04-13T14:00:00+00:00</published>
    <category term="Productivity"/>
    <category term="Tools"/>
  </entry>
  <entry>
    <id>tag:airbladesoftware.com,2012-04-13:/notes/github-bottle-opener</id>
    <title>GitHub Bottle Opener</title>
    <updated>2012-04-13T13:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/github-bottle-opener" type="text/html" rel="alternate"/>
    <content type="html">&lt;p&gt;When in the console, I often want to open GitHub to look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;my current repo&lt;/li&gt;
&lt;li&gt;a particular commit in my current repo&lt;/li&gt;
&lt;li&gt;one of my gems&lt;/li&gt;
&lt;li&gt;someone else&amp;rsquo;s gem&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You could use &lt;a href="https://github.com/defunkt/hub"&gt;Hub&lt;/a&gt; for this but that&amp;rsquo;s like using a Swiss army penknife when all you need is a bottle opener.&lt;/p&gt;

&lt;p&gt;Instead I use &lt;a href="https://github.com/airblade/bin/blob/master/gh"&gt;gh&lt;/a&gt;, a trivial little script which is already saving me time.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gh                  # open current repo on GitHub
$ gh &amp;lt;commit&amp;gt;         # open current repo @ commit on GitHub
$ gh repo             # open my other repo on GitHub
$ gh username/repo    # open username's repo on GitHub
&lt;/code&gt;&lt;/pre&gt;
</content>
    <published>2012-04-13T13:00:00+00:00</published>
    <category term="Productivity"/>
    <category term="Tools"/>
  </entry>
  <entry>
    <id>tag:airbladesoftware.com,2012-04-13:/notes/deploy-the-right-code</id>
    <title>Deploy The Right Code</title>
    <updated>2012-04-13T12:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/deploy-the-right-code" type="text/html" rel="alternate"/>
    <content type="html">&lt;p&gt;Every once in a while I used to forget to push my code to GitHub before deploying.  It was harmless but annoying.&lt;/p&gt;

&lt;p&gt;These days I prevent it with the following Capistrano snippet:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;namespace :deploy do
  task :verify_what_to_deploy, :roles =&amp;gt; [:app] do
    sha = lambda { |branch|  `git log --pretty=format:%H #{branch} -1` }
    branch = 'master'  # hardcode for now
    local, remote = sha[branch], sha["origin/#{branch}"]
    if local != remote
      srsly = Capistrano::CLI.ui.ask("#{branch} does not match origin/#{branch}.  Deploy anyway? [y/n]")
      exit(1) unless srsly == 'y'
    end
  end
  before 'deploy', 'deploy:verify_what_to_deploy'
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Problem solved.&lt;/p&gt;
</content>
    <published>2012-04-13T12:00:00+00:00</published>
    <category term="Deployment"/>
  </entry>
  <entry>
    <id>tag:airbladesoftware.com,2012-03-14:/notes/commoditisation</id>
    <title>Commoditisation Or Not</title>
    <updated>2012-03-14T12:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/commoditisation" type="text/html" rel="alternate"/>
    <content type="html">&lt;p&gt;As with many fields, web development looks trivial to the untrained eye.  Sooner or later everyone who builds web applications hears, &amp;ldquo;Why it is so expensive and time-consuming to do this new thing?  I have a ten year old nephew who can make web pages.  It can&amp;rsquo;t be that hard.&amp;rdquo;&lt;/p&gt;

&lt;p&gt;There are many good ripostes to this.  One of my favourites is &lt;a href="http://en.wikipedia.org/wiki/Red_Adair"&gt;Red Adair&lt;/a&gt;&amp;rsquo;s:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You think hiring a professional is expensive?  Try hiring an amateur.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;Although one could argue that extinguishing blazing oil wells and web development are not in the same league.  Moving on&amp;hellip;&lt;/p&gt;

&lt;p&gt;A modern web application is a system with many moving parts.  Any engineer will tell you that complexity rises quickly with the number of moving parts.  People expect web sites to be available pretty much all the time, so you need to be good at containing the complexity and simplifying wherever possible.&lt;/p&gt;

&lt;p&gt;Recently I saw two pages which reminded me of all this: &lt;a href="http://netburn.no/"&gt;Netburn&lt;/a&gt; and &lt;a href="http://garrettdimon.com/post/18056006601/what-does-it-take"&gt;What does it take?&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Netburn&amp;rsquo;s page simply says, &amp;ldquo;Are you making a website?  You will need to know [daunting list of about 75 things].  Or you could hire someone who knows.&amp;rdquo;  Punchy.&lt;/p&gt;

&lt;p&gt;&amp;lsquo;What does it take?&amp;rsquo; lists the full stack for &lt;a href="http://sifterapp.com"&gt;Sifter&lt;/a&gt;, a typical modern day webapp.  I thought it was rather good, so here&amp;rsquo;s my version for &lt;a href="http://sparklehq.com"&gt;Sparkle&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Sparkle&amp;rsquo;s web stack&lt;/h2&gt;

&lt;p&gt;Where relevant I&amp;rsquo;ve included my current technology choice in brackets.  Every webapp will have a different blend of components.&lt;/p&gt;

&lt;h3&gt;User experience&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Interaction design&lt;/li&gt;
&lt;li&gt;Visual design&lt;/li&gt;
&lt;li&gt;Typography&lt;/li&gt;
&lt;li&gt;Copywriting&lt;/li&gt;
&lt;li&gt;Accessibility&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Front end&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;HTML (&lt;a href="http://haml-lang.com/"&gt;HAML&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;CSS (&lt;a href="http://sass-lang.com/"&gt;SASS&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;JavaScript (&lt;a href="http://jquery.com"&gt;jQuery&lt;/a&gt;, &lt;a href="http://coffeescript.org/"&gt;Coffeescript&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Browsers (IE7+, Safari, Chrome)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Server side&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Programming languages (&lt;a href="http://ruby-lang.org"&gt;Ruby&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Web frameworks (&lt;a href="http://rubyonrails.org"&gt;Rails&lt;/a&gt;, &lt;a href="http://sinatrarb.com"&gt;Sinatra&lt;/a&gt;, &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Version control (&lt;a href="http://git-scm.com"&gt;Git&lt;/a&gt;, &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Principles of REST / hypermedia APIs&lt;/li&gt;
&lt;li&gt;Principles of domain driven design&lt;/li&gt;
&lt;li&gt;Testing frameworks (&lt;a href="https://rubygems.org/gems/minitest"&gt;MiniTest&lt;/a&gt;, &lt;a href="http://cukes.info"&gt;Cucumber&lt;/a&gt;, &lt;a href="http://jnicklas.github.com/capybara/"&gt;Capybara&lt;/a&gt;, etc)&lt;/li&gt;
&lt;li&gt;Search (&lt;a href="http://sphinxsearch.com/"&gt;Sphinx&lt;/a&gt;, &lt;a href="http://freelancing-god.github.com/ts/en/"&gt;Thinking Sphinx&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Background processing (&lt;a href="https://github.com/collectiveidea/delayed_job"&gt;Delayed Job&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Email delivery (&lt;a href="http://fastmail.fm"&gt;Fastmail&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;PDF generation (&lt;a href="https://github.com/prawnpdf/prawn"&gt;Prawn&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Barcode generation (&lt;a href="https://github.com/airblade/brocade"&gt;Brocade&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Content storage (&lt;a href="http://aws.amazon.com/s3/"&gt;S3&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Operations&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Release management (&lt;a href="http://capify.org"&gt;Capistrano&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;DNS (&lt;a href="http://dyn.com/dns"&gt;DynDNS&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Monitoring (&lt;a href="http://pingdom.com"&gt;Pingdom&lt;/a&gt;, &lt;a href="http://scoutapp.com"&gt;Scout&lt;/a&gt;, &lt;a href="http://mmonit.com/monit"&gt;Monit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;SMS alerts (&lt;a href="http://fastmail.fm"&gt;Fastmail&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Front-end performance (&lt;a href="http://code.google.com/speed/page-speed/"&gt;Page speed&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yslow/"&gt;YSlow&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Asset packaging (&lt;a href="http://documentcloud.github.com/jammit/"&gt;Jammit&lt;/a&gt;, &lt;a href="http://guides.rubyonrails.org/asset_pipeline.html"&gt;Rails asset pipeline&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Content delivery network (&lt;a href="http://aws.amazon.com/cloudfront/"&gt;CloudFront&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Web server (&lt;a href="http://nginx.org/en"&gt;Nginx&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Application server (&lt;a href="http://unicorn.bogomips.org"&gt;Unicorn&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;HTTP especially &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html"&gt;caching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Secure_Socket_Layer"&gt;SSL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Database server (&lt;a href="http://www.mysql.com"&gt;MySQL&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Unix (&lt;a href="http://en.wikipedia.org/wiki/Bash_(Unix_shell)"&gt;Bash&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;cron&lt;/a&gt;, etc)&lt;/li&gt;
&lt;li&gt;Unix process management (&lt;a href="http://ddollar.github.com/foreman/"&gt;Foreman&lt;/a&gt;, &lt;a href="http://upstart.ubuntu.com/"&gt;Upstart&lt;/a&gt;, &lt;a href="http://mmonit.com/monit"&gt;Monit&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Backups / disaster recovery (&lt;a href="https://github.com/airblade/mys3ql"&gt;mys3ql&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Virtualisation (&lt;a href="http://vagrantup.com"&gt;Vagrant&lt;/a&gt;, &lt;a href="https://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Payment processing (&lt;a href="http://saasy.com"&gt;SaaSy&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Invoicing (&lt;a href="http://freagent.com"&gt;FreeAgent&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;All areas&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Text editor (&lt;a href="http://www.vim.org"&gt;Vim&lt;/a&gt;, &lt;a href="http://code.google.com/p/macvim/"&gt;MacVim&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Common sense!&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;On the radar&lt;/h2&gt;

&lt;p&gt;And here&amp;rsquo;s what I think I need to learn next for Sparkle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server provisioning (&lt;a href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Javascript framework (&lt;a href="http://documentcloud.github.com/backbone/"&gt;Backbone.js&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Key-value store (&lt;a href="http://redis.io"&gt;Redis&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Better database (&lt;a href="http://www.postgresql.org"&gt;PostgreSQL&lt;/a&gt;) &amp;mdash; maybe&lt;/li&gt;
&lt;/ul&gt;


&lt;h2 id='comments'&gt;Comments&lt;/h2&gt;


&lt;div class='comment'&gt;
&lt;p&gt;Consider Puppet as well as Chef.  Don't use Postgres, use Percona.  &lt;a href="http://www.percona.com/software/percona-server/for-nosql/"&gt;No need for Redis&lt;/a&gt;.&lt;/p&gt;
&lt;cite&gt;&lt;a href="https://twitter.com/#!/lylo/status/181846544184639488"&gt;Olly Headey&lt;/a&gt; &amp;#x2022; 19 March 2012&lt;/cite&gt;
&lt;/div&gt;



</content>
    <published>2012-03-14T12:00:00+00:00</published>
    <category term="Development"/>
  </entry>
  <entry>
    <id>tag:airbladesoftware.com,2012-03-14:/notes/true-glory</id>
    <title>True Glory</title>
    <updated>2012-03-14T00:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/true-glory" type="text/html" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;There must be a beginning of any great matter, but the continuing unto the end until it be thoroughly finished yields the true glory.&lt;/p&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;&lt;cite&gt;Sir Francis Drake&lt;/cite&gt;&lt;/p&gt;
</content>
    <published>2012-03-14T00:00:00+00:00</published>
    <category term="Quotations"/>
  </entry>
  <entry>
    <id>tag:airbladesoftware.com,2012-03-07:/notes/customers-remember</id>
    <title>Customers Remember</title>
    <updated>2012-03-07T00:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/customers-remember" type="text/html" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;People don't remember that a feature was missing once you implement it, but they remember broken features long after you've fixed them.&lt;/p&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;&lt;cite&gt;&lt;a href="http://news.ycombinator.com/item?id=3673693"&gt;Joshua Ballanco&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
</content>
    <published>2012-03-07T00:00:00+00:00</published>
    <category term="Quotations"/>
  </entry>
  <entry>
    <id>tag:airbladesoftware.com,2012-02-22:/notes/kano</id>
    <title>The Kano Model</title>
    <updated>2012-02-22T12:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/kano" type="text/html" rel="alternate"/>
    <content type="html">&lt;p&gt;In the 1980s Noriaki Kano devised a simple way to model how a person experiences a product or service.  The Baymard Institute &lt;a href="http://baymard.com/blog/kano-model"&gt;explains it well&lt;/a&gt;; this is their conclusion:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
  &lt;li&gt;The details don&#8217;t matter if you don&#8217;t get the fundamentals right, so the basic attributes need to work flawlessly before you focus on anything else.&lt;/li&gt;
  &lt;li&gt;You don&#8217;t need to match every single performance attribute in the market head-on. Align your investments in performance attributes with the target audience of the product &#8211; this may of course vary significantly and warrant different variations of the same product.&lt;/li&gt;
  &lt;li&gt;Delivering unexpected delight attributes is what fuels word-of-mouth. Once you&#8217;ve secured the basic attributes and some performance attributes, you should begin brainstorming on what delight attributes you can offer as this is what will truly set you apart from the competition.&lt;/li&gt;
  &lt;li&gt;Today&#8217;s delight attribute is tomorrow&#8217;s performance attribute, and six months from now it may very well be a basic attribute. Customer expectations continually increase so you have to continually reiterate and reinvent your offerings.&lt;/li&gt;
  &lt;li&gt;Having a deep understanding of the true needs of your customers, their context and their behavior, is absolutely crucial when inventing new delight attributes. Looking at what your competitors are doing won&#8217;t help much as the delight attribute will no longer be a delight by the time you have imitated it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;


&lt;p&gt;&lt;cite&gt;The Baymard Institute, &lt;a href="http://baymard.com/blog/kano-model"&gt;UX and the Kano model&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;After running &lt;a href="http://sparklehq.com"&gt;Sparkle&lt;/a&gt; for nearly four years, I&amp;rsquo;ve ticked the first two off the list.  I&amp;rsquo;m now looking for &amp;ldquo;unexpected delight attributes&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;Looking around at the moment, a good example is &lt;a href="http://37signals.com/basecampnext/"&gt;Basecamp Next&lt;/a&gt;.  37signals are clearing looking to delight people with its &lt;a href="http://37signals.com/svn/posts/3112-how-basecamp-next-got-to-be-so-damn-fast-without-using-much-client-side-ui"&gt;speed&lt;/a&gt; and its &lt;a href="http://37signals.com/svn/posts/3115-a-peek-at-the-all-new-basecamp-calendar"&gt;calendar&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The fourth item provides fuel for one of my favourite software aphorisms:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your software is only finished when the last user is dead.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;So true.&lt;/p&gt;
</content>
    <published>2012-02-22T12:00:00+00:00</published>
    <category term="Development"/>
  </entry>
  <entry>
    <id>tag:airbladesoftware.com,2012-02-22:/notes/tdd</id>
    <title>Test Driven Development</title>
    <updated>2012-02-22T11:00:00+00:00</updated>
    <link href="http://airbladesoftware.com/notes/tdd" type="text/html" rel="alternate"/>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;I developed deck.js off and on over the course of a few months, in lulls between stretches of client work. Yet another advantage to TDD is that it makes picking up development easier after weeks away from a project. Just fire up the tests, see what fails, and get to work.&lt;/p&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;&lt;cite&gt;Caleb Troughton, &lt;a href="http://blog.imakewebthings.com/deck-js-post-mortem-quick-hits/"&gt;Deck.js Post-Mortem Quick Hits&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;TDD is also invaluable when you are chronically sleep-deprived.  I built a non-trivial chunk of &lt;a href="http://sparklehq.com"&gt;Sparkle&lt;/a&gt; over a month where I didn&amp;rsquo;t sleep more than 3hr at a time.  Although I could barely remember my own name, TDD enabled me to deliver the feature (albeit four times slower than usual) flawlessly into production and it&amp;rsquo;s worked perfectly ever since.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The biggest per&#173;ceived &#8220;con&#8221;, increased devel&#173;op&#173;ment time, is more than erased by the time saved as a result of the pros.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;p&gt;&lt;cite&gt;Idem&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately it didn&amp;rsquo;t help with remembering my name.&lt;/p&gt;
</content>
    <published>2012-02-22T11:00:00+00:00</published>
    <category term="Testing"/>
  </entry>
</feed>

<!-- page cached: 2012-18-05 04:27:18 -->


