今天早些时候,我在欣赏《谦虚的程序员》时遇到了这个选择引用:
因此,暂时甚至可能永远,第二类规则表现为程序员要求的纪律元素。我脑海中的一些规则是如此清晰,以至于它们可以被教授,并且永远不需要争论给定的程序是否违反它们。例如,如果不提供终止证明或不说明其不变性不会因执行可重复语句而破坏的关系,则不应写下任何循环。
我正在寻找 Dijkstra 的 1300 多篇著作中的哪一篇最好地描述了他在上面描述的更详细的规则。
第 5 页到第 18 页:http
://userweb.cs.utexas.edu/users/EWD/ewd02xx/EWD249.PDF
中。第 3 页到末尾:http
://userweb.cs.utexas.edu/users/EWD/ewd04xx/EWD473.PDF
第 5 页到末尾:http ://userweb.cs.utexas.edu/users/EWD/ewd06xx/ EWD641.PDF
全部:http ://userweb.cs.utexas.edu/users/EWD/transcriptions/EWD02xx/EWD261.html (荷兰语,翻译=以下)
注意:Dijkstra 从 0 开始对他的页面进行编号。给定的页码从 1 开始,即 PDF 页码,而不是书面页码。
我对 EWD261 的英文翻译:
如何进行数学编程
一个(定义明确的)程序的结构就像一个(定义明确的)数学理论。程序员的工作与创造性数学家的工作没有什么不同。
但是,存在一些小但重要的差异:
- 编程的基本概念并不多,也不难理解(尽管容易误导);这就是为什么它是开发实践的理想选择。(除此之外,还有一个对正确性的要求,程序应该真的可以工作!)
- 在大多数数学教育中,人们都会学习现有的定理,即。为学生提供一组特定(详细)的概念;然而,程序员必须自己开发所需的概念。编程需要导致某种创造力的抽象,而数学中的抽象则仅限于应用现有定理。
- 因为程序很大,而且必须工作,所以程序员将学会如何仔细和有意识地进行开发。这正是一个人应该教的!对我来说,教授广泛的知识是不合理的。