人們對Python在企業級開發中的10大誤解

Damon發表於2015-01-16

在PayPal的程式設計文化中存在著大量的語言多元化。除了長期流行的C++和Java,越來越多的團隊選擇JavaScript和Scala,Braintree的收購也推出了成熟的Ruby社群。

有一種特別的語言,它在eBay和PayPal有很長的歷史,在開發者心中的地位也在日漸提高,這種語言就是:Python。

多年來,Python一直得到eBay開發人員的廣泛使用和支援。甚至在官方管理層支援以前,技術人員就開始使用Python,並從中受益。多年前,我加入PayPal,並選擇Python來編寫內部應用程式,但我發現在PayPal的一些產品中,Python程式碼存在已有15年之久了。

現在,Python掌控了超過50個專案,包括:

  • 功能和產品,如eBay Now和RedLaser
  • 運營和基礎設施,既有OpenStack,也有專屬產品
  • 中間層服務和應用程式,如設定PayPal的價格和顧客的功能審查
  • 監控代理和介面,用於多種部署和安全用例
  • 資料匯入的批量作業,價格調整等等
  • 還有太多的開發工具沒有計入

eBay/PayPal的Python社群,2011年只有25名工程師,而2014年這個數字已經超過了260。接下來的一系列文章,我會詳細介紹促進Python社群發展的舉措和技術。對於這篇介紹性文章,我會專注於人們對Python的10個誤解,它們中大多數,我都已經在eBay和PayPal的企業級環境中對它的真相予以揭穿。

誤解1: Python是一門新的語言

今天,伴隨著大多初創企業使用的使用,同時兒童也在進行學習,我們不難發現這種誤解仍然在持續。事實上,Python已經有超過23年的歷史了,它的第一個公開版本釋出於1991年,比HTTP 1.0早了5年,比JAVA早了4年。Python一個著名的早期使用的例子是1996年Google的第一個成功的網路爬蟲。

如果你對Python悠久的歷史感到好奇,Python語言的創立者吉多·範羅蘇姆(Guido van Rossum)會向你詳細講述關於Python的整個故事。

誤解2:Python沒有被編譯

Python不像C++需要單獨的編譯器工具鏈,它更像Java和其它編譯型語言,會將程式碼編譯成位元組碼。進一步的編譯步驟,如果有的話,是在程式執行時決定的,並由CPython, PyPy, Jython/JVM, IronPython/CLR或其它程式虛擬機器來完成。更多資訊參見誤解#6。

PayPal和其它地方的一般原則是,安全不能依靠編譯狀態的程式碼,更重要的是使執行環境更安全。因為在本質上,每種語言都有反彙編器或可以被破解的特性,這一特性會破壞程式的保護狀態。看一看下一個誤解,我們能夠了解更多Python的安全內容。

誤解 3:Python不安全

Python與輕量級的密切關係也許不會讓它看起來非常強大,但恰恰是這種直覺會給人誤解。安全的一個核心原則是儘可能小的呈現目標。大系統趨向於過度集中化的行為,以及對開發者理解力的削弱,使得它是反安全的。Python的簡單高效輕鬆的解決了這個問題。此外,CPython通過簡單的、穩定的和易於審計的虛擬機器來解決這些問題。事實上,在Coverity軟體最近的一個分析中,CPython得到了最高的質量評價。

Python還具有一系列廣泛開源的、行業標準的安全庫。在PayPal,我們對安全和信任絲毫不敢馬虎。我們發現,將hashlib,PyCrypto和OpenSSL結合在一起,通過PyOpenSSL,以及我們自定義的捆綁,已經覆蓋了PayPal的各種安全和效能需求。

綜合這些原因,我們已經可以看到一些在PayPal(eBay)的應用安全組中使用Python並被快速採用的例子。下面給出一些在PayPal最重要的環境中利用Python的基於安全應用的例子。

  • 為促進金鑰置換和加強加密的實現建立安全代理
  • 整合行業領先的HSM技術
  • 為不相容的棧構建基於傳輸層安全的包裝器代理
  • 為我們內部雙向認證機制產生金鑰和證照
  • 開發主動的漏洞掃描器

另外,很多由Python構建的以運營為導向的系統都暗含安全特性,例如防火牆和連線管理。將來,我們肯定會嘗試將PayPal python的安全事項進行深入結合。

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

Python確實可以作為指令碼語言使用,而且還是這個領域的先行者之一,因為它語法簡單,支援跨平臺,並且普遍存在於Linux,Macs和其它Unix機器中。

事實上,Python可能是通用程式語言中最靈活的技術之一。下面列出一部分例子:

  1. 電話基礎設施(Twilio)
  2. 支付系統(PayPal,Balanced Payments)
  3. 神經科學和心理學(例子很多)
  4. 數值分析和工程學(numpy, numba和很多其它例子)
  5. 動畫片(LucasArts, Disney, Dreamworks)
  6. 遊戲後端(Eve Online, Second Life, Battlefield和很多其它例子)
  7. 電子郵件基礎設施(Mailman, Mailgun)
  8. 媒體儲存和處理(YouTube, Instagram, Dropbox)
  9. 運營和系統管理(Rackspace, OpenStack
  10. 自然語言處理(NLTK)
  11. 機器學習和計算機視覺(scikit-learn, Orange, SimpleCV
  12. 安全和滲透測試(太多了,包括eBay/Paypal/)
  13. 大資料(Disco, Hadoop support
  14. 日曆(Calendar Server, which powers Apple iCal
  15. 搜尋系統(ITA, Ultraseek, and Google
  16. 網際網路基礎設施(DNS) (BIND 10)

更不用說大量的網站和網路伺服器。事實上,PayPal工程師似乎都有一個嗜好,喜歡從事一些基於Python的入口網站的開發,如YuTube和Yelp。從官方的名單中,可以列舉出更多關於Python成功的應用。

誤解 5: Python是弱型別的

強大的動態型別是Python型別系統的特點。維基百科上有更詳細的解釋。

這不是比賽,但做為一個有趣的事實,Python具有比Java更強的型別系統。Java的原語和物件有各自的型別系統,Null存在於一種灰色地帶。而另一方面,Python有一個統一的強型別系統,None這種型別也有明確的定義。此外,Java虛擬機器本身也是動態型別,它可以追溯到SUN公司收購的Smaltalk虛擬機器的實現。

Python的型別系統非常友好,但對於企業的使用,還有更需要關注的問題。

誤解 6: Python速度慢

首先,很重要的一點是:Python是一種程式語言,不是一個執行環境。下面列舉幾種Python的主要實現:

  1. CPython是參考實現,它的分佈和使用也最為廣泛。
  2. Jython是一種成熟的實現,是在Java虛擬機器上使用的Python。
  3. IronPython是用微軟的公共語言庫即.NET實現的Python語言。
  4. PyPy是一種很有前途的Python語言的實現,具有一些高階特性,如JIT編譯器,增量垃圾收集等等。

每種執行時都有它自身的效能特點,它們中沒有一個本身是慢的。更重要的一點是這裡存在一個錯誤,即對一種程式語言進行效能評估。應該對一個應用程式,最好是針對一個特定的用例進行評估。

為了使問題更明確,這裡篩選了幾個案例來說明Python有非常大的效能優勢:

  1. 使用NumPy作為英特爾公司數學核心函式單指令多資料的介面
  2. PyPy的JIT編譯器達到了比C語言更快的效能
  3. Disqus的使用者規模從2.5億增長到5億,一直都是使用同樣的100臺伺服器

誠然,這些都不是最新的例子,只是我最喜歡的,因為這將很容易扯到高效能Python和獨特執行時的廣闊世界。我們應該將注意力應該轉移到一些通用的,影響開發者提高最終產品效能的問題上,尤其是企業級環境上,而不是解決單個特殊的問題。

C++與Python的對比,兩種語言,同一輸出

只要有足夠的時間,一個受過訓練的開發人員可以執行唯一行之有效的方法,從而獲得準確的高效能的軟體:

  1. 工程師的正確行為,包括相應的測試開發
  2. 概括和測量效能,識別瓶頸
  3. 優化,適當考慮測試套件和阿姆達爾定律,同時利用Python在C語言方面強大的根源關係。

這也許聽起來簡單,但即使對於經驗豐富的工程師,這也是一個非常耗時的過程。Python從設計之初就充分考慮過開發者的時間表。根據我們的經驗,Python專案經受3次甚至更多的迭代並不稀罕,而同樣的時間,C++或Java專案只需要做一次。今天,PayPal和eBay已經看到了多個成功的案例,Python專案超越了C++和Java的同行,使用更少的程式碼,這一切都得益於快的開發時間可以進行仔細的裁剪和優化。你應該知道這些有趣的內容。

誤解 7: Python不能擴充套件

關於擴充套件有多種定義,但無論哪種,YouTube都是一個可擴充套件的網站。每月都有超過10億的獨立訪客,每分鐘上傳超過100小時的視訊,佔用20%的網際網路絡峰值頻寬,這些都用Python作為核心技術。Dropbox,Disqus,Eventbrite,RedTwilio,Instagram,Yelp,EVE Online, Second Life, 是的,還有eBay和PayPal,這些案例證明Python的擴充套件性不僅僅只是可能,還是一種模式。

簡單性和一致性是成功的關鍵。CPython這個基本的Python虛擬機器,使這些特徵最大化,同時也使執行時間可以預測。很難看到Python程式設計師關注垃圾收集中止或應用程式啟動時間。隨著強大的平臺和網路支援,Python自然地適應了智慧的橫向可伸縮性,主要表現在像BitTorrent這樣的系統中。

此外,伸縮性是與所有測量和迭代有關。Python建立的初衷是分析與優化。誤解6可以找到更多關於如何垂直擴充套件Python的內容。

誤解 8: Python缺乏好的併發性支援

在消除了效能和伸縮性的誤解後,一些人試圖從技術方面來置疑Python,“Python缺乏併發性”,或者,“Python的GIL怎麼樣?”,如果數十個反例還不足以支撐一個人對Python在水平和垂直方面的擴充套件能力的信心,那麼對CPython的詳細實現展開來解釋也沒有什麼幫助,所以我只進行簡單的說明。

Python有大量的併發性原語,包括generators,greenlets,Deferreds和futures。Python有非常多的併發性框架,包括eventlet,gevent和Twisted。目前已有大量的工作投入到了為併發性定製執行時間,包括Stackless和PyPy。所有這些以及更多的案例表明有效地使用Python進行併發程式設計不乏其人。所有這些企業級的產品都得到了官方支援和使用。例子可以參考誤解7。

全域性直譯器鎖或GIL是在Python大多數使用情況下的效能優化,也是CPython 程式碼在開發中的易用性優化。GIL可以讓作業系統的執行緒或綠色執行緒使用起來更容易,同時不影響多程式的使用。更多資訊可以參考這個主題的Q&A和Python文件的綜述。

在PayPal,一個典型的業務配置需要多臺機器承擔,採用多程式,多執行緒,和大量的綠色執行緒,達到一個非常強大和可擴充套件性的並行環境(見下圖)。在大多數企業級環境中,當事人出於謹慎和災難居處的目的,傾向於選擇一個非常高的配置。然而,在某些情況下,仍然能看到Python伺服器每天每臺機器有數百萬次的請求,但它們都可以輕鬆的處理。

一個處在基於協同的非同步架構內的工作草圖,最外面的盒子是一個程式,下一級是執行緒,線上程內是“綠色執行緒”。作業系統處理執行緒間的搶佔,I/O協同是合作的。

誤解 9: Python程式設計師稀缺

這個誤解有一些道理。Python的網頁開發工程師不如PHP和Java那麼多。這可能是由於行業需求和教育的聯動導致的,但教育趨勢表明這很有可能會被改變。

即便如此,Python開發者並不稀缺。全世界有數以百萬計的Python開發人員,幾十個Python會議,StackOveflow上幾萬個Python相關的問題,一些公司,如YouTube,美國銀行,和LucasArts/Dreamworks僱用了成千上萬的Python開發人員。在eBay和PayPal,我們有數百名開發人員經常使用Python,為什麼會這樣呢?

一個專案建立的時候為什麼選擇Python?Python非常容易學習,而且對孩子,大學生和在職人員來說也是首選程式語言。在eBay,對一個新Python程式設計師來說,只需要一週時間,他就能夠初見成效,往往在2到3個月就可以大放異彩,網際網路上豐富的互動式教程,書籍,文件和開源的程式碼庫,使這一些變得可能。

另一個重要因素是使用Python的專案比其它專案需要的開發人員要少。正如誤解6和9中所說的,像Instagram這樣的精幹、高效的團隊,在Python專案中已成為一個常見的比喻,這也無疑是我們在eBay和PayPal的經驗。

誤解 10: Python不適合做大專案

誤解7中討論了Python專案在執行時的擴充套件性,但Python專案在開發中的擴充套件性又怎樣呢?如誤解9中提到的,Python專案的人員不是很多。然而,Instagram達到每天億萬次的點選和數10億美元,整個公司仍然只有一組數十人的團隊。Dropbox在2011年僅有70名工程師,其它Python團隊的情況也很類似,人員不多。所以Python可以擴充套件到一個很大的團隊嗎?

美國銀行實際上有超過5000名Python的開發人員,一個單獨的Python專案有超過千萬行Python程式碼。摩根大通經歷了相似的轉變。YouTube也有數千名工程師和數百萬行程式碼。大的產品和大的團隊每天都使用Python,它們具有卓越的模組化和封裝特性,超過某一特定點後,通用開發規模基本保持不變。工具、強的約定和程式碼評審使大的專案易於管理。

幸運的是,Python始於一個好基線。在提交程式碼前,我們使用PyFlakes和其它工具去執行Python程式碼的靜態分析,同時也堅持PEP8,即Python語言的風格指南。

最後,需要注意的是,除了誤解6和7中提到的排程的明顯變化外,使用Python的專案也需要更少的開發人員。我們最常見的成功案例是,一個Java或C++專案,預計需要一個3-5人的開發團隊,2-6周的時間,最終由一名受到激勵的開發人員僅用2-6周(或小時)完成這個專案。

這是一個奇蹟,但也是現代發展的事實,並且通常是商業競爭的必需品。

乾淨的狀態

誤解可以作為有趣的消遣。圍繞這些誤解的討論仍然是一些最積極和有意義的事情,包括內部的和外部的,因為從每一個誤解中都能認識到Python的優勢。同時也要記住,那些表面上看起來繁瑣和麻煩的事情常常是興趣穩步增長的表現,隨著各行業穩定的流入,帶來了持續的教育工作。希望這篇文章可以撲滅一場火焰戰爭,能夠談論一兩個用Python實現的專案。

將來的文章,我會深入地對細節進行研究。如果在此之前,你希望瞭解細節或有任何修正和評論,可以給我發郵件:mahmoud@paypal.com。到那時,快樂編碼吧!

相關文章