philweber.com


Confessions of an accidental instructional designer

Inductive User Interface?

Speaking of user experience (see below), what do you think of this article on Microsoft's "inductive" user interface guidelines? Essentially, it argues that a good UI helps the user answer two fundamental questions when looking at a screen: "What am I supposed to do now?" and, "Where do I go from here to accomplish my next task?" The UI helps answer these questions by focusing each screen on a single task, and by providing clear links in consistent locations to secondary tasks.

I've tried to apply these guidelines in the design of my current project (a browser-based content management system), but I wonder if the principles apply primarily to infrequently-used apps? Will frequent/experienced users become annoyed at the "one screen per task" hand-holding approach of the inductive user interface? Joel Spolsky makes an interesting point about the difference between learnability and usability. I'm having a difficult time finding the right balance between the two.


User Experience Tips from Amazon.com

Amazon.com rocks! OK, I'll admit that it's a little weird that a single site sells books, CDs, electronics, power tools and clothing. But, its product catalog notwithstanding, if I were creating an e-commerce site, I would imitate as much about Amazon.com as I thought I could get away with. I love its personalization features, and it simply makes online shopping a breeze. GoodExperience.com features an interview with Maryam Mohit, Amazon.com's V.P. of Site Development, with responsibility for the online customer experience. Want your e-commerce site to rock? Check it out.


A Tale of Tabbed Pages

The Design: In my ASP.NET content management system, I wanted to use a tab control to allow an author to edit individual pages of an article. I also decided to use Active­Up's HtmlTextBox control to enable rich-text editing: it's a full-featured control at a very reasonable price.

The Problem: I quickly discovered, however, that changes to the text box weren't being saved when I switched to a different tab. After another marathon session of cursing and semi-random code-tweaking (I tried changing viewstate settings, attaching code to various page and control events, etc.), I finally concluded that the postback triggered by a change of tabs was circumventing the text box's onblur event, which is where it persists its contents. (I should mention that in my desperation, I took advantage of ActiveUp's live chat tech support feature. Pierre, the control's author, was extremely cordial and helpful. Since he's in Belgium and I tend to work in the middle of the night, the arrangement proved to be convenient for both of us!)

The Solution: Now that I understood the source of the problem, the question was: How do I force the text box to persist its data before a postback? I tried a few things, and eventually found a solution by Googling for "intercept __doPostBack": The trick was to create my own function that does whatever I need to do before a postback, and then create a function pointer that redirects the default __doPostBack function to my custom function (JavaScript is awesome, by the way). Problem solved!

Footnote: Another problem I had with the HtmlTextBox was that I couldn't get a second control on the page to work correctly. Pierre assured me that this is supported, so I took a closer look at my code. Turns out that the ID I was assigning to the second control contained a space (I create the controls dynamically based on an XML form definition -- that's a subject for another article -- and I was assigning an ID equal to the name of the data field). Replacing the space with an underscore solved that problem.


In Touch with My (Case-)Sensitive Side

OK, here's a nugget that could have saved me several hours: XML is case-sensitive!

I'm working on a content management system which saves content objects as XML in a SQL Server database. A typical content object might look something like this:

    <?xml version="1.0"?>
<Content>
<Items>
<Item Name="Title">Document Title</Item>
<Item Name="Author">Phil Weber</Item>
<Item Name="Publication">Visual Studio Magazine</Item>
<Item Name="Issue">December, 2002</Item>
<Item Name="Body">Document Body</Item>
...etc.
</Items>
</Content>

So, I wrote some code (in VB.NET, which is not case-sensitive) to extract individual content elements, and it wouldn't work -- kept returning empty strings! I spent hours poring over the code, tweaking the XML, banging my head against my desk... Turns out I was looking for an Item whose Name attribute was equal to title instead of Title. GRRRR!

Go ahead and laugh, but if you ever make a similar mistake, you'll thank me!


Welcome

Welcome to philweber.net! I currently work as a software developer for FTPOnline. For most of the past year, I've been developing applications in ASP.NET; I decided to start this weblog to share my ever-growing collection of tips, techniques and stupid mistakes. I've learned this stuff the hard way; hopefully you won't have to!