

Massimo Di Pierro,意大利网络开发者、数据科学家、演说家。15年来,Massimo 一直在芝加哥 DePaul 大学计算机学院当教授。他是 web2py 项目的发起人与核心开发者,该项目是用 Python 编写的开源网络应用框架。Massimo 还是 Python 的活跃贡献者,出版过《Annotated Algorithm in Python》等三本 Python 图书。因其在 Python 社区的贡献,被选为 Python 软件基金会成员。

访谈主题:web2py、Python 图书、Python 2.7 与 3.x 对比。
Mike Driscoll:您是怎么当上程序员的?
Massimo Di Pierro:我是学物理的,但上中学时就开始编程了。家里当时有一台 IBM 电脑,我父亲是 COBOL 程序员,主要原因开发财务软件,那台电脑是他用的。
13 岁那年,父亲带我去听他的 COBOL 演说。他觉得我就是跟着去玩儿,但我其实能听懂,还有所触动。父亲知道以后给我买了台 Commodore 64,从此,我开始学 BASIC,后来又学了 Pascal。
Driscoll:那您是怎么开始接触 Python的?
Di Pierro:学编程很久后,我才接触 Python。我那时在英国读博士,用的主要是 Fortran、C、C++,我的工作与晶格量子色动力学有关,用的电脑是 Cray T3E。从那时起,我开始接触 Python,当时,Python 主要用于文件自动处理与脚本维护。2004 年,它变成了我最爱的编程语言。
Driscoll:您是一下子就喜欢上了 Python ,还是因为用的多,慢慢才喜欢上的?
Di Pierro:那时候,Python 没有现在这么多支持库,那时的支持库也远没有现在这么成熟。
喜欢 Python 是因为它的内省机制(introspection):可以查询函数的参数,使用 Python,能更好地理解代码。
Di Pierro:‘使用 Python,能更好地理解代码。’
Driscoll:我记得很多年前 BASIC 可以实现类似功能,但是 C++ 就很难找到类似功能。我真心喜欢程序能不断优化自身的理念。我曾开发过一个叫 OCL 的支持库,它允许 Python 用装饰器修饰一些简单函数,还可以在 runtime 时转换到 C 或 OpenCL,从而获取更高运算速度,这里用的是 PyOpenCL。
Di Pierro:您为什么会开发 web2py?
Driscoll:web2py 是 2007 年开发的,那时最流行的两个 Python 框架是 Django 和 TurboGears。我当时有两个需求:一个是要教学生用 model-view-controller 架构,另一个是自己要开发一些网络应用。

我曾对比过 Django 与 TurboGears 这两个框架,还用过一段时间 Django,甚至用 Django 为联合国搭建过内容管理系统,这是我们大学的公益项目。所以,我对 Django 比较了解,但 Django 太啰嗦了,不适合教学,对新人来说,有点难。
把 Django 当教学示例,要熟悉 Bash Shell 等系统管理工具。那时候,很多学生都不具备这方面基础知识,想用 Python 教网络开发,要融会贯通所有这些工具,这样的话要学的内容太多。我需要的只是一个下载文件、启动运行、无需配置,即可通过网页界面进行操作的框架。
Di Pierro:‘我只是需要一个下载文件、启动运行,无需配置,即可通过网页界面进行操作的框架。’
我还用过 TurboGears,它在好多方面都比 Django 强。但是 TurboGears 是由很多组件构成的网络框架,有一次升级后,很多常用组件因为没人维护都被替换成别的组件了。
TurboGears 的 API 也不稳定,不适合作为教学工具。我只好自己开发一个容易上手的网络框架,但没想到它会变得这么流行。
Di Pierro:‘我只好自己开发一个容易上手的网络框架。’
Driscoll:您在开发 web2py 过程中有哪些心得体会?
Di Pierro:我对搭建社区的重要性感触颇深。虽然与很多合作者素未谋面,但通过远程协同开发,我认识了很多人。
刚开发 web2py 时,我并不了解 Git 这样的协同开发工具。web2py 第一版用的是 Launchpad。当时大家发邮件提供帮助与建议。那时,我对协同开发一点概念都没有。
Di Pierro:‘我依然觉得与团队远程协同开发是一项核心技能,即便与他们仅在网上沟通,在现实中从未见过面。’
有好几年,我都不知道到底该怎么协同开发。现在,我依然觉得与团队远程协同开发是一项核心技能,即便与他们仅在网上沟通,在现实中从未见过面。随着时间推移,我会逐渐了解他们,彼此之间相互信任。可以说,绝大多数我最信任的人都是通过 web2py 认识的。
Driscoll:您觉得 Faas 或 Django 里有哪些功能很好,应该加入到 web2py 里?
Di Pierro:web2py 借鉴了很多 Django 与其它框架的思路。不过我们也为 web2py 添加了很多 Django 没有的功能。比如说更强的默认安全设置,web2py 里默认强制使用转义字符。
不同框架有不同的理念。比如,Django 的周边项目很多,每个项目都有自己的名字和运维人员。这些项目水平很高,维护也很上心。 web2py 则不同,我们希望把所有功能放在一个包里,在框架自身之外,不需要庞大的生态圈支持。
Di Pierro:‘web2py 借鉴了很多 Django 与其它框架的思路。’
web2py 的很多思路都来自于其它框架,但是我们对这些思路进行了改良。比如,表单生成与处理机制并非 web2py 独有,但我们开发的功能比其它竞品都好。
model-view-controller 设计架构主要借鉴 Django,URL 映射的默认路由规则与 Ruby on Rails 类似。对于模板语言,我们决定不采用专用域语言(domain-specific language),而是采用纯 Python 作为模板,这与 Ruby on Rails 里的 ERB 模板语言类似,只不过用的是 Python。

web2py 后来还添加过一些从其它框架借鉴的功能。比如,从 Flask 借鉴的线程局部变量概念。线程局部变量允许任意模块访问当前请求对象、当前响应对象、当前会话,即便代码是从其它文件里导入的模块也可以访问。我举双手赞同 Flask 处理这种情况的方式。
web2py 从很多框架中借鉴了诸多思想,不同框架之间其实都会互相借鉴,只不过有些人不愿意承认,但我不介意承认这点。
Di Pierro:‘不同框架之间其实都会互相借鉴,只不过有些人不愿意承认,但我不介意承认这点。’
Driscoll:我了解到您独立出版了一些图书,您为什么会选择这种方式?
Di Pierro:我的本职工作就是学术研究,对我来说,写论文、编图书是很自然的事情,我还要为软件写文档,快速更新书籍内容非常重要,独立出版适合我的这一需求。
我是开源思想的拥趸,不止代码,教育也可以开源。我独立出版的图书都以成本价销售,甚至可以免费下载。对我来说,及时更新与快速成书是首要目标。
我写书的目的是希望更多人阅读,不是为了挣钱。最终,校验图书的人是读者,而不是出版商。所以独立出版非常适合我。图书定稿后,我不想再去改来改去,只想尽快开始写下一本书。
Driscoll:您在写书的过程中有没有遇到需要攻克的难关?
Di Pierro:首先,英语不是我的母语。我的写作能力还成,但避免不了犯错,审校文稿耗费了很多精力。
另一个困难是,虽然我自认已经是专家了,但这并不意味对某个主题了解的非常透彻。我写作的流程是先写好代码,再把代码变为论文或图书。这样一来,我必须确保文章的内容与代码实例一致。写完文章,再调整代码,就会导致文章与代码不同步,所以事先尽量要把实例代码写好,写完整。
写 web2py 的书的困难是,很多人在 GitHub 上对该书提交了 pull 请求。最开始只是些小小不言的修正,但随着时间推移,他们做出了很多实质性的贡献。
跟踪这些贡献者很难,只有他们的 GitHub 账号,无法以合适的方式向他们表示感谢。大家通常只是单纯地发送代码,从不会在鸣谢功能里提交 pull 请求。但只有在鸣谢功能里提交 pull 请求,我才知道应该感谢谁。
Driscoll:您既是科学家,也是教师,您认为 Python 对科学社区有什么帮助?
Di Pierro:Python 在科学计算方面发展迅速,尤其是在机器学习领域,很多支持库脱颖而出,比如 sklearn、TensorFlow、Keras。
15 年前,我刚开始当老师,大家都不知道 Python 是什么。一些同事甚至反对用 Python 替代 Java 作为主要教学语言。Python 当时仅仅被当作一种“脚本语言”,只适合特定领域。
Di Pierro:‘Python 当时仅仅被当作一种“脚本语言”,只适合特定领域。’
现在,我们教授的每一门课,不管是神经网络、机器学习,还是数据分析,几乎所有人用的都是 Python。从这方面看,Python 的处境确实是大有改观。
Di Pierro:‘我觉得纠结 Python 2 还 Python 3 这个问题才是真正的问题。’
我觉得纠结 Python 2 还 Python 3 这个问题才是真正的问题。在 DePaul 大学,我们用的都是 Python 3,但是 Python 2 在业界还是无处不在,让人很头疼。
Python 3 里的异步逻辑用的人很少是另一个问题。Python 中新出现的异步逻辑非常强大,但没有 JavaScript 的异步逻辑那么友好。真正喜欢事件驱动异步编程的人会优先选择 JavaScript (或 Node.js),而不是 Python。
Di Pierro:‘Python 中新出现的异步逻辑非常强大,但没有 JavaScript 的异步逻辑那么友好。’
Driscoll:其实我比较关心那些支持 Python 2 的公司。您觉得如果这些追随 Anaconda 或 Intel 的公司继续支持 Python 2 而不是 Python 3,将来会出现什么样的问题?
Di Pierro:我不想在此讨论 Python 3 是不是比 Python 2 好,不过,从Python 2 迁移至 Python 3 确实比较麻烦。这项大工程不能实现完全自动化,而且需要熟悉代码。如果现有系统还能顺畅运行,大家的态度当然是多一事不如少一事。
Di Pierro:‘我不想在此讨论 Python 3 是不是比 Python 2 好,不过,从Python 2 迁移至 Python 3 确实比较麻烦。’
比如,Python 2 里的 str
函数把字符串转换为字节,但是 Python 3 则转换为 Unicode。不查阅代码,不理解函数要处理输入数据是哪种类型,期望的输出数据是什么,就无法从 Python 2 切换至 Python 3。
如果输入数据不包含怪异的字符,比如无需映射至 Unicode,简易的转换也可以实现不错的效果。只不过,你不知道代码转换的结果是不是与预期相符。以银行为例,很多银行都有庞大的 Python 代码库,这些代码经过多年开发与测试,已经非常完善,并且运行稳定。在这种情况下,切换到 Python 3 不是一件容易的事情,这里面的成本很难评估。想想看,还有少银行仍在用 COBOL。
不少工具可以辅助 Python 2 迁移到 Python 3 的工作,但我不怎么了解这些工具,所以,也可能很多我觉得头疼的问题,其实已经有成熟的解决方案了。但我还是觉得每次转换代码的时候,整个工作流程不是那么清晰明了。
Driscoll:您觉得 Python 在数据科学领域面临哪些挑战?
Di Pierro:我认为数据科学家喜欢 Python。数据科学领域里 Python 的主要竞争对手是 R 语言,但是 R 更受经济学家与统计学家欢迎。不过,R 更流行不是因为它更好,而是因为它进入数据科学领域的时间更长,并且更专注数据科学。

数据科学领域已经使用了很长时间 R,大家很清楚 R 能做什么。懂得这门语言的人不觉得有必要学习其它的语言。R 语言本来也是专注数据科学,所以这个社区里的人对这门语言更熟悉。
Di Pierro:‘在我看来,Python 现在已经逐渐被越来越多的人接受,而且在数据科学领域已经比 R 语言更加流行。’
R 语言与 Python 进行整体对比没有什么意义,只适合与 Python 的 Pandas 支持库进行对比。我觉得 Python 与 Pandas 的组合与 R 对比才有意义,我现在教授机器学习课程用的就是 Python 与 Pandas。在我看来,Python 现在已经逐渐被越来越多的人接受,而且在数据科学领域已经比 R 语言更加流行。我深信 Python 终将在数据科学领域独占鳌头。
Driscoll:谢谢您, Massimo Di Pierro。

Python大咖谈 - Kenneth Reitz 与 Mike Driscoll
Python大咖谈 - Brett Cannon
Python大咖谈 - Steve Holden
Python大咖谈 - Carol Willing
Python大咖谈 - Doug Hellmann


网友评论