Categories
程式開發

LinkedIn 是如何逐步淘汰 Python 2 的?


隨著 2020 年 1 月 1 日的到來,長達 20 年的一代傳奇 Python 2 終於落幕了,永久退出舞台。 InfoQ 曾經發表過《Python 2 宣布正式退休,Python 3 時代到來!》、《從 Python 2 到 Python 3,“遷移與否”是個大問題》、《R.I.P Python 2.x:儘管風靡一時,但現在該說再見了》等多篇文章,今天我們翻譯了 LinkedIn 的工程師 Barry Warsaw 的文章,講述了 LinkedIn 是如何從 Python 2 遷移到 Python 3 的,相信對國內大規模使用 Python 的公司有所啟迪。

Python 2 的第一個版本發布近 20 年後,在 Python 3 的第一個版本發布 11 年後,Python 開發社區已經淘汰了 Python 2.7,這是 Python 2 系列的最後一個版本。這標誌著 Python 2 所有上游支持(包括 Bug 和安全修復)的終結,並讓開發人員將他們的時間和精力完全投入到 Python 3 上。 Python 3 速度更快,提供了更多的一致性,並為開發人員帶來了許多優秀的特性(例如,asynciotype hinting)。

具體的遷移過程

在 2018 年,為了全面遷移到 Python 3 代碼庫,LinkedIn 投入了長達多個季度的工作。在歷經大約兩個季度的計劃和兩個季度的執行後,LinkedIn 在新產品甚至現有產品的新版本中逐步淘汰了 Python 2 的使用。這次遷移是由 LinkedIn 的 Python Foundation 團隊領導的,多個團隊和部門扮演著一個整體的角色,以確保遷移執行的相對順暢。這次遷移的工作總共需要遷移大約 550 個代碼倉庫(庫、應用程序和服務)。值得讚揚的是,LinkedIn 的同事理解這次遷移的必要性,並在將 LinkedIn 的基礎設施遷移至未來的過程中做出了自己的貢獻。

在 LinkedIn,Python 不僅用於為 LinkedIn 的會員提供在線體驗,還用於訪問內部系統和服務,包括部署工具、CI/CD 框架、腳本、命令行界面、數據科學工具等。除了 Java 和 JavaScript,Python 是 LinkedIn 工程師們完成任務的關鍵語言。 LinkedIn 並沒有在其產品中使用Python,也沒有將它作為一個獨立的Web 服務來使用,而是擁有數百個獨立的微服務和工具,以及數十個支持庫,這些都由獨立團隊在單獨的倉庫中所擁有。這些倉庫之間的關係可由複雜的依賴關係圖表示。

LinkedIn 的遷移故事早在正式遷移開始之前就已經開始了。隨著 Python 3 在更大的開源生態系統中變得越來越重要,LinkedIn 的大多數內部庫都被移植為“雙語”的,這意味著它們可以在Python 2 或Python 3 中使用。這一方法,長期以來一直被認為是理想的標準,因為它為這些庫的使用者提供了一個平穩的過渡期。如果開發人員小心謹慎,並且庫有一個非常清晰的模型,說明哪些數據是字節、哪些數據是文本(人類可讀的字符串,即 Unicode),那麼這也不是很難做到的事。 Python 2 融合了這兩個截然不同的概念,但 Python 3 迫使用戶理解並明確表示文本數據模型。這是加強數據一致性和避免大多數可怕的 UnicodeError 所必需的,這些 UnicodeError 可能會困擾 Python 2 代碼庫。

在 LinkedIn 漫長的遷移歷史中,這是成功移植所需的最關鍵的明確性。雙語庫意味著你不能充分利用 Python 3 的許多最吸引人的新特性。但是,只要 Python 2 仍然受支持,這種折衷就是值得的,因為雙語庫允許那些庫的用戶在方便的時候用最少的資源移植到 Python 3。另一方面,應用程序通常不需要使用雙語,它們只在一個 Python 版本中運行,因此,它們可以利用 Python 3 的所有新特性、模塊和改進。

考慮到這次遷移影響瞭如此眾多的不同團隊和數千名工程師的所有 LinkedIn 工程,這項工作是由 LinkedIn 的 Horizo​​ntal Initiative(HI)計劃監督的。 Python Foundation 團隊充當了焦點,積極與所有工程領域的開發人員合作,分析 LinkedIn 現有的代碼庫。他們確定了產品所有者,創建工作單位,回答出現的問題,審查變更,並跟踪即將到來的截止日期。 LinkedIn 有大約 550 個倉庫需要移植,因此給了自己和合作夥伴兩個季度來完成整個計劃。

LinkedIn 將工作分為兩個階段進行,連續幾個季度進行實施:

  • 第一個階段: 在 2019 年第一季度,LinkedIn 執行了詳細的依賴關係圖的繪製,確定了一些更基礎的倉庫,因此需要首先進行全面的移植,因為它們會阻塞依賴它們的所有端口。其中包括一些與 Python 3 不兼容的內部庫,以及沒有阻塞依賴關係的應用程序(命令行工具和微服務)。這是在大約 75 個倉庫中計算出來的,這在一個季度內就可以很容易完成,並為 LinkedIn 提供了許多重要的經驗、反饋和信心來啟動整個移植工作。

  • 第二個階段: 在 2019 年第二季度,LinkedIn 確定了需要移植的倉庫的其餘部分,以及由於任何原因而錯過最後期限的第一階段倉庫的任何遷移。

通過這種分階段的方法,LinkedIn 實現了目標完工日期。 LinkedIn 對構建系統進行了更改,禁用了構建 Python 2 應用程序的能力,並停止構建內部 Python 庫的 Python 2 版本。

請注意,從任何雙語庫中刪除 Python 2 支持顯然不是一個目標。然而,既然LinkedIn 已經完成了遷移,LinkedIn 的庫所有者就有機會放棄Python 2,並對他們的代碼庫進行現代化升級,利用任何適當的Python 3 特性使他們的代碼更具可讀性或更高效。

遷移後的反思

LinkedIn 完成多產品遷移的主要指標是成功構建並通過單元和集成測試。對於具有高覆蓋率測試套件的倉庫,這在實踐中效果很好。但是,LinkedIn 的一些代碼庫的覆蓋率很低。雖然通過構建和測試仍然是 LinkedIn 最好的信號,但 LinkedIn 對端口保真度的信心有時會因那些較低的測試覆蓋率而削弱。

對於其他規劃遷移或處於正在遷移過程中的組織,LinkedIn 提供以下指導原則:

  • 儘早計劃,並請組織的 Python 專家參與進來。在受影響的團隊中尋找和利用冠軍,宣傳 Python 3 的優勢。

  • 採用雙語方法來支持庫,這樣你的庫的用戶就可以按照自己的計劃移植到 Python 3。

  • 投資於測試和代碼覆蓋率:這些將是你最好的成功指標。

  • 確保你的數據模型是明確而清晰的,特別是在識別哪些數據是字節,哪些是人類可讀的文本時。

現在,LinkedIn 工程已經完全採用了 Python 3,不再需要擔心是否支持 Python 2,而且 LinkedIn 的支持負載已經降低了。 LinkedIn 現在可以依靠最新的開源庫和工具,將自己從不得不編寫雙語 Python 的束縛中解放出來。 LinkedIn 正在適時地、積極地採用類型提示和 mypy 類型檢查器,以提高 Python 代碼庫的整體質量、技術和可讀性。 LinkedIn 目前支持 Python 3.6 和 3.7,併計劃在 2020 年初支持 Python 3.8。

原文鏈接:

https://engineering.linkedin.com/blog/2020/how-we-retired-python-2-and-improved-developer-happiness