為什么(me)下載小電影時,進(jin)度總是(shi)卡在99%?
你是小阿(a)巴,深(shen)夜獨自一(yi)人,正(zheng)在下載一(yi)部《藝術(shu)與動作》的學習資料。

眼(yan)看著進度條已經到了 99%,你(ni)激動地(di)搓(cuo)著小手,心想(xiang):馬(ma)上就能欣(xin)賞大師(shi)的作品了!

結果半小時過去了(le),進度條(tiao)死死卡(ka)在 99%。
你(ni)懷疑(yi)是網(wang)絡問題,狂按路(lu)由器重啟鍵,發現網(wang)頁秒開(kai)、網(wang)速飛快;也(ye)試(shi)過重新(xin)下載(zai),但是仍然死死卡在 99%,紋(wen)絲不(bu)動(dong)、穩如泰山。
你絕望地仰天長嘯:不,為什么(me)!

這時,你面前出現一位程序員,正是下片無數的魚皮:愚蠢的小阿巴,想知道(dao)真相么?給我(wo)兩個圓圓的東西(xi),我(wo)就告訴你 2 個不為人(ren)知的秘(mi)密。
于是(shi),你從褲襠中掏出 2 個圓圓的硬幣(bi) ??,交給了他。

本文對應視頻版:
一、產品經(jing)理(li)的欺騙
魚皮:你看到(dao)的(de)進(jin)度條(tiao),其實是假的(de)!
你(ni)震(zhen)驚了:什么(me)?!假的?

魚皮:沒錯,很多產品經理會要求程序員制作 虛假進度條。
舉個例子(zi),假設(she)有兩(liang)個下載(zai)軟(ruan)件(jian),完成時間(jian)都是 100 秒(miao)。A 軟(ruan)件(jian)的進度(du)條(tiao)只用 10 秒(miao)就顯示了(le)(le) 99%,最后 1% 花了(le)(le) 90 秒(miao);B 軟(ruan)件(jian)老老實實勻(yun)速加載(zai),10 秒(miao)才顯示了(le)(le) 10%,你會覺得(de)哪個更(geng)快?

你脫口而出:當然是 A 了!
魚皮笑(xiao)道(dao):這(zhe)就對了,雖然實際速度一樣,但 A 給人的(de)感覺(jue)就是更快,也更容易讓人留下來等待(dai),這(zhe)就是產(chan)品(pin)經理的(de)詭計(ji)。
你(ni)恍然大悟:所以前(qian)面 99% 都是(shi)假象,只是(shi)為(wei)了安慰我?
魚皮:沒錯(cuo),這(zhe)也是(shi)利(li)用了(le)人的心理,相比于一(yi)片空(kong)白的等(deng)待,哪(na)怕是(shi)個(ge)假進度(du)條,也能讓用戶(hu)焦慮(lv)感(gan)大(da)(da)大(da)(da)降(jiang)低。這(zhe)也是(shi)我們平(ping)時(shi)開發(fa)網站的經典技巧(qiao),甚(shen)至(zhi)會在進度(du)條上加點小動畫,讓等(deng)待變得有趣起來。

你感嘆(tan)道:可惡啊,原來我一直被套路了!
魚(yu)皮(pi):不(bu)過(guo)除了(le)你看(kan)到的產品(pin)策略,背后可能還有更硬核的技術原(yuan)因。
二、背后的技(ji)術原(yuan)理
魚皮:你(ni)知道迅雷這種下(xia)載工具是(shi)怎么工作的嗎?
你搖了搖頭。
魚皮:它們用的是 P2P 協議,簡單說就是 “人人為我,我為人人”。你下載文件時,不是從一個服務器下載,而是從成千上萬個下載過這個文件的用戶那里,同時下載 不同的文件小塊。

下(xia)載(zai)完(wan)成后,拼接小塊(kuai)成為完(wan)整文(wen)件。

你有些驚訝:那豈不是很(hen)快就(jiu)能下載完?為什(shen)么(me)還會卡在 99% 呢?
魚皮:正是因(yin)為(wei)數據(ju)來源(yuan)太(tai)多太(tai)雜,如(ru)果某(mou)個用戶網速超慢或者(zhe)中(zhong)途掉線,最(zui)后就有可能一直卡住,等待最(zui)慢的塊;而且(qie)如(ru)果因(yin)為(wei)網絡不穩定,導(dao)致傳輸過程中(zhong)數據(ju)損壞了怎么(me)辦?

你:對哦,我怎么(me)發現這(zhe)種情況呢?
魚皮:這時就需要 塊校驗。每個數據塊都有一個獨特的 “指紋”,叫做哈希值。收到每個塊后、以及 全部塊下載完成時(進度 99%),軟件會檢查每一(yi)塊(kuai)數據的(de)哈(ha)希值(zhi)(zhi),和原始的(de)哈(ha)希值(zhi)(zhi)對比。如(ru)果某個塊(kuai)的(de)哈(ha)希值(zhi)(zhi)對不上,軟件會直接丟棄(qi)這個塊(kuai),然后嘗試(shi)從其他(ta)用戶重新下載。

但如果這個塊的來源已經離線了,或者數據本(ben)身就有問題,那你就只能死磕在(zai) 99% 了……

你恍然大悟:原來如此,最后 1% 不是在(zai)(zai)下載,而是在(zai)(zai)驗證和合并(bing)文件(jian)小塊!
魚皮:沒錯,所以 進度條不是恒定速率的,可別小瞧這 1%!
你(ni)撓了撓頭:那有什么(me)解決(jue)辦法嗎?

魚皮(pi):當(dang)然有了,優秀的產品會(hui)(hui)給(gei)用戶明確(que)的反饋,比如顯示 “正在校驗文件(jian)”,讓用戶知道程(cheng)序沒(mei)有卡死,只是在認真干活。這樣用戶心里有數,就(jiu)不會(hui)(hui)那么焦慮了。

你若有(you)所思,然(ran)后抄起桌上的鍵盤一把朝(chao)魚皮的臉上砸(za)去:我 ** 問的是這個么(me)?!

結果你發現,剛(gang)剛(gang)的一切(qie)竟然(ran)都只(zhi)是你的幻覺。
唉(ai),下次看到進度條 99% 別著急,早點(dian)休息別熬(ao)夜(ye),保護好(hao)自己(ji)的身體(ti)才(cai)是正事哦~

有沒有可能,你看到的進度條,其實是假的?!