本文为原创,可能有一些不太严肃的胡说,请勿转载

Dijkstra:宗师、巨星,计算机学科的奠基人之一

  
  牛顿有句名言:“如果我看得比别人更远些,那是因为我站在巨人们的肩膀上1

  在计算机科学界,荷兰人Edsger W. Dijkstra(EWD,狄克斯特拉)是公认的的巨人,抗起计算机学科发展的奠基人之一。从22岁到70岁近40年,他在计算机软件和理论方面做了很多开创性工作,伴随着计算机学科从懵懂到成熟的年代。他创造了大量常用的、写入权威教科书的基本计算机概念和术语,制订了很多编程技术的指导性原则,例如堆栈(stack)、显示(display)、信号量(semaphore)、死锁(deadlock)、互斥(mutual exclusion)、结构化编程(structured programming)等等。
  Dijkstra获得无数荣誉,其中最有名的是ACM图灵奖。1972年第七届图灵奖,当Dijkstra得知自己获奖时,十分惊讶,因为这个美国ACM协会设置的奖很少颁给非美国人。而且,直到24年后的1996年,才有第2个非英美人获奖。
  在1966-2000年间,共有41人获ACM图灵奖,其中:“美国出生+美国求学+美国工作”27人;“非美国出生+美国求学+美国工作”8人;其他6人,这6人中有4个英国人,1个荷兰人(1972年Dijkstra),1个以色列人(1996年的Amir Pnueli)。
  2001-2019年间,非美国获奖者多了起来。共30名获奖者,其中“美国出生+美国求学+美国工作”18人,“非美国出生+美国求学+美国工作”3人,其他9人。

  Dijkstra简历:
  1952–1962:荷兰阿姆斯特丹计算机部,程序员
  1962–1973:荷兰埃因霍芬理工大学数学系,教授
  1973–1984:美国Burroughs Corporation公司,研究员
  1984–2000:美国德克萨斯大学奥斯汀分校,教授

1、引子
  大部分计算机学生是在学习“Dijkstra最短路径算法”时得知Dijkstra的。图论中有两个著名的算法:Dijkstra最短路径算法和Prim最小生成树算法2。两个算法的思想基本一样,都是基于贪心法来扩展结点,执行步骤十分相似,代码只有微小差别。两个算法简单而高效,现在仍广泛应用在图问题中,例如手机的地图导航、游戏软件的寻路等。

  这两个算法虽然以发明者的名字“Dijkstra”、“Prim”命名,但其实有好几位科学家独立发明过,其中一人是Dijkstra。1956年,他26岁做兼职程序员时曾在一篇论文中同时提出了这两个算法。这篇只有3页的小论文“A note on two problems in connection with graphs3”,第一部分现在一般被称为“Prim最小生成树算法”,第二部分现在一般被称为“Dijkstra最短路径算法”。

  Dijkstra最短路径算法的思路很简单,它维护两个集合:一个是已经计算出最短路径的结点集合A,另一个是这些点向外扩散的邻居结点集合B。算法的执行步骤是:扩展A的直连邻居,放到B中;每次从B中取出距离起点最短的结点,放到A中;当B为空时计算结束。

图1 Dijkstra原始论文中的集合A和集合B

  不过,论文中没有提到一个关键问题:如何高效地从B中选出距离起点最短的那个点?这个问题的解决决定了算法的复杂度,决定了代码的效率有多好。现在学过图论的学生都知道,编程时一般用优先队列(效率极高,n个数只需要计算logn次就能找到最小的数)来实现。但是在Dijkstra的论文中,并没有提到如何实现,也许他认为这是一个需要扩展的问题,更大的可能是那时候还没有这些数据结构的概念。
  Dijkstra在1956年时发明了这个算法,但那时还没有自动计算方面的专业期刊,无法发表,直到1959年才找到合适的刊物发表。这篇论文是1945-2000年间Web of Science数据库中的一篇经典引文。在一次关于Dijkstra算法的通信中,Douglas McIlroy教授谈到了Dijkstra算法表达的现代性,指出“它在当时显然是不寻常的。后来的上千次引用也不能对它有所改进。”也就是说,Dijkstra在计算机科学理论初创时期所写的论文,已经十分规范而标准,并成了后来者的模板。
  Dijkstra对计算机学科的发展有很多奠基性的贡献,最短路径算法只是他年轻时走过的一个小脚印。Dijkstra于1956年提出最短路径算法,时年26岁,是他作为一个计算机科学家的开端。之后的30年,他发展了现在众所周知的、成为常识的多种计算机概念和技术,他那“巨人的肩膀,扛起了计算机科学4(The Man Who Carried Computer Science on His Shoulders)”。

2、生平
  简单地概况Dijkstra的成功而完美的人生:书香门第、天资聪颖、勤学好思、抓住机遇、工作努力、广泛交游。
  1930年,Dijkstra出生于荷兰城市鹿特丹(Rotterdam),是四个孩子中的老三。他有个好家庭。他父亲是中学化学老师和中学校长,但不是一个普通的化学老师,而是一个化学家、荷兰化学学界的名人,当过荷兰化学协会的主席,博学多才。他母亲是数学家,不过没工作而是家庭妇女(那个年代的女性都这样),她非常聪明,是个天才,Dijkstra说他从母亲那里学到了如何简洁优雅地解决问题。
  Dijkstra又聪明又勤学,学习成绩非常好。中学毕业后,他想去学法律,将来到联合国为世界和平做贡献,避免再次世界大战!但是身为科学家的爸妈都建议他,不要浪费自己的聪明才智,应该去从事科学事业。
  1948年,他到离家不远的莱顿大学(University of Leiden)读物理学,他说他的大学生涯“很穷很累很快乐5”。这不奇怪,那时正是二战后的欧洲重建时期。

  大学的头三年,Dijkstra还是那么勤奋,他老老实实学物理和数学,1951年通过中期考试,比其他同学都早。然而Dijkstra一直到1956年才拿到大学学位,一共读了8年大学。读了这么久,不是因为去游戏人生了,而是因为他对物理的兴趣衰退了,中间去兼职工作当了一名程序员。
  1951年,一件事改变了Dijkstra的命运。计算机科学的一颗星星开始升起,这将是一颗星等为一等的亮星。
  这一年,他那热爱科学并积极关注科学发展的老爸,看到剑桥大学的一个编程课广告,一门三星期的短课,学习EDSAC计算机编程。EDSAC是世界第一台存储程序式电子计算机,采用了冯诺依曼结构。冯诺依曼结构后来成为现代计算机的标准架构,可见EDSAC是当时最先进的计算机。作为对Dijkstra提前通过中期考试的奖励,父亲资助他去英国学编程。估计真实目的是让他去剑桥大学见见世面,将来去剑桥读读研究生,顺便路过伦敦逛逛看看花花世界。
  好学的Dijkstra第一时间想到的是:用计算机来帮助做数值计算,有利于物理研究!Dijkstra高兴地去学编程了,从此与计算机结缘,走上了康庄大道。
  Dijkstra在这门编程短课上似乎发现了新大陆,学得如鱼得水。而且,他偶遇了荷兰阿姆斯特丹数学中心的负责人,获得了一个“黄金就业机会”。负责人对21岁的大学三年级青年说:计算机刚起步,有光明的发展前景,注定成为一门显学,“小伙子你会成为计算机宗师的”。然后热情邀请他到数学中心做编程工作,而且宜早不宜迟,机会不等人,“快来快来,过几天就没位置了”。
  Dijkstra面临一个重大选择,是继续读物理,还是去搞编程?他决定一起做。而且,大学生活穷得很,兼职能赚点钱,有钱才能找女朋友!
  从1952年开始,Dijkstra大部分时间都在数学中心兼职搞编程,物理学业差不多荒废了,导致他到1956年才从大学毕业。毕业后,他开始在数学中心全职工作,一直到1962年。长达十年的编程工作,他自学成才,成长为一位计算机科学家。
  他在自传中戏称自己是“第一个靠编程赚钱的荷兰人6”,在图灵奖获奖感言中也说自己是荷兰的第一个程序员。

  看到这里,我们发现Dijkstra当初其实是被数学中心负责人忽悠了。荷兰那时几乎没有人会编程,连一个只学了3周编程的Dijkstra也成了稀缺人才,甚至是“荷兰第一个程序员”。数学中心的负责人之所以向Dijkstra伸出橄榄枝,根本原因是没有选择,只能找他。
  在数学中心当程序员,听起来不错:敲着键盘,喝着咖啡,工作之余还能打打游戏…这都是做梦,那时还没有电脑键盘,输入靠穿孔纸带,输出靠电传打字机,电脑屏幕自然也没有。至于编程嘛,高级语言还没有出现,汇编语言也没有,因为电脑还没有编译编程语言的能力,只能直接用机器码编程,就是0和1,也就是在纸带上穿孔,打孔就是1,没打孔就是0。没学过计算机的人可能不能理解为什么“0101110011…”这种东西就是程序。现在编程语言教科书上的知识,当时几乎都没有。
  Dijkstra在剑桥学的就是这种编程,怪不得只要3周,因为也没什么好学的。据我猜想,这3周的教学大纲估计长这样:第一课“二进制”;第二课“逻辑代数”;第三课“逻辑电路”;第四课“加法器电路”;第五课“冯诺依曼结构”;第六课“机器指令”;第七课“穿孔技巧”;第八课“故障和维修”;完。
  Dijkstra没有被这种枯燥的学习吓倒,反而产生了浓厚的兴趣,数学中心负责人肯定高兴坏了。
  Dijkstra在数学中心的十年编程工作颇有成效,最短路径算法就是这个期间发明的,这是Dijkstra设计的第一个著名算法,并以他的名字命名。Dijkstra为此感到很得意,他在1993年的自传中回忆这一美妙时光:“最短路径算法以我的名字命名,让我出了名。当初我设计这个算法的时候,并没有拿着纸和笔冥思苦想。那是在阿姆斯特丹的一个露天咖啡馆,我和妻子(当时在谈恋爱,一年后的1957年结婚)晒着阳光喝着咖啡,然后我灵机一动想到了这个算法。”谁还没有一个春风得意的年轻时代呢。

图2 Dijkstra在自传中提到最短路径算法

  1960年,Dijkstra和同事一起编写ALGOL 60编译器,这是世界上第一个ALGOL 60编译器。开发过程中解决了很多关键问题,例如1960年Dijkstra在一篇论文“Recursive Programming”中,提出了术语“堆栈(stack)”。多年以后,他得知这篇小论文让他在美国计算机学界出了名。

图3 Dijkstra在自传中提到stack

  因为在数学中心的工作,Dijkstra于1959年获得了阿姆斯特丹大学的博士学位,博士论文题目是“Communication with an Automatic Computer”,研究实时中断问题。
  Dijkstra在数学中心工作到1962年,这期间的工作让他成为一位有名的计算机科学家,他这颗星星开始在天空眨眼。
  1962年,他被聘为荷兰埃因霍芬理工大学(Eindhoven University of Technology)数学系的教授。不过,他谦虚地说自己其实是第3个候选人,只是因为前2人拒绝了聘请,才轮到他。学校给他安排的本职教学工作是上《数值分析》课,课余他的精力完全在计算机上,他组织了一个计算机研究小组,开发操作系统“THE Multiprogramming System”。“THE”系统创造了历史,是世界第一个松耦合、显式同步、协操作串行处理的操作系统,在大学的计算中心运行了10年。信号量(semaphore)、死锁(deadlock)等新概念就是在这个系统上提出的。他很为这个系统自豪,他到英国、美国交流这个系统的设计,获得了同行的高度认可,使他在计算机学界声名鹊起。
  Dijkstra最广为人知的事情,是他对GOTO语句的批评。当时人们在编程时,经常使用GOTO语句,随意跳转到程序的任意位置。“GOTO语句,天马行空!” 这个语句极为暴力,让程序的流程变得支离破碎。敏锐的Dijkstra第一个认识到这个语句对程序逻辑、计算资源的的破坏性。1968年他给 Communications of the ACM写了一篇2页纸的通讯,信件原标题是“反对GO TO语句(A case against the GO TO statement7)”,因为标题过于露骨,被编辑改名为较为温和的“Go To Statement Considered Harmful”后发表,引起了广泛的争论。当然,现在大家都知道他赢了,几乎没有人在编程的时候使用GO TO语句。这封信影响如此之大,以至于“X considered harmful”成了一个标题模板,经常被用于咆哮和指责的文章中。

  1969年,杰出的计算机科学家Dijkstra很郁闷:他不受自己工作的大学的待见,他的研究小组被解散。他为了平复自己郁闷的心情,躲起来花大气力写了一篇80多页的报告“Notes on Structured Programming8”,即“结构化编程”。结构化编程现在是计算机程序默认的基本原则,不过那时还是一个全新的概念。

  Dijkstra还没意识到他写了一篇辉煌的巨著。他觉得这只是一篇普通的报告,让大家看看就好了,于是复印20份,寄给了外国的计算机科学家朋友们。然而出乎他的意料,这篇报告获得了巨大的成功,“像野火一样传播(spread like wildfire)”,辗转复印了很多轮,Dijkstra自己就认识一个住在偏远角落的人珍藏着这篇报告的第5、6代复印稿。可以计算一下,如果每人复印20份然后继续往下传,第5代就有205=30020^5=300205=300万!“洛阳纸贵”,一时间搞计算机的人人都在看这篇伟大的报告,深深为Dijkstra充满哲人的洞见而折服。Dijkstra后来分析为什么受到欢迎:“这是第一篇严肃讨论编程挑战的文章。”
  这份报告终于奠定了Dijkstra计算机科学巨星的地位。
  Dijkstra声誉日隆。1972年的一个下午,他正坐在学院的办公室发呆,突然接到一个美国电话,被告知获得了第七届ACM图灵奖。Dijkstra非常震惊,反复确认才肯相信。他完全没想到自己能得这个奖,因为前6个图灵奖获得者都是讲英语的、工作于著名机构的美国人或英国人。他幸福地眩晕了(I got even a bit overwhelmed)。
  Dijkstra的震惊是可以理解的,如果他晚一些年获得图灵奖,他会更加震惊,因为一直到24年之后的1996年,才有第2个非英美的获奖者。姚期智2000年获得图灵奖,是图灵奖唯一的华裔学者,当时他是美国国籍。姚期智于2016年放弃美籍,成为中国公民。
  然而,Dijkstra在学校的地位却越来越尴尬。就在获得ACM图灵奖之后不久,他被迫从大学离职了,这事儿真让人啼笑皆非。大环境是计算机学科在1960年代中期才在英美的一些大学出现,而Dijkstra所在的大学那时还没有。他所在的数学学院的领导并不理解和支持他的计算机工作,觉得他不务正业。他搞的计算机研究,和学院其他老师做的数学研究似乎毫不搭边。另外,Dijkstra在自传中用忧郁的语气回忆自己当时“穿拖鞋、留胡子、态度傲慢”,这不修边幅的样子一点儿都不像个教授,倒是个“完美的”现代程序员的邋遢风格。Dijkstra的人缘似乎不太好,他成了他所在大学的一个异类,学校甚至解散了他的研究小组,他成了一个孤家寡人。
  甚至1972年获得图灵奖,这个荣誉也没有让他在学校的地位有所好转。Dijkstra在办公室接到获奖电话,从幸福的眩晕中恢复过来后,第一时间就跑去告诉院长,“我得图灵奖啦!”然而院长大人似乎不知道什么是图灵奖,还脱口而出说了一句伤人的话:“你们搞计算机的,得奖不要太容易哦!(In the world of computing, they are rather lavish with prizes, aren’t they?)?” 年轻的科学巨星、计算机宗师被说得如此不堪,Dijkstra刻苦铭心地记了一辈子,还写到了自传中。不久后,他从大学离职了。
  1973年8月1日,Dijkstra找了个新工作,新东家是当时著名的美国计算机制造商Burroughs Corporation公司,办公地点就在他荷兰的家里。这是一份美妙的工作,他没有具体任务,而是“自由研究”,只需要每年去美国总部汇报几次就好了。在做“自由研究员”的那些年,他跑遍了世界各国,参加各种学术会议,在计算机的世界中自由飞翔。
  然而,美妙时光不会永远持续。1984年,他从Burroughs Corporation公司离职,因为“Burroughs的学术视野正在缩小,而我的视野正在扩大(Burroughs’s intellectual horizon was shrinking, my own was widening)。” Burroughs Corporation公司在走下坡路,日子不好过开始节流了。
  美国的好客和学术环境吸引着Dijkstra。1984年,他终于在54岁的年龄离开了荷兰,到美国德克萨斯大学奥斯汀分校做计算机教授。
  Dijkstra1999年退休,2002年查出癌症,回到荷兰后不久去世。
  Dijkstra一生著述极多。他做事非常有条理,用自己名字的缩写“EWD”对这些文件进行命名和编号,一共有1318篇,德克萨斯大学把这1318篇作品整理成档案在网上公开。有趣的是,他是一位计算机科学家,却几乎不用电脑打字,而习惯于用钢笔书写。这1318篇作品,除了早期的一部分已经找不到手稿是打印的,后期的手稿都在,字迹工工整整,几乎没有涂改的痕迹。这些手稿的笔迹,数十年完全一致,显然出自同一人的手笔,不是别人誊抄的。有的手稿长达几十页,是很不容易的。
  他的最后一篇“EWD1318”,写于2002年4月,当时已经回到荷兰。他4个月后去世。
  绚烂的生命之花,在日暮时分凋落。

图4 最后的手稿:EWD1318

  
  本文参考了以下原始资料:
[1]Dijkstra自传:https://www.cs.utexas.edu/users/EWD/ewd11xx/EWD1166.PDF
[2]Dijkstra档案:https://www.cs.utexas.edu/users/EWD/
[3]ACM图灵奖介绍:https://amturing.acm.org/award_winners/dijkstra_1053701.cfm


  1. https://www.phrases.org.uk/meanings/268025.html ↩︎

  2. R. C. Prim, “Shortest Connection Networks and some Generalizations,” Bell System Technical Journal, Vol. 36, 1957, pp. 1389-1401. ↩︎

  3. Edsger W. Dijkstra, “A note on two problems in connection with graphs,” Numerische Mathematik 1, 1959, pp. 269–271. 下载:http://www-m3.ma.tum.de/foswiki/pub/MN0506/WebHome/dijkstra.pdf ↩︎

  4. The Man Who Carried Computer Science on His Shoulders
    https://inference-review.com/article/the-man-who-carried-computer-science-on-his-shoulders ↩︎

  5. Dijkstra自传:“We were very poor, …, but life was incredibly exciting.” ↩︎

  6. Dijkstra自传:“the first Dutchman with the qualification ‘programmer’ on the payroll.” ↩︎

  7. A case against the GO TO statement https://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF ↩︎

  8. “Notes on Structured Programming”: https://www.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF ↩︎

Edsger W. Dijkstra -- 巨人的肩膀相关推荐

  1. 谦卑的程序员(The Humble Programmer) by E.W.Dijkstra,1972

    谦逊的长者--Edsger Wybe Dijkstra,1930年出生于荷兰阿姆斯特丹,2002年逝世于荷兰纽南.他在祖国荷兰获得数据和物理学学士,理论物理博士学位,2000年退休前 一直是美国Tex ...

  2. Edsger Wybe Dijkstra

    埃德斯加·狄克斯特拉(Edsger Wybe Dijkstra)(May 11, 1930 – August 6, 2002;)是1950年代ALGOL语言的一个主要贡献者.ALGOL高级编程语言已经 ...

  3. 站在巨人的肩膀上看世界,MySQL初步使用语法

    站在巨人的肩膀上看世界,MySQL初步使用  MySQL是一个常用的数据库,对于他的使用,我们需要尽量的了解它,但是掌握初步的语法,也可以勉强使用它,这都归功于它的研发者们.正是因为这些大佬,写好了软 ...

  4. 站在巨人的肩膀上“思考”问题,重在思考而不是拿来主义

    米老师按:觉得值得讨论的小文!我还要认真地想一想 主题:围绕职责链设计模式-计算收费有效时间博客展开讨论 参与人: 讨论时间: 讨论内容 这次讨论主要分为以下几点: 一.职责链模式应用于机房收费系统计 ...

  5. 小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向

    今天上午,第一届小米开源技术峰会在北京举行,会上,小米人工智能与云平台副总裁崔宝秋致开场词,并发表了<小米开源之路>的演讲. 崔宝秋强调小米一直在推动开源,也是开源的倡导者.他告诉我们雷军 ...

  6. 站在巨人的肩膀,2020我在使用和涉及到的开源项目

    背景 要想成为一名软件开发者需要学习各种专业知识.技术与框架.比如算法.数据结构.编程语言.流行框架等.但是要想成为更加出色的软件开发者,你要学习的就不仅仅是专业上的知识了.还要懂得利用巨人的肩膀. ...

  7. 【计算机思维】面向人的开发 站在巨人的肩膀上

    思维转变:使用其他程序员开发的"黑箱",不要重复造轮子 以Java举例,从常用的集合框架开始,我们要产生新的思维转变了,我们已经学会了基本的功能,但是在真正开发的时候,用基础功能去 ...

  8. 二本非科班30岁转行架构师的老徐:站在巨人的肩膀学习才是捷径

    公司新来了个同事,级别比大白高一级,技术一流,来了之后把现有项目的性能优化了一遍,给公司省了不少成本. 后来才知道,他竟然是个「把烂牌打出王炸」的存在.他叫老徐,大白希望通过他的故事,帮你找到些可复制 ...

  9. 站在巨人的肩膀上看Servlet——原来如此(更适合初学者认识Servlet)

    前言: 有段时间没更新博客了,这段时间因为要准备考试,考完试后又忙了一阵别的事,一直没能静下心来写博客.大学考试真是越来越恶心了,各种心酸,那酸爽,够味.不过还好,马上就要大三了,听大三学长学姐说大三 ...

  10. 【巨人的肩膀上制造世界】——5——Unity3D实用插件之Mouse Interaction-Object Highlight,快速构建模型的悬浮高亮!悬浮提示!悬浮动画!

    [巨人的肩膀上制造世界]--5--Unity3D实用插件之Mouse Interaction-Object Highlight,快速构建模型的悬浮高亮!悬浮提示!悬浮动画! 目录 1.博客介绍 2.内 ...

最新文章

  1. 电脑显示服务器地址无法ping通,网关无法Ping通故障及解决方法
  2. 菜鸟学***——菜鸟的旅程
  3. ARM开发板系统移植-----kernel的编译
  4. android 照片拼接长图_我才发现,微信里面有一个功能,能将手机照片自动拼成长图...
  5. python文件编译_将c程序编译为python扩展,生成.whl文件
  6. Sublime Text提示Unable to download XXX. Please view the console for more details安装插件失败解决
  7. 解决循环引用--弱引用weak_ptr
  8. java 马克思_单链表-Java
  9. 苹果修复老旧设备中的两个 iOS 0day
  10. 福州大学计算机报录比2019,2019-2020福州大学报录比波动分析:2020年调剂难度加大...
  11. android 编译模块
  12. 怎么让envi中影像背景为0_eCogniton波段权重设置——基于ENVI的波段信息量计算
  13. php var_dump和var_export区别
  14. SQLServer删除登录记录用户名和密码
  15. 第十八篇_Class文件
  16. photoshop智能参考线
  17. 计组头哥实验 第1关 8位可控加减法电路设计
  18. 李开复--生命是最严厉的导师
  19. 【Windows逆向】Windows进程动态patch入门+pyqt5搭建GUI
  20. 珍藏了很久的特效例子,分享给前端感兴趣的同学

热门文章

  1. 校园网IPv6免流量上网
  2. Python学习笔记:PYQT5 文字及绘图旋转
  3. Linux——RAID磁盘阵列及配置
  4. Pycharm中工程项目的多个python环境的管理使用方法的一点点理解
  5. stm32程序flash下载和sram运行
  6. RFID技术在物联网中有哪些应用
  7. 余光中 听那冷冷的雨
  8. Internet Download Manager(最新版win/mac)最快下载器工具使用教程
  9. 初始MySQL数据库
  10. 鹏业安装算量软件一键识别设备操作说明