策划编辑Natalie 作者JakeEdge 编译Debra 编辑Vincent 在过去几年中,Python3的采用率显着增加,但仍有很长的路要走。采用Python的大公司往往会在其基础架构上运行大量Python2.7代码,Facebook也不例外。在今年的PyCon2018大会上,Facebook产品工程师JasonFried描述了过去四年里公司对Python3从几乎没有人感兴趣到成为公司主流Python版本的过程,同时也展示了Fried作为工程师的经历。坚持。 视频地址:https://v.qq.com/x/page/r07069violt.html JasonFried,现为Facebook的产品工程师,一直在帮助公司实现这一目标,在Some发表演讲关于如何处理Python版本迁移的想法在. Fried2011年加入Facebook,很快他发现自己需要自学Python,因为在Facebook,Python代码更容易通过codereview。后来,他发现自己是Facebook采用Python3的主要推动者。他说他从来没有专门计划过,但这是大量使用Python的自然结果。(JasonFried) JasonFried最初是在Python内部社区非常活跃,经常第一个站出来回答问题。后来,他以Python支持者的身份在Facebook上出名(或者说“臭名昭著”),因为当他看到Python代码有问题时,他会未经允许直接修改。这在Facebook运作良好,因为这里没有真正的自上而下的控制机制,每个人都有权更改代码,就像您有权更改代码一样。随着时间的推移,他在Facebook内部的Python社区中建立了威信,这对他日后顺利领导Facebook的Python版本迁移起到了很大的作用。 这就是Fried演讲中提到的Python3在Facebook上从无人问津到称霸的完整时间线。可见,这个过程耗时将近5年,实属不易。 2013(基本支持→负面情绪→希望) Python3永远不会出现在Facebook上 Python3在Facebook上的落地过程非常艰难。Fried一度认为不可能出现在Facebook上,直到目前采用率超过55%,整个过程非常坎坷。 在“Facebook规模”上改变Python版本之类的东西会花费相当多的时间,并且需要大量的“外交”,他说。他讲述了他和一些工程师如何利用他们的空闲时间使Python3在没有任何权力的情况下成为Facebook的主要版本。 在2013年,Facebook打算开始对Python3的初步支持,因为他们需要将Python3支持添加到他们的构建系统中。但是因为Facebook库不支持Python3,所以不可能将Python3添加到构建系统中。而如果构建系统不支持Python3,那么Facebook库就不可能支持Python3。这就像《第二十二条军规》中描述的悖论,Python3“有效”但在Facebook环境中得不到任何支持。 此外,在2013年,Facebook内部对Python3有很多负面评价。总体而言,他们认为公司的编程语言将永远停留在Python2.7。还建议完全切换到另一种语言。Fried还表示(在内部社区中)Python3永远不会出现在Facebook。只有一个人质疑他,建议他做点什么来改变这种情况,虽然他当时没有理会这个建议,但这个想法一直留在他的脑海里。 希望 2013年,事情有了转机。当年1月,Facebook当时使用的“linter”工具需要从future中导入print_function、division、absolute_imports和unicode_literals,以延长Python2代码库的生命周期。他们在linter提示的任何地方导入这些包,这使得将模块转换为Python3变得更加容易。 用于序列化和远程过程调用的ApacheThrift框架在Facebook“无处不在”。由于它只支持Python2,这是最大的障碍。然而,一项由Facebook的Thrift团队赞助的对Thrift新功能的调查显示,开发人员普遍希望添加Python3支持。Fried投了赞成票,但没有效仿,认为Python2接口需要重构,因为它看起来像Java。 当他在旧金山的Yelp上看到GuidovanRossum在谈论一个叫做“Tulip”(最终成为asyncio模块)的东西时,他的想法开始发生了变化。他一直是Python异步编程的爱好者,但由于框架(例如Twisted、gevent)之间的差异而四分五裂。Tulip支持异步I/O操作之间的互操作性。在那次谈话结束之前,他与FacebookThrift团队沟通,Thrift应该直接支持Tulip,而不是等待Twisted、gevent和其他框架迁移到Python3。几天后,Thrift团队发布了一个路线图,其中包括支持Python3和郁金香。 Thrift团队在2014年初推出了这两项新功能,但接下来的六个月没有任何进展。用户对此没有反应,事实上他们不关心甚至不知道这些变化已经发生。弗里德还举了一个在中国建造的房子却没人住的例子来说明这种情况,真是让人哭笑不得。 2014(改变文化→从头开始→强制执行) 新项目 2014年8月,他开始重写一个服务,打算使用gevent和Python2,但后来他意识到,如果你这样做,到项目完成时它将过时。为了有所作为,需要有人率先有所作为。Fried是在Facebook上推动Python3的人。 于是他用Python3开始了他的项目,可想而知,他面临的是“一塌糊涂”的局面。当时Facebook没有人使用Python3,构建系统不支持他的代码,所有第三方包都只支持Python2。在他修复所有问题并编译代码后,运行时出了点问题。 为了让代码正常运行,他必须修复所有问题。他重建了数百个第三方包,以便它们可以支持两个版本的Python,并且他必须使所有内部库与Python2和Python3兼容。然而,每天都有人对他的依赖项提交Python2更改。他需要不断修理东西,并且厌倦了它。一种解决方案是在组织内强制执行Python3合规性,但这在Facebook根本不可能。但是,如果你表现得好像你拥有某种力量,人们就会逐渐相信你确实拥有它。 他有很多人脉可以将Pyflakes(一种lint工具)添加到构建过程中。他能够证明添加它是合理的,因为虽然已经有了PEP8,但Pyflakes还可以解决其他代码质量问题。此外,Pyflakes几乎没有误报,因此不会激怒开发人员。他进行了一些设置,以便Pyflakes扫描所有代码以供审查,首先是Python2,然后是Python3。这有助于将Python3兼容性扩展到所有开发人员,而不仅仅是他自己,这让他的项目取得了进展。 一开始,他不得不花很多时间向人们解释“linter没有错”,让代码在Python3上运行是有价值的。如果开发人员开始发现迁移到Python很困难3,他们将退回到“让我们永远留在Python2中”的心态。他想确保开发人员可以在Python3上顺利运行代码。 2015(培训) 培训 克服了一些障碍,但在扩大Python3在Facebook的地盘方面取得了很少或没有取得进展。他加入了对Facebook新员工进行Python编程培训的团队。他希望兼容的代码只用于遗留项目,而新项目应该用Python3开发。 2015年,他修改了新员工的Python培训内容,说Facebook有一天会切换到Python3,并且只写Python2的代码是没有意义的,因为以后还得重写。他教导新员工所有代码都应该与Facebook的基础架构和构建系统保持一致,如果不一致,他们应该提交错误或尝试自行修复。这样,新员工开始在工作中使用Python3,这就是进步的开始。“这很奇怪它是怎么发生的。” 2015年1月,他终于交付了他的项目。他花了一年的大部分时间告诉人们它有多好,以及为什么他们应该尽可能使用Python3。在过去的一年里,Facebook的许多致力于Python3的盟友都在公司中声名鹊起。 2016(Python3成为默认编程语言) 这些盟友之一是?ukaszLanga,他“说服Instagram改用Python3”。2016年,Fried和Langa在Facebook组建了一个全新的团队来内部训练Python,他们称之为TheMinistryofSillyWalks。只有两个人,但毕竟是“Python团队”,所以他前面提到的“权威”就发挥了作用:人们认为他们可以在Facebook做关于Python的决定。 2016年,他看到Python3的采用缓慢但稳定地增长。人们在会议上提到它,他经常听到新项目使用它。即使Python3不是默认的,项目也会选择使用它,此时Facebook对Python3的看法发生了变化。2016年5月,Fried表示打算将构建系统切换为默认使用Python3,他的提议几乎获得了绝对的支持。几天后,他完成了转换,没有任何不良影响。 Fried表示,2016年在Facebook推动Python3项目的只有十个人,其中三人是主要推动者,人员流动不断,很多从事这个项目的人都是兼职. 2016年底,一个项目团队发表了一篇文章,描述了切换到Python3的结果。只需进行一些修复,从Python2切换到Python3的开发人员就可以将代码运行速度提高40%,并使用一半的内存。这揭穿了Fried之前听到的一个神话:Python3比Python2慢。他说,在Python3的早期版本中可能是这种情况,但现在肯定不是了。 2017(Instagram迁移) 好事发生 2017年初,随着Instagram完成Python3迁移,Facebook感受到了Python3迁移的荣耀。Python版本升级原来并不可怕,反而带来了可用的新特性。Facebook开发人员现在开始使用新的静态类型或使用asyncio改造旧服务。“Python在Facebook又开始变得有趣了”。 现在的问题是每个人都在问什么时候可以停止支持Python2。当Python2支持库或模块出现回归时,经常听到开发人员询问他们是否可以直接升级到Python3。几年前,情况恰恰相反。“啊,多么美好的世界啊!” 2018(Python3超过55%) 他展示了Facebook的Python服务入口端点随时间变化的图表,从2015年第三季度开始,当时只有四个Python3服务入口端点。截至2016年年中,当它默认切换到使用Python3时,Facebook已经有4%的服务入口端点使用Python3。2018年3月,这一比例超过50%。5月中旬,当他发表演讲时,55%的Facebook服务入口端点正在运行Python3。Fried说,在Facebook,仅在Python2上运行的代码现在处于尴尬的境地。 ???ukaszLanga在推特上称赞了Python3的低CPU使用率和加速。 演讲结束,他对演讲进行了概述。总的来说,他的建议包括:你要创新,做出改变,结果会随之而来;不要一个人做;在他人的帮助下;此外,培训新员工以实现您未来的目标也很重要。收集您需要的数据;享受结果,并用Python3编写“一些很棒的东西”。 ***,他还回答了观众的一些问题。有人问如何在传统的等级制组织中实现演讲中提出的目标。Fried认为,这实际上可能更容易,因为您不需要说服成千上万的开发人员,只需说服管理层。如果您在一个具有保守文化的组织中,这也可能很困难,但关注代码质量改进可以在这方面有所帮助。对于另一个关于整体代码的问题,而不是多个入口点,Fried建议查看PyCon2017的Instagram主题演讲(请参阅帖子开头)。 整个演讲内容丰富,包括弗里德对倡导者和领导者的强调,以及坚持不懈在项目中的重要性。 原文链接: https://lwn.net/SubscriberLink/758159/f1f631e1535ab9d6/
