共计 3874 个字符,预计需要花费 10 分钟才能阅读完成。
Dijkstra 的全名叫 Edsger Wybe Dijkstra(艾兹赫尔·韦伯·戴克斯特拉)。大部分中国程序员如果能记住这个名字是因为学过计算最短路径的「Dijkstra 算法」,然而大部分人都难以记住正确的拼写,因为他是荷兰人,名字不符合英语的发音规则。
他是几位影响力最大的计算科学的奠基人之一,也是少数同时从工程和理论的角度塑造这个新学科的人。他 的根本性贡献覆盖了很多领域,包括:编译器、操作系统、分布式系统、程序设计、编程语言、程序验证、软件工程、图论等等。他的很多论文为后人开拓了整个新 的研究领域。我们现在熟悉的一些标准概念,比如互斥、死锁、信号量等,都是 Dijkstra 发明和定义的。1994 年时有人对约 1000 名计算机科学家进行了问卷调查,选出了 38 篇这个领域最有影响力的论文,其中有五篇是 Dijkstra 写的。
Dijkstra 在鹿特丹长大。在高中毕业前他想在法学界发展,并且希望将来能在联合国做荷兰的代表。然而因为他毕业时数学、物理、化学、生物都是满分,老师和父母都劝他 选择科学的道路,后来他选择学习理论物理。在大学期间,世界上最早的电子计算机出现了,他父亲让他到剑桥大学参加一个程序设计的课程。从这里开始,他的程 序设计生涯开始了。一段时间以后他决定转向计算机程序设计,因为他认为相对于理论物理,程序设计对智力是更大的挑战。程序设计是最无情的,每一个一和零都容不得差错。
后来他在阿姆斯特丹的数学中心成为了一个兼职的程序员。他的工作是为一些正在被设计制造的计算机编写程序,也就是说他要用纸和笔把程序写出来,验证 它们的正确性,和负责硬件的同事确认需要的指令是可以被实现的,并写出计算机的规范说明。他为并不存在的机器写了五年程序,因此他很习惯于不测试自己写的 程序,因为无法测试。这意味着他必须通过推理说服自己程序是正确的,这种习惯可能是他后来经常强调通过程序结构保证正确性易于推理的原因。他曾经被后来出 现的实时中断困扰了一阵子,因为中断随时可能发生,让证明程序的正确性变得复杂了很多。他的博士论文就是关于一个他写的实时中断处理程序。
在他决定成为一个程序员后,他尽快完成了学业,因为以他的话说,他在大学里不再受欢迎了:物理学家们觉得他是逃兵,而数学家们也看不起他和他做的事,因为在当时的数学文化里,你的课题必须和 ∞ 有关才会受尊重。那个时候程序设计没有成为一个职业,没有人能说出这个行业的基础知识体系是什么,而这些都会被 Dijkstra 改变。1957 年,他结婚的时候在申请的职业一栏写上了「程序员」,结果被政府拒绝,因为当时荷兰没有这个职业。
在一台新的叫 ARMAC 的计算机发布之前,Dijkstra 需要想出一个可以让不懂数学的媒体和公众理解的问题,以便向他们展示。有一天他和未婚妻在阿姆斯特丹购物,他们停下来在一家咖啡店的阳台上喝咖啡休息,他 开始思考这个问题。他觉得可以让计算机演示如何计算荷兰两个城市间的最短路径,这样问题和答案都容易被人理解。于是他在 20 分钟内想出了高效计算最短路径的方法。Dijkstra 自己也没有想到这个 20 分钟的发明会成为他最著名的成就之一,并且会被以他的名字命名为 Djikstra 算法。三年以后这个算法才首次发布,但当时的数学家们都不认为这能成为一个数学问题:两点之间的路径数量是有限的,其中必然有一条最短的,这算什么问题 呢?在之后的几十年里,直到今天,这个算法被广泛应用在各个行业。Djikstra 的眼科医生一直不知道他是做什么的,有一天突然问他:「是你发明了 GPS 导航的算法吗?」。一问之下,原来他读了 2000 年 11 月的科学美国人杂志,讲 GPS 的文章里说到了 Djikstra。
求解最短路径的 Dijkstra 算法
尽管计算机软件技术有很大一部分是 Dijkstra 发明的,但他却很少使用计算机,或许这和他作为程序员时很大一部分时间是在为还没造出来的计算机开发程序有关系。后来在德州大学的同事压力下他购买了一台 Macintosh 电脑,但只用来回复电子邮件和浏览网页。和 Donald Knuth、Leslie Lamport 这样关注于论文的数字排版并发明了 TeX 和 LaTeX 来做这件事的计算机科学家不一样,Dijkstra 从不用计算机写论文。他 认为应该不需要草稿和编辑就能写出一篇文章,所以他通常在脑中把整篇文章构思好才把文字落到纸上。在早期他用打字机,后来他一直只使 用 Montblanc 的 Meisterstück 钢笔。这在计算机学界是很有名的习惯,很多人都收到过 Dijkstra 用 Montblanc 写的信。Montblanc 应该请他做代言。
Dijkstra 通常会用钢笔写好一篇文章,然后复印一些在同事中小范围散发,而这些同事又会复印更多,发布到更广的范围。他一生中写了 1300 多篇文章,他用自己姓名的首字母 EWD 给他们编号:EWD 1, EWD 2, … EWD 1318。在计算机科学中,这些文章被统称为「EWD 报告」。他的算法和文章大都让人感受到简洁、经济、优雅。他对简洁的热爱来自于早年母亲的指导。他曾经问他的母亲数学是不是一个很难的学科,她回答说「如果你需要超过五行文字来证明什么,那你的方向多半错了」。
最后,作为结语,送给大家一句 EWD 1213 里的名言:
如果十年以后,你以快而脏的方式做什么事的时候,能想象我在你的肩后看着,然后对自己说:「Dijkstra 不会希望这样的。」那么对我来说,这就和永生一样了。
— Edsger Wybe Dijkstra