Python-访谈-全-

Python 访谈(全)

原文:zh.annas-archive.org/md5/af908d582205b575e5ca5218cdcc514d

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

在 2016 年年底,我和我的编辑一起头脑风暴,讨论哪些类型的书籍可能会引起人们的兴趣。我一直在我的博客上写一系列名为 PyDev of the Week 的文章,这激发了我们基于采访 Python 社区核心成员来编写一本书的想法。我花了一些时间列出了 20 个我认为适合这本书的人名,然后在 2017 年开始联系他们。

在大约 8-12 个月的时间里,我最终采访了 20 位 Python 社区的支柱人物,尽管在这段时间里我的名单改变了好几次。有些人不可用或无法联系上。但我坚持不懈,并设法聚集了一组全面代表 Python 编程社区的代表性人物。

在这本书中,你将了解到关于 Python 及其创造者,如 Brett Cannon 和 Nick Coghlan 的历史趣闻轶事。你会发现为什么 Python 在其首次发布时没有 Unicode 支持,你还将听到核心开发者关于他们认为 Python 未来会走向何方的看法。你还将听到一些著名的 Python 作者,如 Al Sweigart、Luciano Ramalho 和 Doug Hellman 的观点。

我还与一些 Python 中流行的第三方包的创建者或核心开发者进行了交谈,例如 web2py(Massimo Di Pierro)、SQLAlchemy(Mike Bayer)和 Twisted 框架(Glyph Lefkowitz)等。

我与 Carol Willing 的采访非常有趣。她也是 Python 语言本身的核心开发者,因此了解她对技术和 Python 中女性的看法非常启发人心。她也是 Project Jupyter 的贡献者,因此了解更多关于这个项目的内容非常令人兴奋。

我认为你将发现 Alex Martelli 和 Steve Holden 的采访特别引人入胜,因为他们已经与 Python 合作了很长时间,并且有很多有趣的见解。

从我所交谈的所有个人那里都有很多可以学习的地方。如果你认识他们,你甚至比我了解得更好。他们都非常乐于交谈,即使在最短的时间内也非常响应我的请求。如果你在会议上遇到他们,一定要感谢他们的贡献。

特别感谢所有接受我采访的人。他们抽出时间帮助我完成这个项目,我真心感激。我还想感谢我的编辑们,他们使这个项目保持正轨。最后,我想感谢我的妻子 Evangeline,她忍受我在整个夏天随机时间采访人。最后,我想感谢你,亲爱的读者,感谢你阅读这本书。

第一章。布雷特·卡农

布雷特·卡农

布雷特·卡农是一位加拿大软件工程师和 Python 核心开发者。他是微软的主软件工程师,在那里他从事编辑工具的开发工作。他之前的工作包括谷歌的软件工程师和 Oplop 的创始人。布雷特于 2003 年成为 Python 软件基金会(PSF)的会员,并在 2013 年至 2014 年间担任 PSF 的董事。他曾是 PyCon US 委员会成员,并担任 2017 年 PyData 西雅图会议的主席。布雷特领导了 CPython 迁移到 GitHub,并创建了 importlib。他的开源成就包括 caniusepython3,并且他是 17 个成功的 Python 增强提案 的合著者。

讨论主题:核心开发者、v2.7/v3.x、Python 疆场。

在这里了解布雷特·卡农:@brettsky

迈克·德里斯科尔:你为什么成为了一名计算机程序员?

布雷特·卡农:从我能够记事起,我就一直对计算机很感兴趣。我很幸运,能去一所小学,那里有一个装满了苹果 II 电脑的计算机实验室,当时那可是尖端技术,所以我相对较早地接触到了它们。

在初中和高中的那一年之间,我在夏天上了一个计算机课程,其中包括一点苹果 BASIC。我做到了,并且做得很好,以至于我认为我在第一周就完成了整个课程。在那个阶段,我还没有真正意识到我可以把它作为一份工作来做。

这种情况一直持续到高中,然后到了选择大学课程的时候,我的妈妈让我答应她两件事。我同意我会上一门哲学课和一门计算机编程课。所以我就这样做了,并且我都很喜欢。

我再次在最初的两个星期里读了我的 C 语言入门书,它原本应该持续整个学期。我记得我第一次读完它的时候,我在课后的一天就坐下来实现了井字棋。我甚至忘了吃晚饭!那真是一个那种“啊哈”的时刻。这种工具提供的无限创造力的感觉让我完全沉浸其中。这就是我进入编程的原因。

布雷特·卡农:“这种工具提供的无限创造力的感觉让我完全沉浸其中。这就是我进入编程的原因。”

我知道井字棋是一个已解决的问题,所以我认为我可以编写逻辑,这样我就可以编写一个程序来完美地玩井字棋。我花了大约六个小时的一个晚上来做这件事,我完全震惊于我竟然真的做到了。这打开了计算机能做什么的可能性,以及它的自由和解决问题的能力真的吸引了我。从那以后,我就一直在做这件事。

德里斯科尔:是什么让你如此深入地参与到 Python 及其社区中?

坎农:嗯,我最终去了伯克利,获得了哲学学位,但我一直上计算机科学课程。伯克利的计算机科学入门课程有一个入学考试,我担心我不懂面向对象编程,因为我只知道 C 语言。所以我四处寻找面向对象编程语言。我发现了 Python,学会了它,爱上了它,并且一直在用它编写个人程序。

在某个时候,我需要time.strptime函数,它可以将表示datetime的字符串解析回时间元组。当时我在 Windows 上,Windows 上没有time.strptime。因此,我想出了一个方法来解析它,你仍然需要输入区域信息,但它仍然可以解析。

当时,ActiveState 的食谱网站仍然存在,所以我把我如何实现strptime的方法发到了 ActiveState。后来,O'Reilly 出版了第一版《Python 食谱》,亚历克斯·马尔蒂利将这个食谱作为书中的最后一个食谱,这恰好也是书中最长的食谱。

布雷特·坎农:'所以我把我如何实现 strptime 的方法发到了 ActiveState。'

然而,人们必须输入他们的区域信息仍然让我感到不快。我因为无法解决这个问题而感到沮丧。所以在我心里,我一直在想如何获取这些区域信息。最终,我解决了这个问题。实际上是在我从伯克利毕业后的一周,我给自己留出了时间来整理解决方案,这样你就不必再输入区域信息了。

在我做了那之后,我给亚历克斯·马尔蒂利发了邮件,因为我们那时已经交换过几次邮件了,我说:“嘿,我已经修复了这个,不再需要输入区域信息了。我怎么才能让这个信息传上去?”亚历克斯·马尔蒂利说:“哦,你只需将这个补丁发送到 Python-Dev 邮件列表。”

布雷特·坎农:'亚历克斯·马尔蒂利说:“哦,你只需将这个补丁发送到 Python-Dev 邮件列表。”'

因此,我给列表发了邮件,我认为是 Skip Montanaro 第一个回复的。Skip 只是说:“是的,那太棒了,只需上传文件,我们会处理它并接受它。”我觉得那太棒了。我能够为这个项目和这种语言做出贡献,我认为这真的很有趣。

布雷特·坎农:'我能够为这个项目和这种语言做出贡献,我认为这真的很有趣。'

所有这些都是在本科和研究生之间的一年空档期发生的。我试图进入计算机科学研究生院,我知道我需要更多的编程经验,而不仅仅是上课。我认为我可以为 Python 做出贡献并帮助他人。当时我有很多时间,所以我决定我要参与进来。

布雷特·坎农:'我决定我要参与进来。'

我加入了邮件列表,并四处闲逛提问。然后在同一年,我提出开始承担 Python-Dev 总结的工作,那时它已经停止了。我再次认为我有时间去做这件事,我意识到这是一个让我学习的好方法,因为它迫使我阅读 Python-Dev 中的每一封单独的邮件。

一个有趣的副作用是,我能够了解到任何没有人有时间去处理的小问题,所以我几乎总是比其他人更早看到出现的问题。我能够非常容易地挑选出小问题来修复和学习,而且我能够持续这样做。

在 Python-Dev 总结的幌子下,我能够提出越来越多的问题。

在某个时候,我了解得足够多了,我就在 2003 年的第一次 PyCon(至少是第一次被标记为 PyCon 的会议)之后成为了核心开发者。那时我上瘾了。我认识了团队,那些人已经成为我的朋友。我非常喜欢它,这很有趣,所以我坚持了下来,自从那时起我从未真正停止超过一个月。

https://wiki.python.org/moin/GetInvolved

这并不意味着你必须成为核心开发者才能进入 Python 社区。只要你喜欢,你就可以以任何对你有意义的方式参与其中。

Driscoll:那么是什么让你决定开始写博客并撰写关于 Python 的文章?

Cannon:写博客是参与其中的方式之一,因为我喜欢写作,这种媒介恰好符合我喜欢的沟通方式。我是在很久以前开始的,而且自那以后我基本上一直坚持这样做。我总是享受将知识尽可能好地传授给世界这一方面。

Driscoll:在正确的时间进入 Python 是否很重要?你推荐在项目早期就加入吗?

Cannon:是的,那是一种我恰好在正确的时间和地点,并且有足够的空闲时间开始的情况。我设法在有时间贡献尽可能多的时候开始了。

我也是在 Python 项目不是很大的时候开始的。我记得当我开始读硕士时,人们会问我业余时间做什么。当我说我为 Python 做贡献时,他们会回答,“是那个有空格的语言吗?”所以我已经做了很长时间。

因此,是的,我在一个理想的时间点参与了项目,在 2005 年左右人们对这种语言的兴趣激增之前。我有时希望我能够以某种方式更早地开始,但我会更年轻,所以这可能不起作用。所以当这一切都恰好在那时发生时,这真是偶然。

Driscoll:你积极贡献了 Python 的哪些部分?有没有一个模块是你帮助启动的,或者你在其中发挥了重要作用,比如datetime模块?

坎农:我的影响实际上是在time模块。我比datetime模块还要早!我最早编写的模块是 Python 2 中的dummy_threaddummy_threading模块。

那是那些有人站出来推荐它作为一件酷事来做的一个例子。他们说他们会去做,但过了一段时间,他们没有去做,所以我给他们发了邮件说,“嘿,你会去做这个吗?”他们说不会,但认为这仍然是一件有用的事情去做,所以我做了。这些是我第一次从头开始编写的模块。

我认为,到目前为止,我已经接触到了 Python 语言中的所有东西。我甚至接触到了解析器,这是非常少有人需要接触的。我想我在某个时候帮助编写了一些关于标记化问题的警告。我在编译器中发挥了重要作用,当我们从具体的语法树切换到字节码,然后再到正确的具体语法树,再到抽象语法树到 Python 的过程中。

布雷特·坎农:“我认为,到目前为止,我已经接触到了 Python 语言中的所有东西。”

杰里米·希尔顿开始了那个项目,吉多·范罗苏基本上给每个人下了最后通牒,因为这个项目已经花费了多年时间来完成。所以吉多说,“你有直到下一个版本发布的时间来完成这个。”

布雷特·坎农:“所以吉多说,‘你有直到下一个版本发布的时间来完成这个。’”

我介入并帮助杰里米完成了最后的一半工作。我还对warnings模块做了类似的事情。尼尔·诺比特开始实施它,但他有点偏离了项目,所以我接手并完成了剩下的工作。这就是我最终成为那些对warnings模块了解得有点过多的人之一的原因!

还有什么让我如此深入地参与到 Python 中?可能我最出名的事情是importlib。我编写了当前import的实现的大部分(Python 3.3 中的全部),然后尼克·科格兰和埃里克·斯诺随后给予了大量帮助,但整个importlib包都是我做的。这些是我直接从我这里来的,但基本上我已经接触到了每个地方。14 年后,我无法再跟踪了!

德里斯科尔:我知道你的意思。我讨厌当我遇到一些代码,我想,“这是谁写的,为什么它这么糟糕?”然后我想起我是在两年前写的!

坎农:是的,如果你能从六个月前阅读自己的代码并且它看起来仍然不错,那么可能有些不对劲。这通常意味着你还没有学到新的东西。

布雷特·坎农:“如果你能从六个月前阅读自己的代码并且它看起来仍然不错……这通常意味着你还没有学到新的东西。”

德里斯科尔:你认为成为 Python 核心开发者最好的事情是什么?

Cannon: 大概就是通过成为其中一员所建立的友谊。许多核心开发者都是我的朋友。

我们每年聚一次,我几乎可以和这些人一起度过一整周的 24 小时,一周的时间。这还加上我在这一年中在线与他们相处的时间。这可能比我花在许多朋友身上的时间还要多,因为你们有多少次能和好朋友一起度过一个完整的星期假期?

所以,说实话,现在主要是友谊。能够和这些人一起出去玩,向他们学习,享受我们所做的事情,并继续这样做。

我并不经常考虑 Python 的影响。有时候想到这一点会让人有些困惑,所以我尽量不去深想。我不希望因为这一点而形成任何形式的自我膨胀,所以我尽量不去过多地思考。如果我只是坐在这里,想着为这个被数百万开发者使用的语言工作,那确实是一种启发。能够说我在做这件事是很酷的,但主要还是关于和朋友们一起工作。

我仍然非常清楚地记得我第一次加入团队的时候,甚至更早的时候,当我加入邮件列表的时候,所以尽管人们说我是 Python 开发者团队中的这些高级领导之一,但我从未完全适应这个想法。我只是没有那样看待自己。Guido 曾经在一次谷歌的采访中被问及,“在 1 到 10 的尺度上,您认为您对 Python 了解得有多好?”他说 8 分。

'Guido 曾经在一次谷歌的采访中被问及,“在 1 到 10 的尺度上,您认为您对 Python 了解得有多好?”他说 8 分。’

没有人完全了解整个系统,因为这个程序太大了,不可能全部了解。我们都可以把基本语义记在脑子里,但并不是所有实际运作的复杂细节。有多少人像背书一样熟悉描述符或元类?我有时不得不查阅这些资料,所以没有人完全了解整个系统。

Driscoll: 那么,您如何看待 Python 作为一门语言的整体走向?您认为它在某些领域会变得更加流行,还是 Python 正像 C++一样进入遗产状态?

Cannon: Python 今天处于一个有趣的地位,几乎没有任何地方 Python 没有渗透成为主要玩家。当然,有一些领域,比如低级操作系统和内核开发,不适合 Python,但除此之外,感觉 Python 几乎无处不在。

我知道的一个地方,Python 在数据科学领域仍然处于第二的位置。我认为我们的增长趋势预测表明,至少在未来几年内,Python 不会立即超过 R 成为数据科学语言。但从长远来看,我认为 Python 会迎头赶上。否则,我真的不知道有多少其他领域,不需要系统语言,我们还没有在 Python 上取得第一名。

我认为 Python 在桌面应用程序方面可能不是那么强大,在某种程度上。即使在桌面上,人们也在使用我们,所以它并不是完全空白,但那个领域竞争非常激烈。从长远来看,我们可能已经到达了这样一个转折点,即到处都有如此多的 Python 代码,以至于 Python 本身可能永远不会消失。

Brett Cannon: '从长远来看,我们可能已经到达了这样一个转折点,即到处都有如此多的 Python 代码,以至于 Python 本身可能永远不会消失。'

希望 Python 永远不会和 COBOL 一样被轻率地提及,也许我们会受到更多的喜爱,并且持续更久,但我看不到我们真的会消失。我认为现在有太多的代码,我们永远不会消失。

Driscoll: Python 是当前人工智能和机器学习热潮中的主要语言之一。您认为是什么使得 Python 成为这种领域的优秀语言?

Cannon: 我认为 Python 学习的简便性使其成为人工智能领域的良好选择。目前从事人工智能工作的人员已经超越了仅仅是软件开发者,现在还包括像数据科学家这样的人,他们并不经常编写代码。

这意味着人们对于一种可以轻松教授非程序员的编程语言有着强烈的愿望。Python 很好地满足了这一需求。你可以看看 Python 如何在科学和计算机科学教育领域获得人们的青睐,以了解这并不是一个新趋势。

Driscoll: 人们现在应该转向 Python 3 吗?

Cannon: 作为帮助 Python 3 诞生的人之一,我并不是一个完全无偏见的人来询问这个问题。我显然认为人们应该立即切换到 Python 3,以获得自 Python 3.0 首次发布以来语言所增加的好处。

Brett Cannon: '我希望人们意识到,向 Python 3 的过渡可以逐步进行,这样切换就不必是突然的或特别痛苦的。'

我希望人们意识到,向 Python 3 的过渡可以逐步进行,这样切换就不必是突然的或特别痛苦的。Instagram 在九个月内完成了切换,同时还在开发新功能,这表明这是可以做到的。

Driscoll: 展望未来,Python 4 发生了什么?

Cannon: Python 4 的事情是一个完整的对话,当然。我并没有听到太多关于 Python 4 的信息,我很乐意听到关于它的讨论。它是神话般的,实际上并不存在。Python 4 就像是 Py4k 的梦想与 Py3k 的对比。语言可能走向何方呢?

当我们开始着手进行 Python 4 的开发时,我们可能会对标准库进行大量的清理和精简。有些语言元素我们可能会最终决定去除,而不是为了与 Python 2 的兼容性而保留它们。

Brett Cannon: '当进行 Python 4 的开发时,我们可能会对标准库进行大量的清理,并对其进行精简。'

对于 Python 4,我们可能会有一个跟踪垃圾回收器,而不是使用引用计数来获得并行性。我还不知道,但我看到它的发展方向是:更多或更少相同,特别是因为我们已经更多地依赖于社区围绕 Python 建立起来的事物。我的意思是,我们之所以有庞大的标准库,部分原因是因为它抵消了互联网,对吧?

Python 本身在 Unicode 成为官方标准之前就已经存在了,因为 Python 首次公开是在 1991 年 2 月,而 Unicode 1.0 在 1991 年 10 月最终确定。我并不知道这一点。我不得不查一下,因为这是那种人们问我,“嘿,你为什么不像 Java 那样从一开始就使用 Unicode?”的事情。就像,嗯,我们比 Unicode 早,所以这就是原因!

因此,在未来,我认为标准库不需要像今天这样大了。如果你能通过pip安装等效库,我们就不需要它那么大。

我们很幸运有一个充满活力的社区,所以我们有很多高质量的第三方库,我们可以减少标准库,降低核心开发者的维护负担。我认为我们可以在未来的 Python 版本中这样做,而不会对社区访问高质量模块造成任何风险。我认为这将使 Python 更简单、更精简,并且更容易使用。

布赖特·卡农:“所以,在 Python 4 中,我认为标准库不需要像今天这样大了。”

这就是我怀疑我们将要做的,但我没有做出这个决定的权利。无论如何,这听起来像是一个美好的梦想。所以,是的,希望如此!到目前为止,还没有人告诉我,当我用这些想法回答关于 Python 4 的问题时,我是完全疯狂的,这是一个很好的试金石。

德里斯科尔:你认为是什么驱使了最近对 MicroPython 日益增长的兴趣?

卡农:人们一直在问我关于写 MicroPython 的事情。虽然我自己没有使用它,但我认为它必须越来越大,因为我一直在被问到!我愿意打赌这是由于教育领域,很多人在使用 microbits 和其他东西。所以,MicroPython 的兴趣可能就是从这里来的。

德里斯科尔:我们如何开始为 Python 语言做出贡献?我们如何开始?

卡农:我们有一个叫做开发者指南的东西,我是在 2011 年开始写的。它的全名是《Python 开发者指南》。基本上,《开发者指南》概述了你需要知道的一切,以便你可以为 Python 语言做出贡献。

布赖特·卡农:“《开发者指南》概述了你需要知道的一切,以便你可以为 Python 语言做出贡献。”

开发指南(https://devguide.python.org/)展示了如何获取 Python 源代码,编译它并运行测试套件。它还提供了关于如何找到你想要贡献的内容的建议。你还可以找到核心开发者的文档,它展示了你如何进行代码审查以及所有其他内容。

开发指南现在是一个相当大的文档,它已经有点像拥有了生命。我只是告诉人们去读开发指南,并尝试了解一下你想要帮助什么。选择一个你非常熟悉的模块,你可以帮助修复其中的 bug,或者你感到非常舒适的模块。

我们还有一个核心导师邮件列表,它是故意没有存档的,这样你就可以问任何问题,你不必担心有人在五年后找到它。所以请注册核心导师,阅读开发指南,然后找到你想要做的事情!

Driscoll: 我们可以通过代码审查为 Python 做出贡献吗?

Cannon: 是的,事实上,到现在我已经开始尝试引导人们去做代码审查了,所以如果你真的熟悉一个模块,并且 GitHub 上有一个关于它的 pull request,请去做代码审查。

如果你觉得舒服,无论是定期还是不定期地对一个你经常使用的模块进行代码审查和审查,那真的是为 Python 语言的发展做出贡献的一种非常好的方式。

Brett Cannon: '如果你觉得舒服,无论是定期还是不定期地对一个你经常使用的模块进行代码审查和审查,那真的是为 Python 语言的发展做出贡献的一种非常好的方式。'

在推动 Python 向前发展方面,我们最大的限制是核心开发者的带宽。所以你的代码审查真的可以帮助使项目更容易管理。请加入我们,帮助我们接收更多的补丁,修复更多的 bug。

Driscoll: 我们还能以其他什么方式为 Python 语言做出贡献?

Cannon: 对 Python 社区的一个大帮助就是回答你看到人们关于 Python 提出的问题,并且通过保持开放和诚实来回答这些问题。当然,在谈论 Python 时不要表现得像个混蛋也是很重要的。只是表现得友好一点是可以的。

Driscoll: 有没有哪些 Python 项目是有人可以加入并为其做出贡献的?

Cannon: 是的,如果你没有找到让你感兴趣的当前模块,那么你可能对贡献一些需要帮助的更下游的 Python 项目感兴趣。例如,Python 包索引的下一个版本总是需要一些帮助。如果你发现了一些你感兴趣的下游内容,就加入进来吧。

Driscoll: 关于入门项目怎么样?

Cannon: 诚实地讲,拥有启动项目真的很困难。我们通常有足够多的人参与和关注,可以立即跳上去修复它们。所以有时候很难开始,这也是为什么我开始推动更多的拉取请求审查。

Driscoll: 在 PyCon 期间,我看到通常会有一个关于 Python 语言的冲刺。你们在那些 PyCon 冲刺中都做些什么?

Cannon: 我自己领导过许多那些 PyCon 冲刺,我们通常会把 Python 核心团队召集到冲刺房间的一些桌子旁,然后大致上就是,“嘿,如果你想贡献,那就进来吧。”

我们告诉 PyCon 冲刺参与者与我们告诉所有想要远程贡献的人完全一样的话:这里有开发者指南,阅读它,设置你的工具链并运行,然后寻找可以工作的东西。如果你找到了,就去尝试吧。

Brett Cannon: '我们告诉 PyCon 冲刺参与者...这里有开发者指南,阅读它,设置你的工具链并运行,然后寻找可以工作的东西。'

当然,在冲刺期间,我们会在房间里回答任何可能的问题。通常,像 R. David Murray 这样的人会找到一些简单的错误列表,分发给冲刺房间的人。这是一个很好的机会,让人们进来打个招呼。如果他们想开始贡献,那么房间里就有核心的 Python 人员,这样他们就可以快速得到答案,而不是等到有人看到邮件并回复。这非常简单,就是转向你左边或右边的人,然后你可以提问并得到答案。

有时候我们会做一个简短的演示,说明在冲刺期间我们将要做什么,如果人们可以加入那就太好了。我们说,“这里有一些工具,这是如何运行构建,以及如何运行测试。”然后我们开始编码。

与会议的其他部分相比,冲刺非常轻松和放松。我强烈推荐你们在可能的时候参加。在冲刺房间里,没有像主展区那样忙碌。那是因为人比较少,大家只是坐下来放松。没有过渡,除了午餐前后的过渡,更容易找到人交谈,这很好。所以冲刺绝对是有趣的,我打算在明年或后年如果可能的话去参加一次。

Brett Cannon: '我们说,'这里有一些工具,这是如何运行构建,以及如何运行测试。然后我们开始编码。'

Driscoll: 一些其他团队也有一些小小的诱惑,比如如果你在帮助 Russell Keith-Magee 的 BeeWare 项目,你的第一次贡献就能得到一个挑战币。你见过那些吗?

卡农:是的,如果你帮助了 Russell 的项目,他会给你一个挑战币。那是一个大而令人印象深刻的金属币。我现在手里拿着的是我从 Russell 那里赚来的一个,它几乎占满了我 Nexus 5X 屏幕的大部分空间!

这是我从 Russell 那里赚得挑战币的方式:如果你做出的贡献被 BeeWare 项目接受,比如文档或者别的什么,那么你下次见到 Russell 时就会得到一枚这样的币。所以在我这个例子中,我碰巧有一天在推特上看到 Russell 发布了一个示例仓库,我发现了一些错误。我发送了一个拉取请求来修复它们,这就是我最终得到硬币的方式。我已经想要一枚很久了,因为我认为它是一个非常酷的感谢象征,任何人只要做出贡献就能得到一枚。

如果你对挑战币一无所知,那么 99% 无声的播客有一期非常好的节目解释了这些内容(99percentinvisible.org/episode/coin-check/)。

布雷特·卡农:'如果你对挑战币一无所知,那么 99% 无声的播客有一期非常好的节目解释了这些内容。'

德里斯科尔:Python 核心团队是否提供像 Russell 的挑战币这样的激励措施?你认为人们为 Python 语言做出贡献的核心精神和动力是什么?

卡农:我一直想为 Python 制作挑战币,无论是为了核心开发者还是为了贡献补丁的人。这是一个不错的主意。但我没有 Russell 那么经常旅行,所以这有点困难,因为我需要出现在人们参加的会议上才能给他们发币。但这确实是个好主意,我希望有更多的项目这么做。

Python 核心通常采取一种非常,可以说,被动的激励方式。这是真的,但那主要是因为我们把大部分时间都投入到我们想要完成的 Python 语言元素上,我们知道很多人会欣赏这一点。这真的是我们为 Python 做贡献的深层动力,我欢迎每个人无论远程还是参加会议冲刺都加入进来。

德里斯科尔:谢谢,布雷特·卡农。

第二章:史蒂夫·霍尔顿

史蒂夫·霍尔顿

史蒂夫·霍尔顿是一位英国计算机程序员,曾是 Python 软件基金会(PSF)的主席和董事。他是《Python 网络编程》一书的作者,并与亚历克斯·马尔泰利和安娜·雷文斯克罗夫特合著了《Python 精华》第三版。史蒂夫在英国的一家压力管理初创公司 Global Stress Index 担任首席技术官,负责监督应用技术产生系统。推广 Python 语言的职业生涯让史蒂夫走遍了世界各地。他继续支持开源 Python 项目并在技术会议上发表演讲。

讨论主题:PyCon、PSF、Python 的未来。

在这里了解史蒂夫·霍尔顿:@holdenweb

迈克·德里斯科尔:那么你能告诉我你为什么决定成为一名计算机程序员吗?

史蒂夫·霍尔顿:本质上,我在青少年时期非常喜爱电子学。我之所以从化学转到电子学,是因为一位化学老师让我对这个科目失去了兴趣。

因此,我 15 岁开始我的职业生涯,在一家电视工厂担任实习生产工程师。18 个月后,那并不是如我所期望的那样顺利。我开始寻找新的工作机会,我看到一份在当地布拉德福德大学计算实验室的广告,招聘初级技术人员。所以我申请了这份工作,当我到达那里时,发现初级技术人员只是一个工作级别。他们实际上想要的是一个键盘穿孔操作员。

实验室主任认为我可能要偏离轨道了。他决定我应该为实验室工作六个月,学习计算机知识。所以显然我没有进入电子学方面,因为在那些日子里,计算机维护是一项极其专业化的工作。但我学会了如何操作计算机,我也学会了如何编程。这是我计算机生涯的开始。

德里斯科尔:这对我来说很有道理!是什么让你开始使用 Python,它对你来说有什么特别之处?

霍尔顿:嗯,在 20 世纪 70 年代初,当我终于 23 岁时进入大学时,我对面向对象编程产生了兴趣。我在 Xerox PARC 的艾伦·凯小组的一些关于 Smalltalk 的早期论文中发现了它们。

史蒂夫·霍尔顿:“在 20 世纪 70 年代初,我对面向对象编程产生了兴趣。”

这个小组似乎在计算方面有一个非常新颖的方法,所以我开始对 Smalltalk 感兴趣。最终,大约 12 年后,当我正在曼彻斯特大学工作时,我第一次有机会尝试使用 Smalltalk。我找了一位研究学生为我实现它。当时在英国没有 Smalltalk 的实现。我发现我实际上并不特别喜欢 Smalltalk。所以我又放弃了大约 10 年的面向对象编程。

实际上,当我搬到美国时,我遇到了一本关于 Python 的书。我想是《学习 Python》,那时是由马克·卢茨和戴维·阿舍所著。我意识到 Python 是我想要的语言!Python 是一种明智、易懂和理解对象导向编程的方式。

史蒂夫·霍尔德恩:“我发现我的语言知识增长非常快,不久我就开始回答很多问题。”

我做了那些日子人们做的事情,那就是加入 Python 列表。我发现我的语言知识增长非常快,不久我就开始回答很多问题。我认为我在 comp.lang.python 上总共活跃了大约八年。我发表了近 20 万个帖子!这很多帖子!尽管不幸的是,我认为谷歌已经让大多数这些内容消失了,所以历史已经从 comp.lang.python 中消失。

德里斯科尔:Python 现在被用于人工智能和机器学习。你认为是什么让 Python 如此受欢迎?

霍尔德恩:Python 有几个优点:它易于阅读,你可以在控制台或 IDE 中交互式地实验你创建的对象。Python 还提供了相对简单的方法来与提供快速计算速度的编译语言交互(没有人期望西班牙宗教法庭)。

德里斯科尔:你认为 Python 语言或其社区目前存在任何问题吗?

霍尔德恩:Python 社区(实际上是一个大量相交的社区)似乎一直在不断壮大。

我很高兴地说,Python 似乎被广泛接受为一种语言,拥有友好和欢迎的社区。Python 软件基金会(PSF)现在处于一个位置,可以帮助资助志愿者活动并提供财务保障,只要这些活动能够促进和支持 PSF 的使命。

史蒂夫·霍尔德恩:“Python 软件基金会(PSF)现在处于一个位置,可以帮助资助志愿者活动并提供财务保障。”

刚刚完成与亚历克斯·马尔蒂利和安娜·雷文斯克罗夫特共同编写的《Python 速成》第三版,我认为这门语言的状态相当不错。然而,我认为新的异步原语对于普通程序员来说,学习起来比应该要困难。

吉多·范罗苏姆和其他核心开发者们已经做了很好的工作,没有为了添加新功能而过分扭曲语言。但是,对于 Twisted 开发者来说如此熟悉的异步范式,并不像简单的同步任务规范那样直观明显。

史蒂夫·霍尔德恩:“我有一点担心 Python 的开发并没有为普通主流用户做很多事情。”

坦白说,我有点担心 Python 的开发并没有为普通主流用户做很多事情。已经做了大量工作将异步编程引入语言,现在它包括一个合作多任务机制,消除了对线程的需求。

随着这项工作的进行,开发者们意识到需要一些仅对特定异步计算的执行上下文私有的值。你可以把它们看作是asyncio的线程局部变量的等价物。随着我关注 Python-Dev 列表上的讨论,我看到了许多关于我认为永远不会影响 99.5%的 Python 用户的议题的深入讨论。因此,我很感激 Python 对向后兼容性的如此执着!

史蒂夫·霍尔德恩:“我看到了许多关于我认为永远不会影响 99.5%的 Python 用户的议题的深入讨论。”

我对 Python 中引入注解的看法也类似,尽管程度较弱。它们最初被提议作为语言的一个完全可选的元素,但由于人们在使用它们,它们引发了一些问题,这些问题增加了在标准库等地方允许注解的压力。

我希望初学者能够在完全不知道甚至存在添加注解的可能性(这些注解可以稍后添加,并且与语言的其他部分完全正交)的情况下继续学习语言。我不确定这种情况是否会持续下去。

从积极的一面来看,f-string 记法相对简单的开发被 Python 3 社区热情地接受,以至于大量代码无法在 3.5 上运行,仅仅是因为它使用了 f-string。像往常一样,Dave Beazley 发现了与 f-string 相关的邪恶用法,这总是很有趣。

德里斯科尔:我们如何克服这些问题?

霍尔德恩:我不确定是否有必要投入大量精力来克服这些问题。重要的是不要变得自满,并继续努力改进语言和扩大其社区,使其变得更大、更多样化。PyCon 证明技术社区在很大程度上可以自我组织。

迈克·德里斯科尔:我知道你以前是 PSF 和 PyCon 的主席。你是如何第一次参与的?

霍尔德恩:我参加了 2002 年的第一次,也是实际上最后一次国际 Python 会议。虽然内容很棒,但活动是由一个与 Guido 当时雇主有大量业务往来的商业团体举办的,因此它针对的是有预算参加的人。

虽然这在语言的早期阶段很好,但对我来说很明显,如果 Python 要真正流行,那么其会议需要为更多的人提供一个家。这包括我在 comp.lang.python 上每天与之互动的人。

史蒂夫·霍尔顿:'如果 Python 要真正流行,那么它的会议需要为更多的人提供一个家。'**

在那次会议结束时,吉多宣布了 Python 软件权威(PSA),这是一个大致的国家治理机构。PSA 将被一个非营利基金会取代。吉多还宣布创建一个邮件列表来讨论会议,我非常期待!

很遗憾,存档([mail.python.org/pipermail/conferences/](https://mail.python.org/pipermail/conferences/))似乎只能追溯到 2009 年 5 月。但当我最后查看完整集合时,我等待很长时间才看到任何东西的记忆是完全错误的。我花了大约两天时间成为列表中的第一个发帖者。我表达了我的观点,即社区能够并且会更好地组织会议,纯粹基于社区。

史蒂夫·霍尔顿:'我表达了我的观点,即社区能够并且会更好地组织会议。'

我很幸运,完全出于偶然,搬到了弗吉尼亚州。这个地方离吉多、杰里米·希尔顿、巴里·华沙和弗雷德·德雷克在不同地方工作的地方大约 20 到 30 英里,他们在那里共同开发核心 Python。

那个团队,加上当时住在波士顿的蒂姆·彼得斯,作为一家名为 BeOS 公司的员工聚集在一起。看起来那次合作前景光明,所以在大约六个月后,很明显 BeOS 陷入了困境。幸运的是,Zope 公司(现在是 Digital Creations)为他们租了一间办公室,他们成立了 PythonLabs。

德里科:你是如何开始与 Python 团队合作的?

霍尔顿:我因为大量贡献于 comp.lang.python 以及 2002 年出版的《Python 网络编程》而为人所知。

因此,当我联系吉多并建议我们见面吃午餐时,他邀请我去了 PythonLabs 的办公室。我见到了整个团队,然后我们在附近的一家中国餐馆吃午饭。这些会议每两周左右就会定期举行,讨论的一个主题变成了社区是否真的能够支持没有专业组织者的想法。

史蒂夫·霍尔顿:'讨论的一个主题变成了社区是否真的能够支持没有专业组织者的想法。'**

我认为到了 20 世纪 90 年代末,吉多意识到需要一些更正式的东西,因此 PythonLabs 的成员们开始了 PSF,并获得了一定数量的捐赠资金。我解释说,我以前是 DECUS UK & Ireland 的财务主管,有社区会议的经验。吉多说,如果我能同意担任会议主席,那么 PSF 将承担费用。

我们在乔治·华盛顿大学的 Cafritz 会议中心租了场地,并宣布了日期,这引起了大家的极大兴奋。然后非正式团队迅速建立了 PyCon-organizers 列表。我记得我们得到了纳特·托金顿的很多帮助,他提出了 YAPC(另一个 Perl 会议)的想法。

史蒂夫·霍尔顿:“很快,一种理念就出现了,那就是尽可能由志愿者来完成所有工作,以降低成本。”

很快就出现了一种理念,那就是尽可能由志愿者来完成所有工作,以降低成本。凯瑟琳·德林介入组织食物(考虑到每个人的饮食偏好是一项不可能的任务)。我甚至不记得当时是如何卖票的,因为那时还没有可用性网站。

大约有 250 人参加了会议,会议之前还有为期两天的冲刺和教程环节。所有演讲都受到了热烈的欢迎。现场气氛热烈,我四处走动以确保每个人都能够上网。

那次会议使 Twisted 团队首次聚集在一起。当我得知他们遇到了网络问题(当时大多数系统仍然需要以太网线)时,我通过为他们安装一个仅限他们使用的本地 100 MHz 集线器给他们留下了深刻印象。

德里斯科尔:这次会议在财务上成功吗?

霍尔顿:在会议结束时,我宣布看起来这个活动为 PSF 约赚了 17,000 美元。

吉多提议给我一半的利润,但我以 PSF 需要建立储备金为由表示反对。他还提议让我成为 PSF 成员,这是一个我乐于接受的荣誉。我因此被选入。

在那一年的 OSCON 上,我采访了吉多(http://www.onlamp.com/pub/a/python/2003/08/14/gvr_interview.html),他谈到了需要让一些更有经验的人参与到当时他领导的 PSF 中,这是由于他的名字给这个企业带来的认可。

史蒂夫·霍尔顿:“我从来不是那种支持社区活动变成个人财产的大粉丝。”

在第二年同一地点举行的第二次 PyCon 结束时,我宣布我将主持下一届会议。我从来不是那种支持社区活动变成个人财产的大粉丝,而且主持已经占用了我大量的时间。幸运的是,当时我大部分的收入来自教学工作以及灵活的咨询工作,这些我可以在很大程度上从家里完成。

如果我的记忆没有出错,那一年我被选入了 PSF 董事会。吉多辞去了主席职务,董事会选举斯蒂芬·迪贝尔接替他,并要求吉多继续担任名誉主席。这意味着他可以利用的时间可以专注于开发,而不是行政事务。

德里斯科尔:那么,你是在什么时候从会议主席的角色中退出的?

霍尔顿:在第三次的 PyCon 结束时,这次又在华盛顿特区举行,最后一次,没有人站起来主持下一届会议。我甚至无法告诉他们下一年将会有会议,更不用说时间和地点了。

史蒂夫·霍尔顿:“我坚信,如果 PyCon 要取得成功,那么还需要从社区吸引更广泛的支持。”

我收到了几个请求,希望我再担任一次会议主席,但我坚信,如果 PyCon 要取得成功,那么还需要从社区吸引更广泛的支持。大约两个月后,安德鲁·库克林找到我,询问涉及的内容,并感谢他,他主持了接下来的两次会议,这两次会议都在德克萨斯州的达拉斯举行。这标志着完全使用商业场所的转变,随着这一点,PyCon 已经从强到更强。

德里斯科尔:如果有人想学习编程,为什么他们应该选择 Python?

霍尔顿:这取决于他们的年龄。我建议在十岁之前,使用像 Scratch 这样的可视化编程系统可能更合适。

超过这个年龄,Python 绝对足够易于访问,可以成为一个好的入门编程语言。在各个领域都有大量的开源 Python 代码。如今,无论你从事哪个领域的工作,很可能都会有一些 Python 代码可以作为起点。

史蒂夫·霍尔顿:“Python 绝对足够易于访问,可以成为一个好的入门编程语言。”

德里斯科尔:那么你推荐哪些编码技巧?

霍尔顿:尽管我在前 30 年的程序员生涯中没有这样做,但我对测试驱动开发非常支持。我认为从商业角度来看,敏捷方法更可取,因为它允许所有利益相关者选择将为企业带来最大价值的工作。

我刚刚花了近一年半的时间与这种方法的扭曲版本一起工作。我期待在我的新工作中验证,当合理运行时,敏捷方法是提高工作效率的一种方式。但我认为敏捷与其说是一种编码技术,不如说是一种开发管理方法。

配对编程不像以前那样被广泛使用,但我认为从技术转移的角度来看,它是一个不可思议的沟通工具。年轻的程序员似乎不太花时间在职业发展上,但作为管理者,我希望看到我的员工成长和学习。配对编程是他们相对轻松地获取新技能的一种方式。

德里斯科尔:在学会了 Python 的基础知识之后,接下来该做什么?

霍尔顿:寻找一个你感兴趣的问题,看看该领域是否有任何开源项目。

史蒂夫·霍尔顿:“尽管我在前 30 年的程序员生涯中没有这样做,但我对测试驱动开发非常支持。我认为从商业角度来看,敏捷方法更可取,因为它允许所有利益相关者选择将为企业带来最大价值的工作。”

虽然每个新程序员都喜欢认为自己可以开创新局面,但实际上通过在一个知道自己在做什么的团队中合作来学习要容易得多。团队合作可以教会你那些在成为有效程序员过程中非常有价值的实际软件工程技能。

人们常说任何人都可以编写代码,但现在出现了一些迹象表明这可能并不正确。无论如何,仅仅能够编写代码是远远不够的,以构建实用、功能性强且易于维护的系统。获得那些其他技能不应该等到你掌握了编程。

迈克·德里斯科尔:'关于今天的 Python,什么最让你兴奋?'

霍尔顿: 真正令人兴奋的是 Python 社区的持续发展和 Python 使用的增加,尤其是在教育领域。这将确保相对容易理解的编程工具将在未来 20 年内对任何需要它们的人都能轻松获得。

我桌子上有一个 FiPy 设备,它集成了 Wi-Fi、蓝牙、LoRa、Sigfox 和蜂窝通信,由一个 MicroPython 控制器控制,除了有通常的硬件功能,如数字输入和输出外,还提供了对所有这些功能的 REPL 访问。我迫不及待地想要退休,好好玩这些设备。想象一下未来 10 年将会出现什么!

德里斯科尔: 你认为 Python 语言的未来在哪里?

霍尔顿: 我并不确定这个语言会走向何方。你听到有关 Python 4 的松散讨论。但在我看来,Python 现在已经足够复杂了。

史蒂夫·霍尔顿:'你听到有关 Python 4 的松散讨论。但在我看来,Python 现在已经足够复杂了。'

Python 并没有像我认为的 Java 环境那样膨胀。在那个成熟水平上,我认为 Python 的想法更有可能孕育出其他,可能更专业的语言,针对特定的应用领域。我认为这是根本上的健康,我不希望所有程序员都使用 Python 来做所有事情;语言选择应该基于实用主义。

我从未特别热衷于推动变革。已经有足够多的聪明人在思考这个问题了。所以,我大部分时间都在 Python-Dev 上潜伏,偶尔当我认为事情变得有点过于晦涩难懂时,我会从消费者角度提出一些观点。

德里斯科尔: 人们应该迁移到 Python 3 吗?

霍尔顿: 只有在他们需要的时候。不可避免地会有一些用 2.7 编写的系统不会被迁移。我希望他们的操作员能够共同形成一个行业支持小组,以延长这些系统的寿命,超过 2020 年 Python-Dev 支持的截止日期。然而,任何开始使用 Python 的人都应该清楚地学习 Python 3,而且这种情况越来越普遍。

德里斯科尔: 谢谢你,史蒂夫·霍尔顿。

第三章。Carol Willing

Carol Willing

Carol Willing 是一位美国软件开发者和前 Python 软件基金会(PSF)的董事。在过去七年里,她为 Willing 咨询公司提供了开源软件和硬件开发。Carol 是圣地亚哥 Fab Lab 的常驻极客,这是一个非营利性教育中心。她是 CPython 的核心开发者,并帮助组织圣地亚哥 PyLadies 和圣地亚哥 Python 用户组。Carol 也是 Project Jupyter 的研究软件工程师,并积极为开源 Python 项目做出贡献。她热衷于作为演讲者和作家教授技术。

讨论主题:CPython、Jupyter、Python 软件基金会(PSF)。

在 Carol Willing 这里了解更多:@WillingCarol

迈克·德里斯科尔:你能给我提供一些关于你自己的背景信息吗?

Carol Willing:我是 70 年代在小学就参与计算的人。我实际上是在贝尔实验室的阴影下长大的。和 Python 社区一样,他们为年轻的程序员提供了外展活动。

在中学时,我有机会继续在第一台 TRS-80 和 Apple II 上编程。我总是喜欢编程,因为它关乎探索新事物。当时没有互联网,所以你基本上只有源代码和一些简略的文档。如果你愿意,你就是计算机的探险家。所以这真的很有趣。

之后我获得了电气工程学位。在大学期间,我有机会在校园里运营有线电视站。我学会了技术方面,以及如何激励那些志愿者。

我直到职业生涯大约六年后才真正作为工程师工作。我长时间地休息了工作,但整个期间我都在做一些事情,比如在家里建立 Linux 网络。我决定我真的想回到开发方面,因为那才是真正震撼我的世界的事情。我有机会加入 Jupyter 团队,我现在就在做这件事。

德里斯科尔:你是如何从电气工程师回到编程的?我知道很多电气工程师更倾向于硬件。

Willing:嗯,我仍然非常热爱硬件,比如 MicroPython 和 CircuitPython。这些仍然非常吸引我,但我喜欢编程的谜题。

Carol Willing 说:“我喜欢编程的谜题。”

我认为我的第一爱是数学和编程。我喜欢做的电气工程是数字通信理论。所以这更多的是数学和软件开发,而不是硬件本身。

德里斯科尔:你是如何最终选择使用 Python 而不是 Ruby 或其他语言的?

Willing:嗯,我在 Rails 早期就做过 C++、Java 和 Ruby。然后当我认真考虑计算机语言时,我意识到我实际上在寻找一个我会喜欢的技术社区。

在南加州,我们有大量的聚会机会。有一段时间,我在 Linux 社区里有所涉猎。然后,我实际上开始与 OpenHatch 的一些人合作,教人们如何参与开源。

我越是用 Python 玩耍,就越开始真正享受它的可读性。Python 让事情变得容易完成,而且有很多庞大的库。所以这就是我走向 Python 的道路。这是一条通向 Python 世界的非线性路径,但是一条好路径。

德里科尔:你能解释一下你是如何成为 Python 核心开发者的吗?

威尔林:是的,几年前,我参与组织了一些 PyCon 的演讲和教程。我参加了会议,令我惊讶的是,在 CPython 冲刺中,开发者人数众多,但女性却很少。

卡罗尔·威尔林:“令我惊讶的是,在 CPython 冲刺中,开发者人数众多,但女性却很少。”

尼克·科格兰和其他一些人向我解释了事情的工作原理。我觉得我们需要更好的推广,所以我做了很多与 Python 开发者指南和 PyLadies 社区内的推广工作。我与尼克和吉多·范罗苏姆合作,探讨如何更好地记录我们所做的工作,并使其更易于访问。所以这就是我成为核心开发者的方式。

Jupyter 非常依赖 Python 3。因此,我认为来自网络社区之外的声音也需要回馈核心语言。我认为 Python 是一门伟大的语言,并且有很多机会。尽管 Python 已经存在了 20 年,但我认为我们刚刚触及了这门语言所能带给我们的一小部分。

卡罗尔·威尔林:“尽管 Python 已经存在了 20 年,但我认为我们刚刚触及了这门语言所能带给我们的一小部分。”

德里科尔:所以你负责库的哪些部分?作为核心开发者,你做什么?

威尔林:目前,我主要在编写文档和开发工具指南。我还指导社区中一些刚开始用 Python 或核心 Python 进行开发的人。

我参与了 Jupyter 中我们非常依赖的一些事情,比如异步操作。如果我有更多时间,我会在 CPython 方面更加投入。然而,目前 Jupyter 正在飞速发展,这让我们有点忙不过来。

我也非常喜欢参与教育。我认为,如果你能让一种语言对人们变得易于理解,那么你会得到很多很好的想法。这是 Python 中所有库的力量的组成部分。

德里科尔:所以你现在在 Python 软件基金会(PSF)做什么?

威尔林:我刚刚担任了 PSF 董事两年。现在,我参与了几个工作组,如市场营销和科学。

今年我更加专注于走出国门去演讲和分享。我想谈谈围绕 Python 的教育状况,Python 在许多不同学科中的总体情况,以及它是如何与 Jupyter 相匹配的。然后我还会再次参与 PyCon 和教程。阅读人们提交的所有提案实际上很有趣。

我相对较新加入市场营销工作组,但我们正在尝试探索全球范围内吸引社区和赞助商的其他方式。我们希望突出 Python 在现实世界中的实际应用。市场营销组正在努力制定更加强大的 Twitter 宣传活动,以便人们更多地了解 PSF 的工作。

Mike Driscoll:PSF 目前的当前目标是什么?

Willing:PSF 的使命是维持 Python 语言本身的存在,并保护版权。还有一个目标是扩大语言的使用范围,使其在全球范围内得到更广泛的应用,尤其是在那些尚未使用 Python 的地方。

从一年到另一年的基础上,目标可能看起来会有所不同。显然,举办 PyCon 非常重要,并且将始终是 PSF 的目标。其他事情可能更具战略意义,比如决定如何平衡收到的资助申请,以及我们正在资助的其他项目。

在开源世界的各个方面,还有一个非常重要的因素,那就是项目的可持续性以及如何资助这些项目运行的基础设施。在 PSF,我们非常幸运,社区中有一些非常好的捐赠者和赞助商。但如果某个赞助商因为某些原因离开了,人们仍然会期待 PyPI 能够正常运行,以及网站也能正常运作。

你需要制定一个长期可持续性计划,这样你就不至于耗尽志愿者的精力。PSF 还需要提供人们期望的服务水平。我知道 Donald Stufft 已经就 PyPI 每天处理的流量进行了几次采访。这个数字相当惊人。PyPI 是我们所有人都依赖的东西。PSF 维护 Python 在世界的存在,以及作为开发者你可能每天都会视为理所当然的基础设施。

Carol Willing:“PSF 维护 Python 在世界的存在,以及作为开发者你可能每天都会视为理所当然的基础设施。”

Driscoll:我不知道你是否可以谈论这个,但你能在 Project Jupyter 做什么?

Willing:我可以告诉你 Project Jupyter 我们在做什么,因为 Jupyter 是一个开源项目。它是通过科学研究项目资助以及一些企业捐赠来资助的。

Jupyter 基本上有三个主要领域。有经典的 Jupyter Notebook,它是从 IPython Notebook 发展而来的。还有许多不同的小部件和工具与 Notebook 集成。最后是 JupyterHub,这是我专门工作的部分。

JupyterHub 研究了如何在集群中为多个人提供笔记本。这可能是小型研讨会或研究实验室。我们看到了 JupyterHub 在大型学术机构中的大量使用。此外,许多高性能计算的研究人员正在使用 JupyterHub 进行非常数值密集型的处理。

Carol Willing: “基本上,JupyterLab 会给你一个流畅的 IDE 感觉,并带有一些很好的功能。”

笔记本本的下一代是 JupyterLab。基本上,JupyterLab 会给你一个流畅的 IDE 感觉,并带有一些很好的功能。你可以从页面中提取图表,并且它们仍然会同步并反映正在发生的变化。

JupyterLab 是为了可扩展性而构建的,因此你可以添加和自定义功能。我可能已经使用 JupyterLab 大约一年了,在不同的迭代中。反馈非常积极,JupyterLab 在一年前的 SciPy 上被分享过。

Driscoll: 使用 JupyterHub 需要订阅吗?这是怎么工作的?

Willing: 不,JupyterHub 也是一个免费的开源项目。所以,如果你有一台裸机服务器,你可以在自己的服务器上部署它。你可以在 AWS、Azure、Google Cloud 或其他类似 Rackspace 上部署 JupyterHub。

我们最近整理了一份指南,帮助人们使用 Kubernetes 设置 JupyterHub 部署。这实际上进行得非常顺利。用户认证有多种方法,因为不同的学术机构在认证人员方面有很大的差异。

Carol Willing: “你可以为每个学生提供一个网络账户,他们将会拥有所有相同的工具和相同的体验。”

你需要我们称之为孵化器的东西,它会为每个人孵化一个单独的 Jupyter Notebook 实例。这就是为什么 JupyterHub 对大学有吸引力。你可以为每个学生提供一个网络账户,他们将会拥有所有相同的工具和相同的体验。你不必处理安装噩梦。

Driscoll: 你也从事 IPython 的工作吗?

Willing: IPython 是整个 Jupyter 项目的一部分,但我对 IPython 本身的工作非常有限。我偶尔会帮助他们尝试新版本。

Jupyter 是一个庞大的学术研究项目。我们没有过多的营销资源,但我们正在努力传播这个信息。我认为 Jupyter 的一个真正强大的功能是,你可以以人们可以轻松互动的方式共享信息。我确实看到学生非常倾向于使用 Jupyter。

Driscoll: 那么,你喜欢 Python 社区什么?

Willing: 我认为布莱特·坎农和其他人之前说过,你是为了编程语言而来,但你是为了 Python 社区而留下。这真的很打动人心。在技术世界中,我不知道有任何社区比 Python 社区更受欢迎。

Carol Willing: “你是因为编程语言而来,但因为你对 Python 社区的热情而留下来。”

有那么多深思熟虑且才华横溢的人愿意分享他们的知识和想法。我认为这很大程度上来自于 Guido 本人以及他愿意有一个易于使用和阅读的语言。Guido 还鼓励人们回答问题,因为他希望有一个健康的 Python 社区,以及一个健康的语言。我认为这一点非常重要。

Carol Willing: “Guido 还鼓励人们回答问题,因为他希望有一个健康的 Python 社区,以及一个健康的语言。”

看到人们正在做各种各样的有趣事情,我觉得很有趣。尽管我非常喜欢 PyCon,但我真的很喜欢区域性会议。那里你才能真正看到正在发生的新事物。你得到不同人的观点,并了解他们为什么使用 Python。

没有什么比尝试教新用户如何做某件事情更能让你意识到 Python 需要在某些地方改进用户体验。作为一个开发者,这对我来说并不愉快,对于一个新学习者来说,他们可能不知道自己的配置是否正确,这甚至更加不愉快。

Driscoll: 目前让你对 Python 感到兴奋的是什么?

Willing: 我认为你从我们到目前为止的对话中已经了解到,我的兴趣并不只局限于一件事情。

Python 的一个优点是,无论我是在做嵌入式开发、网页开发、科学开发还是分析,我都可以使用这种语言。我当然可以用 Python 教孩子或成人。能够说在所有这些方面都真正强大的语言并不多。我认为 Python 在这方面真的很出色。

Carol Willing: “学习和教育是让我对 Python 感到兴奋的事情。Python 3 对于教学来说是一种乐趣。”

学习和教育是让我对 Python 感到兴奋的事情。Python 3 对于教学来说是一种乐趣,并且 f-strings 极大地简化了字符串格式化。MicroPython、CircuitPython、Raspberry Pi、micro:bit 和 Jupyter 激励了更多年轻人做一些真正有趣的项目。看到 PyCon UK 的年轻开发者们用他们的项目和闪电演讲远远超出我们的预期,这真是太有趣了。

Driscoll: 那么,作为 Python 的核心开发者,你认为这门语言在未来的发展方向是什么?

Willing: 我认为 Python 在科学编程方面将继续增长。所以支持 Python 作为语言性能和异步稳定性的东西将继续发展。除此之外,我认为 Python 是一种非常强大和稳固的语言。即使你今天停止开发,Python 也是一个非常好的语言。

我认为 Python 社区的需求将反馈到 Python 中,并影响语言的发展方向。我们核心开发团队中有来自不同群体的更多代表是件好事。比我更聪明的人可能会对你的问题提供更好的答案。我相信 Guido 对他希望 Python 前往的方向有一些想法。

Carol Willing: '在移动领域有一个更好的故事绝对是有必要的。但你知道,如果有需求,Python 就会达到那里。'

移动开发长期以来一直是 Python 的一个阿喀琉斯之踵。我希望能有一些 BeeWare 的东西能帮助进行交叉编译。在移动领域有一个更好的故事绝对是有必要的。但你知道,如果有需求,Python 就会达到那里。

我认为语言将继续朝着 Python 3 中的东西发展。一些大型代码库,如 Instagram,现在已经从 Python 2 转移到 3。尽管生产中仍然存在大量的 Python 2.7 代码,但 Instagram 已经取得了巨大的进步,正如他们在 2017 年 PyCon 的主题演讲中分享的那样。

Carol Willing: '这会因公司而异,但最终,如安全性和可维护性这样的商业需求将开始推动更大的迁移到 Python 3。'

Python 3 周围的工具越来越多,测试工具也越来越多,因此公司将其一些遗留代码迁移到 Python 3 的风险更低,在商业上有意义的地方。这会因公司而异,但最终,如安全性和可维护性这样的商业需求将开始推动更大的迁移到 Python 3。如果你正在启动一个新项目,那么 Python 3 是最佳选择。新项目,尤其是当考虑到微服务和 AI 时,将进一步推动人们转向 Python 3。

Driscoll: 你为什么认为 Python 在 AI 和机器学习中被如此广泛使用?

Willing: Python 在科学和数据科学领域有着悠久的使用历史,这使得 Python 成为人工智能的一个优秀选择。Python 丰富的库生态系统,包括 scikit-learn、NumPy、pandas 和 Jupyter,为研究人员和创作者提供了一个坚实的完成工作的基础。

Carol Willing: 'Python 在科学和数据科学领域有着悠久的使用历史,这使得 Python 成为人工智能的一个优秀选择。'

Driscoll: Python 如何成为一个更好的 AI 语言?

Willing: 维护现有的 Python 基础设施和关键库对于 Python 的基本增长至关重要。一个健康且包容的生态系统,以及企业对可持续性的资助,将有助于继续推动人工智能、深度学习和机器学习的快速增长。

Driscoll: 你希望在未来 Python 的版本中看到哪些变化?

Willing: 我很希望看到更多以任务为导向的文档来支持并发、异步、并行和分布式处理。在过去的几个版本中,我们已经有一些非常好的增强,如果能帮助他人更轻松地使用这些增强功能,那将是极好的。

德里科:感谢,卡罗尔·威尔林。

第四章 Glyph Lefkowitz

Glyph Lefkowitz

Glyph Lefkowitz 是一位美国软件工程师,曾参与过许多开源项目。他之前担任过苹果公司的资深软件工程师,现在在 Pilot.com 工作,这是一家为初创企业提供簿记服务的公司。Glyph 是 Python 网络编程框架 Twisted 的原始创始人。他继续维护 Twisted,并在 Twisted 社区中扮演着积极的角色。2009 年,Glyph 被选为 Python 软件基金会(PSF)的会员。2017 年,PSF 授予 Glyph 其社区服务奖,以表彰他对 Python 语言的贡献。

讨论主题:v2.7/v3.x,Python 的未来,多样性。

在这里了解 Glyph Lefkowitz:@glyph

Mike Driscoll:那么你是如何成为程序员的呢?

Glyph Lefkowitz:嗯,我的编程之路有些曲折。我从小就开始编程,但我的学习经历并不是典型的从 BASIC 到 Perl 的过程。没有线性进步,也没有我必须从事编程的专业抱负。

我只是想在我小时候制作像 Zork 那样的游戏。我的父亲是一位专业程序员,所以他试图教我 APL。我没有很快地接受编程。我学会了如何分配变量,就这些。我不知道变量分配意味着什么。这就是我在那里停留了大约五年的原因。

然后,我学习了 HyperCard,并开始理解控制流和循环的概念。我试图用它制作视频游戏。在整个童年时期,我都在试图避免学习编程。我总是寻找非编程的事情来做,因为我数学很差。

Glyph Lefkowitz:“在整个童年时期,我都在试图避免学习编程。”

所以过了一段时间,HyperCard 开始显得有些局限。我得到了 SuperCard,在某个时候,我学会了什么是变量以及如何编写实际操作数据结构的程序。然后我学习了 C++。在我尝试避免编程多年之后,一旦我理解了编程固有的力量,我就真正地投入进去了。

Glyph Lefkowitz:“一旦我理解了编程固有的力量,在我尝试避免它多年之后,我就真正地投入进去了。”

我在高中时学习了 Java、Perl、Lisp 和 Scheme。我在高中教了一门编程课,所以在大约 17 岁时,我就非常热衷于编程了。但在这条路上,我经历了不少艰辛。

Driscoll:那么,这是如何让你从所有那些其他语言转向 Python 的呢?

Lefkowitz:嗯,当我开始我的职业生涯时,我差不多已经决定使用 Java 了。

我在使用 Java 时遇到了一些非常糟糕的体验,尤其是对于 macOS 的专有运行时,因为应用程序我正在工作的依赖了那个窗口系统,存在一个 bug。

由于这个错误与大量内存泄漏有关,因此无法重新架构应用程序以避免触发这个错误。因此,我参与的项目实际上失败了,我失去了工作。我最终失业了几个月,因为这个经历,我想,去他的 Java,我再也不做了,主要是因为运行时的问题。

莱夫科维茨:“我最终失业了几个月,因为这个经历,我想,去他的 Java。”**

我的第一反应是看看 GNU 为 Java 编译器提供了什么。我想也许我可以做 Java,但不需要接触运行时,因为它的错误太多。从那个结论中迅速得出的是,那些东西都不起作用。

同时,我的业余项目,这个项目至今仍然存在,是一个我用 Java 编写的基于文本的在线游戏。我在 Java 中做的大量工作就是构建这些充满具有运行方法的对象的哈希表。

然后还有运行方法的参数,我会通过反射将它们注入其中。整个想法是在运行时将游戏连接起来。它有点用户可编程,但方式更加受限。

德里斯科尔:“那么这个游戏是如何运作的?”

莱夫科维茨:“你会有一套相对受限的构建块,这样如果你做了什么,它会产生游戏后果,而不仅仅是打印出来的风味文本。所以 Java 版本中的几乎所有代码都是与动态组合对象有关的大量仪式,这些对象可能是任意集合的其他对象。”

我用 Python 重新实现了整个系统,并意识到你不需要做任何那些事情。Python 中的对象只是这些动态的事物集合,你可以随意添加属性并从中检索属性。你可以查看其他字典以及所有那些东西。

莱夫科维茨:“我重新实现了整个系统,大约有 25,000 行 Java 代码,压缩到了 800 行 Python 代码,我认为这是一个更好的程序。”**

因此,我重新实现了整个系统,大约有 25,000 行 Java 代码,压缩到了 800 行 Python 代码,我认为这是一个更好的程序。现在,当然,我在 Java 中实现的是一个糟糕的 Python 对象模型版本,所以实现起来特别容易。

我多年来一直保持的兴趣之一是可组合性和自动组装的能力。我希望能够使程序具有自对称性,这样就可以拥有大量类似接口的实现,并能够自动组合它们。Python 的元编程设施位于 Lisp 或 Scheme 等语言之间的美妙甜点,那里有如此多的力量,以至于没有任何东西是兼容的。没有人会用同样的对象模型来编写那些语言。

在另一端,使用类似 Java 这样的语言,一切都非常标准化,但这并不重要,因为一切也都非常枯燥。你无法自动地将事物组合在一起,而且一切都非常冗长,所以尝试进行任何元编程都不值得。

Python 足够标准化,事物可以协同工作,但足够灵活和高级,以至于你几乎可以得到像 Lisp 宏一样多的功能。这就是为什么我自从那时起就一直坚持使用它,尽管因为我了解很多其他语言,所以我时不时地会尝试它们。但 Python 绝对是我建立职业生涯的主要语言。

莱夫科维茨说:“Python 绝对是我建立职业生涯的主要语言。’

德里斯科尔:你真的是 Python 的核心开发者吗?我无法发现这个信息。

莱夫科维茨:我不是。我参加过很多核心 Python 开发者活动,因为 Twisted 是一个相当高调的 Python 项目。

几年前我去参加了一个语言峰会,我在 bug 跟踪器上有分类权限。我是 Python 安全响应团队的一员,负责从库的角度提供对这个问题的看法。我还与吉多·范罗苏姆合作了很多,帮助 asyncio 集成到标准库中。例如,提供反馈以及我在 Twisted 上的经验。

因此,我对 Python 核心开发只是外围的,而不是核心团队的一员。我从未真正有参与的欲望。我基本上已经花了很多时间,可能比应该花的时间还要多,来做志愿者开源开发,通过做 Python 核心工作来增加这一点。很多人在专业上使用 Python 并希望回馈,但我已经做出了贡献。

德里斯科尔:所以,现在我们正在谈论 Twisted,你能告诉我 Twisted 是如何产生的以及是什么启发了你编写它吗?

莱夫科维茨:嗯,它最初是由于那个我之前告诉你的同样的视频游戏。我开始用 Python 重写我一直在工作的 Java 服务器版本。

该服务器的并发性非常依赖于线程,因为有很多玩家在四处走动,有很多自主代理在做各种事情。所以在 Java 中,线程一团糟。没有其他方法可以做到这一点,整个生态系统都是围绕使用大量线程来构建的。

莱夫科维茨说:“曾经有过一个时期……当‘大规模多线程’这个词听起来像是项目的一个夸耀。’

事实上,我永远不会忘记,在 20 世纪 90 年代末和 21 世纪初,大规模多线程就像是一个项目会吹嘘的夸耀。这是他们对项目的一个积极声明。

我们有类似类型的架构,但它一团糟。有成千上万的糟糕错误是由于线程管理不当造成的。我不记得我是如何发现这个问题的,但基本上最初每个连接都有三个线程:读取线程、写入线程和逻辑线程。

我的朋友詹姆斯·奈特重新编写了这款游戏的客户端/服务器协议。我相信当他重新编写时,他通过使用 select 模块将三个线程合并为每个玩家一个线程。

德里科尔:这次开发对你意味着什么?

莱夫科维茨:我研究了客户端/服务器协议,并意识到我想要了解的有很多,我可能可以通过套接字来实现。

莱夫科维茨:“一旦我了解到 select 模块,我就去阅读它,这完全改变了我对程序工作方式的看法。”

所以一旦我了解到select模块,我就去阅读它,这完全改变了我对程序工作方式的看法。正如我之前提到的,我早期的编程接触是 HyperCard,所以我有一个直观的想法,即计算机是空闲的,等待发生某事。

德里科尔:从那里你做了什么?

莱夫科维茨:所以,在玩弄select模块一两天后,我意识到你可以在接收到数据或连接开始时做些事情。

这对我来说更加自然,因为我之前一直在尝试用线程来模拟这种效果,但从未感到真正舒适。当时,我对启动程序时会发生什么并没有很好的直觉。程序会在后台启动线程,或者发生一些并发事件,但我并没有真正理解并行工作是如何进行的。

使用select,你可以看到并行性,因为会有多个连接进来。然后就会有多个我实例化的对象,它们上面有方法,我从这个事件循环中调用这些方法。所以从底层构建这些给了我关于并发工作方式更好的理解。

从那时起,想法是这款游戏将是如今所说的“替代现实游戏”。它将通过各种协议发送电子邮件或短信与你联系。这确实让整个事情显得有些过时,因为当时我并没有首先考虑建立网站服务器,而且并不清楚网络这一块是否会流行起来。

莱夫科维茨:“网络只是一个非常慢且充满错误的本地客户端,经常崩溃。”

对于我们 Twisted 开发团队来说,网络只是一个非常慢且充满错误的本地客户端,经常崩溃。我们可以在 Python 中编写本地客户端,它们会做我们想要的一切。当然,安全性并不是像今天那样令人担忧的问题,所以并不那么明显我们需要沙箱。公平地说,当时的浏览器安全性也很糟糕,但我们并没有真正考虑这一点。所以,项目就这样发展成了一个多协议的 Hydra。

Twisted 之所以以这种形式存在,其中内置了一个庞大的标准库,其中一个原因是,我们真的希望开发者以这种方式重写他们的协议,这样你就不需要线程来与之通信。我至今仍然这样认为。

德里斯科尔:你从第一个 Twisted 版本中学到了什么教训?

莱夫科维茨:嗯,一个教训是,每次你使一个对象持久化时,你基本上是在承诺支持它直到你生命的尽头。

莱夫科维茨:“每次你使一个对象持久化时,你基本上是在承诺支持它直到你生命的尽头。”

因此,我们有一系列真正糟糕的小课程,它们是愚蠢的实现细节。这正是一群无聊的 19 岁年轻人编写大量生产关键服务器基础设施时可能会想象到的事情。我们就是这样做的,最终我们陷入了一种非常奇怪的情况,我们有了这些服务器文件,它们就像是软件前几个版本中的几十个死对象。

我们不知道文件在那里,因为pickle没有方法可视化你的对象图,或者显示你在做什么。所以,直到大约 2009 年,Twistedmatrix.com 的主要网络服务器是一个 45MB 的pickle文件。我们不知道为什么它这么大,但这就是你运行它的方式。你只需要启动一个 Python 解释器来运行反应器。我们生活在五到十年后的未来,但这并不一定总是好事。

德里斯科尔:你遇到了什么问题?

莱夫科维茨:我们有时试图做一些真正糟糕的决定,因为与它们相关的工具不足。

没有支持性的生态系统,所以我们假设我们可以做一些替代方案,而不需要保留所有的配置和平文文件。我们以为我们可以以某种方式挥挥手,忽略版本控制和文本差异的所有好处,所有日志处理工具会以某种方式进入我们的生态系统,但它们从未这样做。因此,在过去五到十年中,我们一直在努力让项目变得不那么奇怪,但这仍然不到其寿命的一半。

莱夫科维茨:“在过去五到十年中,我们一直在努力让项目变得不那么奇怪,只是为了奇怪。”

Driscoll: 所以你提到你在帮助进行 asyncio 以及与之相关的其他库的更改。你认为这些更改会如何影响 Twisted?

Lefkowitz: 我实际上在我博客上写了一篇关于这个话题的文章。当时,Python 用户中有一小部分人,一开始就不喜欢 Twisted,他们很高兴看到库的更改最终会终结 Twisted,因为再也没有理由使用它了。

Glyph Lefkowitz: 'Python 用户中有一小部分人,一开始就不喜欢 Twisted,他们很高兴看到库的更改最终会终结 Twisted。'

我当时预测的,我认为这个预测在很大程度上已经得到证实,就是在标准库中批准事件驱动的并发,并说这是 Python 处理并发的正确方式,将会激发对 Twisted 的新兴趣。

整个 Python 堆栈实际上已经趋向于这个观点:事件驱动并发是做事的正确方式。以前,Twisted 必须是一个好的服务器框架,你可以用它来部署你的应用程序。它还必须是一个好的 GUI 客户端框架,你可以用它来编写直接行应用程序和桌面应用程序。

Twisted 需要是一个大量设计模式的稳固实现,但它也必须是一个自己的小标准库。它必须弥补 Python 标准库中的许多问题,这些问题有非常缓慢的发布周期,并且你无法保证它们适用于应用程序。

Glyph Lefkowitz: '这个工具在他们遇到问题之前,似乎是在向他们传教。'

Twisted 达到的某种断裂点,是它还必须成为事件驱动网络的消息传递者。人们会带着一些功能需求来到 Twisted,然后你必须首先说服他们异步确实是一个好主意。这导致的结果是,人们带着没有共享的期望和背景来到 Twisted。这个工具在他们遇到问题之前,似乎是在向他们传教。

为了在一定程度上生活在 Twisted 生态系统之中,以获得其实际的好处,你将不得不开始将你的代码转换为这种异步模型,而这需要大量的工作。如果你不了解它是如何工作的,并且它对你来说不直观,那么你会感到困惑。你不会处于一个愿意了解它的心态。

所以有趣的是,甚至那些还停留在 Python 2.7 上,并且将在接下来的十年里继续这样做的人,现在也开始出现在 Twisted 中。

Driscoll: 为什么人们还停留在 Python 2.7 上?

Lefkowitz: 人们多少知道标准库,就像 Python 一样,已经继续发展了。现在一切都是事件驱动的,都是异步的,他们不能使用 asyncio,因为他们在一个大型企业代码库中。

从 Python 2 到 Python 3 的过渡,坦白说,管理得并不好。核心团队,尽管像我这样的关心用户提出了警告,但并没有理解他们自己创造的规模。他们低估了迁移工作的难度。

莱夫科维茨:“起初,从 Python 2 到 Python 3 的过渡,坦白说,管理得并不好。”

Python 2 的长期存在是他们对此错误负责管理的后果。Python 开发团队看到用户没有升级,并努力了解原因,并解决大型 Python 用户的问题。所以它不是理想的,但比替代方案好得多,即 Python 3 变成 Perl 6。

德里斯科尔:“你对 Python 3 有什么看法?”

莱夫科维茨:“我现在在日常工作中使用 Python 3,并且非常喜欢它。经过许多血汗和泪水,我认为它实际上是一种比 Python 2 更好的编程语言。我认为它解决了许多不一致性。”

大多数改进应该反映生活质量问题和 Python 生态系统中真正有趣的事情。我迫不及待地想要 PyPy 3.5,因为在工作中使用 Python 3 的一个真正缺点是,我现在必须处理我的所有代码慢 20 倍的事实。

当我为 Twisted 生态系统做事情,并在 Twisted 的基础设施上运行东西时,我们在所有地方都使用 Python 2.7 作为语言,但我们使用 PyPy 作为运行时。它快得令人难以置信!如果你在运行服务,那么它们可以用十分之一的资源运行。

PyPy 进程将占用 80 MB 的内存,但一旦运行起来,每个解释器实际上会占用更多的内存,但每个对象占用的内存会更少。所以如果你在进行任何大规模的 Python 开发,我认为 PyPy 非常有趣。

我对 Python 社区持续感到困惑的一点是,有一种东西(至少对于 Python 2 来说),可以让你的代码快 20 倍。这并不特别受欢迎,实际上 PyPy 的下载统计仍然显示它不如 Python 3 受欢迎,而 Python 3 的受欢迎程度实际上正在大幅上升。

莱夫科维茨:“PyPy 缺乏可行的 Python 3 实现开始对其造成相当大的伤害。”

我确实认为,鉴于其受欢迎程度的提升,PyPy 缺乏可行的 Python 3 实现开始对其造成相当大的伤害。但在 Python 3 下载量甚至达到 PyPy 的 10%之前,PyPy 已经存在并且运行得非常快。所以我一直想预测这是 PyPy 在桌面上的年份,但它似乎从未发生。

德里斯科尔:“你认为为什么 PyPy 在服务器上没有流行起来?”

莱夫科维茨:“我仍然不太确定原因,因为特别是对于在基础设施上投入巨大的公司来说,它每年可以节省数百万美元。”

你可以告诉公司,如果他们重写所有代码,每年可以节省数百万美元。问题是,他们会承担巨大的安全风险,扩大他们的开发团队规模,并且在两年内没有任何新功能的进展。这是一个糟糕的权衡,我明白为什么你不想这么做。

使用 PyPy 我们会说,“为什么那不是未来?我们只是加入了这个新的解释器。”我们不能使用它的原因有很多,比如科学 Python 社区的工具在 PyPy 上还不能工作。但实际上,这只是一个例外而不是规则,甚至 NumPy 程序在 PyPy 上也大多能工作。我去年写了一些大量使用 PyPy 的 OpenGL 代码,做这件事真的很有趣。

德里斯科尔:你喜欢 PyPy 的哪些方面?

莱夫科维茨:你用 CPython 编写 OpenGL 程序时,它很难保持在每秒 50 帧的速度。你在 PyPy 中做同样的事情,它可以达到每秒 300、400 或 500 帧,毫不费力,而且不占用 CPU。

莱夫科维茨:“我希望 Python 前进的方向是采用更多先进的技术。”

我希望 Python 前进的方向是采用更多先进的技术,但不知何故,我们集体落后了。我认为决定 Python 前进方向的关键因素之一是我们能在多大程度上摆脱 pip 作为用户安装应用的工具。

我认为我们需要一个更好的故事来描述如何编写跨平台的 GUI 代码,即使它非常基础。例如,tkinter 已经足够糟糕,以至于人们根本不使用它。我们需要一个更好的故事来描述如何打包应用。

我想制作一个我可以上传到 App Store 的应用,甚至在谈论移动之前。随之而来的是所有资源限制的问题。我想编译我的应用并将其放在别人的电脑上,但现在做这件事太难了。

德里斯科尔:你看到制作应用变得更容易了吗?

莱夫科维茨:我对 pybee/briefcase 这样的项目感到鼓舞,我认为它们终于开始取得一些进展。

他们是一个规模很小的项目,面前却有着非常大的问题。但他们也非常坚定和投入,有着解决这些问题的实际经验。这可以从 Pythonista 这个 iOS Python 应用中看出,它使用了他们的代码。

我认为围绕构建和集成 Python 程序的故事一直在不断改进。我乐观地认为,在未来五年内,看到完全用 Python 编写的应用将不再罕见,而不是我们现在所拥有的少数几个例子。

如果唯一能够从一台计算机到另一台计算机实际获取 Python 代码的方式是 Docker,那将是一件遗憾的事情。Python 应该在你的 Mac 上,应该在你的 Android 上,应该在你的 Linux 机器上,应该在云中,应该在你的 Raspberry Pi 上。特别是随着物联网的出现,我真的希望更多的事情都在运行 Python 网络服务器。

莱夫科维茨:“任务是在每个端口上运行 Python,我们真的觉得这是一个重要的任务。”

任务是在每个端口上运行 Python,我们真的觉得这是一个重要的任务。许多服务,人们实际上用来与边缘网络设备(如 Nginx、Apache、XM 和 BIND)通信的东西,也都在 C 语言中。

我们正在用这些高级语言编写所有我们的应用程序代码。实际上从线路上提取字节并将其交给应用程序,然后解析它们的所有程序,都是 20 年前勉强维护的 C 程序。这是一个真正的危险。

因此,想法是你在 Python 中不能进行加密。加密原语需要用 C 语言编写,但它们只是安全应用程序的一小部分。高级加密构造可以在 Python 中(而且确实应该)完全组装,在那里你正在处理将多个加密原语组合成一个可行的整体。在 C 中进行这种组合是危险的且容易出错。

在许多情况下,你必须降级到子层,但你必须用一种语言编写加密原语,这样你就可以告诉底层硬件以固定的时间长度来完成事情。因此,它必须完全独立于数据输入。它还必须非常快,因为你不希望为加密事物支付巨大的开销。你只需要加密它们即可。

德里斯科尔:你认为 Python 语言会一直存在吗?

莱夫科维茨:哇,这是一个有趣的问题!我认为许多寿命与 Python 相当的语言,都逐渐淡化为遗产状态。

总体来说,我认为 Python 语言正在向前发展。它仍然是一个非常活跃的社区,并且仍在增长。它在开始时增长缓慢,现在也在缓慢增长,但多年来一直在持续增长。我认为这很有趣,因为有很多语言曾经是巨大的流星。Ruby 曾经非常流行,但随着 Rails 的流行度下降,其受欢迎程度急剧下降。

莱夫科维茨:“我认为 Python 的生命周期将比之前的语言长得多。”

我认为 Python 的生命周期将比之前那一代超级热门技术、然后随着下一代技术的出现而逐渐消失的语言长得多。我认为 Python 正在成为自己的下一代。具有讽刺意味的是,我认为 Python 3 只是其中的一小部分。

我非常希望发生的一件事,我认为这还没有发生,就是 Python 在浏览器中的应用。Skulpt、Pyjs、PyPy.js 以及其他一些项目已经提供了一些好的概念证明,但再次没有人坐下来想:“我是一个新的 Python 程序员,我想做一个前端 Python 应用。我该怎么做?”

对此的回答不可避免的是,真正让你能够做你想做的事情的东西只在这个项目的 Git master 上。你必须检出它,检出另一个项目。当你问:“嗯,为什么我不能 pip 安装这个?”时,答案是:“我们还在努力工作,它还没有完成。”

Glyph Lefkowitz: '我认为 Python 将会在各种不同的后端能力上持续增长。'

答案当然是,你可以使用 pip 安装它,而且不应该比这更难。所以我希望社区会朝这个方向发展,但我确实认为 Python 将会在各种不同的后端能力上持续增长。

我还认为,作为一门语言和生态系统,我们将走向更加多样化的方向。它将带我们走向一些我无法预测的令人惊讶的地方,但我可以说,Python 很可能将长期存在。我认为现在 Python 的方向是数据科学。显然,现在有很多人对数据科学感兴趣。

Driscoll: Python 在人工智能和机器学习的热潮中被广泛使用。你认为这是为什么?

Lefkowitz: 人工智能是一个有点笼统的术语,通常意味着当前计算机科学研究中最先进领域的任何东西。

曾经有一段时间,我们视为理所当然的基本图遍历技术被认为是人工智能。在那个时期,Lisp 是主要的 AI 语言,因为它比平均水平更高,研究人员更容易用它快速进行原型设计。我认为 Python 在广义上已经很大程度上取代了它,因为除了具有类似的高级特性外,它还有一个出色的第三方库生态系统,以及操作系统设施的优秀集成故事。

Lisp 程序员可能会反对,所以我应该明确指出,我并不是在精确地陈述 Python 在表达性层次结构中的位置,只是说 Python 和 Lisp 都属于同一类语言,具有垃圾回收、内存安全、模块、命名空间和高级数据结构等特点。

在更具体的机器学习意义上,这是现在人们说 AI 时所指的,我认为有更具体的答案。NumPy 及其伴随的生态系统允许进行非常研究友好的高级功能与非常高性能的数值计算相结合。如果没有非常密集的数值计算,机器学习就什么也不是。

Glyph Lefkowitz:'Python 社区专注于为非程序员提供友好的介绍...这实际上极大地增加了其在数据科学和科学计算等姊妹学科中的采用。'

Python 社区专注于为非程序员提供友好的介绍和生态系统支持,这实际上极大地增加了其在数据科学和科学计算等姊妹学科中的采用。无数的统计学家、天文学家、生物学家和商业分析师都成为了 Python 程序员,并改进了工具。编程本质上是一种社会活动,Python 社区比任何其他语言(除了 JavaScript)都更认可这一点。

机器学习是一个特别需要集成的学科,从任何 AI/机器学习系统都需要从现实世界来源摄取大量数据作为训练数据或系统输入的角度来看,Python 广泛的库生态系统意味着它通常处于良好的位置来访问和转换这些数据。

Driscoll:为了使 Python 成为更适合 AI 和机器学习的语言,我们可以做些什么?

Lefkowitz:使用更多的 PyPy。目前,Python 中的数据科学/机器学习生态系统非常专注于 CPython 运行时,这是不幸的。

这意味着新工具往往在没有在 PyPy 上进行测试的情况下创建,这意味着当它们出现性能瓶颈时,核心逻辑在 C(或者如果你幸运的话,是 Cython)中的重写是任何重大项目的必然部分。

Glyph Lefkowitz:'目前 Python 中的数据科学/机器学习生态系统非常专注于 CPython 运行时,这是不幸的。'

这在很大程度上是一个社会问题,当前 Python AI/机器学习基础设施在某些部分无法运行或运行良好的技术挑战,如果其维护者关心,所需修复的资源并不显著。但是,从那些项目无关的旁观者角度来看,谁在启动一个项目并尝试使用 PyPy,这只是一些你一无所知的代码中一个接一个无法解释的失败。

这在 Python 应用的几个领域都是真的,我只希望更多的人能将 Python 视为一种可以非常快速且与 Java 或甚至 C++竞争的语言,并在评估他们的测试矩阵时相应地规划。

Glyph Lefkowitz:'我只希望更多的人能将 Python 视为一种可以非常快速且与 Java 或甚至 C++竞争的语言。'

Driscoll:你希望在未来 Python 版本中看到哪些变化?

Lefkowitz:我的主要愿望是希望有一些好的默认设置来为新项目设置。

例如,今天你必须知道,当你安装 Python 时,你还需要安装pip,然后你还需要创建一个virtualenv,但所有这些步骤都是可选的。你还需要手动创建一个setup.py来描述你的项目,然后学习如何构建 wheel,指定依赖项等等。

我希望看到 Python 展示一个最佳实践的集成视图,使得用户在安装东西时更难迷失。这可以只是一个“新建项目”按钮,这样 Python 项目对刚开始的用户来说就像任何其他类型的文档一样。此外,Python 可以更像是一个应用程序,即使这个应用程序需要大量的命令行使用。

其次,我希望看到一些工具,使库的作者更容易保护私有实现细节免受意外破坏。例如,你可以导入库导入的内容,而不是导入库试图定义的内容。目前,升级 Python 库风险很大,因为每个库的每个用户都可能犯这样的错误,并依赖于这个错误。

我想要制作的工具,让用户能够轻松创建项目,将极大地受益于与语言的结合,但这种模块边界强制措施必须内置于语言中。在生态系统内构建它将极其困难。

德里斯科尔:那么你认为 Python 社区最好的是什么?

莱夫科维茨:我认为真正好的是对于多元化的承诺。很多人认为这是一件政治性的事情,或者认为有支持多元化和反对多元化的不同派别。多元化几乎被视为以某种方式削弱了技术性。

我可以分享我个人的经历,从对多元化和社会正义感兴趣开始。我环顾了一下 Twisted 项目,我说:“为什么我们这里 100%都是男性?这里发生了什么?我们做了什么让女性远离这个项目?”

莱夫科维茨:“我们显然错失了世界上半数的人才。”

我感到很抱歉,但我们显然在以最明显的方式错失了世界上半数的人才。我们所有人都是白人,而有色人种中也有许多有才华的人。他们没有出现。所以,确实存在一定程度的利他主义冲动,但我认为 Python 社区内部许多人已经接受这是一个真正的技能差距问题。

如果我们无法吸引到多元化的团队来参与我们的项目,并融入我们的社区,那么我们就不可能开发出对世界上的大多数人都有用的软件。我们将错失大量的人才,也将错失许多有趣的见解,这些见解将挑战我们,使我们的社区更加有趣。

莱夫科维茨:“如果我们不能让不同背景的人参与到我们的工作中来……那么我们不会开发出有用的软件。”

所以当我们之前讨论 Python 社区正在移动的技术方向时,这些方向得益于对多样性的追求。我相信 Python 在生命科学中受欢迎的部分原因是因为它的人口结构与其他科技行业不同。我认为 Python 在这方面取得了真正的突破,很大程度上是因为人们看到 Python 社区时并不感到害怕。它不是一个令人畏惧或排斥的环境。

莱夫科维茨:“Python 社区并不完美。我们还有很长的路要走。”

话虽如此,我觉得评论这一点有点奇怪,因为我也有同样的感觉,即 Python 社区并不完美。我们还有很长的路要走。整个科技行业都在突出女性,因为这是最明显的人口差异,但还有很多其他代表性不足的群体。

当你观察整个软件行业中女性的代表情况时,大约有 25%到 30%,具体取决于如何衡量。然后你看开源社区,女性比例大约是 5%,这比几年前好多了,那时大约只有 1%。

Python 社区在这方面做得相当好,但当你看那些积极参与项目的人时,它甚至没有达到行业平均水平,更不用说整体人口平均水平了。

德里科:Python 社区如何鼓励更多多样性?

莱夫科维茨:“我们认为我们还有很长的路要走,但 Python 社区在很大程度上已经承认了影响技术许多方面的真正问题,这是重要的。多样性是影响技术文化的一个问题。”

莱夫科维茨:“多样性是影响技术文化的一个问题。”

你还有其他社区,比如 Clojure 或 Erlang,它们提供了一些非常棒的技术,但它们并不真正关心多样性问题。你可以在它们的思维单一化和缺乏成功变得流行中看到这一点。

我认为在很大程度上效仿 Python 的社区是 Rust。尽管它非常底层且编写起来有些繁琐,但它们确实在那个语言中有一些很好的想法。由于更加包容并深思熟虑地组织社区,Rust 的受欢迎程度从列表的底部飙升。

莱夫科维茨:“我认为 Python 社区的包容性绝对是它最好的地方。”

所以我认为 Python 社区的包容性绝对是它最好的地方。这不仅仅是对其政治倾向的评论,也是对其未来产生有趣技术能力的评论。

我认为 Python 之所以能够持续发展,是因为它对很多人都很友好。它欢迎来自新社区和不同社区的人们。我真的不知道如何预测未来,因为这将取决于接下来会出现谁。

Driscoll: 谢谢,Glyph Lefkowitz。

第五章。道格·赫尔曼

道格·赫尔曼

道格·赫尔曼是一位美国软件开发者和作家。他是 Python 软件基金会(PSF)的成员,并担任了近两年的通讯总监。道格曾是 Python 杂志的专栏作家,后来成为主编。他还创建并维持了流行的 Python 模块每周一讲博客,该博客被汇编并出版在他的书籍《通过示例学习 Python 3 标准库》中。道格在红帽公司担任高级首席软件工程师,专注于社区领导和 OpenStack 的长期可持续性。

讨论主题:OpenStack、virtualenvwrapper、v2.7/v3.x。

在这里与道格·赫尔曼保持联系:@doughellman

迈克·德里斯科尔:道格,你为什么成为程序员?

道格·赫尔曼:我在很小的时候就对计算机产生了兴趣,那是在我所在的地方学校系统举办的一些夏季项目中。我喜欢编程,也喜欢了解计算机是如何工作的,所以我决定在大学里攻读计算机科学学位。我们在学校里做的工作真的让我坚信编程是我可以享受并以此为生的事情。

德里斯科尔:为什么是 Python?是什么让 Python 对你来说如此特别?

赫尔曼:我第一次接触 Python 是在 1997 年左右,当时我在一家名为 ERDAS 的 GIS 软件公司的工具和构建管理小组工作。

我们需要构建一些工具来帮助管理几个 UNIX 平台上的构建,以及 Windows NT 和 95。我们有很多 Makefile 和 shell 脚本,但它们并不特别便携。我越使用 Python,就越能找到新的使用方法。

道格·赫尔曼:“我越使用 Python,就越能找到新的使用方法。”

在最初学习 Python 之后,我记得当时既高兴地发现了一种如此易于使用的全新工具语言,又难过地发现当时我所工作的公司不允许我们用它来“真正”工作!

德里斯科尔:道格,你后来成为了 Python 杂志的技术编辑,我以前真的很喜欢它。我一直很好奇 Python 杂志是如何开始的……以及为什么后来停止了?

赫尔曼:Python 杂志始于布莱恩·琼斯担任首任主编。

布莱恩向 MTA(出版商)提出了这个想法。他们一直专注于 PHP 社区,但同意 Python 社区也可能支持一本杂志。

那是个正确的决定吗?嗯,我们一度做得不错,但我认为对于一本新的付费印刷出版物来说,时机并不合适。如今,电子杂志可能效果会更好,但这是一个艰难的行业。

德里斯科尔:道格,是什么让你也开始启动了非常成功的“Python 模块每周一讲”系列?是什么驱使你坚持写 PyMOTW 超过十年?

Hellmann: 是的,已经超过十年了。我在 2007 年开始写 PyMOTW 博客系列(pymotw.com),作为一种强迫自己定期写作的方式。我决定设定一个主题会更容易找到要写的话题,每周写一次似乎是一个不错的目标。

随着时间的推移,来自社区其他成员的兴趣逐渐增长,但反馈大多是积极的。我相信,如果不是因为每个人都给予我的所有反馈和支持,我早就停止了。

Driscoll: Doug,你的书是如何产生的?

Hellmann: 在项目进行两年后的一个 PyCon 上,Mark Ramm 介绍我认识了 Pearson 的编辑 Debra Williams Cauley。我提出了整理博客文章并将系列变成一本书的想法。Debra 帮助我确定如何结构化它以适应那种格式。与 Pearson 的整个团队合作都非常愉快。

Doug Hellmann: “Python 3 标准库包含数百个模块,用于与操作系统、解释器和互联网交互。”

Driscoll: 你的书对 Python 开发者来说非常有帮助。那么,你认为新学习的 Python 程序员在掌握了基础知识之后应该做什么?

Hellmann: 我鼓励大家通过选择一个他们想要自己解决的问题来设定一个目标。这为他们提供了一个学习框架,比如如何将一个项目分解成可以逐个实现的部分,这反过来又帮助他们一次专注于学习一项技能。

在 PyOhio 2015 上,我以我的一个项目为例,讨论了这一点。当然,并非所有项目都需要像 Smiley 示例那样复杂:

doughellmann.com/blog/2015/08/02/pyohio-talk-on-smiley-and-iterative-development/

每个程序员都会构建一些小的可丢弃的工具脚本以及更复杂的可重用项目,所有这些都是学习新东西的机会。

Doug Hellmann: “每个程序员都会构建一些小的可丢弃的工具脚本以及更复杂的可重用项目,所有这些都是学习新东西的机会。”

另一种很好的学习方法是通过参加当地的活动,与其他程序员交谈。亚特兰大 Python 活动小组试图保持初学者和更高级讨论的良好混合,以帮助鼓励具有各种技能的人参加我们的会议。有时,晚上最有信息量的部分是在演讲后的问答环节,或者在休息期间的讨论,那时你有机会要求更多细节或澄清。

Driscoll: Doug,你现在参与哪些活跃的项目?

Hellmann: 在过去的五年里,我一直致力于 OpenStack 的各个方面。除了云管理软件本身,我们还开发了一些有趣的工具,如 pbr 库,以帮助打包。

Driscoll: 那么,你是如何开始成为 OpenStack 开发者的?

Hellmann: 我在 DreamHost 开始了 OpenStack 的工作。我在亚特兰大 Python 线下聚会中认识了 Jonathan LaCour,工程副总裁,已经有一段时间了,当他需要人手时,时机正好,我也想换工作。我们在亚特兰大地区有一个小团队,我们互相帮助,进入了 OpenStack 社区。

Doug Hellmann: '我在亚特兰大 Python 线下聚会中认识了 Jonathan LaCour,工程副总裁,已经有一段时间了...'

Driscoll: 所以,聚会的力量在这里真正发挥了作用!目前你对 OpenStack 有什么目标?

Hellmann: 我从 Red Hat 那里得到了一个非常灵活的授权,去从事保持 OpenStack 社区健康所需的工作。

我在技术委员会任职,这是我们选出的管理机构。我们试图引导项目,并在我们做出重大决策时,帮助将庞大的贡献者基础达到某种程度的共识。

Doug Hellmann: '我从 Red Hat 那里得到了一个非常灵活的授权,去从事保持 OpenStack 社区健康所需的工作.'

我还担任了 Oslo 团队的团队领导,该团队管理着 OpenStack 各个服务之间共享的一组通用库。我们试图构建尽可能可重用的库,但有时我们需要在 OpenStack 内部共享对其他人可能不太有用的代码。

我还参与了发布工具的开发,扩展了流水线,使发布过程从为五个项目进行高度手动操作,转变为支持约 350 个不同交付成果的高度自动化过程。我建立了一些工具,比如 reno,我们的发布笔记管理程序,并在需要帮助的其他项目中参与其中。

Driscoll: 那么,关于你创建的一些工具,你创建 virtualenvwrapper 的灵感是什么?

Hellmann: 当我作为技术编辑和后来成为 Python 杂志的主编时,我发现自己需要管理很多不同的 virtualenv。每位作者都提供了安装他们文章中使用的工具的说明,我想能够测试代码。

我开始编写一些别名来轻松管理环境,项目从这里自然地发展起来。自从我专注于 OpenStack 以来,我的工作流程发生了显著变化,所以我并没有像以前那样多地为 virtualenvwrapper 做贡献。我很高兴 Jason Myers 现在接管了项目的首席维护者角色。

Driscoll: 那么,在你创建 virtualenvwrapper 的过程中,你能告诉我们你学到了什么吗?

Hellmann: 当然,我实际上能想到我在创建 virtualenvwrapper 时学到的三件事。

首先,我了解到贡献可能来自意想不到的方向。道格·拉托内尔提供了支持 ksh 的原始补丁。我完全没有想到有人会对支持 ksh 感兴趣,所以我并没有考虑超过 Bash。不过,我想他在那个时候可能在一个 AIX 系统上使用virtualenvwrapper,而且一旦合并,他的补丁很容易集成和支持。

我学到的第二点是,保持乐趣很重要。例如,我创建了以下网站,仅仅是因为亚历克斯·盖诺的一个推文:

bitbucket.org/dhellmann/virtualenvwrapper.alex

"virtualenvwrapper.alex为与常见virtualenvwrapper命令相关的错误安装别名。真的。它存在是因为亚历克斯·盖诺礼貌地请求。"

我必须提供的第三个学习点是,你不可能总是取悦所有人。因此,virtualenvwrapper支持插件,以便人们可以共享他们的扩展,但现在有一个全新的类似工具类别,如pyenvvex和其他,它们的运营模式非常不同。这很好!正如我所说,我的工作流程已经改变了很多,以至于我现在不再那么依赖virtualenv wrapper了。

Driscoll: 如果你可以从头开始创建virtualenvwrapper,你会做些什么不同?

Hellmann: 我现在会基于 Python 3 的venv而不是virtualenv来构建它,今天我会设计它为一个包含子命令的单个主要命令。

Driscoll: 你在 Python 中最兴奋的是什么?

Hellmann: 我一直对充满活力的社区感到非常兴奋。随着越来越多的人发现 Python,或者将其应用于新的领域,这个社区一直在扩大。

Mike Driscoll: 你对 Python 2.7 的长期寿命有什么看法?

Hellmann: Python 2.7 的长期生命周期承认了这样一个现实:基于不兼容的上游更改重写功能软件并不是大多数公司的首要任务。

我鼓励人们使用他们部署平台上可用的最新 Python 3 版本来启动所有新项目。我还建议他们仔细重新考虑现在将剩余的遗留应用程序迁移到 Python 3,因为大多数积极维护的库都支持 Python 3。

Driscoll: 你希望在未来 Python 版本中看到哪些变化?

Hellmann: 我目前最感兴趣的是与打包相关的工作。这些变化不会进入 Python 本身,而是进入像setuptoolstwinewheelpipwarehouse这样的工具中。简化 Python 包的打包和分发过程将有助于我们所有的用户。

Driscoll: 感谢,道格·赫尔曼。

第六章。Massimo Di Pierro

Massimo Di Pierro

Massimo Di Pierro 是一位意大利网络开发者、数据科学专家和讲师。在过去 15 年里,Massimo 在芝加哥的德保罗大学计算机学院担任教授。他是开源网络应用框架 web2py 的发明者和主要开发者,该框架是用 Python 编写的。Massimo 是全球开源 Python 项目的常规贡献者,并出版了三本关于 Python 的书籍,包括《Python 注释算法》。他在 Python 社区中的活跃工作使他被选为 Python 软件基金会(PSF)的成员。

讨论主题:web2py、Python 书籍、v2.7/v3.x。

在这里与 Massimo Di Pierro 取得联系:@mdipierro

Mike Driscoll: 你是如何成为一名计算机程序员的?

Massimo Di Pierro: 所以我是一名物理学家,但实际上我是在中学时开始学习计算机编程的。我爸爸在家里有 IBM PC。他是一名 COBOL 程序员,他主要使用会计软件。

当我 13 岁时,我爸爸给我讲了一堂 COBOL 课。我和他一起去,他以为我只是跟着去,但我理解他在说什么,然后我有所领悟。我爸爸后来给我买了一台 Commodore 64,我开始用 BASIC 编程,后来又用 Pascal。

Driscoll: 你是如何接触到 Python 语言的?

Di Pierro: 那是在很久以后。我在英国读博士,那时我主要用 Fortran、C 和 C++编程。我的工作是在晶格量子色动力学领域,我的机器是 Cray T3E。那是我开始学习 Python 的时候。当时,Python 主要被用作自动化文件处理和脚本维护任务的工具。到 2004 年,它已经成为我最喜欢的语言。

Driscoll: 是有什么顿悟让你决定 Python 是你的最爱语言,还是你只是大量使用这个语言?

Di Pierro: 那么,当时很多现在存在的库要么不可用,要么不够成熟。

我真正喜欢 Python 的地方在于我可以进行内省:我可以询问一个函数它的参数是什么。所以使用 Python,我可以编写出在一定程度上能理解自己的代码。

Di Pierro: '使用 Python,我可以编写出在一定程度上能理解自己的代码。'

我记得在多年前用 BASIC 做过类似的事情,但在 C++这样的语言中我无法轻易做到。我真的很喜欢编写能够重写自己的程序的想法。例如,我编写了一个名为 OCL 的库,它允许我在 Python 中装饰一些简单的函数,它们在运行时会被转换成 C 或 OpenCL,并以更高的速度运行(它使用 PyOpenCL)。

Driscoll: 那么,是什么让你创造了 web2py?

Di Pierro:所以 web2py 是在 2007 年开始的。当时,最受欢迎的两个 Python 框架是 Django 和 TurboGears。我有两个需求:我想在模型-视图-控制器架构中教授网络开发,而且我自己需要构建一些网络应用。

我当时正在评估 Django 和 TurboGears,并且我已经使用 Django 有一段时间了。我为联合国开发了一个内容管理系统,这是大学的一项无偿工作。所以我对 Django 非常了解,但我认为 Django 语法冗长,作为初学框架来说有点难以教授。

为了在 Django 中进行初始化,你需要对 Bash shell 和一些系统管理工具有所了解。当时我很多学生都没有这样的经验。所以我想要教授 Python 网络开发,但对我来说,通过所有这些工具到达那个点的工作量太大。我需要一个框架,它能下载一个文件,启动,并通过网络界面完成所有操作。

Di Pierro:“我需要一个框架,它能下载一个文件,启动,并通过网络界面完成所有操作。”

我还在 TurboGears 上工作过,在很多方面我更喜欢它,但 TurboGears 正处于一个大的转型期。它是一个由组件组成的框架,很多组件正在被替换,因为它们没有得到维护。

TurboGears 似乎没有一个稳定的 API,因此它不适合我作为教学工具。所以我决定应用我所学的知识,构建一个我认为更容易开始的框架。我从未想过这个框架会像现在这样受欢迎。

Di Pierro:“我决定应用我所学的知识,构建一个我认为更容易开始的框架。”

Driscoll:那么,你认为你在创建 web2py 的过程中学到的最重要的教训是什么?

Di Pierro:我学到的最重要的教训是建立社区的重要性。通过远程工作,我认识了很多很多人,尽管其中很多人我至今都没有见过。

当我开始开发 web2py 时,我对像 Git 这样的协作工具并不熟悉。web2py 的第一个版本使用了 Launchpad。我记得有人通过电子邮件给我发邮件提供帮助或提出建议。我对此并没有做好准备。

Di Pierro:“我仍然认为能够与远程的人进行协作是一项关键技能,即使你并不认识他们。”

我不知道如何处理协作很多年。今天,我仍然认为能够与远程的人进行协作是一项关键技能,即使你并不认识他们。我的意思是,最终我认识并信任了他们。我最信任的一些人是我通过 web2py 认识的。

Driscoll:你有没有在 FaaS 或 Django 中看到任何你认为适合 web2py 的功能?

迪·皮埃罗:web2py 在很大程度上得益于 Django,因为许多想法都来自它,以及其他框架。然而,我们在 web2py 中添加了许多 Django 当时没有的特性。例如,更强的默认安全设置,如默认情况下总是转义字符串。这些框架有着非常不同的哲学。

有许多使用 Django 的项目,每个项目都有自己的名称和维护者。它们非常先进,维护得很好。在 web2py 中,我们试图将所有内容都放在一个包中,这样我们就不需要在框架之外有一个庞大的生态系统。

迪·皮埃罗:“web2py 在很大程度上得益于 Django,因为许多想法都来自它,以及其他框架。”

web2py 中有许多来自其他框架的想法,但我相信我们在一些想法上有所改进。例如,web2py 中表单生成和处理的机制并不独特,但在开发时,它比竞争对手更好。

模型-视图-控制器设计架构主要来自 Django,URL 映射也非常相似。对于后者,我们提供了默认路由规则,就像在 Ruby on Rails 中一样。对于模板语言,我们决定我们不希望有一个特定领域的语言。相反,我们希望在模板中使用纯 Python,这与 Ruby on Rails 中的 ERB 模板语言有点相似,但使用 Python 语言。

在 web2py 中后来添加的其他特性,也受到了其他框架的启发。例如,我从 Flask 中喜欢的一个想法是线程局部变量的概念。所以线程局部变量允许任何模块访问当前的请求对象、当前响应对象或当前会话,即使代码是从其他地方导入的模块中根生的。我喜欢 Flask 处理这个问题的方法。

因此,确实有很多来自其他框架的想法,我认为彼此之间有很多学习。并不是每个人都承认这一点,但我很高兴承认这一点。

迪·皮埃罗:“彼此之间有很多学习。并不是每个人都承认这一点,但我很高兴承认这一点。”

德里斯科尔:所以我看到你开始自出版书籍。这是怎么发生的?

迪·皮埃罗:我是一名学者,所以我应该写论文和写书。因为我正在为软件编写文档,所以我能够快速更新书籍内容的能力对我来说非常重要。自出版允许这样做。

我真的相信开源,不仅是对代码,而且在一般的教育内容上也是如此。我几乎以成本价自出版我的书籍,并免费提供下载。对我来说,使内容保持最新和快速提供是首要任务。

此外,如果我写一本书,那是因为我想让人们阅读它,而不是因为我认为可以从中获利。最终,内容的验证来自读者,而不是出版商。所以我发现自出版对我来说是理想的。话虽如此,一旦你完成了一本书,你就不想再碰它太多。相反,你想要写另一本书!

德里斯科尔:你在写书时遇到了哪些挑战需要克服?

迪·皮耶罗:首先,我不是母语为英语的人。所以我会写,但我倾向于犯很多错误。我花了很多时间来审查事情并确保它们被修复。

迪·皮耶罗:“即使我认为自己是专家,这并不意味着我了解一个主题的所有内容。”

另一个挑战是,即使我认为自己是专家,这并不意味着我了解一个主题的所有内容。我总是有一个过程,那就是先写代码。然后我看代码,把代码变成论文或书籍。这样,我设法使文本与代码示例保持一致。如果你在写完文本后更改了代码,那么有时文本就会脱节,所以我真的很想确保我的示例尽可能好、尽可能完整。

围绕《web2py》这本书的一个挑战是,我收到了很多人在 GitHub 上提交给这本书的拉取请求。他们最初通过进行小的修正来做出贡献,但现在有时他们贡献得相当多。

跟踪贡献者很困难,因为我知道他们的 GitHub 名字,但无法正确地认可他们。人们总是给我发代码,但他们从未在致谢部分提交拉取请求。为了认可这些人,我需要做很多工作。

德里斯科尔:那么作为一个科学家或教师,你是如何看待 Python 帮助科学界的?

迪·皮耶罗:我发现 Python 已经发展得非常快,尤其是在科学界。特别是,我看到了随着 sklearn、TensorFlow 和 Keras 等机器学习工具的出现而带来的增长。

我记得当我 15 年前开始教学时,人们不知道 Python 是什么。一些同事反对将 Java 切换为 Python 作为主要教学语言。许多人认为 Python“仅仅是一种脚本语言”,并且非常专业化。

迪·皮耶罗:“许多人认为 Python“仅仅是一种脚本语言”,并且非常专业化。”

现在,在我们教授的几乎每一门课程中,无论是神经网络课程、机器学习课程还是数据分析课程,几乎每个人都使用 Python。在这方面,事情真的发生了很大的变化。

迪·皮耶罗:“我看到的最大问题是 Python 2 和 Python 3 之间的关系仍然是一个问题。”

我看到的主要问题是 Python 2 和 Python 3 之间的关系仍然是一个问题。在德保罗大学,我们几乎到处都在使用 Python 3,而行业仍然主要使用 Python 2,这在某些时候是个问题。

另一个问题是非常少的人使用 Python 3 中可用的新的异步逻辑。我认为 Python 的新异步逻辑非常强大,但它不像 JavaScript 的异步逻辑那样友好。真正喜欢事件驱动异步编程的人往往更倾向于选择 JavaScript(和 Node.js)而不是 Python。

迪皮埃罗:“我认为 Python 的新异步逻辑非常强大,但它不像 JavaScript 的异步逻辑那样友好。”

德里斯科尔:“我实际上对开始支持 Python 2 的其他公司有点担心。如果他们继续支持 Python 2 而不是 Python 3,您认为这些分裂的小组会发生什么,尤其是那些跟随 Anaconda 或 Intel 的小组?”

迪皮埃罗:“嗯,我不争论 Python 3 比 Python 2 更好的事实,但我认为从 Python 2 迁移到 Python 3 是困难的。这不能完全自动化,通常它需要理解代码。人们不愿意去碰那些目前还在工作的事物。”

迪皮埃罗:“我不争论 Python 3 比 Python 2 更好的事实,但我认为从 Python 2 迁移到 Python 3 是困难的。”

例如,Python 2 中的str函数将转换为字节字符串,但在 Python 3 中,它转换为 Unicode。这使得在没有实际通过代码并理解传递给函数的输入类型和预期的输出类型的情况下,从 Python 2 切换到 Python 3 变得不可能。

如果你的输入中没有奇怪的字符(比如不映射到 Unicode 的字节序列),那么简单的转换可能工作得很好。当这种情况发生时,你不知道代码是否在执行它原本应该执行的操作。以银行为例,他们有巨大的 Python 代码库,这些代码经过多年的开发和测试。他们不会轻易转换,因为这很难证明这种成本是合理的。考虑这一点:一些银行仍在使用 COBOL。

有工具可以帮助从 Python 2 迁移到 Python 3。我并不是这些工具的专家,所以我看到的大部分问题可能都有解决方案,但我并不知情。但每次我需要转换代码时,这个过程都没有我想象的那么简单。

德里斯科尔:您是否看到 Python 在数据科学领域的采用有任何挑战?

迪皮埃罗:“我认为数据科学家喜欢 Python。主要竞争对手是 R,我有一种印象,R 在经济学家和统计学家中更受欢迎。但我不认为 R 更受欢迎是因为它更好,只是因为它存在的时间更长,而且它更专注于这一点。”

R 语言已经存在很长时间了,人们都知道他们可以用 R 做些什么。那些精通这种语言的人并不觉得有必要学习其他的东西。R 语言始终专注于数据科学领域,因此那个社区的人对这种语言更为熟悉。

Di Pierro: “我看到 Python 被越来越多人采用,最终可能会比 R 更受欢迎,用于数据科学。”

我不会将 R 语言与 Python 语言本身进行比较,而是将其与 pandas 库进行比较。我认为 Python 加上 pandas 在与 R 的比较中构成了一个很有说服力的案例。事实上,这正是我现在在机器学习课程中使用的方法。但我看到 Python 被越来越多人采用,最终可能会比 R 更受欢迎,用于数据科学。我毫不怀疑这一点将会发生。

Driscoll: 谢谢,Massimo Di Pierro。

第七章。亚历克斯·马尔蒂

亚历克斯·马尔蒂

亚历克斯·马尔蒂是一位意大利计算机工程师。他是《Python 精粹》第一版和第二版的作者,也是《Python 烹饪秘籍》第一版和第二版以及《Python 精粹》第三版的合著者。亚历克斯是 Python 软件基金会(PSF)的会员,也是 2002 年激活者选择奖和 2006 年弗兰克·威利森纪念奖的获得者,这些奖项是为了表彰他对 Python 社区的贡献。自 2005 年以来,他一直在谷歌工作,如今他是为谷歌云平台提供社区支持的团队的高级工程师和技术负责人。亚历克斯是 Stack Overflow 的活跃贡献者,也是技术会议上的常客演讲者。

讨论主题:Python 书籍、v2.7/v3.x、谷歌的 Python

与亚历克斯·马尔蒂保持联系:@aleaxi

迈克·德里斯科尔:你能给我们提供一些关于你自己的背景信息吗?

亚历克斯·马尔蒂:我在我的祖国意大利获得了电气工程学位。然后我开始寻找可以设计集成电路的工作。设计其他类型的系统听起来很酷,但集成电路才是当时的热门。

当时,大多数真正有趣的设计都是由美国公司完成的,所以我最终在美国找到了我的第一份工作,具体是在德州仪器(TI),这家公司至今仍在运营。

德州仪器(TI)非常突出,既有消费产品,也有很多非常有趣的芯片。但我们显然并不兼容,因为 TI 的工作风格包括开始很多项目,然后非常突然地终止它们。我发现自己一次又一次地陷入被终止的项目团队中。

亚历克斯·马尔蒂:“我发现自己一次又一次地陷入被终止的项目团队中。”

我不能责怪德州仪器(TI)这样做。他们试图最小化对工程师生活的影响,作为最年轻的人,以及一个移民,我在任何特定的地方显然都没有根基。不到一年,我就结束了在达拉斯、奥斯汀、休斯顿和拉伯克的工作。不到一年就在四个不同的实验室工作了!

这有点压力,所以我重新开始与 IBM 研究所的谈判,当时我拒绝了 TI 的有趣提议。这并不广为人知,但 IBM 曾经制造过一些商业中最具创新性的集成电路,尤其是在研究层面,那里不会大规模生产,而是作为概念验证。IBM 在该领域仍然拥有令人难以置信的技术。

我记得大约在那个时候,IBM 因为用单个原子拼写出 IBM 这个词而获得了诺贝尔奖,这是一种非常新颖的电子显微镜使用方法,用来放置原子而不是观察它们。这仍然让我觉得像是一场科幻事件。

在某个时候,IBM 决定它想在意大利建立一个研究实验室,具体是在罗马,并征求志愿者。当然,我自愿参加了。这将给我一个有趣的视角,并让我回到我的祖国,更好的卡布奇诺和意大利面是主要的吸引力!所以我在 80 年代又回到了意大利,我的职业生涯也从那里开始发展。

德里斯科尔:你是如何成为计算机程序员的?

马尔蒂:所以这是在 IBM 的时候。我们刚刚完成开发这个原型图像处理机,在当时,这真是令人难以置信。它有专用芯片,一个大型的帧缓冲器,以及当时价格不菲的显示器(尽管现在它可能被认为没什么特别)。

亚历克斯·马尔蒂:'我们刚刚完成开发这个原型图像处理机,在当时,这真是令人难以置信。'

在我们原型机成功发射的庆祝会上,一位总监走过来对我说:“恭喜你和所有团队成员。遗憾的是,这个原型机现在将要在角落里闲置了。”我回答说:“为什么它要在角落里闲置呢?在 IBM 研究部,我们有来自各个学科的许多科学家,天文学家到地质学家都有需求。”

“是啊,对吧,”他说,“但你的设备不支持科学家使用的编程语言,比如 Fortran 和 APL。要使用这个设备,你需要编写一个通道程序。”地质学家和天文学家根本不做这些。这需要一个大型的软件开发项目来构建他们需要的所有接口和库。

我接着说:“嗯,我们能不能组建一个小团队来开发那个软件?”于是他挑战我说:“你认为需要多少人?”

我非常渴望“我的”机器能够被使用,而不是闲置,所以我提出了一个非常低的数字。“也许三个?”

他回答道:“好的,我可以安排人员。那么你就去组建团队。六个月内给我展示一些可以工作成果。”

我想这就是你成为 IBM 总监的方式吧。并不是通过设定低标准。所以我不得不临时担任一个低级别管理者(我认为技术负责人这个术语更准确)。我需要自学足够的软件知识来开始编写通道程序,将它们集成到库中,并找出他们希望在库中使用的算法,特别是那些可以通过这个非常强大的外围设备加速的算法。

德里斯科尔:那么你成功了吗?

马尔蒂:六个月后,我们有一个勉强可以工作的概念验证,但我们被允许继续进行。最终,这花了几年时间,但我们确实按照预期交付了 APL 和 Fortran 的工作库。这实际上是非常有意义的。

亚历克斯·马尔蒂:'我们确实按照预期交付了 APL 和 Fortran 的工作库。这实际上是非常有意义的。'

它使这块美丽的硬件变得有意义。实际上,它可以为科学家和其他程序员提供强大的图像处理和可视化。没有中间软件,他们不会自学汇编编程和通道编程来完成这项工作。

从我的观点来看,问题是我已经两年多没有进行任何硬件设计了。我甚至没有关注该领域的发展。当时,硬件设计,尤其是在集成电路层面,每年大约有一次革命。所以如果你不是非常了解游戏,那么你就会失去方向。

Driscoll:这就是你转向软件的原因吗?

Martelli:嗯,我必须意识到,尽管我有多年的经验,但我可能被任何刚从大学毕业、掌握最新技术和工具的聪明人绕圈子。

另一方面,我也必须意识到,即使是 simplest 的管理软件,对于我真正想做的事情来说,也是一种巨大的增值,那就是用专用集成电路制作酷炫的系统。

因此,在几年后的滑坡上,我不得不承认,我实际上已经无法再设计出体面的现代硬件了。一切越来越趋向于软件和管理。我认为有很多类似情况的人,他们最初从硬件方面开始,然后逐渐意识到他们的硬件并没有真正解决问题。

Alex Martelli:'很多人...最初从硬件方面开始,然后逐渐意识到他们的硬件并没有真正解决问题。’

我女儿现在也处于类似的情况。她拥有电信工程(高级无线电系统)的博士学位,并且非常热衷于专注于硬件。如今,她的工作日大约有四分之三是在做软件。这是因为本质上,所有网络,越来越多地深入到低层,都是由软件驱动的。

你不会设计一个单独的、没有智能和软件的专用天线。如今,你的设备必须拥有令人眼花缭乱的众多天线,以及足够的智能来找出在某个时刻应该激活哪些天线,基于信号质量。这远远超出了我毕业时对无线电的理解,但它确实是当今的软件网络。

Driscoll:那么你是如何最终接触到 Python 本身的?

Martelli:哦,那是一个不同有趣的故事。在我第一次接触到迷人的软件世界多年之后,我利用自己的时间和设备,独自开发了一套关于桥牌的想法的实验系统。

桥牌是在 20 世纪 20 年代由哈罗德·范德比尔特发明的。直到我开始涉猎这项游戏的时候,关于桥牌的数学理论很少。有一个主要的例外:伟大的数学家埃米尔·波雷尔,他写了一本关于桥牌数学理论的书。

到我出现的时候,计算机已经变得足够强大、强大和便宜,可以用于娱乐用途,而不一定需要大的回报。所以我复活了一个在 20 世纪 30 年代首次作为思想实验提出的主意,并在我的新个人电脑上付诸实践。

亚历克斯·马尔蒂:'我复活了一个在 20 世纪 30 年代首次作为思想实验提出的主意。'

也许我表现得像一位典型的硬件专家转向软件,因为我的解决方案并没有组织成一个漂亮的编程系统;它是由许多编程语言组成的糟糕混合体。我从 Modula-3 到 Perl,再到 Visual Basic 和 Scheme,已经数不清了,但整个系统确实运行起来了!

德里斯科尔:程序玩了很多游戏并成功了吗?

马尔蒂:程序实际上玩了一百万次每一手牌,并记录了结果。它证实了 Ely Culbertson 的非凡直觉,他是 20 世纪 20 年代和 30 年代桥牌界最杰出的人物。

因此,我将所有内容写成了一篇研究论文,并提交给了该领域最负盛名的杂志:《世界桥牌》。编辑非常热情,并和我一起大幅改进了这篇论文。我的研究在 2000 年 1 月和 2 月发表在《世界桥牌》杂志上。

之后,我开始收到桥牌选手的来信,包括冠军选手,他们问我:“嘿,你能将你的理论和你的方法应用到我在这个特定问题上遇到的困难吗?”

我很乐意满足他们的要求,但整个事情非常脆弱,每次我改变这里的逗号,那里就会出问题。真是一团糟!所以我决定,尽管这通常被认为是一个陷阱,但整个系统需要重写。我希望它尽可能使用单一的语言,但到底哪种单一语言确实是个问题!

德里斯科尔:那么,你找到了你正在寻找的语言吗?

马尔蒂:唯一有足够力量的语言将是 Lisp。我确实一直对 Scheme 有强烈的偏好,但也许这与 Scheme 本身的硬件背景有关。

问题是我能得到的免费版本,根本不够我完成所有辅助任务所需的库。这是一个个人项目,我已经投入了很多小时,但我不想再花钱了。一位同事说:“嘿,你应该试试即将推出的这种全新的语言。它非常流行,被称为 Python。”

亚历克斯·马尔蒂:'一位同事说:“嘿,你应该试试即将推出的这种全新的语言。它非常流行,被称为 Python。”'

我说:“哦,得了吧!我至少知道十种语言。我最不需要的就是再学一种!”他一直坚持,我对这个人非常尊重,所以我最终屈服了,并试了试。我给自己设定了一个小任务,用这种全新的语言来解决,看看我能走多远。

亚历克斯·马尔蒂利:'我说,'哦,得了吧!我至少知道十种语言。我最不需要的就是再学一种新语言!'

另一件事是在 20 世纪 90 年代末,我对“网络”这个新事物所知甚少。它看起来很有趣,所以我决定开发一个网站。我在一个周末内自学了网络技术,以及 Python 编程语言!正如我所说,如果你想在这一领域有所作为,你必须多少有些雄心壮志!

我是在周五晚上开始编程的,并且一直在查看手册。在某个时候,我开始越来越少地查看手册,因为如果我只是通过类比其他地方的工作方式来猜测 Python 的工作方式,那么我 90%以上的时间都是正确的。这个语言似乎是为我的大脑设计的,并且完全按照我的大脑的方式工作。

亚历克斯·马尔蒂利:'那个语言似乎是为我的大脑设计的,并且完全按照我的大脑的方式工作。'

到了周六下午早些时候,我已经完成了。我开发了一个可以计算桥牌游戏中花色分配条件的条件概率的 CGI 和 Web 应用程序!现在,我可以用剩下的周末时间做些什么呢?

我说:“我知道,它很好,但它只有意大利语,这可能对其他语言的读者也很有趣。让我也制作一个多语言版本,包括英语或法语,这两种语言我都说得很好。”

我意识到我需要一个模板系统。所以我四处寻找 Python 的模板系统,但并没有太多成功。我尝试使用 Gofer 和其他当时的工具。

最后,我决定自己编写一个模板系统!我把它命名为“另一个 Python 模板工具”(YAPTU)。到了周日,它运行得很好。所以我把它打包起来,发送到当时分发免费软件的一个地方,我就有了我的工作网站。

德里斯科尔:你有没有引起任何兴趣?

马尔蒂利: YAPTU 实际上吸引了一个当时恰好负责加州大学伯克利分校计算机科学网站的人的注意。他认为 YAPTU 是最好的模板工具。他之前已经决定使用 Python,因此他做了一些改进,然后发给我一个补丁文件。我们开始讨论事情,然后成为了朋友。

亚历克斯·马尔蒂利:'我们开始讨论事情,然后成为了朋友。那个人是彼得·诺维格,他现在是谷歌的研究总监...'

那个人是彼得·诺维格,他现在是谷歌的研究总监,也是畅销书《人工智能:现代方法》的作者。所以 Python 在那个时期已经开始给我带来有趣的联系了。

我试图在工作中推广 Python,但不幸的是没有取得多大成功。决策权掌握在专业管理层手中,他们知道未来是 Windows。我们的程序虽然主要是为 Unix 工作站设计的,但其他什么都不会存活。确实,如今你几乎在任何地方都买不到 Unix 工作站;到处都是装有 Linux 或 Windows 的 PC。从这个意义上说,他们的愿景是正确的。

我并不喜欢我们的编程语言被限制在微软真正想要支持的范围之内。我永远无法从高层管理获得官方批准。我不得不偷偷地将 Python 引入高层管理不会注意到的地方,比如我们所有的测试框架,这是一个对 shell 脚本haha.bat文件的修改。

那是在 Windows 的.cmd 时代之前。它们都变成了非常有用且易于维护的 Python 脚本,但有一点不尽如人意。我整天都在调试 Microsoft Fortran 编译器的问题,然后在能偷到的时间碎片里做 Python。

Driscoll:稍微换个话题,你是如何成为 Python 书籍作者的?

Martelli:我非常喜欢 Python,所以我想回报。我想回报 Guido van Rossum 和 Python 社区中的每一个人给予我的巨大礼物,他们通过开发这种语言为我们所有人做出了贡献。

我能做什么呢?嗯,有一个名为 comp.lang.python 的 Usenet 群组,人们在那里提问和回答问题。我总是擅长帮助人们解决技术问题。所以,尽管我对这种语言是个新手,我还是开始关注。每当我发现一个我认为可以富有成效和建设性地回答的问题,我都会这样做,而且显然取得了很大的成功!

Alex Martelli:“我总是擅长帮助人们解决技术问题。”

仅仅几个月后,Python 社区的一位资深人士给我起了个昵称叫 Martelli Bot。显然,我是 Python 社区中的第三个“机器人”。这个昵称的意思是,大量的总是正确的答案使你被认定为机器人。顺便说一句,给我起这个有趣昵称的人是 Steve Holden,我很荣幸地说,他是我的合著者之一,我的最新书籍《Python in a Nutshell》的第三版。

所以无论如何,这让我在 Python 社区赢得了街头信誉,并给了我勇气去接触 O'Reilly,注意到那里没有Python in a Nutshell。我说:“嘿,也许我,或许和一个更有经验的合著者,可以在这方面做些什么?”

他们说:“你为什么需要一个合著者?给我们发一个样章和章节计划。”事情就这样发展起来。

Alex Martelli:“我说,‘嘿,也许我,或许和一个更有经验的合著者,可以在这方面做些什么?’”

Driscoll:你是如何找到写Python Cookbook的机会的?

Martelli:我不得不稍微绕一下弯路,共同编写《Python Cookbook》,因为在早期规划中途失去了一位作者。这很有趣,因为那些是来自社区的食谱,但经过重新表述和调整,实际上可以有效地解决那些愚蠢的问题。

我还在 ActiveState 网站上贡献了很多食谱。那总是很有趣!那相当于现在的 Stack Overflow。关于特定主题的技术问题的问题和答案在 Stack Overflow 上得到了很好的服务。我在那里非常活跃:我是 Python 标签的第二大帖主,在声誉排名中位于首页前 0.001%。

顺便提一下,Stack Overflow 的首席数据科学家刚刚发表了一项关于编程语言流行度及其如何随时间变化的研究,这是基于 Stack Overflow 上的标签和问题。最受欢迎且增长最快的编程语言是 Python。

Alex Martelli:“预测是 Python 将成为最受欢迎的编程语言,并且到 2019 年初将成为开发者最活跃的语言。”

预测是 Python 将成为最受欢迎的编程语言,并且到 2019 年初将成为开发者最活跃的语言。目前,它仅低于 Java 和 JavaScript,但它已经超过了其他所有语言。Perl 已经消失,Ruby 已经消失,C#正在急剧下降。只有 Java 和 JavaScript 还在,但它们非常平稳,而 Python 则增长迅猛。

Alex Martelli:“只有 Java 和 JavaScript 还在,但它们非常平稳,而 Python 则增长迅猛。”

从一个大的基数来看,年增长率达到了 27%。我发现这证实了今年早些时候 Spectrum 杂志发表的一篇文章,该文章宣称 Python 是今年最受欢迎的编程语言。

这是基于一种主观的混合,包括非常不同的指示,如工作机会、课程和研讨会。而 Stack Overflow 的研究则是完全定量、完全客观的,并且仅基于一个极其庞大的数据量。他们得出了完全相同的结论,只不过 Stack Overflow 当然能够更精确地量化这些事情。

Driscoll:那么,你能描述一下作为书籍作者你学到的东西吗?

Martelli:首先,无论你认为你对一种语言了解得多好,直到你用那种语言写了几本书,你很可能都是错的。

理想情况下,你应该与一个耐心而坚定的编辑合作写作,其角色是了解语言、它在印刷页上的外观以及读者如何吸收它。

当然,英语是我的第三语言,所以我从未认为我有特别强的掌握它的能力。但写书提高了我对至少在书面英语中问题的理解。

Alex Martelli:“我们会继续使用编程语言,因为自然语言的固有歧义、强大和难度。”

自然语言是多么强大、丰富和困难的一个工具,这真是令人惊讶。这就是为什么我们会继续使用编程语言:因为自然语言固有的歧义性、强大性和困难性。在那里用绝对精确的方式表达事物是不可能的。

德里斯科尔问:“你能举一个例子吗?”

马尔蒂利说:“我在邮件列表中读过一个轶事,关于自动化和计算的风险。它是一个在大城市区域正式定义的系统,用于调度救护车。显然,这是一个生死攸关的任务。”

在最初用自然语言写下的内容以及约束条件之一是,当接到紧急电话,并且症状被识别为中风时,救护车将在不超过 15 分钟的时间内到达(这仍然是给你留下良好机会的最大时间)。

当系统从自然语言翻译成经过验证的正确编程时,许多事情都得到了改善,除了有少数但令人担忧的情况,救护车已经被安排,但从未出现。所以发生的事情是自然语言根本无法映射到形式逻辑。

亚历克斯·马尔蒂利说:“自然语言根本无法映射到形式逻辑。”

记住,这是一个城市地区,有交通。尽管救护车可能一直在鸣响警报,但它可能仍然被阻塞了数分钟。如果发生这种情况,当 15 分钟和 0.01 秒过去后,系统推断救护车已经到达,因为其中一个假设是救护车总是会在 15 分钟内到达。所以如果救护车已经到达,再派另一辆去那里就没有用了。这意味着它被重新调度了。

在自然语言中,当我们说救护车必须在 15 分钟内到达时,这不是一个公理,因为它是一个愿望。我们真正意思是这绝对重要,无论如何,请尽快让救护车到达那里。这不意味着如果你没有做到,就放弃它,因为 15 分钟和 1 秒是无用的。这是不理想的,但总比没有好!

亚历克斯·马尔蒂利说:“当你处于编程语言中时,你的断言要简单得多:你说会发生什么。”

这就是自然语言如何让你不断陷入困境的一个小例子。当你处于编程语言中时,你的断言要简单得多:你说会发生什么。如果这不是真的,那么你抛出一个异常。在自然语言中,有太多的背景知识你不可避免地认为是理所当然的。这包括所有常识以及在这个文化中成为一个人意味着什么。

德里斯科尔问:“所以你能描述一下你与你的书读者的最有趣的互动吗?”

马尔蒂利:有几个!我可能认为其中一些最有趣的是在工作中,一位同事会走过来对我说,“所以,我注意到...”他们刚刚编写的一些程序或函数的奇怪行为。

我会看看并找出问题,并帮助他们修复它。这并不是因为我比其他人更了解 Python,而是因为我有所谓的调试器眼睛。如果你给我一页文本,其中有一个打字错误,出于某种原因,我会在看到其他任何内容的上下文之前看到这个打字错误。这实际上在编程中非常有帮助,就像在电路设计中一样。

人们过去常说,“所以,我总是想问你,你是写那本书的 Alex Martelli 吗?”说“是的,那是我,在我那充裕的业余时间!”还挺有趣的!

亚历克斯·马尔蒂利:“你也需要认可,而不仅仅是硬核的结果。”

这让我的一天变得很愉快。这种情况现在很少发生了,因为我已经在现在的雇主那里工作了 12 年半,人们已经足够了解我了。我的意思是,这并不是客观上有生产力的,但嘿!你也需要认可,而不仅仅是硬核的结果。

德里斯科尔:你认为 Python 2.7 已经死去了吗?

马尔蒂利Python in a Nutshell的第三版有一个问题。我认为我们是对的,Python 2.7 远未死去。

可能,目前部署在生产中的大多数 Python 代码行都是 Python 2.7,或其他 Python 2 版本,但它们几乎可以不费吹灰之力迁移到 2.7。所以显然 Python 2.7 不会消失。实际上,它可能会在 2020 年消失,那时 Python 软件基金会(PSF)将正式停止支持它(尽管我打赌一些企业家会以商业为基础提供持续支持)。因此,涵盖 Python 3、3.5 和 3.6 也很关键,它们是我们计划和撰写本书时的最新发布和即将发布的版本。

亚历克斯·马尔蒂利:“Python 2.7 远未死去。”

现在放弃 2.7 还为时过早。所以我们有一本书涵盖了两者,如果你只关心其中一个,这就会变得多余。这是下一个版本将解决的问题。当然,我们只会是 Python 3 某个版本,不再需要 2.7。

许多东西将保留在 2.7 中,可能是因为它只是一个庞大的代码库。例如,YouTube 本质上是一个 Python 系统。有数百万行超级优化的 2.7 代码,坦白说,从商业角度来看,很难证明将所有这些代码都迁移过来是合理的。考虑到 YouTube 过去 10 多年投入的优化量,我们不能说重写 X 百万行代码。

如果重写能让 YouTube 的速度慢 10%,你能量化这种成本吗?不仅仅是对于谷歌,对于每个人,考虑到 YouTube 流量占据了互联网带宽的很大一部分?10%的性能影响将严重恶化每个人的生活。我们负担不起!所以这会通过其他途径进行。

德里斯科尔:那么,Python 作为一门语言目前有哪些问题?

马尔泰利:那么,如果我有魔法棒,可以回到 Python 第一版发布之前,并且只能做出一个改变,我会让它不区分大小写。

亚历克斯·马尔泰利:“许多最好的语言都是不区分大小写的。对我来说,这将是最伟大的改进。”

我知道自从 C 语言出现并主导了场景以来,人们认为不区分大小写很奇怪。但从 Fortran 到 Pascal 再到 Ada,许多最好的语言都是不区分大小写的。对我来说,这将是最伟大的改进。

你可能不会在西方文化中注意到这一点,但小写和大写的概念完全是人为的。它们在很大程度上是我们文化和我们偶然发展起来的写作方式的产物。

我非常喜欢 Macintosh 文件系统,因为当你创建一个文件大写 F-O-O(FOO)时,它会保留那个大小写。但如果你查找小写foo,它仍然会给你那个文件。这对于人类来说更有可能符合你的需求。

亚历克斯·马尔泰利:“语音输入突然成为了一种绝对主要的输入方式。”

想想语音识别系统。语音输入突然成为了一种绝对主要的输入方式,因为手机使得与它们说话比使用它们的小键盘要容易得多。在这种情况下,必须保持大小写区分是一个杀手锏,这也显示了它是多么地完全人为!指定大写或小写根本不是自然的发音。

我发现自己属于一个极少数的人,希望 Python 不区分大小写。确实,几乎与 Python 竞争的每一种语言都是大小写敏感的,所以我想这几乎是今天所有流行语言的缺陷。

Python 与其他语言不同的地方之一,如果它以同样的方式做,它将是一个更好的语言,那就是 Python 的关键词之一。最受欢迎的关键词之一是 def,它用于定义一个函数。问题是它既不是一个关键词,也不是一个单词。它没有任何意义!你知道哪个语言做得对吗?JavaScript。

德里斯科尔:JavaScript 有什么不同?

马尔泰利:等效的关键词是 function。我无法想象 Python 为什么一开始不用 function。这显然是显而易见的!function 要多打四个字符,但那又怎样!任何编辑器都会自动完成,对吧?

我知道从技术角度讲,说 def foofunction foo 完全没有区别。但我关注的是那些微小的可用性和可理解性缺陷。

亚历克斯·马尔泰利:“Python 可能是历史上最易用和最易理解的编程语言。”

Python 可能是历史上最易用和最易理解的编程语言。所以,它不那么友好的那些地方就更加突出。

Python 只有一种范围类型,而且总是不包括上界,因此它更加一致和清晰。那些使用完全任意的单词,如def的地方,语言本可以设计成使用像function这样的可读性单词。

如果人们完全被长单词function吓到,我会允许使用fun。这有点像是个玩笑。毕竟,这种语言是以蒙提·派森命名的,所以你可以把fun看作是function的缩写,或者简单地选择它,因为使用 Python 很有趣。这总比def要好。

Driscoll:你认为 Python 最大的优势是什么?

Martelli:我实际上是在处理故障时回答这个问题的。Python 的优势在于其清晰性和一致性,以及语言所追求的目标,即只有一种自然且明显的方式来做事。

当然,我们无法完全达到那里,因为例如,加法是交换的,所以a + bb + a是表达和的两种方式,Python 无法改变这一点。但这是一个追求的目标,并且它确实有助于使别人的代码在你第一次阅读时更加易于理解。

如果他们至少是一个好的 Pythonista,或者甚至是一个初学者,他们大多数情况下会选择那种明显的方式,因为它确实倾向于明显。在他们没有选择,而你向他们展示它本可以是怎样的情况下,说服他们要容易得多。所以这种追求给出一种明显表达方式的尝试是使语言如此清晰、有用和易用的原因之一。

Alex Martelli:“这种追求给出一种明显表达方式的尝试是使语言如此清晰、有用和易用的原因之一。”

Python 扩展到几乎可以用于你所能想到的每一个应用领域,我认为这源于这种清晰性和概念上的简单性。它确实使得人们很容易上手。

并不是每个人的大脑都会像我的那样完美匹配 Python。我并不是说每个有经验的程序员都能在周末内自学 Python,但 Python 是一种可以实现这种情况的语言。尽管我喜欢其他语言中的很多事物,比如 Rust,但我无法想象有人在周末内用 Rust 做到同样的事情。

Driscoll:那么你认为 Python 的未来在哪里?

Martelli:到处都是!你知道,过去几年最伟大的科学成果之一就是引力波的发现。

我们在 PyCon Italia 会议上举办了几场关键演讲。Python 代码作为通用语言,控制着所有负责收集数据的仪器,最终显示了两颗黑洞正在相互碰撞并发出那些波。

Alex Martelli:“Python 在那里指导数据处理。”

顺便说一句,如果我记得正确的话,仅仅由那个事件产生的波浪在几秒钟内产生的能量比整个宇宙一起发送的能量还要多。这是一个相当的现象,Python 在那里指导数据处理。也就是说,监督所有这些测量数据的清理、分析和相关性,以将它们解释为一种极其强大、持续时间极短的远程事件。那个冲突发生在数十亿年前,而现在正是那些波浪到达这里。这是一个例子。

当然,科学之所以迷人,正是因为如此。我越来越多地与大型互联网公司聊天,这些公司仍然倾向于,对于它们的核心应用,使用其他编程语言。他们这样做是因为创始人知道这一点,他们不得不适应 Python,仅仅是因为他们收购了其他公司。

高科技领域正在进行大量的收购。很多时候,那些其他公司都在使用 Python,因为这是他们成功的一部分。他们的生产力是使用较少语言的人的两倍或三倍。

Driscoll:你认为更多的公司会开始使用 Python 吗?

Martelli:是的,任何大型公司都需要在其生产系统中采用 Python 作为被接受的事物之一。TensorFlow 的发布向我表明,Python 肯定会在机器学习和人工智能的前沿。

即使内部使用超级优化的 C++和汇编语言,在应用层面,业务逻辑将使用 Python,因为花费精力重新制作它没有意义。所以 TensorFlow 的核心是 Python。

Alex Martelli:“TensorFlow 的发布向我表明,Python 肯定会在机器学习和人工智能的前沿。”

我想象不出 Python 永远不会被使用的细分市场。但让我们讨论一个例外:嵌入式系统。Python 的传统实现并不是内存使用非常节省的用户。在嵌入式系统中,你需要有这一点。然而,如果不是 Python 本身,某些方言可以解决这个问题。

具体来说,针对嵌入式语言设备编程物联网世界的 Python 方言被称为 MicroPython。我听说,BBC 正在分发,或者已经分发了大约一百万台运行 MicroPython 的设备给学童。

Driscoll:那么这是 Python 吗?

Martelli:这不是完整的 Python,因为它必须对内存使用施加一些限制。

你不能在两美元的设备上仅仅动态分配内存。它必须要有 64K,或者一定量的固定内存。但即使在这种动态分配的限制下,你仍然可以做很多编程工作。

过去有一些实现上的特殊性阻碍了 Python 在某些应用中使用,但现在它们正在被攻击。我知道拉里·黑斯蒂斯正在努力移除全局解释器锁(GIL)。尽管人们认为 GIL 对 90% 的应用来说无关紧要,但它对那 10% 需要使用芯片制造商塞入的越来越多的核心的应用来说是一个杀手。

如果你有一个优化以使用所有 32 或 64 个核心的算法,那么移除 GIL 将对那个小利基产生巨大的影响。逐渐,限制将消失。

亚历克斯·马尔泰利:'在操作系统的核心,我不相信我们会看到比现在更多的 Python。'

在操作系统的核心,我不相信我们会看到比现在更多的 Python。Python 可以在动态分配是可接受的地方存在,但这只是内核的一小部分。也许一些非时间敏感的设备驱动程序可以做到这一点。但大多数情况下,我看到 Python 是在用户空间运行,而不是在内核空间。

德里斯科尔:为什么?

马尔泰利:内核将需要更低级别的语言,顺便说一句,它们迫切需要比 C 更好的语言,这就是我为什么在研究 Rust 的原因。

我真的很想看到一个用 Rust 编写的实验性和简单的操作系统内核。无论如何,它确实有这个潜力。Python 并没有,因为内存分配的问题。此外,MicroPython 的技巧并不真正有效,因为你确实需要一些动态性。在那里控制分页真的很困难。但除了那个超级困难、超级核心级别之外,我看不出有任何限制。我甚至不能说天高任鸟飞,因为引力波确实在天空中,但我们已经征服了它们。

亚历克斯·马尔泰利:'我甚至不能说天高任鸟飞,因为引力波确实在天空中,但我们已经征服了它们。'

我唯一能想到的是,我们在 Python 移动开发方面还有很长的路要走。我听到一些好消息,但我没有与 Kivy 的个人经验。

这真的很遗憾,因为我记得吉多在谷歌时和安迪·鲁宾聊天,试图说服安迪,除了 Java 之外,Android 还需要一个更容易使用的应用级编程语言。安迪坚持他的观点,认为添加更多语言会让程序员更难。这不是真的!不幸的是,安迪是项目负责人,所以吉多无法取得任何进展。但如果我们能以某种方式更有说服力,那将是一个不同的世界。

德里斯科尔:在谷歌工作是什么样的体验?

马尔泰利:我在那里面试时找到的正是我所希望的,可能还有更多!

当然,对我来说,这已经是我漫长而多样化的职业生涯的巅峰。所以我的期望并不是像刚从大学出来的那些人那样充满憧憬。它们是通过观察在市场上运营的公司中发生的事情而变得成熟的。尽管如此,它很容易就被超越了,我甚至不确定这更多是关于公司,因为这是关于人。好吧,一个公司是由其人组成的。人们绝对出色是这个地方绝对出色的原因。

最终,秘诀就是拥有一群出色的人!现在,当谷歌有 7000 名员工时,这可能比有 70000 名员工时更容易。我的意思是,我不是说找到 70 个优秀的人很容易,但找到 70000 个肯定更难!我想,它不必是 100%,但应该接近 100%的出色人。

亚历克斯·马尔蒂:'最终,秘诀就是拥有一群出色的人!'

通过出色的人,我并不一定是指仅仅聪明。我确信找到聪明人比找到正确类型的人更容易,这些人从人类层面上关心最终用户、同事和合作伙伴。我的意思是,聪明很重要,但一个聪明的混蛋可能比一个笨拙的人造成的损害更大,对吧?所以你首先想要的是关心的人:那些在情感上投入团队、供应商和用户成功的人。

德里斯科尔:找到这样的秘诀有魔法吗?

马尔蒂:我不这么认为!你可以读遍所有出版的书籍,但我真的不这么认为!因为在面试中假装关心和做其他事情比真正年复一年地这样做要容易得多。所以你可能会出错。

亚历克斯·马尔蒂:'你做的任何事情都可能被放大,并产生完全不成比例的影响。'

在技术层面上,整个公司的规模当然会带来问题和挑战。但这也是你可以从工作中获得最大满足感的地方。你做的任何事情都可能被放大,并产生完全不成比例的影响。

只举一个例子:我确实说过我在 Stack Overflow 上很活跃。这其中的部分原因是我在今天的工作,那就是为谷歌云平台提供技术支持,而这大部分是通过 Stack Overflow 完成的。好吧,Stack Overflow 本身告诉我我已经帮助了超过 5000 万人。现在,我不知道他们是怎么猜测的,但我确实希望这是真的!我达到了回报所有别人给我的帮助,甚至更多的目标。

我知道我还没有达到我的书所达到的那个数量级。如果我有幸,我的书可能帮助了包括每本书的多个读者在内的一百万人。但它并没有达到 5000 万。这就是在谷歌工作的意义。

德里斯科尔:这有什么缺点吗?

马尔泰利:当然,要小心!一个错误会被放大同样多!一个小小的失误,你可能会让某个系统瘫痪一个小时。哎呀!现在至少让 5000 万人感到不便。但我喜欢玩这种超现实场景。

亚历克斯·马尔泰利:“教授某事,帮助有问题的某人,可能是了解该问题的最佳方式。”

教授某事,帮助有问题的某人,可能是了解该问题的最佳方式。你从外部看这个问题,但随后深入其中,参与其中,并投入其中。你可以带着对该主题的更深入理解退出这个经历。

德里斯科尔:谷歌是如何使用 Python 的?

马尔泰利:好吧,这是一个很长的故事,但让我们从谷歌存在之前开始。我强烈推荐的一本书是史蒂文·列维的《在 plex 中》。他被赋予了前所未有的访问权限,以便为谷歌和谷歌人写这本书。

从那本书中,我学到的就是,在谷歌还不是一个名字之前,拉里·佩奇在他斯坦福大学的宿舍里,正在尝试编写一个蜘蛛程序,将网络内容复制到本地机器上,以便进行处理和实验。他想要使用这种新的语言,Java 1.0 beta,但整个系统一直崩溃。所以拉里转向他的宿舍室友问道:“嘿,你能帮我一下吗?我就是无法让这个程序运行!”

室友看了一眼然后说:“当然不是!是那个垃圾 Java!来吧!让我们使用真正的编程语言!”

拉里得到了 Python,100 行 Python 代码后,第一个蜘蛛程序诞生了,网络内容开始在这个宿舍房间里找到其路径。所以从某种意义上说,如果没有 Python 来帮助编写第一个蜘蛛程序,谷歌可能永远都不会诞生!

亚历克斯·马尔泰利:“如果没有 Python 来帮助编写第一个蜘蛛程序,谷歌可能永远都不会诞生!”

这个蜘蛛程序如此关键,它肯定已经被重写了一百万次,我相当确信现在它是最优化的 C++代码之一。我已经很多年没有看过它了,但它的创作历史仍然有效。Python 和谷歌的下一个重大角色是作为所有深层基础设施任务的统一语言。

德里斯科尔:当时你在谷歌扮演什么角色?

马尔泰利:这就是我作为基础设施的超级技术领导者的介入之处。而不是使用 Bash、Perl 和其他强大但难以阅读的语言,所有东西都必须重新用 Python 编写。

那是我的第一份工作,基本上我和我的团队四处走动,与可靠性工程师、系统管理员等等合作,他们已经在 Bash 或 Perl 中编写了非常有用的工具。我们完全理解发生了什么,然后用 Python 重新编写它们,并在 Python 中实现它们。它是一百倍的可读性。

下一个重大突破是谷歌试图解决流媒体视频市场的需求。如果你听说过一个名为 Google Video 的项目,那里就是谷歌存放所有视频,展示给你,并让你搜索它们的地方。在当时,它背后有非常实质性的投资:数百名杰出的工程师和像明天就没有了那样的硬件资源。

Google Video 一直在与几英里外的一个小公司争夺功能战。每次这个小小的初创公司推出一个客户非常喜欢的新功能,我们的工程师就会急忙推出类似的东西,需要一个月或两个月。每次我们推出新的创新产品,那个小公司在一周内就完成了!

Driscoll: 你发现那个初创公司是如何快速发展的吗?

Martelli: 最后,我们收购了那个小公司,我们发现 20 个开发者如何绕过我们数百名优秀的开发者。解决方案非常简单!那 20 个人都在使用 Python。我们当时使用 C++。所以,那是 YouTube,现在仍然是。

lex Martelli: “我们发现 20 个开发者如何绕过我们数百名优秀的开发者。解决方案非常简单!那 20 个人都在使用 Python。”

当然,YouTube 的完全开发和特别是盈利需要很多年,因为它所使用的资源量巨大!它的受欢迎程度逐渐增长,这是 Python 的一个伟大成功故事。

用户界面代码的其他领域各不相同。有时 Python 是最前沿的,例如 Google App Engine(我们第一次涉足云,至今仍是一个非常创新的产品)最初支持的语言是 Python。多年来,Python 是那里唯一可以使用的语言。然后添加了 Java,然后又添加了其他语言。但 Python 仍然是 App Engine 上客户使用最流行的语言。

在 Google Cloud Platform 的其他领域,我们出于技术原因,必须限制客户可以使用的编程语言。Python 通常总是排名第一或第二。TensorFlow 可能是另一个很好的例子。我之前提到过,但重点是 TensorFlow 已经很长时间是 GitHub 上最受欢迎的下载。

App Engine 的存在已经影响了大量内部工具。那些可以部署在面向内部版本的 App Engine 上的工具更倾向于使用 Python,而且配置足够通用,你可以用这种方式做几乎所有的事情。所以实际上,从我 12 年半前加入谷歌以来,我不得不做一点 C++,尤其是在我修复现有系统的时候。但对我来说,基本上一直都是 Python。

Driscoll: 你还有其他什么想讨论的吗?

马特利:我想讨论 Python 在教育中的作用。在某个时候,可能是在 10 年前,甚至有一个由 Guido 负责的资助项目,旨在将 Python 定位为教育领域的核心角色。但这从未真正完成。虽然从中产生了许多优秀的东西,但 Python 在教育领域的普及并没有发生。

现在,Python 是大学入门课程中使用的第一大编程语言。它早已超越了 Java 和其他语言。但在高中,情况并非如此。随着计算机重要性的增长,对于大多数高中生来说,仅仅具备基本理解就足够了。他们使用的是各种语言的混合体。

那么,我们能为使 Python 更适合这个角色做些什么呢?我考虑的是,如果 Python 可以在线运行并通过浏览器访问,那将是个好事。有几个网站提供了这样的功能,但它们并不是以可扩展和统一的方式提供的。

我认为 Python 软件基金会(PSF)可以在它上面投入一些努力。为什么这么说呢?因为 Chromebook 现在是教育领域的领先设备。到目前为止,卖往学校的 Chromebook 数量超过了所有其他类型设备的总和。为什么?因为它们便宜,性能足够强大,安全性高,并且从管理员的角度来看,它们非常容易控制。

亚历克斯·马特利:“我认为 Python 不需要改变,但需要基础设施工作,以建立一个对学校高度可用的网站。”

无论你能在 Chromebook 上做什么,也就是说,基本上在网络上一个好的浏览器上,都比在任意操作系统上安装的东西更容易融入课程。

我认为 Python 不需要改变,但需要基础设施工作,以建立一个对学校高度可用的网站,提供学校所需的功能,例如管理员控制。这将真正改变数百万学生的生活。所以,这是我向那些正在思考他们可以用 Python 启动什么酷炫项目的人的呼吁。

德里斯科尔:感谢你,亚历克斯·马特利。

第八章。Marc-André Lemburg

Marc-André Lemburg

Marc-André Lemburg 是一位德国软件开发者和企业家。他是 eGenix 的 CEO 和创始人,该公司提供 Python 培训和咨询服务。Marc-André是 Python 的核心开发者,也是一系列流行 Python 扩展的创造者。他是 Python 软件基金会(PSF)的创始成员,曾两次担任董事。Marc-André是 Düsseldorf Python 会议的联合创始人,也是 EuroPython 协会(EPS)的主席。他经常在世界各地的 Python 会议上发表演讲。

讨论主题:mx 包、PSF、v2.7/v3.x。

在这里与 Marc-André Lemburg 保持联系:@malemburg

Mike Driscoll:你为什么成为程序员?

Marc-André Lemburg:我的父亲在 IBM 工作,所以我很早就接触到了计算机编程。

我热爱技术和让事物工作,但在当时(20 世纪 70 年代末晚期),对于像我这样的孩子来说,电脑仍然遥不可及。我玩弄着写在一张纸上的“程序”,并通过想象一个真正的电脑可能会如何执行它们来“运行”它们。

我在 11 岁时开始学习编程,那是在我爸爸买了一台 Sinclair ZX81 之后。首先,我学习了 BASIC,然后后来学习了 Z80 汇编器,因为 ZX81 是一款相当慢的机器。汇编器特别有趣。我必须逐个字节地将操作码组合起来编写程序,基于 Z80 手册。然后我将操作码转换为十六进制,并手动将它们输入到 ZX81 的十六进制编辑器中,以便运行程序。

Marc-André Lemburg:“我学会了欣赏性能,以及注意细节。”

这种努力是值得的,因为程序运行得比 ZX81 的 BASIC 快得多。我学会了欣赏性能,并注意细节。汇编代码中的错误通常意味着在运行程序并重新加载所有内容后,需要重新启动 ZX81。考虑到磁带驱动器接口,这需要相当长的时间。

大约两年后,我爸爸买了第一台 IBM PC1,我开始学习 MS BASIC、Turbo Pascal 和 Turbo C。在学校,我继续大量使用电脑,并在大学期间创立了我的第一家公司。

Driscoll:你是如何接触到 Python 的?

Lemburg:我在 1994 年通过翻阅一张名为 Hobbes 的 OS/2 Freeware CD 时第一次了解到 Python。Python 被列为编程语言之一,并包含在 1.1 版本中。

我在一个下午阅读了 Guido van Rossum 的教程,并立即确信我找到了我一直寻找的东西。Python 是一种具有所有重要数据结构的语言,实现方式易于使用,语法清晰,无需显式内存管理或括号来定义块。

当时,我主要编写 C 代码,因此我不得不定期处理系统语言的所有困难。这些问题包括内存分配、指针算术、溢出、段错误、在调试器中的长时间会话以及缓慢的编辑-编译-运行-调试周期。

Marc-André Lemburg: 'Python 拥有让我感到快乐的一切。'

Python 拥有让我感到快乐的一切:一个用于交互式实验的解释器、良好的文档、相当完整的标准库以及一个真正优秀的 C API,其中包含了将 Python 与现有 C 代码接口所需的一切。这包括一个我发现特别有趣的小细节:解释器正在使用它为语言提供的数结构来实现其自身的内部机制。

Driscoll: 你能解释一下你是如何成为企业家并创立自己的公司的吗?

Lemburg: 我 17 岁时开始从事 IT 工作。1993 年,在大学期间,我成立了我的第一家名为 IKDS 的公司,为想要进入当时新兴在线业务市场的本地公司做自由职业者。

1997 年大学毕业之后,我利用在构建几个网站引擎方面的经验,开始着手开发一个新的网络应用服务器。我的目标是构建一个使开发在线网络系统既容易又高效的系统。该系统将利用面向对象技术、关系数据库以及 Python 的简洁和优雅。

经过三年的艰苦努力,我完成了第一个版本,其中包含了商业企业产品所需的一切。然后,我在 2000 年初成立了一家有限公司来推广这个产品。应用服务器的开发使我进入了开源的世界。

Marc-André Lemburg: '应用服务器的开发使我进入了开源的世界。'

由于我没有足够的资源来彻底测试我正在编写的软件,我决定将应用服务器中使用的核心模块开源。这就是流行的 mx 扩展如何产生的。从商业角度来看,应用服务器并不成功。我发现市场还没有理解这种产品的优势。

之后,我更多地专注于咨询和为其他公司运行项目。其中一个更有趣的项目是完全用 Python 编写的金融交易系统。如今,类似的项目让我相当忙碌,所以我很遗憾没有太多时间贡献于 CPython 的开发。

Driscoll: 你能更详细地解释一下你们公司分发和维护的 mx 扩展吗?

Lemburg: 我在 1997 年开发网络应用服务器时开始着手 mx 扩展。当时,我发现 Python 缺少一个优秀的通用数据库模块。

曾经有一个基于 Windows 的 ODBC 接口,但它并没有真正达到在 Windows 和 Unix 平台之间提供可行和高效数据库接口的任务。我开始编写 mxODBC 来满足这一需求。我想创建一个快速且可移植的 ODBC 驱动程序接口,这样我就可以将应用服务器连接到所有流行的数据库。

在开发 mxODBC 时,缺乏一个好的日期/时间处理模块变得明显。mxDateTime 应运而生以解决这个问题,并在 Python 世界中成为标准,直到 Python 2.3 中 stdlib 增长了自己的 datetime 模块。

马克-安德烈·伦伯格:“mxDateTime 诞生了……并且多年来成为了 Python 世界的标准。”

mxTextTools 和其他几个 mx 包是为了在应用服务器中快速解析模板而产生的。后来,其他人用它来编写解析引擎,例如 Biopython(解析基因组数据),或者驱动实现用户定义语法的解析器。

mxTextTools 中的标记引擎工作方式有点像图灵状态机,因为它提供了非常快速的解析原语,这些原语可以使用 Python 元组组装。几个实用函数有助于使用解析结果来实现搜索和替换。mxTextTools 最初是为 8 位文本和二进制数据编写的。几年后,一位客户雇佣我将其扩展到 Unicode。

较少人知道的 mxStack 和 mxQueue 在应用服务器中扮演了快速数据结构的作用。mxTools 包是我为应用服务器编写的一系列快速内置工具。mxTools 中的几个想法最终以某种形式被添加到 Python 核心中。

德里斯科尔:你是如何成为 Python 核心开发者的?

伦伯格:在开始编写 mx 扩展时,我与 Python C API 及其内部有很多接触。我向 CPython 贡献了补丁,并在 1997 年后期成为核心开发者。

可能更多的人知道我对 CPython 的贡献是以 Unicode 集成形式出现的。1999 年,吉多联系了弗雷德里克·伦德和 myself,并要求我们为 Python 引入 Unicode。这是由 HP 向 Python 联盟(Python 软件基金会的前身)提供的资助所启动的。

马克-安德烈·伦伯格:“吉多联系了弗雷德里克·伦德和 myself,并要求我们为 Python 引入 Unicode。”

弗雷德里克开发了一个新的正则表达式引擎。我为 Python 添加了原生 Unicode 支持。我还设计了 Python 中的编解码器子系统。最初的发布是在 2000 年,Python 1.6/2.0 版本。我帮助维护了 CPython 2.0 的这个部分超过 10 年。

德里斯科尔:你为 Python 做出了哪些其他贡献?

伦伯格:我贡献了源代码编码系统、平台模块和 locale 模块的部分。我还负责 pybench 套件,用于测量 CPython 的增强,以及一些使 Python 运行更快或更舒适的补丁和想法。

德里斯科尔:作为 Python 的核心开发者,你遇到了哪些挑战?

伦伯格:在早期,作为核心开发者非常有趣,因为流程比现在要正式得多。唯一的真正挑战是针对 Unicode 的讨论往往导致无休止的讨论,有时甚至引发激烈的争论。

马克-安德烈·伦伯格:“针对 Unicode 的讨论往往导致无休止的讨论,有时甚至引发激烈的争论。”

我不知道这是否是因为 Unicode 是处理文本的核心,或者仅仅是因为参与讨论的许多人都很有个性。我对这些讨论大多持保留态度,并用幽默感来对待。

从那时起,我们已经看到了几代核心开发者来来去去。整合新开发者往往并不容易,涉及大量的讨论。我们不得不尝试解释 Python 开发是如何工作的,并将所有的新活力引导到正确的方向上。

德里斯科尔:Python 是 AI 和机器学习中使用的主要语言之一。你认为这是为什么?

伦伯格:Python 对于经常没有接受过计算机科学训练的科学家来说非常容易理解。它消除了你在尝试驱动进行研究的所需外部库时必须处理的许多复杂性。

在 Numeric(现在是 NumPy)开始开发之后,添加了 IPython 笔记本(现在是 Jupyter 笔记本)、matplotlib 和其他许多工具,使事情更加直观,Python 让科学家们主要思考问题的解决方案,而不是那么多的驱动这些解决方案所需的技术。

马克-安德烈·伦伯格:“Python 让科学家们主要思考问题的解决方案,而不是那么多的驱动这些解决方案所需的技术。”

就像其他领域一样,Python 是一个理想的集成语言,它能够轻松地将技术绑定在一起。Python 使用户能够专注于真正的问题,而不是花费时间在实现细节上。除了让用户更轻松之外,Python 还作为一个理想的粘合平台,为开发与外部库进行底层集成的开发者提供了便利。这主要归功于 Python 通过一个非常好且非常完整的 C API 非常易于访问。

德里斯科尔:如何改进 Python 以适应 AI 和机器学习?

伦伯格:我认为 Python 已经是你在 AI 和机器学习方面最好的选择之一。随着一个充满活力的社区致力于使语言更加完善,Python 在这个领域将拥有漫长而辉煌的未来。

迈克·德里斯科尔:你能解释一下 Python 软件基金会(PSF)是如何成立的吗?

莱姆伯格:在 PSF 之前,我们有 Python 软件活动小组(PSA),每年需要支付一小笔费用。我们还有一个不太为人所知的 Python 联盟,旨在支持 Python 开发,每年支付大笔资金。

这两个小组并没有真正为 Python 提供足够支持。Python 的版权也分散在几家不同的公司(参见 Python 许可证堆栈)。两家在 Python 上投入了显著资金的公司,Zope 公司和 ActivePython,启动了一个项目,旨在通过一个新的非营利组织解决所有这些问题。

这成为了 PSF,它是在 IPC9(第九届商业国际 Python 会议)上成立的。当时我们有 16 位 Python 核心开发者,两家公司作为创始成员。核心开发者,包括吉多,通过签署贡献者协议将他们的贡献许可给了 PSF,所有后续的发布都是以 PSF 的名义进行的。

初始时,Python 软件基金会(PSF)仅作为维护 Python 发行版版权的法律实体。后来,PSF 还获得了来自 CNRI 的 Python 标志商标权。

2003 年,PSF 在华盛顿资助了首届 PyCon US 会议。这一新举措为 PSF 引入了收入来源,为帮助 Python 社区开辟了新的可能性。

马克-安德烈·莱姆伯格:“这一新举措为 PSF 引入了收入来源,为帮助 Python 社区开辟了新的可能性。”

随着 PyCon US 的成长和商业赞助商的支持增加,收入也相应增长。这导致 PSF 在多年后成为一个更加成熟的组织。我曾担任 PSF 董事会成员数年,以帮助这些发展。

德里科尔:我知道你帮助组织了首届 EuroPython 会议。你能告诉我关于这件事的吗?

莱姆伯格:2001 年,一群欧洲 Python 和 Zope 用户及公司开始了一场关于在欧洲举办 Python 会议的长篇讨论。

Python 研讨会和 IPC 会议都在美国举行。当时在欧洲几乎没有 Python 的活动。我是讨论的参与者之一,他们似乎并不想结束。在活动临近时,我加入了执行委员会,实际上促成了 EuroPython 会议的举办。这就是 2002 年 EuroPython 会议的由来。

马克-安德烈·莱姆伯格:“当时在欧洲几乎没有 Python 的活动。”

整个活动都是由志愿者组织的,与美国当时的商业 Python 会议不同。我们的预算非常有限。因此,EuroPython 也早于 PyCon US,后者是美国首个由志愿者组织的会议。

EuroPython 2002 在沙勒罗伊举行。能够举办第一次主要的欧洲 Python 会议非常有趣。EuroPython 也相当成功,甚至 Guido 也出席了。如今,每年都有许多国家级的 Python 活动举行,因此虽然 EuroPython 不想与其他国家级 Python 活动竞争,但它确实在这个领域运营。

Driscoll:EuroPython 这些年是如何变化的?

Lemburg:自从早期开始,EuroPython 就发展壮大,并在 2014 年达到了 1000 名参会者的里程碑。会议仍然由志愿者运营,但它已经不再是一个可以在旁边进行的操作了。

组织 EuroPython 的 EuroPython 社会有很多工作要做,以确保每年都能举办会议。我目前是组织的主席,并且已经担任董事会成员多年。每年,我们都在将活动发展成一个更专业的设置。尽管如此,保持对举办会议所需完成的每一件事的掌控仍然是一个挑战。董事会成员通常需要投入 200 到 400 个小时才能使活动得以举办。

Driscoll:你对当今的 Python 最兴奋的是什么?

Lemburg:我最兴奋的是原生的异步 I/O 支持。随着新关键字的添加,这最终在 Python 中变得可用,并将大大有助于利用今天机器上可用的全部 CPU 功率。

Marc-André Lemburg:“我最兴奋的是原生的异步 I/O 支持。”

顺便说一下,我发现 Python 的类型注解是当今 Python 最不令人兴奋的发展。它们剥夺了 Python 程序的许多优雅之处。尽管类型注解是可选的,但许多公司将通过企业政策强制执行其使用。这最终会导致越来越多的 Python 使用这些注解编写,使 Python 看起来更像任何其他现代静态类型脚本语言。

Driscoll:你对 Python 2.7 有什么看法?每个人都应该迁移到最新版本吗?

Lemburg:是的,它们应该迁移,但你必须考虑从 Python 2.7 迁移到 3.x 需要投入多少工作量。许多公司都有为 Python 2.x 编写的庞大代码库,包括我的公司 eGenix。从商业角度来看,并不总是有理由将代码迁移到 Python 3.x,因此两个世界之间的分歧将延续到 2020 年之后。

Marc-André Lemburg:“从商业角度来看,并不总是有理由将代码迁移到 Python 3.x,因此两个世界之间的分歧将延续到 2020 年之后。”

Python 2.7 确实有其优势,因为它成为了 Python 的 LTS 版本。企业用户通常喜欢这些长期支持版本,因为它们减少了从一个版本迁移到下一个版本的工作量。

我认为 Python 还需要推出一个 LTS 3.x 版本,以便在商业世界中持续成功。一旦我们确定这样的版本,这也将为 Python 2.7 的移植提供一个更可行的案例,因为投资将在接下来的几年中得到保障。

Driscoll: 你希望在未来的 Python 版本中看到哪些变化?

Lemburg: Python 将需要使今天机器上的全部核心和 CPU 数量更容易使用。异步 I/O 通过更好地利用单个核心已经有所帮助,但这并不是多核部署的解决方案。

移除全局解释器锁(GIL)并用更细粒度的锁定机制来替换它是一种方法,但通往这样一个世界的道路将是漫长且坎坷的。我们应该小心不要低估其复杂性和可能对众多 C 扩展造成的破坏。疏远这些扩展将会严重阻碍 Python 的发展,因为它们是 Python 成功的关键驱动因素。因此,我们必须为现有的扩展提供一个平稳的升级路径,也许可以通过在它们控制时保持 GIL 来实现。

在我看来,我们还应该调查其他方法,例如使进程间通信更加高效和用户友好,甚至可能通过添加新的关键字来自动并行运行代码。

Driscoll: 谢谢,马克-安德烈·莱姆伯格。

第九章。巴里·沃沙克

巴里·沃沙克

巴里·沃沙克是一位美国软件工程师,也是 LinkedIn 上 Python 基金会团队的一员。巴里在 Canonical 工作了 10 年,成为 Ubuntu 和 Debian 的开发者,负责这些操作系统上的 Python 生态系统。他是 GNU Mailman 项目的负责人,这是一个用 Python 编写的流行开源邮件列表管理器。巴里以前的角色包括 Jython 的首席维护者、Python 发布经理和 PythonLabs 的成员。如今,他是一名核心开发者,是几个成功的 Python 增强提案的作者,也是众多 Python 库的维护者。

讨论主题:PythonLabs、Python 的未来、v2.7/v3.x。

在这里与巴里·沃沙克保持联系:@pumpichank

迈克·德里科尔:你是如何成为程序员的?

巴里·沃沙克:我很小的时候就开始了编程。那时的电脑实际上是电传打字机,它们连接到学校的主机和主要学区的主机。所以我上了电传打字机。

我学习了 BASIC,那真的很有趣。我记得那年夏天,另一所学校的一些孩子用那些同样的电传打字机入侵了教育局的主机。所以第二年,他们把所有的电传打字机都从学校撤走,给了我们基于 6502 的 PC。老师们根本不知道怎么使用它们,所以我教了老师们。

指导顾问注意到了我在做什么。他们把我介绍到当时被称为国家标准局(NBS)的马里兰州盖瑟斯堡的一个联邦研究设施,在那里我学会了喜欢分享程序和与他人协作。

德里科尔:那么你在整个高中时期都和 NBS 一起工作吗?

沃沙克:是的,我在高中和大学期间都通过 NBS 实习。然后我在现在被称为国家标准与技术研究院(NIST)的地方找到了一份全职工作,我在那里一直工作到 1990 年。

我在 NIST 的实习和全职工作让我眼界大开,因为我实际上并不了解真正的行业是什么样的,或者成为一名专业程序员是什么样的体验。

巴里·沃沙克:“我实际上并不了解真正的行业是什么样的,或者成为一名专业程序员是什么样的体验。”

我当时与机器人团队一起工作,尽管我没有做很多机器人相关的工作,但我确实发现自己正在为工厂自动化中的工业机器人开发图形用户界面。那份工作真是令人惊叹。从那里我开始接触系统管理。几年后,我们得到了很多 Sun-3 电脑,因此我们学习了 SunOS、Unix、C 编程、Emacs 以及各种类似的东西。

我是一名计算机科学本科生,那没问题,但我真正通过在 NIST 做实际编程来学习这一行。我注意到大学课程并不能完全为你最终要做的事情做好准备。

巴里·华沙:'我真正通过在 NIST 做真正的编程来学习这门手艺。'

例如,我正在和一些实习生交谈,他们说在大学里,至少作为本科生,你甚至没有学习版本控制系统,比如使用 Git。这对我来说真是太令人震惊了。我无法相信大学环境与实际工作程序员的现实是多么脱节。当你从大学毕业出来,发现一切都完全不同,这非常令人震惊。

德里斯科尔:你认为 Python 为新的程序员提供了你所说的真正的编程途径吗?

华沙:是的,当我今天和用 Python 的孩子们交谈时,这些孩子们往往已经以某种方式与 GitHub 上的一个项目联系上了。有时他们甚至参加过 Python 会议,并留下来参加了冲刺活动。

孩子们通过这种方式学到了更多关于现代软件工程最佳实践的知识。你真的能看得出来。他们进来后,就明白了如何进行拉取请求和如何提交良好的错误报告。我告诉所有我交谈的年轻孩子,去找一个 GitHub、GitLab 或甚至 Bitbucket 项目,找到他们感兴趣的项目,并开始参与其中。

当然,Python 是一个令人惊叹的社区,对各种各样的人都非常欢迎。在 Python 社区中,我们友好,接受任何人,并引导和指导他们。所以我也会告诉那些真正想学会正确做事的学生,来 Python 社区参与其中,因为他们通过这样做会学到很多东西。

德里斯科尔:你是如何最终开始学习 Python 的?

华沙:1994 年,我遇到了罗杰·马塞尔。他的女朋友(现在的妻子)和我的妻子关系非常好,所以我们都会一起吃饭。罗格和我真的在技术层面上产生了共鸣。

罗格刚刚开始在弗吉尼亚州的 CNRI(国家研究倡议公司)开始工作,CNRI 是由 TCP/IP 的两位创始人鲍勃·卡恩和文特·瑟夫创立的。所以 1994 年夏末,我也开始在 CNRI 工作。

我当时正在做一个名为 knowbots 的项目。这些是会将自己打包并移动到不同主机的软件代理。knowbots 会在另一个主机上做一些工作,然后在互联网上四处移动,为你寻找信息。我和罗格开始用 Objective-C 在 NeXT 机器上做这个项目。

有一段时间后,一些仍在 NIST 的朋友告诉我,有一个荷兰人即将来此举办一个小型的关于他发明的那种语言的研讨会。他们问我是否有兴趣,所以我们做了一些研究。当然,是吉多·范罗苏姆,那种语言是 Python,所以我们说:“当然,我们非常愿意参加。”

巴里·华沙:'一个荷兰人...即将来此举办一个小型的关于他发明的那种语言的研讨会。他们问我是否有兴趣,所以我们做了一些研究。当然,是吉多·范罗苏姆,那种语言是 Python。'**

我们想和吉多谈谈他的想法,因为我们认为 Python 对于这个 Objective-C 项目来说可能非常酷。我们觉得可以用 Python 来编写 Objective-C 脚本。

1994 年 11 月举办了研讨会。当时我们只有 20 人,我们深深地爱上了 Python 和吉多。他非常开放和酷,研讨会也非常棒。我想吉多和我都是 Emacs 的粉丝,所以我们讨论了 Python 中的 docstrings 在语法上可以如何工作,至少在语法上可以像 Emacs Lisp 中的 docstrings 一样。

研讨会之后,我们回到了 CNRI,非常兴奋地谈论我们认为 Python 将会非常出色。我们的一位同事说:“嘿,我们为什么不尝试雇佣吉多呢?”我们不知道他是否愿意来美国,或者是否对参与这个 Objective-C Python 项目或 knowbot 项目感兴趣。但他确实愿意,所以 1995 年 4 月吉多开始在 CNRI 工作。

我们将大部分基础设施从荷兰迁移到了弗吉尼亚。我想当时是一个 CVS 仓库。所以我们把 CVS 仓库迁移过来,为 Python 做了很多系统管理的工作,当然也开始了 Python 的开发。

巴里·华沙:'Python 1.2 是我们从 CNRI 发布的第一个版本。所以在某种程度上,它非常像今天的 Python。'

当时我对 C 语言相当熟悉,所以我们做了很多关于 Python C 内部的工作,以及 Python 标准库的工作。我认为 Python 1.2 是我们从 CNRI 发布的第一个版本。所以在某种程度上,它非常像今天的 Python。即使 Python 3 也有当时 Python 的感觉。尽管有很多令人惊叹的新特性,但我不知道你是否能认出它。

我似乎记得,尽管 Python 有类,但它甚至没有关键字参数。我们当时在图形上用 Tcl/Tk 做了很多事情。函数的签名变得荒谬,因为尽管大多数参数都是 None,但你必须全部传递它们。所以这就是做关键字参数的动机。无论如何,CNRI 很棒,与吉多一起工作 Python 非常棒。我们一直这样做,直到吉多离开。

Driscoll: 史蒂夫·霍尔顿说你是 PythonLabs 的一员。你是创始人之一吗?

华沙:是的,2000 年我们中的一群人离开了 CNRI,去寻求与 Python 相关的财富。我们五个人:蒂姆·彼得斯、杰里米·希尔顿、弗雷德·德雷克、我自己和吉多。罗杰留在了 CNRI。那个小组就是我们所说的 PythonLabs,但更多是一种内部玩笑。我的意思是,它并不是真正官方的事情。

巴里·华沙:'2000 年,我们中的一群人离开了 CNRI,去寻求与 Python 相关的财富。'

我们加入了 BeOpen,但那持续了几个月就结束了。然后我们都搬到了 Zope 公司。我们感觉就像是一个由我们这五个人和 Tim Peters(当然)组成的俱乐部。这就是 PythonLabs 的真正含义。我甚至在邮件列表上开过一次玩笑,问 Tim PythonLabs 是否还存在。如果你去 pythonlab.com,你会找到 Tim 对我问题的非常幽默的回应。

Driscoll: 你们在 PythonLabs 中有没有具体的角色?

Warsaw: 实际上不是,尽管 Guido 确实领导了我们关于 Python 的工作,以及我们与 Python 一起的工作。

我记不起我们最初在 Zope 公司做了什么细节,但当然,我们都在 Zope 公司内有任务要做。然后我们会聚在一起,专注于 Python 本身。

Barry Warsaw: '我们专注于我们认为有趣的事情,比如内部,新特性,错误修复或基础设施。'

我们专注于我们认为有趣的事情,比如内部,新特性,错误修复或基础设施。所有这些事情当时真的需要做,因为 Python 社区比现在小得多。

Driscoll: 那当时你们对 Python 语言有什么具体的目标吗?

Warsaw: 你知道,我很难记住确切的时间线,但我确信有人可以进行考古研究,找出那些特性。我记得那些大的推动。

我在 CNRI 最早做的一件事是与 Roger 一起工作,那被称为大规模重命名。当时的 Python C 源代码没有现在 C API 拥有的那些整洁的命名空间。它们都只是在全局命名空间中命名。

那个问题在于人们试图嵌入 Python,但这行不通,因为那些名称与它们自己的符号冲突。所以我们进行了大规模的重命名,我们走过了整个内部 C API 并进行了清理,这样你就可以在其他 C 应用程序中嵌入 Python。我记得那是我做的第一件大事之一。

当时还做了很多关于新式类的工作,当然在 Python 3 中,新式类是唯一的类。关于新式类基础设施中的类型系统将如何工作有很多讨论。

我还从原始研讨会上记得,有个名叫 Don Beaudry 的人。他在做一些疯狂的元类黑客行为。当然,Jim Fulton 也非常感兴趣于做元类的事情。Jim 是 Zope 公司的 CTO。

Barry Warsaw: '到 Python 2.2,我们真的想正确地实现元类并修复经典类语义中的一些问题。'

我记得在最初的 Python 研讨会上,我对元类了解不多。当时它超出了我的理解范围。然而,到了 Python 2.2,我们真的想要正确地实现元类并修复经典类语义中的一些问题。

我记得有很多关于如何让新式类功能工作,以便你可以从类型继承并定义新类型以及新实例的讨论。功能太多了,但我们都在对我们感兴趣的事情上投入了。

Driscoll: 我似乎记得你曾经参与过 Python 原始电子邮件库的开发。你还记得这是怎么开始的吗?

Warsaw: 是的,所以我们在早期做的一件事是将 Python 邮件列表迁移到 CNRI。它仍然在 CWI 运行,这是 Guido 在来到美国之前工作的荷兰研究所。

Python 邮件列表当时运行在 Majordomo 上,这是当时最受欢迎的邮件列表软件,完全用 Perl 编写。当我们迁移它时,我们想要改进的地方有很多。顺便说一句,Ken Manheimer 实际上在这里出现,因为他在 Mailman 的早期阶段起到了非常重要的作用。

因此,我们将 Majordomo 安装迁移到了 CNRI,但真正不方便的是我们想要对其进行的更改,因为我们不喜欢用 Perl 开发。我们是 Pythonista,对吧?

Barry Warsaw: '我们不喜欢用 Perl 开发。我们是 Pythonista,对吧?'

我们有一个名叫 John Viega 的朋友,他正在弗吉尼亚大学读书。John 在 Dave Matthews Band 成名之前就和他们成为了朋友。所以 John 想用 Python 编写一个小型的邮件列表管理器,这样他就可以用它来连接乐迷和乐队,并发送公告。他编写了邮件列表管理器,我们得知了这件事。

我们认为也许我们可以为 Python 邮件列表做这件事,因为有一个基于 Python 的邮件列表管理器会更好。所以我们得到了一个邮件列表管理器的副本,但约翰丢失了光盘和后来成为 Mailman 的原始副本。幸运的是,Ken 有一份副本,他将其恢复过来,我们能够开始工作以支持 Python 社区的邮件列表。

我们决定将邮件列表管理器命名为 Mailman。然后我们将其放入 GNU 项目,并对其应用了 GPL 许可。我个人非常投入 Mailman。这很有趣,我真的很喜欢允许人们进行交流的方面。

Barry Warsaw: '我真的很喜欢允许人们进行交流的方面。'

早期 Mailman 软件的另一件非常酷的事情是它有一个 Web 界面,这是 Majordomo 当时没有的。在我看来,这是 Mailman 的一个决定性因素。

我意识到的一件事是,没有好的 RFC 兼容的电子邮件解析软件。真的没有。标准库中有 rfc822 模块,但它并不先进,而且新的电子邮件标准正在出现,用于电子邮件消息的格式。

显然,rfc822 是不够用的。所以我工作于一个名为 mimelib 的分支,它增加了对 MIME 构造的支持:编写消息、具有不同的 MIME 类型和图像。我们定义了一个描述电子邮件消息的模型,特别是 MIME 消息。

我们希望能够以编程方式构建电子邮件消息的树。我们有一个解析器,你可以给它提供一些 Python 2 字节字符串。你有了这个解析器,它会给你一个表示电子邮件消息的树。然后你可以操作这个树,并将其传递给一个生成器。生成器会将树扁平化为电子邮件消息的字节表示,包括 MIME 边界等。

我们尽力做到 RFC 兼容。我认为我们相当成功,但这些标准非常复杂。我认为即使现在我们还在学习其中的缺陷和错误。无论如何,mimelib 是一个东西,我将其作为独立的第三方包发布。然后我开始在 Mailman 中使用 mimelib。拥有这样一个可以独立于 Mailman 开发并仅作为依赖项拉入的第三方包,确实是一个真正的优势。

我记不清具体是什么时候了,但有一次 Python 发布时,我们觉得 mimelib 非常稳定,API 也相当不错。所以我们把 mimelib 添加到标准库中,并将其重命名为 email 包,这无论如何都是一个更好的名字,因为它的内容远不止 MIME。

巴里·沃沙克:'我们将 mimelib 添加到标准库中,并将其重命名为 email 包。'

因此,这就是 email 包的历史。它来自 mimelib,而 mimelib 又是在旧 Python 标准库中的 rfc822 模块之上,由 Mailman 的工作发展而来。我实际上和那些家伙开玩笑说,我们应该在 PyCon 的研讨会上叫它“爷爷的 Python 时间”!我们都已经围绕 Python 很久了。我们应该说,“孩子们!上来围坐在火堆旁。爷爷会给你讲讲 Python 旧日的故事。”

德里科:所以,我们谈到了 Mailman。你在担任该项目的负责人时,有没有学到任何你想分享的经验教训?

沃沙克:我不确定我是否真的是最好的项目负责人!我有许多兴趣,发现很难在项目上投入正确的时间。

我很幸运,在 Mailman 项目中有核心开发者,他们是出色的开发者,真正令人惊叹的人,而且非常友好。我 PyCon 的亮点是与核心开发者们聚在一起,社交活动,共同工作在技术上,并保持其最新状态。

巴里·华沙:'我 PyCon 的亮点是与核心开发者们聚在一起,社交互动,共同工作于技术,并保持其最新状态。'

Mailman 已经存在很长时间了,它仍然是一个可行的项目。我认为您必须真正开放,信任您的核心开发者,并愿意将项目的一部分交给他们。优秀的网页设计师真正理解技术,并能设计出既美观又易于使用的优秀界面。这对我很棒,因为这样我就可以专注于真正让我感兴趣并激发我热情的部分。

我们有一些谷歌夏日代码项目,我们的一个核心开发者就是从那里来的。他为我们做了大量的工作,包括我们的 Docker 镜像和一些粘合层。能够与真正喜欢一起工作的开发者合作,你知道他们非常聪明和友好,这真是太好了。

您需要拥有那些能够展现出我喜欢的 Python 社区那种氛围的开发者。Python 社区是欢迎和友好的,注重在人们加入时进行指导。因此,我认为另一个教训是要开放地展示您所做的事情,并贡献您的时间和专业知识,因为这将十倍地回报您。

巴里·华沙:'我认为另一个教训是要开放地展示您所做的事情,并贡献您的时间和专业知识。'

德里斯科尔:你在 Mailman 项目中遇到过你预料之外的挑战吗?

华沙:哦,是的。现在这种情况不多,但因为是 Mailman 是免费的,我们免费提供它,所以我们甚至不知道所有使用它的人。

我们以任何方式都不控制 Mailman,也不告诉人们他们可以用它做什么或不能做什么。大多数人用它做非常好的事情,比如他们的自行车俱乐部,或者肯定是在很多技术讨论列表中。但有些人确实用 Mailman 做坏事,比如垃圾邮件。一个挑战是,当人们被无良的开发者垃圾邮件骚扰时,我们会接到他们的联系,有时会收到很多威胁邮件,这非常令人沮丧。

我学到的一件事是,当人们感到沮丧时,他们会向您伸出援手。他们正在经历痛苦,因为他们被某人垃圾邮件骚扰。他们不知道是谁在垃圾邮件,而且他们从那个人那里得不到任何缓解,所以他们会四处寻找。

现在,我们非常突出地公告我们不提倡垃圾邮件,也不批准将 Mailman 用于任何非法目的。我们鼓励人们使用 Mailman 进行自愿订阅,这样您就知道您正在注册某项服务。但我们实际上无法控制它。

巴里·华沙:'我发现有帮助的一件事是让人们知道 Mailman 背后有真人。'

我们没有管理权限,但在人们感到沮丧的时候会联系我们。我发现有一件事很有帮助,就是让人们知道 Mailman 背后有真人。我们有时会做一些研究,看看是否能找到联系人,或者找到他们的托管提供商。即使是那些最沮丧的人,通常也会对此表示非常感激。

所以在早期那段时间真的很具挑战性。人们会给我个人的邮箱发送非常恶毒的邮件,这真的很让人沮丧。互联网上到处都是各种各样的人,对吧?

Driscoll: 所以在我们为“PyDev 每周一星”系列访谈时,你提到你在 Canonical 工作。在 Linux 发行版公司工作是什么样的体验?

Warsaw: 嗯,那真的很棒。我在四月份停止了那里的工作,但我已经在那里工作了十年。我真的很喜欢它,而且那是一个很好的位置,因为我感觉我真正能够帮助 Ubuntu 和 Debian 的 Python 社区。

在 Canonical 工作对于帮助 Linux 发行版的消费者,如 Ubuntu 或 Debian,以及在这些平台上使用 Python 的用户来说是一个很好的交汇点。我是 Python 的核心开发者,所以当出现问题时,我能够看到是否需要将修复程序放入 Debian 或 Ubuntu,并询问是否需要在上游 Python 中或某些库中实施。

Barry Warsaw: “我是 Python 的核心开发者,所以当出现问题时,我能够看到是否需要将修复程序放入 Debian 或 Ubuntu,并询问是否需要在上游 Python 中或某些库中实施。”

因此,我有机会与广泛的 Python 项目紧密合作。我还能与 Python 本身互动,并在我认为需要改进以在 Linux 发行版上分发的 Python 领域工作。这真的很有趣。这是一次极好的经历,我真的很高兴有机会去做。

Driscoll: 你在 Canonical 的角色中具体做了些什么?你能解释一下吗?

Warsaw: 是的,我曾是基础团队的一员,这是一个小型团队,负责 Linux 发行版的这种管道层。

所以想象一下,在最底层是内核,对吧?我们没有做任何内核工作,因为我们有一个独立的内核团队。但在那之上,有启动过程、编译器、工具链和构建存档健康等东西。所以当事物进入存档时,你想要确保它是稳定和健壮的。这些都是内核之上、桌面之下的各种随机混合事物。

基础团队负责的一项工作是语言翻译器。Python 在编写操作系统自身和构建过程使用的脚本方面相当流行,因此它是 Ubuntu 和许多 Linux 发行版的重要语言。

巴里·华沙:'我负责的是 Ubuntu 上 Python 生态系统的整体健康。'

我负责的另一件事是 Ubuntu 上 Python 生态系统的整体健康。这包括处理过渡,比如尝试让所有人都迁移到 Python 3。然后,随着 Python 的新版本发布,虽然我没有直接进行解释器的工作,但我确实参与了所有相关软件包的工作。

为了将 Python 3.5 设置为 Ubuntu 的默认版本,你需要经过许多步骤。这是一个漫长的过程。许多软件包无法构建,或者在新版本的 Python 中存在错误,因此你必须修复这些问题,进行优先级排序等等。所以,我在 Ubuntu 上做的主要事情之一就是真正地致力于 Python 生态系统。

再次,我正在查看工具,看看 Ubuntu 开发者在使用 Python 工具时遇到了哪些痛点。我试图弄清楚如何改进它们以及在哪里改进它们。例如,如果在使用 pip 和 setuptools 时 Ubuntu 开发者遇到了一些摩擦,那么修复可能需要进入 pip 和 setuptools。我有责任意识到人们在使用 Ubuntu 时遇到的痛点。

巴里·华沙:'我正在查看工具,看看 Ubuntu 开发者在使用 Python 工具时遇到了哪些痛点。我试图弄清楚如何改进它们以及在哪里改进它们。'

此外,我还与许多在 Ubuntu 上使用 Python 的人进行了大量咨询。如果有人对 Python 有疑问,我会与他们合作,回答他们的问题,并进行代码审查。

我还与社区中的许多人合作。如果 Ubuntu 上的社区成员对 Python 的工作方式有疑问,或者遇到问题,我就是他们可以交谈和合作的人之一。其中很多是由社区驱动的,但我认为如果你真的想使一个发行版成功,那么你必须投入资源。每个 Linux 发行版都会为其社区投入资源,否则它就会分崩离析。

巴里·华沙:'其中很多是由社区驱动的,但我认为如果你真的想使一个发行版成功,那么你必须投入资源。'

德里科:让我们转到稍微不同的话题。你认为是什么使得 Python 在当前成为 AI 和机器学习如此好的语言?

华沙:Python 是一种出色的粘合语言。它也非常容易学习和使用,对于专家程序员和研究人员来说都是如此,对于研究人员来说,编程不是他们的主要职业。

我认为这两个方面使 Python 成为机器学习等领域的一个优秀语言。随着你进行实验,这种语言非常灵活,但在构建更大的系统时又非常稳健。我认为这也是我们看到 Python 在数据科学领域变得如此流行的贡献因素之一。这些技术通常不是编程的中心职业,而是作为核心研究的一种辅助。

德里斯科尔:我们能为 Python 做些什么,使其成为 AI 和机器学习更好的语言?

华沙:我不确定 Python 需要做出多少改变,但 Python 生态系统可能得到改善,以便更多地展示 AI/机器学习库,并使这些库与其他 Python 应用、框架和库的集成更加容易。

德里斯科尔:所以,出于好奇,你现在在做什么?

华沙:我只是在几周前开始与领英合作。我真的很喜欢它。我认为这是一家很棒的公司,他们使用了大量的 Python。所以,我还在做 Python 相关工作。我在领英内部工作 Python,并且非常喜欢这个团队。

我认为领英有一个伟大的使命,我对公司试图做的事情感到兴奋。使命是连接人与经济机会,所以领英帮助我找到一份工作,而那份工作竟然是在领英,这有点好笑!

领英还有许多其他的事情要做。我真的很喜欢他们专注于帮助人们找到他们在职业生涯中想要做的事情的正确匹配。

德里斯科尔:鉴于你对 Python 有如此深入的了解,你能告诉我你如何看待 Python 作为一门语言在未来的发展吗?

华沙:这是一个非常有趣的问题。我认为在某些方面很难预测 Python 的未来。我已经参与了 Python 23 年,我无法预测 1994 年计算世界会是什么样子。

巴里·华沙:“我已经参与了 Python 23 年,我无法预测 1994 年计算世界会是什么样子。”

我观察手机、物联网(IoT)设备,以及整个今天计算的样子,包括云和容器。环顾四周,看到所有这些令人惊叹的东西。所以,根本无法预测五年后 Python 会是什么样子,更不用说十年或十五年后了。

我确实认为 Python 的未来仍然非常光明,但我认为 Python,尤其是 CPython(Python 在 C 中的实现),面临挑战。任何存在了那么长时间的语言都会有一些挑战。Python 是为了解决 90 年代的问题而发明的,而计算世界现在不同了,并且还将继续变化。

巴里·华沙:“Python 是为了解决 90 年代的问题而发明的,而计算世界现在不同了,并且还将继续变化。”

我认为 Python 面临的挑战包括性能和面向多核或多线程应用等问题。肯定有人在研究这些内容,并且可能会出现像 PyPy、Jython 或 IronPython 这样的 Python 的其他实现。

除了各种实现所面临的挑战之外,Python 作为一门语言所拥有的,我认为这是它的真正优势,就是它能够与人类规模相匹配地扩展。例如,你可以让一个人在他们自己的笔记本电脑上编写一些脚本来解决他们遇到的具体问题。Python 在这方面非常出色。

巴里·沃沙:'Python 作为一门语言,我认为它的真正优势在于它能够与人类规模相匹配地扩展。'

Python 的扩展能力也适用于,比如说,一个由 10 到 15 人贡献的小型开源项目。Python 可以扩展到数百人在一个相当大的项目上工作,或者数千人在大型软件项目上工作。

Python 作为一门语言的另一个惊人优势是,新开发者可以轻松地学习它,并且能够很快地变得高效。他们可以下载一个完全新的、他们以前从未见过的项目的 Python 源代码,然后轻松快速地学习它。当 Python 在人类规模上扩展时,确实存在一些挑战,但我感觉这些挑战正通过诸如类型注解之类的解决方案得到解决。

在非常大的 Python 项目中,当你有初级和高级开发者的混合时,初级开发者理解如何使用现有的库或应用程序可能需要付出很多努力,因为他们来自更静态类型化的语言。

因此,许多正在构建大型 Python 代码库的组织正在采用类型注解,可能并不是为了帮助提高应用程序的性能,而是为了帮助新开发者的入职。我认为这对 Python 继续在人类规模上扩展起到了很大的作用。

巴里·沃沙:'我认为如果我们解决了一些技术限制……那么我们实际上为 Python 的下一个 20 年的成功和增长做好了准备。'

对我来说,语言的扩展能力和 Python 社区的欢迎性质是使 Python 即使在 23 年后仍然具有吸引力,并在未来继续具有吸引力的两个因素。我认为如果我们解决了一些技术限制,这些限制是完全可行的,那么我们实际上为 Python 的下一个 20 年的成功和增长做好了准备。

德里科:你看到 Python 即将推出任何新功能吗,或者还有什么其他让你兴奋的事情吗?

沃沙:是的,我的另一个朋友,埃里克·史密斯,他也是核心开发者,提出了这些很棒的功能,你不知道没有这些功能你如何使用 Python。

Python 3.6 中的一个新特性是 f-strings,即格式化字符串。我只在几个项目中使用过 f-strings,因为它们是 Python 3.6 的特性,但我非常喜欢 f-strings。我也喜欢 contextlib。

巴里·沃沙:'我每次发布时都会这么说,但 Python 3.7 将真正成为最好的。'

我也非常期待 Python 3.7。我每次发布时都会这么说,但 Python 3.7 确实将成为最好的。我们将看到一些伟大的新库,对asyncio的改进,以及更好的性能。Python 开发仍然充满活力,我相信我们对工作流程的改进(例如,转向 Git 和 GitHub)真正为更多的人打开了 Python 开发的大门。

我喜欢看到人们可以尝试疯狂的想法,比如 gilectomy,即使它们最终没有成功,也能为未来的发展提供素材。C Python 的实现易于理解、导航和更改,这使它成为一个非常适合实验和变革的平台。

同时,我们有 Guido 的持续监护和其他长期开发者提供视野和连贯性,所以尽管今天的 Python 与 20 多年前的 Python 看起来非常不同,但它仍然感觉像是一个设计良好、一致、易于学习且可扩展的语言。

德里斯科尔:你对 Python 2.7 的长寿有何看法?

华沙:我们都知道我们必须转向 Python 3,所以 Python 2 的生命是有限的。我在 Ubuntu 内部将推广 Python 3 作为一项使命,试图让人们转向 Python 3。同样,在 LinkedIn 内部,我非常兴奋,因为我的所有项目现在都在 Python 3 上。Python 3 比 Python 2 更有吸引力。

巴里·华沙:“我们都知道我们必须转向 Python 3,所以 Python 2 的生命是有限的。”

你甚至没有意识到 Python 3 中所有你拥有的特性。我认为其中一个非常酷的特性是异步 I/O 库。我在很多地方都使用了它,并认为这是一个非常吸引人的新特性,它始于 Python 3.4。即使在 Python 3.5 中,有了针对基于 I/O 的应用程序的新异步关键字,asyncio也令人惊叹。

有许多这样的特性,一旦开始使用,你就无法回到 Python 2。它感觉如此原始。我喜欢 Python 3,并在所有个人开源项目中仅使用它。我发现回到 Python 2.7 通常是一项繁琐的工作,因为许多你依赖的酷炫功能都消失了,尽管一些库在 Python 2 兼容的回端口中可用。

我坚信现在是时候完全拥抱 Python 3 了。我不会写一行不支持它的代码,尽管可能存在继续支持现有 Python 2 代码的商业理由。

转向 Python 3 几乎从不困难,尽管仍然有一些依赖项不支持它,通常是因为这些依赖项已经被遗弃。这确实需要资源和周密的计划,但任何定期解决技术债务的组织都应该在他们的计划中将 Python 3 的转换考虑在内。

话虽如此,Python 2.7 的长寿期是非常棒的。我认为它提供了两个重要的好处。第一个是它提供了一个非常稳定的 Python 版本,几乎是一个长期支持版本,因此人们不必每 18 个月(新版本通常的开发时间)就考虑 Python 的变化。

Barry Warsaw: 'Python 2.7 的长寿期也使得整个生态系统能够赶上 Python 3。'

Python 2.7 的长寿期也使得整个生态系统能够赶上 Python 3。因此,那些非常愿意支持它的人可以磨平锋利的边缘,使其他人更容易跟进。我认为我们现在在如何成功切换到 Python 3 方面拥有非常好的工具、经验和专业知识。

我认为我们达到转折点是在 Python 3.5 版本发布时。无论数字如何,我们都已经远远超过了关于选择 Python 3 的任何争议点,尤其是对于新代码。Python 2.7 将在 2020 年中结束其生命周期,这虽然对我来说还不够快,但大致是合适的。在某个时候,在 Python 3 上开发和运行更加有趣。这就是你看到 Python 开发者最多能量和热情的地方。

Driscoll: 你希望在未来 Python 版本中看到哪些变化?

Warsaw: 最近我一直在思考对我们开发 C 扩展模块方式的重大改变。我希望我们能够通过采用类似 Cython 这样的高级语言和工具来生成扩展模块,从而摆脱这一业务。通过这样做,我们将为 C API 的改进打下基础,与现有的所有扩展模块解耦。

我们将能够尝试更多内部变化,这些变化会破坏 C API,例如移除全局解释器锁(GIL)或采用传统的垃圾回收器。例如,如果你看看移除 GIL 的工作(即移除 GIL 的实验分支),它非常复杂,因为它必须尽可能保持与现有 C API 的兼容性。如果我们能够打破这一点,而不破坏与第三方模块的源代码级兼容性,我们将有更多的自由来内部改进事物。

Driscoll: 谢谢,Barry Warsaw。

第十章。杰西卡·麦凯勒尔

杰西卡·麦凯勒尔

杰西卡·麦凯勒尔是一位美国软件工程师和企业家。她是几个开源项目的维护者,也是《Twisted 网络编程基础》的合著者。杰西卡曾是 Python 软件基金会(PSF)的董事和波士顿 Python 用户组的组织者。她热衷于扩大 Python 社区,并担任 PyCon 北美多样性推广委员会主席。

杰西卡是 Pilot 会计公司的创始人兼首席技术官,这是一家由软件驱动的公司。此前,她是 Zulip 的创始人兼工程副总裁,这是一家被 Dropbox 收购的实时协作初创公司。

讨论主题:Python 和活动主义、PSF、Twisted。

在这里与杰西卡·麦凯勒尔取得联系:@jessicamckella

迈克·德里斯科尔:你能简单介绍一下自己吗?

杰西卡·麦凯勒尔:我是一位企业家、软件工程师和开源开发者,目前居住在旧金山。

我非常自豪能在 Python 社区倡议中发挥作用。我开玩笑说,我从不休假,因为我只是去参加 Python 会议。这让我有机会与世界各地的本地 Python 社区进行交流和学习。

杰西卡·麦凯勒尔:'我非常自豪能在 Python 社区倡议中发挥作用。'

我很感激在 2013 年获得了 O'Reilly 开源奖,以表彰我在 Python 社区中的推广工作。这实际上是对许多有才华的人长期努力的认可,他们也是我的朋友。

我目前是一家早期企业软件公司的创始人兼首席技术官,我很高兴从一开始就使用并受益于 Python 3。在此之前,我曾担任 Zulip 的创始人兼工程副总裁。

在那之前,我是麻省理工学院的一名计算机狂热者,加入了她的朋友们在 Ksplice 公司,该公司正在为 Linux 开发无需重启的内核更新服务,后来被甲骨文公司收购。这些多样化的经历让我在 2017 年入选了《福布斯》30 位 30 岁以下的商业软件精英,正好赶在年龄超过该类别之前。

德里斯科尔:那么你最初为什么想成为一名程序员?

麦凯勒尔:我从小就喜欢使用电脑。一张著名的家庭照片显示我站在 Apple IIci 前面,一手拿着瓶子,一手拿着鼠标。但在大学之前,我并没有学习编程的打算。

我的第一个学位实际上是化学。在我上化学课时,我的许多朋友都在计算机科学系。我总是用余光观察他们,心想他们似乎在学习一套工具包,这些工具可以用来解决世界上各种各样的问题。我也想拥有这些技能。

我在大二时选修了几门计算机科学课程,立刻着迷了,并且秘密地在没有告诉我的化学导师的情况下,在一家软件公司实习了一个暑假(我不推荐这种策略)。我设法在剩下的几个学期里挤进了计算机科学学位。

学习如何编程是一种深刻的体验。你会在一个系统中变得流利,并学会以结构化的方式分解和解决问题。你作为调试器和问题解决者会获得自信。

杰西卡·麦凯勒:'学习如何编程是一种深刻的体验...你作为调试器和问题解决者会获得自信。'

为开源软件项目做出贡献也是一种深刻的体验。你会形成这样的思维方式:如果你看到某个语言、库或生态系统中可以改进的地方,那么你可以与其他贡献者一起为所有人的利益做出改变。

杰西卡·麦凯勒:'为开源软件项目做出贡献也是一种深刻的体验。'

相信你有工具去识别世界上的问题,将其分解成步骤,并与他人合作实施解决方案,这是一种强大的思维方式。这是一种积极分子的思维方式。编程深刻地影响了我对自己以及我对社区责任的认识。它激励了我参与从教授编程到刑事司法改革等一系列倡议。

杰西卡·麦凯勒:'编程深刻地影响了我对自己以及我对社区责任的认识。'

所以我会说我学习编程是因为我想拥有程序员的问题解决工具包,但最持久的影响是它让我成为了一个积极分子。我后来投入了大量的精力去创造机会,让其他人学习如何编程,因为我们需要尽可能多的人,在这个星球上,拥有编程所鼓励的积极分子的思维方式。

杰西卡·麦凯勒:'我们需要尽可能多的人,在这个星球上,拥有编程所鼓励的积极分子的思维方式。'

德里斯科尔:为什么是 Python?

麦凯勒:我学习 Python 是因为那是麻省理工学院许多计算机科学课程使用的语言。我在大学经历了一次从 Lisp 到 Python 的大转变期间是一名学生。

我自从在每一个工作中以及我创立的每一个公司中都使用了 Python。对于任何任务,都应该使用合适的工具,但 Python 具有如此广泛的应用和如此成熟的生态系统,幸运的是,它经常是正确的工具。

德里斯科尔:杰西卡,你是如何开始你的第一个创业项目的?

麦凯勒:我的第一个创业公司是 Ksplice,它源于我们 CEO 杰夫·阿诺德的硕士论文。

Ksplice 团队拥有大量的集体开源经验,这帮助我们与 Linux 内核社区建立联系。我们在开源方面的经验和知识也塑造了我们如何在一个高度分布式的团队中进行软件开发。

德里斯科尔:你能告诉我们你是如何成为 PSF 董事的吗?

麦凯勒:我的 Python 社区参与始于本地。我正在与波士顿 Python 用户组合作,为新程序员举办一系列入门研讨会,作为一项多元化拓展项目的一部分。然后我成为了波士顿 Python 的组织者。

杰西卡·麦凯勒:“我的 Python 社区参与始于本地。”

当我被邀请加入 PSF 的拓展和教育委员会的首届成员时,我的工作变得更加全球化,该委员会资助了世界各地 Python 社区的社区建设和教育项目。

在那时,我很感激 PSF 的总监 Jesse Noller 鼓励我追求更大的社区建设平台。他提名我成为董事会董事。我于 2012 年当选,并服务了三年。

德里斯科尔:当时作为总监,你的重点是什么?

麦凯勒:我的重点是全球社区发展,包括提供财务支持,以及为用户组、会议和拓展项目提供大量的组织基础设施。

德里斯科尔:作为 Twisted 的核心维护者,你学到了哪些教训?

麦凯勒:我第一次开源贡献是给 Twisted,这是一个用 Python 编写的基于事件的网络引擎!

我清楚地记得那次有影响力的经历。我在实习项目中使用 Twisted,我使用了一些我认为可以更清晰的文档。我说:“嘿,这是我向开源项目做出贡献的机会。我要去尝试。”

我可能把贡献指南从头到尾读了几遍。我担心自己可能会犯错误,然后有人会对我大喊大叫。我记得我在 IRC 频道里紧张地闲逛,在问题跟踪器中打开一个新问题,附加一个diff文件,并生成和重新生成文档来让自己相信一切看起来都很完美。我在提交按钮上悬停了整整一分钟,才鼓起勇气点击。

结果是,Twisted 的创造者,同时也是十年后仍然是我的朋友和同事的 Glyph Lefkowitz,耐心地引导我通过了审查流程。他接受了我的更改,并鼓励我继续参与。我为向开源项目做出贡献的第一体验感到非常积极。

杰西卡·麦凯勒:“我为向开源项目做出贡献的第一体验感到非常积极。”

这最终对 Twisted 和我自己都是一个很好的投资,因为我继续贡献了许多补丁,成为核心维护者,并撰写了一本关于该库的书。

Twisted 的持久开源教训因此是关于建立欢迎新贡献者的文化的重要性。这不仅是因为这是正确的事情,而且因为吸引和留住多元化的贡献者基础对于维持一个大型开源项目至关重要,许多人和公司都依赖于这个项目。

杰西卡·麦凯勒:“从 Twisted 中汲取的持久开源教训就是建立一种欢迎新贡献者的文化。”

德里斯科尔:你能告诉我更多关于你创立的 Pilot 公司吗?

麦凯勒:Pilot 是一家记账公司 (pilot.com)。与现有的记账服务不同,我们使用软件来自动化繁重的工作,并配备一支专业的团队来处理剩余部分。这导致账目更加准确(为你节省了工作和烦恼),而且更便宜。在 Python 3 上建立这家公司是一件令人愉快的事情!

德里斯科尔:谢谢你,杰西卡·麦凯勒。

第十一章。塔雷克·齐亚德

塔雷克·齐亚德

塔雷克·齐亚德是一位法国 Python 开发者和作家。过去的工作经历包括 Nuxeo 的研发开发人员和 Mozilla 的软件工程师。如今,塔雷克是 Mozilla 的一名员工应用工程师,为开发者创建工具。他写了多本 Python 书籍,包括英文和法文的《Expert Python Programming》和《Python Microservices Development》。塔雷克是 Afpy 的创始人,一个法国 Python 用户组,并在 PyCon 和 EuroPython 上发表了演讲。他定期为开源 Python 项目做出贡献。

讨论主题:AI,v2.7/v3.x,Afpy。

在这里了解塔雷克·齐亚德:@tarek_ziade

迈克·德里斯科尔:你为什么成为程序员?

塔雷克·齐亚德:回顾过去,我成为程序员有两个原因:成为我小世界的上帝,以及给我妈妈留下深刻印象,她也是一个程序员。

当我六岁时,我和妈妈在一场展览上。地上有一张巨大的纸,上面有一个带笔的海龟。你可以用卡片编程海龟,告诉它去哪里,什么时候在纸上放下笔。我对那个海龟着迷了。规划会发生什么的感觉非常好。

多年后,我妈妈给我们买了一台真正的电脑(Thomson TO8D),我可以用 BASIC 和汇编编程。我创造了令人难以置信的东西。在妈妈的帮助下,我驾驶着机器人。

德里斯科尔:你和你妈妈一起用机器人做了些什么?

齐亚德:嗯,我们买的电脑有一个可编程的串行端口和扩展来获得并行端口,这在当时相当罕见。

我们用 BASIC 或汇编(带卡式盒)驱动步进电机,因为端口可以直接寻址。这没什么特别的,但作为一个孩子,能够在家里做类似的事情,就像我们用那个海龟做的那样,让我感到很神奇。

我妈妈也买了一台那种时尚的奥利维蒂笔记本电脑,带有一个小针式打印机,可以打印三种颜色的东西。我们正在玩打印分形。我妈妈负责重活(作为一名数学老师),而我只是调整颜色。

德里斯科尔:那你是怎么接触到 Python 的?

齐亚德:我在 90 年代开始专业编程时,使用的是 Borland 工具(C++Builder 和 Delphi),这些工具可以使用 VCL 组件。

我们公司购买了一些 VCL 组件,但我们对作者提供的糟糕支持和一些 bug 感到非常沮丧。那时我发现了 Indy 项目,该项目正在开发和发布提供大多数网络协议的开源 VCL 组件。对我们来说,这个库就像今天的 Requests 对 Python 一样。

塔雷克·齐亚德:'围绕开源项目建立起来的社区让我觉得这是软件计算的发展方向。'

我对这个开源概念很感兴趣。围绕开源项目建立起来的社区给我留下了深刻的印象,我认为这是软件计算的发展方向。通过我的在线研究,我了解到 Zope 项目,并通过它最终发现了 Python。几个月后,我加入了一家正在构建 Zope CMS 的公司。

德里科尔: 你用 Python 做过与机器人相关的事情吗?

扎伊德: 实际上并不多。我第一次得到树莓派时,在上面做了一些黑客攻击。我还用旅行箱、一些旧汽车扬声器和树莓派,加上 Wi-Fi 网卡和 Mopidy 制作了一个无线 Ghetto Blaster。

扎伊德·塔雷克:'我还用旅行箱、一些旧汽车扬声器和树莓派制作了一个无线 Ghetto Blaster。'

我通过 Python 查看 OpenCV 库来进行一些图像处理。我参与的大多数其他电子项目都是在 Arduino 及其伪 C 语言上进行的。我最先进的项目是一辆小型遥控车,就这些。在那之后,我有点无聊。

德里科尔: 目前 Python 在人工智能和机器学习领域很受欢迎。你认为是什么让 Python 如此受欢迎?

扎伊德: 我认为 Python 在人工智能领域的流行是因为 SciPy 社区在过去几年里建立了一些最先进的框架和库(如 pandas、scikit-learn、IPython/Jupyter),这降低了科学家使用 Python 而不是 R 或其他工具的门槛。

扎伊德·塔雷克:'人工智能和机器学习的创新由学者们引领...Python 对他们来说是一个自然的选择。'

人工智能和机器学习的创新由学者们引领。由于 Python 在学术界作为学习编程的主要语言之一稳步增长,Python 自然成为他们的首选。

德里科尔: 你个人最喜欢 Python 的哪些方面?

扎伊德: 我爱上了 Python 及其社区。Python 是开源的,多功能且强大,但编写起来又简单。

我来自 C++和 Delphi 的背景,起初我认为 Python 是一种弱脚本语言,不能用来构建严肃的应用程序。最终,我被 Python 程序简单、简洁、易于理解的特点所折服。

在那个阶段,C++和 Delphi 看起来过于复杂,因为我要构建的所有网络应用程序。我只需编写遵循 KISS 原则的 Python 脚本,就能以此方式构建严肃的 Web 应用程序。

德里科尔: 你认为 Python 作为一门语言有哪些优势和劣势?

扎伊德: 现在,有了十多年的 Python 编程经验,我认为 Python 最大的优势在于吉多·范罗苏姆和 Python-Dev 团队的前瞻性。据我所知,在过去 20 年中做出的每一个决定都是正确的。

扎伊德·塔雷克:'Python 最大的优势在于其创始人吉多·范罗苏姆和 Python-Dev 团队的前瞻性。'

从备忘录(一个为其他实现如 PyPy 和 Jython 设计的 CPython 冻结,以便它们能够赶上),到异步功能逐渐添加,Python 正在正确方向上现代化。

每当 Python 与其他语言相比稍微落后时,就会添加一个新特性。与一些一开始就非常出色然后又逐渐衰落的其他语言不同,Python 每年都在稳步增长。

Python 的一个弱点是标准库。在 stdlib 中添加的包很少被移除是一个问题。例如,stdlib 目前有两个名为 Future 的类,它们略有不同。一个在 asyncio 中,另一个在 concurrent 中。我希望 Python 对于其 stdlib 有一个更好的故事。

我认为 Python 最大的弱点是 Python 2 与 Python 3 永无止境的争论。这个问题驱走了一些开发者,因为他们对使用哪个版本的不确定性。现在看起来我们正在超越这个争论,这是很好的。

Tarek Ziadé: '我认为 Python 最大的弱点是 Python 2 与 Python 3 永无止境的争论。'

Driscoll: 你对 Python 2.7 的长寿有何看法?

Ziadé: 我认为过渡花了一些时间,但现在它正在透明地进行,并且是成功的。Python 2 与 3 的日子已经过去了,因为 Python 3 的生态系统现在对于大多数项目来说已经足够成熟。

根据我的了解,目前还没有任何主要的库或框架仍然缺乏对 Python 3 的支持。因此,没有很好的理由开始一个新的项目使用 Python 2.7。人们只是使用 Python,对于他们中的大多数人来说,它将是 Python 3。总有一天 Python 2.7 将会消失,而且没有人会真正地怀念它。

Tarek Ziadé: '总有一天 Python 2.7 将会消失,而且没有人会真正地怀念它。'

Driscoll: 你是如何成为 Python 书籍的作者的?

Ziadé: 当我开始用 Zope 和 Python 编程时,我是名为 Zopeur 的法语论坛的创建者和维护者。我花了很多时间回答所有的问题。

Zopeur 是一个单人项目开始的,所以如果我停止回答问题,就没有其他人回答了。我也通过实际寻找答案和深入研究细节来学到了很多。

Tarek Ziadé: '我也通过实际寻找答案和深入研究细节来学到了很多。'

我写的第一本关于 Python 的书是因为我想深入研究 Python,并使我的工作对他人有用。我也在填补一个空白,因为当时还没有关于 Python 的法语原著书籍。

Driscoll: 在写作过程中你学到了什么?

Ziadé: 写一本书是一个漫长而耗时的项目。第一本书花了我九个月的时间,完成它非常痛苦。很容易放弃。也常见于陷入细节而忘记大局。我已经学会了如何组织我的思想,并保持对大局的把握。

当我用英语写我的第一本书时,我也艰难地学到了在非母语语言中写作的困难。你需要尽量使你的句子简单明了,尽可能简短。我也接触到了一个更大的读者群体,无论是好是坏。

关于写书,需要注意的是,你需要接受你的书永远不会完美。在你完成写作,并重新阅读第一章节时,你将想要重写一切。

Tarek Ziadé: '你需要接受你的书永远不会完美。'

Driscoll: 你从读者那里学到了什么?如果有,是什么?

Ziadé: 我从读者的反馈中学到了很多。我仍然会收到一些读者的电子邮件,他们想要分享他们的想法。

有时候,读者想要指出一些错误或分享他们认为更好的解决方案。我收到了一些有趣的帖子,我希望在我出版书籍之前就能看到。我认为,那些在网络上实时发布,允许读者在作者交付章节时发送反馈的书籍,在这方面更优越。

Driscoll: 你知道自你出版书籍以来,是否有其他用法语出版的 Python 书籍?

Ziadé: 公平地说,在我之前已经有了一本关于 Zope 的书。但据我所知,我的书是第一本完全用法语写的,由母语人士撰写的 Python 专著。从那时起,已经有几十本关于 Python 的法语书籍出版了。我现在是老一辈了。

Tarek Ziadé: '我的书是第一本完全用法语写的,由母语人士撰写的 Python 专著。'

Driscoll: 你为什么创立了法国 Python 用户组,Afpy?

Ziadé: 如我之前提到的,我一直在维护一个名为 Zopeur 的 Zope/Python 论坛。在某个时候,我有了在巴黎现实生活中举行一次会议的想法,与十几位活跃成员见面。我们聚在一起喝啤酒,并围绕 Python 成立了一个基金会。之后,我关闭了我的论坛,并在那里建立了 Afpy。

Driscoll: 当时你面临了哪些挑战,现在还有哪些挑战?

Ziadé: Afpy 的前几年运行得很好。我们都是围绕我们对 Python 的热爱而成为好朋友。

我们遇到的第一项挑战是如何整合希望成为 Afpy 一部分的法国公司。这花了我们几年时间,因为企业希望将我们的基金会作为推广他们业务(有时是激进的)的工具。我们冒着失去 Afpy 原始精神的风险。

Tarek Ziadé: '我们冒着失去 Afpy 原始精神的风险。'

我们还对如果同一家公司的几个开发者被选入指导委员会会发生什么感到有点偏执。但当我们开始组织 PyCon France 时,这些公司成为赞助商就变得很自然了。事后看来,我认为我们通过保护性的做法是正确的。

另一个挑战是试图让 Afpy 更加多元化。我们大多是男性,我希望让我们的组织对女性更加友好。我在这方面做了一些工作,发现多元化是一个非常具有争议的话题。最终,我因为政治和工作的压力而感到疲惫,工作不再有趣了。

Tarek Ziadé: '最终,我因为政治和工作压力而感到疲惫,工作不再有趣了。'

我担任 Afpy 主席七年,所以我觉得是时候继续前进了。由于我没有参与其中,我不确定 Afpy 的当前状态如何。不过,Afpy 仍然看起来像一个充满活力的用户群体,这很好。

Driscoll: 是什么让你选择了 Zope 而不是其他一些替代方案?

Ziadé: 那时候的标准是 PHP 驱动的框架,但 Zope 是酷炫的东西。Zope 非常创新,与 Python 结合后,它不仅仅是网页。

Tarek Ziadé: 'Zope 非常创新,与 Python 结合后,它不仅仅是网页。'

Plone 在法国开始流行起来,并且变得非常受欢迎。专门为政府机构构建 CMS 的公司通常使用 Plone,因为它已经内置了大多数功能。在某个时刻,Plone 在可访问性和群组软件功能方面处于领先地位。

Driscoll: 你现在使用哪个 Python 网络框架,为什么选择它?

Ziadé: 在 Mozilla,我们做很多 Django 和 Flask,还有一些 Pyramid。偶尔我们会使用一些 Twisted 和 Tornado。由于我们现在大多数东西都在 Docker 镜像中打包,所以新开始项目的开发者不再受特定 Python 版本的限制。因此,异步框架开始被广泛使用。

当我能选择我偏好的框架时,我喜欢使用 Bottle 来构建非常简单的网络服务,以及 Flask 来处理需要一些 UI 的更大项目。市面上有大量的 Flask 库。因此,下一个我将开始的服务器端项目将是 aiohttp,这是肯定的。

Driscoll: 你自己是否在从事任何你想要谈论的开源项目?

Ziadé: 我参与多个项目,但当前我痴迷的项目是 molotov (molotov.readthedocs.io/)。这是一个基于 Python 3.5+ 和 aiohttp 客户端的轻量级负载测试工具,我们用它来测试我们的网络服务。

Tarek Ziadé: '我现在痴迷的项目是 molotov。'

设计的焦点是让开发者尽可能简单地编写负载测试,通过使用简单的 Python 协程来描述场景。一旦我们有一组这样的函数,它们就被用来运行简单的烟雾测试、负载测试和分布式负载测试。

多亏了 asyncioaiohttp,这个工具可以对我们服务产生相当大的负载,我们能够用一个 molotov 客户端就破坏大多数服务。我在这个工具之上添加了一些 CI 辅助工具,这样我们就可以持续测试我们服务的性能。

我计划在本季度添加的一个扩展功能是能够在 AWS 上部署带有 Docker 镜像的堆栈。这将在运行负载测试之前发生,并在完成后抓取指标。我们还有一个更大的项目叫做 Ardere,它驱动 AWS ECS 进行分布式测试。你可以在github.com/loads上跟踪这些工具的所有工作。

Mike Driscoll: 你今天对 Python 最兴奋的是什么?

Ziadé: 异步编程。语言中添加了async/await以及像aiohttp这样的项目,真正让 Python 回到了构建网络应用的游戏。当然,我们过去十多年里一直可以用 Twisted 来做这件事,但现在它已经成为核心的一部分,并以一种美妙的方式实现。在 Python 中构建异步 Web 应用就像在 Node.js 中一样简单。

Driscoll: 你希望在未来 Python 版本中看到哪些变化?

Ziadé: 我希望看到 PyPy 与 CPython(也许我们应该再有一份备忘录,这样 PyPy 才能迎头赶上)处于同一水平,并且能够用它运行我的任何项目(包括 C 扩展)。更具体地说,我希望在我们的打包系统中取消setup.py。它是许多问题的源头。我尝试过但失败了(参见 PEP 390),但也许有一天它会实现。

Driscoll: 感谢,塔雷克·齐亚德。

第十二章。塞巴斯蒂安·拉斯奇卡

塞巴斯蒂安·拉斯奇卡

塞巴斯蒂安·拉斯奇卡于 2017 年从密歇根州立大学获得了定量生物学和生物化学以及分子生物学博士学位。他的研究活动包括开发新的深度学习架构来解决生物识别领域的问题。塞巴斯蒂安是畅销书Python 机器学习的作者,这本书在 2016 年获得了 ACM 最佳计算奖。他为包括 scikit-learn 在内的许多开源项目做出贡献。塞巴斯蒂安实现的方法正在现实世界的机器学习应用中发挥作用,如 Kaggle。他热衷于帮助人们开发数据驱动的解决方案。

讨论主题:人工智能/机器学习中的 Python,v2.7/v3.x。

与塞巴斯蒂安·拉斯奇卡保持联系:@rasbt

Mike Driscoll:你能提供一些关于你自己的背景信息吗?

塞巴斯蒂安·拉斯奇卡:当然!我的名字可能已经暗示了这一点,但我出生并成长在德国,在那里我住了二十多年,直到我有冒险去美国的冲动。

我在杜塞尔多夫的海因里希·海涅大学获得了我的本科学位。我记得有一天我去食堂的路上,偶然发现了一张关于密歇根州立大学(MSU)海外学习项目的传单。我非常感兴趣,并认为这可能是一次值得的经历。所以不久之后,我在 MSU 学习了两年,并获得了本硕连读/国际学位。

在那两个学期里,我在 MSU 结识了许多朋友,并认为科学环境会为我作为一个科学家的成长提供极好的机会,这就是我为什么申请在 MSU 读研究生院的原因。我应该说我人生中的这一章节有一个美好的结局,因为我于 2017 年 12 月获得了我的博士学位。这就是我的学术生涯。

塞巴斯蒂安·拉斯奇卡:“在我的研究生期间,我深度参与了数据科学和机器学习背景下的开源项目。”

在我的研究生期间,我深度参与了数据科学和机器学习背景下的开源项目。此外,我也是一个热情的博客作者和作家。有些人可能偶然发现了我的书Python 机器学习,这本书在学术界和业界都受到了好评。

在我的书中,我试图弥合纯粹实用(即,编码)书籍和纯粹理论(即,数学密集型)作品之间的差距。基于我收到的所有反馈,Python 机器学习对广大受众来说非常有用。这本书被翻译成了七种语言,目前被芝加哥洛约拉大学、牛津大学等多所大学用作教科书。

Driscoll:你为任何开源项目做出贡献吗?

**Raschka:'是的,除了我的写作之外,我还为 scikit-learn、TensorFlow 和 PyTorch 等开源项目做出贡献。我还在业余时间工作于自己的小型开源项目,包括 mlxtend 和 BioPandas。'

mlxtend 是一个 Python 库,提供了日常数据科学任务的有用工具。它旨在通过提供其他包中尚未提供的工具来填补 Python 数据科学系统的空白。例如,堆叠分类器和回归器,以及序列特征选择算法,在 Kaggle 社区中非常受欢迎。

此外,频繁模式挖掘算法,包括 Apriori 和推导关联规则的算法,非常实用。最近,我添加了许多非参数函数,用于从自助法评估机器学习分类器,到 McNemar 测试。

Sebastian Raschka:'为了保持最高效,我不想为每个小项目学习全新的 API。'

BioPandas 项目源于方便地处理不同文件格式的分子结构的需求。在我的博士期间,许多项目涉及处理蛋白质结构,或小(类似药物)分子的结构。为此有许多工具,但每个都有自己的小语言。为了保持最高效,我不想为每个小项目学习全新的 API。

BioPandas 背后的想法是将结构文件解析成 pandas DataFrame,这是一个大多数数据科学家已经熟悉的库和格式。一旦结构以 DataFrame 格式存在,我们就可以使用 pandas 的所有功能,包括其超级灵活的选择语法。

我最近开发的一个虚拟筛选工具,screenlamp,大量使用了 BioPandas 作为其核心引擎。我能够高效地筛选超过 1200 万个分子的数据库,这导致了强大的 G 蛋白偶联受体信号抑制剂的成功发现,这些抑制剂在控制水生入侵物种方面有应用,并与密歇根州立大学的实验生物学家合作。

Sebastian Raschka:'半对抗网络是我与密歇根州立大学 iPRoBe 实验室的同事们共同开发的一种深度学习架构。'

除了我在计算生物学领域的所有参与之外,我另一个热衷的项目涉及半对抗网络。半对抗网络是一种深度学习架构,是我与密歇根州立大学 iPRoBe 实验室的同事们共同开发的,我们成功地将它应用于生物识别领域隐私关注的问题中。

特别地,我们将这种架构应用于扰动人脸图像,使其看起来几乎与原始输入图像相同,而性别等软生物特征属性,如性别预测器无法访问。总体目标是防止未经用户同意的基于软生物特征属性的恶意行为,如用户画像。

德里斯科尔:那么你为什么成为程序员?

拉斯奇卡:我认为成为程序员的最初动力是能够实现我的“疯狂”研究想法。

在计算生物学领域,我们已经有许多现成的工具可以使用,而无需我们自己编程。然而,使用现有工具(取决于研究任务)也可能有些限制。如果我们想尝试新事物,特别是如果我们想开发新方法,那么学习如何编程是不可避免的。

和大多数人一样,我最初从 Linux shell 中的简单 Bash 脚本开始。在德国的本科学习期间,我选修了一门 Perl 生物信息学课程。

当我看到 Perl 能做什么时,这是一次相当震撼的经历。后来,当我进行统计分析并基于收集的数据准备数据可视化时,我也开始使用 R。不久之后,我开始使用 Python。

德里斯科尔:为什么选择 Python?

拉斯奇卡:我提到了我最初从 Perl 和 R 开始。然而,大多数程序员共有的一个特点是,我们经常上网查找有用的提示,以及其他实现某些子任务的技巧和窍门。

塞巴斯蒂安·拉斯奇卡:“我偶然发现了许多用 Python 编写的资源,我认为学习这门语言是值得的。”

话虽如此,我偶然发现了许多用 Python 编写的资源,我认为学习这门语言是值得的。在某个时候,我完全放弃了 Perl,所有的编码工作都在 Python 中进行:用于数据收集、解析和分析的自定义脚本。

我还必须提到,我所有的统计分析绘图都是在 R 中完成的。实际上,不久前,当我回顾一个旧项目时,我偶然发现了我的老式弗兰肯斯坦脚本(Bash 脚本和 makefiles),这些脚本同时运行 Python 和 R。

现在,回到 2012 年,当科学计算堆栈快速发展的时期,我偶然发现了 NumPy、SciPy、matplotlib 和 scikit-learn。我意识到,我在 R 中做的所有事情,我也可以在 Python 中做。我可以在我的项目中避免在语言之间来回切换。

塞巴斯蒂安·拉斯奇卡:“我真的很享受成为充满活力的 Python 社区的一员,并与这个社区互动。”

回顾过去,学习 Python 可能是我做出的最好的决定之一。没有 Python,我无法如此高效。但除了研究和工作之外,我真的很享受成为充满活力的 Python 社区的一员,并与这个社区互动。无论是通过 Twitter 与人们互动,还是在 PyData 和 SciPy 等会议上与人见面,这总是令人愉快的体验。

德里斯科尔:Python 是目前在人工智能和机器学习中使用的语言之一。你能解释是什么让它如此受欢迎吗?

Raschka:我认为有两个主要原因,这两个原因非常相关。第一个原因是 Python 非常易于阅读和学习。

我认为大多数在机器学习和人工智能领域工作的人都希望以尽可能方便的方式尝试他们的想法。重点是研究和应用,编程只是达到目的的工具。编程语言越容易学习,对于更多数学和统计学背景的人来说,入门门槛就越低。

Sebastian Raschka:“我认为大多数在机器学习和人工智能领域工作的人都希望以尽可能方便的方式尝试他们的想法。”

Python 的可读性也非常好,这有助于跟上机器学习和人工智能的现状,例如,在阅读算法和想法的代码实现时。在人工智能和机器学习领域尝试新想法通常需要实现相对复杂的算法,而语言越透明,调试就越容易。

第二个主要原因是,虽然 Python 本身是一种非常易于访问的语言,但我们有大量的优秀库在上面,使我们的工作变得更简单。没有人愿意花时间从头开始重新实现基本算法(除非是在研究机器学习和人工智能的背景下)。现有的大量 Python 库帮助我们专注于比重新发明轮子更有趣的事情。

Sebastian Raschka:“现有的大量 Python 库帮助我们专注于比重新发明轮子更有趣的事情。”

顺便说一句,Python 也是一个出色的包装语言,可以用来与更高效的 C/C++算法实现和 CUDA/cuDNN 一起工作,这也是为什么现有的机器学习和深度学习库在 Python 中运行得如此高效。这对于在机器学习和人工智能领域工作来说也非常重要。

总结来说,我会说 Python 是一种很好的语言,它让研究人员和实践者能够专注于机器学习和人工智能,并且相比其他语言提供了更少的干扰。

Driscoll:有没有什么时刻事情可能走向另一个方向,但最终却不知不觉地以它们的方式结束?

Raschka:这是一个很好的问题。也许 Python 在 Linux 社区中很受欢迎,同时在 Windows 上也能很好地工作。这可能是 Python 今天如此受欢迎的一个重要原因。

在这里有一些相对类似的语言,比如 Ruby。Ruby on Rails 项目曾经(并且现在仍然是)非常受欢迎。如果像 Django 这样的项目没有开始,Python 可能就不会作为一个全能型语言那么受欢迎,这可能会导致投入到 Python 开发中的资源和开源贡献减少。反过来,Python 作为机器学习和人工智能的语言可能也会不那么受欢迎。

Sebastian Raschka: '如果 Travis Oliphant 没有开始 NumPy 项目...我认为 fewer scientists would have picked up Python as a scientific programming language.'

如果 Travis Oliphant 没有开始 NumPy 项目(当时在 1995 年被称为 Numeric),我认为在早期职业生涯中, fewer scientists would have picked up Python as a scientific programming language。我们可能还在使用 MATLAB。

Driscoll: 那么 Python 只是恰逢其时的正确工具,还是它成为人工智能和机器学习如此重要的另一个原因呢?

Raschka: 我认为这是一个鸡生蛋还是蛋生鸡的问题。

为了解开这个谜团,我会说 Python 使用方便,这导致了它的广泛应用。社区在科学计算背景下开发了众多有用的软件包。许多机器学习和 AI 开发者更喜欢 Python 作为科学计算的通用编程语言,并在其基础上开发了库,如 Theano、MXNet、TensorFlow 和 PyTorch。

在一个有趣的侧面,作为机器学习和深度学习社区活跃的一员,我经常听到的一句话是:“Torch 库很棒,但它是用 Lua 编写的,我不想再花时间学习另一种语言。”请注意,我们现在有了 PyTorch。

Mike Driscoll: 你认为这为任何 Python 程序员开始尝试 AI 打开了大门吗?

Raschka: 我确实这么认为!这取决于我们如何解读人工智能,但关于深度学习和强化学习,有许多方便的带有 Python 包装器的软件包。

目前最流行的例子可能是 TensorFlow。就我个人而言,我在当前的研究项目中同时使用 TensorFlow 和 PyTorch。我从 2015 年 TensorFlow 发布以来一直在使用它,总体来说我很喜欢它。然而,当尝试不寻常的研究想法时,它稍微有点不够灵活,这也是我最近更多地转向 PyTorch 的原因。PyTorch 本身更加灵活,其语法更接近 Python;事实上,PyTorch 将自己描述为“一个将 Python 放在首位的深度学习框架。”

Driscoll: 为了使 Python 成为更好的 AI 和机器学习语言,我们可以做些什么?

Raschka: 虽然 Python 是一种非常方便使用的语言,并且与 C/C++代码有很好的接口,但我们必须记住,它并不是最有效的语言。

计算效率是为什么 C/C++仍然是几个机器学习和 AI 开发者的首选编程语言。此外,Python 不支持大多数移动和嵌入式设备。在这里,我们必须区分研究、开发和生产。

Sebastian Raschka: 'Python 的便利性是有代价的,那就是性能。'

Python 的便利性是有代价的,那就是性能。另一方面,速度和计算效率在生产力方面有所妥协。在实践中,我认为在团队工作时通常最好将任务分开,例如,有专门从事研究和尝试新想法的人,以及专门将原型推向生产的人。

我主要是一个研究人员,还没有遇到过这个问题,但我也听说 Python 不适合生产环境。我认为这主要是因为现有的基础设施,以及服务器支持的工具,所以这并不是 Python 本身的错。

Sebastian Raschka: 'Python 的扩展性不如 Java 或 C++等其他语言。'

通常来说,由于 Python 作为高级和通用编程语言的本性,它的扩展性不如 Java 或 C++等其他语言,尽管它们使用起来可能更繁琐。例如,当使用 TensorFlow 时,在 Python 运行时花费太多时间可能会真正影响性能。提高 Python 的通用效率(我认为在保持 Python 的便利性的同时这实际上是不可能的)将对人工智能和机器学习有益。

Sebastian Raschka: '提高 Python 的通用效率...对人工智能和机器学习将是有益的。'

虽然 Python 提供了一个快速原型设计的优秀环境,但它有时过于宽容,动态类型允许你更容易地犯错。我认为最近引入的类型提示可以在一定程度上帮助解决这个问题。此外,保持类型提示可选是一个很好的主意,因为它有助于大型代码库,但对于较小的编码项目来说,它也可能是一个烦恼。

Driscoll: 你现在对 Python 最兴奋的是什么?

Raschka: 我非常兴奋,我可以在 Python 中做任何我需要的事情。我可以高效地花时间在研究和问题解决上,而不需要花大部分时间学习新的工具和编程语言。

Sebastian Raschka: '我对 Python 的现状非常满意。我对基础数据科学库如 NumPy 的持续发展感到兴奋。'

当然,有时候看看 Python 生态系统之外的东西,看看那里有什么,以及什么可能是有用的,是好的。然而,总的来说,我对 Python 的现状非常满意。我对基础数据科学库如 NumPy 的持续发展感到兴奋,这些库得到了摩尔基金会的巨额资助,以进一步改进库。

此外,我最近看到了一个关于 pandas 重设计的会议演讲,pandas 2 将使这个已经非常出色的库变得更加高效,而不会改变用户界面。

然而,我可能最兴奋的一件事是围绕 Python 的伟大社区。感觉自己是 Python 社区的一部分,并且与大家一样致力于推动工具和科学领域的发展,真是太好了。我可以分享知识,从他人那里学习,并与志同道合的人分享我的热情。

Sebastian Raschka: '感觉自己是 Python 社区的一部分,并且与大家一样致力于推动工具和科学领域的发展,真是太好了。'

Driscoll: 你对 Python 2.7 的长寿命有何看法?人们应该迁移吗?

Raschka: 这是一个好问题。我个人总是推荐使用 Python 的最新版本。然而,我也意识到这并不是每个人都可能做到的。

如果你的项目涉及在或与较旧的 Python 2.7 代码库上工作,那么在资源方面可能无法实现迁移。关于 Python 2.7 的长寿命,我们都知道 Python 2.7 将在 2020 年之后不再官方维护。可能发生的一件事是,一个子社区将接管 Python 2.7 的维护工作。

Sebastian Raschka: '可能发生的一件事是,一个子社区将接管 Python 2.7 的维护工作。'

我还想知道,在 2020 年之后,是否值得花费精力和资源维护 Python 2.7 作为一项副项目,与将 Python 2.7 代码库迁移到 Python 3.x 相比。Python 2.7 的长期维护始终是不确定的。

个人来说,每当 Python 新版本发布时,我都会安装最新版本,并且所有代码都使用 Python 3 编写。然而,我的大多数项目也支持 Python 2.7。原因是仍然有许多人使用 Python 2.7 且无法切换,我不想排除任何人。所以如果不需要任何重大麻烦或笨拙的解决方案,我会以兼容 Python 2.7 和 3.x 的方式编写代码。

Sebastian Raschka: '仍然有许多人使用 Python 2.7 且无法切换,我不想排除任何人。'

Driscoll: 你希望未来的 Python 版本有哪些变化?

Raschka: 很抱歉,我的回答可能有些无聊:我对 Python 当前的功能组合非常满意,我的愿望清单上没有什么重要的事情。

有时候我和其他人有时会抱怨 Python 的全局解释器锁(GIL)。然而,对于我的需求来说,这通常不是问题。例如,我喜欢控制何时进行多线程或多进程。

我编写了小型的多进程包装器(在 mputil 包中),用于懒加载 Python 生成器,这是我使用 Python 标准库中的 vanilla Pool类时遇到的一个关于内存消耗的问题。此外,还有一些非常棒的库,如 joblib,使得多进程和线程变得非常方便。

此外,我在进行并行计算时使用的多数库(如 Dask、TensorFlow 和 PyTorch)已经支持多进程,并且正如我之前提到的,Python 更多地被用作粘合语言,因此计算效率从来不是真正的问题。

德里科尔:谢谢,塞巴斯蒂安·拉斯克卡。

第十三章。Wesley Chun

Wesley Chun

Wesley Chun 是一位在美国 Google 工作了八年的美国软件工程师。在他的高级开发者倡导者角色中,Wesley 鼓励开发者采用 Google 工具和 API。他之前在 Yahoo! 工作,是 Yahoo! 邮箱的原始工程师之一。Wesley 是 Python 软件基金会(PSF)的会员,并经营 CyberWeb 咨询公司,该公司专注于 Python 培训和技术课程。他是 Core Python Programming 书系的畅销书作者,并与 Django Web 开发合作。Wesley 还为 Linux Journal、CNET 和 InformIT 做出了贡献。

讨论主题:Yahoo! 邮箱、Python 书籍、v2.7/v3.x。

在这里了解 Wesley Chun:@wescpy

迈克·德里斯科尔:那你为什么成为程序员呢?

Wesley Chun:我很早就对编写代码来解决问题产生了浓厚的兴趣。我的兴趣可能始于高中后几年。

我的编程老师向我们展示了如何编写代码实现高斯-若尔当消元法,并让计算机自动解决方程组。这展示了代码如何被用来自动化以前需要低效人力计算繁琐工作的能力。

当我们还在使用 Commodore BASIC 时,能够实现那个算法并看到它成功运行,这是我决定成为一名专业开发者的动机之一。想要使人们和流程更高效,导致了我作为软件工程师的多十年职业生涯。

Wesley Chun:“想要使人们和流程更高效,导致了我作为软件工程师的多十年职业生涯。”

德里斯科尔:你是如何接触到 Python 编程语言的?

:找到 Python 并非出于选择。我有过 C/C++ 编程的经验,以及像 Tcl 和 Perl 这样的流行壳语言。然后我开始在一家初创公司工作,Python 成为了主要开发语言。我学习了 Python,并在 1990 年代末帮助构建了 Yahoo! 邮箱。

德里斯科尔:Yahoo! 邮箱是如何创建的?

:1997 年,我在一家名为 Four11 的初创公司工作。正如其名,公司推出的第一个产品是电话白页目录的最早在线版本之一。

虽然 Four11 服务是一个网络应用程序,但它完全是用 C++ 编写的,这是一个构建负担沉重且维护繁琐的单一二进制文件。CTO 和联合创始人开始寻找一种更敏捷的开发方式。

在研究了各种脚本语言后,CTO 发现,如果你将所有核心工作都留给 C++,Python 就是一种可以作为前端插入的语言,也可以用 Python 替换中间件。

我们下一个产品 RocketMail 就是基于这个修改后的堆栈开发的。在那之前,我们就已经创建了自己的网络框架。使用这个框架,我们的核心团队能够成功推出一个邮件服务,这导致雅虎收购了我们的公司。RocketMail 变成了雅虎邮件,其余的就是历史了。

Driscoll: 你是如何成为作家的?

Chun: 成为作家也是偶然的。在大学的一个暑假实习期间,我被分配编写一份用户手册供客户使用。

我学会了如何使用 Ventura Publisher 来写作,并且自从有了这样的经验,我的编码和写作就一直结合在一起。

Wesley Chun: '当我工作中接触到 Python 时,市场上只有两本 Python 书籍。'

当我在工作中接触到 Python 时,市场上只有两本 Python 书籍。一本是大型案例研究书籍,另一本是第一本 Python 书籍,但它已经有些过时了。针对从 C 语言和 shell 脚本等语言转来的开发者,对 Python 书籍的需求驱使我编写了第一本《Core Python Programming》。

Driscoll: 写 Python 书籍你学到了什么?

Chun: 如果我不是一个开发者,那么我可能会说我通过写书学习了 Python。每次你写一本书,你都需要对主题进行一些研究。

你应该了解比你实际需要的更多关于你的主题的信息。为了彻底了解一种编程语言,你必须熟悉常用的功能和边缘情况。

Driscoll: 读者是如何影响你的写作的?

Chun: 当读者走到我面前告诉我,我是他们学习 Python 的主要来源之一时,这总是让我感到很欣慰。

Wesley Chun: '读者走到我面前告诉我,我是他们学习 Python 的主要来源之一。'

每当可能的时候,我都会向我的读者直接寻求反馈,以便我可以使我的书籍更加完善。读者们喜欢章节后的练习,这些练习有助于巩固他们所学的内容。他们也欣赏涵盖的广泛主题。

Driscoll: 你能解释一下 CyberWeb Consulting 背后的想法吗?

Chun: 是的,我的家庭业务旨在整合我为 Python 社区执行的所有自由职业工作。CyberWeb Consulting 结合了杂志文章、我教授的技术 Python 培训课程以及其他我遇到的 Python 相关咨询机会。

Driscoll: 你现在正在从事哪些项目?

Chun: 到今天为止,我仍然帮助人们发现那些曾经由人类执行的单调和繁重的任务,现在可以被自动化。这让人们有更多的时间去追求更高层次的目标。

Wesley Chun: '我仍然帮助人们发现那些曾经由人类执行的单调和繁重的任务,现在可以被自动化。'

我目前在 Google 担任开发者倡导者。我向开发者展示如何将 Google 技术集成到他们的应用、网页或移动应用中。我开始推广 Google 云平台产品,但后来转向了熟悉的 G Suite 生产力应用程序:Gmail、Google Drive、日历、表格等。

当人们对这些知名应用已经很熟悉时,我专注于向程序员教授这些工具背后的开发者平台和 API。你经常会在 G Suite 开发者博客上找到我,或者主持 G Suite 开发者秀(goo.gl/JpBQ40)。

在 Python 方面,我正在编写《核心 Python 编程》的第三版,这是我写的第一本书。熟悉《核心 Python 编程》的读者会知道,这本书将被分为两卷。第二部分的第三部分,核心 Python 应用编程,早在 2012 年就已经出版。现在,我正在编写第一部分的第三版。这本最新的书将被命名为核心 Python 语言基础,以更好地反映其内容。

我还有一个 Python 博客,我坦白说一直在忽视它。幸运的是,我的工作为博客提供了内容,因为我在 Google 开发者产品上的任何工作都包含大量的 Python 代码。

德里科:目前你对 Python 最兴奋的是什么?

:信不信由你,我最兴奋的是人们甚至知道 Python 是什么。在那些日子里,没有人听说过 Python。Python 是一个如此伟大的工具,所以我们希望有一天全世界都会发现它。我认为我们现在已经做到了。

韦斯利·陈:“Python 是一个如此伟大的工具,所以我们希望全世界有一天都会知道它。我认为我们现在已经做到了。”

我还很高兴我们即将结束同时拥有 Python 2 和 3 的十字路口。Python 3 的采用率已经起飞,大多数包现在都可用。

德里科:你对 Python 2 的长期存在有什么看法?

:很快 Python 2 就会成为过去。那些对 Python 3.x 持怀疑态度的人可能仍然如此,但这个群体正在慢慢消失。Python 从 2 迁移到 3 并不像从 Perl 5 迁移到 6。

Python 2 的长期存在是必要的,因为 Python 3 的后向不兼容性。然而,Python 2.6 和 2.7 是出色的迁移工具。它们是唯一将 3.x 功能回滚到 2.x 版本的 2.x 版本,以帮助整体迁移。

韦斯利·陈:“我宣称,由于与 Python 2 的不兼容性,世界需要十年时间才能迁移到 Python 3。”

我已经写了很多关于 Python 2 长寿的文章。在 2008 年,当 3.0 发布时,我宣称,由于与 Python 2 的不兼容性,世界需要十年时间才能迁移到 Python 3。

根据我目前看到的势头,我认为我的预测将比我之前认为的可能更准确。我的原始声明大部分是轻松和抽象的,但在过去的几年里,它逐渐变得更加具体和现实。但 Python 3.6 是一个很好的版本,值得迁移到!

韦斯利·陈:“我认为我的预测将比我之前认为的可能更准确。”

德里科:如今 Python 越来越多地被用于人工智能和机器学习。你认为这是为什么?

:Python 是一个非常好的语言,无论它被应用于哪个领域。Python 不需要用户是计算机科学家才能解决问题。语言语法不会阻碍那些想要用工具构建解决方案的人。Python 也因为其可理解的语法而非常适合鼓励团队合作。

德里科:那么你认为 Python 如何才能成为更适合人工智能和机器学习的语言?

:持续开发现有的 Python 库和创建新的库将使在人工智能领域的工作变得更加容易。这将对每个人都有帮助。

韦斯利·陈:“持续开发现有的 Python 库和创建新的库将使在人工智能领域的工作变得更加容易。”

德里科:你希望在未来的 Python 版本中看到哪些变化?

:我希望看到更少的 Python 发布和更少的新特性。我认为 Python 今天所拥有的(Python 3.6)已经非常棒了。

韦斯利·陈:“我希望看到更少的 Python 发布和更少的新特性。”

当然,我们需要有错误和安全修复。额外的性能改进也受欢迎,以及解决全局解释器锁问题。然而,我希望看到发布计划被延长。

最终,我希望 Python 的开发主要停止,这样它就能被认可为一个标准,就像 C 或 C++一样。如果需要进一步改进,它们可以作为标准的修订版出现。被认可为标准将带来 Python 的合法性及其更广泛的应用,尤其是在大型企业中。

德里科:感谢你,韦斯利·陈。

第十四章。史蒂文·洛特

史蒂文·洛特

史蒂文·洛特是一位美国软件开发者和作家。他是资本一控股公司的合作伙伴,并使用 Python 为新产品构建 API。此前,他曾在提供 IT 服务的 CTG 担任解决方案架构师。2003 年,史蒂文开始利用他在 Python 中解决问题的才能来写书。他此后著有包括《现代 Python 烹饪书》、《Python 间谍特工》和《函数式 Python 编程》在内的书籍。史蒂文为 Python 社区创建教育内容,并撰写技术博客。

讨论主题:Python 的优缺点、Python 书籍、v3.6。

与史蒂文·洛特保持联系:@s_lott

迈克·德里斯科尔:那么你为什么成为程序员呢?

史蒂文·洛特:我在 20 世纪 70 年代开始编程,当时计算机很稀有。我的学校有两台奥利维蒂 Programma 101 计算器和一台 IBM 1620 计算机。

能够在这些机器上创建有用的行为,例如模拟随机事件、绘制东西和尝试设计新型游戏,这让我感到很有力量。一个响应式且自主的设备是终极玩具,即使是在做数学作业时也是如此。通过软件构建新颖且有用的东西的想法非常吸引人。此外,我还有一帮朋友经常在计算机房里闲逛。

德里斯科尔:你是如何开始使用 Python 的?

洛特:在 20 世纪 90 年代末,随着面向对象编程的兴起,我开始跟踪流行的语言。

我有一台装有 Smalltalk-80 端口、THINK C++ 编译器和 JDK 1.1 的 Macintosh。我定期搜索新兴的面向对象编程技术,最终发现了 Python。

史蒂文·洛特:'Python 的入门门槛比我学过的其他语言要低得多。'

Python 的入门门槛比我学过的其他语言要低得多。它只需要运行时,不需要复杂的工具链来构建软件。Python 正在用一种处理各种用例的工具取代 Perl、AWK、sed 和 grep。到 2000 年,我正在尝试用 Python 构建有用且可行的应用程序。

德里斯科尔:你喜欢 Python 的哪些方面?

洛特:起初,我被 Python 的优雅简洁所吸引。标准库提供了一系列惊人的工具。随着我学习的深入,标准库之外的庞大模块和包生态系统让我看到了可以做多少事情。

我在工作中使用 Python,因为我可以快速解决问题。这种语言非常适合处理复杂的数据整理问题。在很多情况下,成功源于快速开始并尽早发现问题的细微差别和复杂性。Python 鼓励你快速失败并重新开始新的方向。

史蒂文·洛特:'Python 鼓励你快速失败并重新开始新的方向。'

我对 NumPy 了解得越多,就越觉得 Python 是一种代码的通用容器。NumPy 库基于 C(和 Fortran),因此有一个 Python 包装器使得它们广泛可用且有用。

直到 2016 年 PyCon 大会上吉多·范罗苏姆的闭幕演讲,我都没有清楚地意识到使用 Python 的根本原因。Python 的最大优势源于其社区。Python 的开源性质创造并鼓励了社区共同努力构建酷炫的新事物。

史蒂文·洛特:'Python 的最大优势源于其社区。'

Python 还有许多其他优势,例如作为一门语言的广泛应用。Python 被用于许多场景:科学家们用它来分析真正巨大的数据集,也被用来构建可扩展的 Web 服务。Python 还被家庭黑客用于娱乐,他们正在整合他们的 Alexa、Nest 和基于 Arduino 的温度传感器。

Python 的另一个优势有时被称为“内置电池”。只需下载一次,你就有所有想要的工具。如果你想学习这门语言,可以从适合你电脑的发行版开始。如果你想进行数据科学,可以从 Anaconda 发行版开始,那里捆绑了许多软件包。

Python 软件基金会(PSF)积极采取措施,尽可能地包容。其理念是,每个人都应该能够学习和分享他们的发现。Python 的社区认为,没有人应该被排除在外。我们都在使用 Python 来解决问题,因此我们都需要帮助。

德里科:Python 作为一门语言有哪些弱点?

洛特: 我收集了一些 Python 弱点的列表。其中一些完全是荒谬的,我看到了很多毫无意义的观点。关于 Python 的一些抱怨是有意义的。

总的来说,我了解到,大多数被归咎于 Python 语言慢的问题,往往是因为算法和数据结构选择不当。

史蒂文·洛特:'Python 的核心运行时非常快。'

Python 的核心运行时非常快。Fortran 和 C 要快得多,因为它们有优化编译器,可以生成针对底层芯片集的代码。SciPy 和 NumPy 使用 Python 包装的二进制代码很好地解决了这个问题。

另一个问题是在使用 Python 时可能会产生混淆的机会。语言语句和数据结构之间的正交性意味着列表、集合和字典有一些重叠的功能。Python 数据结构的极其复杂的实现使得人们可以做出错误的选择并获得正确的结果,但代码效率极低。

最后,Python 的一个弱点是可能会产生继承问题。一切都是动态的,因此对于像 Pylint 这样的工具来说,区分有意义的方法定义和拼写错误(具有相似外观的方法名和普通糟糕的设计)可能很困难。

collections.abc模块有一些装饰器,可以用来组织代码并提供一些检查重定义的帮助。typing模块中的类型定义允许 mypy 定位潜在的问题。

德里斯科尔:你是如何成为 Python 书籍作者的?

洛特:在我职业生涯的多数角色都是偶然发生的,但成为一名作家是一个有意识的决策。

在这种情况下,我决定教授 Python 语言和相关的软件工程技能可能会有价值。我从 2002 年开始收集书籍的笔记。到 2010 年,我已经尝试过自出版几本关于 Python 的书籍。

史蒂文·洛特:“在几年时间里,我回答了数千个关于 Python 的问题,并且不知怎么地积累起了很高的声誉。”

当 Stack Overflow 开始时,我是一名早期参与者。那时有很多有趣的 Python 问题。这些问题显示了在 Python 具体和软件工程一般方面需要更多信息的地方。在几年时间里,我回答了数千个关于 Python 的问题,并且不知怎么地积累起了很高的声誉。

德里斯科尔:你在写作过程中学到了什么?

洛特:我了解到创造有意义的有趣例子有多难。一个例子需要有一个故事弧和一个需要解决方案的问题。

故事需要戏剧性和冲突,但在思考数据结构和算法时,这通常不会显现出来。我花更多的时间四处游荡,试图想出例子,而不是做写作过程中的其他任何部分。我提出的大多数问题都太大、太复杂。

如果代码片段没有解决问题,那么描述它就很困难。

例如,旅行商问题有一个引人入胜的故事弧,它描述了图遍历。有一个故事提供了一个框架来记住基本问题,并看到解决方案是如何工作的。纯代码不能帮助任何人理解语言结构为什么重要。代码只存在于解决问题,因此描述问题是至关重要的。

史蒂文·洛特:“纯代码不能帮助任何人理解语言结构为什么重要。代码只存在于解决问题,因此描述问题是至关重要的。”

创造故事需要从远处观察问题的能力,这对于总结和抽象出不必要的细节是必要的。找到正确的细节需要深入理解。我知道当代码描述变得冗长和复杂,涉及相关话题时,我就失败了。

德里斯科尔:与使用传统出版商相比,自己出版书籍的优缺点是什么?

洛特:自出版和使用出版社之间的区别在于编辑。Python 处理文档测试(通过doctest模块)的方式意味着内容的技术方面可以自动验证。我在这方面变得更好,但我的出版代码中仍然存在一些测试空白。

其他挑战包括语法、用法、清晰度、精确度、色彩、统一性、连贯性和简洁性。与 Packt 出版社合作,有一系列编辑人员会在我的书到达读者手中之前就提出问题并注意到难以理解的部分。

当我自行出版时,我做了我认为最好的事情。出版社巧妙地管理成本、价格和收入流。我的工作是了解 Python,而 Packt 出版社处理其余的事情。

德里斯科尔:你从读者那里学到了什么?如果是的话,是什么?

洛特:我的读者教会了我使用 Python doctest工具检查书中每个示例的重要性。读者们发现了我在代码中未能正确检查的许多错误。

德里斯科尔:你与读者之间最喜欢的互动是什么?

洛特:我在弗吉尼亚州北部的一家科技公司工作。一位同事惊讶地发现我写了《Mastering Object-Oriented Python》。他们是根据推荐购买了这本书,并阅读了大纲,而没有真正查看作者的名字。

德里斯科尔:那么,你哪本书最受欢迎?你认为人们为什么选择一本书而不是另一本书?

洛特:我最成功的书是《Python for Secret Agents》。似乎乐趣因素是其中的一部分。如果一本书包含各种有趣的活动和问题,那么读者可以看到 Python 是如何应用于他们已知并希望解决的问题。如果一本书过于专注于一个问题领域,或者过于抽象,那么实际应用就难以想象。

德里斯科尔:你在 Python 中看到了哪些新的和令人兴奋的趋势?

洛特:Python 3.6 运行速度快,而且越来越快。在基础算法上工作的开发者们做了令人印象深刻的事情。

史蒂文·洛特:“Python 3.6 运行速度快,而且越来越快。在基础算法上工作的开发者们做了令人印象深刻的事情。”

dict的新内部数据结构节省了内存并运行得更快。这种内部重构令人兴奋。从语言几乎看不到的变化中,我们可以获得巨大的好处。

Python 正在走向的一个令人兴奋的方向与 mypy 项目和类型提示相关。你有一个方便的质量工具,它不需要对语言或开发工具进行重大改变。这可以帮助你编写更可靠的代码,而不会引入重大的开销。如果 mypy 成为 Pylint 或 Pyflakes 的一部分,那么这会帮助更多。

作为一名 Arduino 爱好者,我经常使用基于 Python 的工具收集数据以供后续分析。我的当前项目涉及一个定制的 GPS 追踪器,它将被用于船只上,以在抛锚时监控其位置。当船只漂移时,会发出警报。还有许多其他物联网(IoT)项目的例子,在这些项目中,Python 是构建新事物和有用事物整体努力的重要组成部分。

Driscoll: 你认为随着 MicroPython 的流行,Python 现在是否会成为嵌入式编程的流行语言?

洛特: 是的,MicroPython 和 pyboard 是令人兴奋的新发展。树莓派也能很好地运行 Python。

史蒂文·洛特:'MicroPython 和 pyboard 是令人兴奋的新发展。'

处理器持续变得更快更小,这意味着可以使用更复杂的语言。我最早使用的计算机有 20K 的内存,大小和一个直立的大钢琴一样。我的第一台 Apple II Plus 有 64K 的内存,覆盖了桌子的顶部。pyboard 在一个超过两平方英寸的包装中拥有 1M 的 ROM 和 192K 的 RAM。

Driscoll: 谢谢,史蒂文·洛特。

第十五章。Oliver Schoenborn

Oliver Schoenborn

Oliver Schoenborn 是一位加拿大软件开发商和独立软件开发商。他过去的工作经历包括在 CAE 公司担任模拟顾问以及在加拿大国家研究委员会担任可视化软件开发者。Oliver 热衷于与商业和政府社区建立联系。他是 Pypubsub(托管在github.com/schollii/pypubsub)的作者,这是一个 Python 包,为用户提供了一种简单的方法来解耦他们基于事件的程序的部分。Oliver 定期更新 Pypubsub,并为 wxPython 邮件列表做出贡献。

讨论主题:Pypubsub、Python 在人工智能中的应用、Python 的未来。

与 Oliver Schoenborn 保持联系:@schollii2

Mike Driscoll:那么,让我们从你的背景开始。你为什么决定成为一名程序员?

Oliver Schoenborn:嗯,学校的一个朋友在卖他的 Apple IIe。在那之前,我从未编程过,但我决定买下他的二手电脑。我当时 14 岁。

我记得我对 BASIC 和汇编语言非常感兴趣。有一个命令提示符,你可以以某种方式进入汇编级别来编写汇编代码。我阅读了计算机的许多手册,它们描述了如何编程。我尝试编写了一些小程序,最终进入了 Pascal。我真的很喜欢它。

在我高中第五年时,一位老师要求我们用一种叫做 Logo 的语言做一些事情。它基本上是一组图形命令,用来移动笔、画线等。我在那里创建了一个模拟循环,这样我就可以模拟一个小飞机飞行并投下炸弹。这很简单,但很有趣,老师也很印象深刻!

所以我就这样进入了编程。在某种程度上,这更像是一个机会。那时,编程仍然只是个爱好,因为我的目标是进入物理学。

Driscoll:那么你是如何最终接触到 Python 本身的?

Schoenborn:在工作时,我们有一个需要在 Windows 上开发图形用户界面的项目。

在过去的 10 年里,我主要在 UNIX 上用 C++编程,开发命令行和 3D 图形应用程序,但不是基于菜单的应用程序(除了用 Java AWT 编写的 GUI)。我真的很讨厌 MFC,所以我开始寻找 Windows 上做这个的选项。我发现了 Python(因为它具有平台无关性),还有 Tk。

Oliver Schoenborn:“Python 是完美的选择。一看到这种语言,我就真的喜欢上了它的简单和清晰的语法。”

Python 是完美的选择。一看到这种语言,我就真的喜欢上了它的简单和清晰的语法。我不知道它是否只是与我思维方式相匹配。我还发现了 wxPython,并看到它的 API 似乎相当稳固。我爱上了 Python 以及它提供的快速创建 wxPython 界面的能力。

我是如何接触到 Python 的呢?是通过一个工作项目,这个项目的要求在 Python 中比在 C++ 中更容易实现。

Driscoll:这是你如何参与 wxPython 社区的吗?

Schoenborn:没错。我之所以开发我的第一个 wxPython 应用程序,是因为那个项目。这是一个分析座椅加热和空调的应用程序。当时,汽车座椅的舒适性正在使用这种软件进行原型设计。

所以我使用了 wxPython,并认为它支持的发布-订阅模式是一个非常棒的想法。我通过接管那个库的 Pubsub 组件,更深入地参与了 wxPython 的开发。

Oliver Schoenborn:“我通过接管 wxPython 库的 Pubsub 组件,更深入地参与了 wxPython 的开发。”

Driscoll:那么 Pubsub 是由其他人开始的吗?

Schoenborn:是的,Robb Shecter 创建了 Pubsub 的第一个版本。有一些限制需要我解决(主要是内存泄漏:订阅者在不再被应用程序需要后没有被释放),我提出了一些重要的补丁和单元测试。Robb 正在寻找接手 wx.lib.pubsub 的人。所以我做了这件事。

Driscoll:这是 Pubsub 被分割成自己的模块,脱离 wxPython 的时候吗?

Schoenborn:我认为是在那之后的几年。Pubsub 几乎是一个独立的子包,而其他大多数 wx.lib 子包需要其他 wxPython 组件。我想让 wx.lib.pubsub 对更广泛的开发者可用,并且 wxPython 开发者小组的其他人也同意了。

Oliver Schoenborn:“Pubsub 几乎是一个独立的组件。”

Driscoll:当时你们是否知道 PyDispatcher 项目?

Schoenborn:嗯,我在那些年中的某个时候确实意识到了 PyDispatcher。它是一个相当不同的方法。

我记得当时它不是基于主题的。Pubsub 与它足够不同,以至于可以作为一个独立的包来证明其合理性。自从上次查看它以来已经有一段时间了,但实际看看 PyDispatcher 现在处于什么位置会很有趣。

现在有几个项目正在使用主题、消息和发布/订阅的基本思想(例如 MQTT 和 Google pub/sub),但在网络层面,即应用程序之间的层面,而 Pypubsub 是在应用程序的组件之间层面。它们的发展比 Pubsub 必须发展的要多得多;Pypubsub 已经成熟,是生产级别的。

Driscoll:所以我注意到,在你参加我在“PyDev of the Week”系列中的采访的时候,你已经切换到了 PyQt。这是怎么发生的?

肖恩博恩:那是在 2013 年左右。我们基本上有一个项目,涉及现代化我们的客户的一个旧原型。该应用程序涉及用户定义的脚本,这些脚本可以通过原型运行,并且都是用 Python 编写的。因此,我们不得不嵌入一个 Python 解释器,或者将大量的 Python 脚本翻译成另一种语言,同时保证相同的输出(这是一个无法在项目预算范围内完成的任务)。

奥利弗·肖恩博恩:'我们不得不嵌入一个 Python 解释器,或者翻译大量的 Python 脚本。'

图形界面必须非常复杂。当时,原型有一个 3D 组件,用户可以在 3D 环境中旋转模型组件。我们需要将图形用户界面与菜单和列表视图集成,作为一个复杂的 2D 和 3D 画布,用户可以与之交互。

我们想要的是一个稳定、强大、文档完善的解决方案,背后有一个活跃的社区。当时,WPF、wxPython 和 PyQt(或 Qt,用于 C++基础设施)是我们主要的候选者。在 C#方面有 WPF。我们考虑了多种不同的方法,最后在 wxPython 和 PyQt 之间选择了。

PyQt 似乎比 wxPython 有更强大的 3D 环境集成。PyQt 似乎也在迅速增长,以支持 3D 场景图,而在 wxPython 中,我可能需要使用 OpenGL,这将更加复杂。

需要 Python 3,但我认为那是罗宾·邓恩决定创建 wxPython 3 的时候,因此支持 Python 3 的工作还非常早期。基本上,wxPython 只有 Python 2.7,Qt Designer 的可用性也是一个因素。PyQt 在创建设计时有一个非常复杂的界面。

奥利弗·肖恩博恩:'PyQt 显然有势头。'

PyQt 和 WPF 都支持由 XML 驱动的用户界面描述。

PyQt 显然有势头,并且支持该包的商业使用,这对那个项目来说很重要。我之前与 WPF 有过一些负面体验,与它用来将属性绑定到小部件的黑魔法作斗争。此外,有迹象表明 IronPython 不再维护。综合考虑,我们选择了 PyQt。我们没有后悔这个选择。

德里科:回到 Pypubsub 部分,我忘记问你了,你在运行那个开源项目时遇到了什么挑战吗?

肖恩博恩:嗯,那并不是一个技术挑战,但我确实从开源开发的角度有一个有趣的经验。这让我想起,你实际上并不能控制你在开源世界中可以占据的空间。

奥利弗·肖恩博恩:'你实际上并不能控制你在开源世界中可以占据的空间。'

发生的事情是 Pypubsub 在 SourceForge 上,那里的名字简单地是“pubsub”,因为这就是在 wxPython 中的命名。在 PyPI 上,我把它命名为 pypubsub。几年后,我发现 SourceForge 上还有一个名为 Pypubsub 的项目,但它并没有取得进展。基本上,这是一个已经停止的项目,有时它会导致 Stack Overflow 和两个 pypubsub 论坛上的一些混淆。

这需要一些努力才能弄清楚。我不得不联系作者并解释发生了什么。最终,他同意了,我得以在 SourceForge 上拥有“pypubsub”这个名称。

同时,GitHub 已经变得非常流行。有些人把我的 Pypubsub 源代码复制到 GitHub 上,只是为了方便使用。这没什么不妥,但既然这些分支并没有添加新功能,当我决定将 Pypubsub 迁移到 GitHub 时,我不得不通知一些开发者 Pypubsub 最终可以在那里找到。我解释说,可能已经没有理由保留单独的副本了。这是开源的一个有趣方面。

德里科:这个项目需要多大的承诺?

肖恩博恩:嗯,在过去 15 年的不同时期,我进行了重大的实现更改并扩展了 API:修复错误、更新文档,并确保在 Python 的新版本发布时所有测试都能通过。找到时间做这些事情通常是一个挑战。我想,这也是在志愿者基础上工作的另一个有趣方面。

在保持向后兼容的同时演进 API,主要是罗宾,wxPython 的作者所要求的,即使 Pypubsub 在技术上与 wxPython 分开,这对我也很重要。这是一个重大的技术挑战,使得这一切成为可能。这导致了 Pubsub 支持三个 API 或消息协议的概念。

奥利弗·肖恩博恩:“这是一个重大的技术挑战。”

首先,与 Pubsub 的第一个版本保持向后兼容。这就是我所说的版本 1 消息协议。然后是“现代”Pubsub,它在 API 方面有显著的改进,并且有两个 API。

其中一个被称作arg1,因为所有消息数据都包含在一个大块中,作为sendMessage()函数的一个参数传递。另一个被称作kwargs,因为消息数据是通过sendMessage()函数中的关键字参数发送的。当你独立安装 Pypubsub 时,这是默认设置。

一个标准的 wxPython 安装会安装arg1 API,因为这与版本 1 API 几乎 100%兼容。可以在导入 Pypubsub 之前在应用程序代码中设置一个设置标志,以选择kwargs协议。

因此,让所有这些工作起来是一个巨大的头疼问题。我不得不稍微篡改一下导入系统,基本上是为了允许用户说:“嗯,在这个应用程序中,我想使用arg1协议,而在这个 wxPython 应用程序中,我想使用kwargs协议。”

我还添加了一些代码,帮助 wxPython 应用程序从版本 1 过渡到arg1,再到kwargs协议。这也很困难。

我真的很希望我没有做所有那些事情,但当时我觉得这是必要的恶行。除了代码复杂性之外,它使 Pypubsub 使用的导入系统相当复杂,可能会干扰冻结。

Driscoll:你为什么专注于使这种过渡成为可能?

Schoenborn:因为我必须在我自己的一个项目应用中经历那个挑战。它使用arg1协议并将其迁移到新的kwargs协议。虽然不算复杂,但这有点繁琐且容易出错。由于kwargs API 的优势,添加这些错误检查器并经历过渡是值得的。

我有一个概念,可以在导入 Pypubsub 时设置参数。这将配置 Pypubsub 执行一些“中间”任务,这些任务在两种消息协议之间的过渡期间很有用。这个桥梁将允许你逐步过渡到完全使用 kwargs,沿途还有一些有用的设施。

Oliver Schoenborn:'代码确实比我想要的要复杂。'**

实现一个稳定的 API 花费了相当多的努力。令人沮丧的是,代码确实比我想要的要复杂,因此维护起来更困难,通过 Pypubsub 追踪调用也更困难。此外,它也给那些想要冻结其应用程序的人带来了一些挑战。

一旦我有能力,我就建议我们废弃所有那些旧的东西,因为它们只对具有旧 API 的 wxPython 应用程序有用。罗宾同意了。2016 年,我放弃了所有对版本 1 和 arg1 协议的支持,从而实现了代码库的重大清理和简化。所以现在只有一个 API。这是 Pypubsub 的 v4 版本。

Driscoll:那么你能告诉我你最近参与的一些其他 Python 项目吗?

Schoenborn:当然,有一个非常酷的闭源项目,技术上具有挑战性,GUI 非常复杂。我实际上在讨论近年来与 PyQt 合作的原因时间接提到了它。

应用程序显示一个画布,用户可以在上面放置盒子并以不同的方式将它们连接起来。与 Visio 这样的工具相比,用户可以编程这些盒子随时间变化,就像动画一样,以表示一个过程。

用户通过定义 Python 脚本来实现这一点。应用程序为每个用户脚本添加了一个实时 Python 命名空间,因此用户可以动态查询底层模型(例如,在模型中动态更改的属性上的代码补全)。

Oliver Schoenborn:'该应用程序为每个用户脚本添加了一个实时 Python 命名空间,因此用户可以动态查询底层模型。'**

因此,有一个非常复杂的界面用于创建模型组件、添加它们以及将它们链接起来。还有一个非常复杂的撤销功能,涵盖了模型编辑的所有不同方面。

Oliver Schoenborn: '就像往常一样,有 10% 的功能占据了 90% 的开发时间。’

我们将视图与撤销/重做功能耦合,这样用户在导航文档时总能看到将要撤销或重做的内容。这是一个有趣的挑战,就像往常一样,有 10% 的功能占据了 90% 的开发时间。

这个应用程序是一个模拟系统,所以它不仅仅是创建线条或盒子。还有界面组件来管理模拟,即随时间改变模型,恢复到初始状态,查看更改队列等。

因此,应用程序中有很多功能。但在这个方面,PyQt 与之合作得非常出色。

Driscoll: 你能多解释一下在这个项目中使用 Qt 吗?

Schoenborn: 是的,Qt 的图形视图在允许我们做的事情方面给人留下了深刻的印象。

我记得一开始,在 Qt 中做某些事情并不总是那么明显。例如,在一个基于画布的应用程序中,你可以做很多不同的事情,有一个状态机来管理在任何给定时刻可以做什么是非常有用的。没有文档解释这一点,因为这是你多年来作为有用技术学到的东西。请注意,Qt 内置了对状态机的支持,但它并不足以满足我们的需求。

状态机允许你定义只有某些动作可能发生的状态。所以在“创建线条”状态下,你唯一能做的就是取消创建、拖动鼠标或选择线条目标。这就是状态机发光的地方。没有它,你的代码最终会变成难以维护的意大利面。调试和扩展新动作要简单得多。

虽然 Qt 文档很优秀,但有些东西是在使用过程中逐渐理解的。有时你会说,“哦,我终于明白了怎么这么做。我要回过头来修改一下。”最终你得到的是一个更健壮的实现,能够真正支持下一级别的功能。

Oliver Schoenborn: '你最终得到的是一个更健壮的实现,能够真正支持下一级别的功能。’

我开始熟悉 Qt 所有的小部件了。当我们升级 PyQt 时,我们发现了一个讨厌的 bug,导致整个界面在拖动部件时显示各种线条。不用说,这确实是个问题,但我们确实需要更新 PyQt 以支持其他功能。

我们将问题追溯到 C++层,并且由于一些不可思议的幸运,有一个解决方案:有一行代码我们只需要在 Python 级别上放入我们的应用程序中。我们甚至不需要更改 PyQt 源代码。只要我们有了那一行代码,那么错误就会消失。我提交了:bugreports.qt.io/browse/QTBUG-55918

使用 Qt 的另一个非常有趣的方面是单元测试。我们需要为应用程序的 GUI 部分编写单元测试。我们使用了优秀的 pytest,有一个用于核心业务逻辑的测试套件,还有一个用于 GUI 组件的测试套件。对 GUI 进行单元测试可能真的很有挑战性:你必须编写用户操作的脚本。

幸运的是,Qt 使得这相对容易,因为你可以通过调用一个方法轻松触发任何小部件事件。但因为是基于事件的,我们需要一种方法来定义一系列用户操作及其预期结果。因此,我创建了一个库来支持这样做。不幸的是,源代码是封闭的,所以我无法分享代码,但我已经在 PyQt 论坛上提到了这个想法,有些人实现了他们自己的概念。

Driscoll: Python 是 AI 和机器学习热潮中被广泛使用的几种主要语言之一。你认为这背后是什么原因?

Schoenborn: 我认为正是 Python 的“奥林匹克”特性使其非常适合人工智能和机器学习。Python 恰好在很多必要的元素上都非常强大,而不仅仅是某一个或两个。

Oliver Schoenborn: 'Python 的“奥林匹克”特性使其非常适合人工智能和机器学习。”

例如,Python 可以用于函数式、过程式或面向对象的编码,可以任意组合,代码仍然易于理解和简洁。此外,不需要编译使得算法和数据探索变得非常容易:你只需修改代码并重新运行脚本。

最后,Python 通过简单的语法提供了强大的抽象。也许我有偏见,但我觉得在这方面 Python 处于领先地位。我非常重视代码的明确性和简洁性,以及重构和测试。在这些方面都表现出色使得 Python 成为人工智能的完美语言。

Mike Driscoll: 为了使 Python 成为更好的 AI 和机器学习语言,我们可以做些什么?

Schoenborn: 在某个问题域中,当提供的抽象与问题域的抽象相匹配时,一种语言最有用。

因此,如果深度学习使用神经网络,那么拥有一个通用的神经网络概念可能非常有用。这目前由像 TensorFlow 这样的库提供。但随着机器学习算法的改进,可能会出现一个通用的神经网络抽象,它可以成为一个像列表和映射这样的基本数据结构。

此外,我认为我们需要能够询问 AI/机器学习功能,“你是如何得到这个结果的?”这是人类验证结论的方式。他们了解自己使用的逻辑,可以将其口头表达出来,其他人可以跟随,并验证其正确性。

Driscoll:我和很多人交谈过,甚至 PyCon 上的人,都非常强调 Python 在数据科学领域的增长。你在你所做的工作中看到这一点了吗,或者你能给我任何一方面的意见吗?

Schoenborn:是的,Python 在那个领域确实在增长。我认为像 Jupyter、Anaconda 和 scikit-learn 这样的工具是这一增长的主要原因。

可能还因为有了强大的计算能力,语言的运行速度不再那么重要。Python 可以用于嵌入式系统,所以原则上,基于训练的机器模型的预测分析可以在设备本身发生。

Oliver Schoenborn:'有了强大的计算能力,语言的运行速度不再那么重要。'

在 2017 年的 PyCon 大会上,有一个非常有趣的演讲。演讲者正在调查绘图库的格局。调查从 matplotlib 及其相关内容开始。然后调查转向了一些 JavaScript 库,有些情况下与 Python 库相关。这真的很吸引人,因为即使对我的客户来说,对使用 pandas、NumPy 和 matplotlib 也很有兴趣。这表明你可以添加很多不同的扩展或层。

从客户的角度来看,你希望有一定程度的可用性,而且你不希望仅限于 matplotlib,因为还有更多可用。你也知道,你不想重新发明轮子,所以你必须确保你构建的东西足够通用。如果你想进行统计分析,那么你可能想用 Jupyter 或 R 来做。你总是试图了解提供这些功能的应用程序。

你不希望强迫用户使用 matplotlib,因为它如此多样化,API 也如此先进。你无法提供一个支持 matplotlib 所能做的一切的 GUI 组件。

Python 是一种如此表达性强的语言,而且如此容易学习。我认为这就是 Python 现在在研究和应用研究中如此受欢迎的原因。它易于应用,复杂且能解决技术问题。

Oliver Schoenborn:'Python 是一种如此表达性强的语言,而且如此容易学习。我认为这就是 Python 现在在研究和应用研究中如此受欢迎的原因。'

Python 为你提供了所有工具来制作和提供既稳健又确定性的东西。我们可以衡量性能,找到瓶颈或找到内存泄漏。有很多事情真正使 Python 成为一个伟大的工具。

Driscoll:有没有其他特别值得记忆的 PyCon 演讲?

Schoenborn: 在 2017 年的 PyCon 上,还有一个关于全局解释器锁(GIL)的有趣演讲。从理论上讲,去掉 GIL 会非常好:我们可以让 Python 线程在不同的核心上运行。

Oliver Schoenborn: '从理论上讲,去掉 GIL 会非常好。'

但 GIL 解决了一个非常实际的问题:同步访问 Python 数据结构。您开始分析什么是必要的,以及与成本相比的收益,从而深入了解 GIL。您会意识到 GIL 确实简化了很多事情,并且可能是 Python 做复杂事情如此容易的一个原因。

您基本上可以获取并发编程,而不需要多线程编程的所有陷阱。在大多数问题的大类中,这正是您想要的。在另一类问题中,您想要解决那些可以轻易并行化的简单问题。这基本上是将解决方案细分为任务。任务之间几乎没有耦合,您可以非常容易地完成它们。

蒙特卡洛是一个例子,因为它在模拟和业务流程中非常重要。您基本上想要多次运行大量的事情,它们之间几乎没有变化。Python 也使这一点变得容易。

对于可以轻易并行化的问题,您需要运行它们。您可以在单独的核心上运行它们,只需使用多进程模块。是的,甚至有这种能力!所以,在 Python 中,许多在原则上复杂的事情实际上很简单,这使得它非常适合数值计算任务。

Oliver Schoenborn: '所以,在 Python 中,许多在原则上复杂的事情实际上很简单。'

但我认为应该有一个更简单的方法来在多个核心上运行 Python 代码,而无需使用该模块。应该有与 GIL 协同工作的语言结构。那里没有技术上的不可行性;只是需要有足够的共同努力来实现它。

Driscoll: 您今天对 Python 中最兴奋的是什么?

Schoenborn: 可选类型注解系统、异步调用和多进程模块。

Driscoll: 您认为哪种语言是 Python 最大的竞争对手?

Schoenborn: JavaScript。真是太不幸了,JavaScript 在网页方面占主导地位。有两个主要竞争者:网页上的 JavaScript 和科技计算中的 Python。如果您真的需要原始的计算速度,那么您可以做 C++。

通过编写一些 C++代码并通过 SWIG 和 SIP 将其摄入 Python,您可以在 Python 中获得重大的速度提升。还有 Cython。使用 Python 在高级抽象层次上工作非常容易,当您需要从 C++获取计算能力时。

我不知道这会走向何方。我认为在 JavaScript 方面需要发生很多事情才能使其像 Python 一样强大且易于使用,但另一方面,我看不到 Python 成为网络浏览器的支持语言,因为 JavaScript 已经太根深蒂固了。也许如果谷歌决定让 Python 代码在 Chrome 中可运行。

奥利弗·肖恩博恩:'要使 JavaScript 像 Python 一样强大且易于使用,需要在 JavaScript 方面发生很多事情。'

Driscoll: 那么 Python 会一直存在吗?

Schoenborn: 我认为 Python 会一直存在。Python 是一门太好的语言,其社区已经开发出了高质量和稳固的库,以及通过 PEPs 的语言进化过程。Python 有一个非常严格的过程,并且有很多聪明的人在工作。所以它肯定会一直存在。

Driscoll: 你对 Python 2.7 的长期存在有何看法?人们应该迁移到最新版本吗?

Schoenborn: Python 2.7 的长期存在最令人烦恼!像 Ubuntu 和谷歌云平台这样的大影响力者必须开始将 Python 3.6 作为默认版本。

奥利弗·肖恩博恩:'Python 2.7 的长期存在最令人烦恼!'

Driscoll: 你希望在未来的 Python 版本中看到哪些变化?

Schoenborn: 我希望看到一种可选的静态类型系统,具有类型推断(因此不需要声明类型),真正的并行性,以及可选的编译模式。

可选的静态类型、编译和类型推断的结合将允许语言在开始时保持简单,在需要时变得更加严格。

它还可以在速度和生产率上带来巨大的提升:能够指向任何对象并确切知道对其可用的操作或对其的要求(在函数签名内),这总是节省时间。现实地讲,我不知道一个冻结类型的编译模式(即使是即时编译)是否可行,但外面有一些极其聪明的人,所以我不会排除它。

关于并行性,我指的是在保持全局解释器锁(GIL)的同时,能够在多个核心上同时运行 Python 代码的能力。当然,有进程模块,但我谈论的是语言本身内置的一等构造。

Driscoll: 感谢,奥利弗·肖恩博恩。

第十六章。阿尔·斯威加特

阿尔·斯威加特

阿尔·斯威加特是一位美国软件开发者,也是两个跨平台 Python 模块的创建者:Pyperclip,用于复制和粘贴文本,以及 PyAutoGUI,用于控制鼠标和键盘。他是一位成功的作家,已经出版了四本关于 Python 编程的书和一本关于 Scratch 的书,这是一门面向儿童的编程语言。阿尔的书教初学者如何编码,他热衷于帮助年轻人和成年人发展编程技能。阿尔专注于使编程知识更加易于获取,并经常在 Python 会议上发表演讲。

讨论主题:Python 书籍、Python 包、v2.7/v3.x。

关注阿尔·斯威加特:@AlSweigart

迈克·德里科尔: 你是怎么成为程序员的?

阿尔·斯威加特: 我是一个喜欢 8 位任天堂游戏的男孩。然后我的一位朋友在小学图书馆里找到了一本关于用 BASIC 编程游戏的书。我被迷住了。

我有点讨厌告诉人们我是如何开始编程的,因为我就是那些从小就开始编程的人之一。我担心我的故事会让人们想,“哦不,我三周大就开始编程了,所以我太晚了。我永远赶不上了!”

阿尔·斯威加特:'如果有什么变化的话,编程比 20 年前容易多了。'

如果有什么变化的话,编程比 20 年前容易多了。那时候我们没有维基百科和 Stack Overflow。我认为我在三年级到高中毕业期间学到的所有编程知识,现在任何人都可以在十二个周末内学会。

我的大部分编程知识都来自那本书。我试图理解我家的 Compaq 386 电脑附带的那本参考手册。我完全看不懂那本手册。结果我最终没有制作出像我所玩的任天堂游戏那样令人印象深刻的东西。

德里科尔: 那你是怎么最终转向 Python 的呢?

斯威加特: 我第一次接触 Python 是在 2004 年左右。我当时想制作一些网络应用,主要使用 PHP 和 Perl 进行编程,后来一个朋友向我介绍了 Python。

当时,我想尽可能多地学习不同的编程语言,Python 真的很好。我喜欢这种语言的易读性。我以前在 Perl 中做的所有事情,现在都在 Python 中做。在那之后,我没有找到比 Python 更好的编程语言,所以我一直坚持使用 Python,现在已经有十多年了。

我有时觉得自己需要强迫自己学习不同的编程语言,只是为了跟上潮流。但 Python 已经成为我的首选语言。每当我需要编写一个快速脚本或自动化一些非常短的任务时,Python 都很容易使用。

再说,预测未来真的很困难,我已经停止尝试了。例如,我确实认为会有某种东西来取代 JavaScript,但事实上,它只是变得越来越受欢迎!还有,我最初认为在手机中包含摄像头是个愚蠢的想法。所以,我已经学会了不要试图预测未来。

阿尔·斯威加特:“预测未来真的很困难,我已经停止尝试了。”

德里斯科尔:Python 在 AI 和机器学习的繁荣中扮演着重要角色。你能解释一下这一点吗?

斯威加特:嗯,不过不要过分吹捧 Python,但使 Python 在 AI 方面变得出色的,正是使它成为通用语言的原因。

阿尔·斯威加特:“使 Python 适合 AI 的,正是使它成为通用语言的原因。”

Python 易于学习和使用。结果证明,对于大多数应用来说,这才是最重要的。“强大”这个词在编程语言中是没有意义的,因为每种语言都把自己描述为“强大”。

从理论上讲,没有一种语言能做另一种语言做不到的计算。然而,在实践中,你需要一个程序员花时间坐下来编写实际的代码。一种让这变得容易的语言将会得到更广泛的采用,拥有更大的社区和更多的库。所以,Python 在像机器学习这样的领域领先,其中许多工具都是最近开发的,这并不让我感到惊讶。

德里斯科尔:是什么让你决定开始真正写关于 Python 语言的书籍?

斯威加特:2008 年,我的女朋友为一个 10 岁的孩子当保姆。他想学习如何编程,但他不知道从哪里开始。我试图在网上为他找到一些东西,但当时网上大部分内容都是针对专业软件开发者的。

因此,我开始编写教程,最终变成了《用 Python 自己动手做电脑游戏》。我不想让读者被编程概念和技术术语淹没。我只是想列出游戏源代码,然后解释其代码是如何工作的。我不断添加更多游戏,最终它膨胀成了一本书的长度。我自费出版了它,但也将其免费放在网上,并置于 Creative Commons 许可之下。人们似乎很喜欢它,所以我继续写了《用 Python 和 Pygame 制作游戏》。

《用 Python 自己动手做电脑游戏》中有一个小加密程序。我认为把这么多经典加密算法放在一起会是一本好书。我会解释如何编写代码来执行加密,以及如何破解加密。这些加密算法从古罗马时代到 16 世纪,所以今天的普通笔记本电脑都有足够的计算能力来破解它们。那本书变成了《用 Python 破解密码》。

在我写了第三本书之后,写作变成了我所有业余时间做的事情。到了一个我可以冒险的时候,离开我当时的软件开发工作,全职写作。这结果相当不错。

阿尔·斯威加特:“我想出了合适的书名,在合适的时间,并且选择了合适的语言。”**

我以为写了一年左右的书之后,我会回到另一份开发者工作,但《用 Python 自动化无聊的事情》的成功完全让我震惊。这主要是因为运气。我在合适的时间想出了合适的书名,并且选择了合适的语言。所以很多事情都自然而然地凑到了一起。

德里斯科尔:你为什么决定自出版?

斯威加特:No Starch Press 曾向我提出出版《用 Python 自己制作电脑游戏》,但那个计划已经失败了。

我有一份半编辑的手稿,所以我完成了编辑工作,并将其转换为 PDF 格式,放在亚马逊上。我所有的推广都是在线进行的。我会在论坛上告诉人们。人们并不认为这是垃圾邮件,因为 PDF 也是完全免费的。

德里斯科尔:你认为《用 Python 自己制作电脑游戏》的成功是因为它是 PDF 格式,还是网页格式?

斯威加特:我认为将书籍免费放在网上,并使用 Creative Commons 许可证,导致更多的人购买这本书。人们可以看到这本书,并产生口碑。还有其他好处。因为书籍在网上,我可以查看流量,并看到哪些章节最受关注。

阿尔·斯威加特:“最受欢迎的章节是关于 GUI 自动化、网络爬虫和正则表达式。所以当 PyCon 征集演讲提案时,我选择了这些主题。”**

在《用 Python 自动化无聊的事情》网站上最受欢迎的章节是关于 GUI 自动化、网络爬虫和正则表达式。所以当 PyCon 征集演讲提案时,我选择了这些主题。这就是我为什么开始在全国 PyCon 上发言,然后在 2017 年的 US PyCon 上发言。

我注意到,我书中最受欢迎的主题并不总是我认为最有趣的东西。我记得当我写《用 Python 自动化无聊的事情》时,我以为图像处理章节会很受欢迎。但结果却是,大多数人并不像我自己那样需要从 Python 脚本中生成自己的图像文件。

阿尔·斯威加特:“我注意到,我书中最受欢迎的主题并不总是我认为最有趣的东西。”**

德里斯科尔:作为作者,你学到了什么?

斯威加特:这比你想象的要辛苦得多!很多人给我发邮件说:“哦,嗨,我对写编程书感兴趣。你有什么建议吗?”

我不知道该告诉他们什么。我是一名软件开发者。我知道我做了什么,以及我的方法对我自己有效。但那就像彩票赢家在告诉你该选择哪些号码一样。“用 Python 自动化无聊的事情”比我的其他书卖得要好得多。我并不确定我能否为其他人复制那些结果。

我最近的书是《Scratch 编程乐园》,它使用来自麻省理工学院媒体实验室的 Scratch 编程工具,向孩子们教授编程概念。这本书表现尚可,但不幸的是,Scratch 的受众并没有 Python 的受众那么大。

我确实学到了写作是你必须做的事情,以提升写作技能。实际练习比我能给出的任何建议都要好。此外,我还学到了好编辑的价值连城。

Driscoll:那么,如果你能重新开始,你会对你其他表现不佳的书做些什么不同的事情?

Sweigart:我的意思是,如果我们谈论第一本书,那么我最大的错误就是没有为 Python 3 编写它。最初,我只是使用 Python 2,因为这是我所知道的。

我直到有人对我说,“嘿,你为什么不使用 Python 3?”才开始质疑那个决定。实际上并没有特别的原因不使用 Python 3,所以我将《用 Python 发明自己的电脑游戏》这本书切换到了 Python 3。结果证明这是一个非常明智的决定。

Al Sweigart:“我为《用 Python 发明自己的电脑游戏》这本书切换到了 Python 3。结果证明这是一个非常明智的决定。”

在编写《用 Python 发明自己的电脑游戏》时犯下的另一个大错误是,我最初把整个文本都写成 HTML,因为我在一个文本文件中制作它作为一个网络教程。我编写单元测试和使用代码检查工具只是为了确保一切格式正确。结果证明这是一个大麻烦。

我本应该使用微软 Word 的。当告诉他们这一点时,很多人都很惊讶,但 Word 和 Excel 是微软推出的两大神器。如果我能回到 10 年前,我会告诉自己使用真正的桌面出版软件。

Driscoll:你为什么选择 Scratch,而不是其他儿童入门语言之一?

Sweigart:Scratch 是我遇到的最佳儿童编程工具。很多儿童编程工具都简化到了我不认为它们真正在教授编程的程度。

Scratch 做出了很多明智的设计决策,并教授真正的编程,同时隐藏了杂乱的细节。所有对教授孩子编程感兴趣的人都应该阅读 Mitch Resnick 撰写的 Scratch 白皮书,并观看他的 TED 演讲。

Driscoll:所以我想要稍微改变一下话题。你为什么创建了 Python 包 Pyperclip 和 PyAutoGUI?

Sweigart:Pyperclip 和 PyAutoGUI 都是在我编写编程书籍时出现的需要中诞生的。

阿尔·斯威加特:'Pyperclip 和 PyAutoGUI 都是在我写编程书籍时出现的需要。'

在《用 Python 破解密码》这本书中,你处理的是加密和解密文本。通常,你处理的是大量的随机无意义文本,你需要精确地重新生成它们,而有一个复制粘贴机制会使这个过程容易得多。它允许用户将输出放入电子邮件中,或者保存到文档中。所以我想到,“嗯,如何在 Python 中进行复制粘贴文本?”PyPI 上有些模块可以进行复制粘贴,但它们只适用于一个操作系统,或者只适用于 Python 2。

我想要一个在所有操作系统上都能工作的模块,并且对 Python 2 和 Python 3 都适用。我需要的只是一个复制函数和一个粘贴函数。我本以为这不会花太多时间,但当然,这确实花了不少时间。幸运的是,用户不需要看到所有让 Pyperclip 在这么多平台上工作的混乱细节。他们只看到一个有两个函数的模块。

德里科尔:那么你是如何开始这个一个模块的想法的?

斯威加特:我不想让读者不得不根据他们的电脑配置来挑选不同的模块。

我将所有这些代码合并到一个模块中,变成了 Pyperclip,因为我注意到 PyPI 上没有这样的东西。PyAutoGUI 也是出于类似的原因被创建的。我原本想在《用 Python 自动化无聊的事情》这本书中添加一个关于 GUI 自动化的章节,但 PyPI 上现有的所有模块都是针对不同的操作系统,并且工作方式不同。

阿尔·斯威加特:'PyAutoGUI 的产生是因为这种需要有一个只需工作即可的模块。'

PyAutoGUI 的产生是因为这种需要有一个只需工作即可的模块。我认为这是 PyAutoGUI 成为我最受欢迎的开源项目的主要原因之一。它对广泛的人群都有用。

德里科尔:你认为创建 Python 包的人应该有什么目标?

斯威加特:如果你想创建一个 Python 包,或者任何软件,最重要的是它易于使用。

阿尔·斯威加特:'如果你想创建一个 Python 包,或者任何软件,最重要的是它易于使用。'

在我开始编写任何代码之前,我只是把 API 的样子和我会如何使用它写出来。我认为很多程序员都喜欢编写代码和解决技术问题,但他们没有意识到,如果这些太复杂以至于人们无法实际使用,那么所有这些都没有价值。

阿尔·斯威加特:'当你刚开始时,你写的算法不需要很优雅。你甚至不需要代码非常干净。'

在开始时,你写的算法不必很优雅。你甚至不需要代码完全干净。只要使用模块简单,就能吸引人们的注意。一旦你知道你做出了人们想要的东西,你就可以在未来的开发中清理代码。

Al Sweigart:'我总是很高兴看到很多人使用 Pyperclip,它不仅仅是我为自己创建的一个玩具。'

我总是很高兴看到很多人使用 Pyperclip,它不仅仅是我为自己创建的一个玩具。我从制作满足他人需求的软件中学到了很多。例如,使用 PyAutoGUI,我收到了来自使用非英语键盘或非英语语言设置的用户的错误报告。这些是我如果只有我一个人使用我的创作时从未想过的问题。

这让我更加欣赏到,为了使代码足够健壮,能够满足广泛多样的用户,需要投入多少努力。我制作了一些其他开源项目,但 Pyperclip 和 PyAutoGUI 是那些教会我最多关于为他人编写软件的项目。

Driscoll:你在运营这些流行的开源项目中学到了哪些其他重要的见解?

Sweigart:我了解到,大多数情况下,人们真的很友好。我听到了一些来自开源维护者的故事,关于粗鲁的人要求你立即修复他们遇到的错误。但与我交流的人都非常欢迎,并且对他们的批评非常公正。我真的很感激。

Driscoll:你会给那些不愿意在网上分享代码的人什么建议?

Sweigart:你越早把代码放到网上并让人们查看它,就越好。

你必须克服那种害怕批评的心理,因为我知道代码审查比我做任何事情都让我成为一个更好的软件开发者。如果你不把自己放在那里,你会错过很多改进的机会,而且你总是可以匿名发布。

Al Sweigart:'你越早把代码放到网上并让人们查看它,就越好。'

这很像去健身房。有时候人们去健身房,他们担心别人在看着他们并评判他们。但健身房里的其他人太忙于思考自己,以至于没有注意到他们。我认为这同样适用于代码。大多数人实际上并不阅读你的代码。我相当确信,与我联系的大多数技术招聘人员,从未真正花时间去阅读我已经发布的数百行代码。

我通常讨厌两周前写的任何代码。我回顾它时,看到很多错误和粗糙的边缘。很多程序员都是这样。如果你担心你的代码太不完美而无法发布到网上,那么至少你并不孤单。

德里科尔:那么,你对那些想要在 Python 中创建下一个大型开源包的人有什么具体的建议吗?

斯威加特:有一种被称为诺贝尔奖效应的东西,就是当科学家获得诺贝尔奖后,他们会想,“我能做什么来赢得第二个诺贝尔奖?我需要解决一个更大的问题。”

然后他们把目标定得太高,从此再也没有完成任何事情。我有时对 Pyperclip 和 PyAutoGUI 也有这种感觉,因为我没有想过它们会像现在这样受欢迎。

我的 GitHub 个人资料上有许多其他仓库,没有人过多关注。所以我的建议是继续工作,实现你的不同想法。预测什么会变得流行真的很困难。这对我来说是开源项目的情况,也是我写的书的情况。我真的不知道我所做成功的事情会成功。我大部分的工作都没有取得成功。

从小做起,不断成长。从你的错误中学习,并意识到你会犯很多错误。把你的代码拿出来接受批评,学会与他人合作,因为所有的大型开源项目都是由团队而不是个人完成的。我认为这可能是最成功的秘诀。

斯威加特:“所有的大型开源项目都是由团队而不是个人完成的。”

德里科尔:你对现在的 Python 最兴奋的是什么?

斯威加特:看来我们终于迎来了 Python 3 采用的转折点,这是有充分理由的。

语言中的几个地方进行了效率改进,最值得注意的是 3.6 中的字典(它们是 Python 本身的基础)。asyncio 模块看起来可能成为杀手级特性。但主要我还是很高兴看到 Python 被更多的非软件工程领域的人使用,比如爱好者、学者和数据科学家。

德里科尔:你对 Python 2.7 的长寿有何看法?每个人都应该现在就转到 Python 3 吗?

斯威加特:是的,绝对应该迁移到 Python 3。到了 2018 年,模块还不支持 Python 3 的借口已经不再成立,而且已经好几年了。

继续使用 Python 2 的唯一原因是你有一个庞大的现有 Python 2 代码库,由于 Python 早期就非常受欢迎,这很不幸地成为了许多代码库的情况。但我觉得现在 Python 3 已经有了太多的改进,不能忽视。

斯威加特:“我觉得现在 Python 3 的改进太多了,不能忽视。”

对于我个人来说,更好的 Unicode 字符串处理是我所看重的卖点。我见过很多代码,一旦有人在字符串中使用了非 ASCII 字符,就会立即崩溃。我总是觉得 Python 3 之前的版本在处理 Unicode 字符时如此尴尬,直到一个朋友指出 Python 主要是在 Unicode 之前出现的。很容易忘记 Python 已经存在了多久。

德里斯科尔: 那么,您如何看待 Python 作为一门语言的发展?您认为哪些特性将会出现,或者您认为 Python 将会在哪些领域打开?

斯威加特: Python 看着编程领域,哭泣着因为它已经没有更多的世界可以去征服。

阿尔·斯威加特: 'Python 看着编程领域,哭泣着因为它已经没有更多的世界可以去征服。'

当然,这是一个夸张的说法。但令人惊讶的是 Python 被用在多少不同的领域。它是一个伟大的通用脚本语言,但也用于大规模系统。它被用于网络应用,也被用于机器学习。它被最大的科技公司使用,也被用于高中的计算机科学课程。

我正在尝试思考 Python 在哪些领域还没有取得成功。嵌入式设备是一个领域,但 MicroPython 也在解决这个问题。Python 在 AAA 游戏和 VR 领域很难销售,但对于业余游戏制作者甚至一些独立游戏开发者来说却很棒。Python 被用于网络应用的后端,但 JavaScript 仍然是前端之王。我希望看到 Python 在浏览器中的应用。

我一直很欣赏 Python 3 的变化,如果有什么的话,那只是因为 Python 3 终于让字符串能够合理地工作了。在英语国家,很多程序员忘记了 ASCII 并不是一个通用的代码。实际上,ASCII 在英语国家也不是通用的。原始的 ASCII 字符集有一个美元符号,但没有英镑符号。编写不会因为有人提交带有重音字母的字符串而崩溃的代码是一个巨大的胜利。

阿尔·斯威加特: 'Python 社区本身是我所遇到过的最好的技术社区。'

让我对 Python 保持乐观的并不是语言本身,更多的是背后的人。Python 社区本身是我所遇到过的最好的技术社区。他们关心开放和包容,这吸引了大量新鲜血液和新的视角。所以我认为,尽管 Python 现在已经接近 30 年了,它仍然有很大的潜力。我认为 Python 将会保持相关性和存在感一段时间。

德里斯科尔: 谢谢你,阿尔·斯威加特。

第十七章。拉马洛·卢西亚诺

拉马洛·卢西亚诺

拉马洛·卢西亚诺是一位巴西软件工程师,也是 Python 软件基金会(PSF)的成员。他是 ThoughtWorks 的技术负责人,这是一家设计软件公司。拉马洛之前在巴西的银行、媒体和政府部门教授 Python 网络开发。他是《流畅的 Python》一书的作者,并担任巴西 Python 协会的理事四年。拉马洛经常在国际 Python 会议上发表演讲。他共同拥有培训公司 Python.pro.br,并共同创立了巴西的第一个黑客空间 Garoa Hacker Clube。

讨论主题:Python 书籍,APyB,v2.7/v3.x。

在这里了解拉马洛·卢西亚诺:@ramalhoorg

迈克·德里斯科尔:你能简单介绍一下你自己吗,拉马洛?

拉马洛·卢西亚诺:当然,我是一个自学成才的程序员。我 1963 年出生于巴西。1978 年,我 15 岁的时候,看到 HP-25 计算器上运行着月球着陆游戏,对将可编程计算器和桌面游戏结合起来的可能性感到兴奋,那时我的主要爱好就是桌面游戏。

那年稍后,我父亲雇主给了他一个 TI-58 计算器,我立刻借了过来,再也没有归还。我的第一个有趣的程序是将月球着陆游戏从 HP 移植到 TI 语言(两者都是类似汇编的语言)。

1981 年,我在伊利诺伊州的哈里斯堡作为交换生度过了一年,我是两个志愿者之一,我们在高中图书馆刚刚收到的苹果 II 计算机上自学编程;学校里没有其他人知道如何使用它们。

回到巴西后,我的第一份工作是翻译苹果 II 软件手册到葡萄牙语,我的第二份工作是教授编程,这成为了我终身的热情。

拉马洛·卢西亚诺:'我的第二份工作是教授编程,这成为了我终身的热情。'

从那时起,我大约一半的时间是作为程序员,一半的时间是作为教师。我曾担任 8 位教育软件程序员,CP/M 独立商业应用程序员,Windows 客户端-服务器应用程序员,Windows 和 macOS CD-ROM 程序员,以及巴西一些最早的门户网站在 Unix 上运行的系统后端程序员。

我有几家小公司(一个桌面出版局,一个软件公司和一家培训机构),现在我很自豪地成为 ThoughtWorks 的主顾问。

现在,我最喜欢做的编程类型是示例代码,用来说明语言、API 和平台中的新概念。我对开发者体验(DX)也非常感兴趣。我真的很享受挑战编写最简单的示例,既能展示一个想法,又仍然有趣(不仅仅是foobar的抽象)。这就是我为什么称自己为站立式程序员

德里斯科尔:你为什么成为程序员?

拉马洛:我成为程序员是因为我喜欢编程的程度和我喜欢玩桌面游戏一样。

我看到了一个非常强烈的平行关系:一种语言提供的关键字和函数就像你在游戏中可用的棋子和其他游戏资源,你必须安排它们以实现预期的效果。语言语义就像游戏规则。如果一个语言有语法宏,那么这就好像在游戏中能够创建全新的棋子——这是一种非常强大的能力。

Luciano Ramalho: '我成为程序员是因为我享受编程,就像我享受玩桌面游戏一样。'

除了有趣之外,编程让我们在世界上产生巨大的影响,我总是试图保持积极的影响。

Driscoll: 为什么是 Python?

Ramalho: 在 Python 之前,我学习了十多种语言,之后也至少学习了六种。但 Python 是我整个职业生涯中用得最久的一种语言。

正如俗话所说,Python 符合我的思维方式。我发现它既优雅又实用,简单而不简单化,一致而不僵化或限制。过了一段时间,我在 Python 社区也交了很多朋友,这成为了我坚持使用 Python 的一个巨大原因,即使有时我也渴望尝试不同的事物。

我在 1998 年偶然发现了 Python,当时我正在学习 Perl 5 的面向对象特性,这是我一直在使用的网络开发工具。当时,每当 Perl 邮件列表中有人询问如何以面向对象的方式完成某事时,就会提到 Python 的比较。在提到 Python 两三次之后,我决定去查找它。

Luciano Ramalho: '我阅读了 Guido van Rossum 的教程,并爱上了这门语言。它结合了 Perl 和 Java 的最佳品质。'

我阅读了 Guido van Rossum 的教程,并爱上了这门语言。它结合了当时我使用最多的两种语言——Perl 和 Java——的最佳品质。Python 是一个真正的面向对象语言,拥有像 Java 一样的合理类库,但它也像 Perl 一样简洁实用,比两者都更易于阅读、一致且使用愉快。我认为 Python 是语言设计的杰作。

Driscoll: 你认为是什么让 Python 成为 AI 和机器学习如此好的语言?

Ramalho: 最重要且最直接的原因是 NumPy 和 SciPy 库使得 scikit-learn 等项目成为可能,而 scikit-learn 目前几乎是机器学习的既定标准工具。

NumPy、SciPy、scikit-learn 以及许多其他库最初被创建的原因是 Python 具有一些使它在科学计算方面非常吸引人的特性。Python 拥有简单且一致的语法,这使得编程对非软件工程师的人来说更加容易。

另一个原因是运算符重载,它使得代码可读且简洁。然后是 Python 的缓冲协议(PEP 3118),它是外部库在处理类似数组的结构时与 Python 高效交互的标准。最后,Python 受益于一个丰富的科学计算库生态系统,这吸引了更多的科学家,并形成了一个良性循环。

Driscoll:什么可以使 Python 成为 AI 和机器学习的更好语言?

Ramalho:Python 中 AI 和机器学习项目的最大挑战是在生产环境中部署,这些项目需要所有外部依赖。容器有很大帮助,但从来都不容易。

Driscoll:你是如何成为作家的,卢西亚诺?

Ramalho流畅的 Python是我开始写的第四本书,但却是第一本完成的。写一本书需要花费很多时间,很容易低估所需的努力。

2013 年,我向 OSCON 提交了一个演讲提案,并被接受。在会议上,我带着 iPad 上的四张幻灯片走向 O'Reilly 展台:书名、关于我的介绍和两个大纲幻灯片。他们对此很感兴趣,并给了我一个书稿提案模板。几个月后,我签署了合同,并得到了一小笔预付款。

我最初是兼职写这本书。在那段时间里,编辑梅根·布兰切特是唯一阅读它的人。她给了我一些非常宝贵的指导,特别是在书的流程方面。

在项目进行到大约九个月的时候,第一个截止日期即将到来,我可能无法按时完成。O'Reilly 的合同中包含了一个条款,如果我有问题交付,可以强制指定合著者。但流畅的 Python对我来说是一个非常个人化的项目,所以我决定放弃所有其他的自由职业工作,只专注于这本书。

我又工作了九个月,可能每周大约 50 小时,最终完成了它。在第二阶段,技术编辑加入了项目。审稿人都是我钦佩的人:亚历克斯·马尔蒂、安娜·雷文斯克罗夫特、伦纳特·雷格布罗和莱昂纳多·罗查埃尔。维克多·斯廷纳专注于关于 asyncio 的章节,这是对我们其他人来说的新主题。他们都给了我很多优秀的反馈和鼓励。

Driscoll:你在写流畅的 Python中学到了什么?

Ramalho:我对 Python 学到了很多。在写作过程中,我探索了之前从未访问过的标准库部分。

我理解了独特的 Python 语言特性,如属性描述符和yield from表达式。我终于发现了为什么 Windows 上的 Python 程序没有问题打印到 cmd.exe 控制台,但将其输出重定向到文件时却会崩溃,出现UnicodeEncodeError

我对 Python 学到了更多。我还学会了做自己的价值。对某个主题充满热情并深入了解它是创作内容的好基础。

拉马洛·卢西亚诺:'我还学会了做自己的价值。对某个主题充满热情并对其有深入了解是创造内容的好基础。'

我是一个狂热的读者,这对写作至关重要。我对语言设计也非常有意见。作为一个读者,我总是对那些在写作中混淆事实和观点的技术作者感到烦恼,所以我提出了在每个章节末尾添加“肥皂箱”部分的想法。我可以提出我的观点,同时让读者清楚他们可以跳过这部分。肥皂箱部分很有趣,一些评论家也喜欢它们。所以这是一个例子,说明做自己是如何发挥得很好的。

Python 社区由那些热爱分享他们所知的人组成,他们应得到认可。因此,我记录了我在书中使用过的所有重要参考资料,包括不仅限于其他书籍,还有博客文章、视频,甚至 StackOverflow 的回答。我在“进一步阅读”部分与读者分享了这些笔记。这也是一些评论家赞扬本书的一个特点。

拉马洛·卢西亚诺:'Python 社区由那些热爱分享他们所知的人组成,他们应得到认可。因此,我记录了所有重要的参考资料。'

在个人层面,写作 流畅的 Python 并见证其在评论和销售中的成功,对我个人的自尊心来说是个巨大的提升,在我之前三次尝试写书失败之后。所以我想,一个教训就是坚持不懈,当你相信一个项目时,全力以赴是有回报的。

一些读者给了我很多宝贵的反馈,其中最积极的一位成为了我的好朋友:伊利亚斯·多内莱斯。所以另一个教训是,开放心态接受反馈,并给人们提供反馈的机会是非常重要的。

德里斯科尔:如果你可以重新开始,你会做些什么不同的事情?

拉马洛:我会写一本更短的书!我最初计划写 300 页,但最终变成了 770 页。

或者,我可以写五本更短的书,因为 流畅的 Python 从第二部分到第六部分都可以独立工作得很好。但这样一套书对读者来说可能更贵,也许不会带来同样的认可和销量。

我没有遗憾,因为我已经相信,无论发生什么,都是唯一可能发生的事情。我从作者布鲁斯·埃克尔那里学到了这一点,这是开放空间活动的一条规则。

拉马洛·卢西亚诺:'无论发生什么,都是唯一可能发生的事情。我从作者布鲁斯·埃克尔那里学到了这一点,这是开放空间活动的一条规则。'

德里斯科尔:你是如何成为巴西 Python 协会联合创始人的?

拉马洛:巴西 Python 社区是在奥斯瓦尔多·桑塔纳创建的一些邮件列表和维基百科上自然成长的。我已经是用 Python 作为我的主要语言,并且为杂志写了一篇教程,但正是奥斯瓦尔多创建的维基百科鼓励我参与更广泛的社区。

我们中的许多人每年都会在 FISL 上聚在一起,这是巴西最大的 FOSS 会议。面对面见面,一起去喝啤酒,可以加强一个始于线上的社区,这真是令人难以置信。

Luciano Ramalho: '面对面见面,一起去喝啤酒,可以加强一个始于线上的社区,这真是令人难以置信。’

Rodrigo Senra 组织了第一次巴西 Python 会议,Jean Ferri 组织了第二次。在没有正式支持实体的情况下举办这些会议是困难的:组织者不能以一个模糊的社区的名义签署合同、开具发票或收集赞助。所以在一个 FISL 上,我们决定创建巴西 Python 基金会。

当我们得知在巴西法律下“基金会”是一个保留词时,我们面临了几个月的官僚主义。为了成为一个基金会,我们需要一个五年的行动计划。我们需要一些员工,以及足够的捐赠来资助我们的员工和至少五年的所有计划。因此,我们不得不改变我们的计划,成为更谦逊的巴西 Python 协会(APyB)!

最后,我们由于我们的坚持和 Dorneles Tremea 的机智,他是我们的第一位管理总监,也是 APyB 的继任主席,所以我们成功了。

Driscoll: 我听说有些人质疑 APyB 的价值。你对这种批评有什么回应?

Ramalho: 是的,我知道有些人质疑 APyB 的有用性,毕竟这确实要求其志愿者主席和董事们投入一些时间。我在为 APyB 辩护的主要论点是,我们尝试过没有它,结果更糟。

Driscoll: 那么,你现在正在从事哪些开源项目?

Ramalho: 实际上,目前没有!我确实开始了pingo项目,这是一个为编程具有 GPIO 接口的设备而设计的设备无关 API。但我只成功吸引了 Lucas Vido 作为坚实的贡献者。我们都忙于其他事情,所以项目现在已经被搁置。我想重启它,但我不知道我何时能做那件事。

我的所有会议演讲和教程的代码和幻灯片都是开源内容。我有超过 50 个演示文稿可供任何人查看:speakerdeck.com/ramalho。所有这些演讲也都在 GitHub 的/fluentpython组织以及我的个人 GitHub 账户(/ramalho)上。

我已经开始编写用于学习 Go 的开源内容。我的下一个开源项目更有可能是一本或一些其他内容,而不是应用程序或库。

Driscoll: 哦,你考虑再写一本书真是太好了!那么,你有什么建议给有志于成为作家的人吗?

Ramalho: 嗯,我不是经济学家,但我认为写书和弹吉他一样有可能付账,所以不要为了钱而做,而是为了你对这个主题的热爱。

此外,要做好准备,迎接一段非常漫长的旅程。要有储蓄,这样你就可以在需要的时候抽出一些时间来写作。我知道的两位非常成功的作家告诉我,他们与合著者之间的许多经历都是不好的。所以我想,没有简单的方法可以摆脱作为作者的漫长而孤独的旅程!

德里科:你有没有考虑过自出版?

拉马洛:是的,我考虑过,但尽管有几种自出版选择,我认为如果你能的话,至少你的第一本书应该由一家好的出版社来出版。第一个原因是你会从一位优秀的编辑和你的技术审稿人那里得到所有支持。第二个原因是,当你的作品由一个知名品牌推广并装饰其封面时,你会得到的认可。

德里科:在你写书的时候,你是先写代码再开始写,还是不先写代码?

拉马洛:“我相信,代码示例是任何编程书籍的核心:没有优秀的例子,你不可能有一本优秀的书。”经典《图形 Java》书籍的作者大卫·吉亚里曾经写道,写一本编程书本质上就是提出启发性的例子,然后围绕它们进行解释。我采纳了他的建议,这对我的工作非常有效。

拉马洛·卢西亚诺:“我相信,代码示例是任何编程书籍的核心:没有优秀的例子,你不可能有一本优秀的书。”

所以,虽然对我来说最困难的部分无疑是提出例子,但在我开始写作之前,我已经创建了很多代码。我绝对不是从一个空白的文本文件和一个空白的屏幕开始的!

在《流畅的 Python》中的一些例子和解释是我过去 10 多年教授和讲解 Python 时开发的。我还为这本书创造了更多特定的内容,实际上,我还创造了更多我从未在书中使用过的例子,因为它们要么变得过于复杂,要么我后来想到了更好的例子。

拉马洛·卢西亚诺:“对于所有 Python 教师来说,这是一个很好的学习点:我们必须学会放弃我们的例子和写作。”

对于所有 Python 教师来说,这是一个很好的学习点:在必要时,我们必须学会放弃我们的例子和写作,无论我们投入了多少工作量。所以当我们作为教师和作者找到更好的方法,或者我们意识到我们已经做得太过分了,那么对于我们的读者来说,放手我们的例子并继续前进是很重要的。

我已经知道,当我着手写下一本书时,我会尝试放弃更多这样的材料。我也作为教师思考这个问题。作家和飞行员安东尼·德·圣埃克苏佩里在飞机设计背景下说过:“似乎完美不是当你没有更多东西可以添加时达到的,而是当你没有更多东西可以移除时。”

德里科:你对今天的 Python 最兴奋的是什么?

Ramalho: 除了 Python 在数据科学领域的巨大成功之外,我也对 async/await 关键字能够实现异步编程的潜力感到兴奋,这不仅可以通过标准的 asyncio 库实现,还可以通过如 Trio 这样的第三方库实现。

关于 Python 3.7,最让我兴奋的添加是 PEP 557,它引入了一种创建具有显式数据属性的标准方式。这是像 ORM 这样的库不得不反复重新发明的东西。

Driscoll: 你对 Python 2.7 有什么看法?人们应该迁移到最新版本吗?

Ramalho: 是的,人们应该完全转向 Python 3.6。这门语言正在稳步发展,而且大多数库已经移植了多年。然而,并不是每个人都能承担得起这样的转变。

Luciano Ramalho: '是的,人们应该完全转向 Python 3.6。这门语言正在稳步发展,而且大多数库已经移植了多年。'

最棘手的部分是解决 stringsbytes 之间的问题。这是一个非常积极的改变,但无法自动化,因为在 Python 2.7 中,strings 有时被处理为人类文本,有时被处理为原始字节。

Driscoll: 你希望在未来 Python 版本中看到哪些变化?

Ramalho: 我希望看到全局解释器锁(GIL)被移除,这样我们就可以在执行 CPU 密集型工作时利用所有处理器核心。不幸的是,拉里·黑斯廷斯在 2017 年中期的最新努力似乎已经停滞。

主要问题是移除 GIL 将会破坏大多数(或所有,取决于你问谁)依赖于 Python/C API 的外部库。大多数人没有意识到的一个事实是,没有 GIL,用另一种语言为 Python 编写扩展将会复杂得多。所以,尽管我们希望 GIL 不存在,但在现实中,它是 Python 成功的基石。

Python 核心开发者埃里克·斯诺写道,GIL 更多的是公关问题。是的,使用 Python threads 或异步库可以编写高度并发的 I/O 密集型代码。但是当这样的项目增长或受到重压时,会出现 CPU 密集型瓶颈。这些瓶颈在多线程代码中非常难以找到,但由于 GIL,它们会减慢一切。

也许只有一小部分 Python 项目今天会受到 GIL 的严重影响,但 CPU 的核心越来越多,速度却没有加快,因此利用多个核心变得越来越重要 (mail.python.org/pipermail/python-ideas/2015-June/034177.htmllwn.net/Articles/650521/)).

Driscoll: 谢谢你,卢西亚诺·拉马洛。

第十八章。尼克·科根兰

尼克·科根兰

尼克·科根兰是一位澳大利亚软件开发者和系统架构师。他过去的工作经历包括在波音澳大利亚的软件工程师和红帽亚太地区的资深软件工程师,红帽是一家开源解决方案提供商。尼克是 CPython 核心开发者,Python 打包互操作性标准的 BDFL 代表。他是 Python 软件基金会(PSF)的 Python 打包工作组创始人,也是 PyCon 澳大利亚教育研讨会的创始人。在过去 20 年里,尼克为一系列开源系统和软件项目做出了贡献。

尼克·科根兰的照片版权:©库沙尔·达斯

讨论主题:核心开发者、PEP、学习 Python。

在这里了解尼克·科根兰:@ncoghlan_de

迈克·德里斯科尔:是什么让你决定成为一名计算机程序员?

尼克·科根兰:起初,我只是把编程当作孩子时的玩具。我们有一本关于 Apple IIe 的老式 BASIC 编程书籍。

直到我在高中一年级学习信息技术时,我才意识到计算机实际上是一种可以用来工作的玩具。我去的学校是该州最早开设信息技术课程的学校之一。所以这就是我后来在大学选择计算机系统工程的原因。

我大学毕业后最初的全职工作是使用 C 语言为德州仪器的 DSP 进行嵌入式系统编程。从那里,我做了很多系统控制和自动化工作,这看起来更像编程,而不是嵌入式软件开发。所以,我只是喜欢编程,我擅长它,而且你可以从中赚钱。

德里斯科尔:那你为什么转向 Python?

科根兰:我转向 Python 的方式实际上很有趣,因为我最初是一名 C/C++开发者。

尼克·科根兰:“我就是那个回答说‘我们能用不同的语言吗?我已经知道 Java 了,我想用 Java’的人。’

我在大学里对 Python 的唯一接触是从一位网络讲师那里,他说:“我将让你们所有人用 Python 完成作业,因为我相信你们中没有人会知道它”。我就是那个回答说:“我们能用不同的语言吗?我已经知道 Java 了,我想用 Java”的人。

我的讲师说:“好吧,如果你真的想用 Java,那就用吧,但先试试 Python”。所以我试了 Python 1.5.2,感觉很有趣。

在专业领域,我在澳大利亚的一家大型系统集成公司工作。对于我正在工作的 DSP 项目,我的测试套件是一个非常基础的 C 程序,如果它运行到结束而没有崩溃,那就算成功了。

当我们到达下一级集成测试时,我们遇到了很多 DSP 代码不正常工作的问题。所以我们有大量的行为错误通过。我们决定我们需要编写一个更好的测试套件来输入音频。检查我们是否从实际数据分析中获得预期的答案是重要的,而不仅仅是我们可以与 DSP 通信并远程请求它做事情。

尼克·科格兰:'检查我们是否从实际数据分析中获得预期的答案是很重要的。'

我们想检查实际的信号处理。我们也不想用 C 和 C++来编写它。系统的另一部分已经批准 Python 作为系统控制组件的语言。所以 Python 并没有用于关键路径的东西,只是协调系统的不同部分,并在它们应该启动时启动它们。

我们在自动化测试方面有两个主要的选择。一个选项是使用 Python 的unittest模块和 SWIG 生成绑定到与 DSP 通信的 C++驱动程序的绑定。另一个选择是我们用于其他所有事情的内部 C/C++测试框架。我们选择了 Python。

德里斯科尔: 为什么选择 Python?

科格兰: 问题是 Python 有一个unittest模块来实际组织测试。Python 有 SWIG 来连接到 C++驱动程序。我们控制了那个驱动程序的 API,所以让它与 SWIG 很好地配合是直接的。

然后最后一个关键部分是 Python 在其标准库中有一个 wave 模块,可以从 PC 播放 WAV 文件。因此,这为整个项目确立了一个趋势,即澳大利亚高频现代化项目。Python 最终在这个项目中广泛传播,用于所有测试、模拟系统接口的测试目的。

德里斯科尔: 所以我知道另一个澳大利亚人帮助创建了 pywin32。你在那个项目中有什么参与吗?

科格兰: 不,我过去一直只是个 pywin32 用户。实际上,历史上有很多澳大利亚人为 Python 社区做出了贡献。但是因为他们并没有真正活跃在 PyCon Australia 或类似的活动上,所以我实际上从未见过他们!

德里斯科尔: 好吧,让我们继续。你是如何成为 Python 语言的核心开发者的?

科格兰: 所以我对这个问题的简短回答是,我是通过与 Guido van Rossum 争论而成为核心开发者的!

尼克·科格兰:'我是通过与 Guido van Rossum 争论而成为核心开发者的!'

实际上发生的事情是,我从 20 世纪 90 年代末就开始使用 Usenet,所以我非常熟悉那个整个在线讨论格式。在我开始使用 Python 后,我最终加入了原始的 Python 邮件列表,并参与了那里的讨论。

我发现 Python-Dev 是一个东西,并开始在那里潜伏,最初只是想听听人们都在谈论什么。我实际上开始积极参与讨论并发表帖子。我记得我第一次真正做出的贡献是在 Python 列表上的讨论。

使用timeit模块来计时代码片段并说“哦,这个比那个快。”是很常见的。在那个阶段,如果你想比较两个不同版本之间的代码片段,你必须找到标准库中特定版本的timeit模块所在的位置。

我们说,“等等!Python 已经知道timeit模块在哪里了。我们为什么还要告诉 Python 在哪里找到它?”所以这最终成为了一个补丁,用于在 Python 2.4 中添加初始版本的-m 开关。我认为雷蒙德·赫廷格审查了那个。这个 Python 初始版本只能处理顶层模块,不能处理包或子模块。最终到了 Python 2.7,-m 开关实际上正常工作,并做了你期望的所有事情。

尼克·科根:'终于到了 Python 2.7 版本,-m 开关才真正正常工作。'

在 2004 年底发生了一件有趣的事情。在工作中的一个大压力期之后,我请了三个月的假。我最终帮助雷蒙德和法昆多·巴蒂斯塔对 Python 十进制模块进行了初始的性能提升。我们正在研究我们能做什么来使该模块更快。

德里斯科尔:你找到加快速度的方法了吗?

科根:实际上,几年后找到了一个解决方案,但在那些早期日子里,有很多基准测试来说明,“我们能把这个东西做得有多快,仅仅作为一个纯 Python 的东西?”

尼克·科根:'有很多基准测试来说明,'我们能把这个东西做得有多快,仅仅作为一个纯 Python 的东西?'

我记得那些日子里有一个辉煌的技巧。我们发现,在纯 Python 中,如果你有一个你想转换成十进制数的数字元组,那么 CPython 本身提供的最快转换机制是将所有数字转换为字符串,连接这些字符串,然后使用int将连接后的字符串转换回数字。

这是因为字符串到int的转换已经被优化到了一个程度,这样做比用 Python 代码进行所有乘法和加法运算要快。当然,在 C 语言中,你会进行算术运算。我们的发现真的让 PyPy 开发者感到烦恼。从他们的角度来看,进行算术运算要好得多,因为 JIT(即时编译)工作。这意味着他们的decimal模块比他们希望的运行得慢。

我认为我是在 Python 2.3 发布后不久开始参与讨论的。当时的一种流行消遣是嘲笑扩展切片语法。你有反向笑脸的开放括号,冒号,冒号,-1,和闭合括号,来反转一个序列。这还是在reversed或类似功能出现之前。

reversed之所以成为可能,是因为发现正确处理切片反转的算术实际上相当棘手。如果你手动做,很容易出现偏移量错误。所以添加reversed使得代码更容易阅读。

德里斯科尔: 你对 Python 2.7 的长期存在有何看法?人们应该迁移到最新版本吗?

科格兰: 我们故意将 Python 2.7 的支持期设定得足够长,以便现有用户可以自己决定何时认为 Python 3 生态系统足够成熟,可以切换过来。

尼克·科格兰:“我们故意将 Python 2.7 的支持期设定得足够长,以便现有用户可以自己做出决定。”

感受过 Python 2.7 限制之苦的人们早早地迁移了,所以我们现在处于这样一个阶段,即大多数尚未迁移的人要么正在寻找更好的工具来帮助他们完成这个过程,要么只是简单地计划在 Python 2.7 停止支持的同时结束受影响的项目和产品。

在工具方面,Python 3 的类型提示机制的一个重要用例是允许人们静态检查 Python 3 的类型正确性错误,即使他们的自动化测试覆盖率很低。这大大扩大了可以可靠迁移的代码范围。

德里斯科尔: 你希望在未来的 Python 版本中看到哪些变化?

科格兰: 我希望看到更好的工具来处理部分结构化的分层数据,但方式要保留 Python 作为可执行伪代码的声誉。我还希望继续减少使用扩展模块可以做到的事情和具体需要 Python 源模块的事情之间的差异。

最后,我希望看到对受保护内存管理模型的支持得到改善,而不是旨在作为安全边界,而是提供内存分离作为辅助维护并发代码正确性的方式。CPython 的子解释器功能已经在某种程度上提供了这种支持,但该功能目前存在许多可用性挑战,埃里克·斯诺正在努力解决这些问题。

德里斯科尔: 好啊!那么让我们假设我想成为像你一样的核心开发者。我实际上需要做什么才能成为核心开发者?

科格兰: 其中最重要的一件事是要弄清楚你为什么想成为核心开发者。你需要回答这个问题,因为在不可避免的不满中,你会问自己:“我究竟为什么要做这件事?!”

如果你不知道自己的动机是什么,那么这将会成为一个问题!没有人能为你回答这个问题。过了这个阶段,成为核心开发者最主要的是,这实际上很多都是关于信任和赢得信任。

尼克·科根:“成为核心开发者最主要的是,这实际上很多都是关于信任和赢得信任。”

这是一个贡献的问题,所以作为核心审查员,我们基本上在那里说,“我们是否想接受这个变化并将其维护到未来?如果我们后来被问及,我们能否给出一个关于我们为什么接受这个变化的良好答案?”

当我们提名新的核心开发者时,我们寻找的是我们信任其能够做出良好判断的人。我们希望他们能说,“是的,这是一个合适的变更,从整体上讲,将使未来的 Python 用户的生活变得更好。”

编程语言设计是一场权衡的游戏。如果你试图一次性优化所有事情,那么你最终什么都没有优化。所以随着时间的推移,出现了很多权衡,使某些事情变得像 Python 一样。这变成了一个问题,即你是否可以自己做出决定,或者你是否需要将问题带到 Python-Dev 进行讨论。

尼克·科根:“编程语言设计是一场权衡的游戏。如果你试图一次性优化所有事情,那么你最终什么都没有优化。”

然后有一个最终的升级级别,当我们说,“这个提案很棘手,这里有很多微妙之处。这里有足够的潜在争议,我们应该将这个问题升级为一个完整的 Python 增强提案,并详细讨论细节,然后再做其他任何事情。”最终是核心开发者决定一个特定的变化位于那个光谱的哪个位置。

尼克·科根:“最终是核心开发者决定一个特定的变化位于那个光谱的哪个位置。”

德里斯科尔:核心开发者是如何做出那个决定的?

科根:嗯,错误修复通常相当直接,因为我们知道有些东西是错误的。即使是在错误修复的情况下,有时也会让人困惑。

我们有三个真理来源,因为我们有参考解释器所做的工作,测试套件所说的,以及文档所说的。当这三个都达成一致时,你就知道你所做的是一致的。

当解释器做了某事,而测试套件和文档对此保持沉默时,事情开始更多地成为设计判断的问题。那种情况根本就没有被测试,也没有记录为做了任何特别的事情。然后另一种情况是,文档说了一件事,但测试和实现说的是另一件事。在这些情况下,你必须说,“嗯,是文档正确并且是一个错误,还是文档只是错了?”

那些是你作为一个核心开发者能够做的事情。而当你是一个贡献者时,你只是希望把自己的想法提出来。这仍然是一个信任管理的问题,但你试图做的是说服审阅者你的改动是值得进行的。所以,是的,这确实很有趣!

你需要理解成为核心开发者意味着什么,以及为什么这是你想要的。从角色的实际操作机制来看,有由布赖特·卡农最初用 BSF 资金编写的开发者指南。开发者指南随着时间的推移得到了维护和增强,它解释了成为核心开发者与成为 CPython 贡献者之间的区别。

尼克·科根:'作为一个核心开发者,你会有额外的责任。'

作为一个核心开发者,你会有额外的责任。这个角色包括处理问题、与审阅者合作、理解审阅流程、在邮件列表上讨论事情以及做出设计决策。你最终会处理在这样一个大项目上工作的不可避免的不满。根据你是什么样的人,核心导师邮件列表也可能很有用。

德里斯科尔:所以我一直对 Python 增强提案很感兴趣。你能描述一下它们是如何被创建和接受的流程吗?

科根:是的,所以 Python 增强提案(PEPs)可以通过两种不同的流程进行。

尼克·科根:'有一种情况是一个核心开发者提出一个我们知道我们想要进行的改动,但我们也知道这个改动将会很大且复杂。我们知道不需要任何人告诉我们,这个改动需要成为一个 PEP。所以在这种情况下,我们通常会先写一个 PEP,并将 PEP 提交到 PEPs 仓库。'

一种情况是一个核心开发者提出一个我们知道我们想要进行的改动,但我们也知道这个改动将会很大且复杂。我们知道不需要任何人告诉我们,这个改动需要成为一个 PEP。所以在这种情况下,我们通常会先写一个 PEP,并将 PEP 提交到 PEPs 仓库。

我们将在 Python-ideas 上开始讨论,说:“嘿,我写了一个新的 PEP,提出了这个,这是原因。”讨论基本上就是从那个层面开始的。核心开发者管理 PEP 流程,因为我们已经经历了几次,我们知道什么时候一个改动足够大,可以成为 PEP。

对于其他 PEP(Python 增强提案),通常的起点是有人带着一个建议来到 Python-ideas。这个建议已经作为一个 Python-ideas 线程讨论了一段时间。然后人们会说:“你知道什么,这实际上听起来可能是一个好主意!”然后决定将这个想法变成一个完整的 PEP,并通过这种方式提出这个想法,而不是仅仅在问题跟踪器上提交为一个问题。

这实际上让我想起了 PEP 发生的第三种方式。它们可以从问题跟踪器上的讨论中产生,当我们确实知道我们想要进行改动,但有很多小细节。我们写一个 PEP,讨论细节,然后使用它来推动我们如何实现这个想法。

尼克·科格兰:“我们编写一个 PEP,讨论细节,然后使用它来推动我们的想法的实施。”

德里斯科尔:那么这些变化只是讨论,直到它们最终被解决,然后被接受或拒绝吗?

科格兰:这取决于提议。有些提议本身并不具有争议性,但细节需要进一步讨论。

这些提议通常会经过 Python-ideas 和 Python-Dev 的一些讨论。然后,将做出决定停止讨论这个想法,并开始实施它。这个提议成为了一个被接受的 PEP,并最终进入最终阶段。

有些提议更接近边缘,我们向 Python-Dev 提出了一个问题,即它们是否真的是一个好主意。我们目前确实有一个关于空合并运算符的提议。我们真的不知道我们是否想继续下去。这个 PEP 会使语言更加复杂,因为它是一种需要学习和理解的晦涩语法。所以这是反对这个想法的主要论据。但在支持这个论据时,你说:“嗯,这是一个在数据处理管道中相当常见的模式。”

因此,这个 PEP 仍在讨论中,直到它最终被提交给 Python-Dev 作为一个是或否的问题。然后,将做出决定,要么我们确实想继续下去,要么我们不,除非有变化。

尼克·科格兰:“非常偶尔,你会得到一些专门写成被拒绝的 PEP。”

非常偶尔,你会得到一些专门写成被拒绝的 PEP。在这些情况下,一个想法会不断出现,但反对它的论据从未在任何地方被清楚地记录下来。所以有人只是花时间写下这个想法,并写下我们拒绝这个 PEP 的所有原因,然后说:“好吧!我正在发布这个被拒绝的 PEP,来说明我们为什么不做这件事。”这让我想到了我在 Python 3.5 和 3.6 中看到的一些新东西,这些只被部分接受,并被归类为临时。

德里斯科尔:那么这略有不同吗?这意味着人们已经足够同意,他们想添加一些内容,但他们可能不会保留它吗?

科格兰:是的,所以我们接受了一些变更,并立即将其纳入我们的标准向后兼容性保证中,结果我们遇到了几次麻烦。

我们最终陷入的困境是把自己逼入了一个角落。我们陷入了支持一个实际上对它试图解决的问题并不好的 API。我们收到了这些建议和潜在的模块添加,这些显然对用户是有益的,并且显然是有帮助的。问题是,我们不确定我们是否正确地设计了 API 的细节。

尼克·科格兰:“我们陷入了支持一个实际上对它试图解决的问题并不好的 API。”

我们不想将任何内容置于我们完整的标准库向后兼容性保证之下,所以我们决定不包含这些新增内容。这种方法最终对每个人都不利,因为它将本应包含在标准库中的内容排除在外。

我们也无法使用这种类型的模块来帮助我们改进标准库的其他部分。坦白说,新构建块进入标准库的主要方式之一是我们想在标准库的其他部分使用它们。所以现在有一个标准库的enum类型,因为我们想在像 socket 模块这样的东西中使用enum类型。

我认为最终成为 PEP 411 的临时 PEP 经历了几次迭代。基本上,PEP 411 是为了让我们能够接受我们相当有信心会保留的模块,但我们还不确定 API 设计细节是否正确。

我们将 PEP 作为临时提案保留几轮发布,以便在出现错误时,我们有权利对 API 进行破坏性更改。我认为异步 I/O 仅在 Python 3.6 中刚刚变为非临时。

尼克·科根:“我们将 PEP 作为临时提案保留几轮发布,以便在出现错误时,我们有权利对 API 进行破坏性更改。”

德里斯科尔:那么将 PEP 作为临时提案是否有效?

科根:是的,我们实际上对它的运作效果非常满意。它让我们能够清楚地警告人们 PEP 仍然有些变动。这使用户知道我们仍在确定细节,如果这让他们感到困扰,那么他们就不应该使用这个 PEP。

最近有一个有趣的例子是 Python 3.6 中的pathlibpathlib被作为一个临时 API 包含在内,它与期望字符串的其他标准库 API 存在许多互操作性问题。

尼克·科根:“对于 Python 3.6,pathlib遇到了十字路口。”**

对于 Python 3.6,pathlib遇到了十字路口,要么再次从标准库中移除并推回纯 PyPI 模块,要么必须修复互操作性问题。这是 Python 3.6 核心开发团队面前的一个非此即彼的决定。

这个决定成为了os.path协议,或os.fspath协议以及路径对象支持,这基本上是修复了pathlib的互操作性问题。这意味着现在有很多标准库 API 会自动接受路径对象。

德里斯科尔:好的,那么 Python 打包权威机构是什么?

科根:所以 Python 打包权威机构的名字实际上最初是 pip 和 virtualenv 开发者开的玩笑。他们想要一个涵盖这两个项目的开发团队的名称。所以他们说:“让我们称自己为 Python 打包权威机构,因为没有人会期待 Python 打包权威机构!”

然后,回到 2013 年,我们开始积极尝试将更多工具,如setuptoolsdistutils,引入这个领域。Python 打包用户指南开始将这些信息整合起来,以提供一种更连贯且官方推荐的做法。我们也需要一个名字来称呼这个范畴组。我们决定 Python 打包权威机构这个名字听起来挺酷的,所以我们可以开始将更多项目纳入这个范畴。

尼克·科根:“我们决定 Python 打包权威机构这个名字听起来挺酷的,所以我们可以开始将更多项目纳入这个范畴。”**

基本上,Python 打包权威机构在打包工具和互操作性标准方面扮演着一种角色,这与核心开发者与 Python 整体的关系类似。虽然对编程语言设计和软件分发设计感兴趣的人之间有一些重叠,但很多人更倾向于其中的一边。这些人对于另一方面的内容并不感兴趣。

将这两种类型的人分开意味着任何关心这两种设计类型的人都可以参与这两个子社区。但我们并不是一直在试图向语言设计师解释软件分发的复杂性,反之亦然。我认为这种划分使人们普遍感到更快乐。能在一个你理解的群体中是很不错的。我喜欢打包,但也喜欢 Python。所以我有点犹豫自己可能属于哪一类。我可能还想在 Python 和 Python 打包权威机构上工作。

尼克·科根:“我喜欢打包,但也喜欢 Python。所以我有点犹豫自己可能属于哪一类。”**

德里科:Python 是 AI 和机器学习中使用的几种主要语言之一。你认为为什么 Python 会是这样?

科根:AI 和机器学习是探索性交互数据分析与重型数值计算的有趣结合。CPython 丰富的 C API 导致 Python 成为连接用 C、C++和 Fortran 等语言编写的性能组件的“胶水”语言。

科学研究界已经这样使用 Python 超过 20 年了(Numeric 的第一个版本于 1995 年发布)。这意味着 Python 提供了一种独特的混合体,既灵活又易于学习,是一种通用计算语言,结合了一套为高性能计算环境开发使用的科学计算库。

德里科:“为了使 Python 成为更好的 AI 和机器学习语言,我们可以做些什么?”**

科根:在易用性方面,还有很多机会让组件更容易地提供给用户,无论是通过预配置的免费增值网络服务(如 Google Colabatory 或 Microsoft Azure Notebooks),还是通过本地的 Python 和 Conda 打包工具链。

在性能方面,还有许多未探索的机会来更好地优化 CPython 解释器和 Cython 静态编译器(例如,Cython 目前不提供共享动态运行时,因此生成的模块中可能存在大量的重复样板代码,这不仅使它们更大、编译速度更慢,而且在运行时导入也更快)。

德里斯科尔: 所以我注意到你也是一个博主。你写了多久关于 Python 的内容?是什么让你决定成为一名博主的?

科格兰: 大概是在 Python 3.3 的时候,我开始在我的博客上谈论编程相关的内容。大多数情况下,我发现写作是一种非常有用的思考辅助工具。你被迫使你的想法足够连贯以便于阅读。所以现在我还是主要用这种方式来使用博客。如果我对 Python 的某个特定方面想要稍后引用,那么我会写下我的当前想法。

德里斯科尔: 在你看来,Python 是一个适合实际开始学习编程的语言吗?

科格兰: 我确实推荐 Python 作为一种基于文本的第一语言。对于很多人来说,如果他们想要掌握基本概念,从一种即插即用的语言开始是一个不错的选择。

尼克·科格兰:“一旦你想进入完整的组合编程,那么 Python 就是一个非常优秀的语言。”

一旦你想进入完整的组合编程,Python 就是一个非常优秀的语言。故意的语言设计限制并不十分明智。你不能让它们解析非常复杂的远程操作。如果你学习语言学,你就会意识到人类大脑也难以解析复杂的远程操作。

所以 Python 的优势在于,你只需要向前看一个标记就能理解你当前正在查看的内容的上下文。你不需要在脑海中保留太多信息来理解代码试图告诉你的内容。我们试图使不同名称的来源可见。我认为这会对人们将想法融入大脑的难易程度产生很大的影响。

几年前,我发表了一篇关于脚本语言和适宜复杂度的帖子。如果你查看一本菜谱或工作指导手册,你将找到程序性指令。菜谱的外层非常程序化和顺序化。然后子函数和对象都嵌入在这个框架中。我认为 Python 对人们来说效果很好,因为它反映了我们与世界互动的方式。

尼克·科格兰:“我认为 Python 对人们来说效果很好,因为它反映了我们与世界互动的方式。”

德里斯科尔: 你能更详细地解释一下为什么 Python 工作得如此好吗?

科格兰: 当然,我们按顺序做事。从程序性开始作为你的基础,然后根据需要,将其他所有东西层层叠加,这样做是非常有意义的。

面向对象编程、函数式编程和基于事件的编程都是我们为了管理复杂性而提出的技术。无论你选择哪一种,作为你语言的基本组织原则,都将设定你所做事情的最小复杂度。

与那些使用机器人技术和具身计算类型环境进行教学的人交谈非常有趣。当你这样教学时,从对象开始是一个不错的选择。具身计算的人有那种自然的能力,可以说:“我桌子上坐着的机器人对应于我程序中的‘Robot’类。”他们可以进行这种视觉关联。

我认为默认情况下,过程式编程确实与烹饪书和说明书的编写方式相匹配。这有助于降低入门门槛,但与此同时,Python 是一种可以与你一起成长的编程语言。Python 拥有进行数学编程、面向对象编程和函数式编程的所有工具。

尼克·科格兰:“Python 是一种可以与你一起成长的编程语言。”

你可以根据你遇到的问题使用 Python。当你开始更深入地了解 Python 的特定方面时,你可以利用这一点作为跳板,进入专注于特定领域的语言。因此,你可以使用 Python 来进入 Haskell(函数式编程)、Java 或 C#。

德里斯科尔:所以,让我们假设我已经了解了 Python 的所有基础知识,现在我想增强我对这种语言的理解。我应该怎么做?

科格兰:在这个阶段,你需要问自己的重要问题是你是如何学习的。例如,对我来说,我发现我非常注重基于需求的学习。

尼克·科格兰:“我学习新的编程技术和新的库是为了解决问题。”

我并不擅长为了学习而学习。我学习新的编程技术和新的库是为了解决问题。在我的情况下,我会找到我感兴趣解决的问题,然后学习我需要做的任何事情来解决它。

在学习更多方面,艾莉森·卡普图已经写了一些相当不错的内容。我们已经开始在开发指南中添加一个关于深入了解内部结构的章节。一个有用的技巧是看看你每天都会用到的东西,尤其是开源库,然后开始深入研究代码。

尼克·科格兰:“看看你每天都会用到的东西,尤其是开源库,然后开始深入研究代码。”

因此,在标准库中,实际上会有从标准库模块文档到源代码的链接。实际上,只是去阅读它,并试图弄清楚为什么某些事情被这样做,可能会有所帮助。

这让我想起了另一个有趣的项目,叫做 Python Tutor(pythontutor.com)。Python Tutor 是一个代码可视化器或行为可视化器。当你通过代码工作时,Python Tutor 有一个逐步更新的小系统模型,解释正在发生的事情。

一种策略,我知道有些人肯定觉得很有用,就是试图改变事物,不是因为它们实际上想要做出改变,而是为了学习涉及其中的机制。

德里斯科尔:你对今天的 Python 最兴奋的是什么?

科格兰:我会给出一个分裂的回答,因为我对这个问题的专业和个人观点略有不同。

在很多方面,Python 对 Linux 生态系统所做的一切,就像 Linux 生态系统对一般企业组织所做的那样:无处不在,却没有人真正费心去告诉管理层。这意味着我们迄今为止所取得的一切成就,主要是通过志愿者社区贡献者的努力实现的,只有大型商业和机构用户偶尔和间歇性的投资。

尼克·科格兰:“我们迄今为止所取得的一切成就,主要是通过志愿者社区贡献者的努力实现的。”

所以,从职业角度来看,最让我兴奋的是,AI 和机器学习技术在商业软件开发中的使用增加,促使许多组织意识到,软件开发的世界远不止当前的 C、C++、Java 和 C# 的企业巨头。

这在近年来通过 IEEE Spectrum 的年度多数据源语言排名中表现得最为明显,Python 在 2014 年开始时位于前五名边缘(与 C# 一起),但稳步攀升,在 2017 年的调查中达到了第一名。

个人而言,最让我兴奋的是我们正在让教师和其他教育者直接参与到开源 Python 社区中来。受到 2014 年 PyCon 澳大利亚上詹姆斯·柯兰的精彩主题演讲以及 PyCon 英国教育轨道的启发,我在 2015 年成立了 PyCon 澳大利亚教育研讨会,并且从那以后每年都在举办。

许多 Python 用户组也专注于成人教育,并为那些希望提高他们在当前职业中的计算技能,或者考虑转向软件开发职业的人提供研讨会。

德里斯科尔:谢谢你,尼克·科格兰。

第十九章。迈克·贝耶

迈克·贝耶

迈克·贝耶(Mike Bayer)是一位美国软件开发者,同时也是红帽(Red Hat)的高级软件工程师,该公司销售开源软件产品。他之前的工作经历包括在许多纽约的互联网公司,如 MLB.com。他还曾在美国职业棒球大联盟(Major League Baseball)从事内容管理软件的开发工作。迈克是多个 Python 开源编程库的创造者,例如 SQLAlchemy,这是一个 SQL 工具包和对象关系映射器。他通过推广良好的数据库软件实践在 Python 社区中发挥着积极作用。迈克是 PyCon US 和欧洲较小会议的常客演讲者。

讨论主题:SQLAlchemy、AI、v2.7/v3.x。

在这里了解迈克·贝耶的最新动态:@zzzeek

迈克·德里斯科尔(Mike Driscoll):是什么让你成为了一名程序员?

迈克·贝耶:我从 1980 年开始对电脑产生兴趣,那时我第一次接触到早期的个人电脑。我试图用汇编语言学习早期的 8 位电脑的游戏编程,但并没有取得太大的成功。在高中时,我接触到了 Pascal 语言中的数据结构和过程式编程。

我觉得成为一名程序员似乎是顺理成章的,但结果却是,我从计算机工程转到了音乐专业,并且有几年时间完全没接触过电脑。我发现自己在公告板上与其他程序员竞争过于激烈,而且我不喜欢自己变成的样子。

我重新回到电脑行业纯粹是因为这是我能吃饭和付房租的唯一方式。大约在那个时期,互联网成为了一个商业行业,我立即参与了那种工作。

一旦第一个互联网泡沫出现,纽约市的程序员突然变得紧张而兴奋。每个人都想让你为他们工作。编程的竞争性实际上多年来一直给我带来持续的问题。我不得不努力减少这个问题。

德里斯科尔(Driscoll):你是如何开始接触 Python 的?

贝耶(Bayer):我的 Python 之前的大部分职业生涯都是在使用 Perl、Java 和一点 C 进行编程。我非常热衷于面向对象的应用程序设计,并最终经历了一个深度的架构宇航员阶段,这在 1990 年代末和 2000 年代初的 Java 程序员中非常普遍。

我喜欢脚本语言的想法,因为它们允许你直接跳入文本文件。你会得到一些可以立即工作而不需要 Java 那种正式性、样板和编译步骤的东西。因此,我也花了很多时间试图在 Perl 中实现面向对象设计,但这并不令人满意。

迈克·贝耶:'拒绝接受大量空白符的几年后,我终于开始接触 Python。'

我意识到 Python 可能真的能够在两个世界之间找到一个平衡点。在拒绝接受大量空白符的几年后,我终于开始接触 Python,并意识到这门语言实际上是我一直在寻找的一切。

迈克·德里斯科尔:Python 对你来说有什么特别之处?

拜耳:给我留下深刻印象的是 Python 的这种方式,即你的解释器中的所有东西都是 Python 对象,包括你导入的所有模块。

现在,这种看待事物的方式对我来说已经习以为常了。但当我第一次了解到我可以像查看更多数据一样检查程序本身的元素时,我所接触到的所有其他语言都完全不一样。

Python 非常容易理解,尤其是在我花费多年时间真正弄不懂 Perl 的 use 语句之后。我还观察到 Python 在脚本语言中一般不常见的对一致性和正确性的强调。

我预测,我将与之合作的 Python 程序员将比我之前接触到的开发者质量更高,因为他们被 Python 所吸引!结果证明这完全正确。

德里斯科尔:那么是什么启发了你创建 SQLAlchemy?

拜耳:嗯,我一直有一个目标,就是找出我想在哪个编程语言中安家。在这个语言中,我想构建一套完整的工具,我可以用它来做任何事情。我想能够独立行动,为人们构建应用程序。

迈克·拜耳:“我想能够独立行动,为人们构建应用程序。”

在我的各种工作中,我总是不得不创建某种类型的数据库抽象层,然后在许多项目中使用它。我总是在使用我所使用的任何语言构建小型模板引擎、微型 Web 框架和数据库抽象层,并试图为所有项目标准化。

当我开始接触 Python 时,我对当时可用的 Web 框架工具和数据库抽象工具并不满意。我之前也已经编写了许多模板引擎和数据库访问工具,所以我有很多想法。

迈克·拜耳:“当我开始接触 Python 时,我对当时可用的 Web 框架工具和数据库抽象工具并不满意。”

我首先编写了一个名为 Myghty 的模板引擎,它是 Perl 模板引擎 HTML::Mason 的几乎逐行移植。Myghty 很糟糕,但它还是获得了一些短暂的流行,并成为了 Pylons Web 框架第一个版本的基石。

当我开始编写 SQLAlchemy 时,我采取了非常深入和缓慢的方法,试图让它变得非常出色。在那个阶段,我作为一个程序员,尤其是作为一个 Python 程序员,仍然有很多缺陷。早期的 SQLAlchemy 有很多糟糕的设计选择,但它仍然以其真正独特和可能非常出色的特性而闪耀。第一次看到工作单元执行刷新时,我感到非常惊讶。我意识到这件事可能对人们有深远的影响。

德里斯科尔:那么 Mako 是如何产生的?

Bayer:Mako 非常简单地被创建出来,以取代 Myghty 及其所有糟糕的设计选择,这样 Pylons 就可以有一个不那么令人尴尬的模板引擎。

Mako 原本打算成为一个非常强大和稳定的模板引擎,一旦完成就可以基本让它自行发展。虽然 Mako 在多年中增加了更多功能,但我已经认为它在很多年前就已经完成了。我仍然在使用 Mako,但我很高兴 Jinja2 成为 Python 事实上的模板引擎。毕竟,Armin Ronacher 将 Mako 的架构归功于他创建 Jinja2 的许多灵感来源。

Mike Bayer:“我仍然使用 Mako,但我很高兴 Jinja2 成为 Python 的事实上的模板引擎。”

Driscoll:如果你能重新开始使用 SQLAlchemy,你会做些什么不同的事情?

Bayer:我犯了一些错误,这些错误最终极大地促进了项目的发展。所以,如果我没有犯这些错误,我不确定事情会怎样发展。

我之前提到的关于竞争性的问题,导致我在早期与一些贡献者有不良的互动。驱逐那些有良好想法的人,在很多情况下,比我所看到的问题更清晰,这是一个巨大的错误。

我也应该花更多的时间阅读其他 Python 代码,并提高使用正确的惯用模式的技能,而不是在我了解 Python 的新知识后,不得不回过头来修复所有代码。

如果我能重新开始使用 SQLAlchemy,我也会做其他不同的事情。在 0.1 版本中有很多设计模式,我试图在 0.2 或 0.3 版本中消除这些模式。我无法完全去除这些模式。

版本 0.1 在核心和 ORM 级别都严重依赖于对象与数据库连接的隐式关联。如今,其中两种模式仍然以绑定元数据和无连接执行的形式存在。这些模式仍然非常受欢迎,但与基于明确性的新模式相比,继续产生微妙的混淆。

Mike Bayer:“如果我现在从我所知的一切开始,SQLAlchemy 一开始就会更接近目标。”

这些年来,许多其他 API 模式都经历了大幅度的修订。如果我现在从我所知的一切开始,那么 SQLAlchemy 一开始就会更接近目标。在早期版本中也就没有必要经历重大的 API 更改。

我也应该及早认识到需要一个良好的 SQL 迁移工具的需求,尽管 sqlalchemy-migrate 在处理这个问题上做得很好,直到我有时间创建 Alembic 迁移。

Driscoll:从创建开源项目中,你学到了什么?

贝耶:嗯,首先,如果你的开源项目变得流行,那么它永远不会结束。如果你的项目与某些不断变化的技术相关联,比如 Python 数据库 API,那么你的工作将永远不会完成。

迈克·贝耶:'如果你的开源项目变得流行,那么它永远不会结束。'

我完全没有想到,修复 bug 的速度会保持恒定超过十年。我还了解到,要在开源领域取得成功,你确实需要很多运气。你必须足够幸运,在正确的时间做项目。我比社区中的大多数人更早地接触到了 Python,并在最佳时机发布了我的软件。

最后,我学到了很多关于当用户想要某个功能或行为 X 时必须应用的微积分知识。你真的不能仅仅根据他们的字面意思来对待他们。通常,当用户认为他们想要 X 时,他们实际上想要 Y。有时他们认为他们想要 X,但他们没有充分考虑其后果。

你在添加 X 时必须非常小心。同时,你不想让用户因为拒绝他们的功能请求而感到不高兴。最重要的是,作为维护者,你需要尽可能有礼貌。这非常困难,因为很多用户都很无礼且自以为是。尽管如此,对此进行发泄也毫无益处。

德里斯科尔:我们看到 Python 在人工智能和机器学习中被大量使用。你认为为什么 Python 是这种应用如此出色的语言?

贝耶:我们在该领域所做的是开发我们的数学和算法。我们将我们肯定想要保留和优化的算法放入 scikit-learn 等库中。然后我们继续迭代并分享我们如何组织和思考数据的笔记。

迈克·贝耶:'高级脚本语言非常适合人工智能和机器学习,因为我们可以快速移动事物并再次尝试。我们创建的代码大部分行数都用于表示实际的数学和数据结构,而不是样板代码。'

高级脚本语言非常适合人工智能和机器学习,因为我们可以快速移动事物并再次尝试。我们创建的代码大部分行数都用于表示实际的数学和数据结构,而不是样板代码。

类似 Python 这样的脚本语言甚至更好,因为它既严格又一致。每个人都能比在其他一些具有混乱和不一致编程范式的语言中更好地理解彼此的 Python 代码。

工具如 IPython 笔记本的可用性使得在全新的层面上迭代和分享我们的数学和算法成为可能。Python 强调我们试图做的核心工作,并最大限度地减少我们如何向计算机下达指令的其他所有方面,这正是它应该做的。自动化你不需要思考的事情。

迈克·贝耶:'自动化你不需要思考的事情。'

德里斯科尔:你认为 Python 如何能成为人工智能和机器学习更好的语言?

贝耶:机器学习是一个 CPU 密集型任务,因此我们需要继续迭代如何更好地利用所有这些处理器核心,不幸的是,这意味着全局解释器锁(GIL)。目前,唯一的方法是使用多进程。

迈克·贝耶:'Python 仍然缺少一个合适的并发范式。'

Python 仍然缺少一个介于线程和进程之间的合适的并发范式,其中线程意味着 Python 的动态合约意味着我们有一个 GIL,而进程则涉及到如何共享数据的复杂性和成本。可能有一个类似于多进程的解释器概念会有所帮助,但它在单个进程空间内完成。这个概念将使用操作系统级别的线程,同时仍然将进程隔离到足够程度,以至于它们不共享同一个 GIL。

德里斯科尔:你会给一个刚开始学习编程的人什么建议?

贝耶:在计算机编程中有很多传统智慧。你应该总是对传统智慧进行考验。

迈克·贝耶:'你应该总是对传统智慧进行考验。'

在编程中存在一些规则,比如不要使用可变的全局变量,这些规则实际上更像是为初学者准备的训练轮。它们是好的规则,其中包含了很多真理,但它们并不适用于所有情况。

当你从初学者成长为更高级的程序员时,你想要能够独立思考。你还想通过寻找新颖和创造性的方法来解决问题来积累经验。这些想法可能并不总是有效,但建立一个核心实践,即始终挑战现状,希望有一天你能找到解决某个问题的绝佳新方案。

德里斯科尔:你会推荐哪种语言给一个刚开始编程的人?

贝耶:我认为 Python 是我见过的最好的入门语言。在你编程的前几年里,你只需使用 Python,你很可能还会用到 JavaScript,因为浏览器是不可避免的。

在某个时候,编写某种脚本语言解释器或编译器也是一个很好的主意。理解在高级别声明的指令,如 Python 函数,如何最终表现为 CPU 执行的指令,是一个必须拥有的视角。

德里斯科尔:今天,Python 有什么让你最兴奋的?

贝耶:我很兴奋地看到 Python 正在成为几乎每个想要用数据做有思想的工作的人首选的语言,尤其是在新闻领域。

迈克·贝耶:'我期待着一群既能编写 Python 代码又能撰写标题的记者。'

新闻业正变得更加数据驱动,我期待着新一代记者,他们既能编写 Python 代码,也能撰写标题。我们需要能够从底层产生基于数据的故事的记者。这样,随着需求的增加,可能会有更多的数据可用。想象一下,每次我们在《华盛顿邮报》上阅读故事时,那里也有一份 IPython 笔记本,我们可以用它来分析故事中的数据。

Driscoll: 现在人们应该放弃 Python 2.7 吗?

Bayer: 从 Python 2.7 迁移是一个会自行解决的问题。我认为在数据领域,人们现在肯定是从 3.x 系列开始的。在我工作的基础设施领域,我们理解地需要更长的时间才能达到那里,但我们会的。

贝耶: 从 Python 2.7 迁移是一个会自行解决的问题。我认为在数据领域,人们现在肯定是从 3.x 系列开始的。

Driscoll: 你希望在未来 Python 版本中看到哪些变化?

Bayer: 老实说,我希望未来对 asyncio 系统的重视程度降低,我认为这是一个被广泛误解的 API。

新程序员开始他们的项目时,使用异步技术从头到尾构建整个系统。因此,他们创建的带有错误和过于复杂的应用程序,其性能并不比使用传统技术更好。

异步 I/O 确实有它的位置,但在几乎任何实际应用中,它应该仅限于处理与外部资源和客户的交互。这应该只发生在外部数据交互的规模非常广泛且并发时(例如,抓取成千上万的网站,或等待成千上万的客户端的命令)。

我们应用程序的核心引擎(那些与本地数据交互并执行我们的业务逻辑和算法的),应该使用传统的多线程编写。异步和同步组件可以很好地互相通信,然而程序员需要很好地理解这两种范式。当前的异步文化根本不强调这一点。

Driscoll: 谢谢,迈克·贝耶。

第二十章。杰克·范德普拉茨

杰克·范德普拉茨

杰克·范德普拉茨是一位数据科学家,也是《Python 数据科学手册》的作者。他是华盛顿大学 eScience 研究所开放软件的负责人,在那里他与来自各个学科的研究人员合作。他在华盛顿大学之前的职位包括物理科学研究员。杰克是 Python 科学栈的长期贡献者,曾参与过 SciPy、scikit-learn 和 Altair 等项目。他经常在美国的 Python 会议上发表演讲,并在 PyCon、PyData 和 SciPy 上发表过主题演讲。杰克是谷歌的访问研究员,并写了一个技术博客。

讨论主题:数据科学和天文学中的 Python。

在这里了解杰克·范德普拉茨:@jakevd

迈克·德里斯科尔:你能简单介绍一下你的背景吗?

杰克·范德普拉茨:我在本科学习物理学,大学毕业后在户外工作了几年,担任环境教育者和登山向导。

在加利福尼亚的塞拉内华达山脉下星夜露营了几个月后,我爱上了天文学,并决定利用我的物理学背景去读研究生,学习更多知识。

直到研究生一年级,我仅仅做了一点编程。我在中学时玩过 HyperCard,在高中时上过 C++课程。在大学时,我还学了一些基本的 Mathematica。

德里斯科尔:你是如何开始使用 Python 编程语言的?

范德普拉茨:现在的天文学非常依赖计算,所以当我开始读研究生时,我需要重新学习如何编程。

杰克·范德普拉茨:“现在的天文学非常依赖计算……”

那时候,我们系的大部分人都在使用 IDL,但我很幸运能和一个教授合作进行了一个为期一个季度的研究项目,他推荐我使用 Python。他告诉我 Python 是未来的趋势,事后看来他完全正确!

我在寒假期间通过编写数独求解器自学了 Python,然后将其转变为数独生成器。后来,我参加了 2017 年的 PyCon 会议,并解释了为什么 Python 受到这么多科学家的喜爱和使用。

德里斯科尔:你喜欢 Python 的哪些方面?

范德普拉茨:我最先喜欢 Python 是因为它是开源的,这比一些学术界青睐的其他工具(比如 Mathematica、IDL 和 MATLAB)具有巨大的优势。

当我开始使用 Python 时,我发现其语法和语义非常清晰和直观,这让我在编程中找到了乐趣,而这种乐趣是我第一次学习 C++时从未有过的。

杰克·范德普拉茨:“我发现 Python 的语法和语义非常清晰和直观。”

此外,尽管我在开始时科学 Python 生态系统还相对初级,但它是一个巨大的福音。无论你想用 Python 在科学上做什么,都可能有某人已经为它创建了一个包。

Python 与许多其他语言的互操作性意味着它可以作为科学家需要一起使用的各种工具之间的粘合剂。然后,Python 的“内置电池”特性意味着几乎一切都有内置库,其他一切都有第三方库。

杰克·范德普拉茨:“Python…可以成为科学家需要一起使用的各种工具之间的粘合剂。”

Python 的简单和动态特性使其非常适合日常科学数据探索,其中开发速度是首要的,而执行速度通常居次。

最后但同样重要的是,Python 的开放精神与科学非常契合,我们看到了越来越多的科学家在 GitHub 和类似的服务上托管他们的研究代码,以帮助实现可重复性。

德里斯科尔:Python 的开放精神是如何帮助科学社区的?

范德普拉茨:Python 的开放精神非常适合科学应该如何进行。我在 2017 年 PyCon 的主题演讲中指出,在过去五到十年中,科学家们真正吸收了许多来自开源社区的最好实践。

代码共享、版本控制、单元测试和代码文档对于确保现代科学可重复性至关重要。在科学社区中做得最好的计算工作的人已经从开源社区(尤其是 Python 开源社区)中采纳了许多这些实践。

德里斯科尔:Python 缺少了什么,这对科学家来说会很有帮助?

范德普拉茨:对于科学家来说,Python 的最大挑战是计算扩展需要用除 Python 之外的语言编写代码。

杰克·范德普拉茨:“对于科学家来说,Python 的最大挑战是计算扩展需要用除 Python 之外的语言编写代码。”

类似于 Cython 和 Numba 的工具通过允许你将 Python 或类似 Python 的代码转换为快速编译代码来解决部分问题,但在何时何地切换到这些额外工具上存在认知开销。PyPy 有希望,但问题是它不支持 CPython 的 C-API,这是科学生态系统的主体所必需的。

这就是为什么社区中的一些人会被 Julia 吸引。它是一种专为科学计算而构建的语言,从底层开始就内置了基于 LLVM 的快速执行。尽管如此,我在某些方面觉得 Julia 有点笨拙,我希望我们能够找到一个折中的方案:Python 的语法加上 Julia 的性能。

德里斯科尔:Python 社区如何帮助科学社区学习 Python?你目前正在使用 Python 进行哪些项目?

范德普拉茨:我所有的日常工作都在 Python 中完成。目前我参与了华盛顿大学(UW)的几个研究项目。我在指导学生进行天文学和以交通为重点的数据科学工作。

我正在帮助开发 Altair 库,这是一个 Python 接口,用于可视化语法 Vega-Lite。我认为它将很好地填补 Python 科学空间中当前的一个空白,即探索性数据分析。

Jake Vanderplas: '我通常推荐 Python...而这些天,我很少需要大力推荐!'

在华盛顿大学,我的工作部分是咨询大学内的研究人员,帮助他们研究的计算或统计方面。我通常在这些情况下推荐 Python,而这些天,我很少需要大力推荐!

Driscoll: 大多数天文学家是否都进行大量的计算机编程?

Vanderplas: 计算在现代天文学中绝对至关重要!该领域的大部分工作已经超越了浪漫的远征高峰,通过望远镜观察的日子。即使在现场观测时,观测数据也是通过连接到望远镜的 CCD 记录的。

此外,一般来说,所有简单的观测都已经完成。要真正推进我们对宇宙的理解,需要新颖的研究。这种新颖性可能意味着观察非常微弱的天体(在这种情况下,详细的噪声模型是必需的),或者观察许多天体以了解它们的统计特性(在这种情况下,可扩展的计算环境是必需的)。

在这个光谱的任一端,你最好知道如何编写代码来处理望远镜图像、建模有趣的特征并输出有用的结果。

Driscoll: 科学家需要编写代码的情况有多普遍?

Vanderplas: 就像在天文学一样,大多数领域的科学家都发现编程是必不可少的。

Jake Vanderplas: '大多数领域的科学家都发现编程是必不可少的。'

在数据量方面,我们天文学家一直处于领先地位,但随着传感器、相机、卫星和其他设备变得更加便宜和丰富,数据洪流也开始成为大多数其他领域的特征。

Driscoll: 哪些科学领域最常使用编程?

Vanderplas: 很难说,但天文学正在产生大量数据。

例如,在射电天文学中,有一些项目以大约 5GB/s 的速率产生数据。在物理学中,LHC 以大约 25GB/s 的速率产生数据。然后在生物统计学中,一个人的基因测序数据通常是~100s GB。所有这些领域都在使用复杂的算法从数据中提取意义。

Driscoll: 在另一方面,你是否知道任何 Python 在科学领域较弱的地方?如果是这样,它们是什么?

Vanderplas: 一些领域有着深厚的工具链历史。例如,MATLAB 可能在许多工程和应用数学系中是标准的。

十年前,一种名为 IDL 的语言在天文学研究中占主导地位,但现在已经改变了,现在 Python 是同行评审出版物中提到的主导语言。

这种变化在天文学领域有两个方面。一方面,一些有远见卓识的人士在影响力较大的位置上积极推动 Python 的早期应用(例如,位于空间望远镜科学研究所的 Perry Greenfield)。另一方面,来自研究生和博士后的大量实际支持推动了这一趋势,他们努力互相培训(例如,软件木工工作坊和 SciCoder 项目)。

Jake Vanderplas: 'Python 的势头似乎已经主导了整个局面。'

此外,整个社区也积极推动标准化天文学 Python 工具栈。结果是(惊人的)Astropy 项目。除此之外,Python 的势头似乎已经主导了整个局面。

Driscoll: 谢谢,Jake Vanderplas。

posted @ 2025-09-19 10:36  绝不原创的飞龙  阅读(8)  评论(0)    收藏  举报