Python大咖谈 - Alex Martelli

Python大咖谈_Alex Martelli
Alex Martelli

Alex Martelli,意大利计算机工程师,《Python in a Nutshell》第一、二版作者,《Python Cookbook》前两版与 《Python in a Nutshell》第三版的合著者,Python 软件基金会(PSF)成员。因在 Python 社区的卓越贡献,2002 年与 2006 年分别获得 Activators 精选奖与 Frank Willison 纪念奖。2005 年起,他开始在谷歌工作,现任谷歌高级工程师、谷歌云平台社区支持团队技术主管。Alex 是 Stack Overflow 积极贡献者,还常在各种技术大会上发表演说。


访谈主题:Python 图书,Python 2.7 与 Python 3.x,谷歌与 Python。


Mike Driscoll:能简单介绍一下您的背景吗?

Alex Martelli:我是意大利人,在国内学的是电子工程专业。毕业后,我想从事集成电路设计,虽然设计其它系统也很酷,但我还是钟情于集成电路。

那时,真正有意思的电路设计都是美国公司在做,所以,我的第一份工作在美国,也就是大家耳熟能详的德州仪器(TI)。

德州仪器(TI)

德州仪器名气很大,不管是消费产品还是前沿芯片,他们都在做,但我并不适应这家公司。德州仪器的风格是一下子启动很多项目,然后毫无征兆的就废弃这些项目,结果,我就在各个废弃的项目团队间跳来跳去。

Alex Martelli:‘我就在各个废弃的项目团队间跳来跳去。’

我也不能指责德州仪器这种做法。他们不想干扰工程师的生活,而我当时只是个小年轻儿,还是移民,反正在哪里都一样。不到一年,我就在达拉斯、奥斯汀、休斯顿与拉伯克的四个实验室工作过,还不到一年!

这么折腾给人的压力很大。之前觉得德州仪器的工作更有意思,我拒绝了 IBM 给的 Offer,后来,我只好又回过头去找 IBM。IBM 也开发过不少颇具创意的集成电路,只是不广为人知,他们关注的主要是科研,不是为了量产,仅仅是为了验证概念。

IBM 在这个领域也有很多走在时代前沿的技术。我记得 IBM 获得过一次诺贝尔奖,他们用单个原子拼写出 IBM 三个字母。比起观测原子,用电子显微镜摆放原子绝对是别出心裁,就像科幻小说似的。

IBM 当时要在意大利,具体说是罗马,设立一家研究院,他们希望有人能毛遂自荐,不用想,我肯定自告奋勇。这个机会不错,还能回国,那里有更好喝的卡布奇诺,还有更美味的面食!就这样,80 年代我又回到了意大利,从此我的事业开始起步了。

Driscoll:您是怎么成为程序员的?

Martelli:那是在 IBM 时的事儿,我们当年刚开发了一台图像处理原型机,这在当时可是很了不起的成就。这台原型机配备了专属芯片、帧缓冲器和显示器,现在看起来这算不了什么,但当时可是价值不菲。

Alex Martelli:‘我们当年刚开发了一台图像处理原型机,这在当时可是很了不起的成就。’

我们还为这台原型机举办了启动仪式,有位主管走过来和我说,“恭喜你们,只可惜这台原型机今后要在角落里吃土了。” 我很惊讶,“怎么会在角落里吃土?IBM 研究院有各个领域的科学家,天文学家、地质学家,都能用上这台机器啊。”

“你说的没错,” 他说,“但这台机器不支持他们用的编程语言啊,这些科学家用的是 Fortran 和 APL。想让这台机器派上用场,要有人写个通道程序(Channel Program),地质学家和天文学家才不会干这事儿。” 这可是一个庞大的软件项目,要开发所有科学家所需的界面与支持库。

我说,“能不能让我们组建一个小团队开发这个软件呢?” 他反问我,“你觉得多少人合适?”

我当时真的希望“自己设计”的机器能有用武之地,而不是放在那里落土,于是,我大着胆子低声说道,“3 个人?”

他笑了起来,“没问题,我负责找人,你负责组建团队,不过半年后得做出点成绩来。”

我就这样稀里糊涂地当上了 IBM 小主管,成了一名低层管理者,准确的说是技术带头人。但这并不意味着标准降低了,我需要自学大量的软件技能才能编写通道程序,要整合各个支持库,还要找出为那些外围设备加速的支持库算法。

Driscoll:那您成功了吗?

Martelli:半年后,我们只搞出了一套凑合能用的概念模型,好在领导同意我们接着干。最后,这个项目搞了两年,不过总算为 APL 与 Fortran 开发出了所需的支持库,这已经很难能可贵了。

Alex Martelli:‘我们总算为 APL 与 Fortran 开发出了所需的支持库,这已经很难能可贵了。’

这个软件项目让我们精心打造的硬件系统派上了用场,科学家与程序员可以用它实现图像处理与可视化,无需居间软件,也不用学习汇编语言或通道程序。

不过,两年完全没有接触硬件设计,这是个大问题,我甚至没有跟进硬件设计的趋势。那个年代,硬件设计,特别是集成电路,每年都有革命性的发展。不能在这一行占据前沿位置,很快就跟不上潮流了。

Driscoll:这就是您为什么会转向软件?

Martelli:是啊,我有多年经验,就算那些刚毕业的大学生,哪怕他们精通最新的高科技工具,我也比他们强。

但另一方面,哪怕最简单的管理工作与软件开发,也可以为我真正想干的事业添加很多附加值,比如,这些为集成电路设计的软件系统。

走了几年下坡路以后,我不得不承认自己设计不了像样的现代硬件系统了。长期以来,我干得软件开发与管理工作越来越多。其实,很多人与我的际遇类似,都是从硬件起步,然后,逐渐发现硬件本身不能真正解决问题。

Alex Martelli:‘很多人与我的际遇类似,都是从硬件起步,然后,逐渐发现硬件本身不能真正解决问题。’

我女儿现在就是这样。她是电信工程专业,也就是高级无线电系统专业的博士,虽然痴迷于硬件,但她现在的工作四分之三都是软件。这是因为所有的网络,越往底层走,越是软件驱动。

打个比方,假如设计一个天线,没有软件与数据的支持,其自身无法运作。如今的设备都会配备让人眼花缭乱的天线阵列,并有足够的智能支持,基于信号质量,判断什么时候激活哪个天线。这与我毕业时的无线电技术不可同日而语,需要大量软件支持。

Driscoll:您为什么会学 Python 呢?

Martelli:这段经历其实挺有意思。很多年前,刚踏入迷人的软件世界时,我曾用业余时间开发过一个研究定约桥牌打法的实验系统。

定约桥牌是 Harold Vanderbilt 在 1920 年代发明的。我学打定约桥牌的时候,有关这个游戏的数学理论很少。只有一名数学大师,Émile Borel,写过一本关于桥牌的数学理论图书。

那时,计算机的运算能力已经很强,也很便宜,就算拿来分析这些娱乐活动也不算可望而不可及。我就是在当时新卖的个人电脑上重构了 1930 年代首次提出的一种试验性思路。

Alex Martelli:‘我重构了 1930 年代首次提出的一种试验性思路。’

我是按照传统的硬件思路搞软件,从编程系统的组织方式上看,这个解决方案就是一团糟,用的语言数不胜数,Modula-3、Perl、Visual Basic、Scheme,等等,等等,我自己都觉得害怕,但不管怎么说,这一堆七拼八凑的东西能跑得起来。

Driscoll:这个程序能赢牌吗?

Martelli:这个程序每手玩了一百万次,并记录了所有结果,证明了 1920 年代与 1930 年代最聪明的桥牌大师,Ely Culbertson,令人不可思议的直觉。

我把分析结果写成了研究报告,提交给了《桥牌世界》,这是当时最有名的桥牌杂志。杂志编辑看了以后非常感兴趣,还与我一起改进这篇报告。这篇研究成果最终发表在《桥牌世界》 2000 年 1 月刊与 2 月刊上。

之后,我与不少桥牌选手互通有无,甚至有桥牌冠军问我,“你能用这些理论帮我解决问题吗?”

我很高兴能帮上他们的忙,只是这个程序太脆弱了,哪怕改个标点符号,也会莫名其妙地崩溃。纯属一团糟!所以我决定,不管是不是个坑,我都要重写一遍。目标就是尽可能用一种编程语言重构这个程序,但问题是用哪种语言!

Driscoll:那您找到了想要的语言吗?

Martelli:能实现我要求的语言只有 Lisp,其实我更偏向 Scheme,这可能和我的硬件背景有关。

可惜它的免费版没有足够的支持库,不能实现完成所需的辅助任务。再怎么说这也只是个人项目,我已经耗费了不少时间,不想再在这上面花钱了。有个同事向我推荐,“你可以试试新出的那个编程语言,现在特火,叫 Python。”

Alex Martelli:‘有个同事向我推荐,“你可以试试新出的那个编程语言,现在特火,叫 Python。”’

我说,“别别别,我都学了一打编程语言了,我可不想再学了!” 但他非要坚持,而我又很尊重这位兄弟,最终还是我挡不住他的狂轰乱炸,决定给这个编程语言一次机会。我给自己定了个小目标,用它解决个小问题,看看它到底好在哪里。

Alex Martelli:‘我说,“别别别,我都学了一打编程语言了,我可不想再学了!”’

1990 年代后期,我还不懂网络,这还是个新鲜事物,看上去蛮有趣的,我就琢磨着自己搭建个网站。网站编程与 Python 我都是自学的,你猜我花了多长时间?才一个周末!我说过,不论做什么事情,都得下点功夫。

我周五晚上开始边看手册边试着写代码,没过多久,我就不看用看手册了,我连猜带蒙,再根据其它代码的写法推断下一步该怎么写,我居然有 90% 都蒙对了。这门语言貌似和我的脑回路很搭,就好像我怎么想的,它就是怎么做的。

Alex Martelli:‘这门语言貌似和我的脑回路很搭,就好像我怎么想的,它就是怎么做的。’

周六下午刚过,我就学完了。我做出了一个能初步运转的 CGI,还有一个 Web 应用,可以用它计算定约桥牌中同花色分牌的条件概率。周末还剩一天,接下来,我该干点什么?

我就想,“这个程序不错,但只支持意大利语,其它语种的人可能对它也有兴趣。我应该做个支持英语、法语的多语版本,反正,这两种语言我也很擅长。”

做多语版本需要模板系统,但我没找到满意的 Python 模板系统。我试过 Gofer 等工具,但都不合我意。最后,我干脆自己写了一个模板系统,叫“Yet Another Python Template Utility (YAPTU)”,即,“另一个 Python 模板工具”。周日,这个工具就可以顺利运行了。然后,我把它打包上传到一个发布自由软件的地方,这样我就有了自己的网站。

Yet Another Python Template Utility (YAPTU)

Driscoll:有人对您的作品感兴趣吗?

Martelli:YAPTU 当时确实吸引了一个人注意,他正为加州大学伯克利分校开发计算机科学专业网站。他觉得 YAPTU 是最好用的模板工具,并打算用 Python 开发网站,他还对 YAPTU 做了一些优化,并给我发了补丁文件。我们一起讨论怎么能把 YAPTU 做得更好,后来还成了朋友。

Alex Martelli:‘我们一起讨论怎么能把 YAPTU 做得更好,后来还成了朋友。他就是 Peter Norvig,现在是谷歌研究主管。’

他就是 Peter Norvig,现在是谷歌研究主管,也是畅销编程书《人工智能:一种现代手段》的作者。由此可见,Python 从那时起就帮我搭建了非常好的人脉。

人工智能:一种现代手段

我还尝试在工作中推广 Python,可惜没有成功。决策权在专业管理人员手里,他们认为就算我们现在用的程序都是面向 Unix 工作站的,但未来属于 Windows,其它操作系统都将不复存在。的确,如今已经很难买到 Unix 工作站了。到处都是使用 Linux 或 Windows 的 PC。从这点上看,他们的预判非常正确。

我不愿意只使用微软乐意支持的编程语言,但高层管理人员也不会同意用其它编程语言。我只能在他们注意不到的地方偷偷用 Python,比如测试框架,一个叫做 haha.bat 的 Shell 脚本文件。

这是 Windows 推出 cmd 之前的事情了。Python 脚本非常有用,且易于维护,只有一点让人不太满意。上班时,我只能用微软的 Fortran 编译器处理漏洞,然后挤出可怜的时间使用 Python。

Driscoll:咱们稍微换个话题,您是怎么成为 Python 图书作者的呢?

Martelli:我非常喜欢 Python,Guido van Rossum、 Python 开发者及社区里的每一位伙伴,他们给了我如此美妙的礼物,我希望有所回报。

我能做什么呢?当时有个叫 comp.lang.python 的 Usenet 小组,很多人都在这里问问题。我比较擅长帮别人解决技术问题,虽然,我只是 Python 新手,但仍开始尝试回答别人的问题。只要看到自认能有效解决的问题,我就会回答,很快就有了不错的成绩!

Alex Martelli:‘我比较擅长帮别人解决技术问题。’

几个月后,Python 社区的一位高人给我起了个外号,马爹利机器人(Martelli Bot)。众所周知,我是 Python 社区里第三个“机器人”,只有回答了超级多的问题,而且基本上都正确,才会被人称为机器人。给我起外号的这位大神就是 Steve Holden,我很荣幸告诉大家,他是我的新书《Python in a Nutshell》第三版的合著者。

Python in a Nutshell

总之,这让我在 Python 社区里声名鹊起,也给了我联系 O'Reilly 出版社的勇气,我看到他们在为《Python in a Nutshell》这本书找作者,于是我问他们,“能不能让我尝试一下,或者找个经验更丰富的人一起写?”

他们说,“你还要找人合作?发个样章和大纲给我们吧。” 我就这样成了 Python 图书作者。

Alex Martelli:‘我问他们,“能不能让我尝试一下,或者找个经验更丰富的人一起写?”’

Driscoll:您为什么会写《Python Cookbook》?

Martelli:合著《Python Cookbook》一书时,我走了一点弯路,之前计划中的一位作者放弃了。这本书很有意思,所有的解决方案都来自社区,只是为了切实有效地解决问题,才进行了改写。

Python Cookbook

我还在 ActiveState 网站上贡献了很多解决方案,并且乐此不疲!ActiveState 有点类似现在的 Stack Overflow。Stack Overflow 对特定主题技术的问题与答案处理的非常到位。我也这个网站的活跃用户:Python 标签下的发帖排行榜上,我排名第二,我还是首页荣誉榜的前 0.001%。

多说一句,Stack Overflow 的首席数据科学家发表过一个研究报告,介绍编程语言的流行度,该报告称,随着时间推移,基于 Stack Overflow 上的标签与问题,流行度增长最快的编程语言就是 Python。

Alex Martelli:‘这项研究表明,2019 年初,Python 将会成为最流行的编程语言。’

这项研究表明,2019 年初,Python 将会成为最流行的编程语言。现在,Python 仅次于 Java 与 JavaScript,但是它已经超过了其它所有编程语言。Perl 消失了,Ruby 也消失了,C# 排名下滑极快。只有 Java 与JavaScript 还算坚挺,但是它们的变化幅度不大,只有 Python 突飞猛进。

Alex Martelli:‘只有 Java 与JavaScript 还算坚挺,但是它们的变化幅度不大,只有 Python 突飞猛进。’

Python 的基数已经非常大了,但仍能实现跨年增长 27%。年初(2017年),我看过《Spectrum》杂志一篇文章,宣称 Python 是今年最流行的编程语言。

Spectrum

该文章基于一些主观指标,比如岗位需求、课程、与研讨会等,而 Stack Overflow 的调研则是量化的、客观的,它的结论来自于超出想象的巨量数据。虽然,两者都得出了同样的结论,不过 Stack Overflow 得出结论的量化手段更好、更精准。

Driscoll:能介绍下作为 Python 图书作者有什么收获吗?

Martelli:首先,你可能会觉得自己对一门语言了解的已经非常透彻了,但写书以后就会发现,这一认知十有八九是错误的。

运气好的话,可能会有一位有耐心、意志坚定的编辑与你一起合作,他的职责是了解这门语言,搞明白图书应该怎样排版印刷、读者如何从书中获取知识。

英语是我的第三语言,我从来没觉得自己的英语水平有多高。但写作增进了我对英语,特别是书面英语的理解。

Alex Martelli:‘这就是我们为什么要用编程语言:因为自然语言有歧义,虽然强大,但却难懂。’

自然语言是一种强大、内容丰富、却难于理解的沟通工具,这就是我们为什么要用编程语言:因为自然语言有歧义,虽然强大,但却难懂。想用自然语言极其精准地描述事物是不可能的。

Driscoll:您能举个例子吗?

Martelli:我曾在邮件列表看到过一个小故事,讲的是自动化与计算系统的风险。这是一个用于在市区调度救护车而设计的形式化定义系统(Formally-Defined System),显然,这是一项性命攸关的任务。

用自然语言最初写就的内容,也是其中一个限制条件是,不论何时,急救热线接到中风等急症电话后,救护车应该在 15 分钟之内(即,这些病症的最佳急救时间之内)赶到病发现场。

将这一自然语言正确转化为编程语言后,大部分情况都有所改进,但却出现了已经安排了救护车,可是救护车一直没有到达病发现场的个案,这种情况虽然很少,但实在是让人忧心。这就是自然语言未能与形式逻辑(Formal Logic)相匹配的问题。

Alex Martelli:‘这就是自然语言未能与形式逻辑(Formal Logic)相匹配的问题。’

要知道,这是市区,交通堵塞。救护车虽然可以鸣笛开路,但仍会被堵在路上。如果出现延误,哪怕是 15 分多 0.01 秒,系统也会推断救护车已经到达,这是因为之前假设的前提是救护车总会在 15 分钟内到达。所以如果假定救护车已经抵达了,系统就无需让该车继续前往,进而重新调度该救护车。

自然语言里,我们说必须在 15 分钟以内,并不是说一定在 15 分钟内,而是最好在 15 分钟内。要表达的意思是,在此时间内到达至关重要,需要尽一切努力实现,确保救护车在此时限内到达。但这并不意味着,如果 15 分钟没有到,就不需要救护车了,也不代表 15 分钟多 1 秒已经没用了。虽然,这个结果不理想,但总比没有强!

Alex Martelli:‘在编程语言里,断言(assertion)更简单:说一就是一。’

这只是自然语言引起歧义的一个小例子。在编程语言里,断言(assertion)更简单:说一就是一。如果说一不是一,就会触发异常。自然语言则不同,很多时候你会免不了想当然,这包括各种常识,还有同一词语在不同文化背景中的不同涵义。

Driscoll:能介绍下您与读者的互动中最有意思的事情吗?

Martelli: 这种例子很多!我可以介绍一些工作中遇到的乐子,总有同事问我,“我碰到一个特别奇怪的问题……” 这通常是他们刚写的程序或函数。

我会帮他们找出问题,并进行修复。不是说我对 Python 的了解比他们更深,而是我擅长 找茬儿。比如说,给我一篇有错别字的文章,不知道为什么,在阅读任何内容之前,我一眼就能看出错别字。这对编程与电路设计而言,非常有好处。

以前,老有人问我,“我一直想问,你是写那本书的 Alex Martelli 吗?” 我总是很高兴地回答,“是啊,就是我,那本书是我顺手写的。” 这让我一天都很开心。

Alex Martelli:‘除了搞定问题,我也有虚荣心。’

现在,这种事没以前那么多了,我在这个公司已经待了 12 年半了。我的意思是,虽然这种事儿没什么实际意义,但是,嘿嘿!除了帮别人搞定问题,我也有虚荣心。

Driscoll:您觉得 Python 2.7 已经要被淘汰了吗?

Martelli:《Python in a Nutshell》第三版里提出过这个问题。书里曾经说过 Python 2.7 离被淘汰还远着呢,我现在仍然认为这是对的。

现在,生产环境中仍有大量的 Python 2.7 或 2.x 代码,并且这些 2.x 代码可以轻轻松松地就升级到 Python 2.7。大家都知道 Python 2.7 就到此为止了,虽然,我笃定有不少企业会提供商业化支持,但到 2020 年, Python 软件基金会将停止对 Python 2.x 的官方支持。所以,我们的书里对 Python 3、3.5、3.6 及未来新版的支持,就显得格外重要。

Alex Martelli:‘Python 2.7 离被淘汰还远着呢。’

现在就抛弃 Python 2.7 还为时过早,所以我们的书里包括了 Python 2.x 与 3.x 的内容。如果读者只想了解其中一版的话,可能会觉得该书有些冗余,不过,我们会在下一版解决这个问题,到时某些内容将只支持 Python 3,不再支持 Python 2.7。

Python 2.7 的代码库非常庞大,仍有很多公司与产品还会滞留在 Python 2.7。比如, YouTube 总的来说就是一个用 Python 开发的系统,有几百万行超级优化过的 2.7 版代码,说实在的,从商业角度上看,这种切换太难了。要知道 YouTube 已经对这些代码优化 10 多年了,不可能上来就说,来吧,咱们重写下这几百万行代码。

如果切换到 Python 3 会把 YouTube 的速度减少 10%,这不仅要量化谷歌的成本,还要量化所有用户的成本,YouTube 的流量太大了,要考量性能降低对互联网带宽的占用会增加多少。哪怕性能只降低 10%,都会让所有人的感受变得很糟。这是不能容忍的!这条路走不通,只能选择其他方向。

Driscoll:那么 Python 作为一门编程语言,您觉得它现在有什么问题吗?

Martelli:如果我能穿越回 Python 第一版发布之前,且只能对它做一项更改的话,我觉得是不要区别大小写。

Alex Martelli:‘最优秀的编程语言都不区分大小写。对我来说,这是最好的地方。’

自从 C 语言在编程语言领域称霸以来,大家都觉得不区分大小写很怪。但是,不管是 Fortran,还是 Pascal,甚至是 Ada,这些最优秀的编程语言都不区分大小写。对我来说,这是最好的地方。

可能很多人都没有注意到,西方文化中,大小写的概念其实不是自然出现的,而是刻意人为的,这点可能很多人都意识不到。大小写是在写作发展过程中出现的,这是我们文化里刻意制造出来的人造物。

我喜欢 Macintosh 的文件系统,比如新建一个名为大写 F-O-O(FOO)的文件,它会按大写文件名存储文件。但是,如果你用小写 foo 进行搜索,系统也会找到。这种感觉与人类思维更相似。

Alex Martelli:‘语音输入一下子就成了主流输入方式。’

比如说语音识别系统。语音输入一下子就成了主流输入方式,这是因为对着手机说话,比用屏幕上的小键盘打字要容易的多。但用语音输入的时候,区分大小写让人很头疼,这就是我为什么说大小写是刻意的人造物!自然拼读根本就不需要区分大小写。

Python 社区里希望 Python 不要区分大小写的人很少,与 Python 竞争的编程语言也都区分大小写,我估计这是当今所有流行语言共有的缺陷。

Python 的关键字也有些问题,这是 Python 与其它编程语言不同的地方,如果与其它语言一样的话,Python 将会是一门更好的编程语言。Python 最常用的关键词,即定义函数的 def。问题是 def 既不是关键词,也不是单词,它没有任何涵义!你知道哪种编程语言做的最到位吗?JavaScript。

Driscoll:JavaScript 有何不同?

Martelli:JavaScript 里用的关键词是 function。我想不明白为什么 Python 不用 function。就算 function 要多输入 4 个字符,就算这得多敲好几下键盘!但现在的编辑器不都支持自动补全了吗,是不是?

我明白,从技术上讲,def foofunction foo 没什么实际区别,但我更关注这些小小不言,却影响易用、易懂的小瑕疵。

Alex Martelli:‘Python 可能是迄今为止,最好用、最好理解的编程语言。’

我认为 Python 可能是迄今为止,最好用、最好理解的编程语言,所以这些小瑕疵在我看来就显得特别刺眼。

Python 的 range 只有一种,而且总是不包括上界,所以它的一致性更强,也更清晰。其实这里用任意单词都是一样的,比如 def,就可以在设计时使用像 function 这样更易懂的单词。

如果觉得 function 这个词太长了,我觉得 fun 也不错,这个词多有意思。不管怎么说,Python 这个名字毕竟是源于 Monty Python 这个喜剧片。用 fun 作为 function 的缩写也可以表明 Python 编程很有趣(这里的原文是 fun)。反正我觉得比 def 好。

Driscoll:那您觉得 Python 最大的优势是什么?

Martelli:在讲瑕疵的时候,我其实已经提到了。 Python 的优势在于清晰、一致性,这门语言的野心很大,就是,只用一种自然的、显性的方式做事情。

目前,Python 还未达成这一目标,举例来说,加法符合交换律,a+bb+a 是表示汇总的两种方式, Python 无法改变这点。但在阅读别人写的代码时,你依然会觉得更容易理解。

不管是 Python 老手,还是新人,都会不约而同地选择显性编程,因为 Python 往往是显性的。就算不这么做,也可以告诉他们应该怎么写,而且很容易就能说服他们。也许正是这种只用一种显性方式表达事物的野心,就是 Python 更清晰、更好用、更实用的原因吧。

Alex Martelli:‘也许正是这种只用一种显性方式表达事物的野心,就是 Python 更清晰、更好用、更实用的原因吧。’

我相信,Python 之所以能在你能想到的各个领域都得到充分应用,正是因为它的这种清晰与简洁的理念,Python 太容易上手了。

不是所有人都像我学 Python 学得那么快。我不认为是个经验丰富的程序员就能用一个周末就学会 Python,但这种事确实发生了。就算 Python 里很多功能与其它编程语言类似,比如 Rust,我不敢想象有人能用一个周末就学会 Rust。

Driscoll:您认为 Python 未来会如何发展?

Martelli:无处不在!你知道吗?近年来最伟大的科研成果是发现了引力波。

PyCon 意大利上曾有一两个主题演讲,讲的是,Python 是控制所有采集数据设备的通用语言,最终这些数据显示两个黑洞相互撞击,并发出了引力波。

Alex Martelli:‘正是 Python 在处理这些数据。’

如果我没记错的话,碰撞后几秒钟所发出的引力波产生的能量,比宇宙中其它物质发出的能量加在一起都多。这可是超大规模的数据量,而正是 Python 在处理这些数据。这意味着, Python 负责监控这个强大到匪夷所思、眨眼之间发生的瞬时事件,对它的所有测量数据进行清洗、分析,找出其相关性,并对之进行解释,这本身就已经超级了不起了。这次冲撞发生在几十亿年前,现在监测到的只是当时的引力波而已。而这只是 Python 无处不在的一个例子。

科学,正是因此而令人着迷。我和互联网巨头聊得越多,越发现这些公司使用其它编程语言开发其核心应用,只不过是因为它们的创始人只懂那些语言,但是因为并购了其它公司,它们不得不接纳 Python。

很多并购都出现在高科技领域。大多数这些公司用的都是 Python,这正是它们成功的原因。他们的效率是用其它语言的公司的两倍,甚至三倍。

Driscoll:这么说,您认为更多公司开始使用 Python?

Martelli:是的,很多大公司需要采用 Python 是因为必须接入它们并购公司的生产系统。TensorFlow 的兴起,让我觉得 Python 必然会走在机器学习与人工智能领域的前沿。

即便 TensorFlow 的内核是用高度优化的 C++ 与汇编语言开发的,但其商业逻辑应用层用的是 Python,因为没必要耗费心力重新开发,所以 TensorFlow 的核心是 Python。

Alex Martelli:‘TensorFlow 的兴起,让我觉得 Python 必然会走在机器学习与人工智能领域的前沿。’

我很难想像还有哪些领域 Python 可能会永远都无法涉足。不过,接下来探讨的这个领域是个例外:嵌入式系统。Python 对优化内存占用做的不够好。嵌入式系统则要对内存精打细算。然而,就算Python 自身解决不了,Python 的方言也能解决这个问题。

具体来说,解决物联网嵌入式设备的编程语言是一种名为 MicroPython 的 Python 方言。我听说 BBC 给在校生配备了约上百万台运行 MicroPython 的设备。

Driscoll:MicroPython 是 Python 吗?

Martelli:不完全是 Python,因为它必须为内容使用设置限制条件。

不要指望在价值两美元的设备上动态分配内存,这些设备的内存最多也就是 64K,就算多,也多不了哪儿去。但在有限条件下仍可以实现动态分配,进行编程。

过去,Python 的一些实施特性阻止了它进入某些应用领域,正是这些特性饱受诟病。据我所知,Larry Hastings 正在苦苦寻求移除全局解释锁(GIL)。不管大家怎么想,GIL 与 90% 的应用不相关,但对另外 10% 要用更多芯片内核的应用而言,GIL 非常致命。

要把算法从 32 位优化成 64 位,移除 GIL 后效果会非常显著。不过也不要着急,这些限制条件早晚会被移除的。

Alex Martelli:‘在操作系统核心领域,Python 将来涉足的内容也不会今天多多少。’

在操作系统核心领域,Python 将来涉足的内容也不会比今天多多少。如果动态分配没问题,就可以用 Python,但这只是内核的很小一部分内容。也许一些设备驱动对时间要求没那么严格,但我觉得,在绝大部分情况下,Python 只是运行在用户层面,而不是内核层面。

Driscoll:这是为什么呢?

Martelli:内核要的是更底层的语言,顺便说一下,这个领域迫切需要一种比 C 更好的语言,这就是为什么我现在在研究 Rust。

我非常想看到用 Rust 开发的实验性简版操作系统内核,Rust 有这种潜力。因为内存分配的问题,Python 就不适合做这种事情。而且 MicroPython 的方式其实运行地也不是那么好,因为还是需要一些动态分配。Python 控制内存分页十分困难,但是除了超级难搞、超级核心的领域,我觉得别的方面没有什么限制。用比上天还难来形容 Python 的极限都不贴切,因为引力波就是发生在天上的事情,Python 不也把它给征服了。

Alex Martelli:‘用比上天还难来形容 Python 的极限都不贴切,因为引力波就是发生在天上的事情,Python 不也把它给征服了。’

我觉得现在只有在移动端开发这个领域,Python 还有很长的路要走。我听说 Kivy[1] 框架不错,但还没亲自用过。

Guido 在谷歌时和 Andy Ruby 讨论过这个问题,他想说服 Andy, 他认为在 Java 之外,安卓还需要一种更易用的应用层编程语言。不过,很遗憾,Andy 不想再添加更多的语言,他觉得这样让程序员更辛苦。但事实并非如此!可惜,Andy 才是负责人,Guido 也只能是束手无策。要是我能更具说服力就好了,也许世界会大不相同。

Driscoll:在谷歌的工作怎么样?

Martelli:在这里,我得到了近 13 年前面试时想要的一切,甚至可能更多。

当然,这是我漫长、多变工作生涯的巅峰。我想要的不是大学毕业生设想的那种闪亮人生。公司运营的现实已经磨平了我的棱角,不管怎样,多闪亮的成就也会被轻松超越,我甚至不确定谷歌是否能一直独占鳌头,因为一切都取决于人。毕竟,公司是由人组成的,了不起的人聚在一起,才能造就了不起的成就。

归根结底,成功的秘诀还是得靠人才!对于已经有 7 万人的谷歌而言,这远比当年只有 70 个人时更容易。不是说找 70 个人才容易,但是找到 7 万个人才只会更难!我不敢说这些人百分百都是人才,但也差不多算是百分百了。

Alex Martelli:‘归根结底,成功的秘诀还是得靠人才!’

优秀,不只是指聪明。我打赌找聪明的人要比找到合适的人更容易,所谓合适的人,指的是,在人性层面上,能够关心最终用户、关心同事与合作伙伴的人。聪明很重要,但是一个聪明的混蛋造成的破坏远比蠢蛋大,对不对?所以,要找的首先是有心人:即,能为团队、支持者、用户的成功投入感情的人。

Driscoll:找这样的人有什么秘诀吗?

Martelli:我觉得没有!就算能博览群书、通古识今,但我依旧不认为有这种秘诀!因为,面试时假装关心比持之以恒的真关心容易多了。招聘时,免不了会看走眼。

Alex Martelli:‘你所做的任何事情都会放大,产生完全不合比例的影响力。’

从技术层面讲,公司那么大的规模自然会带来各种问题与挑战。但这也是能在工作中获取最大满足感的地方。你所做的任何事情都会放大,产生完全不合比例的影响力。

给你举个例子吧,刚才说过,我是 Stack Overflow 上的积极贡献者。现在,我的工作内容之一是为谷歌云平台提供技术支持,而这基本上都是通过 Stack Overflow 实现的。Stack Overflow 的数据显示我帮助了 5000 多万人,我都不知道他们是怎么算出来的,但我打心底里希望这是真的!这样才能对得起所有帮助过我的人。

只写书不会影响这么多人,就算一本书有好多个读者,我能帮助的人最多也就一百来万人,离五千万还远着呢。我想,这就是在谷歌工作的意义吧。

Driscoll:这有什么负面影响吗?

Martelli:当然有,要小心!任何错误都会放大无数倍!一个小失误,就有可能让一些系统瘫痪一个小时。哎,这就是有五千万受众的不便之处。但我喜欢这种超乎常人的生活。

Alex Martelli:‘授业解惑,帮人解决问题,是学习的最好方式。’

授业解惑,帮人解决问题,是学习的最好方式。你可以由外及内地了解问题,然后参与其中,不断深入。解决问题后,就会对这类问题有更深刻的理解。

Driscoll:谷歌如何使用 Python?

Martelli:这就说来话长了,可以追溯到谷歌存在之前。我强烈推荐 Steven Levy 写的《In the Plex》。为了写这本书,谷歌与谷歌人给了他极大的权限。

我从这本书里了解到,谷歌这个名字出现前,Larry Page 在斯坦福大学宿舍里想写一个爬虫,他想把整个网络抓取到本地机上,然后进行处理与实验。他想用一种新的编程语言,Java 1.0 Beta,但程序总是崩溃。Larry 向他的舍友求助,“能帮我看下吗?我没法运行这个程序。”

他的舍友看了一眼就说,“肯定不行啊!你用的是垃圾 Java!用下这个真正的编程语言吧!”

Larry 装上了 Python,写了一百行 Python 代码,世界上第一个爬虫程序就诞生了,web 的副本也被抓取到了这间宿舍的电脑上。所以,从这点上讲,没有 Python,就没有第一个爬虫,谷歌可能就不会诞生!

Alex Martelli:‘没有 Python,就没有第一个爬虫,谷歌可能就不会诞生!’

这个爬虫是谷歌最核心的程序,已经被优化了上百万次,我确信这是你能想象到的,优化力度最强的 C++ 代码。我已经好几年没有看过这个爬虫了,但它的创建过程依然历历在目。在谷歌,Python 的下一个角色是作为所有深层基础架构任务的统一语言。

Driscoll:您在当时是什么职位呢?

Martelli:我当时是基础架构的高级技术负责人。我要把所有 Bash、Perl 等强大、但难懂的编程语言,替换重写为 Python。

这是我在谷歌的第一项任务,我和我的团队与那些开发 Bash、Perl 实用工具的工程师、系统管理员整天混迹在一起。我们搞清了所有工作内容,然后用 Python 重构了所有程序,并将之产品化。从此,代码读起来简单了上百倍。

还有一个特别有意思的例子是,谷歌曾经想抢占流媒体视频市场。你可能听说过谷歌视频这个项目,谷歌想把所有的视频放在一起,展示给用户,用户可以对视频进行搜索。当时,这个项目投入了大量的资源:数百名优秀的工程师和不计其数的硬件资源。

但是谷歌视频在产品特色战中屡战屡败,被一家不起眼的初创公司甩了好几条街。每次这家初创企业推出新功能时,只要客户喜欢,我们的工程师要花一两个月跟进开发类似的功能。但我们推出新功能时,这家小公司一个礼拜就复制出来了!

Driscoll:那您找出这家创业公司反映这么快的原因了吗?

Martelli:最终,我们收购了这家创业公司,发现他们只用了 20 个开发人员,就把我们数百名开发人员的团队耍的团团转。但这里的奥妙其实非常简单!这 20 个家伙用的是 Python,我们用的是 C++。这就是 YouTube 成功的秘诀,并且他们现在还在用 Python。

Alex Martelli:‘我们发现他们只用了 20 个开发人员,就把我们数百名开发人员的团队耍的团团转。但这里的奥妙其实非常简单!这 20 个家伙用的是 Python’

YouTube 虽然用了很多年才开发成熟,才有所盈利,这是因为它用的资源太庞大了!不过,它变得越来越流行,可以说,它是最了不起的 Python 成功案例。

与其它面向用户代码的领域不同。Python 有时处于前沿地位,比如谷歌应用引擎,这是谷歌首次涉足云端服务,至今仍是极具创新的产品,Python 是它最早支持的语言。 好几年中,Python 是它唯一支持的语言,后来才添加了对 Java 的支持,然后是其他编程语言。 但 Python 仍是谷歌应用引擎上最流行的编程语言。

谷歌云平台还有很多其它功能,基于某些技术原因,要限制用户使用的编程语言,但 Python 一般都稳居前两名。TensorFlow 也是一个不错的例子,之前提到过,但这里的重点是,在很长一段时间内,TensorFlow 都是 GitHub 下载榜上最流行的项目。

谷歌应用引擎的存在使得很多内部工具受益。内部版本应用引擎上部署的工具可以优先使用 Python,设置选项几乎都是通用的,用一种方式就可以完成多种配置。在实际工作中,12 年半前加入谷歌时,我时不时还要用下 C++,尤其是修复已有系统时,但现在,用 Python 基本上都可以解决了。

Driscoll:您还有什么其它方面想讨论的吗?

Martelli:我想再讲一下 Python 在教育领域里扮演的角色。十多年前,Guido 搞过一个投资项目,希望让 Python 成为教育领域里核心语言,这个项目一直没有真正落地,但很多优秀的想法与成果都出自这个方案,只不过搞定教育界这件事没有实现。

如今,Python 是大学基础课教学里排名第一的编程语言,很久以前就已经超越了 Java 等其它语言。但在高中,Python 还没有这么普及。随着计算机重要性不断提高,大多数高中生都有必要了解一些计算机基础知识,但现在高中生用的编程语言五花八门,混在一起,十分可怕。

怎么才能让 Python 吸引更多高中生的关注?我认为应该是把 Python 放到网上,最好是用浏览器就可以运行。现在有几个网站提供这种功能,但这些网站的规模和一致性都不好。

我认为 Python 软件基金会应该大力推动这些项目。为什么呢?因为 Chromebook 如今在教育领域里遥遥领先。现在,Chromebook 在学校里卖的比其它所有设备加起来还多。为什么?因为它便宜啊,性能没问题,安全也有保障,管理员控制起来也方便。

Alex Martelli:‘我认为 Python 无需改变,但要为学校提供一个非常好用的网站,这是必须的基础工作。’

Chromebook 提供了非常好的网络浏览器,基于这个浏览器,可以干很多事情,这比下载安装软件容易多了。

我认为 Python 无需改变,但要为学校提供一个非常好用的网站,这是必须的基础工作,要提供学校所需的功能,比如,管理员控制。做好这件事将改变数百万初高中在校生的人生。我渴盼有人能用 Python 做些真正有意义的项目。

Driscoll:谢谢您,Alex Martelli。


  1. 支持包括 iOS、 安卓等平台在内的 Python 跨平台开发框架。 ↩

你可能感兴趣的:(Python大咖谈 - Alex Martelli)