語言多元化是PayPal編程文化中一個重要的組成部分。在C++和Java長期流行的同時镰吆,更多的團隊選擇了JvaScript和Scala帘撰。同時,Braintree的收購也引入了一個久經(jīng)世故的Ruby社區(qū)万皿。
Python作為一門特別的語言摧找,在eBay和PayPal有很長的歷史。而且其流行程度依然有增不減牢硅。
eBay的開發(fā)者支持Python這個應用于基層領(lǐng)域多年的語言蹬耘。甚至在eBay管理層官方支持Python以前,技術(shù)人員就開始使用Python减余。我在幾年前加入PayPal并選擇Python來寫內(nèi)部應用综苔,然而,我卻發(fā)現(xiàn)了PayPal中將近15年以前的Python代碼位岔。
目前如筛,Python 支撐著?超過50個項目, 包括:
功能和產(chǎn)品型, 例如 eBay Now 和 RedLaser
運營和基礎設施型, 從開放的 OpenStack 到專有設施
中間層服務和應用型, 例如 PayPal 用來設定價格以及檢測用戶可用功能的那個(服務/應用)
監(jiān)測代理和接口型, 用于涉及到部署和安全的一些用例
批處理任務型, 例如數(shù)據(jù)導入,價格調(diào)整抒抬,及其它項目
以及不計其數(shù)的開發(fā)者工具
在接下來的文章里我將詳細介紹那些使得 eBay 和 PayPal 的 Python 生態(tài)系統(tǒng)從2011年的不超過25個工程師到2014年超過260個工程師所使用的技術(shù)和舉措妙黍。對于本文,我則會專注于10個不得不予以揭露的關(guān)于 eBay 和 PayPal 的企業(yè)環(huán)境的謬誤瞧剖。
誤區(qū)#1: Python 是一門新語言
伴隨著所有的初創(chuàng)公司正在使用它以及孩子們最近也在學習它的事實拭嫁,這個謬誤為何仍然存在是可以理解的可免。實際上 Python 已經(jīng) 超過23歲了, 它最初發(fā)布于1991年, 早于 HTTP 1.0協(xié)議 5年且早于 Java 4年. 目前比較有著名的很早就使用 Python 的例子是在1996年: Google 的第一個成功的網(wǎng)絡爬蟲.
如果你對于長長的 Python 歷史比較好奇,Python 的作者 Guido van Rossum 已經(jīng)為你準備好整個故事了.
誤區(qū)#2: Python 沒有被編譯
不像 C++ 一樣需要一個獨立的編譯器工具鏈做粤,Python 實際上被編譯成了字節(jié)碼浇借,和 Java 或者許多其他的編譯型語言十分相似。更進一步的編譯過程怕品,如果有的話, 取決于運行時環(huán)境, 不管是 CPython妇垢,PyPy,Jython/JVM肉康,IronPython/CLR闯估,或是其它的進程式虛擬機(process virtual machine)。參考 誤區(qū)#6 來了解更多吼和。
一條在 PayPal 以及其它地方的通用原則就是涨薪,(應用的)安全性不能依賴于代碼的已編譯狀態(tài)。更為重要的是加強運行時環(huán)境的安全炫乓,因為實質(zhì)上每種語言都有一個解碼器刚夺,或者能被攔截并導出受保護的狀態(tài)。參考下一條謬誤來了解更多的 Python 安全性問題末捣。
誤區(qū)#3: Python 不安全
輕量級 Python 的親和力可能使他看起來不怎么可怕侠姑,但是這里直覺很大程度上是受到了誤導的. 安全的一個核心原則就是盡可能讓呈現(xiàn)的目標更小. 大系統(tǒng)是違背安全原則的,因為他們趨向于 使行為過渡集中化, 并且也 讓開發(fā)者難于理解. Python 通過倡導簡潔化來邊緣化這些惡心的問題. 更有甚者, CPython 通過讓自己成為一個簡單箩做、穩(wěn)定并且易于審核的虛擬機來使這些問題得到解決. 事實上莽红,近期 Coverity Software 的一個分析結(jié)果顯示 CPython 得到了他們的最高質(zhì)量評級.
Python 還擁有一系列可擴展的開源、產(chǎn)業(yè)標準化的安全庫序列. 在PayPal, 我們把安全和授信看做是重中之重, 我們發(fā)現(xiàn) hashlib, PyCrypto, 以及 OpenSSL, 通過 PyOpenSSL 和我們自己的定制構(gòu)建的結(jié)合邦邦,涵蓋了 PayPal 多樣化的安全和性能需求.
這些諸多的原因船老,使得 Python 成為PayPal(和eBay)的應用程序安全團隊在某些業(yè)務中最快的選擇. 這里有把Python用在PayPal的安全第一環(huán)境中的幾個以安全為基礎應用程序:
創(chuàng)建安全代理,以促進密鑰的輪換以并鞏固加密實現(xiàn)
同業(yè)界領(lǐng)先的 HSM 技術(shù)集成
為缺乏兼容性的技術(shù)棧構(gòu)建受TLS保護的封裝代理
為我們內(nèi)部的互相認證計劃生成鍵和證書
開發(fā)主動的漏洞掃描器
另外圃酵,還有無數(shù)存在安全隱患的用Python構(gòu)建柳畔,面向操作的系統(tǒng), 諸如防火墻和連接管理. 未來,我們一定回去深入的整合PayPal Python的安全事項.
誤區(qū)#4: Python 是一門腳本語言
Python 確實可以用來編寫腳本郭赐,并且因其簡單的語法薪韩、跨平臺并且無所不在于 Linux, Macs, 和其它Unix 機器而成為這個領(lǐng)域的領(lǐng)跑者之一.
事實上, Python 可能是常規(guī)用途編程語言中最靈活的技術(shù). 以下是一些實例:
電信基礎設施 (Twilio)
支付系統(tǒng) (PayPal, Balanced Payments)
神經(jīng)科學和心理學 (許多, 許多, 例子)
數(shù)值分析和工程 (numpy, numba, 以及 更多其它)
動畫(LucasArts, Disney, Dreamworks)
游戲后臺 (Eve Online, Second Life, Battlefield, 以及 其它很多)
Email 基礎設施 (Mailman, Mailgun)
媒體存儲和處理 (YouTube, Instagram, Dropbox)
操作和系統(tǒng)管理 (Rackspace, OpenStack)
自然語言處理(NLTK)
機器學習和計算機版本 (scikit-learn, Orange, SimpleCV)
安全性和滲透性測試 (很多很多 以及 eBay/PayPal
大數(shù)據(jù) (Disco, Hadoop support)
如理 (Calendar Server, 它 驅(qū)動了 Apple iCal)
搜索系統(tǒng) (ITA, Ultraseek, 還有 Google)
Internet 基礎設施 (DNS) (BIND 10)
更別提網(wǎng)站和web服務了,那些都不在少數(shù). 事實上捌锭,PayPal工程師看起來像是有興趣致力于基于Python的web特性,比如 YouTube 和 Yelp. 如果對Python成功案例的更大清單感興趣俘陷,那就看看官方的清單吧.
誤區(qū)#5: Python 是弱類型的
Python 類型系統(tǒng)的特點是擁有強大、靈活的類型操作. 維基百科上對此作出的闡述.
而存在一個不爭而有趣的事實是观谦, Python 是比Java更加強類型的. Java 對于原生類型和對象區(qū)分了類型系統(tǒng)拉盾,它讓null存在于一個灰色地帶. 另一方面,現(xiàn)代的 Python 擁有一個統(tǒng)一的強類型系統(tǒng), 其中什么都沒有(None) 的類型是明確指定的. 更進一步的豁状,JVM自身也是動態(tài)類型的捉偏,因為可以把它的 根源 追溯到由Sun所收購的Smalltalk VM的一個實現(xiàn).
Python的類型系統(tǒng) 很棒倒得,但要提供給企業(yè)級使用,目前仍然還有許多更重大的事項需要關(guān)注.
誤區(qū)#6: Python 速度慢
首先是有一個重要區(qū)別: Python 是一門編程語言夭禽,而不是運行時環(huán)境. Python 擁有幾個實現(xiàn):
CPython?是參考實現(xiàn), 且也是廣泛發(fā)布和使用的實現(xiàn).
Jython?是Python用于JVM的是一個成熟的實現(xiàn).
IronPython?是 Microsoft 針對其自家的通用語言運行時——又名 .NET霞掺,實現(xiàn)的Python .
PyPy?是一個正在日趨成熟的Python實現(xiàn),擁有JIT編譯讹躯,增量垃圾收集諸多先進的特性.
每一個運行時都有其自己的性能特點, 而且他們本身也不慢. 這里更重要的地方在于不能錯誤地把一個性能指標分派到一門編程語言智商. 應該總是把該評估用在一個應用程序運行時上面菩彬,最好是針對一個特定的使用場景.
清楚了那些事項之后,下面就是一些有Python提供的小項潮梯,體現(xiàn)其重要的性能優(yōu)勢:
把 NumPy 用作 Intel 的 MKL SIMD接口
PyPy的 JIT 編譯能 達到比C還快的性能
Disqus 能在同樣的100個盒子上容納兩億五千萬到5億用戶
誠然骗灶,這些都不是最新的列子,只是我個人的最愛罷了. 這將很容易扯到高性能Python以及獨立提供的運行時這些廣闊的領(lǐng)域. 我們不應只是專注于解決單個特殊的案例, 而是應該把注意力放在對開發(fā)人員在 最終產(chǎn)品性能 方面的生產(chǎn)力的普遍影響上面, 特別是在一種企業(yè)級環(huán)境之下.
C++ vs Python,. 兩種語言在同一個輸出下的對比.
誤區(qū)#7:Python無法擴展
規(guī)模有很多定義秉馏,但按照任何定義耙旦,YouTube都是一個大規(guī)模的網(wǎng)站。每月超過10億的獨立訪問者沃饶,每分鐘上傳的視頻超過100小時母廷,以及20%的峰值互聯(lián)網(wǎng)帶寬轻黑,所有這些都以Python為核心技術(shù)糊肤。Dropbox,Disqus氓鄙,Eventbrite馆揉,Reddit,Twilio抖拦,Instagram升酣,Yelp,EVE Online态罪,Second Life噩茄,以及,是的复颈,eBay和PayPal都有Python縮放故事绩聘,證明規(guī)模不僅僅是可能的:它是一種模式。
成功的關(guān)鍵是簡單性和一致性耗啦。CPython是主要的Python虛擬機凿菩,可以最大化這些特性,從而實現(xiàn)非持慕玻可預測的運行時衅谷。人們很難找到關(guān)注垃圾收集暫停或應用程序啟動時間的Python程序員似将。憑借強大的平臺和網(wǎng)絡支持获黔,Python自然適用于智能水平可伸縮性蚀苛,如BitTorrent等系統(tǒng)所體現(xiàn)的那樣。
誤區(qū)#8:Python缺乏良好的并發(fā)支持
偶爾揭穿性能和擴展肢执,有人試圖獲得技術(shù)枉阵,“Python缺乏并發(fā)性”,或者“GIL怎么樣预茄?”如果有數(shù)十個反例不足以增強人們對Python垂直和水平擴展能力的信心兴溜,那么對CPython實現(xiàn)細節(jié)的擴展解釋可能無濟于事,所以我會簡短地介紹一下耻陕。
Python有很大的并發(fā)原語拙徽,包括發(fā)電機,greenlets诗宣,Deferreds膘怕,和期貨。Python有很好的并發(fā)框架召庞,包括eventlet岛心,gevent和Twisted。Python在為并發(fā)運行時定制運行時方面做了一些了不起的工作篮灼,包括Stackless和PyPy忘古。所有這些以及更多表明,使用Python進行并發(fā)編程時诅诱,工程師并不缺乏有效和毫無歉意的工作髓堪。此外,所有這些都是正式支持和/或在企業(yè)級生產(chǎn)環(huán)境中使用娘荡。例如干旁,請參考誤區(qū)7。
Global Interpreter Lock或GIL是針對大多數(shù)Python用例的性能優(yōu)化炮沐,并且?guī)缀鯇λ蠧Python代碼都進行了開發(fā)簡易優(yōu)化争群。GIL使得使用OS線程或綠色線程(通常是greenlet)變得更加容易,并且不會影響使用多個進程大年。有關(guān)更多信息换薄,請參閱Python文檔中有關(guān)該主題和此概述的精彩問答。
在PayPal鲜戒,典型的服務部署需要多臺機器专控,具有多個進程,多個線程和大量的greenlet遏餐,相當于一個非常強大和可擴展的并發(fā)環(huán)境伦腐。在大多數(shù)企業(yè)環(huán)境中,各方傾向于選擇相當高度的過度配置失都,以實現(xiàn)一般審慎和災難恢復柏蘑。盡管如此幸冻,在某些情況下,Python服務每天仍然會看到每臺機器數(shù)百萬的請求咳焚,并且易于處理洽损。
誤區(qū)#9:Python程序員很少
這個神話有一些道理。沒有像PHP或Java Web開發(fā)人員那樣多的Python Web開發(fā)人員革半。這可能主要是由于行業(yè)需求和教育的相互作用碑定,盡管教育趨勢表明這可能會發(fā)生變化。
也就是說又官,Python開發(fā)人員遠非稀缺延刘。數(shù)十個Python會議,數(shù)以萬計的StackOverflow問題以及像YouTube六敬,美國銀行和LucasArts / Dreamworks這樣的公司在全球范圍內(nèi)有數(shù)百萬人使用Python開發(fā)人員成千上萬碘赖。在eBay和PayPal,我們有數(shù)百名開發(fā)人員定期使用Python外构,那么訣竅是什么普泡?
好吧,為什么一個人可以創(chuàng)造清除审编?Python非常容易學習撼班,是兒童,大學生和專業(yè)人士的第一種編程語言割笙。在eBay上权烧,只需要一周的時間就可以顯示一位新的Python程序員的真實結(jié)果眯亦,而且他們通常會在2-3個月內(nèi)開始大放異彩伤溉,所有這一切都可以通過互聯(lián)網(wǎng)豐富的交互式教程,書籍妻率,文檔和開源代碼庫乱顾。
另一個需要考慮的重要因素是使用Python的項目不需要像其他項目那樣多的開發(fā)人員。正如誤區(qū)6和誤區(qū)9中所提到的宫静,像Instagram這樣精益有效的團隊是Python項目中的常見比喻走净,這肯定是我們在eBay和PayPal上的經(jīng)驗
誤區(qū)#10:Python不適用于大型項目
誤區(qū)7討論了大規(guī)模運行Python項目,但是如何大規(guī)模開發(fā) Python項目呢孤里?正如神話誤區(qū)9中提到的伏伯,大多數(shù)Python項目往往不會讓人滿意。雖然Instagram在收購數(shù)十億美元時每天達到數(shù)億次點擊捌袜,但整個公司仍然只有十幾個人说搅。Dropbox在2011年只有70名工程師,而其他團隊同樣精益求精虏等。那么弄唧,Python可以擴展到大型團隊嗎适肠?
美國銀行實際上擁有超過5,000名Python開發(fā)人員,僅在一個項目中就有超過1000萬行Python候引。摩根大通經(jīng)歷了類似的轉(zhuǎn)變侯养。YouTube還擁有成千上萬的代碼工程師和數(shù)百萬行代碼。大型產(chǎn)品和大型團隊每天都在使用Python澄干,雖然它具有出色的模塊化和封裝特性逛揩,但在某一點上,大多數(shù)通用開發(fā)擴展建議都保持不變麸俘。工具息尺,強大的約定和代碼審查使大項目成為可管理的現(xiàn)實。
幸運的是疾掰,Python在這些方面也有良好的基線搂誉。我們使用PyFlakes和其他工具在簽入之前對Python代碼進行靜態(tài)分析,并遵循PEP8静檬,Python的語言范圍基本風格指南炭懊。
最后,應該注意的是拂檩,除了誤區(qū)#6和誤區(qū)#7中提到的調(diào)度加速之外侮腹,使用Python的項目通常也需要更少的開發(fā)人員。我們最常見的成功故事始于一個Java或C ++項目稻励,該項目計劃在2-6 個月內(nèi)將3-5名開發(fā)人員帶到一個團隊父阻,并以一個有動力的開發(fā)人員在2-6 周(或幾小時內(nèi)完成)完成該項目。物)望抽。
對某些人來說是一個奇跡加矛,但這是現(xiàn)代發(fā)展的事實,而且往往是競爭性企業(yè)的必需品煤篙。
喜歡的話 轉(zhuǎn)發(fā) 在下方留言我們可以一起探討技術(shù)相關(guān)的知識斟览。