按例先貼演講視頻:html
Jason Fried 現任 Facebook 的產品工程師,在幫助公司實現這一目標方面發揮了重要做用,他在演講中討論了關於如何解決 Python 版本遷移的一些想法。微信
Fried 在 2011 年進入 Facebook 工做,很快,他就發現須要自學 Python,由於在 Facebook,Python 代碼更容易經過代碼評審。後來,他發現本身成爲推進 Facebook 採用 Python 3 的主要動力。他表示從未特意進行過計劃,只是 Python 用得多了,天然而然產生的結果。架構
(Jason Fried)框架
Jason Fried 最初因在 Python 內部社區中很是活躍而展露頭角,他常常是第一個站出來回答問題的人。隨後,他在 Facebook 做爲 Python 的支持者而漸漸成名(或者說」臭名昭著「),由於當他看到 Python 代碼中出現問題時,他會未經許可就直接上手修改。這在 Facebook 行之有效,由於這裏並無真正意義上的自上而下的控制機制,每一個人都有權利對一個代碼變動作出修改,就像你有權利作出代碼變動同樣。隨着時間推移,他在 Facebook 的內部 Python 社區內創建起了威信,這對他往後在 Facebook 順利主導 Python 版本遷移起到了很大的推進做用。異步
這是 Fried 演講中提到的關於 Python 3 在 Facebook 從無人問津到占主導地位的完整時間線,能夠看到,這個過程花了將近 5 年的時間,實屬不易。async
Python 3 在 Facebook 的落地過程很是艱難,一開始遭到內部的否認,甚至讓 Fried 一度認爲它不可能出如今 Facebook,直到目前超過 55% 的採用率,整個過程很是坎坷。編程語言
他說,要在「Facebook 規模」上改變 Python 版本這類東西須要花費至關多的時間,並須要使用不少「外交「手段。他講述了他和幾個工程師是如何利用空閒時間,在沒有任何權力的狀況下讓 Python 3 成爲 Facebook 主要版本的。異步編程
2013 年,Facebook 打算開始初步支持 Python 3,由於他們須要向構建系統中添加 Python 3 支持。但由於 Facebook 庫不支持 Python 3,因此沒法向構建系統添加 Python3。而若是構建系統不支持 Python 3,Facebook 庫就不可能支持 Python 3。這就像《第二十二條軍規》裏描述的矛盾軍規同樣,Python 3 雖然「可用」,但在 Facebook 環境中得不到任何支持。工具
另外,在 2013 年,Facebook 內部對 Python 3 抱有很大的消極情緒。整體來講,他們認爲公司的編程語言將永遠停留在 Python 2.7 版本。還有人建議徹底換成另外一種語言。Fried 也曾表示(在內部社區中)Python 3 永遠不會出如今 Facebook。只有一我的向他提出質疑,並建議他作些事情來改變這種狀況,雖然當時他忽略了這個建議,但這個想法卻留在了他的腦海裏。
2013 年,事情出現了起色。當年一月,當時 Facebook 正在使用的「linter」工具須要從 future 導入 print_function、division、absolute_imports 和 unicode_literals,以延長 Python 2 代碼庫的使用壽命。他們在任何 linter 提示的地方導入這些包,這樣能夠更容易將模塊轉爲 Python 3。
用於序列化和遠程過程調用的 Apache Thrift 框架在 Facebook「無處不在」。因爲它僅支持 Python 2,因此成爲最大的障礙。可是,由 Facebook Thrift 團隊發起的一個有關 Thrift 新特性的問卷調查顯示,開發者廣泛但願可以添加 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 團隊發佈了一個路線圖,其中就有對 Python 3 和 Tulip 的支持。
Thrift 團隊在 2014 年初推出了這兩項新特性,但此後六個月並無什麼動靜。用戶並無對此做出反應,實際上他們不關心,甚至根本不知道已經發生了這些變動。Fried 還順便引用了中國蓋了房子卻沒人住的例子來講明這種狀況,真是讓人啼笑皆非。
2014 年 8 月,他開始重寫一個服務,並計劃使用 gevent 和 Python 2,但他後來才意識到,若是這麼作的話,在完成這個項目時它就過期了。爲了有所改變,須要有人成爲第一個作出改變的人。要在 Facebook 推進使用 Python 3,那我的非 Fried 莫屬。
因而他使用 Python 3 開始他的項目,可想而知,他面對的是一個」一塌糊塗「的局面。當時 Facebook 沒有人用 Python 3,構建系統不支持他的代碼,並且全部第三方包僅適用於 Python 2。在他修復了全部問題,讓代碼經過編譯後,又在運行時出了問題。
爲了讓代碼可以正常運行,他必須修復全部問題。他從新構建了數百個第三方包,這樣它們就能夠同時支持兩個版本的 Python,並且他必須讓全部內部庫能夠兼容 Python 2 和 Python 3。可是,天天都有人會將 Python 2 變動提交到他的依賴項中。他須要不停地修復問題,並對此感到厭倦。一種解決方案是在組織內部強制進行 Python 3 合規,但這在 Facebook 根本不可能。可是,若是你表現得好像有某種權力時,人們會漸漸相信你真的有這種權力。
他動用了不少關係把 Pyflakes(一個 lint 工具)添加到構建過程當中。他可以證實添加它是有道理的,由於雖然已經有了 PEP 8,但 Pyflakes 能夠解決其餘額外的代碼質量問題。此外,Pyflakes 幾乎沒有誤報,因此它不會惹火開發人員。他作了一些設置,讓 Pyflakes 可以掃描全部須要審查的代碼,先是 Python 2,而後是 Python 3。這有助於將 Python 3 兼容性擴展至全部開發人員,而不只僅是他本身,這讓他的項目取得了進展。
在剛開始,他必須花費大量的時間向人們解釋「linter 是沒有錯的」,而且讓代碼可以在 Python 3 上運行是有價值的。若是開發人員開始以爲遷移到 Python 3 是件困難的事,他們就會回到「讓咱們永遠留在 Python 2」的心態。他要儘可能保證開發人員可以順利在 Python 3 上運行代碼。
雖然克服了一些困難,但在 Facebook 擴大 Python 3 地盤的進展甚微或毫無進展。他加入了爲 Facebook 新員工進行 Python 編程培訓的團隊。他但願兼容代碼僅用於遺留項目,而新項目應該用 Python 3 開發。
2015 年,他修改了新員工 Python 培訓內容,表示 Facebook 總有一天會轉向 Python 3,只編寫 Python 2 代碼是沒有意義的,由於將來得重寫。他教導新員工,全部代碼都應該與 Facebook 基礎架構和構建系統一致,若是不是,他們應該提交錯誤或嘗試自行修復。這樣,新的員工開始在工做中使用 Python 3,這就是進步的開始。「奇怪的是,事情就這麼發生了」。
2015 年 1 月,他終於交付了他的項目。他花了大半年的時間告訴人們它有多好,爲何他們應該儘量地使用 Python 3。一年來,不少在 Facebook 致力於推行 Python 3 的盟友在公司中出了名。
其中一位盟友是Łukasz Langa,他「說服了 Instagram 轉向 Python 3」。 2016 年,Fried 和 Langa 在 Facebook 組建了一支全新的團隊,在公司內部培訓 Python,他們稱之爲「滑稽漫步團」(The Ministry of Silly Walks)。雖然只有兩我的,但畢竟是一個「Python 團隊」,因而他以前提到的「權威」開始起做用了:人們認爲他們能夠在 Facebook 作出有關 Python 的決策。
2016 年,他發現 Python 3 的採用量增加雖然緩慢,但仍是有穩步的增加。人們在會議上提到它,他還常常聽到有新項目在使用它。即便 Python 3 不是默認設置,項目也會選擇使用它,Facebook 此時對 Python 3 的見解已經發生了變化。2016 年 5 月,Fried 表示打算將構建系統切換到默認使用 Python 3,他的這一提議幾乎獲得了絕對支持。幾天以後,他完成了切換,切換以後並無帶來任何不良影響。
Fried 表示,2016 年,在 Facebook 中推進 Python 3 項目的只有十我的,其中三個是主要推進者,並且人事流動不斷,作這個項目的不少人都是兼職。
2016 年末,有一個項目團隊發表了一篇文章,其中介紹了切換到 Python 3 的結果。開發人員從 Python 2 換到 Python 3 時只需作出一些修復,運行代碼的速度就提升了 40%,並僅使用了一半的內存。這打破了 Fried 以前聽到的一個傳言:Python 3 比 Python 2 慢。早期版本的 Python 3 多是這樣,但如今確定不是,他說道。
2017 年初,Facebook 由於 Instagram 完成了 Python 3 遷移而感覺到 Python 3 遷移帶來的榮光。Python 版本升級原來並不可怕,反而帶來了可用的新功能。Facebook 開發人員如今開始使用新的靜態類型或使用 asyncio 改造舊服務。「Python 在 Facebook 又開始變得頗有趣了」。
如今的問題是,每一個人都在問何時能夠中止支持 Python 2。當 Python 2 支持庫或模塊出現迴歸時,一般會聽到開發人員詢問是否能夠直接升級到 Python 3。而幾年前,狀況是徹底相反的。「哦,世界真美好啊!」
他展現了一張 Facebook 的 Python 服務入口端點隨時間變化的圖表,從 2015 年第三季度開始,那個時候只有四個 Python 3 服務入口端點。截至 2016 年年中,當切換到默認使用 Python 3 時,Facebook 已經有 4%的服務入口端點使用了 Python 3。2018 年 3 月,這一比例超過 50%。5 月中旬,當他發表演講時,運行 Python 3 的 Facebook 服務入口端點比例已達 55%。在 Facebook,只能在 Python 2 上運行的代碼如今處於尷尬的境地,Fried 說道。
Łukasz Langa 發推文,對 Python 3 低 CPU 佔用和運行速度提高表示讚揚。
演講接近尾聲,他對演講作了概述。總的來講,他的建議包括:
你要作的是創新,作出改變,結果天然會來;
你必須經過「親力親爲讓人看到你想要的變化」來引導開發者;
你還應該尋求他人的幫助,不要單槍匹馬;
另外,培訓新員工去實現你將來的目標是很重要的。
收集須要的數據;
享受獲得的成果,用 Python 3 寫一些「很是棒的東西」。
最後,他還回答了觀衆提出的一些問題。有人問,如何在傳統、等級分明的組織中實現演講中所說的目標。Fried 認爲,實際上這可能會更容易一些,由於你不須要說服成千上萬的開發者,只須要讓管理層意識到這件事情的好處就能夠了。若是在文化保守的組織中,這也可能很難,但專一於代碼質量改進可能對此有所幫助。另外一個問題是關於總體代碼,而不是多個入口點,對於這個問題,Fried 建議看看 PyCon 2017 上的 Instagram 主題演講(見文章開頭)。
整個演講讓人受益不淺,包括 Fried 強調的倡導者和領導者,以及堅持不懈的精神在一個項目中的的重要性。
原文連接:
https://lwn.net/SubscriberLink/758159/f1f631e1535ab9d6/