计算机科学的先驱,也是“第一位”图灵奖得主艾伦·J·佩利斯(Alan J. Perlis)通过《编程箴言》(Epigrams on Programming)这一短小精悍的格言集,展现了对编程的深刻洞察。
佩利斯以主张编程语言不仅仅是工具,而是影响思维方式和问题解决方法而闻名。
1982年,艾伦·佩利斯撰写了《编程箴言》这篇散文,这些箴言不仅让人发笑,还让程序员们深思。
本文是对Alan Perlis话语的翻译。
*个人认为,平均来说,越秃头的人越有可能成为编程大师。或许是因为秃头有助于脑部过热控制?这需要从进化的角度进行严肃探讨。可惜我不是秃头,所以似乎很难成为编程大师。
1. 对某些人来说是常量,对另一些人来说却是变量。
2. 函数延迟绑定,数据结构促使绑定。
- 教训:在编程后期设计数据结构。
3. 语法糖(Syntactic Sugar)会导致分号癌(Semicolon Cancer)。
- (注释:**语法糖** 是指让代码更简洁、更易读的功能,但如果滥用可能会损害可读性。)
4. 每个程序都是更大程序的一部分,很少有程序能独立完美运行。
5. 如果程序需要处理大量数据,请务必以最少的方式处理。
6. 对称性(Symmetry)是一个减少复杂性的概念。(例如:协程包含子例程。)
- 尽可能保持对称性。
7. 理解一个正确的程序比编写一个错误的程序更难。
8. 当编程语言需要关注不必要的细节时,它就是一种低级语言。
9. 适用于10个数据结构的10个函数,不如适用于单个数据结构的100个函数。
10. 尽早标准化:同样的任务应以相同的方式完成。积累惯用语并制定标准。
- 你与莎士比亚的区别不在于词汇量,而在于可用惯用语的数量。
11. 如果一个函数有10个参数,那么很可能遗漏了一些参数。
12. 递归是计算的本质,是一种用解释力交换执行时间的方法。
13. 如果两个人编写了完全相同的程序,当将其转换为微码时,它们几乎不可能完全相同。
14. 长期来看,所有程序最终都会变得像洛可可风格(华丽且复杂的设计),然后逐渐沦为废墟。
15. 所有东西都应该自顶向下构建,但第一次例外。
16. 每个程序至少有两个目的:一个是原本的目的,另一个是未预期但被使用的用途。
17. 当你解释一个程序时,如果听者不断点头,请叫醒他。
18. 没有循环(Loop)和结构化数据变量的程序是没有编写价值的。
19. 不会影响你对编程思维方式的语言不值得学习。
20. 存在模块化的地方就有误解的可能性。
- 信息隐藏(Information Hiding)意味着需要协调交互。
21. 优化(Optimization)会阻碍代码的演进。
22. 一个好的系统不能拥有弱命令语言(Command Language)。
23. 要完全理解一个程序,你必须既是机器又是程序。
24. 如果我们从小就开始学习编程,长大后可能会更容易阅读程序。
25. 复杂的信息只能在脑海中正确表达。
- 流动和视角的变化比静态图表更重要。
26. 每种编程语言中都存在难以表达的概念。
27. 如果你完全理解了如何编写程序,就让别人去写吧。
(圣家堂)
28. 在计算机世界中,找到衡量进展的正确时间单位是很困难的。
- 有些教堂建造需要一个世纪。也许程序也会如此漫长?
(注释:这里指的是圣家堂,至今仍未完工,预计2026年完工。)
29. 系统中的“整形手术”不是简单的添加,而是向控制图(Control Graph)添加新的循环路径。
30. 我们在编程中所做的每一件事都是更普遍概念的特例,而我们往往过早意识到这一点。
31. 简单性(Simplicity)并不是复杂性的前奏,而是解决复杂性之后的结果。
32. 程序员不应因创造力或逻辑能力受到评价,而应因其对异常情况的彻底分析能力受到评价。
33. 第十一条诫律是“你必须计算”或“你不应该计算”。我不记得是哪一个了。
34. 字符串是一种残酷的数据结构。
- 它在任何地方传递时都会导致重复,并且是隐藏信息的完美媒介。
35. 任何人都可以学会雕刻,但米开朗基罗必须学会停止雕刻。
- 伟大的程序员也是如此。
36. 使用程序证明四色定理并不会改变数学。
- 它只是表明了一个困扰了一个世纪的难题,实际上可能并不重要。
(注释:四色定理是指用四种颜色足以给地图上色,使相邻国家的颜色不重复。)
(注释2:沃尔夫冈·哈肯和肯尼斯·阿佩尔使用计算机暴力破解证明了四色定理。)
37. 最重要的计算机是我们颅骨内运转的那个。
- 一台完全标准化的计算机将是一场灾难,因此可能永远不会发生。
38. 结构化编程遵循“排除混乱法则(The Law of Excluded Chaos)”。
39. 关于可视化(Visualization):
- 一张图片值千字。
- 但仅限于可以用文字描述的部分。
- 在千字中,能用图片完全描述的内容极少。
40. 编写无错误程序的方法有两种。
- 但只有第三种方法真正有效。
41. 一些编程语言吸收变化,但阻止进步。
42. 通过一个人对Fortran的看法,可以看出他对编程的态度。
43. 在软件系统中,最先发现错误的人通常是最先解决问题的人。
44. 在计算领域,有时唯一普遍的概念是“取指-执行周期(Fetch-Execute Cycle)”。
45. 计算机科学的目标不是模仿我们的分析能力,而是模仿我们的综合能力。
46. 像双关语一样,编程也是一种文字游戏(wordplay)。
47. 借用威尔·罗杰斯(Will Rogers)的话:
“自由变量(free variable)是不存在的。”
48. 编程的最佳书籍是《爱丽丝梦游仙境》(Alice in Wonderland)。
- 因为它是任何主题对初学者来说的最佳书籍。
49. 放弃汇编语言就像在伊甸园摘苹果一样。
- 浪费机器资源的语言是一种罪恶。
- 多亏了LISP机器,LISP程序员终于可以脱下他们的无花果叶(fig-leaf)。
50. 当你完全理解基于知识的系统(Knowledge-based System)时,世界并不会因此改变。
- 只不过我们的指尖会变得更热。
(注释:基于知识的系统是将人类专家的知识嵌入计算机系统,以支持问题解决或决策的人工智能系统。)
51. 把计算机带回家不会改变家庭,也不会改变计算机。
- 但社区酒吧可能会更有活力。
52. 每个系统都有子系统,每个子系统又有其他子系统。
- 正是这种无尽的结构让我们总是不得不重新开始。
53. 很多好主意掉进了语义鸿沟(semantic gulf),再也没有出现。
54. 小心图灵焦油坑(Turing tar-pit)。
- 在那里一切皆有可能,但没有一件有趣的事情是容易的。
(注释:Tar Pit意指表面平静但深入后难以摆脱的困境,暗示编程越深入越复杂。)
55. LISP程序员知道所有事物的价值,但不知道其成本。
56. 软件始终处于紧张状态。
- 因为它是象征性的(symbolic),可以无限完善,但同时也可以无限变化。
57. 将程序与规范(specification)匹配比将规范与程序匹配更容易。
58. 愚蠢的人忽视复杂性。
- 实用主义者忍受复杂性。
- 有些人可以避免复杂性。
- 天才则消除复杂性。
59. 在英语中,每个词都可以是动词。
- 如果我们的编程语言也能做到这一点,那该多好啊!
60. 达纳·斯科特(Dana Scott)是“格子圣徒教会(Church of the Lattice-Way Saints)”的教主。
- (注释:Dana Scott是形式语义学的大师,“Church”指的是lambda演算的创始人Alonzo Church。)
61. 在编程中,犯错意味着重生。
62. 在计算中,不变性(Invariant)只是一瞬间。
63. 我们声称创造了“学习型程序”,但实际上学习的是我们,而不是它们。
64. 有时手段可以正当化目的。
- 目标是推动技术进步,即使目标崩溃,技术仍然存活。
65. 计算机本质上处理数字。
- 我们只能理解并控制那些可以转化为数字的活动。
66. 将某物变成变量很容易。
- 让变量在一段时间内保持恒定才是真正的挑战。
67. 无数的精神能量浪费在寻找“算法”和“程序”之间的差异上。
68. 如果你相信数据结构,就必须相信并行(并发)处理。
- 因为数据结构化的目的是为了共同存储和同时处理。
- 那么,为什么我们还能容忍只提供单一处理方式的语言呢?
69. 每五年就会出现一种卓越的编程语言。
- 只是我们无法控制这个周期。
70. 几个世纪以来,印第安人(原住民)用手势语言(sign language)传达他们的兴趣。
- 程序员是否也应该根据部落(FORTRAN、LISP、ALGOL、SNOBOL等)创造自己的手势语言?
71. 文档就像人寿保险。
- 订阅者满意,但几乎没有人真正依赖它的福利。
72. 完美的引导(bootstrap)是不存在的。
73. 决定语言变化速度的不是弱点,而是优点。
- 遗憾的是,语言永远无法脱离胚胎囊(embryonic sac)。
74. 软件可以与其他任何东西不同。
- 也许软件的存在就是为了被淘汰。
- 就像肥皂泡一样,它可能会以全新的形式重生。
75. 计算机领域总是渴望新的陈词滥调(cliché)。
- 因为陈词滥调能让我们的神经安定下来。
76. 设置过程参数的应该是用户,而不是程序员。
77. 人类、计算机和算法之间的互动就像抢椅子游戏。
- 经过绝望的挣扎以达到平衡后,最终总会有一个处于不稳定状态。
78. 如果你的计算机使用英语,那么它很可能是日本制造的。
79. 投资人工智能(AI)一年的人可能会相信上帝。
80. 长时间与计算机相处后,数学家会变成文书工作的管理员,而管理员会变成数学家。
81. 在计算中,将“显而易见的东西”转化为“有用的东西”的过程就是“挫败感(frustration)”的定义。
82. 我们正站在伟大发现的门槛上。今天,我们的程序证明了费马的“第二难定理”!
83. 图灵机与现代计算机的区别是什么?
- 这就像希拉里(Hillary)攀登珠穆朗玛峰,与在山顶建造希尔顿酒店的区别。
84. 研究所的座右铭:
- “我们今天研究的东西,其他人明天才会第一次想到。”
85. 中国人可能喜欢APL,但最终赚钱的是FORTRAN。
(注释:这里的“中国人”是指东方人擅长数学的刻板印象。尽管APL技术上更先进,但工业选择了FORTRAN。)
86. 我们误以为可以在“主动数据库系统(active database system)”中随意减少或缩小过程与数据的比例。
87. 我们创造了迷你(mini)计算机和微型(micro)计算机。
- 那么皮可(pico)计算机属于哪个语义利基(niche)?
88. 单靠麦克斯韦方程组(Maxwell's equations)无法设计电动机。
- 这不是计算机的错。
89. 使用手算计算器并不等于学习计算机。
- 但你可能会忘记算术。
90. 计算让树木开花。
(注释:这里的“计算”是指整个计算机科学,隐喻计算机科学开启了新的可能性和创造力。)
91. 计算机像Lon Chaney(好莱坞演员)一样。
- 它是一台拥有数千张面孔的机器。
92. 计算机是终极污染源。
- 我们无法区分它排放的东西和生产的东西。
93. 如果有人说:“我想要一种只需说出需求就能编程的语言。”
- 给他一根棒棒糖。
(注释:这种不切实际的梦想像是孩子才会做的梦,但作者的意思是不想听废话,给他糖果堵住嘴。)
94. 接口保持整洁,但不会加速增长。
- 加速增长的是函数(function)。
95. 如果你有好主意,也要准备好承担责任。
96. 计算机带来的不是秩序,而是机会。
97. 如果一位教授断言:“计算机科学X是对的,但Y是错的。”
- 对他的研究生表示同情吧。
98. 在计算中,故障前的平均时间(MTTF)正在缩短。
99. 在人机共生(man-machine symbiosis)中,需要调整的是人类。
- 机器无法自我调整。
100. 只要还有一个程序存在,我们的编程就不会结束。
101. 应对失败很简单。
- 努力改进即可。
- 应对成功也很简单。
- 你只是解决了错误的问题。
- 努力改进即可。
102. 从非正式到正式的过程,
- 无法通过正式方法实现。
103. 纯粹应用型(purely applicative)语言不适合应用。
104. 一个系统有价值的证据是它存在的事实。
105. 我们无法传递复杂性,只能感知它的存在。
106. 从字符串(string)中提取意义是困难的。
- 但这是我们唯一可以信任的沟通手段。
107. 争论仍在继续:
- PL/I是双峰骆驼(Bactrian Camel)还是单峰骆驼(Dromedary Camel)?
(注释:这是将PL/I编程语言的争论比喻为骆驼,讨论PL/I是简单语言还是复杂语言。)
108. 当两个程序员相遇并开始批评彼此的程序时,
- 两人都会沉默。
109. 想一想!
- 通过VLSI(超大规模集成电路)技术,
- 我们可以在1平方厘米内放入100个ENIAC!
110. 编辑(editing)最终是重写(rewording)的行为。
111. 罗马帝国为什么会灭亡?
- “办公自动化(office automation)”的拉丁语怎么说?
112. 计算机科学因“计算机”这一存在而感到困惑。
113. 连接神经科学和心理学的唯一建设性理论将来自软件研究。
114. 计算机中的“自然语言(natural language)”从来都不自然。
115. 大多数人直觉上理解编程的概念,但却认为自己无法实际编程。
116. 学习时以为自己懂了,
- 能用时更加确信,
- 能教时更加确信,
- 但只有能编程时才能确定。
117. 现代教育反对教孩子们编程。
- 因为计划、组织思维、关注细节以及培养自我批判态度有什么乐趣呢?
118. 如果你能想象一个计算机机器人成为唯一仆人的社会,那么你可以想象任何事情。
119. 编程本质上是一种不自然的行为。
120. 将现有程序适配到新机器的大部分努力,最终会让新机器像旧机器一样运作。
121. 当追求不可达的目标时,简单性成为障碍。
- 如果有箴言(epigram),必然也有元箴言(meta-epigram)。
122. 箴言是洞察力和理解力流动的接口。
123. 箴言将“光环(aura)”参数化。
124. 箴言是“宏(macro)”。
- 因为它在阅读的瞬间被执行。
125. 箴言将矛盾结晶化(crystallize)。
126. 箴言从纯程序数据库中提取深刻的意义。
127. 箴言忽略细节,直击核心。
- 它是一份出色的高级文档。
128. 箴言更像是维生素而不是蛋白质。
129. 箴言具有极低的熵(entropy)。
130. 最后的箴言?
- “箴言既不能吃,也不能喝,更不能吸入。”
现在读者也学会了如何用有趣的方式谈论编程。
以后写作时,不妨用这些箴言为文章增添香料。