在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可能是通用程式語言中最靈活的技術之一。下面列出一部分例子:
- 電話基礎設施(Twilio)
- 支付系統(PayPal,Balanced Payments)
- 神經科學和心理學(例子很多)
- 數值分析和工程學(numpy, numba和很多其它例子)
- 動畫片(LucasArts, Disney, Dreamworks)
- 遊戲後端(Eve Online, Second Life, Battlefield和很多其它例子)
- 電子郵件基礎設施(Mailman, Mailgun)
- 媒體儲存和處理(YouTube, Instagram, Dropbox)
- 運營和系統管理(Rackspace, OpenStack)
- 自然語言處理(NLTK)
- 機器學習和計算機視覺(scikit-learn, Orange, SimpleCV)
- 安全和滲透測試(太多了,包括eBay/Paypal/)
- 大資料(Disco, Hadoop support)
- 日曆(Calendar Server, which powers Apple iCal)
- 搜尋系統(ITA, Ultraseek, and Google)
- 網際網路基礎設施(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的主要實現:
- CPython是參考實現,它的分佈和使用也最為廣泛。
- Jython是一種成熟的實現,是在Java虛擬機器上使用的Python。
- IronPython是用微軟的公共語言庫即.NET實現的Python語言。
- PyPy是一種很有前途的Python語言的實現,具有一些高階特性,如JIT編譯器,增量垃圾收集等等。
每種執行時都有它自身的效能特點,它們中沒有一個本身是慢的。更重要的一點是這裡存在一個錯誤,即對一種程式語言進行效能評估。應該對一個應用程式,最好是針對一個特定的用例進行評估。
為了使問題更明確,這裡篩選了幾個案例來說明Python有非常大的效能優勢:
- 使用NumPy作為英特爾公司數學核心函式單指令多資料的介面
- PyPy的JIT編譯器達到了比C語言更快的效能
- Disqus的使用者規模從2.5億增長到5億,一直都是使用同樣的100臺伺服器
誠然,這些都不是最新的例子,只是我最喜歡的,因為這將很容易扯到高效能Python和獨特執行時的廣闊世界。我們應該將注意力應該轉移到一些通用的,影響開發者提高最終產品效能的問題上,尤其是企業級環境上,而不是解決單個特殊的問題。
C++與Python的對比,兩種語言,同一輸出
只要有足夠的時間,一個受過訓練的開發人員可以執行唯一行之有效的方法,從而獲得準確的高效能的軟體:
- 工程師的正確行為,包括相應的測試開發
- 概括和測量效能,識別瓶頸
- 優化,適當考慮測試套件和阿姆達爾定律,同時利用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。到那時,快樂編碼吧!