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 后来在采访中说,他的最短路径算法之所以能如此简洁,是因为当时在咖啡店里没有纸和笔,这强迫他在思考时避免复杂度,尽可能追求简单。在他的访谈和文章中,经常能发现一个主题,就是资源的匮乏往往最能激发创造性。Dijkstra 第一次美国之行给他留下了深刻印象。在 1963 年时他已经小有名气,ACM 邀请他参加了一次在普林斯顿的会议,这也是他第一次和 Donald Knuth 会面。第一个演讲者是一个来自 IBM 的人,Dijkstra 发现他完全听不懂这个人讲的内容,也不理解写满了整个黑板的公式,而很多其他听众都积极提出问题并参与讨论。在茶歇的时候他对其他人表达了担忧,认为自己 可能不适合参加这个会议,美国的参会者告诉他「哦,不必担心。其实大家都听不懂他说什么。但是这次会议是 IBM 赞助的,所以得让他们先上台,而且不能冷场。」Dijkstra 后来似乎一直对 IBM 不太感冒。IBM 的 System/360 大型机发布后,他花了一些时间阅读 360 的手册,他把这段时间描述为「我职业生涯中最黑暗的一周」。后来苏联决定建造和 360 完全兼容的计算机,Dijkstra 在一次会议上说「这是美国在冷战中最大的胜利」。之后 Dijkstra 进入了学术上最活跃的时期,他解决了多个图论算法问题,他发表的关于并发程序控制的论文开创了分布式计算和并发计算的领域,他也首先定义了互斥和死锁并提出了解法。他和  Jaap Zonneveld 一起写了第一个 ALGOL 60 的编译器,这是最早支持递归的编译器。他们约定项目结束前都不许刮胡子,Zonneveld 在结束后很快剃掉了胡子,而 Dijkstra 从此终身留着胡子。1960 年代后期,由于计算机变得越来越强大,程序设计和维护的方式跟不上软件复杂度的快速上升,世界进入了「软件危机」。Dijkstra 在 ACM 的月刊上发表了一篇名为 GOTO Statement Considered Harmful 的文章为全世界的程序员们指明了方向,这就是结构化程序设计运动的开始。他和 Hoare、Dahl 合著的《结构化程序设计》成为了这次软件史上第一次变革的纲领,影响了此后大部分程序设计语言,包括 70、80 后程序员熟悉的 C 和 Pascal。很多大学的第一门程序设计课就是以这本书的名字作为课程名。在分布式计算方面,除了定义前面提到的互斥、死锁等并发控制的基础概念和问题,他还开创了自稳定系统这个子领域,并且是最早对容错系统进行研究的 人。我自己的 Ph.D. 论文就属于对自稳定系统的研究。分布式计算最权威的会议是 PODC,而 Leslie Lamport 曾经评价到,PODC 之所以存在就是因为 Dijkstra。「PODC 影响力论文奖」是分布式计算领域最高的荣誉,它认可的是经过时间考验的重要成就。我自己的导师 Michael Fischer 和 Nancy Lynch、Michael Paterson 一起在 2001 年获奖。2002 年,Dijkstra 去世,这一年的 PODC 奖颁给了他,获奖论文是他 1974 年关于自稳定系统的论文。为了纪念他,PODC 决定从 2003 年把这个奖项改名为 Dijkstra 奖。所以 Dijkstra 是少数获得过以自己的名字命名的奖项的人之一。

Dijkstra 在学术界有一些很知名的个性。读过硕士或者博士的人大多对论文的应用次数、影响因子之类的东西很敏感,中国学术界尤其如此。而 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

你不知道的关于计算机大师 Dijkstra 的事情的更多相关文章

  1. 《奇思妙想:15位计算机天才及其重大发现》【PDF】下载

    <奇思妙想:15位计算机天才及其重大发现>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196328 内容简介 本书介绍了15位当代 ...

  2. 51nod-迷宫问题(Dijkstra算法)

    关于Dijkstra算法的博文 http://www.cnblogs.com/skywang12345/p/3711512.html#anchor2 Dijkstra算法是一个经典的算法——他是荷兰计 ...

  3. 计算机基础(day02)

    目录 什么是编程? 计算机的组成 CPU(大脑) 控制器 运算器 存储器 主存 外存 IO设备 input设备(输入设备) output设备(输出设备) 多核cpu 32位和64位 机械硬盘工作原理 ...

  4. Python第一讲以及计算机基础

    本周课程安排 python基础(五天) 下周课程安排 tableau图形化表制作 下下周课程安排 spss 今日内容概要 计算机发展史 计算机主要硬件 编程与编程语言 python解释器及IDE编辑器 ...

  5. 高效的两段式循环缓冲区──BipBuffer

    Simon Cooke,美国 (原作者) 北京理工大学 20981 陈罡(翻译) 写在前面的话: 循环缓冲区是一个非常常用的数据存储结构,已经被广泛地用于连续.流数据的存储和通信应用中.对于循环缓冲区 ...

  6. Java综合高级篇

    1.你用过哪些集合类? 大公司最喜欢问的Java集合类面试题 40个Java集合面试问题和答案 java.util.Collections 是一个包装类.它包含有各种有关集合操作的静态多态方法. ja ...

  7. 10 Future Web Trends 十大未来互联网趋势

    转载自:http://blog.sina.com.cn/s/blog_4be577310100ajpb.html 我们很满意自己进入的当前网络纪元,通常被称为Web 2.0.这个阶段互联网的特征包括搜 ...

  8. 从啥也不会到可以胜任最基本的JavaWeb工作,推荐给新人的学习路线(二)

    在上一节中,主要阐述了JavaScript方面的学习路线.先列举一下我朋友的经历,他去过培训机构,说是4个月后月薪过万,虽然他现在还未达到这个指标. 培训机构一般的套路是这样:先教JavaSE,什么都 ...

  9. To Java程序员:切勿用普通for循环遍历LinkedList

    ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...

随机推荐

  1. ansible小结

    一.Ansible的安装 1.yum源安装 以centos为例,默认在源里没有ansible,不过在fedora epel源里有ansible,配置完epel 源后,可以直接通过yum 进行安装.这里 ...

  2. HDU 1756 Cupid's Arrow 判断点在多边形的内部

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  3. Python开发【第十篇】:CSS --无内容点击-不进去(一)

    Python开发[第十篇]:CSS  --无内容点击-不进去(一)

  4. javaScript获取指定的cookie值

    1.获取cookie的函数 function getCookie(cookieName) { var strCookie = document.cookie; var arrCookie = strC ...

  5. CTE的使用

    CTE在SQL2005后的版本提供,丰富了查询的表现形式,下面我们慢慢来看下CTE都能干什么 1.自我递归 ;WITH myaa AS ( SELECT num=1 UNION ALL SELECT ...

  6. UITextView textViewShouldEndEditing

    最近做到UITextView, 在取消键盘事件上我以为和UITextField差不多,于是我这样写: UITextView *textView = [[UITextView alloc] initWi ...

  7. SqlDependency 的使用

    1.SqlDependency是什么: SqlDependency 对象表示应用程序和 SQL Server 实例间的查询通知依赖关系.应用程序可以创建一个 SqlDependency 对象并进行注册 ...

  8. eclipse/myeclipse 变量名自动补全问题

    原理是:在输入变量名后,去掉按下空格或=后,代码上屏  以前只知道alt+/调出assist,后来发现可以所有字母都激活content assist(8.1里有写).用起来果然很爽,但是eclipse ...

  9. 【USACO 1.5.1】数字金字塔

    [题目描述] 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 ...

  10. CentOS 6.5下安装MySql 5.7

    不管您按下面的方法安装成功否,请留个言,把您遇到的问题写上共勉! 包下载http://url.cn/WrNg5S 环境: 1).软硬件:E6420双核CPU,8G内存,1T硬盘 2).虚拟机下 Cen ...