<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Usability Paradox</title>
	<atom:link href="http://www.usabilityparadox.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.usabilityparadox.com</link>
	<description>usability, technology and random flutterings</description>
	<lastBuildDate>Sun, 18 Mar 2012 20:27:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Building a plist of file assets with PHP</title>
		<link>http://www.usabilityparadox.com/2012/03/18/building-a-plist-of-file-assets-with-php/</link>
		<comments>http://www.usabilityparadox.com/2012/03/18/building-a-plist-of-file-assets-with-php/#comments</comments>
		<pubDate>Sun, 18 Mar 2012 19:59:57 +0000</pubDate>
		<dc:creator>gmjordan</dc:creator>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.usabilityparadox.com/?p=255</guid>
		<description><![CDATA[As most devs do, I often deal with a datasource that contains structured and/or semi-structured file information. In iOS world, for example, I typically create a plist to build out UITableViews of a group of files, i.e. convert a plist array to NSMutableArray via initWithContentsOfFile. In fact, I&#8217;ve used this method enough to warrant creating [...]]]></description>
			<content:encoded><![CDATA[<p>As most devs do, I often deal with a datasource that contains structured and/or semi-structured file information.  In iOS world, for example, I typically create a plist to build out UITableViews of a group of files, i.e. convert a plist array to NSMutableArray via initWithContentsOfFile.</p>
<p>In fact, I&#8217;ve used this method enough to warrant <a href="https://github.com/gmjordan/PHP-Plist-Builder">creating a script</a> that scans a specified directory on my local system to generate the plist.  </p>
<p>I know doing this via CLI (or whatever else) is 100% possible, but I like living my life, so I used PHP.  If you&#8217;ve got a better way, post it.</p>
<p>With that, this script does several things:</p>
<p>1. Loops recursively through directories and returns an array of files.<br />
2. Uses echo and a few functions to build out an array of dictionary objects as a string, which I copy into a .plist (in this case, from the browser)<br />
3. Does some comparisons on file attributes and static strings in order to get things like the duration on media files.<br />
4. Defies OOP.<br />
5. Uses a cleverly named var called stringStr.</p>
<p>Further, this script requires PHP 5.3+ and <a href="http://sourceforge.net/projects/getid3/">the awesome getID3 library</a>.</p>
<p>There is one wacky thing in the script that can be commented out if it doesn&#8217;t apply to you, which is dealing with single files nested two levels below the origin directory. For example, I am occasionally given an archive that might have a structure like:</p>
<p>-folder 1<br />
	&nbsp;&nbsp;file<br />
-folder 2<br />
	&nbsp;&nbsp;&nbsp;&nbsp;folder a<br />
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file<br />
	&nbsp;&nbsp;&nbsp;&nbsp;folder b<br />
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file<br />
-folder 3<br />
	&nbsp;&nbsp;&nbsp;&nbsp;folder d<br />
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file<br />
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file<br />
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file<br />
	&nbsp;&nbsp;&nbsp;&nbsp;folder c<br />
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file</p>
<p>In this case, &#8220;folder 2&#8243; is not really segmenting files for hierarchy/grouping purposes, but for naming purposes. That is, &#8220;folder a&#8221; and &#8220;folder b&#8221; are intended to be used as the Title in the tableview cell.  </p>
<p>So, you might ask &#8220;Hey Greg, why weren&#8217;t the files just given the correct name to begin with?&#8221; </p>
<p>My response is thanks for asking, don&#8217;t end your questions with prepositions, and I didn&#8217;t name &#8216;em I just deal with &#8216;em. If you didn&#8217;t ask that question, then way to stay curious, Copernicus.</p>
<p>Seriously, it&#8217;s pattern of sorts, so I did the least amount of thinking to code against it. I simply added a string to the parent folder&#8217;s name called &#8220;Grouped&#8221; and strpos&#8217;d for it.  I had to rename only three dirs instead of dozens of files. </p>
<p>Next go around, I&#8217;ll push for a <del datetime="2012-03-18T18:26:38+00:00">less batshit crazy</del> more thoughtful way of naming directories &amp; files.  </p>
<p>For the interim, I&#8217;ve got a way to deal with it should my request be met with <del datetime="2012-03-18T19:01:32+00:00">ALL CAPS ANGER</del> silence.</p>
<p>Again, you can comment out that part if it doesn&#8217;t apply to you.</p>
<p>Lastly, <a href="https://github.com/gmjordan/PHP-Plist-Builder">take please</a>, but submit mods.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.usabilityparadox.com/2012/03/18/building-a-plist-of-file-assets-with-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting duration and other info from media files on a Mac</title>
		<link>http://www.usabilityparadox.com/2012/02/16/getting-duration-and-other-info-from-media-files-on-a-mac/</link>
		<comments>http://www.usabilityparadox.com/2012/02/16/getting-duration-and-other-info-from-media-files-on-a-mac/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 21:41:59 +0000</pubDate>
		<dc:creator>gmjordan</dc:creator>
				<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.usabilityparadox.com/?p=252</guid>
		<description><![CDATA[While afinfo and included tools on a mac get rich information on the cli, there&#8217;s a nice tool called mediainfo which simplifies the output. If you like egrep &#124; sed &#124; awk, by all means trot something like this out and you&#8217;ve got a decent capture of the duration along with the file name: afinfo [...]]]></description>
			<content:encoded><![CDATA[<p>While afinfo and included tools on a mac get rich information on the cli, there&#8217;s a nice tool called <a href="http://mediainfo.sourceforge.net/en">mediainfo</a> which simplifies the output.  </p>
<p>If you like egrep | sed | awk, by all means trot something like this out and you&#8217;ve got a decent capture of the duration along with the file name:</p>
<p>afinfo *.m* |  egrep &#8216;(File:|estimated duration)&#8217; |  awk &#8216;NF{print $0 &#8220;\t&#8221;}&#8217; | sed  &#8216;s/File://g&#8217; | sed &#8216;s/estimated duration://g&#8217; | sed &#8216;s/^[ \t]*//&#8217;| sed &#8216;s/\([0-9]*\.[0-9]*\) sec/\1/g&#8217; | sed &#8216;s/\([0-9]*\.[0-9]*\)\n/\1/g&#8217;</p>
<p>However, after a quick glance at mediainfo, it&#8217;s much easier to use and format.  A basic command would look like this:</p>
<p>mediainfo *.m* &#8220;&#8211;Inform=General;%CompleteName% %Title% %Duration/String3% \n&#8221;</p>
<p>HTHS. I know it helped me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.usabilityparadox.com/2012/02/16/getting-duration-and-other-info-from-media-files-on-a-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UIPopoverController in modal view</title>
		<link>http://www.usabilityparadox.com/2012/02/13/uipopovercontroller-in-modal-view/</link>
		<comments>http://www.usabilityparadox.com/2012/02/13/uipopovercontroller-in-modal-view/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 14:54:05 +0000</pubDate>
		<dc:creator>gmjordan</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.usabilityparadox.com/?p=219</guid>
		<description><![CDATA[WARNING: using this might skirt the fruit company&#8217;s guidelines but it worked for me. Also, I survive by coding web apps with java (and sometimes php), android apps, iphone/ipad apps and am starting to spend time courting spring data + neo4j. In other words, I don&#8217;t spend ALL DAY in xcode and there are limitations [...]]]></description>
			<content:encoded><![CDATA[<p>WARNING: using this might skirt the fruit company&#8217;s guidelines but it worked for me.  Also, I survive by coding web apps with java (and sometimes php), android apps, iphone/ipad apps and am starting to spend time courting spring data + neo4j.  In other words, I don&#8217;t spend ALL DAY in xcode and there are limitations to questions I can answer.  That said, I hope this helps someone else.</p>
<p>So I needed to a way to handle a big list of items in an iPad app.  The list of items are audio and video files referenced in a plist.</p>
<p>To start, I&#8217;ve got a ViewController that uses presentModalViewController to open up another ViewContoller that has a popover in it.  The popover handles the list of items and the viewcontroller handles the display of the audio/video.  </p>
<p>All of this should be pretty straightforward to most decent iOS devs, but one thing kept tripping me up &#8211; the handling of the popover on didSelectRowAtIndexPath. </p>
<p>With help from <a href="http://stackoverflow.com/questions/2720327/code-is-exectuting-but-the-view-is-not-loading-when-called-form-a-function">this tip</a> by <a href="http://stackoverflow.com/users/165260/madhup">Madhup</a>, here&#8217;s what I did.</p>
<p>1. In a UIViewcontroller .h, add in the elements for your view as well as the reference to popover controller and controller you&#8217;re going to use to build the list.  I called mine SectionViewController</p>
<pre class="brush: objc; title: ; notranslate">
#import &quot;SectionListViewController.h&quot;
#import &lt;MediaPlayer/MPMoviePlayerController.h&gt;

@interface SectionViewController : UIViewController &lt;UIPopoverControllerDelegate&gt; {
    UIPopoverController *popoverController;
    SectionListViewController *slvc;
    IBOutlet UIButton *btn;
    NSString *plistTitle;
    IBOutlet UILabel *itemSelected;
    id detailItem;
    NSMutableArray *listOfItemsInitialLoad;
}
@property (nonatomic, retain) UIPopoverController *popoverController;
@property (nonatomic, retain) SectionListViewController *slvc;
@property (nonatomic, retain) UIButton *btn;
@property (nonatomic, retain) NSString *plistTitle;
@property (nonatomic, retain) UILabel *itemSelected;
@property (nonatomic, retain) id detailItem;
@property (nonatomic, retain) NSMutableArray *listOfItemsInitialLoad;
- (void)dismissWindow;

@end
</pre>
<p>2.  in the corresponding .m file,  you&#8217;ll need to setup a button (see leftBarButton below) to open the popover and a method (see showList method below) to create it.</p>
<pre class="brush: objc; title: ; notranslate">
#import &quot;SectionViewController.h&quot;

#import &quot;AppDelegate.h&quot;
#import &quot;SectionListViewController.h&quot;

@implementation SectionViewController

@synthesize btn, itemSelected;
@synthesize popoverController;
@synthesize plistTitle;
@synthesize detailItem;
@synthesize slvc;
@synthesize listOfItemsInitialLoad;

-  (void)viewDidLoad {
    /*
      ...
       do some view stuff
      ...
    */

    // add the show and back buttons
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@&quot;Show More&quot; style:UIBarButtonItemStyleBordered target:self action:@selector(showList:) ];

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@&quot;Back&quot; style:UIBarButtonItemStyleBordered target:self action:@selector(dismissWindow)];

    plistTitle = self.plistTitle;

    // I use this to take a var and setup table items from a plist file.  the file name is passed from another view into this modal view
    NSString *tpath = [[NSBundle mainBundle] pathForResource:self.plistTitle ofType:@&quot;plist&quot;];
    listOfItemsInitialLoad = [[NSMutableArray alloc] initWithContentsOfFile:tpath];

    NSDictionary *item=[listOfItemsInitialLoad objectAtIndex:0];

    NSString *itemTitle = 	[item objectForKey:@&quot;title&quot;];
    NSString *assetName = 	[item objectForKey:@&quot;assetName&quot;];

    itemSelected.text = itemTitle;
}

// call this to show your list
- (void) showList:(id)sender {

    if (self.popoverController == nil) {
        slvc =   [[SectionListViewController alloc]  initWithNibName:@&quot;SectionListViewController&quot;  bundle:[NSBundle mainBundle]];
        slvc.title=plistTitle;
        popoverController =   [[UIPopoverController alloc] initWithContentViewController:slvc];
        popoverController.popoverContentSize=CGSizeMake(320,480);

	//
       [slvc setDelgate:self];

    }

    [self.popoverController presentPopoverFromBarButtonItem: self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];    

}

- (void)setDetailItem:(id)newDetailItem:newAssetName {
    [detailItem release];
    detailItem = [newDetailItem retain];
    itemSelected.text = [detailItem description];
    [popoverController dismissPopoverAnimated:YES];
}

//---called when the user clicks outside the popover view---
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController {
    return YES;
}

//---called when the popover view is dismissed---
- (void)popoverControllerDidDismissPopover: (UIPopoverController *)popoverController {

}

...

- (void)dismissWindow {

	if (popoverController != nil) {
        [popoverController dismissPopoverAnimated:YES];
    } 

	[self dismissModalViewControllerAnimated:YES];

}

//...
//dealloc and other boilerplate stuff
//...

@end
</pre>
<p>3. setup your tableview. I called mine SectionListViewController.  So, in your .h file, add the following:</p>
<pre class="brush: objc; title: ; notranslate">
#import &lt;UIKit/UIKit.h&gt;
@interface SectionListViewController : UITableViewController {
    NSMutableArray *listOfItems;
    id delegate;
}
@property (nonatomic, retain) NSMutableArray *listOfItems;
@property (nonatomic, retain) id delgate;
@end
</pre>
<p>4. then in your corresponding .m file, do this</p>
<pre class="brush: objc; title: ; notranslate">
#import &quot;SectionListViewController.h&quot;

#import &quot;AppDelegate.h&quot;
#import &quot;SectionViewController.h&quot;

@implementation SectionListViewController

@synthesize listOfItems;
@synthesize delgate;

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidLoad
{

    [super viewDidLoad];
    NSString *tpath = [[NSBundle mainBundle] pathForResource:self.title ofType:@&quot;plist&quot;];
    listOfItems = [[NSMutableArray alloc] initWithContentsOfFile:tpath];

    self.clearsSelectionOnViewWillAppear = NO;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
	return YES;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [listOfItems count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @&quot;Cell&quot;;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    NSString *cellValue = 	[[listOfItems objectAtIndex:indexPath.row] objectForKey:@&quot;title&quot;];
    cell.textLabel.text =cellValue;
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSDictionary *item=[self.listOfItems objectAtIndex:indexPath.row];

    NSString *itemTitle = 	[item objectForKey:@&quot;title&quot;];
    NSString *assetName = 	[item objectForKey:@&quot;assetName&quot;];

    [delgate setDetailItem:itemTitle:assetName ];
}

@end
</pre>
<p>obviously, there are a few methods and other odds and ends, such as setting up the player for the list of a/v as well as .xib files, but there&#8217;s already <a href="http://www.techotopia.com/index.php/Video_Playback_from_within_an_iOS_4_iPad_Application_(Xcode_4)">some</a> that cover <a href="http://bit.ly/A4bwqY">that</a>.</p>
<p>With that, once you&#8217;ve wired everything up and run it, it should look something like this:</p>
<p><img src="http://www.usabilityparadox.com/wp-content/uploads/2012/02/ipad-snap-20120213.png" alt="ipad popover" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.usabilityparadox.com/2012/02/13/uipopovercontroller-in-modal-view/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>configuring HA and Spring Data + Neo4j</title>
		<link>http://www.usabilityparadox.com/2012/02/02/configuring-ha-and-spring-data-neo4j/</link>
		<comments>http://www.usabilityparadox.com/2012/02/02/configuring-ha-and-spring-data-neo4j/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 21:07:50 +0000</pubDate>
		<dc:creator>gmjordan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[neo4j]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.usabilityparadox.com/?p=188</guid>
		<description><![CDATA[I was interested in getting started with the setup for HA on neo4j + spring data and found two old threads that helped. Since I&#8217;m not going to implement right away, I wanted to create a synopsis for later review. One way to configure spring data and neo4j with high availability is to use a [...]]]></description>
			<content:encoded><![CDATA[<p>I was interested in getting started with the setup for HA on neo4j + spring data and found two <a href="http://neo4j.org/nabble/#nabble-td3517015">old</a> <a href="http://neo4j.org/nabble/#nabble-td3376153">threads</a> that helped.  Since I&#8217;m not going to implement right away, I wanted to create a synopsis for later review.</p>
<p>One way to configure spring data and neo4j with high availability is to use a spring context xml and JAVA properties that are set on startup.  </p>
<p>Before doing any of this, you&#8217;ll need to first set up the coordinators (ZooKeeper) as described in the <a href="http://docs.neo4j.org/chunked/milestone/ha-setup-tutorial.html">docs</a>. </p>
<p>Once the coordinators are set, then add the java options in your container&#8217;s startup script that are specific to that container instance/node, such as:</p>
<pre name="code" class="java">
export JAVA_OPTS="-Dserver.id=1 -Dha.server.port=6001 -Ddatabase.path=/home/ubuntu/db -Dzookeeper.servers=zoo1:2181,zoo2:2181,zoo3:2181"
</pre>
<p>then in your spring context file add the bean setup, such as</p>
<pre name="code" class="xml">
    <bean id="graphDatabaseService" class="org.neo4j.kernel.HighlyAvailableGraphDatabase" destroy-method="shutdown" scope="singleton">
        <constructor-arg index="0" value="${database.path}"/>
        <constructor-arg index="1"> 
<map>
                <entry key="ha.machine_id" value="${server.id}"></entry>
                <entry key="ha.server" value="zoo1:${ha.server.port}"></entry>
                <entry key="ha.zoo_keeper_servers" value="${zookeeper.servers}"></entry>
                <entry key="enable_remote_shell" value="port=1331"></entry>
                <entry key="ha.pull_interval" value="1"></entry>
            </map>

        </constructor-arg>
    </bean>

    <neo4j:config graphDatabaseService="graphDatabaseService"/>
</pre>
<p>(be sure to check the view plain option b/c the display for some reason excludes the opening map tag.  Also you can simple use forward slashes at the end of the entry tags.  Again the code displayer is not helping here.)</p>
<p>Now you should be able to reference this config using <a href="http://static.springsource.org/spring-data/data-neo4j/docs/2.0.0.RELEASE/reference/html/#reference:template">Neo4jTemplate</a> or your <a href="http://static.springsource.org/spring-data/data-neo4j/docs/2.0.0.RELEASE/reference/html/#d0e2619">repository classes</a> or however you access neo4j via spring data.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.usabilityparadox.com/2012/02/02/configuring-ha-and-spring-data-neo4j/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usability and ROI</title>
		<link>http://www.usabilityparadox.com/2010/02/04/usability-and-roi/</link>
		<comments>http://www.usabilityparadox.com/2010/02/04/usability-and-roi/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 22:46:18 +0000</pubDate>
		<dc:creator>gmjordan</dc:creator>
				<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.usabilityparadox.com/?p=27</guid>
		<description><![CDATA[<p>If you are ever asked to measure ROI of usability initiatives, then be careful where you tread and what you promise.&#160; Good usability has benefits that can be measured through surveys and interviews, such as increased user satisfaction and trust.&#160; However, measuring usability ROI, especially for revenue increases, is challenging.&#160; It's not impossible, mind you, but challenging.&#160;</p>
<p>Before jumping into measuring usability ROI, it's important to be aware of the challenges that might impact the objectivity and credibility of the outcome.</p>
<p><strong>Problem: External Factors</strong></p>
<p>Isolating usability as the single or primary reason for increased revenue can be challenging because external factors might also be attributed to the increase, such as:</p>
<ul>
    <li>increased marketing &#38; promotion</li>
    <li>improvement of offering</li>
    <li>price</li>
    <li>competing offerings and their value relative to your offering</li>
</ul>
<p>These factors can make it difficult - or even unwise - to state that better usability was the cause for a revenue increase.</p>
<p>However, leaner times present an opportunity to demonstrate usability can have a healthy ROI.&#160; If your organization is spending the same or less on marketing, won't alter product or service lines or price significantly, then you are in a much better position to claim usability improvements as a primary cause for revenue increases.&#160; It's rare when all of those things line up in your favor, but it does happen.</p>
<p>Also, your offering might be something that has limited competition, such as event registration or something that is offered seasonally.&#160; In such cases, the only other factor is likely to be marketing &#38; promotion efforts.</p>
<p><strong>Problem: ROI is not tied to revenue</strong></p>
<p>If the area targeted for usability improvements is not tied to revenue, then you're facing a much tougher road.&#160; For example, the usability improvement might lead to an increase in productivity.&#160;&#160; In this case, there are significantly more metrics to collect.&#160; Also, C-level executives want increased productivity, but want increased revenue (surprise!) much more.</p>
<p>It is still possible to show a good ROI in this case, but it's better to start with an area that is tied to revenue.</p>
<p>Once key people at your organization see that spending money on usability can have a positive impact on revenue, then making a case for ROI connected to productivity will be that much easier to demonstrate and understand.&#160;</p>
<p>In a future post, I'll detail a project that tied usability improvements and productivity increases together to measure ROI.</p>
<p>For this post, I am sticking to revenue increases as the focus.</p>
<h3><strong>Calculating ROI</strong></h3>
<p>I would recommend using a simple method for calculating usability ROI.&#160; <a href="http://www.useit.com/alertbox/roi.html" target="_blank">Jakob Nielsen</a>,&#160;  <a href="http://www.usefulusability.com/usability-resources/" target="_blank">Craig Tomlin</a> and <a href="http://www.humanfactors.com/downloads/roi.asp" target="_blank">Human Factors International</a> have similar recommendations, but the simplest formula essentially looks like this:</p>
<p><em>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; increase in revenue / total cost of usability effort = ROI</em></p>
<p>&#160;</p>
<p>Here's a breakdown with some example numbers:</p>
<p>
<table height="144" width="351" cellspacing="1" cellpadding="1" border="1">
    <tbody>
        <tr>
            <td>
            <p>&#160;Labor Costs</p>
            <p>&#160;Incentives</p>
            <p>&#160;</p>
            <p><strong>Total Cost of Usability Effort</strong></p>
            </td>
            <td>
            <p>&#160;$3000</p>
            <p>&#160;$500</p>
            <p>========</p>
            <p><strong>&#160;$4000</strong></p>
            </td>
        </tr>
        <tr>
            <td><strong>&#160;Increase in Revenue</strong></td>
            <td><strong>&#160;$5000</strong></td>
        </tr>
        <tr>
            <td><strong>&#160;ROI</strong></td>
            <td><strong>&#160;125%</strong></td>
        </tr>
    </tbody>
</table>
</p>
<p>&#160;</p>
<h3><strong>Example in action</strong></h3>
<p>I've setup a quick review of usability ROI in action - with screenshots!&#160;In this case, I tested a previous event registration form (2008 Form).&#160;</p>
<p><br />
&#160;<a title="2008 Form - Full Size" href="/wp-content/uploads/image/usability-roi/2008bwb.png" rel="lightbox"><img height="308" width="470" border="1" class="border1px" alt="previous form" src="/wp-content/uploads/image/usability-roi/2008bwb-sm.png" /></a><br />
&#160;&#160;&#160; 2008 <em>Form<br />
</em></p>
<p>As far as methodology, I stuck to <a href="http://www.useit.com/alertbox/20000319.html" target="_blank">a simple qualitative test.</a> There's plenty of information and discussion on usability testing methodology, such the pros and cons of qualitative and quantitative methods. So, I'll leave review and discussion of various methodologies for another time.&#160;</p>
<p>For now, just remember that - to paraphrase Nielsen - zero testing gives you zero insight.&#160; In other words, find a method that works best for your particular cases and use it.&#160; If it is efficient, repeatable and reliably discovers the problems, then keep using it.</p>
<p>In the previous form, two issues formed the poor usability refrain, including:</p>
<ul>
    <li>the separation of the number of tickets needed and the attendees</li>
    <li>the intent of the submit button</li>
</ul>
<p>In the case of tickets and attendees, users were confused as to why those two items were separated.&#160; For example, one user noted that they had already filled in the names of attendees and that should imply how many tickets were needed.&#160; (Good idea, but what if <font size="2">George<strong>,</strong> Jr.</font> or James Eason, M.D. wants to go?).&#160; Also, the drop down limited the number of tickets that could be purchased.&#160; And what if the number of tickets didn't match the number of attendees?</p>
<p><a title="Attendees &#38; Tickets - Full Size" href="/wp-content/uploads/image/usability-roi/2008bwb-issue-one.gif" rel="lightbox"><img height="192" width="500" class="border1px" src="/wp-content/uploads/image/usability-roi/2008bwb-issue-one-sm.gif" alt="" /></a></p>
<p><br />
Another issue was the submit button, specifically the wording. The form used a third party to collect payment, so it was deemed necessary to create another step.</p>
<p><a title="Continue and Register Button - Full Size" href="/wp-content/uploads/image/usability-roi/2008bwb-issue-two.gif" rel="lightbox"><img height="76" width="500" class="border1px" alt="" src="/wp-content/uploads/image/usability-roi/2008bwb-issue-two-sm.gif" /></a></p>
<p>If the wording had been more clear, then it might have been more usable. For the tickets &#38; attendees issue, some additional error handling or better layout might have helped.&#160; However, it's never as simple as that, right?&#160; At the time, the developer put together a form that met requirements.&#160; Users could register. The form owners were able to get total ticket sales &#38; attendee names. Case closed.</p>
<p>So, armed with the results, the new design (2009 Form) incorporated two key changes.</p>
<p><a title="2009 Form - Full Size" href="/wp-content/uploads/image/usability-roi/2009bwb.png" rel="lightbox"><img height="426" width="470" src="/wp-content/uploads/image/usability-roi/2009bwb-sm.png" class="border1px" alt="new form" /></a><br />
&#160;&#160;&#160;&#160;&#160; <em>2009 Form</em></p>
<p>First, the form allowed the users to key in the number of tickets and then the attendee fields were dynamically generated.&#160; This allowed for the form to respond to the user input and provide a connection between the required information.</p>
<p><a title="New Tickets &#38; Attendees - Full Size" href="/wp-content/uploads/image/usability-roi/2009bwb-issue-one-fix.gif" rel="lightbox"><img height="132" width="500" class="border1px" alt="" src="/wp-content/uploads/image/usability-roi/2009bwb-issue-one-fix-sm.gif" /></a></p>
<p>Second, the submit button was clear.&#160; Also, the payment gateway was implemented differently, so a second step was not necessary.&#160; If the payment gateway process had not changed, the wording would have been different!&#160; Even so, the single step form was a usability improvement.</p>
<p><a title="New Register Button - Full Size" href="/wp-content/uploads/image/usability-roi/2009bwb-issue-two-fix.gif" rel="lightbox"><img height="203" width="401" class="border1px" alt="" src="/wp-content/uploads/image/usability-roi/2009bwb-issue-two-fix.gif" /></a></p>
<h3><strong>The results</strong></h3>
<p>Here is the ROI based on the increase over the previous year and the cost of the usability testing.</p>
<p>
<table height="124" width="400" cellspacing="1" cellpadding="1" border="1">
    <tbody>
        <tr>
            <td><strong>&#160;Total Cost of Usability Effort</strong></td>
            <td><strong>&#160;$780</strong></td>
        </tr>
        <tr>
            <td><strong>&#160;Increase in Revenue</strong></td>
            <td><strong>&#160;$4800</strong></td>
        </tr>
        <tr>
            <td><strong>&#160;ROI</strong></td>
            <td><strong>&#160;615%</strong></td>
        </tr>
    </tbody>
</table>
</p>
<h3><strong>Counter-points</strong></h3>
<p>Some might argue that the first iteration of the form simply suffered from an &#34;uninspired design&#34;, had a horrible layout or other design flaws.&#160; No argument here.&#160; However, as Jared Spool at UIE points out, <a href="http://www.uie.com/articles/three_hund_million_button" target="_blank">even a simple design can be improved</a>.</p>
<p>To that point, the layout and design would have been updated regardless of usability testing, but, even without a layout improvement, users could still complete the form and register.&#160; The takeaway is that the most essential issues were revealed only after<strong> watching non-web professionals actually try and complete it</strong>.&#160; Go figure!&#160; On top of that, there was a return on investment in the form of increased ticket sales.</p>
<p>Some might also point to external factors, such as increased marketing or better product offering.&#160; However, there was no increase in spending for marketing and the offering was essentially the same as the prior year.&#160;&#160; External factors still play a part, but they were limited in this case.</p>
<hr width="100%" size="2" />
<p>Overall, I don't yet see a way to completely single out usability improvements as the cause for increased ROI, but usability improvements can and do impact revenue.&#160; So, for now, it seems best to:</p>
<ul>
    <li>find areas tied to revenue where usability can be improved.</li>
    <li>be aware of external factors that might also impact revenue and, consequently, affect the validity of usability ROI.</li>
</ul>
<p>If you've got other ideas, think I left something out,&#160; or just think I am completely off-base, please drop in a comment below.</p>
<p>Special thanks to <a href="http://twitter.com/rocj" target="_blank">Roc Johnson</a> and the teams at <a href="http://www.methodisthealth.org/portal/site/methodist/" target="_blank">Methodist Healthcare</a> and <a href="http://www.lebonheur.org/portal/site/lebonheur/" target="_blank">Le Bonheur Children's Medical Center</a>.</p>
<p>&#160;</p>]]></description>
			<content:encoded><![CDATA[<p>If you are ever asked to measure ROI of usability initiatives, then be careful where you tread and what you promise.&nbsp; Good usability has benefits that can be measured through surveys and interviews, such as increased user satisfaction and trust.&nbsp; However, measuring usability ROI, especially for revenue increases, is challenging.&nbsp; It&#8217;s not impossible, mind you, but challenging.&nbsp;</p>
<p>Before jumping into measuring usability ROI, it&#8217;s important to be aware of the challenges that might impact the objectivity and credibility of the outcome.</p>
<p><strong>Problem: External Factors</strong></p>
<p>Isolating usability as the single or primary reason for increased revenue can be challenging because external factors might also be attributed to the increase, such as:</p>
<ul>
<li>increased marketing &amp; promotion</li>
<li>improvement of offering</li>
<li>price</li>
<li>competing offerings and their value relative to your offering</li>
</ul>
<p>These factors can make it difficult &#8211; or even unwise &#8211; to state that better usability was the cause for a revenue increase.</p>
<p>However, leaner times present an opportunity to demonstrate usability can have a healthy ROI.&nbsp; If your organization is spending the same or less on marketing, won&#8217;t alter product or service lines or price significantly, then you are in a much better position to claim usability improvements as a primary cause for revenue increases.&nbsp; It&#8217;s rare when all of those things line up in your favor, but it does happen.</p>
<p>Also, your offering might be something that has limited competition, such as event registration or something that is offered seasonally.&nbsp; In such cases, the only other factor is likely to be marketing &amp; promotion efforts.</p>
<p><strong>Problem: ROI is not tied to revenue</strong></p>
<p>If the area targeted for usability improvements is not tied to revenue, then you&#8217;re facing a much tougher road.&nbsp; For example, the usability improvement might lead to an increase in productivity.&nbsp;&nbsp; In this case, there are significantly more metrics to collect.&nbsp; Also, C-level executives want increased productivity, but want increased revenue (surprise!) much more.</p>
<p>It is still possible to show a good ROI in this case, but it&#8217;s better to start with an area that is tied to revenue.</p>
<p>Once key people at your organization see that spending money on usability can have a positive impact on revenue, then making a case for ROI connected to productivity will be that much easier to demonstrate and understand.&nbsp;</p>
<p>In a future post, I&#8217;ll detail a project that tied usability improvements and productivity increases together to measure ROI.</p>
<p>For this post, I am sticking to revenue increases as the focus.</p>
<h3><strong>Calculating ROI</strong></h3>
<p>I would recommend using a simple method for calculating usability ROI.&nbsp; <a href="http://www.useit.com/alertbox/roi.html" target="_blank">Jakob Nielsen</a>,&nbsp;  <a href="http://www.usefulusability.com/usability-resources/" target="_blank">Craig Tomlin</a> and <a href="http://www.humanfactors.com/downloads/roi.asp" target="_blank">Human Factors International</a> have similar recommendations, but the simplest formula essentially looks like this:</p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; increase in revenue / total cost of usability effort = ROI</em></p>
<p>&nbsp;</p>
<p>Here&#8217;s a breakdown with some example numbers:</p>
<table height="144" width="351" cellspacing="1" cellpadding="1" border="1">
<tbody>
<tr>
<td>
<p>&nbsp;Labor Costs</p>
<p>&nbsp;Incentives</p>
<p>&nbsp;</p>
<p><strong>Total Cost of Usability Effort</strong></p>
</td>
<td>
<p>&nbsp;$3000</p>
<p>&nbsp;$500</p>
<p>========</p>
<p><strong>&nbsp;$4000</strong></p>
</td>
</tr>
<tr>
<td><strong>&nbsp;Increase in Revenue</strong></td>
<td><strong>&nbsp;$5000</strong></td>
</tr>
<tr>
<td><strong>&nbsp;ROI</strong></td>
<td><strong>&nbsp;125%</strong></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h3><strong>Example in action</strong></h3>
<p>I&#8217;ve setup a quick review of usability ROI in action &#8211; with screenshots!&nbsp;In this case, I tested a previous event registration form (2008 Form).&nbsp;</p>
<p>
&nbsp;<a title="2008 Form - Full Size" href="/wp-content/uploads/image/usability-roi/2008bwb.png" rel="lightbox"><img height="308" width="470" border="1" class="border1px" alt="previous form" src="/wp-content/uploads/image/usability-roi/2008bwb-sm.png" /></a><br />
&nbsp;&nbsp;&nbsp; 2008 <em>Form<br />
</em></p>
<p>As far as methodology, I stuck to <a href="http://www.useit.com/alertbox/20000319.html" target="_blank">a simple qualitative test.</a> There&#8217;s plenty of information and discussion on usability testing methodology, such the pros and cons of qualitative and quantitative methods. So, I&#8217;ll leave review and discussion of various methodologies for another time.&nbsp;</p>
<p>For now, just remember that &#8211; to paraphrase Nielsen &#8211; zero testing gives you zero insight.&nbsp; In other words, find a method that works best for your particular cases and use it.&nbsp; If it is efficient, repeatable and reliably discovers the problems, then keep using it.</p>
<p>In the previous form, two issues formed the poor usability refrain, including:</p>
<ul>
<li>the separation of the number of tickets needed and the attendees</li>
<li>the intent of the submit button</li>
</ul>
<p>In the case of tickets and attendees, users were confused as to why those two items were separated.&nbsp; For example, one user noted that they had already filled in the names of attendees and that should imply how many tickets were needed.&nbsp; (Good idea, but what if <font size="2">George<strong>,</strong> Jr.</font> or James Eason, M.D. wants to go?).&nbsp; Also, the drop down limited the number of tickets that could be purchased.&nbsp; And what if the number of tickets didn&#8217;t match the number of attendees?</p>
<p><a title="Attendees &amp; Tickets - Full Size" href="/wp-content/uploads/image/usability-roi/2008bwb-issue-one.gif" rel="lightbox"><img height="192" width="500" class="border1px" src="/wp-content/uploads/image/usability-roi/2008bwb-issue-one-sm.gif" alt="" /></a></p>
<p>
Another issue was the submit button, specifically the wording. The form used a third party to collect payment, so it was deemed necessary to create another step.</p>
<p><a title="Continue and Register Button - Full Size" href="/wp-content/uploads/image/usability-roi/2008bwb-issue-two.gif" rel="lightbox"><img height="76" width="500" class="border1px" alt="" src="/wp-content/uploads/image/usability-roi/2008bwb-issue-two-sm.gif" /></a></p>
<p>If the wording had been more clear, then it might have been more usable. For the tickets &amp; attendees issue, some additional error handling or better layout might have helped.&nbsp; However, it&#8217;s never as simple as that, right?&nbsp; At the time, the developer put together a form that met requirements.&nbsp; Users could register. The form owners were able to get total ticket sales &amp; attendee names. Case closed.</p>
<p>So, armed with the results, the new design (2009 Form) incorporated two key changes.</p>
<p><a title="2009 Form - Full Size" href="/wp-content/uploads/image/usability-roi/2009bwb.png" rel="lightbox"><img height="426" width="470" src="/wp-content/uploads/image/usability-roi/2009bwb-sm.png" class="border1px" alt="new form" /></a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em>2009 Form</em></p>
<p>First, the form allowed the users to key in the number of tickets and then the attendee fields were dynamically generated.&nbsp; This allowed for the form to respond to the user input and provide a connection between the required information.</p>
<p><a title="New Tickets &amp; Attendees - Full Size" href="/wp-content/uploads/image/usability-roi/2009bwb-issue-one-fix.gif" rel="lightbox"><img height="132" width="500" class="border1px" alt="" src="/wp-content/uploads/image/usability-roi/2009bwb-issue-one-fix-sm.gif" /></a></p>
<p>Second, the submit button was clear.&nbsp; Also, the payment gateway was implemented differently, so a second step was not necessary.&nbsp; If the payment gateway process had not changed, the wording would have been different!&nbsp; Even so, the single step form was a usability improvement.</p>
<p><a title="New Register Button - Full Size" href="/wp-content/uploads/image/usability-roi/2009bwb-issue-two-fix.gif" rel="lightbox"><img height="203" width="401" class="border1px" alt="" src="/wp-content/uploads/image/usability-roi/2009bwb-issue-two-fix.gif" /></a></p>
<h3><strong>The results</strong></h3>
<p>Here is the ROI based on the increase over the previous year and the cost of the usability testing.</p>
<table height="124" width="400" cellspacing="1" cellpadding="1" border="1">
<tbody>
<tr>
<td><strong>&nbsp;Total Cost of Usability Effort</strong></td>
<td><strong>&nbsp;$780</strong></td>
</tr>
<tr>
<td><strong>&nbsp;Increase in Revenue</strong></td>
<td><strong>&nbsp;$4800</strong></td>
</tr>
<tr>
<td><strong>&nbsp;ROI</strong></td>
<td><strong>&nbsp;615%</strong></td>
</tr>
</tbody>
</table>
<h3><strong>Counter-points</strong></h3>
<p>Some might argue that the first iteration of the form simply suffered from an &quot;uninspired design&quot;, had a horrible layout or other design flaws.&nbsp; No argument here.&nbsp; However, as Jared Spool at UIE points out, <a href="http://www.uie.com/articles/three_hund_million_button" target="_blank">even a simple design can be improved</a>.</p>
<p>To that point, the layout and design would have been updated regardless of usability testing, but, even without a layout improvement, users could still complete the form and register.&nbsp; The takeaway is that the most essential issues were revealed only after<strong> watching non-web professionals actually try and complete it</strong>.&nbsp; Go figure!&nbsp; On top of that, there was a return on investment in the form of increased ticket sales.</p>
<p>Some might also point to external factors, such as increased marketing or better product offering.&nbsp; However, there was no increase in spending for marketing and the offering was essentially the same as the prior year.&nbsp;&nbsp; External factors still play a part, but they were limited in this case.</p>
<hr width="100%" size="2" />
<p>Overall, I don&#8217;t yet see a way to completely single out usability improvements as the cause for increased ROI, but usability improvements can and do impact revenue.&nbsp; So, for now, it seems best to:</p>
<ul>
<li>find areas tied to revenue where usability can be improved.</li>
<li>be aware of external factors that might also impact revenue and, consequently, affect the validity of usability ROI.</li>
</ul>
<p>If you&#8217;ve got other ideas, think I left something out,&nbsp; or just think I am completely off-base, please drop in a comment below.</p>
<p>Special thanks to <a href="http://twitter.com/rocj" target="_blank">Roc Johnson</a> and the teams at <a href="http://www.methodisthealth.org/portal/site/methodist/" target="_blank">Methodist Healthcare</a> and <a href="http://www.lebonheur.org/portal/site/lebonheur/" target="_blank">Le Bonheur Children&#8217;s Medical Center</a>.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.usabilityparadox.com/2010/02/04/usability-and-roi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

