陈杰华
(四川大学 计算机学院,四川 成都 610065)
教育部2015 年11 月制定的《大学计算机基础课程教学基本要求》中指出,计算思维是指“从具体的算法设计规范入手,通过算法过程的构造与实施来解决给定问题的一种思维方法。它以设计和构造为特征,以计算机学科为代表。计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类行为的一系列思维活动”。同时,指出Python 程序设计课程的主要目标是“学习问题求解的思路和方法,并利用计算机编程[1]”。为此,应选择计算思维中的计算环境、自动化、抽象、构造、关注点分离、递归、迭代7 个核心概念,结合验证类实验、设计类实验和综合类实验进行实验设计,以强化计算思维能力的训练。
在实验教学过程中,需要有机结合Python的编程技能培养和计算思维能力训练,使学生在掌握编程技能的同时逐步形成计算思维能力。具体指导思想包括:①精心设计实验题目使学生能够运用计算思维,即在一个实验题目中需要学生掌握哪些计算思维方法;②通过精心选择的实验题目和方法训练计算思维;③在实验过程中,教师要引导学生利用计算思维方法进行问题抽象与定义、建立数学模型以及探索求解问题的途径。
程序设计实验可以分为三大类:验证类实验、设计类实验和综合类实验[1],相应计算思维的核心概念应该分别进行专门训练。根据Python语言的特点和计算思维的属性,并将知识学习、能力形成、思维训练三者结合起来,具体的实验设计见表1。
该类实验要求学生理解、验证、巩固并掌握编程的基本知识,能够熟练运用Python 3.7(或以上版本)环境调试程序。
计算思维中的“计算环境”指一个程序运行需要的硬件支持和软件实现[3],主要涉及数据描述、运算机制、符码体系、编程逻辑等。例如,数据部分包含数据类型、存储字节数量、误差处理、存储表示方式及其精度、数值大小及其范围等;运算部分包含算术运算(含整除、求余)、关系运算、逻辑运算、位运算、赋值运算、条件运算、逗号运算、特殊运算(含集合、分式)等;合成符号部分包含关键字、标识符、字面量、表达式等;顺序程序部分包含字面量定义、变量声明、输入输出的函数调用、源程序的结构与编码规范、赋值语句等;流程控制部分包括分支、循环、异常处理、函数调用等。
表1 实验设计及其计算思维训练点
计算思维中的“自动化”体现在算法的机器实现是程序化、机械式、按步骤的自动执行,这是基于冯·诺伊曼机器的本质特征,即存储程序原理。当然要实现自动化操作,就需要进行精确的算法描述(问题求解)和严格的符号表示(编程)。
验证类实验选择两个题目:“求解一元二次方程”和“鸡兔同笼”,涉及数据类型、运算约束、自动化执行、操作时序等计算思维。教师要在实验前布置实验的题目、内容和要求,督促学生提前做好实验准备报告,主要内容包括调试工具、求解算法的流程图、程序清单、初始数据、操作步骤、软硬件环境要求等。实际上,实验准备的好坏直接关系到学生能否形成计算思维和程序调试能力。在实验过程中,教师要严格要求并督促学生,一丝不苟地实现Python 集成环境中的5 步操作:新建编辑窗口、输入源程序、保存文件、执行程序以及验证结果。实验完成后,教师应要求学生写出实验记录,内容包括源程序的机器翻译过程、全部初始数据、运行结果(截图)、调试总结等,使学生深刻理解计算机的“计算环境”和运行过程的“自动化”。
该类实验要求学生通过自主学习或小组合作,掌握实验涉及的知识和编程方法,并正确应用完成“课题”形式的实验题目。
计算思维中的“抽象”[4]体现在编程方面只能使用符号系统甚至形式化语言,例如程序由标识符、数据类型、字面量、变量、表达式、列表名、函数名、语句、程序段等“符号”构成,其中的“标识符”只是抽象化的一个“符号”特例。很遗憾的是,尽管编程语言完全是机器指令的另一种符码体系,并不具有像汉语那样的“自然形成”属性,这就使合理、正确、完备的抽象非常重要。与数学抽象相比,计算思维中的抽象体现在有限性、算法性、确定性、机械性、误差性等方面。
计算思维中的“构造”[5]指使用Python 程序构造求解计算问题的过程,进而使任何计算问题均可有多种求解途径。例如,计算思维中的“关注点分离”[6]就是将一个复杂问题分解成不同的关注点(简单问题)并获取各种求解途径的。
可以通过计算问题的多种求解途径进行计算思维训练。对同一个实验题目,由于学生认知方式的差异必将导致多种求解途径。教师应该尊重学生的个体特征,鼓励学生以不同的视角与方法来分析问题,用多种算法实现问题求解。例如,计算“斐波那契数列”可以分别用“循环结构”“列表运算”“递归函数”实现。
安排实验题目时,要选择具有构造特征的题目,如“数组排序”,要求学生使用3 种(如选择法、冒泡法、插入法、合并法等)以上方法实现。实验辅导时,教师要督促学生尽量使用多种求解途径。教师要确定算法评估标准,让学生按照正确性、可读性、健壮性、复杂性的顺序,从若干算法中选择出最优算法[7]。另外,还要鼓励并提倡学生仔细分析别人的程序,进行评价并改写程序。
通过“关注点分离”原则进行计算思维训练。在实验辅导时,教师要督促学生将一个实验题目分解成若干个子(小)题目,然后再将每个子题目进一步分解成一系列更小的子题目,直到由Python 语句实现为止。以使用列表“计算斐波那契数列”为例,对应的关注点分离过程见表2。
表2 使用列表“计算斐波那契数列”的关注点分离过程
实验辅导时,教师要督促学生尽量进行多次的关注点分离,直到问题得到求解途径时为止。在多次分离过程中,让学生体验像抽象、分解、重用、数据组织、冗余、容错、局部等计算思维概念。在学生不能获得完全正确的求解途径时,教师应该加以适当指导。
该类实验重在培养学生提出问题、分析问题和解决问题的综合能力,学生可以自选题目。
计算思维中的“递归”指函数通过直接或间接调用自身,将一个大型复杂问题转化为一个与原问题相似的小型简单问题来进行求解,从而提高编程效率,通常递归包含边界条件、递归前进和递归返回3 部分[8]。计算思维中的“迭代”通常通过重复计算来逼近所需的目标或结果,每一次对计算的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,最终逼近正确结果[9]。
递归实验选择两个题目:“数字串的逆序显示”和“Hanoi 塔问题”。在实验时要求学生进行“冗余”编程,让计算机呈现实现递归的过程,显示全部中间结果,同时要求学生在实验报告中书写出计算过程。让学生从中体会到递归是如何通过多次调用选择结构的函数实现的,从而实现“分而治之”策略。
迭代实验选择两个题目:“牛顿迭代法”和“无穷级数求和”。在实验时要求学生进行“冗余”编程,让计算机呈现实现迭代的过程,显示逐次(至少20 次)逼近最终结果的数据变化情况,同时要求学生在实验报告中记录“迭代”过程。让学生从中体会到迭代是如何收敛的、计算机是如何处理误差的计算思维。
教师在对实验效果进行考核时,要将重点放到提高学生的计算思维与编程能力方面。考核指标包括9 部分:实验准备、考勤、实验态度、熟练程度、调试能力、计算思维能力、完成情况、师生互动、总结文档等,每项指标的权重值可由教师酌情处理。其中,指标“计算思维能力”的权重值要超过0.3,主要内容包括:①对上述核心概念的理解程度;②利用计算思维编程的能力;③利用计算思维调试程序的能力。指标“总结文档”的权重值要超过0.2,以便考核学生用文字表达计算思维的实现过程。
2006 年3 月周以真首次对计算思维进行新颖、全面、明确的描述[10],提出计算思维是每一个人都必须具备的能力,如同阅读、书写、计算一样。在众多计算机课程中,无疑程序设计课程对训练计算思维是最佳的。更无疑的是,Python程序设计课程不只是学习编程,重要的是让学生具有“像计算机科学家那样思维”的能力以及在进行问题求解、系统设计、人类行为理解时能够运用计算思维。正如计算机无处不在,计算思维也是无处不在[11],如管理海量数据、构建互联网络、模拟复杂系统、组织大型工程等。若学生具备计算思维能力,则必将从中体会到计算的愉悦和创造的满足。