一個 Python Bug 干倒了估值 1.6 億美元的公司
2011 年,風險投資家、原 Netscape 創(chuàng)始人 Marc Andreesen 的一句「軟件正在吞噬世界」,警醒眾人。自此一切可編程的大門逐漸開啟。然而在百花齊放軟件驅(qū)動產(chǎn)品的背后,往往一個 Bug,極有可能瓦解所有。
近日,一位科技博主分享了一則早年間真實發(fā)生的一個 Bug 事件,因為一個“災難性”的軟件版本發(fā)布間接地導致了曾可以與 Reddit 匹敵的科技網(wǎng)站 Digg 分崩離析,最終讓這家曾經(jīng)估值高達 1.6 億美元的公司被以 50 萬美元價格收購。
作為親身經(jīng)歷者,軟件工程師 Will Larson 在 2018 年以《Digg's v4 launch: an optimism born of necessity.》一文,回顧了當初 Digg 公司的發(fā)展情況與個人參與的整個遭遇。萬萬沒想到的是,經(jīng)歷了兩年改版重寫,再到耗時一個月的尋找 Bug,最終的問題竟是與 Python 的一個函數(shù)有關(guān),然而彼時再想修復,似乎一切已為時已晚。借此,通過這篇文章也想給奮戰(zhàn)在一線的開發(fā)者避一避坑。
背景
這家名為 Digg 的公司,成立于 2004 年,是一個以科技為主的新聞站點。與當時其他新聞網(wǎng)站有所不同的是,Digg 允許用戶把自己搜集的新聞和其他互聯(lián)網(wǎng)內(nèi)容匯聚在一起進行提交,然后 Digg 通過內(nèi)部算法機制將新聞抓取到網(wǎng)站的首頁,用于展示。
來自維基百科
這樣做有一個好處就是,Digg 將文章的篩選權(quán)利交給了用戶,可以讓他們自己篩選出最受關(guān)注和有價值的文章,然后通過訂閱方式,訂閱數(shù)量高的就會自動被推薦上首頁,由此讓更多的人看到。在時下這種新穎的做法,也讓很多用戶有了參與感,Digg 的規(guī)模也逐漸擴大。
當然,所有事情也有兩面性,也所謂「樹大招風」。
Will Larson 在 2018 年發(fā)布的博文里提到:“過去一年里,Digg 過得異常艱難。我們的 CEO 在我加入的前一天離開了;高級工程師們鬼使神差地離開了公司,并拉走了他們剩在公司的朋友們,降低了公司的生產(chǎn)力;具有欺詐性的團伙規(guī)避了我們的算法,利用投****與訂閱的方式,出售我們網(wǎng)站頭版的訪問權(quán),并威脅我們要及時修改算法以防止他們的濫用;我們的開發(fā)者環(huán)境配置工具壞了,沒有人知道如何修復它們,所以我們給新員工重新分配了近期離職同事的僵尸虛擬機。”
要說一家發(fā)展前景良好的公司,為何會淪落如此,一方面,必然有其內(nèi)部的戰(zhàn)略問題,另一方面,也與外部的競爭環(huán)境有關(guān)。Will Larson 稱,受到外部的影響因素之一便是與 2011 年 Google 推出了 Panda “反垃圾網(wǎng)站”算法有關(guān)。
那時,Google Panda 的主要目的是將質(zhì)量低、含有垃圾內(nèi)容的網(wǎng)頁或網(wǎng)站排名降低,使得高質(zhì)量的內(nèi)容得到應有的合理排名。
雖然 Google Panda 算法本身是利好質(zhì)量高的網(wǎng)站,但是 Will Larson 表示,“當時 Digg 已經(jīng)被 Google Panda 算法更新破壞了。由于該搜索更新花了一個月的時間才慢慢生效,Digg 的命運就此也發(fā)生了巨大逆轉(zhuǎn):我們從第一個也是唯一一個盈利的月份開始下跌,一直跌到網(wǎng)站月流量被砍掉一半。前一個月,公司在五年的盈利道路上達到了頂峰,下一個月,公司處于自由落體狀態(tài),即將從弱勢地位進行融資。”
為了重振旗鼓,也為了改變現(xiàn)狀。Digg 決定對網(wǎng)站的 v3.5 進行重寫,將發(fā)布 Digg v4 版本。
不過時間轉(zhuǎn)瞬過去了兩年,Digg 因重重變故,導致新版本一拖再拖。然而,Digg v4 版本是該公司回歸互聯(lián)網(wǎng)巨頭競爭的戰(zhàn)場中唯一的機會,如果錯失,可能也就錯過了整個時代。后來,經(jīng)過公司內(nèi)部的商議,他們決定將沒有完全準備好的 Digg v4 緊急上線。
重寫 Digg v4 的辦公現(xiàn)場,來源 Will Larson 博客
殊不知,這一倉促的決定也注定了其倉促的收場結(jié)局。
Python 函數(shù)的默認參數(shù)的一次失敗案例
慢慢地問題開始顯現(xiàn)。
彼時的上午 10 點左右,有人問研發(fā)團隊什么時候開始切換新版本,工程師回答稱:"我們已經(jīng)開始重新配置 V3 服務器了。" 不過,由于容量太小了,該團隊決定重新映像所有現(xiàn)有的服務器,然后在新的軟件棧中重新配置。
切換工作正式開啟,不過一些奇怪的事情發(fā)生了。切換過程中,新的網(wǎng)站并沒有真正地出現(xiàn)。運營團隊匆匆忙忙地發(fā)布了一個維護頁面,整個團隊陷入了沉思。因為,他們并沒有一個回滾計劃。然后有一個工程師給出了或許是唯一可能的選擇:繼續(xù)向前切換。
他們也的確這么做了,一個小時后,當全部量切換完成,舊網(wǎng)站頁面取而代之的是 Digg v4 版本,所有人員也長舒一口氣。
不過剛高興沒多久,大家發(fā)現(xiàn)多數(shù)的頁面呈現(xiàn)無法加載的狀態(tài)。初期,該研發(fā)團隊將問題定位為 Cassandra 集群,因此他們擴大了對 memcache 的使用,作為保護 Cassandra 的一個寫通緩存。
幾個小時之后,訪客頁面沒有問題,但是已經(jīng)登錄的用戶卻仍然看到報錯的頁面,如 MyNews,該頁面類似于“個人中心”,會呈現(xiàn)用戶與每篇文章互動的記錄以及個性化的新聞頁面。無奈之下,研發(fā)團隊將登錄用戶的默認頁面改為 TopNews,這樣使得用戶登錄之后可以使用網(wǎng)站。
次日,MyNews 已經(jīng)徹底無法訪問,網(wǎng)站每隔四個小時之后就會出現(xiàn)故障。除此之外,還有幾十個小問題也在不斷出現(xiàn)。
于是,他們再次做了一個大膽的決定——從頭開始寫 MyNews 頁面。起初,該團隊以為 Cassandra 的緩存擊穿了 memcache,破壞了相關(guān)功能。后來他們用 Redis 重寫了,并實施了一個分片的 Redis 集群,并成功將原來的遷移到新開發(fā)上。
遺憾的是,研發(fā)團隊還是需要每隔四個小時就手動啟動每個進程。
簡單來看,相當于問題的根源還是沒有找到,只是用了一種麻煩的替代方案來短暫支持。沒想到的是,這個 Bug 耗費了該團隊一個月的時間來追蹤。
好在最終還是發(fā)現(xiàn)了問題的所在。Digg 的 API 服務器是一個 Python Tornado 服務,它將 API 調(diào)用到 Python 后端層,即 Bobtail(前端是 Bobcat),其中一個最經(jīng)常被訪問的端點是用來通過用戶的名字或 ID 來檢索用戶。因為它支持按名字或 ID 檢索,所以它把兩個參數(shù)的默認值都設置為空列表。
def get_user_by_ids(ids=[])
然而,Python 只在函數(shù)第一次被評估時初始化默認參數(shù),這意味著每次調(diào)用函數(shù)時都會使用同一個列表。
在這種情況下,每次調(diào)用時,用戶的 ID 和名字都被附加到默認列表中。幾個小時后,這些列表開始在每次請求中檢索數(shù)以萬計的用戶,甚至壓垮了 memcache 集群,導致了頁面崩掉。
通過一個簡單的例子可以直接看出:
def f(l=[]): l.append(1) print(l)
f()f()f()輸出[1][1, 1][1, 1, 1]
最后
事情最后的結(jié)局是,Digg 團隊修復了該漏洞,Digg v4 完全正常啟動。而距離此事過去了一周后,Digg 迎來了最后一任 CEO;一個月后,Digg 開啟第三輪裁員;一年后,Digg 公司被 Chartbeat 的母公司 Beatworks 以 50 萬美金的價格收購。
誰曾想,Digg 也是互聯(lián)網(wǎng)的寵兒,估值曾達到過 1.6 億美元,登上過《商業(yè)周刊》的封面,Google 也曾計劃以 2 億美元將它收入囊中。殊不知,正是這一次的失敗改版讓 Digg 迅速損失了人氣,以及內(nèi)部一些管理問題,讓競品迅速超越。自此,一家創(chuàng)業(yè)明星公司就此隕落。
Will Larson 在文末寫道,「Digg V4 有時會被作為災難性發(fā)布的例子,隱含的教訓是我們不應該發(fā)布它。我曾經(jīng)一度同意這個觀點,但現(xiàn)在我認為我們推出的決定是正確的。因為,我們的流量明顯下降,每個月都在損失一大筆錢。如果我們能在推出偉大的東西和糟糕的東西之間做出選擇,肯定會更傾向于推出偉大的東西,但我們卻選擇了最后一次揮棒。」
另外,他還表示,“即使是現(xiàn)在,我也不確定當初那樣一個有才干的團隊是如何進行這種愚蠢的展示的。”
歸根結(jié)底,這是程序員一次技術(shù)失敗導致的慘痛教訓。也有不少網(wǎng)友評論道,「動態(tài)類型一時爽,代碼重構(gòu)火葬場」。
參考鏈接:
https://lethain.com/digg-v4/?continueFlag=0a23bc7c424c6abc75f97cbaaa2d55ff
https://weibo.com/u/1642628345
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。