大家好!
我们启动了
Python开发人员课程的五周年纪念活动。 在每个线程开始之前,他们经常问我们在培训中使用的是哪个版本(通常,不仅是两个版本,无论听起来多么奇怪,给定课程的名称,Python),以及从一个版本迁移到另一个版本的细微差别。 今天,我们想分享一篇关于在Facebook上从2迁移到3的体验的文章,该文章在PyConf上进行了介绍。
走吧
近年来,向Python 3的过渡已变得越来越流行,但是该过程仍远未完成。 许多使用Python的大公司的基础设施在Python 2.7中都留下了大量的代码块,Facebook也不例外。 杰森·弗里德(Jason Fried)参观了PyCon 2018,讨论了过去四年中公司发生的变化-在Python 3的一开始它实际上就不存在了,但最终它成为了公司中Python的主要版本。 杰森(Jason)帮助实现了这一目标,他的
演讲[YouTube video]为其他想要迁移的组织提供了很多想法。
Fraid于2011年加入Facebook,并很快意识到,如果他想更快地进行代码审查,则需要学习Python。 不久之后,他意识到自己已经成为在Facebook上过渡到Python 3的主要推动力。 这从来都不是他的计划的一部分,并且当然是在他使用Python时发生的。

Fraid从积极参与内部Python小组开始,并且经常被证明是第一个回答问题的人。 结果,他在Facebook上的Python专家中成名(“颇有名气”),他自己修改了代码,没有征得他的许可(如果他发现该语言使用不正确)。 由于缺乏垂直控制层次,因此在Facebook上可以做到这一点。 每个人都有回滚更改的权利,就像您最初进行这些更改一样。 随着时间的流逝,这些修改有助于增强弗洛伊德在Python Facebook社区中的信誉,这将在迁移过程中派上用场。
弗洛伊德认为,更改类似Facebook范围的Python语言版本需要花费一些时间和大量外交。 他想讲述“关于我和其他一些工程师如何在闲暇时没有任何权限的情况下使Python 3成为Facebook上的主要版本的故事。”
2013年,Facebook上对Python 3.3的基本支持。 它似乎是向构建系统添加Python 3支持的一部分。 但是此任务被Facebook库中的Python 3支持所阻止,而又由于构建系统中缺少Python 3支持而被阻止。 情况就像
Trick-22 :Python 3是“可用的”,但是Facebook环境中没有任何东西支持它。
此外,2013年,Facebook上的Python 3充满了负面情绪。 几乎所有人都认为该公司将永远保持Python 2.7的地位。 也有人谈论切换到完全不同的语言。 甚至Fraid本人(在一个内部小组中)也表示,向Python 3的过渡永远不会在Facebook上发生。 只有一个人对这一说法提出质疑,并愿意对此做些事情。 那时,弗雷德(Freide)忽略了号召性用语,但继续考虑这个想法。
希望之光但是,据弗洛伊德说,希望是温暖的。 在2013年1月,
__future__ (print_function, division, absolute_imports, andunicode_literals)
使用了来自
__future__ (print_function, division, absolute_imports, andunicode_literals)
四种导入
__future__ (print_function, division, absolute_imports, andunicode_literals)
。 最初,它们似乎延长了Python 2代码库的寿命,并被添加到所有地方,从而使linter不再受到诅咒。 这最终简化了模块到Python 3的转换。
Facebook使用无处不在的框架来序列化和远程调用
Apache Thrift例程。 而且它与Python 2的出色兼容性已成为主要的障碍。 但是在Thrift在Facebook上对潜在有趣的创新进行的民意测验中,增加对Python 3的支持被证明是一个受欢迎的选择,Fraid投票支持,但还不是因为他想推广Python 3。 他只是觉得Python 2接口类似于Java中的接口,因此需要重构。
在Guido van Rossum在旧金山Yelp的主题为“郁金香”的演讲之后,他的思维过程开始发生变化,事实证明这是一个
异步模块。 Fride一直是异步Python编程的狂热者,但由于提供它的框架之间的差异(例如
Twisted ,
gevent )而认为它是零散的。 Tulip看起来好像可以使异步I / O互操作。 讲座尚未结束,Fraid已经与Thrift Facebook团队进行了交谈,提议为郁金香3实现Tulip支持,以等待Twisted,gevent等端口。 几天后,Trift发布了一份路线图,显示了即将支持Python 3和Tulip。
这种情况发生在2014年初,但在接下来的六个月中没有任何变化。 用户没有出现,也没有计划这样做,实际上,他们不知道任何更改。
新项目2014年8月,星期五启动了一个重写旧服务的项目。 最初,出于这个目的,他计划使用Python 2和gevent,但是后来他意识到到完成时,它已经过时了。 必须是第一个做出改变的人。 对于Facebook和Python 3,正是Fraid。 “必须成为您组织中的Python 3的这个人。”
因此,他使用Python 3开始了他的项目,“一切都坏了”。 毫不奇怪,没有人使用Python3。构建系统甚至无法编译其代码,并且所有第三方wheel软件包仅适用于Python2。但是,当他修复了足够多的东西以组装其服务时,启动时立即崩溃-由于代码中的某些内容在Facebook系统上设置了入口点。
因此,为了使代码正常工作,Fraid被迫修复其他所有内容; 他重建了数百个第三方轮子以使用两个版本的Python,并更新了所有内部库以使其与2/3兼容。 但是,每天都有人仅依赖于他对Python 2进行更改,难怪Fraid厌倦了修复回归问题。 唯一的解决方案是在内部强制遵守Python 3,但这在Facebook上是不可能的。 但是,如果您开始像有权力那样去做,人们就会开始相信您确实拥有他们。
Fraid利用他的社会影响力,在制作过程中加入了Pyflakes短绒。 考虑到
PEP 8的存在,他有理由增加一个新的
PEP ,以便解决不同类别的代码问题; 另外,Pyflakes的误报率也较低,因此对开发人员的影响也较小。 Fraid进行了所有设置,以便Pyflakes可以首先运行要提交供审查的所有代码,首先是Python 2,然后是Python3。这有助于在所有开发人员之间分配维护与Python 3兼容性的工作,这使得在Freud项目中取得进展成为可能。
首先,他不得不向人们解释说,lint并没有被破坏,因此修改代码使其与Python 3兼容是有意义的。如果开发人员认为向Python 3的过渡过于复杂,他们会回到“我们将永远与Python 2在一起的想法”。 使用Freud,使代码与Python 3兼容变得更加容易。 因此,比弗洛伊德本人更容易“关闭皮棉机”,而不是抱怨需要编辑代码,这就是每个人都这样做的原因。
培训课程所有这些都帮助阻止了“流血”,但是在Facebook上引入Python 3并没有取得任何重大进展。 星期五加入了向新员工教授Python的团队。 当代码与2或3不兼容时,Linters已经报告了错误,但是Fraid希望达到与2/3兼容的代码仅针对旧项目编写而新代码仅由Python 3编写的程度。自己掌握情况:为了发表这一声明,他在2015年为新员工更改了Python类中的幻灯片。 这个想法是,在将来某个未知的时刻,Facebook希望改用Python 3,因此为Python 2编写代码毫无意义-终有一天必须重写。 他向初学者解释说,所有这些都应该在Facebook基础架构和构建系统中起作用,如果无法实现,则您必须发送错误或自己修复所有错误。 “奇怪的是,它奏效了。”
2015年1月,Fraid“最终发布”了他的项目。 他在今年余下的时间里向人们介绍了他的成功以及是否需要使用Python3。在这一年中,Facebook上向Python 3的过渡中出现了新的盟友。

其中一位是ukaszLanga,他“以某种方式说服Instagram转换为Python 3”。 2016年,Langa在Facebook上成立了一个新的Facebook控制团队,称为
“愚蠢步态部门” 。 由于他们是“ Python团队”,因此上述“虚拟权威”起作用了; 人们认为他们可以对Facebook上的Python做出决定。
在2016年,公司对Python 3的使用缓慢但稳定地增长。 他们在会议上谈论他,用于新项目。 尽管Python 3仍未被认为是默认版本,但观点正在发生变化,并且项目自愿选择使用它。 2016年5月,星期五宣布他打算将构建系统默认切换为Python 3。 这个想法得到了完全的支持,因此几天后进行了转换-没有负面影响。
在2016年底,项目团队发布了一份报告,其中包含切换到Python 3的结果。开发人员仅在代码中启动了
2to3并修复了他发誓的所有观点。 启动接收到的代码后,发现它的速度提高了40%,并且仅使用一半的内存。 这指出了一个星期五经常碰到的神话:Python 3比Python 2慢。这对于早期版本的Python 3可能是正确的,但是现在不相关了。
好东西
2017年初,Instagram完成了向Python 3的迁移,Facebook收获了“光辉的未来,在这里您可以享受美好的事物”的回报。 更新Python版本的过程并不可怕,因此可以使用新功能。 Facebook开发人员现在可以专注于诸如使用Asyncio的新静态键入功能或服务迁移之类的问题。 “ Facebook上的Python再次很有趣。”
一个新问题-人们问何时有可能拒绝对Python 2的支持。当出现回归支持Python 2库或模块时,开发人员经常问他们是否可以简单地切换到Python3。问题与几年前相反。 “哦,我生活的世界多么美好。”
在讲座中,Freide展示了从2015年第三季度开始的Python服务Facebook入口点图-当时总共只有4个Python 3点,而在过渡到Python 3时(2016年中期),已经有4% Python 3.在2018年3月,他们的人数超过了50%; 5月中旬,在演讲之时,“ 5万个Facebook入口点”中有55%。 根据Freud的说法,该公司现在很难编写仅可在Python 2上运行的代码。
然后星期五分析了这一过程。 他指出,除了创造新事物外,还需要做更多的工作。 您需要引导开发人员做到这一点,“成为您希望看到的变化”。 即使他们不了解他们的帮助,我们也需要吸引他们。 皮棉测试和单元测试有助于实现这一点。 教会新员工您要追求的目标非常重要。 当您获得结果时,边享受“好东西”边庆祝:编写“很酷的Python 3代码”。 看到如何使用新功能,其他人也将想要切换。
星期五回答了听众的一些问题。 一个问题是关于如何在更传统的,层次结构化的组织中进行这样的更改。 星期五建议这样做可能会更容易,因为您不需要说服成千上万的开发人员,而只需说服一系列管理人员,就可以从看到过渡带来好处的人开始。 但另一方面,如果公司的文化比较保守,则可能会更加困难。 专注于提高代码质量将在这里有所帮助。 另一个问题涉及不可分割的代码,该代码没有分解成很多输入点。 对于这种情况,星期五建议
在 PyCon 2017
上观看Instagram的
演示(YouTube上的视频) 。
其他组织可以从这次演讲中学到很多东西,但是很显然,有一个固执的支持者准备好控制和协调整个过程非常重要。 计划进行这种过渡的公司将需要像Fraid这样的人。
结束
我们正在等待您可以离开这里或直接在
Stas的
公开课中提问的问题和意见。