From : 人們對Python在企業級開發中的10大誤解 python
在PayPal的編程文化中存在着大量的語言多元化。除了長期流行的C++和Java,愈來愈多的團隊選擇JavaScript和Scala,Braintree的收購也推出了成熟的Ruby社區。程序員
有一種特別的語言,它在eBay和PayPal有很長的歷史,在開發者心中的地位也在日漸提升,這種語言就是:Python。編程
多年來,Python一直獲得eBay開發人員的普遍使用和支持。甚至在官方管理層支持之前,技術人員就開始使用Python,並從中受益。多年前,我加入PayPal,並選擇Python來編寫內部應用程序,但我發如今PayPal的一些產品中,Python代碼存在已有15年之久了。後端
如今,Python掌控了超過50個項目,包括:安全
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的基於安全應用的例子。
另外,不少由Python構建的以運營爲導向的系統都暗含安全特性,例如防火牆和鏈接管理。未來,咱們確定會嘗試將PayPal python的安全事項進行深刻結合。
誤解4:Python是一門腳本語言
Python確實能夠做爲腳本語言使用,並且仍是這個領域的先行者之一,由於它語法簡單,支持跨平臺,而且廣泛存在於Linux,Macs和其它Unix機器中。
事實上,Python多是通用編程語言中最靈活的技術之一。下面列出一部分例子:
更不用說大量的網站和網絡服務器。事實上,PayPal工程師彷佛都有一個嗜好,喜歡從事一些基於Python的門戶網站的開發,如YuTube和Yelp。從官方的名單中,能夠列舉出更多關於Python成功的應用。
誤解 5: Python是弱類型的
強大的動態類型是Python類型系統的特色。維基百科上有更詳細的解釋。
這不是比賽,但作爲一個有趣的事實,Python具備比Java更強的類型系統。Java的原語和對象有各自的類型系統,Null存在於一種灰色地帶。而另外一方面,Python有一個統一的強類型系統,None這種類型也有明確的定義。此外,Java虛擬機自己也是動態類型,它能夠追溯到SUN公司收購的Smaltalk虛擬機的實現。
Python的類型系統很是友好,但對於企業的使用,還有更須要關注的問題。
誤解 6: Python速度慢
首先,很重要的一點是:Python是一種編程語言,不是一個運行環境。下面列舉幾種Python的主要實現:
每種運行時都有它自身的性能特色,它們中沒有一個自己是慢的。更重要的一點是這裏存在一個錯誤,即對一種編程語言進行性能評估。應該對一個應用程序,最好是針對一個特定的用例進行評估。
爲了使問題更明確,這裏篩選了幾個案例來講明Python有很是大的性能優點:
誠然,這些都不是最新的例子,只是我最喜歡的,由於這將很容易扯到高性能Python和獨特運行時的廣闊世界。咱們應該將注意力應該轉移到一些通用的,影響開發者提升最終產品性能的問題上,尤爲是企業級環境上,而不是解決單個特殊的問題。
C++與Python的對比,兩種語言,同一輸出
只要有足夠的時間,一個受過訓練的開發人員能夠執行惟一行之有效的方法,從而得到準確的高性能的軟件:
這也許聽起來簡單,但即便對於經驗豐富的工程師,這也是一個很是耗時的過程。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。到那時,快樂編碼吧!