flomo双周刊|Vol.6:温和的函数,有力的约束
记录,不仅是为了对抗遗忘,更是为了在未来的某一天,能与过去的自己重逢。当下的每一次书写,都是寄给未来的一张路标。
人们会被自己热爱的事物改变,而没有人因为给予而贫穷。
持续不断记录,意义自然浮现。
Donald Knuth
简介
美国计算机科学家,算法分析之父
1938年:出生于美国密尔沃基,父亲是德裔喜欢演奏风琴,在自家地下室经营一个小印刷厂;
1951年:13岁参加 Ziegler's Giant Bar 比赛,谎称胃疼请假两周,拼出 4,500 个单词,远超裁判的 2,500 个;
1956年:18岁高中毕业,同时在纠结读音乐还是物理,最终入读凯斯理工学院攻读物理;
1959年:21岁创办并主编《Engineering and Science Review》获全国最佳技术杂志奖,转修数学;
1960年:22岁进入加州理工学院读博,二年级为公司写编译器,赚得5,000美元;
1963年:25岁获加州理工数学博士学位,并留校任教;
1966年:28岁决定编纂一部七卷本系统地介绍计算机程序设计的巨著《计算机程序设计艺术》;
1968年:30岁出版《计算机程序设计艺术》第一卷,拒绝美国国安局邀约;
1969年:31岁正式加入斯坦福,专注算法分析,确立“算法分析之父”地位;
1974年:36岁获得了图灵奖;
1977年:39岁访问中国,姚期智的夫人储枫为他取了一个中文名字“高德纳”,同年开始开发 TeX 科技排版系统;
1990年:52岁,斯坦福授予“程序设计艺术教授” (Professor of The Art of Computer Programming)独特职称;
2025年:87岁不使用电邮,专注深度思考,《计算机程序设计艺术》第 5 卷将于年内完成;
Knuth 家中定制的管风琴,他的兴趣:音乐 → 物理 → 数学 → 计算机 → 排版印刷
写给人类的程序
我是做什么的?
1967 年,Knuth 参加学术会议,有人问他是做什么的。
当时计算机科学还没有真正的自我认同。学科被粗略地划分为三个方向:做计算的、做智能的、做编程语言的。
Knuth 回答不出来。后来他决定,再有人问起时,他会说:我研究算法。
他甚至提出过一个更根本的建议:与其叫“计算机科学”,不如叫“算法学”(algorithmics)。
Knuth 认为人与人之间最好的沟通方式是通过故事。
在那个时代,大量计算机论文质量低劣,甚至本质上是错的。
Knuth 的直觉是:我们正身处一个全新的领域,但这个故事被讲得太糟了。
他想做的事很简单:把一个讲得很糟的故事讲清楚。
于是,他动笔编写《计算机程序设计艺术》,一套七卷本的系统巨著,用来讲清楚程序设计的本质。
向人类解释我们希望计算机做什么?
他在编写出版《计算机程序设计艺术》时,出版商放弃了旧的出版技术,转而支持照相排版。
他对照相排版法达到前几卷的质量感到非常沮丧,于是花时间研究了数字排版,亲手开发 TeX。
但更大的转变还在后面,在设计排版系统的过程中,他突然意识到:
我们写程序,是不是太关注“让机器能跑”,而忽略了“让人能懂”?
与其想象我们的主要任务是告诉计算机该做什么,不如让我们专注于向人类解释我们希望计算机做什么。
这个转念,改变了他的写作方式。他提出一个新概念:文学编程(Literate Programming)。
文学编程
写程序时,不妨问自己:如果这段代码是你未来十年后要阅读的,你现在会怎么写给自己看?
Knuth 认为,传统的编程方式过于关注“让计算机执行”,而忽视了“让人理解”。
这导致程序难以维护、难以合作、更难复用。
现在他想推动下一步进化,写“有文学性的程序”,即“Literate Programming”。
写给人看的代码,是另一种写作。
程序 = 文档 + 代码
写程序 = 写一篇程序说明文档 + 逐步插入代码块。
写程序的人像一个散文作家,要讲清楚“要做什么”和“为什么这么做”。
编写顺序是“心理顺序”
不是按照语言语法的顺序写,而是按照人类理解的顺序来写。
他强调写作顺序要符合人类的思维逻辑,不是语言的语法要求。
比如:先解释程序的大致计划、变量含义,再分段插入每一步实现的代码。
支持“上而下”(Top-Down)或“下而上”(Bottom-Up),甚至混合写法 —— 只要更容易讲清楚。
段落式结构:一个思想 + 一段解释 + 一段代码
每个程序“块”是一个小节(Section),都有标题、文字讲解、再加代码。
每段代码都围绕一个明确的“动机”或“概念”展开。
写模块时为每段代码写一句“为什么这段代码存在”,哪怕一句注释。
名字就是文档:用“可读的名称”组织程序
不像传统函数那样用
do_X()、main()命名,他用人类语言命名代码段这些名字也是结构标题,自动出现在目录和索引中
把函数/注释/文档块命名为有意义的短句
模块不是“先写好”,而是逐步展开
一个代码块可以在多个地方逐渐补全(+≡ 的语法),表达“我还会继续补充这部分”。
这样他可以写得更像一篇“讲解+实现”的过程文章,而不是必须自顶向下展开。
Knuth 所谓“文学编程”,不是搞浪漫,也不是故作风雅,而是回到一个基本问题:
你写下的东西,别人能不能理解?未来的你还能不能读懂?
这背后的信念是:程序不仅是一堆命令,更是一个人思考的痕迹。
写得清楚,才能看见自己的思路;
表达得明白,才更知道自己在干什么。
参考
#新知:每个人都会成长。我们分享新学到的知识与实践,和你一起成为更好的自己。
在 Donald Knuth 的主页上,有两个问答合集:
FAQ(常见问题)和 IAQ(Infrequently Asked Questions,极少被问的问题)。
IAQ 是一份更复杂、更沉思的清单,里面的问题,大多连他自己也没答案。
在 IAQ 中,Knuth 特别提到被问的问题:
在世界接连崩坏的当下,计算机科学还有意义吗?我们是否该彻底改写自己的人生路径?
Knuth 的回答,像是一次低语式的思辨:
当然,我对此也没有满意的答案。但每一个人,都应该认真思考这个问题。
我们都知道那些“大问题”极其复杂,目前也没有所谓的“解”。
历史上许多我敬佩的成就,都是在危机中诞生的。
但今天的危机更难:破坏门槛更低,系统性灾难甚至可以由个人引发。
有时我甚至怀疑,SETI 始终找不到外星文明,是不是因为——文明根本难以长久存在。
计算机科学家确实掌握一些关键能力,但我们仍在集体走错方向。
我看到有同行开始转向应对全球问题,但那是在学术圈,风险很低。
现实是:对多数人来说,哪怕只是调整一下日常工作,都会牵动收入、生活乃至尊严。
所以我认为,我们的任务之一,应该是设计出一种机制,
让人们能在不被摧毁的前提下,调整自己的生活方式。
或许我们能建模日常行为的演变,找到一条能在灾难爆发前启动的、温和而有效的变革路径。
我有一个点子,纯粹是作为“思想实验”:
假设全世界所有人,工资都被强制变成“工资的对数”(或平方根)。生活成本也同步以同样的方式压缩。
(函数可以只要是“单调函数”就行。这样人们依然有因努力而获得更多的动力,但不会大得那么离谱。)
我并不穷,但比尔·盖茨的财富是我的 10,000 倍以上。
他确实比我聪明,也更高效,但真有那么多吗?
这个“工资取对数”的设想,表面上是玩笑,实则是一个对现实奖惩机制的深刻质疑。
Knuth 并不是真的要推行某种政策。他在借数学的语言,重构我们习以为常的价值曲线。
用数学压缩差距:
假设每个人的工资都被“压缩”为其对数(或平方根)值,这样,高收入者依然比低收入者多,但差距被大幅缩小。
假设你年薪 $30,000,log(30,000) ≈ 4.48
Bill Gates 年薪 $300,000,000,log(3亿) ≈ 8.48
差距从 10,000倍 → 只有4倍。
依然能“多劳多得”,但避免“努力=爆炸性收益”这种极端激励。
Knuth 想表达的
奖励应有度,努力 ≠ 爆炸性收益
努力值得被奖励,但回报机制不该无限放大。
他质疑的不是个体差异,而是:一个人真的“值一万个别人”吗?
应考虑一种更温和递增的收益机制(如单调函数压缩差距),让“多劳多得”仍然成立,但不至于极端悬殊。
指数回报不是自然法则,而是社会设计
当前资本主义的默认设定是:越聪明、越有效率、越有资本,就该拿到越多,且是指数级的“越多”。
Knuth 并不否认这种趋势的部分合理性,但他提醒我们:回报曲线的斜率,其实可以设计。
“合理不均”优于“极端差距”
他不是在鼓吹平均主义,而是在探索一种“压缩但不抹平”的可能。
让努力可见,差距存在,但不会摧毁人。
Knuth 的这个思想实验,是典型的计算机科学家思维:
把社会系统当作函数建模,压缩输入,看输出是否仍符合“人类合理”的感知。
在极简的函数里,藏着一个深远的社会追问:
如果我们用对数函数来定义价值衡量,世界会不会没那么疯?
参考:
#心力:本板块是周刊编辑阅读感悟到的打动人心反抗偏见的部分,会以第一视角叙述以便能更加沉浸代入中。
编辑:本板块是周刊编辑阅读感悟到的打动人心反抗偏见的部分,会以第一视角叙述以便能更加沉浸代入中。
我曾和朋友坐在湖边,看一只毛毛虫慢悠悠地从一根草荡到另一根,反反复复,好像只是为了开心。
一旦我们试图解释这种行为,便开始怀疑:
它是不是在练习?
是不是有某种生存上的意义?
我们太习惯用功利和算计的眼光去看待生命,
以至于很难承认:玩耍,也许本身就够好了。
科学很少认真研究动物的游戏,因为那种“无用”的快乐,无法被归入任何功能列表。
但如果你观察得足够久,会发现:从蝾螈到海豚,从蚂蚁到松鼠,世界上到处都是在为了好玩而行动的生命。
为什么它们会玩?为什么不呢?
俄国学者克鲁泡特金早就说过:生命的意义,在于享受自身的力量。
奔跑、跳跃、飞翔,不是为了什么,而是因为可以。
这也许才是自由最早的形状。
我们不是在某个瞬间突然拥有了“意识”,而是一直在玩,一直在成为。
哪怕是龙虾,科学家也发现它会出于好奇玩弄物体。
如果连龙虾也不是冷冰冰的机器,那我们呢?
也许,自然不是为了效率而存在,而是为了探索、舞蹈、追逐、歌唱。
也许,意识不是演化的副产品,而是游戏继续玩下去的方式。
庄子与惠子游于濠梁之上。
庄子曰:“儵鱼出游从容,是鱼之乐也。”
惠子曰:“子非鱼,安知鱼之乐?”
庄子曰:“子非我,安知我不知鱼之乐?”
惠子曰:“我非子,固不知之矣;子固非鱼也,子之不知鱼之乐,全矣。”
庄子曰:“请循其本。子曰‘汝安知鱼之乐’云者,既已知吾知之而问我,我知之濠上也。”
我们理解鱼的快乐,因为我们也会为了无用之事而快乐。
玩耍不是奢侈,它是生命本来的节奏。
参考:
#Q&A:一个问题,往往能引发一连串的思考。我们邀请 flomo 用户共同回答在记录与成长路上的困惑。愿你在别人的回答中,更清晰自己心中的答案。
#Question:到底该记录什么,又有什么是不该记录的呢?
人有三种生存的模式:占有(to have)、存在(to be)和成为(to becoming),笔记也是如此。
你好👋,我是夏彼得。下面是我关于这个问题的回答,希望对你有所启发。
美国有一个社会心理学家,他叫弗罗姆,他写了一本书,叫《占有还是存在》。
大概意思是说人类有两种生存的模式,一种是占有,一种是存在。后来北大汇丰商学院的刘澜老师,他进一步扩展成,人有三种生存的模式:占有(to have)、存在(to be) 和成为(to becoming) 。
那我们也可以这么说,记笔记有三种方式:
占有型笔记
以收集和占有为目的的一种笔记形式。比如说去摘录书里面的一些观点、故事、金句等等。这个我们传统的读书记笔记形式,行为的本质是为了收集和占有。
存在型笔记
比如说去记录一天的生活,包括我们的学习、我们的情绪、我们的感受、我们的生活经历等等,从这里面去感受自己的状态,这就是存在型的记笔记。
成为型笔记
成为是一个动词,它关系到我们想成为一个什么样的人。这种笔记就是要去记录我们的热情、兴趣,我们所做的尝试、行动、反思等等。
笔记什么该记什么不该记,跟每个人的目的相关。每个人在每个时期至少有一种主导型。
我的目的可能是成为自己想成为的那个人,更多地采用成为型的笔记方式,也会有一部分存在型的,而占有型的比例就比较少了。
我个人倾向于把 80% 甚至更多的精力放在成为型和存在型笔记上,20% 或者更少的精力放在占有型笔记上面。
封面图片:Codex Madrid II, f.23r Leonardo da Vinci15th-16th Century
本文由 flomo 周刊编辑部编撰。
欢迎大家转发和评论,或默默点赞,让我们知道这期信号有被收到。
祝好,下期见。
往期周刊: