前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >器—术—道:程序设计教材建设经验谈

器—术—道:程序设计教材建设经验谈

作者头像
企鹅号小编
发布2018-01-31 11:24:01
6340
发布2018-01-31 11:24:01
举报
文章被收录于专栏:编程

《计算机教育》2017年第11期 封面文章

引 言

程序设计的境界有3种:器—术—道。在程序设计能力培养方面,一般由“器”入门,通过熟悉“术”,最终达到“道”的境界。在编写程序设计教材的时候,要注意这3个层次的内容安排,并注意它们之间的过渡。

1

编程中的“器术道”

1.1 编程中的“器”

《易经》曰“形而下者谓之器”,说得通俗一些,“器”就是具体工具。在编程中,“器”首先指编程语言,如Java、C/C++。“器”的另一层意思是具体特性。要学好一门语言,首先要掌握语言的基本特性,如选择、循环、函数等;其次要掌握好这门语言的独特特性,如指针操作之于C。“器”的第三层意思是具体的开发和调试工具。学任何语言的时候,初学者都要熟练掌握一种开发和调试工具,如C/C++编程,在Linux下要学会使用GDB调试,在Windows下,要会使用Visual Studio或者其他工具开发。

1.2 编程中的“术”

“术”是中国古人对技艺、技巧、技能的一个称谓,比如武术。“术”强调的是应用,是对“器”非常熟练基础上的灵活运用。

在编程中,“术”对应套路、思路和算法。比如,在C文件编程中,要把一个二进制文件中的某些记录删除,直观的做法是:逐个记录扫描,如果记录需要删除,则将后面的记录往前挪动。两种常见的套路是:创建一个新的文件,将需要保留的数据复制到新文件中,需要删除的记录则跳过,最后将旧文件删除,将新文件重命名为旧文件,这种删除套路称为硬删除;软删除,不真正地删除记录,而是标上记号。这两种套路各有优缺点,需要灵活选用。再比如,在一个应用中如果需要将商品按照销量排序,那么需要用到某种排序算法;如果经常需要排序的话,需要考虑用某种数据结构,如B树、堆等。

1.3 编程中的“道”

《易经》说“形而上者谓之道”,也就是说,“道”是对事物蕴含思想、哲理的反思。掌握了编程之“道”的人,看透了编程工具和语言背后的差别,不再执着于某种工具和语言,通常谈论的是架构、设计模式、框架、抽象、分解等概念。如果要用一个简单的词语概括编程中的“道”,那就是常说的“计算思维”[1]。

举两个简单的例子说明“道”和“术”在编程上的区别。对于二分查找算法,得“术”者看到的是这个算法的运用前提(数据存储在线性表中且有序)、算法的基本思路等,而得“道”者看到的是这个算法背后的分治思想;当应用某一种框架的时候,得“术”者看到的是这个框架的组成、交互方式等,得“道”者看到的是这个框架背后的思维,如模型、视图和控制相分离的原则。

2

编程中的“器术道”在程序设计教材中的体现

面向初学者的程序设计课程的目标,是让学生掌握“器”,熟悉“术”,并引导他们感悟“道”。

2.1 夯实编程之“器”

C程序设计是一门非常基础的课程,在“器”这个层面上,必须要掌握两部分:一是C语言的知识点;二是C语言的开发和调试工具。

大部分教材介绍C语言知识点的时候,把这些知识点分割成若干个条块。一种常见的知识点划分见图1,其中虚线框部分可以并列,其先后顺序比较随意。

这种条块式结构的优点是:结构清晰,方便教学。学校的教学实践,初期也采取这种教学模式,但是在实践中发现,这种条块式结构存在以下不足:

(1)知识点之间的渗透不够。

(2)教学初期的例子比较简单、单调。

(3)学生的综合训练比较少。

考虑到这些问题,笔者采取一种新的层级式结构:先介绍C语言的内核,再系统地介绍C语言知识点,这个内核包含的内容如下。

C程序的构成;

最常见的数据类型:int、float和double、char 4种基本数据类型;

输入输出:printf和scanf函数(只介绍常用的格式控制符);

常量和变量的概念;

运算符与表达式:算术运算符、关系运算符、逻辑运算符、赋值运算符;

语句:简单语句、语句块、if语句、for语句、while语句;

函数调用。

在此基础上,系统地介绍C语言的知识点。按照顺序分别是:数据类型与输入输出、运算符与表达式、分支结构、循环结构、函数、指针与数组、C程序运行原理、结构体、文件和其他。在这些章节中,有几个部分值得特别介绍。

(1)数据类型与输入输出。这一部分与其他教材差别很大。除了基本数据类型及其输入和输出,也介绍了:

数组、字符串及其输入输出。这里介绍了数组是如何创建、初始化和遍历的(用for、while语句),还介绍了puts、gets等常见的字符串输入和输出函数,但没有直接引入指针的概念。

文本文件输入输出,包括fscanf和fprintf两个格式化输入输出函数。

(2)循环结构。在介绍循环结构的时候,引入了选择排序、冒泡排序、杨辉三角、字符串单词统计、文本文件字符统计等例子,一方面让学生更好地掌握复杂的循环结构,另一方面加强了知识点的融合,扩大了知识面。

(3)C程序运行原理。这一章包含了所有系统底层的介绍,包括计算机的存储器体系结构、程序的内存布局、变量的存储类型等。这一章的目的是更好地培养学生的系统观。

(4)文件。由于在前面章节中已经对文本文件的读写操作进行了很多演练,因此这一章主要围绕二进制文件的读写进行。特别地介绍了二进制文件记录的读、写、删、查等操作场景。通过这些例子,可以让学生更熟悉文件操作,也更侧重实际应用。

通过这样的安排,不仅加强了知识点之间的融合,而且大大提高了例题的多样性,还可以在教学过程中安排更多的综合训练,比如文本文件处理。

另一方面,“器”还强调对工具的使用,这里最主要的是调试工具。笔者在教材中安排一章介绍常见开发环境的使用(介绍了Visual Studio Community和Code::Blocks),可以帮助初学者掌握调试技巧。

2.2 提炼编程之“术”

程序设计中的“术”就是应用基本的程序设计知识点解决问题的模式[2]、套路和算法。因此,它是知识点的综合应用,是一些解决问题的有效思路。为了让学生尽快熟悉编程之术,在教材中采取了以下策略。

(1)精选例题,从例题中引申出编程之术。笔者安排了综合性、有代表性的例子,例如在循环结构这一章,介绍了选择排序和冒泡排序两种排序算法;在函数这一章,安排了输出日历以及简单四则运算的例子,通过分析这些问题,学生可以学习到程序分解的过程以及关于日期的操作;在结构体这一章,介绍了基于链表的学生学籍信息管理实例,让学生掌握与记录操作相关的套路;在文件这一章,展示了如何从二进制文件中删除满足某些条件的记录的思路。

(2)注重总结,提炼出编程之术。初学者往往不善于总结,因此教材中加入了大量的总结和提炼。首先,每一章结束后都有本章小结,对本章的知识点、常见套路和算法进行了总结。其次,在一些代表性的例题后面,对例题中的关键算法进行了总结。第三,介绍一些知识点的时候,顺便介绍该知识点相关的常见套路。例如介绍了字符之后,总结大小写字符之间的转换等;在介绍浮点数的时候,提醒浮点数比较的注意事项;在介绍循环结构的时候,提炼穷举算法的思想和注意事项;在讲解递归函数调用的时候,总结递归这一技巧应用的要点。

(3)及时训练,巩固编程之术。在习题和实验中,设计了相关题目,要求学生及时应用学到的套路和算法。

在编程实践中,还有大量与编程风格和编程效率有关的经验和技巧,这些也属于“术”的范畴。这些内容在教材中的8个“编程实践”章节中有所涉及,如代码风格、命名、程序计时、软件测试、实用字符串处理、程序设计与操作系统、中文处理等。这8个章节的内容可以扩大学生的知识面,激发学生的兴趣。在实际教学中,这8个章节不一定由教师讲授,完全可以让学生自学。

2.3 感悟编程之“道”

对初学者来说,编程之“道”,或者说计算思维,往往比较抽象,难以理解。因此,需要对学生加以引导和点化。本教材中,很多地方都点出了程序背后的“道”。

(1)专门开辟了一个章节“复杂问题的求解算法”,介绍了很多面向问题求解的思想,如分治、贪心、动态规划和回溯。对于每种思想,描述了其思维模式,指出其应用范围和优缺点,并给出多个例子演示其应用。这样,对于这些抽象思想,学生就有了比较感性的认识。

(2)在介绍知识点的时候适时点化。比如,缓存的思想在计算机硬件和软件中经常用到。教材在介绍计算机存储体系的时候,不是直接介绍这些存储器,而是把内存看作CPU和磁盘之间的缓存,L2 cache看作CPU和内存之间的缓存,L1 cache又是CPU和L2 cache之间的高速缓存。最后,指出其中存在缓存思路的反复应用:为了弥补高速处理器和低速存储器之间的速度差异,可以在它们之间插入一个更小但更快的存储器,换句话说,中间存储器是低速存储器的高速缓存。

类似这样的例子还有很多。通过这些例子,点出一些典型的计算思维,也许学生不一定马上就能够应用这些思维解决问题,但是可以引导学生从一个更高的角度看待问题,这对学生理解程序设计的本质和计算机系统无疑是有巨大帮助的。

当然,真正让学生感悟这些“道”,还需要教师在教学过程中的引导。

3

教材结构

教材《C程序设计:方法与实践》[3](以下简称本教材)的前身是2009年出版的《C语言与程序设计方法》第1版[4]和第2版[5]。在本教材正式出版之前,初稿于2015—2016年在本校试用了两年,并根据反馈意见进行了修改、定稿,最后由清华大学出版社于2017年5月出版。

3.1 教材的章节内容

本教材的章节目录和内容见表1。

与现有教材相比,本教材在结构上有所突破,在内容组织上有所创新,精选了例题,并强调工程化和规范化的开发,这些在前面都已提到,此处不再重复。

3.2 教材的辅助资源

为了配合这本教材的使用,笔者在书中安排了9个实验,其中每个实验包含了若干个实验项目。每个实验经过精心设计,题目类型多样,可以有效地巩固所学内容。

另外,为了方便教师教学,教材编写组精心准备了前13章的教学课件,该教学课件是作者教学中使用并若干次修改和增补而来,内容非常丰富,可以直接用于教学。

4

结 语

在本教材出版之前,笔者在教学实践中一直在思考和尝试,进行了一系列的教学改革。本教材的出版是笔者的教学成果之一。跟本教材配套,笔者在教学方法上进行了一系列的调整,如实施了翻转教学、加大了实践训练的力度等。实践证明,围绕这一教材展开的教学改革有明显成效,学生的学习兴趣明显提升,实践动手能力有大的改进。

参考文献:

[1] Wing J M. Computational thinking [J]. Communications of the ACM, 2006, 49(3): 33-35.

[2] 张俊, 张彦铎. 模式在程序设计教学中的应用[J]. 计算机教育, 2010(3): 108-111.

[3] 刘喜平, 万常选, 舒蔚. C程序设计: 方法与实践[M]. 北京: 清华大学出版社, 2017.

[4] 万常选, 舒蔚, 骆斯文. C语言与程序设计方法[M]. 北京: 科学出版社, 2005.

[5] 万常选, 舒蔚, 骆斯文. C语言与程序设计方法[M]. 2版. 北京:科学出版社, 2009.

本文来自企鹅号 - 计算机教育媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 计算机教育媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档