Python 語言在企業(yè)應(yīng)用方面遭遇的十大謬誤
語言多元化是PayPal編程文化中一個(gè)重要的組成部分。在C++和Java長(zhǎng)期流行的同時(shí),更多的團(tuán)隊(duì)選擇了JvaScript和Scala。同時(shí),Braintree的收購(gòu)也引入了一個(gè)久經(jīng)世故的Ruby社區(qū)。
Python作為一門特別的語言,在eBay和PayPal有很長(zhǎng)的歷史。而且其流行程度依然有增不減。
eBay的開發(fā)者支持Python這個(gè)應(yīng)用于基層領(lǐng)域多年的語言。甚至在eBay管理層官方支持Python以前,技術(shù)人員就開始使用Python。我在幾年前加入PayPal并選擇Python來寫內(nèi)部應(yīng)用,然而,我卻發(fā)現(xiàn)了PayPal中將近15年以前的Python代碼。
目前,Python 支撐著 超過50個(gè)項(xiàng)目, 包括:
-
運(yùn)營(yíng)和基礎(chǔ)設(shè)施型, 從開放的 OpenStack 到專有設(shè)施
-
中間層服務(wù)和應(yīng)用型, 例如 PayPal 用來設(shè)定價(jià)格以及檢測(cè)用戶可用功能的那個(gè)(服務(wù)/應(yīng)用)
-
監(jiān)測(cè)代理和接口型, 用于涉及到部署和安全的一些用例
-
批處理任務(wù)型, 例如數(shù)據(jù)導(dǎo)入,價(jià)格調(diào)整,及其它項(xiàng)目
-
以及不計(jì)其數(shù)的開發(fā)者工具
在接下來的文章里我將詳細(xì)介紹那些使得 eBay 和 PayPal 的 Python 生態(tài)系統(tǒng)從2011年的不超過25個(gè)工程師到2014年超過260個(gè)工程師所使用的技術(shù)和舉措。對(duì)于本文,我則會(huì)專注于10個(gè)不得不予以揭露的關(guān)于 eBay 和 PayPal 的企業(yè)環(huán)境的謬誤。
謬誤 #1: Python 是一門新語言
伴隨著所有的初創(chuàng)公司正在使用它以及孩子們最近也在學(xué)習(xí)它的事實(shí),這個(gè)謬誤為何仍然存在是可以理解的。實(shí)際上 Python 已經(jīng) 超過23歲了, 它最初發(fā)布于1991年, 早于 HTTP 1.0協(xié)議 5年且早于 Java 4年. 目前比較有著名的很早就使用 Python 的例子是在1996年: Google 的第一個(gè)成功的網(wǎng)絡(luò)爬蟲.
如果你對(duì)于長(zhǎng)長(zhǎng)的 Python 歷史比較好奇,Python 的作者 Guido van Rossum 已經(jīng)為你準(zhǔn)備好整個(gè)故事了.
謬誤 #2: Python 沒有被編譯
不像 C++ 一樣需要一個(gè)獨(dú)立的編譯器工具鏈,Python 實(shí)際上被編譯成了字節(jié)碼,和 Java 或者許多其他的編譯型語言十分相似。更進(jìn)一步的編譯過程,如果有的話, 取決于運(yùn)行時(shí)環(huán)境, 不管是 CPython,PyPy,Jython/JVM,IronPython/CLR,或是其它的進(jìn)程式虛擬機(jī)(process virtual machine)。參考 謬誤 #6 來了解更多。
一條在 PayPal 以及其它地方的通用原則就是,(應(yīng)用的)安全性不能依賴于代碼的已編譯狀態(tài)。更為重要的是加強(qiáng)運(yùn)行時(shí)環(huán)境的安全,因?yàn)閷?shí)質(zhì)上每種語言都有一個(gè)解碼器,或者能被攔截并導(dǎo)出受保護(hù)的狀態(tài)。參考下一條謬誤來了解更多的 Python 安全性問題。
謬誤 #3: Python 不安全
輕量級(jí) Python 的親和力可能使他看起來不怎么可怕,但是這里直覺很大程度上是受到了誤導(dǎo)的. 安全的一個(gè)核心原則就是盡可能讓呈現(xiàn)的目標(biāo)更小. 大系統(tǒng)是違背安全原則的,因?yàn)樗麄冓呄蛴?nbsp;使行為過渡集中化, 并且也 讓開發(fā)者難于理解. Python 通過倡導(dǎo)簡(jiǎn)潔化來邊緣化這些惡心的問題. 更有甚者, CPython 通過讓自己成為一個(gè)簡(jiǎn)單、穩(wěn)定并且易于審核的虛擬機(jī)來使這些問題得到解決. 事實(shí)上,近期 Coverity Software 的一個(gè)分析結(jié)果顯示 CPython 得到了他們的最高質(zhì)量評(píng)級(jí).
Python 還擁有一系列可擴(kuò)展的開源、產(chǎn)業(yè)標(biāo)準(zhǔn)化的安全庫(kù)序列. 在PayPal, 我們把安全和授信看做是重中之重, 我們發(fā)現(xiàn) hashlib, PyCrypto, 以及 OpenSSL, 通過 PyOpenSSL 和我們自己的定制構(gòu)建的結(jié)合,涵蓋了 PayPal 多樣化的安全和性能需求.
這些諸多的原因,使得 Python 成為PayPal(和eBay)的應(yīng)用程序安全團(tuán)隊(duì)在某些業(yè)務(wù)中最快的選擇. 這里有把Python用在PayPal的安全第一環(huán)境中的幾個(gè)以安全為基礎(chǔ)應(yīng)用程序:
-
創(chuàng)建安全代理,以促進(jìn)密鑰的輪換以并鞏固加密實(shí)現(xiàn)
-
同業(yè)界領(lǐng)先的 HSM 技術(shù)集成
-
為缺乏兼容性的技術(shù)棧構(gòu)建受TLS保護(hù)的封裝代理
-
為我們內(nèi)部的互相認(rèn)證計(jì)劃生成鍵和證書
-
開發(fā)主動(dòng)的漏洞掃描器
另外,還有無數(shù)存在安全隱患的用Python構(gòu)建,面向操作的系統(tǒng), 諸如防火墻和連接管理. 未來,我們一定回去深入的整合PayPal Python的安全事項(xiàng).
謬誤 #4: Python 是一門腳本語言
Python 確實(shí)可以用來編寫腳本,并且因其簡(jiǎn)單的語法、跨平臺(tái)并且無所不在于 Linux, Macs, 和其它Unix 機(jī)器而成為這個(gè)領(lǐng)域的領(lǐng)跑者之一.
事實(shí)上, Python 可能是常規(guī)用途編程語言中最靈活的技術(shù). 以下是一些實(shí)例:
-
電信基礎(chǔ)設(shè)施 (Twilio)
-
支付系統(tǒng) (PayPal, Balanced Payments)
-
動(dòng)畫(LucasArts, Disney, Dreamworks)
-
游戲后臺(tái) (Eve Online, Second Life, Battlefield, 以及 其它很多)
-
自然語言處理(NLTK)
-
機(jī)器學(xué)習(xí)和計(jì)算機(jī)版本 (scikit-learn, Orange, SimpleCV)
-
安全性和滲透性測(cè)試 (很多很多 以及 eBay/PayPal
-
大數(shù)據(jù) (Disco, Hadoop support)
-
Internet 基礎(chǔ)設(shè)施 (DNS) (BIND 10)
更別提網(wǎng)站和web服務(wù)了,那些都不在少數(shù). 事實(shí)上,PayPal工程師看起來像是有興趣致力于基于Python的web特性,比如 YouTube 和 Yelp. 如果對(duì)Python成功案例的更大清單感興趣,那就看看官方的清單吧.
謬誤 #5: Python 是弱類型的
Python 類型系統(tǒng)的特點(diǎn)是擁有強(qiáng)大、靈活的類型操作. 維基百科上對(duì)此作出的闡述.
而存在一個(gè)不爭(zhēng)而有趣的事實(shí)是, Python 是比Java更加強(qiáng)類型的. Java 對(duì)于原生類型和對(duì)象區(qū)分了類型系統(tǒng),它讓null存在于一個(gè)灰色地帶. 另一方面,現(xiàn)代的 Python 擁有一個(gè)統(tǒng)一的強(qiáng)類型系統(tǒng), 其中什么都沒有(None) 的類型是明確指定的. 更進(jìn)一步的,JVM自身也是動(dòng)態(tài)類型的,因?yàn)榭梢园阉?nbsp;根源 追溯到由Sun所收購(gòu)的Smalltalk VM的一個(gè)實(shí)現(xiàn).
Python的類型系統(tǒng) 很棒,但要提供給企業(yè)級(jí)使用,目前仍然還有許多更重大的事項(xiàng)需要關(guān)注.
謬誤 #6: Python 速度慢
首先是有一個(gè)重要區(qū)別: Python 是一門編程語言,而不是運(yùn)行時(shí)環(huán)境. Python 擁有幾個(gè)實(shí)現(xiàn):
-
CPython 是參考實(shí)現(xiàn), 且也是廣泛發(fā)布和使用的實(shí)現(xiàn).
-
Jython 是Python用于JVM的是一個(gè)成熟的實(shí)現(xiàn).
-
IronPython 是 Microsoft 針對(duì)其自家的通用語言運(yùn)行時(shí)——又名 .NET,實(shí)現(xiàn)的Python .
-
PyPy 是一個(gè)正在日趨成熟的Python實(shí)現(xiàn),擁有JIT編譯,增量垃圾收集諸多先進(jìn)的特性.
每一個(gè)運(yùn)行時(shí)都有其自己的性能特點(diǎn), 而且他們本身也不慢. 這里更重要的地方在于不能錯(cuò)誤地把一個(gè)性能指標(biāo)分派到一門編程語言智商. 應(yīng)該總是把該評(píng)估用在一個(gè)應(yīng)用程序運(yùn)行時(shí)上面,最好是針對(duì)一個(gè)特定的使用場(chǎng)景.
清楚了那些事項(xiàng)之后,下面就是一些有Python提供的小項(xiàng),體現(xiàn)其重要的性能優(yōu)勢(shì):
-
把 NumPy 用作 Intel 的 MKL SIMD接口
-
PyPy的 JIT 編譯能 達(dá)到比C還快的性能
誠(chéng)然,這些都不是最新的列子,只是我個(gè)人的最愛罷了. 這將很容易扯到高性能Python以及獨(dú)立提供的運(yùn)行時(shí)這些廣闊的領(lǐng)域. 我們不應(yīng)只是專注于解決單個(gè)特殊的案例, 而是應(yīng)該把注意力放在對(duì)開發(fā)人員在 最終產(chǎn)品性能 方面的生產(chǎn)力的普遍影響上面, 特別是在一種企業(yè)級(jí)環(huán)境之下.
C++ vs Python,. 兩種語言在同一個(gè)輸出下的對(duì)比.
給定足夠的時(shí)間,一個(gè)循規(guī)蹈矩的開發(fā)者只會(huì)按照下面這種經(jīng)過論證的方式來編寫精確高效的軟件:
-
設(shè)計(jì)實(shí)現(xiàn)一個(gè)可以正確完成任務(wù)的軟件,包括開發(fā)單獨(dú)的測(cè)試
-
測(cè)試性能,明確瓶頸
-
優(yōu)化,根據(jù)測(cè)試和Amdahl法則,并且利用Python與C的淵源
雖然這聽起來很簡(jiǎn)單,但是即使是老道的工程師,這依舊是一個(gè)非常耗時(shí)的過程。Python設(shè)計(jì)之初就考慮到了這一套開發(fā)流程。根據(jù)我們的經(jīng)驗(yàn),通常C++和Java項(xiàng)目完成一次迭代流程的時(shí)間,夠Python項(xiàng)目完成三次迭代流程。今天,PayPal和eBay中不乏有Python項(xiàng)目使用更少的代碼戰(zhàn)勝了同類C++和Java項(xiàng)目,這多虧了快速的開發(fā)使得仔細(xì)的裁剪和優(yōu)化變得可能。
Myth #7: Python無法做到大規(guī)模
大規(guī)模有許多定義,但無論怎樣,YouTube是個(gè)大規(guī)模網(wǎng)站。每月UV超過十億,每分鐘上傳的視頻時(shí)長(zhǎng)超過100小時(shí),占用互聯(lián)網(wǎng)帶寬的20%,所有這一切都以Python作為核心技術(shù)。Dropbox,Disqus, Eventbrite, Reddit, Twilio, Instagram, Yelp, EVE Online, Second Life,,以及,是的,以及eBay和PayPal中都有Python大規(guī)模的例子,這些證明大規(guī)模不僅僅是可能:它是一種模式。
成功的關(guān)是鍵簡(jiǎn)單性且一致性。CPython,Python的主要虛擬機(jī),其最大限度地放大了這些特性,從而演變出了一個(gè)精確可測(cè)的運(yùn)行時(shí)。人們很難發(fā)現(xiàn) Python程序員關(guān)心垃圾的收集暫?;驊?yīng)用地啟動(dòng)時(shí)間。擁有強(qiáng)大的平臺(tái)和網(wǎng)絡(luò)支持,Python其本身自然而然的智能水平可擴(kuò)展,BitTorrent就是其充分的體現(xiàn)。
此外,規(guī)?;?a rel="nofollow" target="_blank" >主要涵蓋測(cè)量和迭代。Python是以分析和優(yōu)化為要義建立的。看Myth #6了解更多Python如何垂直拓展的細(xì)節(jié)。
Myth #8: Python缺少好的并發(fā)支持
除了偶爾叫囂性能和規(guī)?;?/a>的問題,有人想提的技術(shù)些,“Python缺乏并發(fā),”或者,“GIL怎么樣?“如果幾十個(gè)反例仍不足以支持Python水平及垂直拓展規(guī)模的能力,那么再更深地解釋CPython實(shí)現(xiàn)細(xì)節(jié)也不會(huì)有幫助,所以我會(huì)簡(jiǎn)短些。
Python擁有強(qiáng)大的并發(fā)原語,包括generators, greenlets, Deferreds, 和futures.。Python有優(yōu)秀的并發(fā)框架,包括eventlet, gevent,和Twisted。Python在定制運(yùn)行時(shí)尚投入了驚人的工作量,包括Stackless和 PyPy。所有煩人這些和更多表明,根本不存工程師們?cè)赑ython并發(fā)編程方面的缺憾。同時(shí),所有這些都正在被正式的在企業(yè)生產(chǎn)環(huán)境中支持或使用。例如,請(qǐng)參考Myth #7。
全局解釋器鎖,或稱GIL,是Python在大多數(shù)應(yīng)用場(chǎng)景下的性能優(yōu)化,也是幾乎所有CPython實(shí)現(xiàn)代碼的開發(fā)上的基礎(chǔ)優(yōu)化。GIL使得Python可以很便利地使用操作系統(tǒng)的線程或輕線程(通常指greenlets),且不影響使用多進(jìn)程。更多相關(guān)信息,請(qǐng)看該主題的Q&A列表,以及Python文檔中的介紹。
在PayPal中,一個(gè)典型服務(wù)的部署需要多臺(tái)機(jī)器,多個(gè)進(jìn)程,多個(gè)線程,以及一個(gè)數(shù)字非常龐大的greenlets,相當(dāng)于一個(gè)非常強(qiáng)大可擴(kuò)展的并行環(huán)境(見下圖)。在大多數(shù)的企業(yè)環(huán)境中,團(tuán)隊(duì)更傾向于往更高層次過度,謹(jǐn)慎并注重災(zāi)難恢復(fù)。然而,在某些情況下,每臺(tái)機(jī)器每天Python服務(wù)仍然處理數(shù)以百萬計(jì)的請(qǐng)求,而且輕松處理。
一個(gè)基于單一worker的協(xié)同異步架構(gòu)草圖。最外層的盒子是進(jìn)程,下一個(gè)層次為線程,這里這些線程都是輕線程。操作系統(tǒng)處理線程間的搶占,而I/O異步協(xié)同合作。
謬誤 #9: Python 程序員很稀缺
事實(shí)上,現(xiàn)在使用 Python 的 web 開發(fā)者的確沒有使用 PHP 或者 Java 的 web 開發(fā)者多。這可能主要是由于企業(yè)需求和教育之間的相互作用導(dǎo)致的,不過 教育領(lǐng)域(教學(xué)所使用的編程語言)的趨勢(shì)使得情況可能產(chǎn)生變化 。
也就是說,使用 Python 的開發(fā)者并不稀缺?,F(xiàn)在全世界有數(shù)百萬使用 Python 的開發(fā)者。已有幾十個(gè)Python 技術(shù)大會(huì)、 StackOverflow 上成千上萬的 Python 內(nèi)容問答、雇傭大量使用 Python 的開發(fā)者的大企業(yè)比如 YouTube 、 美國(guó)銀行( Bank of American )和 LucasArts/Dreamworks 等等,這些都顯而易見地證實(shí)了這一點(diǎn)。在 eBay 和 PayPal 我們一直保持擁有幾百位使用 Python 的正式開發(fā)者,這是怎么做到的呢?
那么,當(dāng)一個(gè)項(xiàng)目被創(chuàng)建時(shí)為什么它會(huì)被首推?對(duì)于孩子來,大學(xué)生和教授們來說,Python作為第一門程序設(shè)計(jì)語言是非常易于學(xué)習(xí)的。在eBay,僅僅需要一個(gè)星期,一個(gè)新的Python程序員就能展示一個(gè)真正的成果,并且他們開始散發(fā)光芒常常只要2-3個(gè)月,通過Internet的寶藏(互動(dòng)式教程,書,文檔和開源代碼庫(kù))一切皆有可能。
另外一個(gè)重要的考慮因素是,項(xiàng)目使用Python會(huì)更簡(jiǎn)單,它不會(huì)像其他項(xiàng)目那樣需要那么多的開發(fā)者。在謬誤6和謬誤9中提到的那樣,在Python項(xiàng)目中,學(xué)習(xí)像Instagram那樣的高效團(tuán)隊(duì)是一個(gè)常見的比喻,并且這確實(shí)是我們?cè)趀Bay和PayPal的經(jīng)驗(yàn)。
Myth #10: Python不適應(yīng)于大項(xiàng)目
Myth #7 討論了大規(guī)模運(yùn)行Python的項(xiàng)目,但開發(fā)Python大規(guī)模項(xiàng)目是什么情況呢?正如在Myth #9中提到的,大多數(shù)Python不被人看好。 然而Instagram在其被億元美金收購(gòu)當(dāng)天達(dá)到千萬的點(diǎn)擊量,而整個(gè)公司只有十幾個(gè)人。Dropbox在2011年只有70個(gè)工程師,其他團(tuán)隊(duì)更少。所以,Python適合大規(guī)模團(tuán)隊(duì)嗎?
美國(guó)銀行實(shí)際上有超過5000的Python開發(fā)者,一個(gè)單獨(dú)的項(xiàng)目超過一千萬行Python代碼。JP摩根也經(jīng)歷了類似的轉(zhuǎn)變。YouTube也有數(shù)千的開發(fā)者和數(shù)百萬行的代碼。大規(guī)模產(chǎn)品和團(tuán)隊(duì)每天都在使用Python,因?yàn)樗哂辛己玫哪K化和封裝特性,在特定方面許多的大規(guī)模開發(fā)建議是一致的。工具,強(qiáng)大的慣例以及代碼審查促使了項(xiàng)目規(guī)?;芾淼默F(xiàn)實(shí)。
幸運(yùn)的是,Python發(fā)展于上面所提到的好的奠基。我們?cè)跈z查執(zhí)行使用pyflakes以及其他工具進(jìn)行Python代碼的靜態(tài)分析,正如堅(jiān)持PEP8——Python語言的基礎(chǔ)風(fēng)格指南。
最后,應(yīng)該指出的是,除了調(diào)度加速Myth #6以及#7中所提到的,使用Python的項(xiàng)目通常需要更少的開發(fā)者。我們常見的成功案例中,使用Java或C++的項(xiàng)目通常有3-5開發(fā)者耗時(shí)2-6個(gè)月,最終由單一的開發(fā)者在2-6周(或小時(shí),因?yàn)檫@些原因)完成項(xiàng)目。
有點(diǎn)像奇跡,但卻是現(xiàn)代發(fā)展的事實(shí),但其往往出自一個(gè)競(jìng)爭(zhēng)激烈的行業(yè)。
一種干凈的狀態(tài)
這些謬誤可能只是消遣。討論這些謬誤仍然很活躍的和受啟發(fā)的,包括內(nèi)部和外部, 因?yàn)殡[含在每一個(gè)謬誤里的都是一個(gè)Python的優(yōu)勢(shì)的認(rèn)識(shí)。 而且, 記住這些看似乏味的表現(xiàn)和麻煩的問題是穩(wěn)步成長(zhǎng)的表露, 并穩(wěn)定地增長(zhǎng)興趣促進(jìn)教育和持續(xù)地工作。 在這里,希望能撲滅一場(chǎng)充滿火焰的戰(zhàn)爭(zhēng),并且使得能真正去談?wù)摴ぷ髋cPython的實(shí)現(xiàn)。
留心將來的帖子,我將深入研究細(xì)節(jié)在這個(gè)概覽。 那么你在那之前就必須了解細(xì)節(jié),已經(jīng)修正 或是注釋起來, 我的電子郵件是 mahmoud@paypal.com. 到那時(shí),開心編碼吧!
英文原文:10 Myths of Enterprise Python
譯文出自:http://www.oschina.net/translate/10-myths-of-enterprise-python