There is an art to making good progress bars. It takes a lot more time and effort than anyone is ever willing to put into it, and as a result they are often overlooked.
There is something inherently pleasing about watching a good, well-designed progress bar load to completion. I've thought about this quite a bit before, and for some time, I've become rather obsessed with them. I would download and install a bunch of things I didn't need just to watch progress bars. I share my conclusions below.
The motion of an ideal progress bar should resemble the plot of a novel. It's not terribly interesting to watch a progress bar zip right through to the end without encountering a hint of difficulty along the way. Would you enjoy reading a novel that didn't have a plot or an antagonist? That would make for a boring novel!
The progress bar should start off confidently, ramp up some speed, but slow down around 15-30%. It doesn't mean stop - you don't ever want a progress bar to stop entirely - but it should start to visibly struggle. It should not stutter or jump around violently or go backwards or anything like that, but its progress should become unsteady. It should come in waves. These waves should build up overtime. It you got some things you need to load that you're uncertain about time-wise, the 30-80% range is the ideal time to load those things.
The climax portion is the most important part. This is where shit gets real. You should slow that sucker to a crawl (but don't you dare stop it entirely or I will find you). If you're printing out any sort of details about what's loading, this is the part where you start spitting them out rapid-fire. Make it up if you have to - write you're "Reticulating splines" for all I care - if you do it right, I won't have time to read it anyway. If you're thinking about writing to the hard drive, this is the time to do it - make some noise with it. If you don't have anything you need to write, implement a hard drive stress test algorithm and run it during the 80-95% range.
Don't you dare let me down in the last 5%. There is nothing more disappointing than a progress bar that just disappears when it reaches 99%. If you do this, I will go to your house and tear out the last page of every book you own. If you get nothing else from my rambling, at least remember this, because it should be relatively easy to implement, but it needs to be done deliberately: Pause - for just a brief moment, pause when you reach 100%. Will you promise me that you will do this the next time you implement a progress bar? Just put a Thread.Sleep(500) in there once you get to a 100%, that's all it takes - but it makes all the difference in the world. Don't make it too much shorter than 500 ms, or it will look like it just disappeared, but not too much longer, because you never want a progress bar to hang. A half-second delay to give some closure to the ordeal, that's all. Please do it.
So there you have it. I hope we can all walk away from this being slightly more attentive to these finer details of the user experience and give progress bars the attention they deserve. Thanks for reading.