深度解讀 Facebook 的代碼質量問題

2020-12-27 程式設計師新視界

本文由程式設計師新視界原創翻譯,原文作者:Graham King,英文連結:https://www.darkcoding.net/software/facebooks-code-quality-problem/

Facebook已經在為他們一意孤行忽略代碼質量而自食其果。

Facebook有軟體質量問題。我會從三個方面來說明。之所以重要,是因為它展現的都是歷時彌堅的質量問題。至於如何展示,正如Facebook的工程師說的那樣,要規模化。最後,我還要說明一點,我沒有在Facebook工作過,也不是其競爭對手派來的,我只是一個旁觀者。

A:「iOS無法處理當今的規模」

大約一個月前,Facebook的工程師給出了一個報告:《iOS at Facebook》,之後在Reddit上引發了一場激烈的討論。

Facebook的iOS應用已超過18,000 Objective-C類,而且每一周就有429人為此作貢獻。在某種程度上,這429人是在為Facebook的iOS應用工作。不過,Facebook非但沒有吸取在ios應用上花太多人力物力的教訓,反而在報告中責怪git和xcode上那18000個類。

Reddit上來自於ChadBan的評論如此總結道:

這讓我想起了Martin Fowler的《Design Stamina Hypothesis》中關於沒有架構,系統會發生了什麼的描述。相較於那些完善的系統架構,這種殘缺的系統添加新功能更困難,所需要花費的時間也更長。至於解決方案,Facebook似乎只是選擇投入更多的開發者。我從不讓我的小團隊中的任何人認為這是時尚年輕人應該做的事情。我也從未想過以這種方式工作,雖然看上去這方法還挺適合Facebook的。

B:也許應該使用虛擬內存?

《Fast Database Restarts at Facebook》。第二個代碼質量問題來自於Facebook Research。從表面上看這是一篇蠻有趣的文章,當我看到這一處時,不由自主地繼續讀下去:

有一個重要發現是,我們可以將存儲生命周期從進程生命周期中分離開來。

這個想法類似於將數據存儲到memcached或redis中,重啟進程,讀回數據——可能你已經在這樣做了。唯一的區別是,你是將數據儲存在共享內存中,而不是在redis/ memcached中。共享內存實際上是個煙霧彈,直到文章的結論部分才承認這一點。

他們已經在重新啟動之間將數據持久化到磁碟了,但是從磁碟重新加載太慢了:「從磁碟讀取約120 GB的數據需要20-25分鐘;讀取磁碟格式的數據,並將其轉換成內存格式,需要2.5-3小時。」速度慢並不是因為磁碟,而在于格式轉換。最後他們終於意識到了這一點:「在磁碟恢復中一個很大的開銷就是將磁碟格式轉換為堆內存格式。我們計劃使用共享內存格式作為磁碟格式。」他們也寫了新的儲存/重載代碼,用一種新的格式轉換器來與共享內存合作。

如果你是Kerrisk的一個勤奮的讀者,那麼你會發現275頁(章節14.10)上的Linux共享內存是用一個tmpfs文件系統實現的。並且tmpfs就是Linux如何實現虛擬內存的,「消耗儘可能多的內存和交換空間,然後用於目前保存的文件」。

因此,如果你保存到磁碟的格式轉換程序讓你的代碼變慢了,因此不得不重寫這些代碼,並且想要「從進程生命周期中解耦存儲生命周期」,那麼你怎麼能不將你的磁碟文件寫到虛擬內存中呢?當然,他們也注意到了這一點,但已經為時已晚,因此他們不得不迅速採取行動並發布。

C:網站工作之時正是工程師度假的時候

《Fail at Scale》。Facebook承認他們有一個可靠性的問題,並且他們對此有一個專門的團隊。確定原因也很容易:

圖中的a表明發生在周六和周日的事件大大減少,儘管一周的網站流量保持在一個常量。圖中的b顯示在6個月的期限內,有且只有兩個星期,沒有事件發生:聖誕節的那一周,以及員工要為彼此之間寫同行評審的那一周。這兩個數據表明,當Facebook員工不積極更改基礎架構,忙於其他事情(周末,節假日,甚至是表現評估)時,網頁體驗的可靠性反而更高。

就是不知道定時發布會破壞app是不是軟體工程進程中的正常現象,你說呢?

結論

Facebook是相當成功的,顯然他們有一些偉大的工程師,資金也是源源不斷的,但是好像在軟體質量存在著大問題。我總結得到兩個經驗教訓:

文化問題。「黑客」和「快速前進打破常規」的文化使得開發人員很難專注於質量。質量問題。我們都知道,如果你不注重質量,那麼質量就會回過頭來咬死你。即使是做很小的變化也會變得越來越困難。Eric Evans在《Domain-Driven Design》寫道:「當複雜性失去控制,開發人員就不再能充分理解軟體來輕鬆和安全地改變或擴展它。」問題A就顯示了Facebook需要龐大的工作人員來維護敗絮其中的代碼以保持他們的勢頭。

發布將導致破壞,因為你不能充分理解關係,你做的改變會影響現有的代碼。問題C也說明了這一點。

下次當你再碰到有管理人員或客戶試圖說服你為了更快地前進,放棄質量的時候,當然你可以接受,因為這也能工作,只要你請得起429個工程師為我們的iOS app工作。

相關焦點

  • Facebook 100種語言互譯模型原始碼公開,機器翻譯再也不用英語當...
    編 |智東西 子佩智東西10月23日消息,Facebook近期開源其M2M-100原始碼,這是首個可以不依賴英語數據而可以實現100個語言對互相翻譯的機器翻譯模型(如中文-法文互譯為一個語言對)。論文主頁:https://ai.facebook.com/research/publications/beyond-english-centric-multilingual-machine-translation項目地址:https://github.com/pytorch/fairseq/tree/master/examples/m2m_100
  • Facebook 100種語言互譯模型原始碼公開!機器翻譯再也不用英語當...
    為此,Facebook在XLM-R,一種可以從單語數據中學習並以100種語言執行任務的模型上,增添了新穎的語言識別技術,用以從更多來源中挖掘更高質量的數據。如可以對自然語言處理模型進行零樣本傳輸(one-shot transfer)的開放式原始碼工具包Language-Agnostic Sentence Representations、用於訓練翻譯模型的「十億規模」 bitext數據集CCMatrix以及跨語言Web文檔對的集合CCAligned。
  • 註冊Facebook帳號以及日常養號問題
    導語:聊到帳號,大家應該都不陌生,有人問在中國facebook用不了,當然了,還有人想問facebook怎麼做推廣,這到底是咋回事?實際上ipad怎麼註冊facebook呢,下面小編就為大家說說註冊facebook帳號,趕緊來學習一下吧~!
  • 【生菜閱讀 1369】Facebook粉絲頁 - 如何獲取高質量粉絲?
    希望利用工作之餘的時間,通過公眾號為跨境電商帶來Facebook廣告投放的靈感,幫助更多優質中國品牌走向世界。年前做了一個調查,問大家最想看的內容是什麼,很多觀眾選了『如何找到高質量粉絲』。那本期就跟大家解密粉絲頁功能,粉絲的作用,和如何找到高質量粉絲。1. 什麼是專頁/粉絲團?
  • 講真,這兩個IDE插件,可以讓你寫出質量槓槓的代碼
    昨晚躺在床上看《拯救大兵瑞恩》的時候,不由得感嘆道:「史匹柏的電影質量真高,片頭真實地還原了二戰的殘酷性。」看完後,我的精神異常的亢奮,就想寫篇文章來幫助大家提高一下代碼的質量,畢竟二哥也是一個有態度的作者啊,向史匹柏學習。代碼質量的重要性就不用我來贅述了,大家都懂。
  • Facebook重寫iOS 版 Messenger:啟動速度快2倍,核心代碼減少 84%
    根據使用生產數據的內部測試得出:https://www.facebook.com/Engineering/videos/500081744266613/更小更快我們首先假設 Messenger 必須是一個簡單、輕量級的實用程序。
  • Facebook | Blueprint考試認證Get
    初級 · 100-101 Facebook 數字營銷入門資格考試 考察應試者在 Facebook、Instagram 和 Messenger 創建、管理廣告以及解讀廣告報告的基本能力 專家 · 500-101 Facebook 營銷開發者認證考試 考察應試者對營銷解決方案(Facebook Pixel 像素代碼
  • Facebook粉絲頁 - 如何獲取高質量粉絲?
    那本期就跟大家解密粉絲頁功能,粉絲的作用,和如何找到高質量粉絲。1. 什麼是專頁/粉絲團?無論做什麼生意,你肯定要問問『我的消費者是誰,在哪裡可以接觸到他們』。這裡推薦幾個真的挺用心經營的粉絲頁給大家參考(非官方,純屬個人經驗):Pinkoi: https://www.facebook.com/ilovepinkoiEN/?fref=ts
  • 千人千面--手把手教你如何設置Facebook(DPA)動態廣告
    藉助動態廣告,可以面向曾經訪問你的網站或者應用採取操作的用戶再營銷,或者使用寬泛受眾定位之前未訪問您的網站,之後當用戶訪問facebook, instagram,audience network或者messager時,廣告就會向他們展示商品目錄中的相關商品,這就是商品推薦,動態廣告可向用戶展示相關產品推薦時,吸引他們從廣告中採取操作,當針對待定目標比如連結點或者轉化量優化廣告時,facebook
  • Facebook開源算法代碼庫,輕鬆復現前沿視頻理解模型
    同時,該團隊表示,他們還將實時將他們的前沿工作添加至此代碼庫。 項目地址:https://github.com/facebookresearch/SlowFast Tutorial 地址(附 PPTT
  • 詳解深度強化學習展現TensorFlow 2.0新特性(代碼)
    讀者也可以在TensorFlow文檔中對此做深入了解:https://www.tensorflow.org/tutorials/eager/eager_basics深度強化學習一般來說,強化學習是解決順序決策問題的高級框架。RL智能體通過基於某些觀察採取行動來導航環境,並因此獲得獎勵。
  • 一篇推廣人看了都怕洩露的文章,Facebook技術流玩法
    -大家都知道facebook廣告的人群定位有一個」custom audience」,如下圖所示:我們的解決方法是在瀏覽器中運行javascript代碼,模擬用戶行為,讓瀏覽器自動的滾動,代碼如下:var i = 0;total = 1000; //滾動次數,可以自己根據情況定義function moreScroll() {if (i < total) {window.scrollTo(0, document.body.scrollHeight);
  • OR Talk NO.19 | Facebook田淵棟博士:基於蒙特卡洛樹搜索的隱動作集黑盒優化
    在實際問題中,黑盒優化適用的場景往往是函數調用開銷非常大且沒有導數信息的情形,比如說函數值是一個複雜系統運轉一天後的平均效率,或者是耗費巨資才可獲得的一個實驗結果,等等,通過降低最優解的樣本複雜度,可以極大地降低成本提高效率。 LaMCTS已被NeurIPS 2020接收。算法的原始碼目前已公布在 Github 上。
  • 懸疑電影《原始碼》深度解析-想回到過去,試著讓故事繼續
    至少不再讓你離我而去-《原始碼》繼上一次我深度解析了《恐怖遊輪》之後,很多小夥伴們的反響還不錯,於是我又加了把勁兒,再一次為大家帶來我心目中的最佳懸疑之作(我心中更像是愛情電影啦)-《原始碼》看到電影的名字,大家會不會覺得有一點點程序猿上身的感覺,還以為是講黑客攻擊或者開發軟體的故事,實則讓大家「大跌眼界」。
  • 鴻蒙OS開原始碼精要解讀之——init
    最近幾篇公眾號預計會和鴻蒙開源部分的代碼解讀有關。有很多開發者願意為鴻蒙搖旗吶喊,未來可期!說明  中科創達OpenHarmony研究組第一時間對https://codechina.csdn.net/openharmony上開源的代碼進行了詳盡的代碼研讀和學習。
  • 志倉千代丸解讀《匿名代碼》關鍵詞
    預計於2016年冬季發售的PS4/PSV平臺AVG遊戲《匿名代碼》於今日「5pb祭典2016」上公開了志倉千代丸的談話內容,他就本作的遊戲系統,關鍵詞,角色表情設計等問題上進行了解讀,下面就讓我們來看一下。
  • 《嗜血代碼》的啟發
    除了傳統的播片+夥伴現場解說對白外,嗜血代碼以極其大膽直接闖入了內心世界。黑暗+步行的表現內心世界的方式雖然不是遊戲行業第一次使用,但是就數量和質量來說,嗜血代碼把人物內心世界的展現效果提到了一個前所未有的程度。短時間來看,這種穿插內心世界的敘事方式可以說是效果震撼。但是,遊戲時間足夠長了之後,一個新的問題出現了。
  • 嘟嘟傳奇:深度解析法師技能,法師到底應該怎麼玩
    認真玩,深度聊。上一期呢,我們聊了法師的傷害型性能。本期我們接著上期,將法師的特殊技能進行一個解讀。跟傷害型技能效果簡單直接可見不同,特殊技能的發揮作用機制相對複雜,許多玩家只能了解了大概。本期我們將從GOM引擎的原始碼來為大家深度解讀這些技能。(註:GOM引擎並非與官服完全一致,我們會在文中將我們已經發現的不同之處指出來)。
  • 直播原始碼,靠黑科技來降低視頻延遲
    直播+多場景的應用,推動了直播原始碼的發展,直播成為數位化轉型和商家營銷的必要手段。以5G問世為首的網絡環境更改,更是考驗各個場景中直播原始碼的清晰度和延遲,針對直播原始碼深度優化的直播延遲可控協議,成為滿足各個場景應用的黑科技。
  • 直播回顧|諶洪果深度解讀卡夫卡《變形記》
    諶老師昨晚在CCtalk第四次直播,同時也是深度解讀系列的最後一次,帶領大家進入卡夫卡的迷宮,以卡夫卡的方式講述卡夫卡。