拼多多技术事故复盘,程序员应该学到什么?
作者 | 范學雷
編輯 | 李佳
每一次事故都是在倒逼技術團隊成長,沒有誰能保證不寫 Bug 不出錯,我們要做的,是在事故發生以后,找到問題的根源,及時填坑止損。
2019 年 1 月 20 日凌晨,有網友稱拼多多出現重大 Bug,100 元無門檻券用戶可以隨便領取并進行消費。大家爭相傳播,大半夜的都起來領券,有的用戶甚至領取了上千張。機靈的用戶,以最快的速度花掉了優惠券,比如給中國移動充值。
拼多多凌晨回應,“有黑灰產團伙通過一個過期的優惠券漏洞盜取數千萬元平臺優惠券,進行不正當牟利。針對此行為,平臺已第一時間修復漏洞,并正對涉事訂單進行溯源追蹤。同時我們已向公安機關報案,并將積極配合相關部門對涉事黑灰產團伙予以打擊。”
隨后,拼多多發言人表示,實際最終資產損失或低于千萬人民幣。
這個事情發生后,在技術圈炸開了鍋,可能是源于傳言的“一個 bug 可能給公司帶來 200 億的損失”。
作為程序員,我更關心的是,這個 bug 到底是怎么來的呢?根據市場傳言,我們大致可以得到如下的一些線索。這些線索的真實性還有待考證,或許并不是這次事件的真實情況,但是這也不妨礙我們通過這些線索,來探討一下這起事故給我們帶來的啟示。
-
好多人羊毛弄了幾十萬;
-
這張券是測試券;
-
系統在凌晨自動上線測試券;
-
運維發現系統爆了,超過了閾值;
-
當事人手動下線了測試券;
-
手動下線的測試券,早上八點又上線了。
這些端倪看起來可以合理地解釋一個重大 bug 的部署和運維。從這些端倪中,除了優惠券本身的設計問題,我們也可以看到運維的混亂。測試券怎么能夠上線呢?系統爆表了,為什么沒有跟進風險防范措施?手動下線了的測試券,怎么又能夠重新上線了?為什么上線、下線優惠券操作這么草率?如果一個軟件系統是這樣的運維水平,出問題是遲早的事情。如果還沒出問題,只能說運氣太好。
優惠券的設計問題
第一個吸引我們的問題是,“好多人羊毛弄了幾十萬”。這就意味著,一個人可以領用上千張優惠券。好多人這么操作,說明無門檻券的領用,技術門檻極低。
一般的優惠券,類似于折扣券,都有使用門檻,比如買 100 優惠 20 元。無門檻券,顧名思義,就是沒有使用門檻的優惠券,100 元的優惠券可以買 100 元的商品,幾乎等同于現金。由于無門檻券類似于現金,它和一般的優惠券就有重大區別。
先不去管羊毛黨,拼多多號稱有 3 億用戶,如果每個用戶都合法合理地領用 100 元無門檻券,這就需要 300 億人民幣。賬戶注冊,幾乎是零門檻,如果微信 10 億用戶合法合理地注冊、領用無門檻券,給手機充個值,這就需要 1000 億人民幣。
截至昨日,拼多多市值接近 230 億美元,折合人民幣也就 1600 億的樣子。100 元無門檻券隨便領,這看起來像是要拆了公司給大家發獎金的姿態。這肯定不是無門檻券的預期。
隨便領的無門檻券,怎么看都不是一個合格的商業設計。最起碼,定個數量上限吧,大家搶完就沒了,幾百萬送就送了。送幾百個億,不符合正常的商業邏輯。
一般而言,即便是普通優惠券的領取都有很多附加的條件。比如說,一個賬戶只能領取一次,或者只有新賬戶可以領取。而賬戶的認證,也要有很多的安全措施,比如綁定手機號,綁定設備,使用安全連接等措施。賬戶的認證和管理,是一個服務網站最最基本的功夫。如果一個人可以領用上千張優惠券,那么賬戶管理的這個基本功,不能算及格。賬戶的管理水平如果不及格,這個網站的風險比我們想象得還要糟糕。
這么糟糕的賬戶管理,這么糟糕的商業設計,太出乎人的意料,不符合正常的邏輯。所以,我比較認同這只是一個測試券,不應該出現在正常運營的系統中。而如果真是測試券的問題,暴漏的就是軟件研發和運維的混亂。
混亂的研發和運維
一個測試券,居然自動上線;手動下線后,又自動上線。這樣的產品發布流程匪夷所思。一項功能的出爐,要經過設計、實現、評審、測試、審批,才能夠走到正式的系統中。這些環節,只要有一個環節發揮了作用,測試券都不可能上線,更不可能自動上線。
上線后,還要有持續的風險監控。如果系統超過了閾值爆掉,運維能夠第一時間獲得爆表的信息,比如大半夜的,賬戶異?;钴S或者優惠券業務火爆,也能夠及時地截斷這個風險。
由此可見,對運維人員的合理約束機制,是一個商業公司必須謹慎對待的問題。哪能隨便一個測試券就可以直接跑到正式的系統中呢?軟件的運維,是一個需要特別關注風險管控的環節,尤其是軟件的質量沒有跟上的時候。軟件的運維事故,有時候甚至會顛覆一個行業。
2011 年,一個數字證書簽發機構,給谷歌簽發了多張數字證書。而谷歌從來沒有向這個機構申請過數字證書。也就是說,數字證書的持有者并不是谷歌。這個持有者可以冒充谷歌的網站,盜取用戶登錄信息,包括用戶名和密碼。這意味著要么這個公司技術水準有問題(黑客攻擊),要么這個公司的運維能力有問題(亂發證書)。這個安全問題在 2011 年 8 月份被曝光,幾乎所有的軟件巨頭立即宣布封殺這家機構的數字證書。9 月份,這家有著很大市場影響力的機構就宣布破產了。
然而,這不是最終結局,數字證書簽發行業的厄運才剛剛開始。人們好像忽然認識到,信息安全不能依賴數字證書機構,一個 4000 億美元市值公司的安全,不能依賴一個 40 億美元市值公司的運營能力。于是,各種各樣的新技術在隨后幾年爭相出現。這些新技術如果廣泛使用,將徹底抹掉整個數字證書簽發行業。這樣的日子,離我們已經不遠了?,F在,數字證書簽發機構的日子過得都比較慘淡,賣的賣,散的散。
頻頻發生安全事故的順風車,從長期看,也具有類似的性質。相比之下,如果一次事故損失的只有錢,影響可能還算是可以勉強承受的。希望損失的只有錢,但是我對這個期望并不樂觀。
追本溯源,運維如此混亂,一般和軟件的質量脫不了干系。 一個正經的軟件系統,該怎么出品、該怎么部署、該怎么運轉、該怎么授權、危機該怎么處理,這些問題都要有設計、有實現、有預案。當事人設計了一個無門檻測試券,就可以在運營系統里跑,而且還可以無限領,這暴漏的是背后爛透的軟件質量,以及松散、無序的軟件研發流程。我們常說,優秀的軟件出自優秀的流程?;靵y的研發流程,很難出品高質量的產品。
我們該怎么做?
無知者無畏,安全問題之所以特殊,就在于它如果不發生,我們也許永遠不知道問題的存在,當然也不知道問題有多嚴重。每一次安全危機,都不應該被浪費。如果我們是當事人,有哪些辦法可以避免類似的事故呢?
最緊急的事情,就是趕快把賬戶安全的債給還了。要不然,經過這一次的傳播,一大堆的眼睛看好了這塊肥肉。黑客攻擊的下一波,也許已經在路上了。
接下來,要盡快考慮下面的幾件事情。
第一件要做的事情,就是規范研發流程。一流的軟件研發流程下出品的產品,再差也不會差到哪兒去。在這個研發流程里,程序員不能單槍匹馬地蠻干。需求要討論,設計要預覽,功能要審核,代碼要評審,軟件要測試,系統要試運營。人人都會犯錯誤,每一個環節,多幾雙眼睛盯著,就大幅度減少了犯錯誤的幾率。程序員也能通過研發的流程快速成長,進一步降低錯誤發生的幾率。一個好的制度,可以成就人;一個壞的制度,可以糟蹋人。
第二件要做的事情,代碼的安全要重視起來。代碼的安全,不都是指黑客入侵。這個無門檻券的領用,就是一個嚴重的安全事故。反映到代碼層面,可能就是賬戶管理不安全,商業邏輯沒有校驗,運維授權管理散漫,異常風險沒有及時預警。
第三件要做的事情,商業設計要預先推演。即使沒有黑客黑產,1000 億人民幣無門檻優惠券,也不是任何一家商業機構愿意支付的成本。這是一個幼稚園水平的錯誤。 如果商業邏輯不成立,也就意味著有缺陷的軟件需求。建立在漏洞百出的需求上的軟件,也會是漏洞百出的。
第四件要做的事情,改進產品上線的機制。設置產品上線的檢查點和流水線,任何一個檢查點失效,流水線都要中斷,產品都不能上線。這些檢查點包括產品的試運營、功能的審批、配套的監控措施等等。
第五件要做的事情,提高運維的風險防范能力。一個有著 3 億用戶,230 億美元市值,經營電子商務的公司,是黑客眼里的肥肉。尤其是用戶隱私信息和現金流,關系到企業的生死存亡。這種體量的公司,具有優秀的風險防范能力是最基本的要求,而不是錦上添花的東西。風險的主動檢測、及時預警、快速應對,這些措施都要跟得上。
如果無門檻券的商業設計經過推演,軟件功能經過討論,實現代碼經過評審,上線經過預演,事故能夠及時預警,只要其中的任何一個環節發揮了作用,這次事故都不會這么慘烈!
我理解一個公司不顧一切全速前進,以質量換速度的競爭壓力和動力。只是,當我們追求眼下速度的時候,也要考慮三尺以外的未來。要不然,這屁股后面累積的債,真會成為怎么甩都甩不掉的大尾巴。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的拼多多技术事故复盘,程序员应该学到什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在阿里干了五年,面试个小公司挂了…
- 下一篇: 记一次悲惨的 Excel 导出事件