作者丨Nick Heath
译者丨无明
策划丨小智
1994 年末,一群来自美国各地的程序员聚在一起,讨论他们的新式秘密武器。
这是 Python 有史以来的第一次研讨会,有 20 多名开发者参加,Barry Warsaw 是这些与会者当中的一员。他回忆起那些早期 Python 用户的兴奋之情:
“我记得有一个人说,‘你不要跟别人说我来参加这个研讨会,因为使用 Python 就像拥有了某种竞争优势’。在他们看来,Python 就是他们的秘密武器,不是吗?”
在早期的 Python 研讨会上,Warsaw 就曾说过,Python 提供了一些东西,让代码编写变得更加简单,更容易完成编程任务。
他回忆道:“当我第一次接触 Python 时,我就知道它有一些特别之处。Python 的可读性不错,编写 Python 代码变成了一种乐趣”。
如今,人们对 Python 的热情已经远远超出了最初的开发者圈子。一些人预测,随着 Python 用户群的快速增长,它很快会成为世界上最流行的编程语言。每天有数以百万计的人使用 Python,用户群呈现出指数级的增长,几乎没有出现下降的迹象。
不管是专业的还是业余的开发人员,他们都在使用 Python 处理大大小小的任务,特别是 Web 开发人员、数据科学家和系统管理员。今年出现的第一批黑洞图片就是用 Python 拼接出来的。
Python 在一些世界知名的组织中扮演着关键角色,比如,Netflix 用 Python 向全球 1 亿多户家庭提供流媒体视频,Instagram 用 Python 实现图片分享,NASA 借助 Python 来探索太空。
从某些方面看,Python 的崛起就像那个英国喜剧团体(Python 因这个喜剧团体而得名)一样不寻常。在 Python 自己的领域,这门编程语言也变得越来越出名和越来越有影响力。
Python 原先是荷兰程序员 Guido van Rossum 的一个个人项目。20 世纪 80 年代末,van Rossum 在荷兰国家数学和计算机科学研究中心的 CWI 部门开发分布式系统。由于对已有的编程语言感到十分失望,他决定开发一门新的语言——一门既易于使用功能又强大的语言。
Python 之父 Guido van Rossum
对于外行来说,自己开发一门编程语言就像是“造飞机”一样,但当时 30 多岁的 van Rossum 在某些方面已经很有造诣。他花了三年时间与 CWI 的一个团队合作,一起开发了 ABC(一种解释型编程语言),他知道开发一个可以执行指令的解释器需要些什么,以及一门新的编程语言需要哪些语法构建块。
对于当时的 van Rossum 来说,使用仅有的几种编程语言完成任何一件事情都显得很困难。他正在开发的 Amoeba 分布式计算系统要求他使用 C 语言或 Unix shell,但这两种语言都有很大的局限性。C 语言要求开发人员自己手动管理内存,容易埋下潜在的 bug,而且还缺少可重用的代码库。开发人员想要完成日常任务,需要在每个新项目中重新发明轮子。Unix shell 存在另外一个问题——它虽然为日常任务提供了一些实用程序,但它们的运行速度太慢,无法处理复杂的逻辑。
这些语言对开发人员造成的限制如此之大,以至于在 van Rossum 看来,他自己创建的这门解释型语言——从 ABC 语言借用了一些特性——似乎是最好的选择。
van Rossum 回忆道:“我当时在想,为什么不自己开发一门语言呢?我完全可以借鉴 ABC 的一些想法,并将项目的规模缩小一些,把原先需要花三年时间完成的东西缩短至三个月内,让它变成我自己的个人项目。于是,Python 诞生了”。
1989 年末,van Rossum 开始认真地开发这门语言,并借用了他最喜欢的喜剧团体“Monty Python”的名字,又因为与蛇有关系,后来就有了那个盘绕的巨蟒的 logo。
他说:“当时我的社交生活并不丰富。除了看电视就是写代码,有时候也会同时做这两件事”。
虽然名义上 van Rossum 是为了更好地完成日常工作而开发 Python,但他承认他的动力更多的是来自于自己开发一门语言所要面临的挑战。
他说:“当时我也不知道 Python 是否真的会让我的工作变得更有效率。在某种程度上,我真的很喜欢这种可以自己完成一个大项目的想法,并且可以按照我想要的方式来设计和实现。在我看来,编程是件有趣的事情”。
对于一般人而言,自己开发一门编程语言可能是件很不寻常的事情,但像 van Rossum 这样的例子并非独有。在 20 世纪 80 年代末,各种主要编程语言的出现都是因为当时有限的工具无法满足开发者的需求。Larry Wall 曾经说过,他之所以创建 Perl,是因为其他语言很难解决他的问题,而且他是一个“懒惰、不耐烦和狂妄自大”的人。类似地,为了找到可用于构建集成电路交互工具的语言才,John Ousterhout 设计了 Tcl。
三个月之后,van Rossum 做出了可运行的 Python 原型。
他说:“虽然现在的 Python 有很多在当时并不存在的抽象特性,但语言本身仍然始终如一”。
“那时,Python 已经具备了解析器和运行语言所需的基本组件。第一个可运行的 Python 程序放到现在仍然可以运行”。它们的函数定义是一样的,缩进是一样的,字典和元组的创建语法是一样的,交互式提示符也是一样的。
当他的两个同事开始使用这门语言处理日常任务时,van Rossum 并没有指望它会流行起来。因为他知道,在互联网时代到来之前,让一门编程语言流行起来有多么困难。
在今天,只需要点击几下鼠标就可以把一款软件分享给全世界,但在上世纪 80 年代,这是一件非常费力的事情。van Rossum 回忆起当时推广 ABC 遇到的困难:
“我记得大约在 1985 年,我第一次去美国度假。那是我第一次去美国,我的行李箱里装了一沓磁带”。
当时可用的通信方式只有电子邮件,而电子邮件并不适合用来传播源代码。他从电子邮件里拿到了对 ABC 感兴趣的人的地址和电话号码,然后挨家挨户送磁带。尽管他很卖力地给用户送磁带,都没能让 ABC 真正流行起来。
他说:“尽管 ABC 提供了很多优秀的特性,但我们在 ABC 的推广方面并没有取得很大进展”。不过,随着互联网革命进程的演进,Python 的推广工作变得容易得多,他不用再拖着装满磁带的行李箱到处跑了。
1991 年,van Rossum 通过 alt.sources 新闻组向全世界发布了 Python。这在当时基本上算是一种开源许可协议,比”开源许可协议“这个术语本身早了六年出现。虽然当时的 Python 解释器仍然需要将 21 个单独的部分连接成一个压缩文件,并需要连夜从 Usenet 网络上下载下来,但与几年前线下送磁带的方式相比,它仍然要高效得多。
他说:“我希望 Python 可以取得成功,毕竟之前我做的另一个东西基本上以失败告终”。
van Rossum 说,在很长一段时间之后,他才知道 Python 的用户群在增长。渐渐地,他意识到 Python 的发展势头正在形成,在与 Python 社区进行了一段时间的交流之后,他知道,Python 成功了。
“这个发现来得非常缓慢。在发布了第一个开源版本之后,我制定了一个新的发布周期,并与 Python 社区频繁交流。我们感觉这是一件很了不起的事情”。
Python 在 20 世纪 90 年代初期到中期开始受到关注,Python 的时代到来了,这让 van Rossum 感到震惊。
van Rossum 相信,被 Python 吸引过来的开发者,他们转向 Python 的原因与他当初创建 Python 的原因是一样的。他们需要一门高级的脚本语言,能够在易用性和功能之间取得平衡。他们希望能够结束在 C 语言中手动管理内存、在开始新项目时需要为重复任务重新实现代码的日子。
Warsaw 说,Python 在可用性和功能之间取得了平衡——在 20 世纪 90 年代早期,任何一门主流编程语言都没能提供这种平衡。”我写过很多 Perl、Tcl 和 C 代码,感觉它们一点都不好玩。Python 一出现,我就想,‘哇,它让编程变得更有趣了’”。
不管是过去还是现在,Python 提供的都是清晰而明确的语法,它使用缩进将代码分组成块,让开发人员更容易阅读和理解代码。
Gartner 公司的研发总监 Fintan Ryan 说,无论是现在还是在上世纪 90 年代,Python 清晰明了的风格都在吸引开发者方面起到了重要作用,尽管通过缩进来达到这种效果在开发者当中存在分歧。”Python 的语法非常简洁。你也可以在其他语言中实现缩进,但 Python 已经自动实现了。有些程序员喜欢这种缩进方式,有些则不喜欢”。
1994 年,Barry Warsaw 在第一次 Python 研讨会上
Python 强调代码的简洁和可读性,这并非偶然。van Rossum 曾公开表示,编程语言不仅要告诉计算机该做什么,还要便于在开发者之间传递思想。
Ryan 说,除了可读性之外,Python 很早就内置了一些通用的功能,这让 Python 从其他语言中脱颖而出。“你从一开始就可以使用某些功能,比如类和异常处理。Python 还提供了对 lambda、map 和 filter 等函数的支持,这些东西在很多情况下都非常有用”。
如果 80 年代末的主流编程语言能够再好一点,或许就不会给 Python 留有机会。van Rossum 开发 Python 的动机之一就是因为 Perl 与他在 CWI 工作时使用的 Amoeba 分布式计算系统不兼容。他说:“Python 的幸运之处在于 Perl 不能被移植到 Amoeba。如果 Perl 可以被移植到 Amoeba,我就不会想要自己去开发一门语言”。
尽管 Python 在发布后吸引了一批铁杆粉丝,但在 20 世纪 90 年代,Python 在编程语言方面仍然处于劣势。van Rossum 说,Python 的竞争对手是 Tcl/Tk 和 Perl,这两种语言的目标与 Python 是一样的,即简单易用且功能强大。
他说:“上世纪 90 年代,在前三大编程语言中,Perl 无疑是第一名,Tcl/Tk 是第二名,而 Python 则是第三”。
Stack Overflow 开发者报告显示,从开发者活跃度方面看,Python 是增长最快的编程语言,而 Perl 在缩水,它甚至都没有出现在最新的 Stack Overflow 开发者报告中。
下图显示了这种爆炸式的增长。近年来,Stack Overflow 网站上与 Python 相关的问题的增长速度远远快于其他编程语言。
那么,Python 是如何超越昔日的竞争对手的呢?又如何解释这两门语言之间截然不同的命运呢?van Rossum 认为,这与代码库在达到一定规模后的维护难易程度有关。他说,“从人们的经验来看,Perl 适合用来编写行数较少的脚本,但如果你的主干代码超过了 500 行,除此之外还有数千行分支代码,那么在 Perl 中维护这些代码就需要遵循很多原则。而在 Python 中,你不需要遵循那么多原则,代码仍然具有很好的可读性和可维护性”。
Python 一方面简单易用,一方面又健壮到可以用来开发大型的应用程序,这两个因素的组合正是 Python 在上世纪 90 年代取得成功的原因。
“一些互联网开发者想要开发越来越大型的应用程序,而且他们意识到用 Python 开发应用程序要比用 C 语言、C++ 或 Java 容易得多”。
随着 Python 在 20 世纪 90 年代逐渐流行起来,当时还在 CWI 工作的 van Rossum 发现他创造的这门编程语言越来越多地把他与来自世界各地的人联系在一起。
20 世纪 90 年代中期,Python 出现了新的应用场景,从音频录制和播放到首次涉足 Web 开发,而 Web 开发后来成为 Python 的主要应用场景。
van Rossum 说,“Web 开发很重要,它对我来说也是一件非常有趣的事情”。Python 开始与 Perl 和 Shell 脚本一起被用于 Web 服务器后端开发。“你可以创建动态网页,这也是我最喜欢的 Python 应用场景之一”。
Gartner 公司的 Ryan 说,上世纪 90 年代,Python 之所以能够在开发人员当中流行起来,主要是因为它可以用来快速地创建强大的脚本。“作为一门功能非常强大的脚本语言,它降低了很多用户的使用门槛”。
Ryan 还说,这门语言非常灵活,容易上手,因此吸引了很多具备不同程度技术专长的用户。他说:“系统管理员使用 Python 进行系统自动化,开发人员利用了 Python 的函数式编程特性和类继承特性,而 Perl 在这方面的能力则要弱得多。Python 的准入门槛很低,在人们熟悉了这门语言之后,他们的工作很快就会变得高效起来”。
1994 年,Python 引起了 Michael McLay 的注意。McLay 当时在美国国家标准局(NBS)担任高级职位,现在在美国国家标准与技术研究所(NIST)。McLay 当时在想如何也让国家统计局的科学家们从 Python 的易用性中得到一些好处。在 van Rossum 看来,国家统计局的科学家们“需要处理大量数据,但他们都不擅长编程”。
为了在 NBS 中推广 Python,McLay 邀请当时还在荷兰 CWI 工作的 van Rossum,让他到 NIST 做了两个月的客座研究员。这一举动成了 Python 未来发展的催化剂,也是 van Rossum 人生的一次重要转变。
van Rossum 和 Warsaw、Roger Masse 在第一次 Python 研讨会上
正是在这个时候,他们在国家统计局的办公室里举行了第一个 Python 研讨会。van Rossum、Barry Warsaw 和其他早期的 Python 爱好者聚在一起,分享他们正在用 Python 做什么,以及对 Python 未来发展的期望。
也就是在这间办公室里,van Rossum 认识了 Bob Kahn。Kahn 是 TCP/IP 协议的作者。
那次会面给 van Rossum 带来了一份工作邀请——与 Kahn 一起在美国国家研究创新联合会 (CNRI) 工作。CNRI 是一个位于弗吉尼亚州的非盈利研究组织,专注于网络技术的战略发展和研究。
就像 Python 满足了人们对新型编程语言的期待一样,在收到这份工作邀请时,van Rossum 刚好对自己在 CWI 未来的工作充满了焦虑。
他说:“CWI 更像是一个学术机构,他们给了我某种‘温柔’的压力,我要么听他们的话去攻读博士学位,要么到别处找工作”。
“当时我 35 岁了,攻读博士学位对我来说没有太大吸引力。之前因为 Python 的流行给我带来了一些新的可能性,但在经过了一些电话沟通和思考之后,我决定放弃这些机会。我更喜欢 CNRI,喜欢他们提供给我的条件,喜欢这个项目,所以我去了 CNRI”。
正是在 CNRI, van Rossum 在一群 Python 爱好者的帮助下,将很多用于管理 Python 语言的结构组合在一起。在 1995 年 4 月加入 CNRI 后,van Rossum 领导了一个小型的开发团队,开发一个叫作 Knowbot 的程序,它是一种移动代理,运行在分布式计算机系统上。
这个团队使用 Python 作为开发语言,Jeremy Hylton、Roger Masse、Barry Warsaw、Ken Manheimer 和 Fred Drake 等人也加入进来。这些人后来都在 Python 社区里扮演了重要的角色。
van Rossum 说:“我们组建了一个由 4 到 10 人组成的团队,大多数人在 CNRI 工作。他们都是 Python 语言的核心开发人员”。
这个团队创建了 python.org 网站,搭建了用于管理代码库变更的 CVS 服务器,以及用于改进和维护 Python 语言的”Python 特别兴趣小组“邮件列表。
自 1991 年 Python 公开发行以来,Python 用户群有了显著的增长。到了 90 年代后期,Python 吸引了大量来自全球各地的用户。在此期间,随着 Python 软件基金会(PSF,于 2001 年正式成立)前身的组建,Python 语言的管理工作开始走向规范化。随着社区的发展,两年一度的 Python 研讨会逐渐演变成更大型的年度活动,并最终演变成 PSF 的年度 PyCon,直到今天仍然很受欢迎。
到了 21 世纪,Python 用户群越来越壮大,早期的 Python 用户担心如果 van Rossum 发生意外会对 Python 造成什么样的影响。
不管怎样,van Rossum 继续扮演着 Python 的核心角色。他就是 Python 的核心,这种想法从未消失,有人称他是 Python“仁慈的终身独裁者”(BDFL)。这个半开玩笑式的头衔流传了多年。
van Rossum 说:“在很长一段时间内,我承受住了压力,还培养出了项目管理技能。我将很多事情委派给别人,让他们按照自己的想法做事”。
Gartner 公司的 Ryan 说,让语言的创建者同时充当语言管理者的角色,这并非什么新鲜事。他还引用了 Perl 作者 Larry Wall 和 Node 作者 Ryan Dahl 的例子,不过他说 van Rossum 在 Python 管理工作上表现出的公平性是值得称道的。
他说:“人们普遍认为 van Rossum 在项目方向和总体管理方面做出了非常好的平衡。”
实际上,van Rossum 确立的 Python 开放本质(在社区核心开发者之间公开讨论)是 Python 成功的决定性因素。
在这期间,Python 有了飞跃式的发展。2008 年,Python 3.0 发布,让 Python 成为一门现代化的编程语言。近来,Python 的管理方式也发生了重大变化。
这些变化是去年发生的,当时 van Rossum 卸掉了 BDFL 的头衔,原因是人们对 PEP572 中引入的赋值表达式存在分歧。
虽然赋值表达式的引入是为了更高效地编写代码,但 van Rossum 在网上遭到了反对者的严厉批评,一些人认为这一提案会降低代码的可读性和可维护性。
van Rossum 说,虽然他已经习惯了围绕新功能而展开的争论,但这次有人诋毁他,他们的态度十分强硬,甚至有人对他进行人身攻击,所以他决定辞职。
他说:“那些在技术上持不同意见的人在社交媒体上开始抱怨我破坏了 Python 的决策流程,或者说我犯了一个严重的错误。我感到非常失望,我感觉受到了来自背后的攻击”。
“过去,在决定是否要对 Python 做出变更或改进时,一群核心开发人员会讨论这件事的利弊。他们会得出一个明确的共识,如果结果不明确,我会在脑子里反复考虑,然后做出决定。在 PEP572 这个提案上,尽管它存在争议,但我还是选择了“是的,我想做这个”,但人们并不买账。
“这并不是一种反叛,但我觉得我没有得到核心开发者社区足够多的信任”。
他认为,Python 的争议方式之所以发生变化,部分原因在于现在有太多的人使用 Python。
“Python 社区的规模越来越大,这可能也是原因之一。当然,要达成任何形式的共识都很困难,因为不管你做出什么样的决定,总会有一些持不同意见的人”。
Python 核心开发者 Mariatta Wijaya
今年早些时候,负责维护 CPython 解释器的核心开发人员成立了一个指导委员会,用来监督 Python 未来的发展。成员包括 van Rossum、Warsaw 以及其他核心开发者 Brett Cannon、Carol Willing 和 Nick Coghlan。
Warsaw 说,当一门编程语言的用户群以如此快的速度增长,使用这种方式来管理语言的发展是很有必要的。
他说,“我认为 van Rossum 真的把所有事情都扛在自己的肩上了”。
“25 年前,当 Python 还只是一门小众编程语言的时候,社区规模也小得多,van Rossum 可能还能自己扛,但即使是这样,他一个人的工作量也很大。我认为,考虑到他个人的健康以及社区的参与度问题,将这些重担分摊到五个人身上会更好”。
Warsaw 说,在每发布一个 Python 新特性版本后都会进行一次指导委员会选举,为建立下一代 Python 语言核心领导层做好准备。
他说:“如果 Python 在 25 年后还能保持常青,那时候应该不是 van Rossum 和我在管事了”。
指导委员会的成立也受到了 Python 核心开发者社区的欢迎。核心开发人员 Mariatta Wijaya 说,这一举动感觉像是朝着正确的方向迈出了一步。她说:“对我来说,指导委员会比让一个人决定所有事情要好得多——这是一个巨大的责任和负担。这是一个好迹象,它意味着社区将会有更多的输入”。
虽然 Python 继续以惊人的速度吸引新用户,但社区内的一些人也看到了未来要面临的挑战。如果 Python 想要保持常青,就要不断进化。
在今年的 Python 语言峰会上,BeeWare 联合创始人 Russell Keith-Magee 说,如果对移动和 Web 平台的支持得不到改善,Python 将面临“生存危机”。
他说:“手机和平板电脑对市场的渗透程度是台式机和笔记本电脑从未达到过的,但整个社区都没有一个关于如何在这些设备上使用 Python 的案例。那么,当有一天笔记本电脑逐渐成为小众设备时,Python 又将面临怎样的窘境?”
他指出了 Python 的一些问题,比如,Python 还不支持在非 x86 硬件平台上编译代码,Python 的测试套件很容易在移动和 Web 平台上崩溃,Python 应用程序的体积太大,在 Android、Windows 和 Web 平台上开发 GUI 代码时需要使用 asyncio 库,而这需要做额外的工作,标准库中的很多模块与 CPython 之外的解释器不兼容。
Warsaw 说,Keith-Magee 提出了很多很好的观点,并认为 Python 需要与新的平台——手机、平板电脑以及 Web 技术(如 WebAssembly)保持接轨,这点很重要。
Warsaw 说,“目前 Python 在这方面并没有出彩的表现”,他希望 iPhone 或 Android 手机也能下载到使用 Python 开发的应用程序,而用户甚至都不知道“原来它们是用 Python 开发的”。
现代处理器芯片的核心数量在不断增长(英特尔最新的服务器处理器核数已经达到了 48 个),Warsaw 也希望 Python 能够更好地让任务运行在多个处理器核心上。
他对 Eric Snow 在 Python 子解释器方面所做的工作十分感兴趣。他说:“我希望看到有更多的处理任务能够利用多核处理器”。
Snow 正在参与一个长期项目,这个项目旨在让 Python 更容易地在多个处理器核心之间分配任务。他使用了现有 Python 子解析器的修订版本,并改变了子解析器与全局解释器锁(GIL)之间的交互方式。
Warsaw 说:“这些功能不会出现在 Python 3.8 中,但或许会在 3.9 中加入。我觉得我们将在未来两到两年半的时间内看到这些功能。我真的很高兴 Eric 能够继续做下去,这是一项非常重要的工作”。
他说,之前有过一些失败的项目(比如 Gilectomy,旨在让多线程 Python 应用程序运行在多个核心上),但这些项目给我们上了有趣的一课,让我们知道 Python 如何能更好地在多个核心之间分配工作负载。
Python 社区正在对标准库进行现代化。最近发布了一项提案,建议将过时的模块从标准库中移除。Python 的标准库通常被认为是 Python 的优势所在,因为它被用来处理很多常见任务,这也就是为什么人们都说 Python 有“内置电池”。但在今年的 Python 语言峰会上,有人提出了这样的一个问题:如果人们能够从 PyPI 自行选择模块,而不是使用内置的标准库,这样是否会更好?
还有一个问题是,Python 指导委员会的成员组成能否更好地反映 2019 年 Python 用户群的多样性?
Wijaya 说:“我希望指导委员会能够具备更好的多样性,不仅在性别方面,还有种族等方面”。
“在 PyCon 大会上,我与来自印度和非洲的 PyLadies 成员进行了交谈。她们说,‘当我们听到有人说到 Python 或 PyLadies 时,我们想到的是北美或加拿大人。但实际上,其他国家有更大的 Python 用户群,为什么不去多关注一下他们呢?‘我认为她们说得很有道理。所以,我希望看到这种情况发生,我认为我们都需要尽自己的一份力量。”
Warsaw 说,尽管有一个“仁慈的独裁者”在掌管一切,但近年来,有很多有关 Python 发展的理念来自于社区。
他说:“这些想法真的是从社区中冒出来的,而不是自上而下推行的。”
简单的社区项目也能对 Python 产生巨大影响。比如,类型提示功能,Python 3.5 的一个特性,灵感来自于 2012 年一位博士生发起的 mypy 项目。类型提示可以执行可选类型检查,帮助开发人员发现某一类 bug,避免让这些 bug 渗透到程序中。
mypy 项目链接:http://mypy-lang.org/
当有一群人同时开发一个大型的代码库时,这个额外的安全层就会非常有用。
Warsaw 说,“在我看来,这样可以让 Python 渗透到更大的组织中(比如 Instagram 基本上都在使用 Python 3)”。
此外,asyncio 是另一个社区在驱动 Python 发展的例子。
asyncio 链接:https://docs.python.org/3/library/asyncio.html
随着指导委员会的成立和空前的用户群增长,van Rossum 乐观地认为:“由社区驱动的 Python 进化”将继续取得“无与伦比的成功”。
他说,”一个拥有坚实的核心开发者的社区,现在有了一个新的管理制度,我想我们为 Python 语言的进化做好了更充分的准备”。
Warsaw 说,如果有人怀疑 Python 社区是否有能力继续为 Python 找到新的应用场景,那就让他们看看使用 Python 捕捉的第一张黑洞图片。
“Python 社区中总有那么一些人,我把他们看成是疯狂的 Python 科学家。他们总是在想,今天能把它做成这样,那么明天能不能走得更远?”
原文链接:
https://www.techrepublic.com/article/python-is-eating-the-world-how-one-developers-side-project-became-the-hottest-programming-language-on-the-planet/
点个在看少个 bug ?
文章评论