陈建文
(哈尔滨工业大学计算机科学与技术学院,黑龙江哈尔滨150001)
前耶鲁大学校长理查德·莱文在谈到大学教育的本质时曾指出:“大学教育的目的不是传授知识和技能,却能够让人胜任任何学科和职业。”在莱文看来,大学教育的核心在通识。目前,程序设计课程已经成为当代大学生最重要的通识类课程之一。这就提出了一个问题:程序设计课程的教学目的是什么?是传授知识,还是传授技能?笔者认为,这两者都不是程序设计课程的目的所在。正如乔布斯所说,学习编程教会一个人如何思考,每个人都应该学习一门编程语言。笔者认为,程序设计课程教学目的之核心在于教会大学生如何思考,就像学习《几何原本》一样,学习程序设计的目的是提升思维能力。
精心设计好课程的逻辑组织,使学生在学习的过程中真正体会到C语言的逻辑之美,是提升学生思维能力的必要前提。
《几何原本》对包括牛顿、爱因斯坦等一大批的科学家产生了深远的影响,主要是源于其逻辑体系的构建。目前,学生在进入大学之前虽然学习了几何学的内容,但很少有学生能够领略《几何原本》中逻辑体系的思想,其主要原因是中学时期学生的逻辑思维能力还不够成熟。大学一年级恰恰是训练大学生思维能力的最佳时期。程序设计课程在提升大学生的思维能力方面发挥着重要的作用。
文献[1]中所确立的授课内容的逻辑组织仍然是程序设计课程中内容逻辑组织的最佳范本。笔者在此基础上稍加修改,使之更适合初学者,修改后的教学内容如下:
第一部分:初识C语言;
第二部分:数据类型、运算符和表达式;
第三部分:控制流语句;
第四部分:函数与程序结构;
第五部分:数组;
第六部分:指针;
第七部分:结构体;
第八部分:文件输入输出。
《几何原本》在5条公理的基础上推导出整个欧式几何学所有的定理,这种逻辑体系的思想在C语言中也得到很好的展现。通过课程内容的逻辑组织,学生认识到C语言在很少语法规则的基础上却能够描述丰富的程序逻辑,是提升学生思维能力的关键所在。学习知识并不是程序设计课程的关键,学会利用有限的知识解决复杂的问题才是程序设计课程的关键所在,也是提升大学生思维能力的关键所在。例如,关于函数的参数传递,不同的教科书中有按值传递、数组作为函数参数、按地址传递等不同的说法。然而,用C语言原作者的话说,C语言只支持按值传递一种参数传递方式。在这个问题上,在课程的内容组织上让学生理解C语言只支持按值传递,只通过按值传递一种参数传递方式就能够实现丰富多样的参数传递功能,才能准确地把握C语言参数传递的本质。在这个过程中,逻辑发挥着至关重要的作用。再比如,指针是C程序设计语言的难点,在指针这一部分,让学生首先把握指针变量是用来存放变量地址的变量这个基本概念,然后把握如何访问一个变量的地址、如何通过指针变量访问它所指向的变量这些有限的语法规则,就可以表达丰富的程序逻辑,并在此基础上理清指针与数组、指针与字符串的关系。理清各个语法规则的逻辑关系,是把握指针这一部分的关键所在,也是提升学生思维能力的关键所在。
C语言的成功与其清晰的逻辑表达是分不开的。理清程序设计课程各个部分的逻辑关系,是利用有限的学时使学生把握程序设计的本质、提升思维能力的关键所在。
(4)创客敢于实践。实践是检验真理的唯一标准,只有将自身想法付诸于行动,并用实践行动来检验自身的想法是否正确,这样的一类人才能成为创客。
选取好的代码实例,使学生在阅读规范的C语言代码过程中真正领略到C语言代码的逻辑之美,可以使学生的思维能力在理解代码的过程中得到最有效的训练。
南宋理学家朱熹曾说:“模拟者,古人用功之法。读得韩文熟,便做韩文的文法;读得苏文熟,便做苏文的文法。”可见,模仿是学习的重要手段。许多学生大学学习了C语言程序设计之后,仍然不会写程序,最主要的原因是缺少模仿规范的C语言代码的环节。我们在讲解具体的语法规则时,用了一些小的示例代码。例如,在讲解循环结构时,用了银行等额本息和等额本金的利息计算示例。我们发现,借助于这些小的示例代码把握C语言的语法规则之后,在课堂上与学生共同阅读一个完整、规范的C语言程序,是教会学生写程序的最关键的一个环节。我们选取了文献[2]中简单线性回归的源代码与学生一起在课堂上阅读。通过阅读代码,学生对于如何利用C语言的语法规则构建一个完整的应用程序有了很好的把握。我们还推荐学生课后自己阅读文献[2]中方程求根、函数求极值、排序等方面的源代码。在阅读这些代码的过程中,学生对如何将正在学习的线性代数、微积分等课程的理论转变成解决现实问题的程序有了深刻的理解。
模仿规范的代码之后,我们指导学生用C语言实现了稳定婚姻匹配问题[3]。在利用C语言实现稳定婚姻匹配算法的过程中,用到数组、指针甚至链表等知识点,使学生在模仿他人代码的基础上体会到自己编写程序解决问题的乐趣,在不知不觉中提升思维能力。此外,我们还讲解了PageRank算法[4]的原理,与学生一起对如何用C语言表达PageRank算法的逻辑进行探讨和程序示范,使得学生对如何利用C语言表达搜索引擎的程序逻辑有了深刻的理解,也让学生理解了Google、百度等搜索引擎的本质。
MOOC教学与SPOC教学是课堂教学的有力补充。MOOC指的是MassiveOpenOnline Course,对全社会开放;SPOC指的是Small PrivateOnlineCourse,仅对本校学生开放。理清课堂教学和MOOC教学与SPOC教学的关系,充分发挥各自的优势,是利用好MOOC教学与SPOC教学的关键。课堂教学的优势在于便于与学生交流互动,MOOC教学的优势在于学生可以根据自身的学习情况适时安排和控制学习,SPOC教学的优势在于学生在看视频短片时可以自主选择停下来思考,没看懂的可以倒退反复观看;同时,MOOC教学与SPOC教学的课程内容可以永久存档,方便随时复习。
MOOC教学的逻辑组织与课堂教学的逻辑组织是相对独立的。课堂教学自成体系,MOOC教学也是自成体系,两者可以分开来学,又可以相互补充。对于课堂上需要扩展的知识点,则是通过视频短片的形式放在SPOC中供大家课后进一步学习。
翻转课堂教学是提高学生学习积极性的重要手段。每名学生在课程的最后都需要用C语言做一个项目,撰写实验报告,并且在课堂上与大家分享自己所做的项目及心得体会。对于所做的项目内容没有任何限制,每名学生都可以自由选取。事实证明,对项目的内容不加限制是正确的,这给了学生最大的发挥空间。
有名学生给笔者发邮件说:“老师您好,我的实验大作业是一个帮助妈妈理账的小程序,希望能够有机会参加翻转课堂,和大家分享我的程序。”有的学生做的是关于航道规划的程序。学生在利用C语言解决一个实际问题的过程中,会积极与老师和同学交流以解决所遇到的困难,并精心准备在同学面前的展示。每名学生的思维都在这个从开始着手解决问题到最后在同学面前展示自己成果的过程中得到了升华。
著名作家、思想家列夫·尼古拉耶维奇·托尔斯泰曾说:“知识,只有当它靠积极的思维得来,而不是凭记忆得来的时候,才是真正的知识。”C语言程序设计本身的特殊性能够为学生思维的训练提供有利的前提和基础。学生在利用C语言解决自己感兴趣的实际问题的过程中,可以真正理解C语言的全貌,体会C语言的魅力,提高自主探究的思维。翻转课堂可以全面提升课堂上老师与学生之间、学生与学生之间的交流互动。每名学生都可以站在讲台上分享自己的程序,在从自己会到给其他同学讲明白的过程中,其分析、综合、论证的逻辑思维和表达能力得到很大的提高;作为听众的其他同学则通过翻转课堂看到主讲人身上的优点。孔子云:“三人行,必有我师焉。”传统教学中是讲台上的一位老师,而翻转课堂则让每名学生都可以贡献智慧并成为别人的老师。
程序设计课程的教学目的不仅仅是让学生掌握一门程序设计语言的语法规则,而是培养学生利用程序设计语言解决问题的能力,教会学生如何思考。最后,每名学生能够利用C语言解决一个实际的问题,并在课堂上与大家分享,又能够聆听其他同学的经验,取长补短。因此,翻转课堂是实现教学目标的核心环节。在实现这个环节的过程中,也有学生提出问题。例如,针对每名学生自己选择的项目,具体的评分细则是怎样的?许多学生已经适应了传统的考核方法——预先设计好项目由学生实现,实现项目相应的功能就给相应的分数。笔者认为,由学生按照自己的兴趣选择项目,能够更好地发挥其想象力,选题的过程本身也是一个思考的过程。
翻转课堂的结果表明,不同的学生选择不同的项目,会更大地激发学习热情。与由老师指定固定的项目相比,学生可以真正体会到利用C语言简单的语法规则解决多种多样问题的奥妙,这才是程序设计课程给予的真正的启示。关于评分,考试占50%,平时的程序作业占25%,最后的项目和课堂翻转占25%,其中项目的代码部分由老师给出评价,占15%,课堂翻转的成绩由学生投票决定,占10%。关于如何合理设计最后的项目和课堂翻转部分的分数比例及其评分细则,仍然是一个值得思考和探讨的问题。
《几何原本》在一系列公理的基础之上建立了整个欧式几何的逻辑体系,给予我们每个人严密的逻辑思维;程序设计课程在一系列基本语法规则的基础上表达丰富的程序逻辑,同样可以培养当代大学生严密的逻辑思维能力。让当代大学生通过程序设计课程的学习提升自己的思维能力,是我们每名讲授程序设计课程的教师共同努力的目标。
[1] Kernighan B W, Ritchie D M. The C programming language[M]. 北京: 机械工业出版社, 2006.
[2] GNU. GSL-GNU scientific library[EB/OL]. [2017-08-04]. http://www.gnu.org/software/gsl/.
[3] Gale D, Shapley L S. College admissions and the stability of marriage[J]. The American Mathematical Monthly, 1962, 69(1): 9-15.
[4] Brin S, Page L. The anatomy of a large–scale hypertextual web search engine[C]//Proc. of the 7th International World Wide Web Conference. New York: ACM, 1999: 107-117.