Categories
程式開發

為什麼向 Python 3遷移需要這麼長時間?


在 2014 年的 Pycon 中,Python 的發明人 Guido van Rossum 說:“現在是進入 Python 3 的時候了!” 經過核心代碼貢獻者和開源社區的多年努力,Python 2 終於壽終正寢了。根據 pythonclock.org 的說法,2020 年 1 月 1 日是支持 Python 2 的截止日期。對於幾年前已經做出 Python3 遷移的一些公司來說,這將不是問題。但是,出於多種原因,很多公司都不會在短期內進行 Python2 遷移。

對於大量使用 Python 的公司,特別是那些近期可能不准備遷移 Python2 的公司,此更改意味著什麼?要了解正在發生的事情的整個上下文,讓我們回顧一下 Python 的歷史。

Python 簡史

開發 Python 3 的想法是實現一些重大的改變,如擺脫了 Python 的遺留問題:將所有字符串都呈現為 Unicode。正如 Python 的核心開發人員之一布雷特·坎農(Brett Cannon)寫道:

人們有時會忘記 Python 誕生的年代。

Guido 於 1989 年 12 月開始對 Python 進行編碼,並於 1991 年 2 月首次以開源形式發布。這意味著 Python 本身早於 1991 年 10 月發布的 Unicode 標準的第一版。在隨後的幾年中,Unicode 標準化後創建的語言選擇使用基於 Unicode 編碼字符串的實現。

支持任何語言的 Unicode 和文本非常重要。

Python 是一種世界語言,不僅是支持 ASCII 覆蓋的羅馬字母的語言,這就是 Python 3 在處理文本時將其默認設為“ Unicode”的原因。它保證了所有 Python 3 代碼都將支持世界上的每個人,無論編寫該代碼的開發人員是否明確為其指定 Unicode 編碼。

不幸的是,該團隊假設每個人都將立即進行大的切換,並使 Python 3 向後不兼容,並將 Python 2 設置為維護分支。但是,許多人不想切換,因為正如改進的 PEP 所說,Python 3 是“相對於 Python 2 的溫和的改進。”許多人並沒有因為這些帶來的不便而切換。當時,Python2、3 最大的區別是將 print 語句更改為 print() 函數語法,這破壞了很多 Python 2 代碼。

結果,此後很多年 Python 2 還繼續處於積極的開發中。

不過,在2019 年,Python 3 終於成為了新Python 軟件工程師(大部分)開發的默認語言版本,現在許多公司和項目都在使用Python 3 的主要功能:f- 字符串、Path、類型提示、異步,當然還包括Unicode 編碼。

緩慢的迭代過程

自從新的版本於 2008 年宣布以來,Python 3 市場份額增長一直很漫長:

為什麼向 Python 3遷移需要這麼長時間? 1

最初,有很多理由不採用 Python 3:最重要的是,它與 Python 2 並沒有向後兼容。結果導致一些 Python2 的主要庫往 Python3 遷移都猶豫不決。 2 向3 轉換的轉折點發生在大約2016 年左右的Python 3.5 發行版中,該版本具有矩陣乘法、asyncio 的引入、OrderedDict 的速度改進以及類型提示的實現,這些提示為Python3 帶來了一些類似於靜態語言的實用功能。

Python3 更高版本包含更多功能,例如 Pathlib 庫和 f- 字符串操作。通過這些更改,人們使用了許多庫(例如用於機器學習的 scikit-learn)開始了向 Python 3 的遷移。

隨著越來越多的依賴關係開始升級,一些公司也開始遷移 Python3。

從互聯網上的狀況來看,您可能以為每個人都完成了 Python3 遷移。

在 Jetbrains 進行的一項調查中,他們製作了 IntelliJ 和 PyCharm 之類的 IDE,有 75%的個人受訪者表示他們已經遷移到 Python3。一連串的博客文章都顯示了相同的內容,例如,Dropbox 於 2018 年秋季詳細說明了他們的遷移 Python3、Instagram 於 2017 年遷移 Python3、Facebook 於 2014 年開始遷移 Python3。在客戶的敦促下,Splunk 最近也這樣做了 – 往 Python3 遷移。

但是,僅僅因為 Python 2 即將到期,並不意味著公司會在一夜之間停止使用它。我們怎麼知道 Python 2 仍在大量的使用?我們可以直接檢查 Python 包庫 PyPI 的運行情況。 2016 年,PyPI 核心開發人員開始將日誌發送到 Google 的 BigQuery,以便能夠針對它們運行 SQL,這使得根據使用情況做出體系結構決策變得更加容易。

例如,如果要查看過去 30 天內通過 Python 版本下載了哪些庫,則可以在 BigQuery 中創建一個新項目(每月查詢的前 1TB 是免費的),然後運行:

SELECT
 REGEXP_EXTRACT(details.python, r"^((^.)+.(^.)+)") as python_version,
 COUNT(*) as download_count,
FROM
 TABLE_DATE_RANGE(
  (the-psf:pypi.downloads),
  DATE_ADD(CURRENT_TIMESTAMP(), -31, "day"),
  DATE_ADD(CURRENT_TIMESTAMP(), -1, "day")
 )
GROUP BY
 python_version,
ORDER BY
 download_count DESC
LIMIT 100

儘管 Python 3 一直是社區中的主導版本至少一年,但從 PyPI 下載的單個軟件包的最新數量顯示,2019 年 9 月所有軟件包下載中至少有 40%為 2.7 版本。誠然,這比年初的 60%有所下降,但是鑑於 EOL 距離只有數月之遙,所以這個數據仍然很重要。

為什麼向 Python 3遷移需要這麼長時間? 2

在每個庫的基礎上,它變得有些棘手:大多數 Flask 下載都是使用 Python 3 版本完成的,但是只有 26%的 botocore 下載(適用於 Python 的 AWS 開發工具包)正在使用 Python 3。

而且,有幾個庫需要進行遷移:Twisted 和 PyPy(常用的 JIT 編譯器)將無限期保留版本 2。

任何給定軟件的壽命終止通常並不意味著該軟件不再可用。這確實意味著它不再針對任何安全漏洞或添加任何其他錯誤修復程序進行更新。但是,不更新到 Python 3 會帶來很多風險 – 最重要的是,可能會丟失安全更新,無法利用類型提示和速度提升等新功能。

為什麼 Python3 遷移速度這麼慢?

開個玩笑,在我寫本文的時候,我的IT 系統還在Java 8 上運行(按今天的標準,這已經很古老了。但是根據2018 年的JVM 生態系統報告,Java 8 仍然是主要的開發環境。)

這就是答案:大多數大型組織,在技術新聞發布的炒作週期之外,其行動要比新聞媒體或博客想像的要慢得多。例如,大多數主要銀行仍在運行 FORTRAN 和 COBOL 的編程語言系統。

因此,儘管許多公司描述了他們的遷移策略,但更多的應用軟件將長期保留在 Python 2 上。

為什麼會這樣呢?

在所有決策中,政治發揮的作用和技術指導一樣重要

例如,為了在 Facebook 上使用 Python 3,Jason Fried 從 2014 年開始重寫 Python3 服務。一路走來,他犯了很多錯誤,更改了很多代碼,並做了很多修改以使其廣為人知人們正在做 Facebook 之類的事情,例如參加新的開發人員培訓,從而開始使用 Python 3。然後,他與ŁukaszLanga 合作,後者將 Instagram 轉換為 Python 3: 2016 年,他和 Langa 在 Facebook 上組建了一個全新的團隊,以在公司內部管理 Python3。由於他們是“ Python 團隊”,因此他先前提到的“公認權威”起作用。人們認為他們可以在 Facebook 上做出有關 Python 的決定。實際上,Instagram 的遷移項目本身耗時 10 個月。

Guido 和 Langa 現在工作的 Dropbox 花費了三年時間,而直到 Guido 幾週前退休為止,它仍在進行中。

誠然,上面這些案例都是巨大的 Python 代碼庫,但您必須懷疑:如果 Python 的高層人員從事此工作需要花費這麼長時間,那麼對於一家公司非高層做決策來說可能要花費更多的時間。

安全問題是一個很重要的考量問題

具有諷刺意味的是,您會認為不升級將是更大的風險。但是在較大的組織中,不允許升級 Python3:管理員或安全團隊向他們推送更新。在某些情況下,也不允許下載更新 PIP。如果 Python 2 是安全團隊同意的默認協議,那麼它可能需要做出巨大的努力才能說服人們將其切換到 3,尤其是在受到嚴格監管(例如醫療保健或金融)和政府的 IT 環境中。

慣性

儘管許多版本的Linux(例如RHEL)在Python 2 和Python 3 之間都包括了Python 3,但這絕不是默認值,在2 和3 之間切換時,經常發現一些問題,尤其是指向系統版本的鏈接默認使用Python2。 Python 經歷了從 2 到 3 的漫漫長路,個人和具有前瞻性的創業公司都採用了它。現在,第二大遷移將發生在大型企業從 2 開始遷移的時候。關於 Python 2,我們將看到 2020 年 40%使用率的數量進一步減少,但是變化將是遞增的。

英文原文

Why is the Migration to Python 3 Taking So Long?