`
civili
  • 浏览: 23973 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[译]如何设计程序-前言

阅读更多

 

前 言

 

现代教育教孩子编程本身就是一个错误,毕竟做规划, 获得组织思想的训练,专注于细节和学习自我约束有什么乐趣呢?

——艾伦.珀利斯,编程警言

 

许多专业有赖于计算机编程。会计为电子表格和字处理程序编程;摄影师为照片处理程序编程;音乐家为合成器编程;专业程序员对裸机编程。编程成为一个必须的技能。

 

编程不仅仅是一个职业技能。其实,好的编程是一种愉快的活动,一种宣泄创造性的途径,一种用明确的形式表达抽象思想的方法。设计程序将教会你许多技能,这些技能对任何专业都是重要的:批判性的阅读,深入的分析,创造性的综合和专注细节的能力。

 

因此,我们相信学习程序设计应当和数学和英语一样成为教育的中心。至少,增加它的分量。

 

每个人都要学习设计程序。

 

一方面,程序设计教你和数学同样的分析技能。而且,不像数学,编程是一个主动的学习方法。和软件交互提供了一个即时反馈并且会带来探索,体验和自我评价。此外,设计程序产生有用和好玩的事物,比起反复灌输的数学教育更能增加成就感。另一方面,程序设计和英语一样教你分析的阅读和写作的技能。甚至最小的编程任务也被描述为文本。没有批判性的阅读,学生不能设计满足需求的程序。相反,好的程序设计方法致力于让学生用英语准确的表达程序。

 

函数设计方法

 

问题分析和数据定义

契约,目的和效果描述,头文件

举例

函数模板

函数定义

测试

 

1:程序设计方法的基本步骤

 

本书是把编程作为文科核心课程的第一本书。它主要关注设计过程,即从问题描述引出组织良好的解决方案。它不强调编程语言和算法的细节,也不关注特定的应用领域。作为介绍性课程,我们希望把重点放在设计过程上,而这需要两个根本性的创新。第一个创新是一套明确的设计准则。现有的课程往往提供含糊,不明确的建议,如"自顶向下的设计"或者是"使程序结构化"。而我们已经开发了一个设计指导方针,该方针通过定义明确的中间产物一步一步地引导学生从一个问题获得一个计算解决方案。在这个过程中,他们学会用系统的方式阅读,分析,组织,试验和思考。第二个创新是一个全新的编程环境。过去,基于文本的编程忽视了编程环境在学习过程中的作用。他们只是认为,学生能获得专业的环境。本书为初学者提供了一个编程环境。它也会随着学生们掌握更多的材料而一步步增强,最终它将支持一个正式的语言和各种范围的编程任务:从大规模编程到脚本编程。

 

我们的准则制定了一系列程序设计食谱。设计食谱指导新程序员完成整个问题解决过程。有了设计食谱,初学者再也不会对着一张白纸或者计算机屏幕发呆了。相反,他们将通过对照设计食谱以一问一答的形式一步步取得进展。

我们通过给问题分类建立了设计食谱。分类的依据是基于数据的类别的,这些数据被用来表示相关信息。从类别描述结构开始,学生获得一份程序清单。图1显示了设计食谱清单的六个基本步骤。每一步产生一个明确的中间产品

 

1.问题数据类别的描述;

2.程序行为的非正式规范;

3.展示行为例子;

4.开发项目模板或布局;

5.转变成一个完整的模板定义;并且

6.通过测试发现错误。

 

主要的不同涉及第一步和第四步的关系。

 

设计食谱不仅帮助初学者也帮助教师。教师可以利用食谱检查初学者解决问题的能力,发现学生的弱点,并提出具体的补救措施。毕竟,每个阶段的产品都是明确,可检查的。如果一个新手卡住了,教师可以检查中间产品并确定到底是什么问题。基于此分析,教师可以指导食谱中的确定一步,解决问题,并建议多做练习。

 

为何每个人都要学习编程。

 

想像会把不知名的事物用一种形式呈现出来,

诗人的笔再赋予它们如实的形象,

空虚的无物也会有了居处和名字。

——莎士比亚,仲夏夜之梦五(一)

 

我们每个人编程或想要学习编程可能出现 ,在第一敝,很少很少的人们看到程序这些日子。然而,人们主要使用应用程序包,不需要任何编程。甚至程序员也使用“程序生成器”,一种产程程序的软件包,给出,业务规则。所以为什么每个人要学习编程?

 

对于这个问题的回答包括两个部分。首先,它确实是真实的 编程形式是有用的对仅仅很少的人们。但是,编程作为我们 有用的对每个人:管理者秘书使用电子表格以及高技术程序员。换句话说,我们有一个广泛的关注编程在头脑比

 

要获得对现代程序设计的更好理解,近距离的观察电子计算表,一个今天最流行的应用程序软件包。用户输入公式到计算表。公式描述了A单元如何依赖B单元。然后,当用户输入一个数到B中,计算表自动的计算单元A的内容。对计算表,一个单元可能依赖很多别的单元,而不止一个。

 

其它的应用程序软件包需要类似的行为。考虑文字处理器和样式表。样式表描述如何建立一个(或一个部分)文档

 

最后,使用程序生成器在许多方面依赖同样的技能 像那些对应用程序软件包所必须的。程序生成器建立一个程序使用程序设计语言,比如C++Java,来自高层描述,像业务规则或科学定律。这样的规则 关系量子,销售和

 

所有的这些活动 计算机软件为我们做一些事。一些使用科学记号,一些使用 英语,一些使用具体的编程记号。它们所有的时一样的编程形式。 两个概念:

 

1.一个量和另一个量的关系,和

2.求值一个关系通过 值 名字

 

确实,这两个概念编程在最底层,计算机的本地语言,和用现代风格的语言如Java。一个程序关联它的输入到输出,并且,当程序使用到一个特别的输入,求值 具体的值对名字。

 

没有人能

 

设计方法

 

烹饪曾经是孩子的游戏和成男人的娱乐。

烹饪 是一个爱的艺术

——Craig Claiborne(1920-2000),食物编辑,

新纽约时报

 

学习设计程序就像学习演奏 。一个演奏者必须学习 传球和射门。一旦运动员知道这些基本技能,下一个目标就是学会打一个位置,练习具体的策略,

 

程序员也非常像建筑师, 或者作家。他们做创造性工作的人,开始于一个在他们头脑里的创意和一张空白的纸。

 

程序员也建立大纲,翻译他们到第一个设计,然后迭代的改善它们直到它们真的匹配最初的创意。确实,最好的程序员编辑和重写他们的程序许多遍直到它们确实 。并且就像 , 建筑师, 或作家,程序员必须长时间地练习基本的技能在他们能真正创造之前。

 

设计方法相当于 的控球技术,写作技术, 画图技术。一个设计方法表示程序设计空间的一个点。我们已经研习了这个空间并且已经标识了许多重要的范畴。本书选择对基础和最实践的方法并表示他们

 

一般的设计方法关注输入数据和程序的连接。

 

在许多,一个问题自然的建议一个设计方法。另一方面,程序员必须选择从几个可能性中;每一个选择可能产生程序

 

现在我们已经展示了我们的意思通过编程和程序设计,读者能看到为什么和怎么样教授程序设计 思考技能 是重要的

一个的专业。要 地设计一个程序,学生必须:

 

1.分析问题描叙, 像一个文字问题;

2.表达它的本质,抽象和举例;

3.翻译描述和注释进一个语言;

4.求值和 这些活动 检查和测试;以及

5.关注细节

 

所有的这些活动是有用的对商务人士,律师,导游,科学家和工程师,以及许多其他人。

 

然而,编程也需要这些技能,初学者经常理解不了这个关联。问题是 编程语言和 编程形式 编程强怕学生 执行 一个大的记忆大量的语言规范事实。简单地说, 。要避免这个问题,教师必须使用一个编程环境 小的初学者。因为当我们开始时这样的工具不存在,所以我们开发了它们。

 

 

为何选择SchemeDrScheme

 

我们 漂亮是简单

没有多余的部分

答案是终结

关于所有事

意义是任何疯狂

--Ralph Waldo Emerson, The Conduct of Life

 

 

我们选择Scheme作为本书的编程语言,并且我们设计和实现了DrSheme,一个Scheme语言的编程环境,特别对初级学生定制了的。这个编程环境可以免费的使用,在本书的官方站点上可以下载。

 

但是,本书不是关于Scheme编程的书籍。在书中,我们仅仅使用最小Scheme设施。特别的,我们使用六个设施(函数定义和应用,条件表达式,结构定义,局部定义和赋值)加上一打非常基本的函数。这个小小的子集对于教授计算和编程的原理已经足够了。想使用Scheme作为编程工具的人需要去读另外的材料。

 

初学者选择Scheme是很自然的。首先,Scheme的核心允许程序员仅仅关注我们在前言开始的时候指出的编程的两个基本要素:程序是量和对特定的输入求值的程序之间的关系。只使用核心部分,学生能开发完整的程序在第一次和教师的会话过程中。

 

第二,Scheme能容易的分层成一个语言层级的塔。这个属性 对初学者 带来更少的记号错误 高级语言特性。结果是。为了避免这个问题,我们的编程环境,DrScheme,实现了几个小心选择的Scheme语言子集。基于这个,环境能错误消息学生的知识级别。 语言分层能减少许多基本错误。我们开发了分层并且发现 通过观察初学者几个星期 在rice大学的计算机实验室。当学生学习更多关于编程和语言,教师能学生更丰富的语言层,那里允许学生写更有趣和 的程序。

 

第三,DrScheme编程环境提供一个真正的交互式求值器。它包含两个窗口:一个定义窗口,在那里学生定义程序,以及一个交互窗口,就像一个计算器。学生能输入表达式进这个,然后,DrScheme决定它们的值。换句话说,计算由计算机算术开始,他们对此很了解,并且很快能从这里去计算,和结构,列表和树——计算机程序真正处理的数据的种类。更远些说,一个交互式的求值模式学生 用任何可能的方式 因此模拟他们的。

 

最后,使用一个带有丰富的数据语言的交互式求值器允许学生把注意力放在问题解决和程序设计活动上。关键的增强是交互式求值渲染了一个输入和输出操作(几乎)的讨论。这是几个。首先,输入和输出操作需要记忆。学习这些事是。 学生是更好的除了学习问题解决技能和使用输入输出支持。第二,好的面向文本的输入需要深入的编程技能,是最好的再一个计算问题解决的课程上。教授坏的面向文本的输入时浪费教师和学生的时间。第三,现代程序部署在图形用户接口(GUI),在那里程序员设计函数连接到标尺,按钮,文本区域等等。记忆特别的协议 当前风格的GUI库。简而言之,在编程入门课上讨论输入输出是浪费宝贵的学习时间。如果学生决定在更深入的水平上学习编程,必须的(Scheme)知识关于输入输出。

 

结论是,学生能在两个小时之内学会Scheme的核心,这个语言具有作为一个方便的语言的能力。结果,学生能直接关注编程的基础,这将极大地增强他们问题解决的技能。

 

 

 

 

本书组成部分

 

本书由8个主要部分和7个插曲组成。主要部分侧重程序设计;插曲介绍有关编程和计算的其他的议题。图2显示本书各个部分的依赖关系图。该图表明,教授本书有几个途径,只覆盖本书的一部分材料是可行的。

 

从第一部分到第三部分覆盖数据驱动程序设计的基础。第四部分介绍抽象设计。第五和第六部分是关于递归生成和聚集的。对于这前6部分,本书采用一种完全的函数式或叫做代数式的编程范型。求值同一个表达式总是得到相同的结果,无论我们怎样求值。此属性可以使我们更容易地设计和思考程序。但是,为了处理程序和外部世界的接口,我们给语言加上了赋值语句并放弃了一些代数推理。最后两部分显示了程序设计的方法。更确切的说,它显示了本书六个部分是如何应用设计方法的,以及为什么一旦加入赋值语句我们必须更谨慎。

 

插曲引入了一般意义上的计算和编程方面的重要议题,而没有涉及程序设计本身。插曲也谨慎介绍了一些我们选择的Scheme语言子集的语法和语义,和额外的编程结构。插曲5是关于计算的抽象成本(时间,空间,能源)的讨论,并介绍了向量。插曲6比较了两种表示和处理数字的方法。

 

一些插曲直到有需要时才涉及。比如关于scheme语法和语义的插曲。但是,考虑插曲3的中心角色,它将被及时的涉及。

 

 

 

2:主体部分和插曲的依赖关系。

 

增量迭代和迭代议题:对大型项目来说系统化程序设计技术是特别有趣和重要的。从小的一个函数的问题跨越到小型多函数项目需要额外的设计理念:迭代改进。我们的目标是先设计程序的核心然后往核心添加功能直到全部需求被满足。

 

在第一课学生就必须要尝试迭代改进技术。因此,为了了解学生对这个技术的掌握程度,我们包含了扩展练习。通常情况下,简要概述规定了练习集的阶段。练习通过一些设计迭代悄悄地引导学生。在第16节,明确的阐明了这个思想。

 

此外,本书一再重复某些练习和例子议题。例如,6.67.410.321.441.4节,还有在最后两节之间一些小练习涉及了在画布上移动图像的想法。学生们看到几次同样的问题,每次获得越来越多的如何组织程序的知识和经验。

 

把功能片段加入到程序说明为什么程序员必须遵循设计准则。解决这个问题再次演示学生如何从设计食谱中选择一个。最后,有时新知识只是帮助学生们提高程序组织。换句话说,学生将学习到程序不是在他们工作开始而是在工作结束时完成的,像报纸和书籍,他们需要编辑程序。

 

示教包:在项目上工作的另一个方面是,程序员在团队中工作。在教学方面,这意味着,一个学生的程序

 

教学安排:每个大学,学院和高中有它自己的需要并且必须找到一个方法安排课程。在Rice大学,我们 覆盖整本书加上一些附加材料在一个学期。在研究型大学的教师可能会保留相似的安排。高中教师可能需要更。许多高校测试本书覆盖前面的三部分在一个学期;有一些仅仅使用前面的部分教授代数问题解决从计算角度;另外的一些用一年的时间教完整本书。更多的课程安排信息,访问我们的Web站点。

 

本书的Web站点:本书由两个版本可以获得:纸版书和自由访问的在线版本。在以下网址

 

http://www.htdp.org/

 

Web站点也提供附加材料,特别的扩展练习。

 

本书的两个版本都带有不同种类的提示,每一个由下面的三个图标标记:

 

这个标记表示DrScheme提示;在本书的所有版本都可用。编程环境是用心的为学生设计的。这些提示建议如何使用DrScheme在学生过程的几个步骤。

 

这个标记表示教师提示,建议策略如何去表示一节,如何应用练习,或者如何应用一些材料。

 

字体和定义:为了可读性,Scheme程序的类型集使用很少几个字体。斜体字代表程序名和变量名.Sans Serif字体表示常量和内建操作。黑体字是Scheme关键字。

 

定义来自三个方面。一些编程和计算的术语。

 

 

致谢

特别感谢以下四个人:Robert “Corky” Cartwrght,和第一作者共同开发了Rice介绍课程的最初版本;Daniel P. Friedman1984年让第一作者重写The Little LISPer也由MIT出版社出版,因此才有了这本书。John Clements,设计,实现和维护DrScheme的单步器;还有Paul Steckler,小组发布 我们的编程工具套件。

 

这本书的写作来自许多其他的朋友和他们在课上使用了本书的早期材料

并且给出了详细的注释。我们感谢他们为他们的帮组和关注:Ian Barland, John Clements, Bruce Duba, Mike Ernst, Kathi Fisler, Daniel P. Friedman, John Greiner, John Stone, Geraldine MorinValdemar Tamez.

 

一打的Rice大学Comp 210课程的学生使用了本教材的早期材料,并且在几个方面增强了它。另外,我们的TeachScheme工作室在他们的课堂上使用了本书的早期材料。很多人给出了注释和建议。作为他们的代表我们感谢以下的活动发布者:Ms. Barbara Adler, Dr. Stephen Bloch, Mr. Jack Clay, Dr. Richard Clemens, Mr. Kyle Gillette, Ms. Karen Buras, Mr. Marvin Hernandez, Mr. Michael Hunt, Ms. Karen North, Mr. Jamie Raymand以及Mr. Robert Reid. Christopher Felleisen 专注的工作在本书的第一部分和他的父亲并且以一个年轻学生的视角提供了直接的看法。Hrvoje Blazevic (Master of LPG/C Harriette), Joe Zachary(犹他大学)Daniel P. Friedman(印第安纳大学)讨论了许多打印错误在第一次印刷时,现在我们修正了它们。感谢每一个人。

 

最后,Matthias表达了他的对Helga的愧疚对他多年的照顾和创建一个家庭对一个粗心的丈夫和父亲。RobbyHsing-Huei Huang表示感谢对她的支持和;没有她,他不能做任何事。Matthew感谢元文(Wen Yuan)为她的坚定支持和 音乐。Shriram感谢Kathi Fisler的支持,关心和花生,和 在这个项目上。

 

 

 

1. 那些有C/C++BasicPascal编程语言经验的读者可能为把前言中的程序看成是过程或方法。

2. 我们的设计原理受他们启发Daniel P. Friedman的结构化递归,Robert Harper的类型理论,以及Michael A. Jackson的设计方法。

分享到:
评论

相关推荐

    NET组件程序设计 第2版中文版.part3.rar )

    本书主要介绍了设计和开发基于组件的.NET应用程序所需要的技术及相关主题,说明了.NET组件程序设计的起源和它对以往技术缺陷所作的改进。本书还利用大量的代码示例、使用技巧、开发警示、设计准则和富有创意的实用...

    CHAdeMO-1.2-2nd DRAFT-en_r1 Copy(有道文档翻译-英译中结果).docx

    ##### 前言 - **会员义务**:CHAdeMO正式会员需遵守章程规定,在设计与开发充电器及电动汽车时遵循本规范。 - **适用标准**:在规范未覆盖的事项上,如关于用户安全的要求,应遵循各国及行业组织的国家标准和技术...

    分布式系统设计 [美]jie wu著 高传善 译

    2.2 并行/分布式程序设计语言概述 2.3 并行性的表示 2.4 进程通信与同步 2.5 远程过程调用 2.6 健壮性 第 3 章 分布式系统设计的形式方法 3.1 模型的介绍 3.1.1 状态机模型 3.1.2 佩特里网 3.2 因果相关...

    C#与.NET3.5高级程序设计(第4版)中文版 目录,前言,索引.rar

    Amazon超级畅销书,全面涵盖C#3.0,用IL深入揭示各语言特性,深度剖析NET3.5平台,让你知其然,更知其所以然,国内多位...中文版由国内多位微软MVP联手译出,强大的译者阵容有力地保证了这部权威原著原汁原味的重现。

    《C++ Primer中文版(第3版)》(Stanley B. Lippman[美]、Josee Lajoie[美] 著,潘爱民、张丽 译)

    对于C++初学者特别有价值的是一些来自真实世界中的程序例子,它们说明了泛型程序(generic program)的设计、面向对象程序的设计、模板的用法,以及使用标准C++进行程序设计的方方面面,并且在适当的地方还讲到一些...

    基于STM32 的 UCOS+UCGUI 程序移植 (程序源码、设计报告、视频演示)-电路方案

    前言: 现在工业应用中对实时性,界面的美观性都用相当高的要求。而UCOS+UCGUI可以和好的实现。移植这些只是作为学习用,为以后在设计中有用到的是后打个基础。 UCOS+UCGUI 程序移植流程: 上UCOS官网下载源代码。...

    编译原理中文版

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    编译原理--龙书

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则...

    《编译原理及实践》电子书下载

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    Programming.Pearls

    - **标题**:“Programming.Pearls”(中文译为“编程珍珠”)。 - **含义**:这个标题形象地将编程中那些精妙绝伦的设计思路比作珍珠,这些珍珠不仅仅是技术上的创新,更是程序员智慧的结晶。通过阅读本书,读者...

    编译原理(china-pub) 高清

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    Programming C#(第4版)(中文版)part1

    作者: Jesse Liberty 著 刘基诚,李愈胜,刘卫卫 译 出版: 2007年9月 书号: 978-7-121-04592-9 页数: 666 定价: 78.00元 章节目录 前言 I 第1部分 C#语言 1 第1章 C#与.NET框架 3 .NET平台 3 .NET框架 4 编译过程与...

    Programming C#(第4版)(中文版)part3

    作者: Jesse Liberty 著 刘基诚,李愈胜,刘卫卫 译 出版: 2007年9月 书号: 978-7-121-04592-9 页数: 666 定价: 78.00元 章节目录 前言 I 第1部分 C#语言 1 第1章 C#与.NET框架 3 .NET平台 3 .NET框架 4 编译过程与...

    Programming C#(第4版)(中文版)part2

    作者: Jesse Liberty 著 刘基诚,李愈胜,刘卫卫 译 出版: 2007年9月 书号: 978-7-121-04592-9 页数: 666 定价: 78.00元 章节目录 前言 I 第1部分 C#语言 1 第1章 C#与.NET框架 3 .NET平台 3 .NET框架 4 编译过程与...

    《编译原理》 清华 第二版

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    C#编译原理 ZIP 压缩文件

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

    编译原理及实践 附有目录

    2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到...

Global site tag (gtag.js) - Google Analytics