26岁发明最短路径算法,47岁斩获图灵奖,却差点因为是程序员而无法结婚!
26岁发明最短路径算法,47岁斩获图灵奖,却差点因为是程序员而无法结婚!
renyoushe
传递新知,开创新视界。
世上本没有路,走的人多了,便变成了路。
——鲁迅 《故乡》
任何一个领域开拓与发展,都离不开无数先驱们的探索与献身,他们把自己的终身奉献给那个他们执着的世界,有的到头来没看到希望,有的欣慰地带着笑逝去。
小编今天带来的故事,就属于后者——艾兹格·W.迪杰斯特拉这位伟大的计算机科学家推动并见证了“计算机科学”的发展,使之成为一门科学学科。
▲计算机领域先驱,艾兹格·W.迪杰斯特拉
01
荷兰第一个程序员
1930年5月11日,荷兰鹿特丹一个中学的化学老师Douwe Wybe Dijkstra和他的妻子Brechtje Cornelia Kluijver 迎来了他们的第三个孩子,艾兹格·W.迪杰斯特拉(Edsger Wybe Dijkstra)。
尽管中学时艾兹格·W.迪杰斯特拉的梦想是学习法律,去联合国当荷兰代表,但当他在数学、物理等课程上取得了极其优异的成绩之后,被父母与老师说服转而在1948年进入莱顿大学学习数学和物理学。
1951年,他父亲给他报了英国剑桥大学开设为期三周的计算机编程课。那是艾兹格·W.迪杰斯特拉第一次离开荷兰,最开始陌生的环境和语言让他感到无所适从,但编程对他的吸引力立马将这些不适驱散。
“老板,我想当一个程序员”
阿姆斯特丹数学中心计算系主任A. van Wijngaarden注意到了这个表现优异的小伙子,为他提供了一份在数学中心的兼职。1952年春天的一个早晨,艾兹格·W.迪杰斯特拉正式踏入了编程行业, 成为荷兰第一个程序员 。
在数学中心工作的同时,他还在莱顿大学继续学习着理论物理,经历了三年的编程工作,他发现两者越来越难以兼顾。于是,他不得不做出一个抉择:要么继续编程,要么选择成为受人尊敬的物理学家。
▲艾兹格·W.迪杰斯特拉在莱顿大学求学时的证书
带着这些疑虑,艾兹格·W.迪杰斯特拉和老板A. van Wijngaarden进行了一次影响他一生的谈话。老板在听完他的问题后,说:”的确现在没有所谓的编程科学,但是计算机必将继续存在并且影响这个世界,现在所有都是一个充满希望和未知的开始,你怎么知道在未来的几年你不会成为编程科学的创始人呢?“
这是艾兹格·W.迪杰斯特拉人生中最重要的转折,他决定成为一名程序员。1956年,他从莱顿大学毕业,正式投入数学中心的工作。
“程序员是什么?你是一个物理学家。”
在数学中心时,他的主要工作是建造一台计算机并对公众演示,为了能让非技术人员也能明白这台计算机的作用,他设计了一个程序来解答观众感兴趣的问题,即”在荷兰随机选定两个城市,这两个城市之间最短的路线是什么?“
在当时,这个问题最好的算法运行时间随着城市网络规模立方增长,而艾兹格·W.迪杰斯特拉使用的算法运行时间只会随着其平方增长。这个算法是他和未婚妻Maria C. Debets在一个咖啡馆露台上喝咖啡的时候,花了二十分钟时间想出来的。直至今天,他的最短路径算法仍被用于计算机通信的数据包交换软件等应用程序中。
在同一时期,他还发明了一个非常有效的最小生成树算法。这两个都是图论中经典的算法,最终于1959年发表在论文A Note on Two Problems in Connexion with Graphs 中。
1957年,他与Maria C. Debets结为夫妇。荷兰的婚礼仪式上有一个传统,双方需要说明自己的职业,当艾兹格·W.迪杰斯特拉说自己是一名程序员时,大家都表示没有听过。为他们登记结婚的阿姆斯特丹政府甚至不承认他的这份职业,认为完全不存在“程序员”这种职业。
▲艾兹格·W.迪杰斯特拉与Maria C. Debets
所以,最终的结婚证明“职业”那一栏填写的不是程序员,而是另一个身份——理论物理学家。
程序员?那是什么?你是一个物理学家。
他感到荒谬却也无可奈何,编程职业在荷兰出现的速度极为缓慢,在世界上其他地方也是如此。
02
可怜的程序员
所以在当时,程序员的处境并不太好,他们似乎经常被忽视。
计算机比程序员更受欢迎
在当时,计算机巨大而笨重,无法移动且需要大量的维护,所以技术人员使用和开发这台机器实际上是同一个实验室。在展示这台计算机时,人们都会聚焦在这巨大无比的机器之上,而那些程序几乎无人问津。
同时,大多数程序员认识到一个事实,那就是他们的工作的意义来源于那台优秀的计算机。自己的程序只在计算过程中有局部的意义,并且自己的工作年限是被那台机器决定的——一旦机器退休了,自己也就无法进行编程工作了。
但是,这台巨大的计算机也有着速度慢、内存小的缺点,并且写出来的代码会产生一些非预期的构建过程。所以,当时的程序员会在这种情况下寻找一种智力上的满足,他们把许多不可能在这台设备上变为可能。
这些事情影响了当时的程序员,包括兹格·W.迪杰斯特拉。
硬件发展带来的软件危机
当时对于编程有两种主流的看法:一个观点认为真正的程序员应该要有敏捷的头脑,并且喜欢那些聪明的技巧;另一种观点觉得,编程啥都不是,它只是在各种方向上提升计算效率。
前者是艾兹格·W.迪杰斯特拉支持的观点,他认为 编程是一项需要高智力的挑战 ,而不是一个个简单的任务。但是在当时后者却是最主流的看法,人们认为只要出现了更强大的计算机,编程便会成为不必要的行为,因为更强大的计算机效率更高,不需要编程来做这项工作了。
只不过,后来的发展出乎人们的意料,的确有更强大的计算机出现,并且其性能提升了无数倍,但是效率问题并没有得到解决,那些编程问题也没有消失,反而带来了软件危机。
原因在于人们对于编程的认识错误,他们以为硬件的数千倍提升之后就不会有效率问题,但实际上它带来了更大的编程问题,比如管理策略问题,I/O中断不可预测和难以重现,等等。
后来所谓的第三代计算机出现,为了主打“性价比”优势它们采用了一些匪夷所思的硬件设计。这种硬件设计很难用于编程,尽管很多人质疑,但是它们还是来了。
这让程序员的编程工作变得更难。
这些变化一直影响着艾兹格·W.迪杰斯特拉,他一直没有停下对于什么是真正编程的思考,什么才是真正的程序员?程序员应该做什么?他一直在寻求这些问题的答案。
03
真正的程序员该做什么
在数学中心他进行了十年的编程工作,获得了广泛而又深厚的编程经验,他见证过许多程序员的迷茫与无措,也看见过很多坚持与巧思,这些都被他一一吸纳,构建自身的一套编程思想。在1960年他与同事开发了第一个用于编程语言 ALGOL 60 的编译器,这又让他对编程加深了思考。
1962年他进入埃因霍温理工大学担任数学教授——当时没有学校有计算机专业——在后来他尝试创建计算机科学专业,并且建立了 THE(Technische Hogeschool Eindhoven) 操作系统,该系统很多工程已经成为现在操作系统的标准功能。
但在此前的一段时间,他过得并不好,因为他意识到自己的数学系同事们并没有发现数学的重要地位——在计算机中。为了缓解那些抑郁的情绪,他开始写那封著名的公开信 《结构化编程笔记》 ,对于编程的重新思考,让他看到了更多的可能,走出了那段阴霾。
进行结构化编程
在那本笔记中,艾兹格·W.迪杰斯特拉发表了他的著名观点: 编程是一门学科,而不是一门手艺。 此前,编程并没有理论概念和编码系统,许多方法的缺失导致了许多软件问题——也就是前文的软件危机。
《结构化编程》一出,立马在行业内引起轩然大波,他的观点引发了一场称为结构化编程的运动,这场运动提倡 对程序构建采用系统、合理的方法。 编程不再是一种专业的、私人的、解决问题鲜为人知的活动,它成为了一种基于数学把那些规范组合成为程序的公共活动。
他的这一思想,成为了编程的基础规范,编程也真正成为一个系统的学科。
同时,他为程序员的活动指明了一个明确的方向——使用结构化编程,并遵循这些原则:大型系统应该由许多较小的组件构成;每个组件只能由其接口而不是实现来定义;较小的组件可以遵循类似的分解过程,从而导致自上而下的设计风格;设计应该首先列举“可分离的问题”,并独立考虑每一组问题;数学逻辑是并且必须是软件设计的基础。
1972年,他因为对编程巨大贡献获得了当年的图灵奖。
后面的很长一段时间,他重点关注了 程序正确性 领域,并将那一段工作总结成为许多论文与专著。
03
一本所有程序员都该读的书
《编程的修炼》 就是其中重要的一本。
▲先驱者的思想凝练,点击与之共鸣
大部分情况下,各种算法通常是以一种成品形式发表,并在设计过程中起着非常重要的作用,但是它的正确性和各种思考的主要部分则完全不会被提及。
作者认为程序可以有迷人的形态和深刻的逻辑之美,但是绝大部分程序又是用一种只是和机器执行的方式表达的,完全没有美感,也不适合人来欣赏。
为了解决上面两个问题,让读者可以欣赏到它们的美,他有了写书的想法并很快将它实现。
不使用具体编程语言,专注解决问题
几乎所有编程教材都会采用一种特定编程语言作为示例,使用可运行代码或者伪代码作,但本书则完全抛弃了这些东西。
作者在编写本书的时候也思考过这个问题:准备使用哪一种编程语言?但在分析了工具对于人们思考习惯的影响之后,得出了一个结论: 没有一种现存的编程语言,也没有一个他们的子集适合他来描述算法之美。
所以,作者设计了一种小型语言,来保证程序的正确性。他认为,在传递编程本身的思想和信息的时候,完全用不到高级编程语言的那些结构。
使用某种特殊编程语言写出来的示例代码,不可避免地会产生某种歧义,无法作为严格的形式化推理基础。
在单个问题与编程实例上,作者采用的方法也与其他书籍不同。他在给出要解决问题的描述之后,总是非常详尽地描述了从问题出发,通过细致地分析思考,逐步深入工作,最后做出所需程序的整个过程。通过这个过程,作者反复展示了在编程中应该怎样思考问题,提出合适的概念,规划处理流程,通过自上而下的设计和开发逐步做出程序框架,分析、解决遇到的具体问题,填充各部分细节,直至做出完整的程序。
同时,作者特别强调 “关注点分离” 的重要性,强调要在一个阶段解决一个问题。
开发正确的程序
当然,在解决问题前把问题搞清楚是最重要的。作者在强调如何开发正确的程序时,把这个作为了首要问题。只有明白自己将要面对的问题是什么,深刻地理解它是如何发生、背后的原因,才能设计出正确的算法去解决它。
作者还认为,保证程序正确最重要的点在于 数学意义上的严格描述和推导 。书中每一个示例,都展示了推导在编程领域的威力。
同时,他认为 程序语言本身就是一种形式化的严格定义的描述形式 ,用它们写出的程序有确切的语义。用具体计算机运行程序就是实现其语义,但程序的语义并不依赖于运行它的计算机,它可以独立地思考和表达。
正是基于这种观点,作者在状态和断言的概念基础上提出了最 弱前条件的思想,用谓词转换器作为程序语义的落脚点。 使用谓词转换器可以直接定义初始状态与最终状态之间的关系,并不需要参考程序实际执行中可能经历的中间状态。
所以, 程序员主要关注数学的正确性与工程上的效率就可以了。
这种思想和方法,在很大程度上的确是可以提升程序员的编码能力的——作者自己采用这种方法效果显著。
如何使用这本书
关于如何阅读本书,作者也提出了一个非常切实有效的建议: 一旦看完了问题描述,立马停止阅读,转而尝试自己解决它,这是一种自己认识和评价问题困难度的唯一方法。 如果可以的话,找一两同好一起学习,也是一个非常不错的方法。
同时,他给出一个忠告:当你发现这本书并不是那么容易读下去的时候,请不要沮丧,因为本书的确是有点难度的。在遇到此类困难的时候,应该把困难归结于实际讨论的问题,而不是有关于它的表达方式。
04
最后的话
小编对于这位计算机科学先驱抱有极大的敬意,特别是他在本书中的一句话:
对于没有参考文献的问题,我不准备解释,也不表示歉意。
为什么没有?因为没有参考。在当时他们就像黑夜中的掌灯者,前路渺渺,照亮的是后来人。
参考来源:
[1]E.W.Dijkstra Archive: Home page..
[2]E.W.Dijkstra Archive: The Humble Programmer (EWD 340)..
[3]Hoare, T. (2003). Edsger Wybe Dijkstra. JOBS, 56(3).
[4] Edsger W.Dijkstra .. Notes on Structured Programming. Cs.
[5]Edsger Dijkstra (1930 - 2002) - Biography - MacTutor History of Mathematics..
[6]Edsger W. Dijkstra - A.M. Turing Award Laureate..
推荐阅读
▲点击封面,进入购买界面
《编程的修炼》
本书是图灵奖获得者艾兹格·W. 迪杰斯特拉(Edsger W. Dijkstra)的最重要的著作,也是编程领域里经典著作中的经典。作者基于其敏锐的洞察力和长期的实际编程经验,对基本顺序程序的描述和开发中的许多关键问题做了独到的总结和开发。本书讨论了基本顺序程序的本质特征、程序描述和对程序行为(正确性)的推理,并通过从简单到复杂的一系列程序的思考和开发范例,阐释了基于严格的逻辑推理开发正确而可靠的程序的过程。
本书写于20世纪70年代后期,但其对于编程领域的技术开发,对于编程语言的发展和程序理论研究的深刻影响持续至今。本书值得每一个关注计算机科学技术的本质,冀求在程序和软件领域有长远发展的计算机工作者、教师和学生阅读。
往期好文
点击图片即可阅读全文
世界读书日,经典好书推荐分享
谷爱凌错失了金牌,但是我更看好她了
2021年度精选好书推荐
2022年最值得期待的新书
做一个"超越期待"的打工人!
-
2023年血糖新标准公布,不是3.9-6.1,快来看看你的血糖正常吗? 2023-02-07
-
2023年各省最新电价一览!8省中午执行谷段电价! 2023-01-03
-
GB 55009-2021《燃气工程项目规范》(含条文说明),2022年1月1日起实施 2021-11-07
-
PPT导出高分辨率图片的四种方法 2022-09-22
-
2023年最新!国家电网27家省级电力公司负责人大盘点 2023-03-14
-
全国消防救援总队主官及简历(2023.2) 2023-02-10
-
盘点 l 中国石油大庆油田现任领导班子 2023-02-28
-
我们的前辈!历届全国工程勘察设计大师完整名单! 2022-11-18
-
关于某送变电公司“4·22”人身死亡事故的快报 2022-04-26
