寫死在淘寶App里的鍋

2020年04月03日 16:20 來源:唐韌 作者:唐韌

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)系原作者。

本文經(jīng)授權(quán)發(fā)布,不代表51LA立場,如若轉(zhuǎn)載請聯(lián)系原作者。

寫死在淘寶App里的鍋

來源:唐韌 作者:唐韌
2020年04月03日 16:20

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)系原作者。

本文經(jīng)授權(quán)發(fā)布,不代表51LA立場,如若轉(zhuǎn)載請聯(lián)系原作者。