为什么下载小电影时,进度总是卡在99%?

你是小阿巴,深夜独自一人,正在下载一部《艺术与动作》的学习资料。

眼看着进度条已经到了 99%,你激动地搓着小手,心想:马上就能欣赏大师的作品了!

结果半小时过去了,进度条死死卡在 99%。

你怀疑是网络问题,狂按路由器重启键,发现网页秒开、网速飞快;也试过重新下载,但是仍然死死卡在 99%,纹丝不动、稳如泰山。

你绝望地仰天长啸:不,为什么!

这时,你面前出现一位程序员,正是下片无数的鱼皮:愚蠢的小阿巴,想知道真相么?给我两个圆圆的东西,我就告诉你 2 个不为人知的秘密。

于是,你从裤裆中掏出 2 个圆圆的硬币 🪙,交给了他。

本文对应视频版:https://bilibili.com/video/BV1aCWizAEe5

一、产品经理的欺骗

鱼皮:你看到的进度条,其实是假的!

你震惊了:什么?!假的?

鱼皮:没错,很多产品经理会要求程序员制作 虚假进度条

举个例子,假设有两个下载软件,完成时间都是 100 秒。A 软件的进度条只用 10 秒就显示了 99%,最后 1% 花了 90 秒;B 软件老老实实匀速加载,10 秒才显示了 10%,你会觉得哪个更快?

你脱口而出:当然是 A 了!

鱼皮笑道:这就对了,虽然实际速度一样,但 A 给人的感觉就是更快,也更容易让人留下来等待,这就是产品经理的诡计。

你恍然大悟:所以前面 99% 都是假象,只是为了安慰我?

鱼皮:没错,这也是利用了人的心理,相比于一片空白的等待,哪怕是个假进度条,也能让用户焦虑感大大降低。这也是我们平时开发网站的经典技巧,甚至会在进度条上加点小动画,让等待变得有趣起来。

你感叹道:可恶啊,原来我一直被套路了!

鱼皮:不过除了你看到的产品策略,背后可能还有更硬核的技术原因。

二、背后的技术原理

鱼皮:你知道迅雷这种下载工具是怎么工作的吗?

你摇了摇头。

鱼皮:它们用的是 P2P 协议 ,简单说就是 "人人为我,我为人人"。你下载文件时,不是从一个服务器下载,而是从成千上万个下载过这个文件的用户那里,同时下载 不同的文件小块。

下载完成后,拼接小块成为完整文件。

你有些惊讶:那岂不是很快就能下载完?为什么还会卡在 99% 呢?

鱼皮:正是因为数据来源太多太杂,如果某个用户网速超慢或者中途掉线,最后就有可能一直卡住,等待最慢的块;而且如果因为网络不稳定,导致传输过程中数据损坏了怎么办?

你:对哦,我怎么发现这种情况呢?

鱼皮:这时就需要 块校验 。每个数据块都有一个独特的 "指纹",叫做哈希值。收到每个块后、以及 全部块下载完成时 (进度 99%),软件会检查每一块数据的哈希值,和原始的哈希值对比。如果某个块的哈希值对不上,软件会直接丢弃这个块,然后尝试从其他用户重新下载。

但如果这个块的来源已经离线了,或者数据本身就有问题,那你就只能死磕在 99% 了......

你恍然大悟:原来如此,最后 1% 不是在下载,而是在验证和合并文件小块!

鱼皮:没错,所以 进度条不是恒定速率的 ,可别小瞧这 1%!

你挠了挠头:那有什么解决办法吗?

鱼皮:当然有了,优秀的产品会给用户明确的反馈,比如显示 "正在校验文件",让用户知道程序没有卡死,只是在认真干活。这样用户心里有数,就不会那么焦虑了。

你若有所思,然后抄起桌上的键盘一把朝鱼皮的脸上砸去:我 ** 问的是这个么?!

结果你发现,刚刚的一切竟然都只是你的幻觉。

唉,下次看到进度条 99% 别着急,早点休息别熬夜,保护好自己的身体才是正事哦~

更多编程学习资源

相关推荐
没有bug.的程序员1 天前
分布式链路追踪:微服务可观测性的核心支柱
java·分布式·微服务·架构·wpf
我是华为OD~HR~栗栗呀1 天前
华为OD-21届考研-Java面经
java·前端·c++·python·华为od·华为·面试
陈随易1 天前
不使用 Husky 和 Lint-staged,实现 Git 提交前自动格式化代码
前端·后端·程序员
凤山老林1 天前
SpringBoot 启动时执行某些操作的 8 种方式
java·开发语言·spring boot·后端
狼爷1 天前
Java 开发必看:UUIDv7 终于标准化了!这次真香🔥(基于 uuid-creator 实战)
java
北海道浪子1 天前
多模型Codex、ChatGPT、Claude、DeepSeek等顶级AI在开发中的使用
前端·后端·程序员
努力搬砖的咸鱼1 天前
Node.js 和 Java 项目怎么写 Dockerfile
java·开发语言·docker·云原生·容器·node.js
阿无,1 天前
Java设计模式之装饰者模式
java·开发语言·设计模式
盼哥PyAI实验室1 天前
序列的力量——Python 内置方法的魔法解密
java·前端·python