Python 語言在企業應用方面遭遇的十大謬誤

pythontab發表於2014-12-29

語言多元化是PayPal程式設計文化中一個重要的組成部分。在C++和Java長期流行的同時,更多的團隊選擇了JvaScript和Scala。同時,Braintree的收購也引入了一個久經世故的Ruby社群。

Python作為一門特別的語言,在eBay和PayPal有很長的歷史。而且其流行程度依然有增不減。

eBay的開發者支援Python這個應用於基層領域多年的語言。甚至在eBay管理層官方支援Python以前,技術人員就開始使用Python。我在幾年前加入PayPal並選擇Python來寫內部應用,然而,我卻發現了PayPal中將近15年以前的Python程式碼。

目前,Python 支撐著 超過50個專案, 包括:

  • 功能和產品型, 例如 eBay NowRedLaser
  • 運營和基礎設施, 從開放的 OpenStack 到專有設施
  • 中間層服務和應用, 例如 PayPal 用來設定價格以及檢測使用者可用功能的那個(服務/應用)
  • 監測代理和介面, 用於涉及到部署和安全的一些用例
  • 批處理任務, 例如資料匯入,價格調整,及其它專案
  • 以及不計其數的開發者工具

在接下來的文章裡我將詳細介紹那些使得 eBay 和 PayPal 的 Python 生態系統從2011年的不超過25個工程師到2014年超過260個工程師所使用的技術和舉措。對於本文,我則會專注於10個不得不予以揭露的關於 eBay 和 PayPal 的企業環境的謬誤。

謬誤 #1: Python 是一門新語言

伴隨著所有的初創公司正在使用它以及孩子們最近也在學習它的事實,這個謬誤為何仍然存在是可以理解的。實際上 Python 已經 超過23歲了, 它最初釋出於1991年, 早於 HTTP 1.0協議 5年且早於 Java 4年. 目前比較有著名的很早就使用 Python 的例子是在1996年: Google 的第一個成功的網路爬蟲.

如果你對於長長的 Python 歷史比較好奇,Python 的作者 Guido van Rossum 已經為你準備好整個故事了.

謬誤 #2: Python 沒有被編譯

不像 C++ 一樣需要一個獨立的編譯器工具鏈,Python 實際上被編譯成了位元組碼,和 Java 或者許多其他的編譯型語言十分相似。更進一步的編譯過程,如果有的話, 取決於執行時環境, 不管是 CPython,PyPy,Jython/JVM,IronPython/CLR,或是其它的程式式虛擬機器(process virtual machine)。參考 謬誤 #6 來了解更多。

一條在 PayPal 以及其它地方的通用原則就是,(應用的)安全性不能依賴於程式碼的已編譯狀態。更為重要的是加強執行時環境的安全,因為實質上每種語言都有一個解碼器,或者能被攔截並匯出受保護的狀態。參考下一條謬誤來了解更多的 Python 安全性問題。

謬誤 #3: Python 不安全

輕量級 Python 的親和力可能使他看起來不怎麼可怕,但是這裡直覺很大程度上是受到了誤導的. 安全的一個核心原則就是儘可能讓呈現的目標更小. 大系統是違背安全原則的,因為他們趨向於 使行為過渡集中化, 並且也 讓開發者難於理解. Python 通過倡導簡潔化來邊緣化這些噁心的問題. 更有甚者, CPython 通過讓自己成為一個簡單、穩定並且易於稽核的虛擬機器來使這些問題得到解決. 事實上,近期 Coverity Software 的一個分析結果顯示 CPython 得到了他們的最高質量評級.

Python 還擁有一系列可擴充套件的開源、產業標準化的安全庫序列. 在PayPal, 我們把安全和授信看做是重中之重, 我們發現 hashlibPyCrypto, 以及 OpenSSL, 通過 PyOpenSSL 和我們自己的定製構建的結合,涵蓋了 PayPal 多樣化的安全和效能需求.

這些諸多的原因,使得 Python 成為PayPal(和eBay)的應用程式安全團隊在某些業務中最快的選擇. 這裡有把Python用在PayPal的安全第一環境中的幾個以安全為基礎應用程式:

  • 建立安全代理,以促進金鑰的輪換以並鞏固加密實現
  • 同業界領先的 HSM 技術整合
  • 為缺乏相容性的技術棧構建受TLS保護的封裝代理
  • 為我們內部的互相認證計劃生成鍵和證照
  • 開發主動的漏洞掃描器

另外,還有無數存在安全隱患的用Python構建,面向操作的系統, 諸如防火牆和連線管理. 未來,我們一定回去深入的整合PayPal Python的安全事項.

謬誤 #4: Python 是一門指令碼語言

Python 確實可以用來編寫指令碼,並且因其簡單的語法、跨平臺並且無所不在於 Linux, Macs, 和其它Unix 機器而成為這個領域的領跑者之一.

事實上, Python 可能是常規用途程式語言中最靈活的技術. 以下是一些例項:

  1. 電信基礎設施 (Twilio)
  2. 支付系統 (PayPalBalanced Payments)
  3. 神經科學和心理學 (許多許多例子)
  4. 數值分析和工程 (numpynumba, 以及 更多其它)
  5. 動畫(LucasArtsDisneyDreamworks)
  6. 遊戲後臺 (Eve OnlineSecond LifeBattlefield, 以及 其它很多)
  7. Email 基礎設施 (MailmanMailgun)
  8. 媒體儲存和處理 (YouTubeInstagramDropbox)
  9. 操作和系統管理 (RackspaceOpenStack)
  10. 自然語言處理(NLTK)
  11. 機器學習和計算機版本 (scikit-learnOrangeSimpleCV)
  12. 安全性和滲透性測試 (很多很多 以及 eBay/PayPal
  13. 大資料 (DiscoHadoop support)
  14. 如理 (Calendar Server, 它 驅動了 Apple iCal)
  15. 搜尋系統 (ITAUltraseek, 還有 Google)
  16. Internet 基礎設施 (DNS) (BIND 10)

更別提網站和web服務了,那些都不在少數. 事實上,PayPal工程師看起來像是有興趣致力於基於Python的web特性,比如 YouTube 和 Yelp. 如果對Python成功案例的更大清單感興趣,那就看看官方的清單吧.

謬誤 #5: Python 是弱型別的

Python 型別系統的特點是擁有強大、靈活的型別操作. 維基百科上對此作出的闡述.

而存在一個不爭而有趣的事實是, Python 是比Java更加強型別的. Java 對於原生型別和物件區分了型別系統,它讓null存在於一個灰色地帶. 另一方面,現代的 Python 擁有一個統一的強型別系統, 其中什麼都沒有(None) 的型別是明確指定的. 更進一步的,JVM自身也是動態型別的,因為可以把它的 根源 追溯到由Sun所收購的Smalltalk VM的一個實現.

Python的型別系統 很棒,但要提供給企業級使用,目前仍然還有許多更重大的事項需要關注.

謬誤 #6: Python 速度慢

首先是有一個重要區別: Python 是一門程式語言,而不是執行時環境. Python 擁有幾個實現:

  1. CPython 是參考實現, 且也是廣泛釋出和使用的實現.
  2. Jython 是Python用於JVM的是一個成熟的實現.
  3. IronPython 是 Microsoft 針對其自家的通用語言執行時——又名 .NET,實現的Python .
  4. PyPy 是一個正在日趨成熟的Python實現,擁有JIT編譯,增量垃圾收集諸多先進的特性.

每一個執行時都有其自己的效能特點, 而且他們本身也不慢. 這裡更重要的地方在於不能錯誤地把一個效能指標分派到一門程式語言智商. 應該總是把該評估用在一個應用程式執行時上面,最好是針對一個特定的使用場景.

清楚了那些事項之後,下面就是一些有Python提供的小項,體現其重要的效能優勢:

  1. 把 NumPy 用作 Intel 的 MKL SIMD介面
  2. PyPy的 JIT 編譯能 達到比C還快的效能
  3. Disqus 能在同樣的100個盒子上容納兩億五千萬到5億使用者

誠然,這些都不是最新的列子,只是我個人的最愛罷了. 這將很容易扯到高效能Python以及獨立提供的執行時這些廣闊的領域. 我們不應只是專注於解決單個特殊的案例, 而是應該把注意力放在對開發人員在 最終產品效能 方面的生產力的普遍影響上面, 特別是在一種企業級環境之下.

cpp_py_medium

C++ vs Python,. 兩種語言在同一個輸出下的對比。

相關文章