Archive for August, 2009

Creating Gmail-like anchor-based navigation

Monday, August 24th, 2009

A while back I discussed JavaScript-rich web applications, with the entire client side working completely out of the browser.  Applications like Remember The Milk utilize this type of user interface to create a better experience, which is in my opinion the way web applications really should be like.

One of the issues that troubled me back then was how to overcome JavaScript single-page navigation while having to cope with traditional browser navigation.  After looking into it, I found what I was looking for; but first, I’ll elaborate on the subject:

All-in-one-page web applications

It’s really cool having a web application that does not require a refresh each time you touch something.  Most websites work in the old fashioned way – you click a link and navigate to another page.  What really happens is your action sends a request to the server to fetch another page, sometimes with specific parameters passed to it.  The server then creates that page for you, send it back, and the browser displays it.  What you as a user see  after clicking the link is a blank page, you wait for the page to load, and then you can move forward.  Even though this type of behavior is common among websites, it could be very uncomfortable for the user.  Come to think of it – none of us are used to this type of behavior with our desktop apps, are we?

Some web applications, like the Google app suite, Remember The Milk, and others utilize a different technique: when you click a link, like navigating to the Sent mailbox on Gmail, the page does not disappear and then reloads again.  What you do see is a “Loading” message at the top, and then the new mailbox just appears at its right place.  This type of user experience is what we should all hope for in heavy-duty web applications.

How does it work?

Anyone who knows JavaScript can figure out a way of doing this, but here’s the basic plot:

The page that you initially get from the server actually contains more than one page – it contains several, while only the one that is currently in focus is shown, while the other ones are hidden.  When clicking a link that should lead you to a new page, like the Sent Items box on your Gmail, the browser simply hides the current page (say, your inbox), and shows the sent items page instead.  This is done instantly, so you get the feeling that there were no reloads.

Furthermore, when the sent items page is displayed, it fetches all of the sent items data from the server, and simply dumps them into the empty page it already has.  This way, you enjoy the best of both worlds – you get a smooth user experience, while the actual data is always updated (since it reached you directly from the server in real time).

So what’s the problem?

The problem, as in many subjects, lies in history.  We are so used to this “page-mode” way of using websites and webapps, that we’ve learned some pretty nasty habits.  One of those is using Back and Forward buttons for navigation.

In a world where all of the websites use full page loads, back and forward makes sense.  When you navigate to a new page, the browser remembers the location of the previous one and will do what it’s supposed to do when the Back button is pressed – go back to the previous page.  However, when new applications are utilizing the “all-in-one-page” approach – then we have a problem: the back and forward buttons become useless.

Imagine this: I’m using a simple all-in-one-page web application to manage my emails.  I have an inbox and sent items box.  I navigate back and forth between them using my on-screen menu links.  What happens under the hood is simple – I never actually leave the page I got in the first place.  All the browser does is hide and show different parts of it, while fetching data from the server and updating it to the respective page section.

Oh no – I clicked the Back button!  I was in my sent items page, and hoped to get back to the inbox (where I was before) but no!  I’m out of the app altogether!

The browser’s history, that should contain all of my navigation track record, never actually recorded my inner-page navigation, since I never really left the page…  This is why classical browser navigation can sometimes cause huge usability problems when using an all-in-one-page web application.

Using anchors

Many apps have found a clever way to resolve this, by using anchors.  You remember anchors – these inner-page links that are used in tables-of-content, like in Wikipedia or a FAQ page.  These links that, once you click them, send you down to different location on the same page.  Well – instead of doing that, anchors might just be the way to solve all of our problems.

If we utilize anchors as part of our app’s navigation, we get exactly what we need: we change the browser’s location, which in turn records that location into its history, without actually leaving the same page…  This allows us to do what we always did – use the Back and Forward buttons, while still remaining in the same page!

Under the hood

After researching it a bit, a few ideas came into light.  The major issue that one should face here is the fact that browsers do not really notify you when you click the back-forward buttons.  You can use the “unload” event, but that doesn’t really cut it – you want to know where you are, not where you’re leaving.

So, basically, the way that this can be accomplished, at least according to what I’ve seen, is by creating a polling mechanism – something that periodically checks the current anchor that you’re in.  All you need to do is set up some sort of a timed interval, check the anchor, and act accordingly.

What you need to do is extremely simple:

All of the links that are used to navigate inside the same page should be anchored, like this:

<a href="#inbox">Inbox</a>
<a href="#sent">Sent items</a>

Then, there should be a JavaScript checker – something that periodically checks to see where the current page anchor is at, and then call a function that shows the page section shat should be shown:

window.onload = function()
{
     setInterval("check_anchor()", 100);
}
 
var current_anchor = null;
 
function check_anchor()
{
     if (current_anchor != document.location.hash)
     {
          current_anchor = document.location.hash;
 
          if (current_anchor == "#inbox")
          {
               // Show your inbox section.
          }
 
          else if (current_anchor == "#sent")
          {
               // Show your sent items section.
          }
     }
}

And that’s all there is to it.  The interval calls a function that checks the anchor, and according to that anchor’s value it directs it to the relevant piece of code.

This is obviously very basic; it does not take care of additional parameter (like “#inbox&q=33526″) and so forth – but you get the general idea.

Really Simple History

One of the better solutions that I’ve found out there is an elegant, lightweight, and free JavaScript library called Really Simple History.  You can add it to your code, initialize it, and direct the history event to a callback function of your choosing.

It really is a magnificent library – try it out!

This, for me, closes the loop for this issue.  Hope this helps – I’m going to use it!

10 Rules for MRDs and Focal Points

Sunday, August 9th, 2009
<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/lorena-david/3241019376/"><a rel="cc:attributionURL" href=

http://www.flickr.com/photos/lorena-david/ / CC BY-NC-SA 2.0

Lately, I find myself writing MRDs for companies I work with.  It’s always a great challenge to construct a good MRDs, but these recent experiences have really been wonderful: I’ve had the rare opportunity to create the company’s very first MRD.

This, naturally, has its pros and cons.  On the up side, you get your hands into something which is pure, raw, and full of vision, instead of delving into a well-formed (or a not-so-well-formed) product with a well-thought-of (or not-so-well-thought-of) business model and a well-constructed (you get the idea) marketing strategy, and trying to make your way through all the constraints and legacy issues that involve a mature product process.

However, the risk in handling an MRD in such an immature stage usually involves the company having a clear enough vision but not a clear enough focus, which tends to make the requirement gathering process rather shaky.  There’s often a great deal of uncertainty, lack of confidence and no real clear-cut objectives.

This is not necessarily something that should receive a reprimand – it’s quite natural.  However, while the rest of the management, often the business and marketing ends, can throw ideas around the room and stare far into the horizon, there should be at least one designated driver among the lot with her feet planted deep in the ground.  This is usually the job of the product marketing person.

Obviously, there are many “how-to”s out there on how to write the best MRD – this is not a post like that; I do, however, wish to convey a few techniques for getting the other people committed and focused on the task at hand.  This, later, can be translated to a document using a template of your choosing.

  1. Get the CEO involved.  Make sure the CEO is part of the process.  This is important for two reasons: first, there are certain answers you will only get from the CEO that are crucial for laying the groundwork for the MRD; second – with the CEO in the room, the rest of the group will feel more committed to the task.
  2. Just the facts.  It is our job to get the facts straight, at any cost.  Ideas and visions are perfect for brainstorming sessions, and I’m sure each and every one of us can daydream with the rest and the best of them, but this is a luxury we can’t afford right now.  You need to put your foot down and demand straight answers, backed up by logical explanations and as many facts as you can.
  3. Start from the top.  The best place to start when constructing a good MRD, which is basically the company’s upcoming product strategy plan, is to begin with the most highly strategic aspect – business goals.  Ask questions like: when’s the next fund raising round?  How much will it be?  How long do we have with the current funding?  When would it be best to present the product?  To whom would it be best to present it to?  What kind of a business goal would that milestone aim to accomplish?  These questions and others like them will help you position your future plans in the overall business roadmap of the company.
  4. Work your way down.  After you understand the major milestones that are expected from the company, start drilling down and do your best to make the product roll-out serve these goals.  Start by creating major product milestones that will go along with the business milestones, allowing yourself an ample margin of error.  Then, map out the major features for each milestone, making sure that only the most important ones are addressed, and that they all aim to serve the business end.
  5. Don’t go too low.  Try to avoid the implementation pitfalls.  Do not start developing actual features, or try to see how different use cases affect certain aspects of the system – if you do that, you’ll never go out of the conference room.  That’s what PRDs are for.
  6. Lay out an architectural plan.  Try to get engineering to draw out the product’s architecture in the most abstract way possible, yet taking into account elements such as deployment, distribution, scale, privacy, security, databases, etc.  I find this process to be extremely helpful in discovering new directions, coming up with exciting capabilities and mega features, and finding out major issues that should be addressed at this stage.  There’s something very evocative in seeing a diagram in a vision-driven meeting.  But remember rule no. 5 – don’t delve too deep!
  7. Resources, resources, resources.  Always keep resources in mind.  Make the CEO commit to providing you and engineering with the resources you’d need.  The MRD should point out this information, sure, but the meeting should make everyone aware of how much the project would cost, in general terms, of course.  In other words – when the document comes out, the bottom line should not come as a surprise, or you’d find yourself going through the same meeting all over again, even more than once.
  8. Be constructive.  Try too look at things from different angles – try to extrapolate a single element in the system to any actor or use case you can think of.  It’s amazing how many cool ideas come out of that.
  9. Discourage destructiveness.  It is clear that MRD meetings are not easy to manage, since this is where vision and practicality meet.  Such encounters are hard on everyone, and sometimes people tend to get discouraged, especially when they’re told to stop dreaming and get real.  Try to notice defensiveness and entrenchment in people and do your best to open them up again, yet always making sure that their focus is well grounded.  Oh – and that goes for you too.
  10. Set a time limit.  Make sure that both the meeting and the creation of the MRD are set to a limited time.  This further assists in maintaining focus, driving people to action and decision, and making sure everyone is on the same page.  Remember – an MRD is a map, and a very rough one at that; but it sets the tone for everyone during the upcoming product development period.  The better limits you have – the more focused your MRD will be.  And that is a blessing, no matter what they say.

Gmail and GTD

Tuesday, August 4th, 2009

200px-Getting_Things_Done

First – sorry for the long dry spell.  A first child is quite a handful product to take care of…  Too bad there isn’t a manual that comes along with it.

Second, here’s a very helpful post by my good friend Eran Lagon regading the usage of Gmail’s advanced options in order to become more organized.  Getting Things Done is a method that is rapidly becoming a lifesaver for me and many people I know.  Eran’s post on “How to be a Gmail GTD ninja in 5 steps”  makes use of GTD methodologies en route to increasing your productivity.

I personally have implemented everything to the letter from this post; slowly but surely, my inbox is becoming as empty as outer space.