天天看點

“恕我直言:Python 真的很糟糕!”

“恕我直言:Python 真的很糟糕!”

【CSDN 編者按】本文主要批評了 Python 語言在專業應用中的不足。作者通過多年的經驗,指出 Python 在大型應用中的問題,如動态和鴨子類型導緻的運作時錯誤、性能問題、記憶體管理困難等。盡管 Python 易于上手,但作者認為其不适合超過 100 行代碼的項目,并推薦使用更嚴格、類型安全的程式設計語言,如 Rust 和 Go。

原文連結:https://josvisser.substack.com/p/why-python-is-terrible

未經允許,禁止轉載!

作者 | JOS VISSER 譯者 | 明明如月

責編 | 夏萌出品 | CSDN(ID:CSDNnews)

上周,我無意中發現了一篇為初級開發人員提供了關于選擇哪種程式設計語言以擷取更佳工作機會建議的 LinkedIn 文章。文章中把 Python 排在了第一位,但我對此不敢苟同。

盡管我不願意承認,但不得不同意文章作者的一些觀點:Python 的确很受歡迎,掌握它将有助于你找到工作。然而,Python 的持續受歡迎其實是一大問題,它的持續使用将讓我們的行業倒退許多年。

基于多年大型 Python 應用程式的開發經驗,我将對其做出非常尖銳的批評。

“恕我直言:Python 真的很糟糕!”

用 Python 開發大型應用,問題不斷

使用 Python 建構大型應用就像用樂高積木建造核反應堆一樣:色彩鮮豔、上手容易,但當反應堆運作了一段時間後,輻射洩漏無處不在,無人敢觸碰,緻使人們不斷拼湊新積木以保持其運作——而正确的做法是:使用合适的建築材料重建立造。

Python 的問題主要在于,它是一種具有動态和鴨子類型(duck typing)的解釋型語言。我們無法預先知道一組語句是否總是工作,這取決于輸入的資料。我們需要全面檢查所有輸入資料,但曆史證明我們在這方面的表現不佳。更糟的是,Python 的鴨子類型會産生巧妙但可怕的代碼,這總是令人陷入困境。

多年來,在開發大型 Python 應用程式的過程中,我看到并經曆了一些可怕的事情,如果我們的應用程式是通過明智、編譯、類型安全的語言編寫的,這些事情就不會發生。

幾年前,我成功說服了組織使用 Rust 重構系統,後來事實證明這是一個非常明智的決定。

我在生産環境中多次啟動大型 Python 應用程式的新版本,卻立即遇到了由異常引發的錯誤。這些異常明确指出代碼永遠無法工作,因為它從未被執行過:不在開發人員工作站上,不在單元測試中,也不在內建測試中。

關于 Python,一些擁護者主張,這些問題并非語言本身的缺陷,而是代碼審查和測試政策的問題。然而,這種觀點是錯誤的。僅僅理論上能夠檢視和測試每一行代碼及所有可能的輸入和場景,并不意味着這在實際操作中是可行的。優秀的程式設計語言可以讓你不必審查和測試所有代碼的情況下就可以避免很多錯誤。若要對每一個 "a = b + c" 進行徹底審查和測試,我的程式将永遠無法上線。而對于使用 Python 編寫的程式,這可能實際上是一件好事。

在審查 Python 函數時,我經常想知道是否有任何調用,以及使用了何種參數。由于沒有能夠提供全局視圖的編譯器和連結器,我通常不得不對代碼庫進行全文搜尋,以尋找調用點。可惜的是,即使沒有找到結果,删除函數後程式可能仍會崩潰。你永遠無法确定程式是否會在某些特定條件下崩潰,是以最安全的做法就是保留該函數,這就導緻了備援代碼的産生。

有些人可能會辯稱,這是不良程式設計模式的問題。然而,他們再次誤解了事實。優秀的程式設計語言應確定你不能編寫結構上有缺陷的程式。在建立二進制檔案之前確定所有必要的代碼存在都是合理的,不是嗎?再者,由于 Python 缺乏動态類型檢查,以及在運作時判斷事物是否合理的能力,常常引發了這些不良程式設計模式導緻的重構問題。

“恕我直言:Python 真的很糟糕!”

Python 性能不佳,運作緩慢

Python 的性能也是一個問題。我的筆記本電腦有 10 個 CPU 核心,但 Python 應用程式僅能有效使用大約 1.2 個核心。這是怎麼回事?幸運的是,我們還可以借助 1980 年代的技術來解決這個問題!我曾參與一個使用 Python 編寫的服務項目,該服務通過 fork 工作程序來處理請求,確定所有核心都得到利用。

然而,這些工作程序很快耗盡了記憶體。為解決這一問題,我們讓每個工作程序在處理了一定數量的請求後自行終止,以便讓 Linux 為我們進行記憶體管理。雖然這本身不是 Python 的問題,但 Python 的運作方式使情況變得更糟。

fork 操作引發了一些副作用:Python 的引用計數機制阻礙了寫時複制的效果,因為即使是隻讀變量的記憶體塊也會被實際寫入以執行引用計數操作,導緻工作程序的實體記憶體占用劇增。我們解決了這個問題,方法是通過修改解釋器,使其對主程序建立并由工作程序繼承的所有變量使用一個特殊的引用計數值,并且不改變具有該特殊值的引用計數。雖然這個解決方案很巧妙,但其實是不必要的。如果要讓解釋器真正為你服務,必須進行修改,那解釋型語言的簡便性還有何價值?

Python 給我帶來了無盡的困擾,它的運作速度緩慢,顯然不适用于編寫超過大約 100 行代碼的程式。

“恕我直言:Python 真的很糟糕!”

為何很多人還願意繼續使用它?

我聽到的主要理由是 Python “易于使用”。然而,這不僅不符合事實,而且是一種誤導。它顯示了人們對總體擁有成本(Total Cost of Ownership,TCO)工作方式的了解有誤。對于任何真正用于生産的重要軟體,80% 或更多的成本産生在初始開發之後。那是我們運作、調試、添加功能和重構的階段。如果有80%的時間被消耗在調試和解決那些上世紀60年代的編譯器就能發現的問題上,那麼開發速度提高一倍的意義又在哪裡?

你的程式設計語言易于使用固然值得稱贊,但那并不是你的主要任務。你的工作是編寫符合要求、可靠、易于維護和高效的軟體,而用 Python 編寫這樣的代碼異常困難。

問題:那麼我們為什麼還要使用它?答案:使用 Python 是一種錯誤的經濟學選擇,也就是說,它看起來可以節省一些成本,但實際上會造成更大的損失。

遺憾的是,寫軟體很難,但好的程式設計語言能夠使編寫合格的程式稍微容易一些,通常是以增加更多複雜性為代價。那個階段的開發對整體并不重要,但因為它是第一個階段,在人們的思考中占有重要地位,對我們項目規劃中的缺陷産生了深遠影響。

使用 Python,你可以迅速編寫并執行代碼,就如同你在建造摩天大樓時僅搭建幾堵預制牆一樣,未考慮地基的牢固性。然而,我們建構軟體的方式不應該像搭建摩天大樓那樣倉促行事。

有人聲稱 “Python 非常适合作為其他庫的粘合代碼”,但這并不完全準确。實際上,除了 Python 被廣泛使用和接受外,它的适用性并沒有特别突出。這與 QWERTY 鍵盤并不是最優設計,卻因為大衆習慣而被廣泛接受的情況相似。

“恕我直言:Python 真的很糟糕!”

我已轉向 Go 語言

相較之下,我已将所有業餘程式設計轉向 Go 語言。Go 在易于編寫和類型安全性方面與 Python 幾乎持平,建構迅速,并能生成優化良好的本地代碼二進制檔案。雖然 Go 也有缺點,但在編寫可靠、快速的代碼方面,它比 Python 更有優勢。

确實,如果你擅長編寫 Python 但不熟練使用 Go 或其他高效的程式設計語言,你可能需要重新審視自己的軟體開發能力。雖然這聽起來嚴厲,但作為專業軟體開發人員,你應具備使用專業工具的能力。

最後,雖然 Python 在許多方面并不出色,但它的确有一個值得稱贊的特點:它是由一位荷蘭人發明的!

“恕我直言:Python 真的很糟糕!”

廣大網友激烈讨論

這篇文章引起了廣大網友的激烈讨論,有些人力挺 Python,而有些人則持有相反觀點,也有些網友持中立态度。

支援的一方:有些人認為 Python 是一種靈活、易用、富有表達力的語言,适合用于資料科學、機器學習、Web 開發等領域,擁有豐富的庫和社群支援。有網友強調 Python 在教育和初學者入門方面的優勢。它的文法簡單,易于學習,在教學和快速原型開發方面有獨特的優勢。

反對的一方:認為 Python 是一種缺乏類型安全、錯誤處理混亂、難以重構的語言,不适合用于複雜、大規模、高可靠性的軟體工程項目,應該被其他更現代、更專業的語言取代。有網友認為 Python 的性能較差,特别是與 C、C++ 等編譯語言相比。這可能會限制其在某些高性能計算場景中的應用。有網友提到 Python 的一些庫和工具可能存在問題,例如包管理工具的複雜性和一些庫的不穩定性。

中立的一方:有些人認為 Python 是一種有優點也有缺點的語言,取決于使用場景和個人喜好,沒有絕對的好壞,應該根據實際需求選擇合适的工具。

參考連結

  1. 動态:https://en.wikipedia.org/wiki/Type_system#Dynamic_type_checking_and_runtime_type_information
  2. 鴨子類型:https://en.wikipedia.org/wiki/Duck_typing
  3. 備援代碼:https://en.wikipedia.org/wiki/Cruft
  4. 動态類型檢查:https://en.wikipedia.org/wiki/Type_system#Dynamic_type_checking_and_runtime_type_information
  5. Python 的運作方式使情況變得更糟:https://www.pythontutorial.net/advanced-python/python-garbage-collection/
  6. 寫時複制:https://en.wikipedia.org/wiki/Copy-on-write
  7. 寫軟體很難:https://medium.com/@josvisser/why-programming-is-hard-90cb7ff06dcf
  8. QWERTY 鍵盤:https://smallbusiness.chron.com/advantages-disadvantages-using-qwerty-keyboard-66874.html
  9. 荷蘭人:https://en.wikipedia.org/wiki/Guido_van_Rossum

粉絲福利:

“恕我直言:Python 真的很糟糕!”