一個bug,干倒一家估值1.6億美元的公司

慕課網 發佈 2022-12-07T20:54:05.206944+00:00

本文首發自「慕課網」,想了解更多IT乾貨內容,程式設計師圈內熱聞,歡迎關注!動態類型一時爽,代碼重構火葬場。——題記你生涯中寫過的最嚴重的bug是什麼?我們日常接觸的bug,無非是頁面崩潰,服務宕機,數據丟失,一般都能儘快修復。

本文首發自「慕課網」,想了解更多IT乾貨內容,程式設計師圈內熱聞,歡迎關注!

動態類型一時爽,代碼重構火葬場。

——題記

你生涯中寫過的最嚴重的bug是什麼?

我們日常接觸的bug,無非是頁面崩潰,服務宕機,數據丟失,一般都能儘快修復。

但是曾經有這麼一家公司,因為一個bug,在長達一個月的時間內都無法修復,最終黯然退場。

這就是我今天要講的故事。一個Python代碼中的bug,直接干倒了一家估值1.6億美金的公司。

有一家名為 Digg的公司。

成立於 2004 年,做的是科技類的新聞聚合,Digg創新性的允許用戶提交自己搜集的新聞,然後根據訂閱數量去評判內容的質量,並通過內部算法將新聞抓取到網站的首頁。

這其實有點像今日頭條的思路,在2004年,這還是非常先進的。

Digg也因此收穫了一大批用戶,估值曾達到過 1.6 億美元,登上過《商業周刊》的封面,甚至Google 也曾計劃以 2 億美元將它收入囊中。

但好景不長,2011 年 Google 推出了 Panda 「反垃圾網站」算法,主要目的是將質量低、含有垃圾內容的網頁或網站排名降低,使得高質量的內容得到應有的合理排名。

由於沒有針對Panda算法進行優化,Digg的流量直接減半,於是他們決定對網站進行改寫,即發布 Digg v4 版本。

但由於各種原因,Digg v4 一拖再拖,耗費了兩年還沒完成,公司已經拖不起了,經過內部的商議,他們決定將沒有完全準備好的 Digg v4 緊急上線。

但他們沒有意識到,這個決定將直接葬送Digg的未來。

由於現有伺服器的容量太小,該團隊決定重新映像所有現有的伺服器,然後在新的軟體棧中重新配置。

但開始切換之後,新的網站並沒有真正地出現,只好匆匆忙忙地發布了一個維護頁面,一個小時後,V4版本的切換才完成,但大家發現多數的頁面呈現無法加載的狀態,訪客頁面沒有問題,但是已經登錄的用戶卻仍然看到報錯的頁面,網站每隔四個小時之後就會出現故障。除此之外,還有幾十個小問題也在不斷出現。

由於研發團隊一直找不到該Bug,這也導致了在長達一個月的時間內,用戶是無法訪問Digg的。

直到一個月後他們才發現,Digg 的 API 伺服器是一個 Python Tornado 服務,它將 API 調用到 Python 後端層,即 Bobtail(前端是 Bobcat),其中一個最經常被訪問的端點是用來通過用戶的名字或 ID 來檢索用戶。因為它支持按名字或 ID 檢索,所以它把兩個參數的默認值都設置為空列表。

def get_user_by_ids(ids=[])

然而,Python 只在函數第一次被評估時初始化默認參數,這意味著每次調用函數時都會使用同一個列表。

在這種情況下,每次調用時,用戶的 ID 和名字都被附加到默認列表中。幾個小時後,這些列表開始在每次請求中檢索數以萬計的用戶,甚至壓垮了 memcache 集群,導致了頁面崩掉。

但由於修復耗費了太久,Digg的用戶群進一步萎縮,估值下降,開啟了多輪裁員,並最終被以50萬美金的價格收購。

一家創業明星公司就此隕落。

其實,這個bug出現的根本原因是該公司的技術團隊不了解Python的特性。

可見bug不可怕,可怕的是不知道bug在哪裡,不知道如何修復。

可見多看文檔,還是有好處的。

歡迎關注「慕課網」,發現更多IT圈優質內容,分享乾貨知識,幫助你成為更好的程式設計師!

關鍵字: