一个对 Dijkstra 的采访视频

(也可以访问 YouTube 或者从源地址下载 MPEG1,300M)

之前在微博上推荐了一个对 Dijkstra 的采访视频,看了两遍之后觉得实在很好,所以再正式推荐一下。大部分人可能都知道他对图论算法和操作系统的贡献,而其实 Dijkstra 在程序语言上的造诣也很深厚。我们常用的程序语言里面司通见惯的“递归函数”,其实当年就是 Dijsktra 和另一个人不顾委员会里众人的反对和怀疑,坚持要放进 Algol 60,所以后来才进入了 Pascal,C,Java 这样的语言的。那个时候 John McCarthy 缺席,不然的话就会有三个人支持了。

现在看来,任何一个语言里面没有递归函数都是不可思议的事情,然而在1950-60年代的时候,居然很少有人知道它有什么用!所以你就发现,所谓的“主流”和“大多数人”一直都是比较愚蠢的。现在,同样的故事发生在 lambda 身上。多年以后,没有 lambda 的语言将是不可接受的。

在这里只摘录他提到的几个要点。某些观点也许不是最好的办法,但我确信其中有非常值得学习的地方。

  1. 软件的版本号 2.6, 2.7, … 都是胡扯。本来第1版就应该是最终的产品,可是软件公司总是先弄出来一个不完整的版本,骗大家买了,以后再慢慢“升级”。每次升级都要用户再次付钱。
  2. 编程有多种流派,我喜欢把它们归类成“莫扎特 vs 贝多芬”。当莫扎特开始写乐谱时,作品就已经完成了。他的手稿一气呵成,书法也很好。贝多芬不一样,他总是在怀疑和挣扎。他的作品一般是还没有想好就开始写,然后就往上面贴纸条修改。有一次贝多芬改了9遍才把手稿完成,后来有人把这手稿一层层的撕开,发现第一版和最后一版是一摸一样的。这种改来改去的做法是 Anglo-Saxon 民族的传统,它贯穿了英国式的教育。
  3. 作曲家的工作不是写乐谱,而是构思音乐。最早的时候人们编程都是用汇编语言的,就跟写乐谱差不多。后来他们发明了高级语言,就以为这些语言把编程的问题解决了。但是你仔细一瞧,发现它们只是把编程最微不足道的问题解决了,但是困难的问题仍然困难。这些高级语言与越来越大的野心加在一起,反而让程序员头脑的负担更重了。
  4. 称职的程序员都知道自己头颅的尺寸是有限的,所以他们以谦逊的态度来对待工作,像回避瘟疫一样地回避小聪明。
  5. 当我1970年在法国巴黎讲学如何编程的时候很成功,听众都非常积极。回家的路上我又在比利时布鲁塞尔的一个大软件公司进行了同样的演讲,结果非常失败。那恐怕是我一生中最失败的演讲。后来我发现了为什么:他们的管理层不喜欢无懈可击的程序,因为这公司是靠“维护软件”的合同来维持生存的。程序员对此也不感兴趣,因为最让他们兴奋的事情在于不知道自己在干什么。他们觉得如果清楚地知道自己在干什么,那就没有挑战性了,就是无聊的工作。
  6. 研究物理的人如果遇到不理解的事情,总是可以责怪上帝,世界这么复杂不是你的错。但是如果你的程序有问题,那就找不到替罪羊了。0就是0,1就是1,就是你把它搞砸了。
  7. 1969年,在阿波罗号登月之后不久,我在罗马的北约软件工程会议遇到了 Joel Aron,阿波罗计划的软件负责人。我知道每个阿波罗飞船上面的代码都会比前一个多4万行。我不知道“行”对于代码是个什么单位,但4万行肯定是很多了。我很惊讶他们能把这么多代码做对,所以我问 Joel:你们是怎么做到的?他说:做什么?我说:把那么多代码写正确。Joel 说:“正确?!其实在发射前仅仅五天,我从登月器计算轨道的代码里发现一个错误,这代码把月球的重力方向算反了。本来该吸引的,结果写成了排斥。是一个偶然的机会让我发现了这个错误。”我的脸都白了,说:这些家伙运气真好?Joel 说:“是的。”
  8. 软件测试可以确定软件里有 bug,但却不可能用来确定它们没有 bug。
  9. 程序的优雅性不是可以或缺的奢侈品,而是决定成功还是失败的一个要素。优雅并不是一个美学的问题,也不是一个时尚品味的问题,优雅能够被翻译成可行的技术。牛津字典对 elegant 的解释是:pleasingly ingenious and simple。如果你的程序真的优雅,那么它就会容易管理。第一是因为它比其它的方案都要短,第二是因为它的组件都可以被换成另外的方案而不会影响其它的部分。很奇怪的是,最优雅的程序往往也是最高效的。
  10. 当没有计算机的时候,编程不是问题。当有了比较弱的计算机时,编程成了中等程度的问题。现在我们有了巨大的计算机,编程就成了巨大的问题。
  11. 我最开头编程的日子跟现在很不一样,因为我是给一个还没有造出来的计算机写程序。造那台机器的人还没有完工,我在同样的时间给它做程序,所以没有办法测试我的代码。于是我发现自己做的东西必须要能放进自己的脑子里。
  12. 我的母亲是一个优秀的数学家。有一次我问她几何难不难,她说一点也不难,只要你用“心”来理解所有的公式。如果你需要超过5行公式,那么你就走错路了。
  13. 为什么这么少的人追求优雅?这就是现实。如果说优雅也有缺点的话,那就是你需要艰巨的工作才能得到它,需要良好的教育才能欣赏它。

【转】一个对 Dijkstra 的采访视频的更多相关文章

  1. 一个对 Dijkstra 的采访视频

    之前在微博上推荐了一个对 Dijkstra 的采访视频,看了两遍之后觉得实在很好,所以再正式推荐一下.大部分人可能都知道他对图论算法和操作系统的贡献,而其实 Dijkstra 在程序语言上的造诣也很深 ...

  2. 侣行APP

    本次要做的是团队共同完成一个项目.由队长组织,全体队员一起讨论分析并完成一款APP的需求调研,分析等工作. 1.团队介绍 队长:杨晓帅 队员                               ...

  3. For Your Dream

    队名:Braveheart 队员介绍: 队长:李洋洋 队员:姚欢,杨仁波,张波,乔闯 项目名称:数据沈航 总体任务: 收集整理学校的数据,为每个想要了解沈航的人展现一份我们收集来的信息 项目分组: ( ...

  4. cglib源码主流程源码-我们到底能走多远系列48

    扯淡 祝各位在园里的朋友新年快乐! 辛苦一年,为更好的自己也为更好的世界,很多人要感谢你们,你们也应该有很多人要感谢吧. 看了马斯克的采访视频,又想起兰迪·鲍许的最后一课,时光迁移,唯有梦想可坚持. ...

  5. Java暑期作业

    一.假期观影笔记--<熔炉> 影片<熔炉>是根据发生在韩国光州聋哑学校里的真实事件而改编.影片讲述的是在一所聋哑儿童学校里,校长.教务以及老师披着慈善的华丽外衣对学校中的多名未 ...

  6. 17秋 SDN课程 第一次作业

    SDN第一次作业 你会选择作 网络编程 方向的程序员吗?为什么? 有可能.原因如下: 1.我的研究与网络密切相关: 2.SDN侧重软件实现,自然涉及socket等网络编程知识,属于基本功: 3.市场. ...

  7. Internet History, Technology and Security (Week⑨)

    Week ⑨ We are now on the second to last week of the class and finishing up our look at Internet Secu ...

  8. 资料收集:学习 Linux/*BSD/Unix 的 30 个最佳在线文档

    文章转自:https://linux.cn/article-10311-1.html 手册页(man)是由系统管理员和 IT 技术开发人员写的,更多的是为了作为参考而不是教你如何使用.手册页对于已经熟 ...

  9. DOIS2019大会,腾讯 DevOps 测试中台探秘

    WeTest 导读 腾讯WeTest受邀参加2019年DevOps 国际峰会,由WeTest产品负责人-殷柱伟老师分享了腾讯DevOps测试中台的实践经验与心得, 议题受到了现场听众及行业媒体的关注与 ...

随机推荐

  1. Insert Interval leetcode java

    题目: Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if nec ...

  2. mongo 3.0 备份和还原数据库 ,及too many positional arguments错误

    在mongo 3.0的操作 备份示例 ./mongodump -h localhost -d liongo -o ./ 错误方式: ./mongorestore -h 127.0.0.1 -d lio ...

  3. 20个代码生成框架 (.NET JAVA)

    1.1 CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http://forum.codesmi ...

  4. 你应该抓紧学习Python,它是开发Web应用最强大的语言

    Python和少数几种编程语言,如MySQL.Perl.PHP和与LAMP打包的网络结构一起的Apache,已经成为Linux的一个基本组件.即 使从它诞生开始,Python就与其他动态编程语言如Ru ...

  5. PS-点击选中某一个图层

    需要点击选中某一图层的时候,需要勾选[自动选择]

  6. C#类似版本号有多个分割符可以产生的排列组合,类似版本号比较

    我采用asp.net进行演示 送给有缘人吧,可以获得类似版本号的功能,也可以对比两个版本号,我这里是其他需要用逗号分割的 using System; public partial class _Def ...

  7. PyQt5教程——介绍(1)

    PyQt5教程阅读须知 “PyQt5教程”系列若不做明显提示,默认翻译自zetcode. 有需要翻译精度的朋友可以自行阅读英文文档. 如果本系列博文侵犯了您的合法权益,请在博客中留下评论或联系:che ...

  8. Deep compression code

    https://github.com/songhan/SqueezeNet-Deep-Compression import sys import os import numpy as np impor ...

  9. cannot use 'throw' with exceptions disabled(转)

    在为 DragonBonesCPP/refactoring 的 cocos2d-x-3.2 demo 增加 Android 编译时,NDK 报了一个编译错误: error: cannot use ‘t ...

  10. 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧

    近期接触了几个刚入门的iOS学习者,他们之中存在一个普遍和困惑和疑问.就是应该怎样制作UI界面.iOS应用是非常重视用户体验的,能够说绝大多数的应用成功与否与交互设计以及UI是否美丽易用有着非常大的关 ...