1. 编程的艺术就是处理复杂性的艺术。

2. 优秀的程序员很清楚自己的能力是有限的,所以他对待编程任务的态度是完全谦卑的,特别是,他们会象逃避瘟疫那样逃避 “聪明的技巧”。——1972年图灵奖演讲

3. 计算机科学是应用数学最难的一个分支,所以如果你是一个蹩脚的数学家,最好留在原地,继续当你的数学家。

4. 我们所使用的工具深刻地影响我们的思考习惯,从而也影响了我们的思考能力。

5. 实际上如果一个程序员先学了BASIC,那就很难教会他好的编程技术了:作为一个可能的程序员,他们的神经已经错乱了,而且无法康复。

6. 就语言的使用问题:根本不可能用一把钝斧子削好铅笔,而换成十把钝斧子会是事情变成大灾难。

7. 简单是可靠的先决条件。

下面是Dijkstra遗孀和子女发出的通告:

>Grateful for most that has befallen him, has peacefully passed away,>    Edsger Wybe Dijkstra,>our husband and father.>>We hold him very dear.>>The cremation will take place on>>Saterday, August 10th, 12:30 PM at>Somerenseweg 120>Heeze>the Netherlands>>Maria C. Dijkstra Debets>Marcus J. Dijkstra>Femke E. Dijkstra>Rutger M. Dijktra>>Please forward this message to whomever you feel missing in the>recipient list.

最后,请重温Dijkstra在1968年发表的那篇短文:

Go To Statement Considered Harmful

For a number of years I have been familiar with the observation that the quality of programmers is a decreasing function of the density of go to statements in the programs they produce. More recently I discovered why the use of the go to statement has such disastrous effects, and I became convinced that the go to statement should be abolished from all 'higher level' programming languages (i.e. everything except, perhaps, plain machine code). At that time I did not attach too much importance to this discovery; I now submit my considerations for publication because in very recent discussions in which the subject turned up, I have been urged to do so.

My first remark is that, although the programmer's activity ends when he has constructed a correct program, the process taking place under control of his program is the true subject matter of his activity, for it is this process that has to accomplish the desired effect; it is this process that in its dynamic behavior has to satisfy the desired specifications. Yet, once the program has been made, the 'making' of the corresponding process is delegated to the machine.

My second remark is that our intellectual powers are rather geared to master static relations and that our powers to visualize processes evolving in time are relatively poorly developed. For that reason we should do (as wise programmers aware of our limitations) our utmost to shorten the conceptual gap between the static program and the dynamic process, to make the correspondence between the program (spread out in text space) and the process (spread out in time) as trivial as possible.

Let us now consider how we can characterize the progress of a process. (You may think about this question in a very concrete manner: suppose that a process, considered as a time succession of actions, is stopped after an arbitrary action, what data do we have to fix in order that we can redo the process until the very same point?) If the program text is a pure concatenation of, say, assignment statements (for the purpose of this discussion regarded as the descriptions of single actions) it is sufficient to point in the program text to a point between two successive action descriptions. (In the absence of go to statements I can permit myself the syntactic ambiguity in the last three words of the previous sentence: if we parse them as 'successive (action descriptions)' we mean successive in text space; if we parse as '(successive action) descriptions' we mean successive in time.) Let us call such a pointer to a suitable place in the text a 'textual index.'

When we include conditional clauses (if B then A), alternative clauses (if B then A1 else A2), choice clauses as introduced by C. A. R. Hoare (case[i] of (A1, A2,···, An)),or conditional expressions as introduced by J. McCarthy (B1 -> E1, B2 -> E2, ···, Bn -> En), the fact remains that the progress of the process remains characterized by a single textual index.

As soon as we include in our language procedures we must admit that a single textual index is no longer sufficient. In the case that a textual index points to the interior of a procedure body the dynamic progress is only characterized when we also give to which call of the procedure we refer. With the inclusion of procedures we can characterize the progress of the process via a sequence of textual indices, the length of this sequence being equal to the dynamic depth of procedure calling.

Let us now consider repetition clauses (like, while B repeat A or repeat A until B). Logically speaking, such clauses are now superfluous, because we can express repetition with the aid of recursive procedures. For reasons of realism I don't wish to exclude them: on the one hand, repetition clauses can be implemented quite comfortably with present day finite equipment; on the other hand, the reasoning pattern known as 'induction' makes us well equipped to retain our intellectual grasp on the processes generated by repetition clauses. With the inclusion of the repetition clauses textual indices are no longer sufficient to describe the dynamic progress of the process. With each entry into a repetition clause, however, we can associate a so-called 'dynamic index,' inexorably counting the ordinal number of the corresponding current repetition. As repetition clauses (just as procedure calls) may be applied nestedly, we find that now the progress of the process can always be uniquely characterized by a (mixed) sequence of textual and/or dynamic indices.

The main point is that the values of these indices are outside programmer's control; they are generated (either by the write-up of his program or by the dynamic evolution of the process) whether he wishes or not. They provide independent coordinates in which to describe the progress of the process.

Why do we need such independent coordinates? The reason is - and this seems to be inherent to sequential processes - that we can interpret the value of a variable only with respect to the progress of the process. If we wish to count the number, n say, of people in an initially empty room, we can achieve this by increasing n by one whenever we see someone entering the room. In the in-between moment that we have observed someone entering the room but have not yet performed the subsequent increase of n, its value equals the number of people in the room minus one!

The unbridled use of the go to statement has an immediate consequence that it becomes terribly hard to find a meaningful set of coordinates in which to describe the process progress. Usually, people take into account as well the values of some well chosen variables, but this is out of the question because it is relative to the progress that the meaning of these values is to be understood! With the go to statement one can, of course, still describe the progress uniquely by a counter counting the number of actions performed since program start (viz. a kind of normalized clock). The difficulty is that such a coordinate, although unique, is utterly unhelpful. In such a coordinate system it becomes an extremely complicated affair to define all those points of progress where, say, n equals the number of persons in the room minus one!

The go to statement as it stands is just too primitive; it is too much an invitation to make a mess of one's program. One can regard and appreciate the clauses considered as bridling its use. I do not claim that the clauses mentioned are exhaustive in the sense that they will satisfy all needs, but whatever clauses are suggested (e.g. abortion clauses) they should satisfy the requirement that a programmer independent coordinate system can be maintained to describe the process in a helpful and manageable way.

It is hard to end this with a fair acknowledgment. Am I to judge by whom my thinking has been influenced? It is fairly obvious that I am not uninfluenced by Peter Landin and Christopher Strachey. Finally I should like to record (as I remember it quite distinctly) how Heinz Zemanek at the pre-ALGOL meeting in early 1959 in Copenhagen quite explicitly expressed his doubts whether the go to statement should be treated on equal syntactic footing with the assignment statement. To a modest extent I blame myself for not having then drawn the consequences of his remark

The remark about the undesirability of the go to statement is far from new. I remember having read the explicit recommendation to restrict the use of the go to statement to alarm exits, but I have not been able to trace it; presumably, it has been made by C. A. R. Hoare. In [1, Sec. 3.2.1.] Wirth and Hoare together make a remark in the same direction in motivating the case construction: 'Like the conditional, it mirrors the dynamic structure of a program more clearly than go to statements and switches, and it eliminates the need for introducing a large number of labels in the program.'

In [2] Guiseppe Jacopini seems to have proved the (logical) superfluousness of the go to statement. The exercise to translate an arbitrary flow diagram more or less mechanically into a jump-less one, however, is not to be recommended. Then the resulting flow diagram cannot be expected to be more transparent than the original one.

References:Edsger W. Dijkstra

Technological University

Eindhoven, The Netherlands

dijkstra java pre_Edsger Dijkstra经典言论 - CSDN博客相关推荐

  1. java打印九九乘法表——CSDN博客

    /*** * @Title: test_jiujiu* @Description: 该方法的主要作用:九九乘法表* @param 设定文件 * @return 返回类型:void * @throws* ...

  2. CSDN博客里面挂广告的推荐方法

    CSDN博客里面挂广告的推荐方法 此文章版权归JAVA世纪网()和CSDN()所有. JAVA世纪网地址: CSDN博客地址: 如转载,请保留此说明和完整的页面内容. 感谢 前言 大家应该注意到了,在 ...

  3. java用正则表达式判断字符串中是否仅包含英文字母、数字和汉字_灵思致远Leansmall的博客-CSDN博客_java判断字符串只包含数字字母

    import java.util.regex.Matcher; import java.util.regex.Pattern;public class StrValidate {// 纯数字priva ...

  4. java支持html5视频流技术Pseudostreaming – Roden的专栏 – CSDN博客

    文章目录[隐藏] java支持html5视频流技术Pseudostreaming 首页博客学院 下载论坛APP 问答商城活动VIP会员专题招聘ITeyeGitChat 图文课 写博客 消息 登录注册 ...

  5. 【小工具】CSDN博客导出工具-Java集成Maven开发

    CSDN博客导出工具 之前一直想把CSDN的博客导入到自己的网站中,可是由于博客比较多,后面受朋友老郭启发,就找了个时间用Java开发了这款小工具. 转载请注明出处:http://chenhaoxia ...

  6. taoqick 搜索自己CSDN博客

    L1 L2正则化和优化器的weight_decay参数 kaiming初始化的推导 Pytorch动态计算图 Pytorch自动微分机制 PyTorch中在反向传播前为什么要手动将梯度清零? 通俗讲解 ...

  7. 通过四个多月的时间,我成为了CSDN博客专家

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  8. Android经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 – 博客园 gundumw100博客 – android进阶分类文章列表 – ITeye技术网站 CSDN ...

  9. 我的Android进阶之旅:经典的大牛博客推荐

    Android中文Wiki AndroidStudio-NDK开发-移动开发团队 谦虚的天下 - 博客园 gundumw100博客 - android进阶分类文章列表 - ITeye技术网站 CSDN ...

最新文章

  1. matlab 填充 多边形,algorithm – 如何在MATLAB中从无序边数据创建填充多边形?
  2. 最长连续子序列nlogn算法
  3. 【组队学习】【32期】数据可视化(Matplotlib)
  4. linux make 命令简介
  5. LeetCode-字符串-反转字符串中的单词 II
  6. Kettle使用_17 计算器生成时间维度数据
  7. 最好的Linux C/C++ IDE Windows ALL IDE,第一效率,第零浪漫
  8. Javamysql语法转化oracle_MySQL到Oracle语法错误(限制/偏移/更新)
  9. 解决fullgc_CMS发生FullGc分析
  10. 句柄的本质(整理-收藏) 选择自 feijj2002_ 的 Blog
  11. pytorch和python一样吗_PyTorch可以和TensorFlow一样快,有时甚至比TensorFlow更快了?...
  12. 华为CE6870固件升级 更新补丁操作
  13. 信号能量、功率、功率谱密度、自相关函数公式总结
  14. Spring 框架学习—控制反转(IOC)
  15. JavaScript编程入门
  16. 1天1瓶啤酒 大脑衰老2年
  17. QT-----无人机地面站如何修改显示界面1——OpenPilotGCS_config.xml
  18. 互联网酒店预订系统的服务端架构图-4
  19. 编程常用英文单词缩写整理
  20. KM算法 入门——[kuangbin]KM匹配

热门文章

  1. 2021年汽车驾驶员(高级)试题及解析及汽车驾驶员(高级)操作证考试
  2. Word编辑汇总制表位编辑公式 公式居中 编号具右
  3. 【分割问题】-取石子游戏
  4. 前端无法渲染CSS文件
  5. 易基因|DNA甲基化和单细胞RNA-seq联合揭示空气污染对复发性流产的表观遗传影响
  6. ipad和iphone是不是计算机,iPad和iPhone哪个好
  7. 【opengl32.dll下载】找不到opengl32.dll怎么修复
  8. java命令 jar文件夹_java中jar命令打包一个文件夹下的所有文件
  9. 拿出来分享了!VIP珍藏!!!全网最齐全的 DEDECMS模板 全盘下载地址列表!没有你找不到的!
  10. spss24 中文版 1. 数据定义