Facebook如何在4年間全面轉向Python3?
策劃編輯 Natalie
作者 Jake Edge
編譯 Debra
編輯 Vincent
過去幾年,Python 3 的采用量明顯增加,但它仍有很長的路要走。采用 Python 的大型公司傾向于在其基礎架構上運行大量的 Python 2.7 代碼,F(xiàn)acebook 也不例外。在今年的 PyCon 2018 會議上,F(xiàn)acebook 產(chǎn)品工程師 Jason Fried 講述了該公司在過去四年時間里,Python 3 從幾乎無人問津到成為該公司主流 Python 版本的全過程,也展示出 Fried 作為一名工程師的堅持。
視頻地址:https://v.qq.com/x/page/r07069violt.html
Jason Fried 現(xiàn)任 Facebook 的產(chǎn)品工程師,在幫助公司實現(xiàn)這一目標方面發(fā)揮了重要作用,他在演講中討論了關于如何解決 Python 版本遷移的一些想法。
Fried 在 2011 年進入 Facebook 工作,很快,他就發(fā)現(xiàn)需要自學 Python,因為在 Facebook,Python 代碼更容易通過代碼評審。后來,他發(fā)現(xiàn)自己成為推動 Facebook 采用 Python 3 的主要動力。他表示從未特地進行過計劃,只是 Python 用得多了,自然而然產(chǎn)生的結果。
(Jason Fried)
Jason Fried 最初因在 Python 內(nèi)部社區(qū)中非常活躍而展露頭角,他經(jīng)常是***個站出來回答問題的人。隨后,他在 Facebook 作為 Python 的支持者而漸漸成名(或者說”臭名昭著“),因為當他看到 Python 代碼中出現(xiàn)問題時,他會未經(jīng)許可就直接上手修改。這在 Facebook 行之有效,因為這里并沒有真正意義上的自上而下的控制機制,每個人都有權利對一個代碼變更做出修改,就像你有權利做出代碼變更一樣。隨著時間推移,他在 Facebook 的內(nèi)部 Python 社區(qū)內(nèi)建立起了威信,這對他日后在 Facebook 順利主導 Python 版本遷移起到了很大的推動作用。
這是 Fried 演講中提到的關于 Python 3 在 Facebook 從無人問津到占主導地位的完整時間線,可以看到,這個過程花了將近 5 年的時間,實屬不易。
2013 年(基本支持→負面情緒→希望乍現(xiàn))
Python 3 永遠不可能出現(xiàn)在 Facebook
Python 3 在 Facebook 的落地過程非常艱難,一開始遭到內(nèi)部的否定,甚至讓 Fried 一度認為它不可能出現(xiàn)在 Facebook,直到目前超過 55% 的采用率,整個過程非常坎坷。
他說,要在“Facebook 規(guī)模”上改變 Python 版本這類東西需要花費相當多的時間,并需要使用很多“外交“手段。他講述了他和幾個工程師是如何利用空閑時間,在沒有任何權力的情況下讓 Python 3 成為 Facebook 主要版本的。
2013 年,F(xiàn)acebook 打算開始初步支持 Python 3,因為他們需要向構建系統(tǒng)中添加 Python 3 支持。但因為 Facebook 庫不支持 Python 3,所以無法向構建系統(tǒng)添加 Python3。而如果構建系統(tǒng)不支持 Python 3,F(xiàn)acebook 庫就不可能支持 Python 3。這就像《第二十二條軍規(guī)》里描述的矛盾軍規(guī)一樣,Python 3 雖然“可用”,但在 Facebook 環(huán)境中得不到任何支持。
另外,在 2013 年,F(xiàn)acebook 內(nèi)部對 Python 3 抱有很大的消極情緒。總體來說,他們認為公司的編程語言將永遠停留在 Python 2.7 版本。還有人建議完全換成另一種語言。Fried 也曾表示(在內(nèi)部社區(qū)中)Python 3 永遠不會出現(xiàn)在 Facebook。只有一個人向他提出質疑,并建議他做些事情來改變這種情況,雖然當時他忽略了這個建議,但這個想法卻留在了他的腦海里。
希望乍現(xiàn)
2013 年,事情出現(xiàn)了轉機。當年一月,當時 Facebook 正在使用的“linter”工具需要從 future 導入 print_function、division、absolute_imports 和 unicode_literals,以延長 Python 2 代碼庫的使用壽命。他們在任何 linter 提示的地方導入這些包,這樣可以更容易將模塊轉為 Python 3。
用于序列化和遠程過程調用的 Apache Thrift 框架在 Facebook“無處不在”。由于它僅支持 Python 2,所以成為***的障礙。但是,由 Facebook Thrift 團隊發(fā)起的一個有關 Thrift 新特性的問卷調查顯示,開發(fā)者普遍希望能夠添加 Python 3 支持。Fried 投了贊成票,但并不是跟風,他認為 Python 2 接口需要重構,因為它看起來好像 Java。
當他看到 Guido van Rossum 在舊金山的 Yelp 談論一個叫做“Tulip”(最終成為了 asyncio 模塊)的東西時,他的想法開始轉變。他一直是 Python 異步編程愛好者,但因為框架(例如 Twisted、gevent)之間的差異而變得碎片化。而 Tulip 讓異步 I/O 操作之間可以互操作。在那次演講結束之前,他與 Facebook Thrift 團隊溝通,表示 Thrift 應該直接支持 Tulip,而不是等 Twisted、gevent 和其他框架遷移到 Python 3。幾天后,Thrift 團隊發(fā)布了一個路線圖,其中就有對 Python 3 和 Tulip 的支持。
Thrift 團隊在 2014 年初推出了這兩項新特性,但此后六個月并沒有什么動靜。用戶并沒有對此作出反應,實際上他們不關心,甚至根本不知道已經(jīng)發(fā)生了這些變更。Fried 還順便引用了中國蓋了房子卻沒人住的例子來說明這種情況,真是讓人哭笑不得。
2014 年(改變文化→從頭開始→強制推行)
新項目
2014 年 8 月,他開始重寫一個服務,并計劃使用 gevent 和 Python 2,但他后來才意識到,如果這么做的話,在完成這個項目時它就過時了。為了有所改變,需要有人成為***個做出改變的人。要在 Facebook 推動使用 Python 3,那個人非 Fried 莫屬。
于是他使用 Python 3 開始他的項目,可想而知,他面對的是一個”一塌糊涂“的局面。當時 Facebook 沒有人用 Python 3,構建系統(tǒng)不支持他的代碼,而且所有第三方包僅適用于 Python 2。在他修復了所有問題,讓代碼通過編譯后,又在運行時出了問題。
為了讓代碼能夠正常運行,他必須修復所有問題。他重新構建了數(shù)百個第三方包,這樣它們就可以同時支持兩個版本的 Python,而且他必須讓所有內(nèi)部庫可以兼容 Python 2 和 Python 3。但是,每天都有人會將 Python 2 變更提交到他的依賴項中。他需要不停地修復問題,并對此感到厭倦。一種解決方案是在組織內(nèi)部強制進行 Python 3 合規(guī),但這在 Facebook 根本不可能。但是,如果你表現(xiàn)得好像有某種權力時,人們會漸漸相信你真的有這種權力。
他動用了很多關系把 Pyflakes(一個 lint 工具)添加到構建過程中。他能夠證明添加它是有道理的,因為雖然已經(jīng)有了 PEP 8,但 Pyflakes 可以解決其他額外的代碼質量問題。此外,Pyflakes 幾乎沒有誤報,所以它不會惹火開發(fā)人員。他做了一些設置,讓 Pyflakes 能夠掃描所有需要審查的代碼,先是 Python 2,然后是 Python 3。這有助于將 Python 3 兼容性擴展至所有開發(fā)人員,而不僅僅是他自己,這讓他的項目取得了進展。
在剛開始,他必須花費大量的時間向人們解釋“linter 是沒有錯的”,并且讓代碼能夠在 Python 3 上運行是有價值的。如果開發(fā)人員開始覺得遷移到 Python 3 是件困難的事,他們就會回到“讓我們永遠留在 Python 2”的心態(tài)。他要盡量保證開發(fā)人員能夠順利在 Python 3 上運行代碼。
2015 年(培訓)
培訓
雖然克服了一些困難,但在 Facebook 擴大 Python 3 地盤的進展甚微或毫無進展。他加入了為 Facebook 新員工進行 Python 編程培訓的團隊。他希望兼容代碼僅用于遺留項目,而新項目應該用 Python 3 開發(fā)。
2015 年,他修改了新員工 Python 培訓內(nèi)容,表示 Facebook 總有一天會轉向 Python 3,只編寫 Python 2 代碼是沒有意義的,因為未來得重寫。他教導新員工,所有代碼都應該與 Facebook 基礎架構和構建系統(tǒng)一致,如果不是,他們應該提交錯誤或嘗試自行修復。這樣,新的員工開始在工作中使用 Python 3,這就是進步的開始。“奇怪的是,事情就這么發(fā)生了”。
2015 年 1 月,他終于交付了他的項目。他花了大半年的時間告訴人們它有多好,為什么他們應該盡可能地使用 Python 3。一年來,很多在 Facebook 致力于推行 Python 3 的盟友在公司中出了名。
2016 年(Python 3 成為默認編程語言)
其中一位盟友是Łukasz Langa,他“說服了 Instagram 轉向 Python 3”。 2016 年,F(xiàn)ried 和 Langa 在 Facebook 組建了一支全新的團隊,在公司內(nèi)部培訓 Python,他們稱之為“滑稽漫步團”(The Ministry of Silly Walks)。雖然只有兩個人,但畢竟是一個“Python 團隊”,于是他之前提到的“權威”開始起作用了:人們認為他們可以在 Facebook 做出有關 Python 的決策。
2016 年,他發(fā)現(xiàn) Python 3 的采用量增長雖然緩慢,但還是有穩(wěn)步的增長。人們在會議上提到它,他還經(jīng)常聽到有新項目在使用它。即使 Python 3 不是默認設置,項目也會選擇使用它,F(xiàn)acebook 此時對 Python 3 的看法已經(jīng)發(fā)生了變化。2016 年 5 月,F(xiàn)ried 表示打算將構建系統(tǒng)切換到默認使用 Python 3,他的這一提議幾乎得到了絕對支持。幾天之后,他完成了切換,切換之后并沒有帶來任何不良影響。
Fried 表示,2016 年,在 Facebook 中推動 Python 3 項目的只有十個人,其中三個是主要推動者,而且人事流動不斷,做這個項目的很多人都是兼職。
2016 年底,有一個項目團隊發(fā)表了一篇文章,其中介紹了切換到 Python 3 的結果。開發(fā)人員從 Python 2 換到 Python 3 時只需做出一些修復,運行代碼的速度就提高了 40%,并僅使用了一半的內(nèi)存。這打破了 Fried 之前聽到的一個傳言:Python 3 比 Python 2 慢。早期版本的 Python 3 可能是這樣,但現(xiàn)在肯定不是,他說道。
2017 年(Instagram 遷移)
好事情發(fā)生
2017 年初,F(xiàn)acebook 因為 Instagram 完成了 Python 3 遷移而感受到 Python 3 遷移帶來的榮光。Python 版本升級原來并不可怕,反而帶來了可用的新功能。Facebook 開發(fā)人員現(xiàn)在開始使用新的靜態(tài)類型或使用 asyncio 改造舊服務。“Python 在 Facebook 又開始變得很有趣了”。
現(xiàn)在的問題是,每個人都在問什么時候可以停止支持 Python 2。當 Python 2 支持庫或模塊出現(xiàn)回歸時,通常會聽到開發(fā)人員詢問是否可以直接升級到 Python 3。而幾年前,情況是完全相反的。“哦,世界真美好啊!”
2018 年(Python 3 占比超過 55%)
他展示了一張 Facebook 的 Python 服務入口端點隨時間變化的圖表,從 2015 年第三季度開始,那個時候只有四個 Python 3 服務入口端點。截至 2016 年年中,當切換到默認使用 Python 3 時,F(xiàn)acebook 已經(jīng)有 4% 的服務入口端點使用了 Python 3。2018 年 3 月,這一比例超過 50%。5 月中旬,當他發(fā)表演講時,運行 Python 3 的 Facebook 服務入口端點比例已達 55%。在 Facebook,只能在 Python 2 上運行的代碼現(xiàn)在處于尷尬的境地,F(xiàn)ried 說道。
Łukasz Langa 發(fā)推文,對 Python 3 低 CPU 占用和運行速度提升表示贊賞。
演講接近尾聲,他對演講做了概述。總的來說,他的建議包括:
-
你要做的是創(chuàng)新,做出改變,結果自然會來;
-
你必須通過“親力親為讓人看到你想要的變化”來引導開發(fā)者;
-
你還應該尋求他人的幫助,不要單槍匹馬;
-
另外,培訓新員工去實現(xiàn)你未來的目標是很重要的。
-
收集需要的數(shù)據(jù);
-
享受得到的成果,用 Python 3 寫一些“非常棒的東西”。
***,他還回答了觀眾提出的一些問題。有人問,如何在傳統(tǒng)、等級分明的組織中實現(xiàn)演講中所說的目標。Fried 認為,實際上這可能會更容易一些,因為你不需要說服成千上萬的開發(fā)者,只需要讓管理層意識到這件事情的好處就可以了。如果在文化保守的組織中,這也可能很難,但專注于代碼質量改進可能對此有所幫助。另一個問題是關于整體代碼,而不是多個入口點,對于這個問題,F(xiàn)ried 建議看看 PyCon 2017 上的 Instagram 主題演講(見文章開頭)。
整個演講讓人受益匪淺,包括 Fried 強調的倡導者和***,以及堅持不懈的精神在一個項目中的的重要性。
原文鏈接: