<?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>Bill Higgins&#039; Blog &#187; design</title>
	<atom:link href="http://billhiggins.us/blog/tag/design/feed/" rel="self" type="application/rss+xml" />
	<link>http://billhiggins.us/blog</link>
	<description></description>
	<lastBuildDate>Fri, 30 Jul 2010 00:09:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>the iPad and onmouseover</title>
		<link>http://billhiggins.us/blog/2010/04/05/the-ipad-and-onmouseover/</link>
		<comments>http://billhiggins.us/blog/2010/04/05/the-ipad-and-onmouseover/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 04:34:15 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[ux]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://billhiggins.us/blog/?p=153</guid>
		<description><![CDATA[Update: I&#8217;ve created a test page for this scenario, but I haven&#8217;t had a chance to test it yet on my iPad. In our Jazz UIs, we tend to use &#8220;hover previews&#8221; quite a bit. That is, if you hover over a link, after a second or so it will show a small preview of [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;">Update</span><span style="color: #ff0000;">: I&#8217;ve created </span><a href="http://billhiggins.us/tests/link-mouseover.html"><span style="color: #ff0000;">a test page</span></a><span style="color: #ff0000;"> for this scenario, but I haven&#8217;t had a chance to test it yet on my iPad.</span></p>
<p>In our <a href="http://jazz.net/">Jazz</a> UIs, we tend to use &#8220;hover previews&#8221; quite a bit. That is, if you hover over a link, after a second or so it will show a small preview of the resource at the other end [1]. <a href="https://jazz.net/wiki/bin/view/Main/WebUIPatternAndStyleGuide">Jazz style guide</a> example below (copyright <a href="http://ibm.com/">IBM</a>).</p>
<p><img class="alignnone size-full wp-image-154" title="Jazz Rich Hover" src="http://billhiggins.us/blog/wp-content/uploads/2010/04/hyperlink-rich-resource-examp.png" alt="" width="539" height="291" /></p>
<p>This was always broken on the <a href="http://www.apple.com/iphone/iphone-3gs/safari.html">iPhone&#8217;s Mobile Safari browser</a> because I couldn&#8217;t figure out how to perform a mouseover action on a mouse-less interface.</p>
<p>I just noticed that the <a href="http://www.apple.com/ipad/">iPad</a> seems to support <a href="http://www.w3schools.com/jsref/event_onmouseover.asp">onmouseover</a>. I <em>believe</em> I&#8217;ve observed the following behavior:</p>
<ul>
<li>If a link has no &#8220;on mouseover&#8221; actions (e.g. hovers), a tap follows to the link.</li>
<li>If a link has an &#8220;onmouseover&#8221; action, a tap activates the onmouseover action and a double-tap follows the link.</li>
</ul>
<p>Obviously this implies that you should provide visual indications to your user whether the links provide onmouseover actions or not. For the Jazz links with hover previews we immediately decorate the link on mouseover (different color, double-underline, with a small chevron) and if the user remains over the link for a second or two we then show the preview.</p>
<p>[1] I realize that onmouseover actions attached to links represent a <a href="http://en.wikipedia.org/wiki/User_experience_design">UX</a> minefield. A page with too many / too aggressive hover actions can feel like an actual minefield!</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2010/04/05/the-ipad-and-onmouseover/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>frameworks and building blocks</title>
		<link>http://billhiggins.us/blog/2008/10/10/frameworks-and-building-blocks/</link>
		<comments>http://billhiggins.us/blog/2008/10/10/frameworks-and-building-blocks/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 06:38:52 +0000</pubDate>
		<dc:creator>Bill Higgins</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[jazz]]></category>

		<guid isPermaLink="false">http://billhiggins.us/weblog/?p=85</guid>
		<description><![CDATA[Between early 2006 and early this year, my team at IBM Rational and I built a framework for component-based Ajax development for use in the Rational Jazz platform. The framework&#8217;s capabilities aren&#8217;t the focus of this entry, so I&#8217;ll just list some of them briefly: A nice component model based on OSGi bundles and the [...]]]></description>
			<content:encoded><![CDATA[<p>Between early 2006 and early this year, my team at IBM Rational and I built a framework for component-based Ajax development for use in the <a title="Rational Jazz :: ibm.com" href="http://www.ibm.com/software/rational/jazz/">Rational Jazz platform</a>. The framework&#8217;s capabilities aren&#8217;t the focus of this entry, so I&#8217;ll just list some of them briefly:</p>
<ul>
<li>A nice component model based on <a title="OSGi Alliance" href="http://www.osgi.org/Main/HomePage">OSGi</a> bundles and the <a title="The Dojo Toolkit" href="http://www.dojotoolkit.org/">Dojo</a> module system</li>
<li>Request-time &#8220;building&#8221; of many fine-grained JavaScript files into monolithic files for faster download based on the introspected relationships between the files &#8211; i.e. no developer effort required for fast code loading other than writing good application code</li>
<li>Making a subset of the Eclipse extension registry available in the web page and queryable via JavaScript APIs modeled off of the <code>org.eclipse.core.runtime</code> extension registry Java APIs, allowing for open-ended extensibility using the Eclipse extensibility model</li>
<li>A simple framework for demarcating UI states that made the back button, history, and page titles work seamlessly within the Ajax page, even when a user gesture resulted in crossing a component boundary (e.g. loading and displaying a new virtual &#8220;page&#8221; from a different component)</li>
<li>Dynamic, transparent loading of missing code in response to a user gesture that required it</li>
</ul>
<p>We did a fairly good job of keeping our Ajax framework decoupled from the rest of the Jazz Platform both for the purpose of design cohesiveness but also to allow for possible future use by teams who weren&#8217;t building full-blown application lifecycle management applications like Jazz SCM or Iteration Planning.</p>
<p>Over time, other IBM teams heard about some of our capabilities and saw the positive results in our <a title="Rational Team Concert" href="http://www.ibm.com/software/awdtools/rtc/">Rational Team Concert</a> web UIs (1) and contacted us to explore whether they could make use of our code in their products. Each conversation went like this:</p>
<ol>
<li>We gave a demo and talk about the capabilities and architecture of the framework</li>
<li>The other team said &#8220;that&#8217;s really nice, that&#8217;s really useful, that would be great to have&#8221;</li>
<li>The other team said &#8220;we&#8217;re not sure we want to live within your framework, we&#8217;ll get back to you&#8221;</li>
<li>The other team didn&#8217;t get back to us</li>
</ol>
<p>Initially this didn&#8217;t really bother me &#8211; after all my job was to deliver the foundation for our Jazz web user interfaces, not to create a general purpose Ajax framework for IBM, but as I&#8217;ve thought about it more over time and seen this anti-pattern from other teams and other frameworks, I&#8217;ve decided that we should make a conscious effort to make our useful functionality available as simple building blocks (in the form of libraries) and then provide frameworks that layer on top of these building blocks.</p>
<p>Let me take a step back and explain what I mean.</p>
<p>A library is a set of reusable functionality where your application uses parts of the library as necessary. For instance, most programming languages have a library for creating and manipulating dates. Frameworks also provide functionality to the application programmer, but instead of the application programmer making simple function calls, the framework runs the show and calls into the application at well defined hook points. For example, GUI frameworks provide ways to wire up code to run in response to users clicking on buttons.</p>
<p>Both the library and the framework provide useful functionality intended to make the application developer more productive. Though it&#8217;s dangerous to make a general statement, it feels to me that the big difference between the two is that frameworks generally provide more power, but require you to make a bigger commitment to the framework&#8217;s way of working, while libraries provide generally less power, but make few (if any) demands about how you structure your application.</p>
<p>What&#8217;s unfortunate is when you&#8217;ve got some useful bit of functionality that could be made available as a simple library but it&#8217;s only available in the context of a framework. This is where we were with our Ajax framework. This stuff is too abstract, so here&#8217;s an analogy: Imagine that you heard about a new refrigerator which provided every feature and characteristic you ever dreamed about having in a refrigerator. The catch however was that you couldn&#8217;t just buy the refrigerator &#8211; you had to move into a house on the other side of town that included the new refrigerator. After about 10 seconds of thought you realize that even though it&#8217;s the fridge of your dreams, you&#8217;re sure as hell not going to move into a new house across town in order to get it. This situation (switching back to software from refrigerators) is shown in the diagram below.</p>
<div id="attachment_120" class="wp-caption alignnone" style="width: 209px"><img class="size-full wp-image-120" title="building-blocks-in-framework" src="http://billhiggins.us/blog/wp-content/uploads/2008/10/building-blocks-in-framework.png" alt="Useful building blocks locked inside a framework" width="199" height="308" /><p class="wp-caption-text">Useful building blocks locked inside a framework</p></div>
<p>My recent realization (which seems obvious in hindsight) is that the useful functionality provided by frameworks and libraries need not be mutually exclusive. For instance, in our Ajax framework&#8217;s dynamic build system, rather than requiring applications to run within our framework to enjoy this capability, we could have created a simple callable library to perform dynamic optimization on a set of files, and then created a framework that simply used this same library. This approach is shown in the diagram below:</p>
<div id="attachment_122" class="wp-caption alignnone" style="width: 433px"><img class="size-full wp-image-122" title="building-blocks-decoupled-from-framework" src="http://billhiggins.us/blog/wp-content/uploads/2008/10/building-blocks-decoupled-from-framework.png" alt="Useful building blocks used by a framework but also available independently of the framework" width="423" height="296" /><p class="wp-caption-text">Useful building blocks used by a framework but also available independently of the framework</p></div>
<p>Over the past month or so we&#8217;ve been refactoring our Ajax framework to extract the useful building blocks into simple callable libraries and making the framework proper smaller by delegating to these libraries. We&#8217;ve done this in the hopes that our code will be useful to other IBM teams but as a result of the exercise, we&#8217;ve gained a deeper knowledge of our software and the software&#8217;s quality has improved as we&#8217;ve decoupled the framework aspects from the building blocks aspects.</p>
<p>Going forward, it&#8217;s my intention that our team will generally start with building blocks first and then consider if we should provide some higher-level framework that uses these building blocks. I only wish we had taken this approach from the beginning but you know, live and learn.</p>
<p><strong>Footnotes</strong></p>
<p>1) You can see our Jazz web UIs built on top of this framework in the development section of <a title="Jazz.net Community Site" href="http://jazz.net/">Jazz.net</a> if you register.</p>
<p><strong>Updates</strong></p>
<p>Changed &#8220;other than writing good code&#8221; to &#8220;other than writing good <em>application</em> code&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://billhiggins.us/blog/2008/10/10/frameworks-and-building-blocks/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
