编程语言 Instagram如何驯服数百万行的Python怪物

导读 Facebook拥有的Instagram已详细说明了其解决方案,以增强Python的优势并减轻该语言在大型项目中影响生产力的方式来改进该应用程序。在Insta

Facebook拥有的Instagram已详细说明了其解决方案,以增强Python的优势并减轻该语言在大型项目中影响生产力的方式来改进该应用程序。

在Instagram上所有过于完美的自拍照的背后,Facebook拥有的社交网络是基于流行的编程语言Python建立的。

正如Instagram工程师最近详细介绍的那样,Instagram服务器是数百万千禧一代用于共享朋友和自己的照片的智能手机应用程序的后端,几乎完全由Python(仅次于Java和JavaScript的第三流行语言)提供动力。

SEE: 六种按需编程语言:入门(免费PDF)

为了提高开发人员的工作效率,Facebook工程师开发了开源工具,例如Python静态类型检查器Pyre,Instagram用来分析其服务器代码库。Instagram工程师还创建了开发人员工具,例如LibCST,用于分析Python代码。

Instagram工程师的主要目标是在大规模使用Python时尽可能地提高生产力,他们已经揭示了使用该语言时如何克服“一些痛点”。

该公司还希望吸引新的人才,即使编码人员不一定是Python专家,这也是为什么它想向编码候选人解释其如何创建工具来帮助他们提高生产力。

它还希望让喜欢使用Python的开发人员满意,因此该公司正在将Python推向极限。这就是Instagram工程师为Python开发“严格模块”的原因。

“一个合理的选择可能是,我们将Python扩展到了预期之外。它对于较小的代码库上的小型团队非常有用,这些团队可以围绕如何使用它保持良好的纪律,而我们应该改用一种不太动态的语言。” Instagram工程师卡尔梅耶(Carl Meyer)写道。

“但是我们已经超出了甚至可以进行重写的代码库大小的角度。更重要的是,尽管有这些痛点,但我们仍然希望Python拥有更多优势,并且总体上,我们的开发人员喜欢在Python中工作。我们要弄清楚如何使Python在如此规模下工作,并随着我们的成长而继续工作。” Meyer写道。

他解释说Python非常适合快速迭代,因为您可以进行更改并查看结果,而无需编译代码。

他写道:“但是,有了几百万行代码(以及混乱的依赖图),这种优势就开始变糟了。”

Instagram服务器最多需要一分钟才能启动,这在测试新功能时转化为严重的延迟,并且足够长的时间使开发人员无法完成另一项工作而无法完成任务。

尽管Python可以加快开发速度,但要在Instagram规模上使用它仍然存在挑战。

“由于导入可能会产生任意副作用,因此没有安全的方法(在Python中)递增地重新加载服务器。无论更改有多小,我们每次都必须从头开始,导入所有这些模块,然后重新创建所有这些模块。类和函数,重新编译所有这些正则表达式,等等。”

“通常,自从上次重新加载服务器以来,99%的代码都没有更改,但是无论如何我们都必须重做所有缓慢的工作。”

Instagram在大规模使用Python方面的挑战反映了Salesforce在其Einstein Analytics产品上遇到的一些困难。Salesforce最近取消了Python代码,转而支持Google支持的Go或Golang。

Salesforce架构师解释说:“ Python非常适合快速编写更高级别的应用程序,但并不总是能够提供企业级所需的高性能。”

SEE:Salesforce:为什么我们在Einstein Analytics中放弃Google的Go语言使用Python

就Instagram而言,Meyer补充说,这不仅会损害开发人员的工作效率,而且会导致“大量生产中的计算浪费”,因为Instagram不断在生产服务器上部署和重新加载网站。

Meyer将“严格模块”描述为Instagram在大规模生产环境中使用时对Python弱点的回答

“严格的模块对模块顶层可能发生的事情施加了一些限制。所有模块级代码,包括在模块级调用的装饰器和函数/初始化程序,必须是纯净的(无副作用,无I / O)。这已验证通过抽象解释器静态地在编译时进行,”他说。

“这意味着严格的模块在导入时没有副作用:导入时副作用之间的不良相互作用不再可能。”