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

《计算机教育》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.

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Crossin的编程教室

点球小游戏 2

再次说明:一个编程问题会有很多种解法,我给的只是其中一种,而且未必是最好的一种。所以,你尽可去想自己的方法,然后实现它。 我们的点球游戏已经快完成了,现在要做的...

3295
来自专栏Pythonista

面向对象的软件开发

很多人在学完了python的class机制之后,遇到一个生产中的问题,还是会懵逼,这其实太正常了,因为任何程序的开发都是先设计后编程,python的class机...

1172
来自专栏IT大咖说

前端专家聊JS语言家族新成员——R&B

摘要 相信大家对以CoffeeScript、TypeScript为代表的编译到JavaScript的语言已经不陌生。本次分享将介绍 JS 平台语言家族的重要新成...

4018
来自专栏IT派

Python学习路线图

Python上手很容易, 基本有其他语言编程经验的人可以在1周内学会Python最基本的内容.

3970
来自专栏Alan's Lab

JS 变量提升

问到 JS 一些细节问题的时候发挥比较糟糕,有些是知道反应得太慢,有些是压根没接触过,还是积累的太少了。这篇的 JS 变量提升问题就是从没有接触过的,网上一搜一...

2372
来自专栏大数据和云计算技术

Go语言入门

最近准备学点新东西,聊聊Go语言入门。 Go是google 09年推出的编程语言,Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲...

3485
来自专栏中国白客联盟

35行代码实现千万级别字典的快速去重

字典对于一个安全从业者的意义非常重要,尤其是渗透测试工程师,一份好的字典往往能带来意外的收获。 在当前各种裤子满天飞的环境下,快速整理有用信息并加入自己的字典已...

5754
来自专栏牛客网

滴滴java新锐实习一面

1720
来自专栏牛客网

美团点评2019届机器学习/数据挖掘算法实习生一面

3.14网申的(北京,基础研究部门),3.20笔试。二十多天没消息,然后今天(4.12)下午接到美团面试电话,当然是前两天约好的,面试官大概迟到了十多分钟。 Q...

4256
来自专栏数据结构与算法

HDU 2089 不要62

不要62 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个...

28710

扫码关注云+社区

领取腾讯云代金券