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可能是通用编程语言中最灵活的技术之一。下面列出一部分例子:

  1. 电话基础设施(Twilio)
  2. 支付系统(PayPal,Balanced Payments)
  3. 神经科学和心理学(例子很多)
  4. 数值分析和工程学(numpy, numba和很多其它例子)
  5. 动画片(LucasArts, Disney, Dreamworks)
  6. 游戏后端(Eve OnlineSecond LifeBattlefield和很多其它例子)
  7. 电子邮件基础设施(Mailman, Mailgun)
  8. 媒体存储和处理(YouTube, Instagram, Dropbox)
  9. 运营和系统管理(RackspaceOpenStack
  10. 自然语言处理(NLTK)
  11. 机器学习和计算机视觉(scikit-learnOrangeSimpleCV
  12. 安全和渗透测试(太多了,包括eBay/Paypal/)
  13. 大数据(DiscoHadoop support
  14. 日历(Calendar Server, which powers Apple iCal
  15. 搜索系统(ITAUltraseek, and Google
  16. 互联网基础设施(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的主要实现:

  1. CPython是参考实现,它的分布和使用也最为广泛。
  2. Jython是一种成熟的实现,是在Java虚拟机上使用的Python。
  3. IronPython是用微软的公共语言库即.NET实现的Python语言。
  4. PyPy是一种很有前途的Python语言的实现,具有一些高级特性,如JIT编译器,增量垃圾收集等等。

每种运行时都有它自身的性能特点,它们中没有一个本身是慢的。更重要的一点是这里存在一个错误,即对一种编程语言进行性能评估。应该对一个应用程序,最好是针对一个特定的用例进行评估。

为了使问题更明确,这里筛选了几个案例来说明Python有非常大的性能优势:

  1. 使用NumPy作为英特尔公司数学核心函数单指令多数据的接口
  2. PyPy的JIT编译器达到了比C语言更快的性能
  3. Disqus的用户规模从2.5亿增长到5亿,一直都是使用同样的100台服务器

诚然,这些都不是最新的例子,只是我最喜欢的,因为这将很容易扯到高性能Python和独特运行时的广阔世界。我们应该将注意力应该转移到一些通用的,影响开发者提高最终产品性能的问题上,尤其是企业级环境上,而不是解决单个特殊的问题。

C++与Python的对比,两种语言,同一输出

只要有足够的时间,一个受过训练的开发人员可以执行唯一行之有效的方法,从而获得准确的高性能的软件:

  1. 工程师的正确行为,包括相应的测试开发
  2. 概括和测量性能,识别瓶颈
  3. 优化,适当考虑测试套件和阿姆达尔定律,同时利用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。到那时,快乐编码吧!

人们对Python在企业级开发中的10大误解的更多相关文章

  1. 在企业级开发中使用Try...Catch...会影响效率吗?

    感谢神啊.上帝及老天爷让我失眠,才能够有了本篇文章. 记得不久之前,公司一同事曾经说过:“如果是Winform开发,由于程序是在本地,使用try...catch不会有太大性能问题,可是如果是在web服 ...

  2. Go开发中的十大常见陷阱[译]

    原文: The Top 10 Most Common Mistakes I've Seen in Go Projects 作者: Teiva Harsanyi 译者: Simon Ma 我在Go开发中 ...

  3. Python在office开发中的应用

    Python with Excel 有几个很好的Python模块能够方便地操作Excel的数据,包括读与写,不要求本地安装Excel.例如pandas, openpyxl, xlrd, xlutils ...

  4. mongodb高级操作及在Java企业级开发中的应用

    Java连接mongoDB Java连接MongoDB需要驱动包,个人所用包为mongo-2.10.0.jar.可以在网上下载最新版本. package org.dennisit.mongodb.st ...

  5. Shiro系列(0) - 权限管理在J2EE企业级开发中的应用与实战

    其实也是应大家要求,讲一下权限管理,之前有讲过,但是没有拿出来细讲,这次索性录了视频从头到尾把shiro讲一遍.后续spring security会另外找个时间也讲一下. 主要内容会包括以下 1.了解 ...

  6. Python和Ruby开发中源文件中文注释乱码的解决方法(Eclipse和Aptana Studio3均适用)

    Eclipse的设置(Aptana Studio3与Eclipse基本完全相同,此处略) window->preferences->general->editors->text ...

  7. wpf企业级开发中的几种常见业务场景

    前阵子在公司弄个内部的进销存管理系统,从了解需求.系统设计到编码,大约耗费了两个月时间,后来公司有了其他的安排,这东西就算黄了.顺便吐槽一下,厂里的一些人说话真心不顾别人感受,邮件啥的没一句舒服的.不 ...

  8. 谈谈WEB开发中的苦大难字符集问题

    http://www.lanceyan.com/tech/arch/web_luanma.html记得刚做javaweb开发的时候被这个编码问题搞得晕头转向,经常稀里糊涂的编码正常了一会编码又乱了.那 ...

  9. JS开发中的各大技巧

    「String Skill」:字符串技巧 「Number Skill」:数值技巧 「Boolean Skill」:布尔技巧 「Array Skill」:数组技巧 「Object Skill」:对象技巧 ...

随机推荐

  1. JFreeChart 图表生成实例(饼图、柱状图、折线图、时序图)

    import java.awt.BasicStroke; import java.awt.Color; import java.io.FileOutputStream; import java.io. ...

  2. make clean vs make clobber

    make is pretty smart, and picks up what has changed from the last build, so if you run repo sync and ...

  3. 第九篇 ERP实施项目中需求分析及方案设计的通用思路

    顾问实施ERP就好想医生给患者看病抓药,不但具有类似的过程,而且具有其通用的思路. --详见http://bbs.erp100.com/thread-272856-1-1.html 顾问实施ERP就好 ...

  4. [HIHO1039]字符消除(字符串,枚举,模拟)

    题目链接:http://hihocoder.com/problemset/problem/1039 思路:枚举所有字符更新的位置和ABC三种修改方案,之后再模拟消除规则,一步一步去消除.直到无法消除, ...

  5. excel表格公式出现#REF是什么意思

    #REF!错误是当单元格引用无效时,显示#REF错误 在出现下列情况时,发生此错误: (1)删除了公式引用的单元格.如A2中=A1-1,若A1被删除了,则显示此错误: (2)当被剪切的一个范围粘贴到一 ...

  6. getHitRect获取点击控件的位置

    public  void getHitRect(Rect outRect)                   Added in API level 1 Hit rectangle in parent ...

  7. Windows 桌面软件:不绑定bing搜索的缤纷桌面

    bing:世界上最好的壁纸提供商  ^.^一直垂涎着Bing的壁纸,总是想找机会来一番邂逅. 之前使用bing自家的缤纷桌面.这个软件缺点就是和bing搜索绑定太厉害,放在桌面上感觉那个黑色的条框很碍 ...

  8. 用Visio画UML用例图

    1.用例图 用例图描述参与者所理解的系统功能.主要元素是用例和参与者. 用例图的4个基本组件:参与者(Actor).用例(Use Case).关系(Relationship)和系统. 下面以银行储蓄系 ...

  9. IOS学习-报错误 Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

    环境:XCODE:5.0.2  IOS7模拟器 界面:使用storyboard 拖拽 简单应用:一个CoreData的CRUD用例. 界面如下图(一个UITableViewController 列表 ...

  10. 用canvas实现图片滤镜效果详解之视频效果

    这是一个很有意思的特效,模拟摄像机拍摄电视屏幕画面时出现点状颗粒的效果.颗粒的大小通过变换矩阵实现,可以任意调节,有兴趣研究的朋友可以尝试更多的效果,代码没有经过优化,只是一个粗糙的Demo,大家可以 ...