[翻译]on the role of scientific thought


原文

本质上, 这篇文章没什么新东西, 相反地, 它的论题太老, 以至于似乎被遗忘了.
写这个是为了消除我在我所处的计算机专业领域中, 由计算机科学家, 程序员, 计算机用户,
计算机设计者, 甚至教育政策方面的同行所产生的的一些误解.
我现在决定要写这么篇文章, 是因为我意识到我对些误解的对抗已经成为了规律的重复事件.

对于科学性思维(scientific thought)的错误认知是否只在计算领域(computing community)中存在,
还是说在别的领域下也是如此, 这不是由我来做出论断的. 有一点可以确定的是:
在计算领域本身我们可以找到足够的历史上的解释, 因此我们不需要考虑外部影响就可以了解这个现象的成因.
(这并不是说外部影响不存在!)

正如我们马上会认识到的, 在”科学性思维”中”科学”这个词更多的指的的是思考的方式(way)
而不是思考的内容(what): 用拉丁语来说: 它代表”quo modo”而不是”quod”.
这部分地解释了为何由其他领域的先驱者引入的科学性思维在计算机领域中是如此的局限.
早期成为计算机学者都已经在其他科学性的领域受到过训练, 并且其中很多人对于在自己原本的
领域中进行科学性思维是十分擅长的. 但是对于其中的很大一部分, 这是他们仅有的于科学性思维的面对
(confrontation with scientific thought).
因此, 不难理解他们只将他们自己对于科学性思维的积累, 只同自己在所磨练过的特定领域联系起来,
而不是作为一种通用(general)的思维方式应用到他们的新的活跃领域中(应该如此!).
此外, 他们中许多人必定感受到了, 科学性思维在更严谨的学科中是一个可以享受得到的奢侈,
但在他们当前所处的知识的荒原中缺并非如此. 但是, 正如我们即将看到的, 科学性思维并非是
一个只在成熟学科中才可能的奢侈品, 相反的: 它正是使得这些学科成熟的工具!

除了来自其他学术领域的移民, 计算机领域吸引了来自全世界的人们: 商人, 管理员,
操作员, 音乐家, 画家, 未定型的年轻人, 一大群完全没有科学背景的人们. 通过他们的人数, 已经
形成了一个对现象的解释.

为了引入主题, 我将要从我最近写给我专业上的朋友们的信中引用两段.

“让我告诉你, 对我来说所有智力思考的共有特性是什么. 即, 一个人要系统地深入研究一门课题,
必须分离地去研究它, 在任何时间都记住他只能关注其中一个方面. 比如说, 我们知道一个程序必须
是正确的, 因此我们可以只抓这个点来研究; 我们同时也清楚它应当是高效率的, 我们可以改天
来研究它的效率, 等等. 我们也可以问我们自己, 程序是否是可取的(desirable), 如果是, 为什么.
相反的, 同时应对数个方面将什么也无法得到! 这就是我有时提到的”the separation of
concerns(关注点分离)
“, 这个技巧就算不是完美可行的, 也依然是我所知的有效组织一个人的思维
的唯一可用技巧. 这是就是我说的”将一个人的注意力集中在几个方面上”. 这并不是说忽略其他的
方面, 只是表明, 从这个方面的来看, 其他方面是无关紧要的这一事实. 这即是同时拥有单任务和多任务
思维(It is being one- and multiple-track minded simultaneously).

“我还记得我和Ria刚订婚时一起散步–那是在Amsterdam的中央车站附近–我告诉她,
我希望睁着眼睛得到幸福, 不以我们活在一个粉色的世界这种愚弄自己: 幸福, 并且活在对
所有苦痛的了解之上, 包括我们自己的…”

“I remember walking with Ria when we were enageged – it was near Amsterdam’s
Central Station– when I explained to her that I wanted to be glad and happy
with my eyes fully open, without fooling myselft in the belied that we lived
in a pink world: to be happy to be alive in the full knowledge of all misery,
our own included….” (End of quotation.)

科学性思维由上面描述的”智性思维(intelligent thinking)”构成. 一个科学学科
的诞生伴随着 –通常是十分缓慢的!– 哪个方面可以被有意义地 “为了它自身的一致性被抽离
地研究”, 换句话说: 伴随着对于有用(useful and helpful)的感念的发现.
科学性思维也由有意识地对有用的概念的探索构成.

从上面可以看出我是出于对科学性思维的实际价值才讨论这个主题, 我希望表达我对一个
工具的由衷欣赏. 前面我提到”有效组织一个人的思维”时并不是笔误, 我要说的就是我们
思维过程的效率. 我强调这个由衷的欣赏, 是因为我生活在一个因为带着道德, 感情, 宗教,
有时甚至是政治暗示去谈论所谓的 “学术品德” (sic!) 时造成了大量的混淆的文化中.
这些暗示仅仅让事情变得迷惑. (如果你愿意, 你可以在此观察到科学性思维的实际应用:
比如说, 我并不否认政治因素, 如果我那么做了才是个傻瓜! 反智主义对于技术专家的反对在如今
是如此时髦, 是出于对 –很大程度上无端的– 对于知道如何思考的人的力量的恐惧,
以及 –更合理的– 出于对于错误的认为自己知道如何去思考的人的行为. 然而, 这些政治考虑,
对于如何有效组织一个人的思维这一技术问题并没有任何帮助, 而这就是我像要讨论的问题
“分离化, 为了其自身的一致性”.)

我打算向你描述几个最常见的一般计算机科学家无法分离关注点的例子; 通过这样做我希望
并且相信我的专业上的同事将会将此作为对于帮助他们的一种努力, 而不是冒犯他们. 为了照顾
到非专业人士, 我先提出更少技术性的例子.

分离过程中最经常被忽略的一个关注点, “一般接受度的”关注点. (在纯数学界 –我有
一些来往– 这个问题似乎几乎不存在.) 关注点本身是非常合理的. 如果没人阅读一个想要表达自己的
诗人的诗, 那么这个诗人就是失败的, 至少作为一个想要表达自己的的诗人而言. 同样的,
许多计算机科学家并不解决问题, 而是研发工具: 理论, 技巧, 算法, 软件系统和编程语言.
而如果那些 –他们认为– 本能够从他们的设计中获益的人, 则更倾向于忽略这些发明而沿用他们自己的,
旧的, 腐朽的方法, 那么作者就会感到挫败. 有吗? 既有也没有. 它们可以应用伽利略的态度:
“没有什么事会因为一万个人相信就变成真理, 也不会因为一万个人拒绝相信就成为伪命题.”,
并且决定从此以后一直带着悲壮的孤立认为自己超越了其他的计算机科学家同事
(and can decide to feel themselves, in splendid
isolation, superior to their fellow computer scientists for the rest of their
lives.). 我不反对不受赞赏的发明者这样的行为(I can deny no inventor who
feels underappreciated, such a course of action). 我也不推荐这样做, 因为自身的
正确性而产生的无意义的愉悦感通常会在长达一生的尺度下发霉. 如果一个人的目的是要设计有用
的东西, 那么他就应当避免设计出一些因为不被使用而无用的东西: 换句话说, 我完全同意”一般
接受度”是一个合理的关注点. 然而我们必须同意暂时忽略这个关注点 –可能是数天, 或者数年,
取决于我们所做的事情– 因为不这样做将会使我们动弹不得.

前一段时间我访问了一个大型研究实验室的计算机中心, 那里他们正等待一批根本上不同架构
计算机设备的到来, 我的同事认为如果要将潜在的并发能力开发到可以接受的程度, 将会需要一个新的编程
语言. 但是它们从来没有开始对于语言的设计, 因为他们认为他们的产品应当和FORTRAN相似到普通
用户不会注意到任何区别, “不然用户是不会接受它的”. 他们不知道要向用户说明什么, 所以规避了向
用户说明如何让新设备发挥最大的作用. 那是个十分让人失望的拜访….

更适宜的方式是, 明确地推迟对普遍接受度的关注, 直到你已经得到一个质量值得接受的结果.
你的信息的重要性应当使得你对其呈现方式的关注成为可行, 也许是它的”不同寻常”使其需要额外的
心思. 并且, 什么是”一般”? Albet Einstein有因为相对论对于普通高中生太难而失败吗?

另一个通常倍忽略的关注点在于一个软件系统的正确性和可取性(desirability)之间.
过去几年我向各种听众演讲了能够辅助我们设计程序的技巧, 使得我们能够提前证明程序满足它们的需求.
由此提出的其中的一个普遍反对是:”你所展示的技术在展示用的小的数学上例子上表现很好, 但是恐怕
它们不适用于问题更难的业务数据处理, 因为在那里, 你必须面临着不完美的, 有歧义的需求.”
从逻辑的角度来看, 这个反对是没有意义的: 如果你的需求是矛盾的, 那么就简单了, 没有哪个程序
能够满足这样的需求. 如果你的需求是歧义的, 那么歧义越大, 需求就更容易被满足 (如果需求是完全
歧义的, 那么任何程序都能满足它).

虽然这么说, 但这很少能然提出反对的人满意. 当然, 他的意思是不一样的. 他的意思是下面
这样: “我们希望做出满足我们需求的东西, 并且也完全理解我们自己的需求. 但是当我们的产品
投入实际中时, 却并没有让人满意地运作. 那么我们要如何知道, 我们究竟是正确地做出了错误的
东西, 还是说生产中出现了愚蠢的bug?”. 关键在于, 只要需求没有定义系统应该做什么,
这个问题就没有意义. 这就像瘟疫法官来处理一起商业争端, 却没有一个合同来阐明双方的权利和义务.
这正是需求描述在系统构造者和系统用户之间的充当的角色. “做出一个满足我们需求的东西”这个任务
被分成了两个部分, “阐述一个能够满足我们需求的事物的属性”以及”制造一个满足对应属性的事物”.
业务数据处理系统已经足够复杂到要应用这样的关注点分离了, 而另一半的计算领域(computing world)
所说的”科学性思维是一个不可应用的奢侈品”就本末倒置了: 他们所在的混乱正是太多的非科学性思维所致.

但是从上面的来看, 请不要决断非科学性思维只在业务世界(business world)存在. 在计算机科学,
一个最常见的困惑之一就是在于一个程序和它的执行之间, 以及一个编程语言和它的实现之间.
我一直觉得这很神奇: 有一整个单词表来做出区别, 况且, 在于计算机和其序号代码之间的混淆是
相当罕见的. 但却是长久以来的深深的混淆. 其中一个最早例子是由LISP 1.5 手册给出的:
在他们描述编程语言LISP的中途, 作者放弃了, 转而通过描绘同样不完全的具体实现来补充他们不
完全的语言定义. 毋庸多说, 我没法从那本手册来学习LISP! 如果这样的混淆只存在于旧手册中,
我就不会这么担心了. 但是, 可惜的是, 这样的混淆依然常见. 在1973的一个
internatinal summer school, 一个非常著名的计算机科学教授做出了”ALGOL 60是一个非常
没有效率的语言”的论断, 而他真正的意思是, 用他先有的设备, 他和他的共事者无法给出一个高
效率的ALGOL 60实现. (这是他的真正意思, 却不打算这么说出来!) 另一个相当有名的计算机
科学教授反复公开表示, 证明一个用高级语言便携的程序的正确性是没有意义的 “因为, 你怎么知道
它的编译器没有错?”. 在最近的一个研究的促使下, “公理语意法(the axiomatic semantics
approach”的能力受到质疑, 因为它可能会导致演绎系统”因为无法准确反应实际的程序执行而不可取”.
这听上去就像是质疑Paeno对于自然数的公理化, 因为人们在计算加法的时候会犯错!

一方面我们有着物理设备(实现), 另一方面我们有形式系统(编程语言). 这可能是个人喜好问题 –但
我不这么认为– 这两者那个给予优先级, 即, 究竟是形式系统给予物理设备的准确描述, 还是物理设备
给出形式系统的精确模型 –我倾向于后者–. 但是不管怎样, 我们都不应该混淆两者!

我对于我的偏好 –我这么认为– 有很好的理由, 因为如果我不能因为一个形式系统的一致性而认可
它, 而是必须将它看做是一个物理设备的描述, 我就不能处理没有被实现的编程语言! (而这正是一个
语言设计者必须做的事.)

这一混淆可能用经常说的一个观点来表述最合适”你不能使用一个没有被实现的编程语言”. 但是不对,
你当然可以! 你可以使用任何完整定义(well-defined)的编程语言, 不管有没有被实现, 来编写
程序; 只是当你想要使用这些程序来进行计算的时候, 你才需要一个实现. 被完整定义(well-defined),
而不是被实现, 才是一个编程语言的最关键的特性.

上面的论断不是玩笑, 也不是双关语, 相反的: 它们与上百万美元的错误(milti-million-dollar
mistakes)相关. 它们表明, 例如开发项目 –被错误地称为”研究项目”的– 旨在生产”自然语言编程
系统”是在追着自己的尾巴跑.

注意 (我本不想添上的, 这简直是对我的读者的一个侮辱, whom its inclusion accuses of
possible superficiality). 我并是说, 在考虑一个编程语言的时候, 不应该关心它的实现:
你正该如此! 但是同时对于这个关注点, 不论多严肃, 都应该分离出来.

在开篇我还提到了教育政治(educational politics)的同僚. 事实上, 写这篇文章, 也是由最近
的一项对于两个大学等级的计算机科学课程的研究促进的.
它们来自大西洋不同的两岸, 却在两个方面惊人地相似: 惊人的细致预算和对于什么构成一个科学学科
完全没有认知.

一个科学学科将人类知识分出一个部分: 我们必须要这么做, 因为, 同能够被人所知的知识相比,
我们有着非常非常小的脑袋. 这同时也将人类能力分出一个部分; 同样的, 我们必须这么做, 因为
要维持我们重要的技能需要每天锻炼, 并且锻炼一整天, 很遗憾的, 一天只有24小时. (这解释了,
我们为什么总是这么忙)

A scientific discipline separates a fraction of human knowledge from the rest:
we have to do so, because compared with what could be known, we have very,
very small heads. It also separateds a fraction of the human abilities from the
rest; again, we have to do so, because the maintenance of our non-trivial
abilities requires that are exercised daily dand a day –regretfully enough–
has only 24 hours. (This explains, why the capable are always busy.)

但是当然的, 任何对知识的随便的诡异组合, 以及随意的一组能力, 即便有足够的量, 也不能构成一个
科学学科: 要是得分离有意义, 我们还有一个内部和一个外部约束. 内部约束在于连贯性: 知识必须
支持能力, 能力必须使得我们改进知识. 外部约束在于我通常所说的 “一个薄的接口(a thin interface)”;
一个智力子宇宙越是自支持(self-supporting), 一个参与者所需要的其它领域的知识就越少, 也就越
有可能成功. 用计算机学家的术语来说, 我可能应该叫我们的科学学科为”我们文化的自然智性模块(the
natural intellectual modules of our culture)”. (当外行问起什么是”模块化”时, 将世界上
的知识组织的方式, 大概是最简洁的回答.)

从上面的观点来看, 为什么早先对于在我们学校组织计算机科学课程的努力都令人沮丧的
失败了的原因, 就变得十分明显了. 它们只是鸡尾酒! 因为缺少其他原料, 他们试图将几个
似乎和计算机有关的领域中, 最具多样性的几个结合到其中. 这些鸡尾酒的原料并没有构成
一个连贯的整体, 这不奇怪; 这鸡尾酒尝起来也不好, 这也不奇怪.

在以前, 唯一的替代方案就是等待, 比如1969年由Strachey提出的”我很确信计算机(computing)
将会成为一个非常重要的科学. 当时现在我们处于一个十分原始的发展状态; 我们还不知道基本的
原则, 并且我们必须先了解它们. 如果大学将它们的事件花费在教授the state of the art, 他们
将不会发现这些原则, 而那正是学术要做的.” 我不能同意更多.

现在, 当然, 你可以争论是否5年后我们这些计算机科学家还有足够的价值来被”分离研究, 为了自身的
一致性”. 我认为现在我们足够开始了, 但如果你觉得Strachey的建议在现在仍然实现, 我对你表示支持.

然而, 我提到的两个课程请求, 给出的是旧事的鸡尾酒, 仿佛什么都没有改变. 而且, 不是作为一个小心
的第一步, 而是作为最终目标…. 并且当科学家们不再清楚科学应该是关于什么的时候, 我们就出于
不好的状态. 因此有这篇文章.

1974.8.30
prof.dr.Edsger W.Dijkstra
Burroughs Research Fellow