5千万的 Twisted 下载量是不会错的
你知道的——能有5千万下载量的任何东西肯定是很不错的。但是,当查看Twisted的下载量时,确实有些地方出了问题——即使它已经有超过5亿的下载量。
在2019年Python语言峰会上,有人告诉我应该放弃对Python 2的支持。
“Van Rossum认为,如果Twisted团队想让生态系统进化,他们应该停止支持旧的Python版本,并强迫用户升级。Brown承认这一点,但是他说有一半Twisted用户仍然在使用Python 2,抛弃他们是艰难的。
我认为有必要仔细研究一下为什么很难放弃他们。
关于统计数据和其他谎言的简短说明
我说的是“一半的Twisted用户”。这可能夸大或低估了实际数字,我们很快就会看到。我使用PyPI下载量作为一个采用的指标,因为Twisted不会自动通报,而且我也无法知道诸如Twisted的Debian或Red Hat包之类的东西的相对渗透率。
这是不幸的,但我可以对发行包的用户做一些假设:
- 有些人可能在使用一个使用了Twisted的应用程序,他们并不算我所说的“用户”,因为我是在计算开发人员(库的用户),而不是最终用户
- 几乎可以肯定,他们使用的是不支持Python3的旧版本,所以我们可以假设他们通常是Python2的用户。
- 他们是几年后才会看到当前版本影响的用户,所以对新版本的采用肯定会落后。
因此,我们可以从这样的假设开始,:使用发行版打包的Twisted的任何Twisted用户更有可能都在使用Python 2,并据此估计对我们的结论进行加权。
分析下载次数
PyPI发布了下载统计数据。如果我们查看一个合理的样本集(过去30天的下载次数),我们会得到一些有趣的数字:
我们可以清楚地看到,Python 2.7是Twisted最流行的平台,其次是Python 3.6和Python 3.7。Python 3.4(当前版本不支持的一个Python版本)和Python 3.5正在被淘汰,但是这些旧平台的用户数量仍然有当前Python稳定版本的一半。Python 3.8(目前处于beta版)实际上是一个舍入错误(正如预期的那样)。
Python3版本的总下载量只有Python2.7单个版本下载量的一半多。
这些版本采用数字看起来相当可怕,但并不能说明全部情况。如果我们看看特定的版本呢?
Libraries.io指出Twisted的前两个固定版本是17.9.0和13.2.0(我的第一个RM版本!)。如果我们查看这两个版本以及当前版本 (19.2.1—因为它发布还没有30天,所以我将查看19.2.0) 的统计数据,我们就会发现一些有趣的数字:
注意: "%占比"是Twisted版本在过去30天的下载占比。
Twisted在过去30天内的安装情况显示了那些使用新Twisted版本,也使用新Python版本的人。不过,目前相当一部分Twisted用户仍然使用Python 2.7。
尽管情况正在改善(在当前的Twisted版本是18.9时,Python 2.7的下载量约有47%),但Python 2用户仍然是Twisted安装基础的重要组成部分。可以这样说,Twisted不需要担心总下载量的66%,而我们实际上应该关注19.2版本的37%——但是37%仍然是一个令人担忧的数字。
Twisted 是长尾理论
Twisted还没有完全移植到python3。这有几个原因——开发人员的时间、开发人员的兴趣和可行性。
开发人员的时间不是自由的。Twisted目前几乎完全是一个志愿者项目,只有几个小时的带薪时间,人们才能证明雇主在代码库上的花费是合理的。对许多雇主来说,很难创建一种事例使Twisted能在所有的Python3平台上运行,所以就选择Python2.7。它可能并不漂亮,也没有语法上的细微差别,但是结合了一个已建立的Twisted代码库(这已经为在Python 2中可靠地实现它付出了代价),它也可以正常工作。在async/await之前,还没有任何“杀手级特性”能够吸引Twisted用户使用Python 3。这只意味着更多的工作(因为即使是Unicode-clean的代码库也需要花费很多人的时间来进行移植)和更慢的运行时。
即使在今天,一个Python 2 + 3兼容的Twisted应用程序(如Synapse)从Python3获取的唯一的好处也只是灵活的字符串表示(在处理Unicode时节省内存),而且Python 3对迭代器的普遍使用 (主要指的是标准库中的改进变得lazy,而不是你自己的代码)。当然,这很好,但是渐进式的改进并不是你获得升级的方式。
Twisted本身也花了很长时间才得以移植,这在库的生态系统中产生了一个连锁反应。Python2到3的升级从来没有在Twisted中起过作用,直到Python 3.3(2012年—— 3.0版本四年后),对Twisted向一个2+3兼容的代码库的开发才开始。即使在我的努力下(从2013年开始),也直到2016年或2017年Twisted才能够被合理地移植到许多应用程序中。有些部分(如IRC支持)还没有被移植,这意味着使用它的软件在移植过程中会被进一步推迟。
要做些什么?
当前存在的问题将Twisted置于一个有趣的状况中。
我们基于Python 2.7的用户群可能不会很快迁移到Python 3。只要发行版提供了Python 2.7,那Python 2 的结束支持日期就只是象征性的,对于许多应用程序来说,把精力放在对已经运行且运行良好的东西的移植上可能根本不值得——即使移植在理论上很容易。这意味着Twisted需要应对采用Python 3的长尾问题。
Van Rossum的评论有几分道理。这些用户升级的唯一方式是被迫升级。我担心他们不会升级到python3,他们会“升级”到Go、Rust或其他一些语言。我过去几年的个人经验是,这种情况比人们想象的要普遍得多。许多公司都愿意投资于用一种更好的语言进行全新重写的可能性,而不愿意支付现有软件的迁移成本。尽管我们知道重写几乎总是毫无意义的愚蠢行为,但它仍然在发生。我宁愿不把这个最后通牒强加给我的用户,因为他们最终可能不会添加到生态系统中,而是会因为一开始就决定使用Python而感到痛苦。
因此,我觉得Twisted需要采用从Python 2迁移过来的一种减少危害的方法。
我在Twisted邮件列表中发布了一个建议,详细说明了我对这样一种方法的建议。它假设Python 2的用户是其它领域的长尾用户,不太可能采用新特性,因此发布一个针对2.7的最终版本(可以单独修补)可能是一个选项。
我知道社区中有几个人(例如Glyph:)反对发布一个Twisted的长期支持版本,可能说的就是目前这种情况。但是,如果我们不能完全放弃对Python 2.7的支持,那么一个“LTS”版本的维护负担最终可能会比在当前的Twisted版本中保持对Python 2.7的兼容性要低。
但是,最后……
作为一个开源维护者,很难说我对那些使用我的软件的人没有什么责任。也许这种责任感是错误的,Twisted维护者应该停止维护那些到目前为止对开始学习用Python编程来说已经太旧的软件。这使得维护者很难决定是否将用户抛弃(即使他们确实应该升级),特别是那些可能没有可行的升级选项的用户。
无论如何,这些个人情感都无关紧要。我只是一个发布经理,而不是整个Twisted团队——并且我们一致认为现在还不是抛弃Python 2.7的时候。无论我们怎样做到这一点,我们的用户付出的代价仍然太大。
英文原文:https://atleastfornow.net/posts/py2-py3-twisted-downloads/
译者:Nothing