<?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>Helen Marie: Design and Code &#187; The Craft</title>
	<atom:link href="http://blog.helen-marie.com/index.php/cat/the-craft/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.helen-marie.com</link>
	<description>Strategy, design, technology, and how to be our client</description>
	<lastBuildDate>Mon, 27 Jul 2009 20:33:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Agility and the User Experience</title>
		<link>http://blog.helen-marie.com/index.php/2009/04/agility-and-the-user-experience/</link>
		<comments>http://blog.helen-marie.com/index.php/2009/04/agility-and-the-user-experience/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 18:20:09 +0000</pubDate>
		<dc:creator>msh</dc:creator>
				<category><![CDATA[Client Side]]></category>
		<category><![CDATA[Strategy]]></category>
		<category><![CDATA[The Craft]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[informationarchitecture]]></category>
		<category><![CDATA[phases]]></category>
		<category><![CDATA[uxd]]></category>

		<guid isPermaLink="false">http://blog.helen-marie.com/?p=128</guid>
		<description><![CDATA[It&#8217;s easy to think of a web site in terms of the teams who participate in the project: content, design, information architecture, hardware, platform, application development.  But it&#8217;s the user who ties all the parts together: the user experience is the end-product of a web application.
This is why people freak out about user experience [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s easy to think of a web site in terms of the teams who participate in the project: content, design, information architecture, hardware, platform, application development.  But it&#8217;s the user who ties all the parts together: the user experience is the end-product of a web application.</p>
<p>This is why people freak out about user experience design, or UxD, these days.  We can define and justify and normalize everything we do during the course of a web project by referring to the user experience, and we can keep this experience in mind as a theoretical model to help us make decisions along the way.<span id="more-128"></span></p>
<p>But the user experience is only just that &#8212; a theoretical model &#8212; until you get <em>real users</em>.  This is why we can&#8217;t begin a project with all the answers.  The answers to many important questions are provided by the users.  But the users don&#8217;t come until we&#8217;ve actually designed and built something.</p>
<p>Oh, the Catch-22!</p>
<p>The way out, of course, is by agreeing to launch with something that&#8217;s in some important way unfinished.  Knowing that our users will provide us with feedback that will shape the future site &#8212; that we plan and build the site in phases, and that these phases are informed by an ongoing engagement with the user experience.</p>
<p>As an agency, you need to go to great lengths to get your clients to understand this.  They can&#8217;t provide a spec, like a blueprint for a shed, and get a quote and schedule based solely on the blueprint, and then expect the actual shed to look exactly like the blueprint.  This is what they&#8217;ll want, because it&#8217;s easier to plan, and easier to budget for, and just generally easier to think about.  But it doesn&#8217;t comport with reality, so you&#8217;ll have to make a strong case for agility throughout the process.</p>
<p>And as a client, you need to go to equally great lengths to factor this fluidity into your own plans.  Remember the great triangle of software development: one side is budget; the second side is functionality; and the third is schedule.  You can&#8217;t fix all of these sides, because you&#8217;ll end in horrendous failure (the great triangle of pain and disappointment).  If you must, try to fix two; but leave the third one agile.</p>
<p>Say you&#8217;ve got a project with some fairly well-defined requirements, and pegged to a particular real-world date.  You&#8217;ve got your functionality and schedule fixed.  This means you must remain agile with your budget.  In practical terms, you&#8217;ll need to provide the agency with a budget range that is acceptable, and trust them (<em>Trust them!</em> Seriously!) to keep their costs down.</p>
<p>(Side note: if you can&#8217;t trust your agency to keep their costs down, you should find another agency.  This shouldn&#8217;t be an antagonistic process, but one where both sides share common goals.)</p>
<p>A second example, one that we see very often at HM: Say you&#8217;re a not-for-profit institution that secured funding for a particular project proposal from a big foundation.  You may see all three sides of the triangle as fixed: you promised a set of functionality in your proposal.  You also received a fixed amount of funding, and have a delivery date as part of the funding timeline.</p>
<p>In truth, though, one side of the triangle has to be flexible in this situation.  Chances are the foundation won&#8217;t increase the budget, so one of the other sides needs to be subject to change.  This may require some advocacy on your part to get the flexibility you need from the funder, but the big selling point here is the main goal: a beautiful, functional, memorable web experience that users will visit again and again because it was <em>built around their needs</em>.  If you can&#8217;t get it all done in the budget and timeline provided, consider this a first phase.  Phases are good!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.helen-marie.com/index.php/2009/04/agility-and-the-user-experience/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupal as a Prototyping Tool</title>
		<link>http://blog.helen-marie.com/index.php/2009/01/drupal-as-a-prototyping-tool/</link>
		<comments>http://blog.helen-marie.com/index.php/2009/01/drupal-as-a-prototyping-tool/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 18:32:57 +0000</pubDate>
		<dc:creator>msh</dc:creator>
				<category><![CDATA[The Craft]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[prototyping]]></category>

		<guid isPermaLink="false">http://blog.helen-marie.com/?p=63</guid>
		<description><![CDATA[There is a vast matrix that exists in my mind (there are also other, emptier spaces of such magnitude that we dare not approach).  The matrix maps functional requirements, content structures, and media assets against out-of-the-box Drupal functionality, popular and flexible modules, and theming methodologies.
This matrix exists in a Platonic form where all of [...]]]></description>
			<content:encoded><![CDATA[<p>There is a vast matrix that exists in my mind (there are also other, emptier spaces of such magnitude that we dare not approach).  The matrix maps functional requirements, content structures, and media assets against out-of-the-box Drupal functionality, popular and flexible modules, and theming methodologies.</p>
<p>This matrix exists in a Platonic form where all of the requirements and conditions map neatly to available functionality and structures.  It&#8217;s only when I populate it with the real-world facts of a project that gaps emerge. Those gaps identify the responsibilities and data structures that we&#8217;ll need to delegate to our own modules.  Once we group these by logical or functional affinity, we have our module strategy.</p>
<p><span id="more-63"></span></p>
<p>For instance, while scoping a recent project it became clear that the client was asking for functionality resembling part of an e-commerce application.  Part, but not all: the client wouldn&#8217;t specify the order, but would rather be supplied with a template of an order, and given the option to alter details of the order before submitting.  And instead of processing payment, our application would submit to the client&#8217;s fulfillment department, who would then issue an invoice and process the order through existing systems.</p>
<p>We could have scoped this by documenting order flow, architecting the process, and writing a technical brief that would summarize business requirements and accompanying functional requirements.  Instead, we built a Drupal prototype to explore how far existing modules would get us.</p>
<p>You can see a very basic iteration of this prototype here:</p>
<p><a href="http://d1.helen-marie.com/">http://d1.helen-marie.com/</a></p>
<p>Barebones indeed.  But that&#8217;s the point: this took fifteen minutes, and supplied us with much more accurate information regarding how we could work around the assumptions of the <a href="http://drupal.org/project/ubercart">UberCart module</a>.  Those assumptions form the core of our module strategy.  On top of that, we build in time and budget to cover theme development, and we have our basic scope and requirements.  We also know a lot more about our upgrade path than we would from an abstract scoping document, because we can cite UberCart&#8217;s support and upgrade history (as well as Drupal&#8217;s, of course).</p>
<p>And on top of <em>that</em>, we could show the client a working example of a portion of the proposed functionality.  That&#8217;s exciting for everyone involved, and comes at a very small internal cost.</p>
<p>The customization strategy becomes clear:</p>
<ul>
<li>A user of type A (or, in Drupal &#8220;role A&#8221;) can create an order for a user of type B.</li>
<li>Type B user receives email notification and link when order is created.</li>
<li>Order is considered &#8220;paid&#8221; by UberCart when submitted.</li>
<li>Type A user receives email notification with order details when it is submitted.</li>
</ul>
<p>That wasn&#8217;t so hard, was it?</p>
<p>One of the reservations underlying this approach is this: &#8220;What if I pick the wrong modules the first time around?  What if my scope is affected because I change my mind about my module strategy after the client accepts the budget?&#8221;</p>
<p>This is a risk you run whenever you pair a scope and a budget.  It doesn&#8217;t matter what platform you use, or how specifically you set your scope.  This is a problem you solve by setting a budget that allows for a certain degree of agility (i.e., making useful mistakes, learning from them, and correcting) during development.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.helen-marie.com/index.php/2009/01/drupal-as-a-prototyping-tool/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flash and HTML layers: still a problem</title>
		<link>http://blog.helen-marie.com/index.php/2009/01/flash-and-html-layers/</link>
		<comments>http://blog.helen-marie.com/index.php/2009/01/flash-and-html-layers/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 04:45:11 +0000</pubDate>
		<dc:creator>msh</dc:creator>
				<category><![CDATA[The Craft]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[informationarchitecture]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://blog.helen-marie.com/?p=38</guid>
		<description><![CDATA[Update, April 2009: Change.gov seems to have changed their video player size, so the working example in this entry no longer has a strict correlation between the video player and the image replacement.  The principle still holds, though, and it would be an easy fix to create a new replacement image using the naming conventions [...]]]></description>
			<content:encoded><![CDATA[<p><em>Update, April 2009: Change.gov seems to have changed their video player size, so the working example in this entry no longer has a strict correlation between the video player and the image replacement.  The principle still holds, though, and it would be an easy fix to create a new replacement image using the naming conventions below. &#8212; msh</em></p>
<p>Happy 2009!  OK, back to work.</p>
<p>Note to developers and designers: you still can&#8217;t layer HTML over Flash, and you still need to design around it.  Sad, but true.  For instance, this page on <a href="http://change.gov/page/content/discussservice">change.gov</a> has the classic problem: a Flash video player at the top of the page, and a menu that draws a layer on rollover.  The two are not friends.</p>
<p><span id="more-38"></span></p>
<p>In its natural state:</p>
<p><a href="http://blog.helen-marie.com/wp-content/uploads/2009/01/layer-off.png"><img class="aligncenter size-medium wp-image-39" title="layer-off" src="http://blog.helen-marie.com/wp-content/uploads/2009/01/layer-off-300x251.png" alt="layer-off" width="300" height="251" /></a></p>
<p>On mouse over &#8212; whoops!  The video&#8217;s &#8220;play&#8221; icon shows through the menu:</p>
<p><a href="http://blog.helen-marie.com/wp-content/uploads/2009/01/layer-over.png"><img class="aligncenter size-medium wp-image-40" title="layer-over" src="http://blog.helen-marie.com/wp-content/uploads/2009/01/layer-over-300x238.png" alt="layer-over" width="300" height="238" /></a></p>
<p>It&#8217;s a problem on standards-compliant browsers and elsewhere.  There are two ways around it: hide the Flash player when the menu layer appears, or design around it.  We recommend the latter, as it enables you to avoid hacks or sleight-of-hand.</p>
<p>If you need the video right there, though, you&#8217;ll have to figure out a better way.  And  if you have to resort to trickery, you might as well entertain yourself.</p>
<p><strong>Fixing change.gov&#8217;s problem</strong></p>
<p>This page uses the uber-popular <a href="http://www.longtailvideo.com/players/jw-flv-player/">Media Player from Jeroen Wijering</a>, which unlike the QuickTime player is fairly scriptable.  But instead of making any calls on the Flash player or its helper scripts, we&#8217;re just going to destroy it entirely.</p>
<p>The goal is to replace the video player with some kind of flat HTML whenever the mouse is over the menu.  Then we can guarantee that the menu layers will always layer properly over boring HTML elements instead of being invaded by underlying Flash goobers.  When the mouse leaves the menu, we can restore the original video player.</p>
<p>You&#8217;ll need two main entities: a listener, to respond to the menu rollover event; and a Flash player handler, to hide and show (or destroy and re-create) the player.  Luckily, change.gov already has the former; it&#8217;s in <a href="http://change.gov/js/jquery">this JavaScript file</a>.  Our modified version, <a href="http://blog.helen-marie.com/examples/20090107-changegov/change.js">available here</a>, has two additional method calls at lines 95 and 106.  These refer to a nav handler object defined in <a href="http://blog.helen-marie.com/examples/20090107-changegov/hm.js">this additional JS file</a>.</p>
<p>I made one substantial change to change.gov&#8217;s original HTML: I gave a class of &#8220;wrapper-video&#8221; to the div that contains the video player.  The nav handler will work on the assumption that every video player that might be affected is classed with &#8220;wrapper-video&#8221;.</p>
<p>When the handler&#8217;s setOver() method is invoked, it loops through &#8220;wrapper-video&#8221; divs.  For each div, it caches the original HTML and the calculated width and height.  Next, it sets the div&#8217;s background to an image: in this case, an exact still of the video player.  E.g.:</p>
<p><img class="aligncenter size-full wp-image-48" title="hide-293x185" src="http://blog.helen-marie.com/wp-content/uploads/2009/01/hide-293x185.png" alt="hide-293x185" width="293" height="185" /></p>
<p>Looks convincing.  The image file name contains the dimensions, and setOver() takes advantage of this by constructing the file name dynamically.  This way, if you had more than one video player size, you&#8217;d be covered.  For good measure, we also explicitly set the div&#8217;s width and height, so it doesn&#8217;t collapse when we erase its contents.</p>
<p>Once all of this is done, we call jQuery.html(&#8221;") on the div, erasing its contents.  Now it just shows the background image, and will play nicely with the menu layers.</p>
<p>When the mouse leaves the menu area, navHandler.setOut() restores the original HTML contents of each video wrapper div.</p>
<p><a href="http://blog.helen-marie.com/examples/20090107-changegov/">You can see a working example here.</a></p>
<p>The files are also available for <a title="Download a ZIP of the final files" href="http://blog.helen-marie.com/examples/20090107-changegov/change-gov-fun.zip">downoad as a ZIP</a>.</p>
<p>The better solution clearly would be to design around this issue, but all too often we don&#8217;t have a lot of choice.  If video is the featured page content, there&#8217;s rarely a good way to push it safely towards the fold.</p>
<p>(Caveats: browser testing, your mileage may vary, etc.)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.helen-marie.com/index.php/2009/01/flash-and-html-layers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
