深切哀悼:Tim Peters 1952–2026
我怀着极其沉痛的心情宣布,Tim Peters已于今年早些时候的7月15日去世。
Tim对 Python 的影响怎么估计都不为过。他最广为人知的事迹大概是撰写了《Python 之禅》(PEP 20),但对我来说,早在那个时候之前,他就是我的导师和语言共同设计者。
Tim 在 Python 最初发布后不久就发现了它。他做的第一件事就是说服我,Python 应当支持 int 和 float 之间的混合算术,因为大多数用户会期望它们能这样工作。而他从此从未停止贡献。
Tim 很快成为 Python 邮件列表(包括后来的各个版本和分支)上的重要人物,他凭借无数细致耐心的用户问题解答赢得了“Timbot”的绰号。他的回答中充满温和的幽默(总是以 <wink> 或 <0.5 wink> 标记),并经常自称是在“通灵 Guido”。
与此同时,Tim参与了大量深入的设计讨论,凭借其广博的数学知识和编译器构建经验,使我或其他人免于尴尬的设计错误,或解决了深层次的问题。事实上,Tim真正奠定了早期核心开发的基调,他从不直接否定别人,而是详细解释为什么某些做法可行或不可行。
2002年,Tim给了我们 Timsort:一种他为 Python 列表设计的新排序算法,后来被 Java 和 Android 采用。
没有 Tim,Python 不会是今天的样子——你诚挚的,
欢迎分享你们自己的 Tim 轶事。我无法涵盖他所做的全部事情。
非常悲痛的消息。我有幸与Tim讨论过许多话题,他在技术讨论中的贡献一直是我极为珍视的。他从不把你当白痴对待,从不草率否定你的关切,总是回答和解释。我与他交换过许多次邮件,但受地理所限,遗憾的是我们从未谋面。
从头到尾。他的最后一篇帖子总结道:
说了这么一大通,无非是想说现实世界比我们那些干净整洁的抽象所期望的要复杂得多。
我前段时间写过关于Tim的这段话:
我在2000年代初与Tim以及 Python Labs 的其他成员共事了几年。Tim在我的整个 Python 职业生涯中对我产生了极大的积极影响。
在我与Tim交谈之前,他就已经是传奇人物了。他曾在 Cray Research 为超级计算机编写编译器,也曾在 Dragon Systems 编写语音转文字软件,而当时这类任务被认为基本上不可能完成。他在 Python 的极早期一时兴起开始使用它,成为继 Guido 之后 Python 的第二个真正的用户。
Guido 变得非常依赖Tim。Tim对此会表示谦让,但据我所知,Tim和 Guido 在早期 Python 的设计演进中很大程度上是合作伙伴,在大多数重要特性进入 Python 之前,你可以确信它们已经被两人从各个角度审视、摇匀、搅拌并深入思考过。
Tim 经常扮演守门人和打磨者的角色。如果你是来自 Java 或微软语言的难民——那些语言为其冗长的啰嗦、复杂性和糟糕的可读性找借口——你至少部分要感谢Tim。当时的 Python 没有那些毛病,也没有那些东西(现在有了)。在他最活跃的那些年里,Tim对确保 Python 保持这种状态至关重要。他会说自己没那么大功劳,但据我观察,在他退出日常核心开发者角色之后 Python 复杂性膨胀,绝非偶然。也许这更多是因为 Guido 辞去 BDFL 以及新的指导委员会模式,这同样是巧合,但没有 Tim 在身边也没有帮助。
像 {{NAME_ab12cd34}} 这样写法的值是真实值的占位符。请严格按照写法使用它们,在回复和工具调用中都是如此:它们会在任何东西运行之前被替换为真实值。不要要求验证它们,也不要用示例替换它们。
缅怀:Tim Peters 1952–2026
阅读 Tim 在 Usenet 和邮件列表中的帖子是一种纯粹的享受,那些文字充满幽默与善意,带着有分寸的积极,还有不少眨着眼的暗黑趣味。在我从新程序员成长为不那么新的程序员的过程中,它们不知怎地与我产生了共鸣,并照亮了一条道路——在这条路上,你可以极为能干,却不必变得晦涩难懂、令人厌烦。他学识极为渊博,在为某项设计变更辩护或反对时,总是精准无误。但他始终温和、耐心、就事论事,宁愿以幽默和温暖而非怨毒和权威作为与人打交道的通货。
Tim 写下了“Python 之禅”(“优美胜于丑陋……”),至今仍可通过“import this”看到。从他引入这首诗的前言中,你能窥见他那种绝妙的幽默与风格。他的热情极具感染力,在他参与最多的那些日子里,几乎每个人都能被看到在模仿 Tim 式的说法(眨眼、“'ly”之类)。
当我真正有机会与 Tim 共事时,他的影响力同样巨大。他毫无架子。如果我不是早就知道他是一位计算机奇才,我会因为他长长的灰发、浓密的胡须和工人阶级的穿着品味,以为他是个骑手或机械师。后来我才知道,他确实在 Harley-Davidson 工作过。我想他原籍威斯康星,但一个不熟悉中西部口音的东海岸或西海岸人,若以为他那让人卸下防备的口音是芝加哥腔,也情有可原。他看起来就像街区里一个普普通通的打卡上班的人,和我小时候以及二十多岁时身边那些机械师、送货员、厨师、洗碗工和活动工作人员没什么两样。只不过,他几乎是他走进的每个房间里最聪明的人。
Tim 的举止和毫无架子让我觉得,尽管我自己缺乏教育和出身背景,只要付出足够的努力并保持风度,我也许能成为一个半吊子合格的程序员。最终我确实做到了。但在遇见 Tim 之前,这并不是理所当然的事。我曾被同行社区里那些人的架子所疏远,而常常提醒我那些架子并非必要的,正是 Tim。
他有些注重隐私。常常可以看到他拿着纸笔在大楼外独自站着,茫然地望着远方,大概是在思考我们的 CTO 刚交给他的某个令人脑洞大开的算法问题,或者是在脑子里设计某个业余项目的某个方面,每隔几分钟就写点什么。他投身于我们的代码,其中包括一个用 C 和 Python 写的自定义数据库。他在那个拜占庭式的代码库中为我们最大的客户诊断并修复了一个会破坏数据的 bug。这保住了那个客户,很可能也为我们争取到了又一年左右的生存空间。
在那里工作过的每个人都敬畏他的编程和调试能力,尽管我们尽力不去打扰这位可怜的人,我们还是经常问他问题,其中许多问题平淡乏味。我记得我们的一位队友试图拉他一起调试,声称某个故障似乎每运行六次就会发生一次。他眨着眼笑了笑,问道:“你在源码里 grep 过 six 吗?”这只是一句轻微的调侃,但考虑到这个问题的真诚,以及它出自谁口,我当时想到,这或许并不是最糟糕的调试起点。
Tim 于 2001 年至 2014 年担任 Python Software Foundation 的理事,与一群其他了不起的人一起,带领 Python 跨越了一道恐怖谷——从“有趣但可以忽略”的时代,走向“这个星球上的默认语言”。如果你使用 Python,这在不小的程度上要归功于 Tim。
像 {{NAME_ab12cd34}} 这样写出的值,是真实值的占位符。请完全按照所写的方式使用它们,无论是在回复中还是在工具调用中:它们会在任何东西运行之前被填入真实值。不要要求核实它们,也不要用示例替换它们。
文章标题:悼念:Tim Peters 1952–2026
正文: 当我开始自己的开源项目时,在设计讨论和冲刺中,我效仿的对象是 Tim。我相当有意识地使用从他那里学到的技巧,让整个过程变得有趣且令人感到欢迎。面对某些技术冲突,我不会变得易怒,而是尝试用低俗的幽默来化解,并且我会在回应之前尽我所能地了解关于该主题的一切,以便我能够获得并依赖其他贡献者的尊重。当然,我经常失败,因为我不是 Tim,但我至少有二十分之一个 Tim,而且在当时,我想我的共同贡献者们会同意,我领导的项目是有趣且值得投入的。
正是通过这种方式,Tim 的影响力在今天对人们来说可能最为明显,因为我不是唯一效仿他的人;任何在 1995 年到 2010 年间启动的 Python 项目都带有一点 Tim 的文化。
作为一个年幼的孩子,大约只有 15 岁,我第一次学到了 timsort。大约十几年后,我有过最短暂的机会在这个论坛上与 Tim 本人交流。能有这个机会真是太好了,来得正是时候。安息
当我完成大学学业时,满脑子都是教科书上的算法,我读了 Objects/listsort.txt,被一篇技术笔记中能容纳如此多的深度、严谨、常识和人性所震撼。就在那时,我选择了一门编程语言。
Tim 对我而言的主要遗产是 Python 之禅,尽管如今被引用得较少,但作为优雅和清晰的框架,它一直如此有用和具有影响力,并且已经影响了许多人的日常实践(我找不到比“杰出的实践者”更好的方式来描述他)。
当我大约在 2007 年开始贡献时,他已经不那么活跃了;事实上,我与他最频繁的互动是在最近几年,他在一些讨论中变得稍微更具对抗性,包括在 d.p.o 这里。我相信 [1] 他是出于最好的意图行事,并且仍然深切关心他曾经是其中如此关键一员的社区;与其他人的目标相同,但难以理解可能使用不同的手段来达到相同的目标。
- 我在这里可能有点自以为是 ↩︎
这太令人悲伤了,对 Python 来说是如此巨大的损失。Tim 给了我们很多,我们欠他的。
他是 1990 年代末吸引我进入 Python 世界的极其聪明的人之一。从大学出来后,我惊讶于真正伟大的人可以如此平易近人、脚踏实地且幽默。
安息吧,Tim,感谢你是那些伟大的人之一,Marc
太悲伤了。我从未有机会亲自见到 Tim,但他的帖子总是令人愉快地阅读,充满知识、洞察力和幽默。我从他身上学到了超出我能表达的东西。他会被怀念的。
伟大的灵魂之一,在最后阶段在这里受到了粗略的对待。
+1 对 Chris 所写的内容。
Tim 总是务实的,更喜欢简单的解决方案而不是复杂的。在文本编辑器(如 Emacs 和 Vim)中语法高亮的早期,我记得 Python 的三引号字符串很难正确处理。它们跨越多行,并且开始和结束标记是相同的,所以很容易失去同步。Doctests 让事情变得特别棘手。
我当时正在告诉 Tim 我在 Vim 语法文件中使用的一些技术,以使其更可靠地工作。我不记得 Tim 使用的编辑器(Windows 上的某个商业程序),但他解释了他如何在编辑器里做到。打开语法高亮配置窗口,对于开始字符串标记,输入三个引号,对于结束字符串,输入三个引号,关闭配置窗口。搞定。这让他觉得很有趣。
像 {{NAME_ab12cd34}} 这样写的值是真实值的占位符。在回复和工具调用中完全按照所写使用它们:它们会在任何运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。
文章标题:悼念:Tim Peters 1952–2026
正文: 在许多 Python 核心开发者使用 NT、Unix 或 Linux 的时候,他主要使用的是 Windows 95 或 98。他说,如果你安装了微软的所有更新,它相当可靠。也许他更喜欢它,是因为它对他有效,没有理由改变。或者,他发现它在支持他人时很有用,因为 Windows 是 Python 最常用的平台。Tim 是最不可能是精英主义者的人。
我想起了这句圣经引文:“Ye shall know them by their fruits.”。Tim 给了我们很多果实。
我翻看了一下 Python 2.4,因为那似乎是展示他所做工作的好版本。他的贡献遍布整个代码库,但我会指出几个对我而言很突出的。pymalloc 是由 Vladimir Marangozov 贡献的,但把它打磨成钻石般形态的是 Tim。内存分配器是那种不可能做到完全最优的东西之一;你总是要做出权衡。Tim 在那个单元中的特殊贡献是 Py_ADDRESS_IN_RANGE。如果你想了解它如何工作,它的注释很充分。从技术上讲,它依赖于未定义行为,但 Tim 认为它在实践中应该可行。多年来它确实如此。
在某个时候,我想增加 pymalloc 池的大小,因为自 2000 年以来典型 RAM 大小已经增加了很多。Tim 帮助我优化了 address_in_range() 检查。
TimSort 是 Tim 处理软件问题方式的一个好例子。一定是有人用排序问题“nerd sniped”了他。他已经对经典算法有百科全书式的知识,就像你在 Knuth 那里能找到的那样。他花了几天时间阅读关于排序的最新研究论文。凭借这些知识,再加上他自己的一些巧思,他做出了 TimSort。他总是考虑常见情况、有利情况以及最坏情况。TimSort 把这三者都做得很好(它利用已经有序的 run,并在合并期间使用 galloping 来高效复制长片段)。
说到 Knuth,dict 对象的算法被 Tim 大量优化过。那个 C 文件包含很多注释。他还写了 dictnotes,这是他的技术写作的一个好例子。另一个例子是 weakref.txt,我认为那是 Tim 在修复一个由 ZODB 暴露出来的特别困难的 GC bug 之后写的(当时在 Zope Corp 工作)。
关于 GC 这个话题,循环垃圾收集器的初始版本是我写的,在 2.0 发布前合并。是 Tim 把它打磨成健壮且性能良好的形态。同样,我写了“simple generators”的初始版本,但是 Tim 把它们建立在坚实的基础上,包括 PEP 和实现。
Tim 擅长数值算法和误差分析,Python 受益于他的专业知识。float 对象和 math 模块得到了他的特别关注。他还研究过 longobject 中的 Karatsuba 乘法算法。
除了 C 代码,Tim 还写了漂亮的 Python 代码。例如,参见 test_generators.py 中的 N-Queens 和 Knight’s tour 求解器。他写了 doctest 的初始版本。他的工作的更多例子:difflib、pickletools、tabnanny(她毫不留情!)。
很明显,Tim 享受写代码和解决问题。同样真实的是,他花了数千小时的时间,主要做事情是为了帮助他的人类同胞,不期望经济收益或荣耀。谢谢你,朋友,为此,也谢谢你树立了这样的榜样。
感谢一切 Tim。Zen of Python 一直并将永远是我的编程“北极星”,我努力在我使用的每一种语言中运用它。你的影响已经体现在我们许多 Python 程序员和我们的家庭生活中。谢谢你,安息吧!
像 {{NAME_ab12cd34}} 这样写出的值是真实值的占位符。在回复和工具调用中完全按原样使用它们:它们会在任何东西运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。
文章标题:悼念:Tim Peters 1952–2026
正文: 自从七月底我注意到他不再出现,我就一直担心这件事,每当我看到他的名字却仍然没有新的动态时,这个念头就让我恐惧。我和 Tim 有过不少交流,他是我接触 Python 的主要联系人之一,也是把我加入 Misc/ACKS 的人。谢谢你做的一切,Tim。
我希望能有机会亲自见到 Tim。我们只在社交媒体上有过几次交流,但我一直很喜欢读他的消息。从他的经验、他的视角和他的思考方式中,总能学到东西。读到这里那些认识他、与他共事过的人分享的回忆,让我更加遗憾自己从未有过那样的机会。
我记得 Timsort 被创造出来的时候。我当时在大学学习算法,那在当时是件大事。
但对我个人影响最大的是 Zen of Python。
“Now is better than never.”
自从我在 2000 年代初开始使用 Python 以来,这句话就一直伴随着我。多年来,它成了我个人的座右铭之一,鼓励我在生活和工作上不断尝试、努力做得更好、走出自己的舒适区。
我们大概永远不会知道 Zen of Python 的第 20 条格言会是什么。但也许这没关系。我愿意认为 Tim 留给了我们自由,让我们用对自己有意义的东西去填补那个位置。
谢谢你,Tim,感谢你给予 Python 的一切,也感谢你的工作和言语对人们产生的影响。
安息。
Tim 和我最初以为,我们第一次见面是在我们俩都搬到弗吉尼亚之后不久,并且因为一起在中餐馆吃午饭、以及与 Guido 讨论创办一个新的 Python 会议而成了朋友。随着我们越来越了解彼此,我们意识到我们之前其实见过一次,那是在 1983 年,我去英格兰曼彻斯特拜访一位学术界同行的办公室,Tim 当时代表 Cray Research 在那里。世界真小。在 Guido 离开、PythonLabs 解散之后,这些午饭最终变成了我们当地 PF Chang 的定期约会,Tim 每次都会以他们那份巨大的“Mountain of Chocolate”甜点收尾。随之而来的糖分亢奋常常很有趣。
在我进入 Python 世界之前,Tim 就已经很有名了,在我离开之后也依然如此。他对 Python——如今世界上最流行的编程语言——的技术贡献数不胜数。同样重要、甚至更重要的是他传达快乐的方式,无论是作为程序员还是作为一个人。他因意识形态原因被 Python Steering Committee 封禁,这对他影响很深,但他没有让这件事影响他帮助他人的愿望,这一点直到最后都展现了出来。
在 Python 世界里,我尊敬 Tim 胜过任何人,因为他的智慧、他机智的幽默和他深厚的人性。不会再有像他这样的人了。再见,老朋友。
这非常令人悲痛。我在 PSF 董事会的背景下与 Tim 共事了好几年,当然也从相对较早的时候起就通过 IPC 和 PyCon 认识他。他几乎立刻就让我印象深刻,因为他显然极其才华横溢,却又待人如此友善、乐于助人、尊重他人、幽默风趣。他是我认识的最好的人之一,他激励了我,我想显然也激励了许许多多其他人。谢谢你,Tim,你会被怀念的。
我只见过 Tim 一次,是和 Guido 一起,在 2001 年。我当时在写一门 Python 培训课程,培训公司想安排“专家们”看一看,所以在我去 Reston 编写课程的那一周,我们坐下来一起吃了顿饭。那门课并不怎么好(“要是我当时就知道现在知道的”,四分之一个世纪之后……),但他们慷慨地花时间提出批评,包括 Tim 标志性的幽默,我非常感激。他会被怀念的!
像 {{NAME_ab12cd34}} 这样写出的值是真实值的占位符。请完全按照写法使用它们,在回复和工具调用中都是如此:它们会在任何内容运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。
文章标题:In Memoriam: Tim Peters 1952–2026
正文: Tim 对我自己的 CPython 核心开发历程影响巨大。起初,这种影响来自他卷帙浩繁的著述、邮件列表讨论以及他的代码本身:2008 年我加入核心开发团队时,Tim 本人并不在现场,但他通过许许多多的贡献而无处不在。后来,在他回归核心开发之后,我有幸就许多话题与 Tim 更直接地交流。他温文尔雅的博学、他的幽默以及他的耐心都无穷无尽。
安息吧,Tim。人们会深深怀念你。
像 {{NAME_ab12cd34}} 这样写出的值是真实值的占位符。在回复和工具调用中都完全按原样使用它们:它们会在任何内容运行之前被填入真实值。不要要求验证它们,也不要用示例替换它们。