Hacker News new | ask | show | jobs
by simonsarris 4678 days ago
I agree with the conclusion, but have different premises.

"Time is an illusion, lunchtime doubly so." -Douglas Adams

Progress bars were invented to give users an indication of how much time remains relative to how much has elapsed. This is problematic, because:

1. Progress bars have a linear appearance mapping to a discrete value, yet they often represent progress that occurs at an erratic, non-linear pace. A progress bar telling you the minutes remaining in a video is useful. Seconds are always the same. A progress bar telling you seconds remaining until the page loads is not. HTTP/XML requests are fickle things.

2. Even if a progress bar does accurately measure the relative time of a task, the utlitity of the bar is further confounded by the fact that people tend to have a non-linear perception of time. After all, users are much more forgiving in the first 10 seconds of a wait than the last 10 seconds. If a user simply feels that a task with a progress bar is taking too long, they might simply quit the task.

3. UI researchers at Carnegie Mellon found that arbitrarily accelerating the progress bar's movement toward the end of the task alone will make it appear to complete more quickly. So to make a progress bar that feels accurate and fair, lying to your users about the total relative time remaining is the right thing to do.

Much of the utility of progress bars comes from telling the user that the page is still working and has not halted. So unless the users are in for a real wait, its probably best to stick to spinners.

4 comments

Progress bars driven by data transfer may indeed fail at showing how much time is remaining, but at least they actually tell me that things are progressing. All spinners usually tell me is that the client was at some point trying to get more data and that it has not finished. The former is generally much more useful when dealing with a very slow server.
<5k arcade games with download progress increasing the difficulty might be good for some sites.
Unfortunately, this was patented by Namco in 1995: http://www.google.com/patents/US5718632
So sad, it would have expired last year if it had been filed only 6 months earlier.
The claims in that patent are in terms of main games and auxiliary games. If your main site content is not a game, but you just use a very simple arcade game while loading, I am not sure this would apply.

Also, the claims seem to be for the situation where the progress made in the auxiliary game is then reflected in the main game, if the loading game is merely a reflection of the loading process itself and is not related to the main content, then it would seem to be fine even if the main content is a game.

I think spinners are absolutely worthless on the internet, they tell me next to nothing. I could be looking at it for another second or it may keep going indefinitely. A progress bar, no matter how bad, can tell me there is progress being made.

The spinners are more suitable for local apps like games and operating systems. If I see a spinner in a game, I know it hasn't frozen and should eventually finish loading.

A progress bar, no matter how bad, can tell me there is progress being made.

Except it can't, really, because browsers don't expose any kind of "percentage complete" information to javascript code. Partly that's because the browser doesn't always know; if the response uses chunked encoding (common for anything that's not a static file), the initial headers don't indicate the length of the response, so the browser doesn't know what percentage of the response it's got until it's got the whole thing.

Basically, from the HTTP protocol up the stack is designed in a way that makes it really hard to know how much longer it's going to be before a request is complete. It's designed that way for good reasons, but the unfortunate side effect is that progress bars that have any degree of meaning are generally not possible for non-static content.

That's why we have spinners. They provide the user with feedback that says "yes, I saw that you clicked that, and I'm doing something about it", which is crucial, but they don't depend on knowing how long it'll take to do whatever is being done. Most of the time that's fine if the request completes within 10 seconds. Any longer than that and additional feedback is probably necessary, maybe using setTimeout().

It doesn't have to be percentage, just seeing "x many bytes downloaded (out of unknown maximum)" increase is seeing progress. Seeing a spinner spin around may mean x is going up, or x is exactly where it was 30 seconds ago, but the spinner is made to always spin anyway.
That's not a progress bar though; the visual metaphor of a progress bar is a container/tank that goes from 0% 'full' to 100% 'full'.

What you described is a more general status indicator, bytes received, which I would display along with a transfer rate. That should not be shown as part of a progress bar because you don't know the percentage. However, I do agree that it's very useful information, and I always watch that kind of status indicator on FTP/SCP/torrent/copy+paste file transfers.

Unfortunately, browsers don't provide great feedback info to javascript even for that basic information about an ongoing request, if they provide any feedback at all. Usually you just get 'started' and then 'done'.

This is why progress bars shouldn't try to reflect actual processing (unless they can measure it in a way that maps close to linearly) and instead should be based on estimation. A progress bar should be a way of telling to the user how much longer you think a task will take so that their time perception doesn't slow down. Using it to indicate wait times accurately or precisely is, at best, a waste of time.

I'm currently working on a side project which is a library for driving progress bars using this principle. You give it an estimated amount of time, and your progress bar fills based on that (not linearly; my testing indicates that deceleration results in a shorter perceived time). If the estimate is way off, then it can switch to an indeterminate indicator instead of filling and stopping. To make the estimation process even easier (especially in the face of variation in user environments), it uses linear regression to adjust the estimates to be more accurate.

Good point and +1 for spinners. Anyway easier to implement most of the times.