From : 人们对Python在企业级开发中的10大误解
在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。到那时,快乐编码吧!