寫死在淘寶App里的鍋
3 月 25 日凌晨,淘寶 iOS 客戶端爆出了一個(gè)大 bug,用戶啟動(dòng) App 后會(huì)出現(xiàn)一個(gè)強(qiáng)制彈窗。
?
?
彈窗內(nèi)容提示當(dāng)前使用的是內(nèi)測版,3 月 28 號(hào)后將無法繼續(xù)使用。
?
?
注意,彈窗文案特意提到了「當(dāng)?shù)貢r(shí)間」。
?
也就是說,你把手機(jī)時(shí)間調(diào)成 28 號(hào)再進(jìn)去,App 就會(huì)閃退,很多人已經(jīng)驗(yàn)證過了。
?
顯然,這是淘寶 App 團(tuán)隊(duì)犯了個(gè)錯(cuò)。
?
?
阿里人對(duì)「325」本來就很在意,這回估計(jì)更印象深刻了。
?
?
網(wǎng)上很多吃瓜群眾開玩笑說,原來用了這么久的淘寶竟然是內(nèi)測版。
?
還有人說,內(nèi)測完畢了,買的東西是不是可以退錢了。
?
圈內(nèi)人開玩笑的方式就更扎心直白了。
?
技術(shù)圈的人說,找產(chǎn)品經(jīng)理。
?
產(chǎn)品圈的人說,找測試。
?
測試說,我啥也不知道。
?
因?yàn)楹闷?,估?jì)平時(shí)不怎么上淘寶買東西的人也會(huì)打開淘寶 App 體驗(yàn)一下這個(gè) bug,也算為 DAU 做貢獻(xiàn)了。
?
當(dāng)天上午 9 點(diǎn) 11 分,淘寶官方在微博上發(fā)表了一個(gè)聲明來回應(yīng)這次事故。
?
說實(shí)話,太沒誠意了。
?
這個(gè)時(shí)間也是巧,難道是故意選的嗎,哈哈!
?
?
?
這一哆嗦,傷害用戶體驗(yàn)不說,也反映出了淘寶 App 團(tuán)隊(duì)的工作流程上的失誤。
?
據(jù)說在內(nèi)部被定義為 P1 級(jí)別的事故。
?
?
P 對(duì)應(yīng)優(yōu)先級(jí),一般 P0 級(jí)別是最高,其次就是 P1 了,然后是 P2、P3 等。
?
很多公司都在用這套方法衡量問題緊急和重要度。
?
問題出現(xiàn)后,淘寶團(tuán)隊(duì)很快做出了調(diào)整,現(xiàn)在打開問題版本的淘寶 App 還是能看到那個(gè)彈窗,只不過是閃一下就關(guān)閉了。
?
?
而更新到最新版后,這個(gè)問題就解決了。
?
?
在 App Store 里看到更新提醒時(shí)(3 月 26 日),顯示的時(shí)間是「2 天前」。
?
昨天出的問題在前天就已經(jīng)提交了新版本?
?
?
莫非是內(nèi)部早就知道?
?
還是說有時(shí)差?
?
?
咱也不懂,也不敢說。
?
這個(gè) bug 到底是什么原因造成的呢?
?
我是 2011 年開始做 Android 和 iOS 開發(fā)的,做過的 App 也有十來款。
?
?
其實(shí)看到這個(gè)彈窗,立馬讓我想起了以前做技術(shù)時(shí)踩過的坑。
?
這就是一個(gè)把邏輯寫死在 App 原生代碼里產(chǎn)生的鍋。
?
?
自己挖的坑,誰也怪不了!
?
原生 App 和 H5 不同,代碼一旦打包就固定在那了,提交到 App Store 后是不能改的,除非再提交新版本覆蓋老版本。
?
而 H5 和現(xiàn)在的一些混合開發(fā)技術(shù),能在服務(wù)器更新代碼后同步到前端,這樣在不用發(fā)布新客戶端版本的情況下也能實(shí)現(xiàn)更新。
?
通常把這種方法叫做 Hot Patch(熱補(bǔ)丁或者熱更新)。
?
?
比如微信 App 就是一個(gè)原生開發(fā)產(chǎn)物,而里面的公眾號(hào)文章卻是用 H5 實(shí)現(xiàn)的。
?
這也就是為什么沒有更新微信版本時(shí),能看到公眾號(hào)的最新改變。
?
此外,產(chǎn)品運(yùn)行的環(huán)境通常分測試環(huán)境和生產(chǎn)環(huán)境,有的還會(huì)有一個(gè)預(yù)發(fā)布環(huán)境。
?
測試環(huán)境就是和線上真實(shí)數(shù)據(jù)區(qū)分開的一套獨(dú)立的服務(wù)器(A),供開發(fā)調(diào)試和測試使用。
?
對(duì)應(yīng)的 App 版本是測試版(不對(duì)外)。
?
生產(chǎn)環(huán)境就是我們使用到的正式版本對(duì)應(yīng)的線上真實(shí)數(shù)據(jù)服務(wù)器(B)。
?
對(duì)應(yīng)的 App 版本是正式版(對(duì)外公開)。
?
開發(fā)完畢并經(jīng)過嚴(yán)格測試后,工程師會(huì)將測試版 App 所對(duì)接的服務(wù)器從 A 修改為 B,然后打包成正式版。
?
也就是即將上線的版本。
?
這個(gè)過程可以理解為 App 有一個(gè)對(duì)外的插頭,原本插在測試服務(wù)器 A 上,現(xiàn)在拔下來插到了正式的生產(chǎn)服務(wù)器 B 上。
?
?
在正式提交 App Store 之前,一般會(huì)先開啟內(nèi)部測試,也就是讓公司內(nèi)部人員或者測試用戶提前安裝新版本體驗(yàn)。
?
如果發(fā)現(xiàn)問題,就及時(shí)修正。
?
如果沒有問題,則會(huì)正常提交到 App Store 進(jìn)行審核。
?
一旦提交成功且發(fā)布,外部用戶就會(huì)收到更新升級(jí)提醒。用戶更新后,就會(huì)把最新版的代碼安裝在自己的手機(jī)上。
?
這次淘寶出的這個(gè)問題之所以無法在老版本里根治,就是因?yàn)榇a寫死在了 App 原生代碼中。
?
?
另外,這個(gè)問題的觸發(fā)就像一個(gè)倒計(jì)時(shí)的炸dan。
?
?
每次重新進(jìn)入 App 時(shí),代碼會(huì)自動(dòng)執(zhí)行一個(gè)判斷邏輯,如果當(dāng)前系統(tǒng)時(shí)間和預(yù)設(shè)的時(shí)間正好吻合或者大于預(yù)設(shè)時(shí)間,就觸發(fā)一個(gè)操作。
?
顯然,在 28 號(hào)內(nèi)測到期的前三天(25 號(hào)),這個(gè)邏輯被執(zhí)行,操作被觸發(fā)。
?
從 25 號(hào)凌晨開始,只要用戶重新進(jìn)入淘寶 App ,就會(huì)提示這個(gè)彈窗。
?
?
如果是在內(nèi)部,這很正常。
?
?
坑就在于發(fā)布新版本時(shí),把原本的內(nèi)測版 App 當(dāng)成正式版提交到 App Store 去了。
?
?
更坑的是,這么大的潛在風(fēng)險(xiǎn)邏輯,竟然還用代碼寫死在原生 App 里的方式實(shí)現(xiàn)。
?
輕前端、重后端、關(guān)鍵邏輯通過后端靈活控制不好么!
?
?
也就是說,這個(gè)問題版本其實(shí)已經(jīng)早就隨著某次更新安裝到了用戶的手機(jī)里。
?
?
除了這次更新,上一個(gè)版本是在一周前,再上個(gè)版本是在 3 周前。
?
?
如果按照測試發(fā)布節(jié)奏,隱藏 bug 的版本大概率是在前一周的發(fā)布里上線的。
?
時(shí)間一到,砰!
?
還有人會(huì)問了,為什么是每次重啟 App 之后會(huì)彈窗呢?
?
?
因?yàn)槊恳粋€(gè) App 啟動(dòng)時(shí),從程序角度看就像進(jìn)入一個(gè)大迷宮一樣。
?
程序開始運(yùn)行時(shí),首先會(huì)進(jìn)第一道門,然后四通八達(dá)通向各個(gè)功能模塊和頁面。
?
而這第一道門就是在 App 啟動(dòng)那一刻通過的,很多的版本檢測代碼和系統(tǒng)設(shè)置代碼都會(huì)寫在這里。
?
過了這道門,代碼執(zhí)行完,到其他模塊就不會(huì)受到影響了。
?
?
并且,這道門只會(huì)通過一次。如果想再進(jìn)一次,就得殺掉 App 進(jìn)程再重啟一次。
?
所以,每次重啟淘寶 App,就會(huì)觸發(fā)這個(gè)彈窗邏輯。
?
如果想完全解決這個(gè)問題,只能讓用戶更新到最新版本,以此覆蓋老版本寫死的代碼。
?
?
昨天下午,淘寶官方又在微博上發(fā)了一條沒誠意的內(nèi)容。
?
?
?
認(rèn)錯(cuò)就好好認(rèn),自己的鍋?zhàn)约罕场?/p>
?
這么大的廠了,生娃還手忙腳亂,平時(shí)干啥去了!
?
?
一句「大家連接 WiFi,更新手機(jī)淘寶到最新版就好了」就完事了,還不忘宣傳下自家要上的新產(chǎn)品。
?
沒誠意。
?
?
?
寫在最后
?
這個(gè)鍋到底誰來背?
?
?
是產(chǎn)品經(jīng)理設(shè)計(jì)的么?
?
?
是工程師故意寫的么?
?
是測試人員開小差了么?
?
找到誰其實(shí)都沒意義,大到團(tuán)隊(duì)協(xié)作下的開發(fā)和發(fā)布流程,小到逐行 code review,都值得反思。
?
作為吃瓜群眾,希望看到的是淘寶官方對(duì)這次大范圍事故有誠意的說明。
?
而不是開個(gè)玩笑就過了。
?
?
產(chǎn)品無小事、用戶無小事、且行且珍惜!
?
?
··················END··················
?
你好,我是唐韌!前非著名程序員,現(xiàn)不知名產(chǎn)品人。
寫過代碼、做過產(chǎn)品、出過一本書,在創(chuàng)業(yè)公司廝殺過,也在大廠服役過,如今是一個(gè)自由職業(yè)者。
愛跑步、喜歡車、主要跟文字打交道,在這里記錄自己想表達(dá)的一切!
?
作者:唐韌?
來源:唐韌公眾號(hào)(ID:RyanTang007)?
個(gè)人微信:ryantangv
本文經(jīng)授權(quán)發(fā)布,不代表51LA立場,如若轉(zhuǎn)載請聯(lián)系原作者。