为什么下载小电影时,进度总是卡在99%?
你是小阿巴,深夜独自一人,正在下载一部《艺术与动作》的学习资料。
眼看着进度条已经到了 99%,你激动地搓着小手,心想:马上就能欣赏大师的作品了!
结果半小时过去了,进度条死死卡在 99%。
你怀疑是网络问题,狂按路由器重启键,发现网页秒开、网速飞快;也试过重新下载,但是仍然死死卡在 99%,纹丝不动、稳如泰山。
你绝望地仰天长啸:不,为什么!
这时,你面前出现一位程序员,正是下片无数的鱼皮:愚蠢的小阿巴,想知道真相么?给我两个圆圆的东西,我就告诉你 2 个不为人知的秘密。
于是,你从裤裆中掏出 2 个圆圆的硬币 🪙,交给了他。
本文对应视频版:
一、产品经理的欺骗
鱼皮:你看到的进度条,其实是假的!
你震惊了:什么?!假的?
鱼皮:没错,很多产品经理会要求程序员制作 虚假进度条。
举个例子,假设有两个下载软件,完成时间都是 100 秒。A 软件的进度条只用 10 秒就显示了 99%,最后 1% 花了 90 秒;B 软件老老实实匀速加载,10 秒才显示了 10%,你会觉得哪个更快?
你脱口而出:当然是 A 了!
鱼皮笑道:这就对了,虽然实际速度一样,但 A 给人的感觉就是更快,也更容易让人留下来等待,这就是产品经理的诡计。
你恍然大悟:所以前面 99% 都是假象,只是为了安慰我?
鱼皮:没错,这也是利用了人的心理,相比于一片空白的等待,哪怕是个假进度条,也能让用户焦虑感大大降低。这也是我们平时开发网站的经典技巧,甚至会在进度条上加点小动画,让等待变得有趣起来。
你感叹道:可恶啊,原来我一直被套路了!
鱼皮:不过除了你看到的产品策略,背后可能还有更硬核的技术原因。
二、背后的技术原理
鱼皮:你知道迅雷这种下载工具是怎么工作的吗?
你摇了摇头。
鱼皮:它们用的是 P2P 协议,简单说就是 “人人为我,我为人人”。你下载文件时,不是从一个服务器下载,而是从成千上万个下载过这个文件的用户那里,同时下载 不同的文件小块。
下载完成后,拼接小块成为完整文件。
你有些惊讶:那岂不是很快就能下载完?为什么还会卡在 99% 呢?
鱼皮:正是因为数据来源太多太杂,如果某个用户网速超慢或者中途掉线,最后就有可能一直卡住,等待最慢的块;而且如果因为网络不稳定,导致传输过程中数据损坏了怎么办?
你:对哦,我怎么发现这种情况呢?
鱼皮:这时就需要 块校验。每个数据块都有一个独特的 “指纹”,叫做哈希值。收到每个块后、以及 全部块下载完成时(进度 99%),软件会检查每一块数据的哈希值,和原始的哈希值对比。如果某个块的哈希值对不上,软件会直接丢弃这个块,然后尝试从其他用户重新下载。
但如果这个块的来源已经离线了,或者数据本身就有问题,那你就只能死磕在 99% 了……
你恍然大悟:原来如此,最后 1% 不是在下载,而是在验证和合并文件小块!
鱼皮:没错,所以 进度条不是恒定速率的,可别小瞧这 1%!
你挠了挠头:那有什么解决办法吗?
鱼皮:当然有了,优秀的产品会给用户明确的反馈,比如显示 “正在校验文件”,让用户知道程序没有卡死,只是在认真干活。这样用户心里有数,就不会那么焦虑了。
你若有所思,然后抄起桌上的键盘一把朝鱼皮的脸上砸去:我 ** 问的是这个么?!
结果你发现,刚刚的一切竟然都只是你的幻觉。
唉,下次看到进度条 99% 别着急,早点休息别熬夜,保护好自己的身体才是正事哦~