0 引 言
面对创新人才和高级工程技术人员需求急剧上升的形势,我国 2016 年加入《华盛顿协议》成为正式成员, 2018 年教育部等部门联合发布《关于加快建设发展新工科实施卓越工程师教育培养计划 2.0 的意见》提出高校建设目标、改革任务和重点举措,强调“树立工程教育新理念”“着力提升学生解决复杂工程问题的能力”。在中国工程教育专业认证工作中也明确了,本科工程教育的教学过程要以“培养解决复杂工程问题能力”为导向,把“能够针对复杂工程问题,开发、选择与使用恰当的技术、资源、现代工程工具和信息技术工具”作为本科生毕业要求。
1 计算思维与解决复杂工程问题能力
工程教育强调培养、提高学生解决复杂工程问题的能力,该能力在计算机应用中体现为具有分析性、创造性和系统性特征的计算思维能力。计算思维能够帮助学生获得沟通和协作、抽象和迁移等解决复杂问题的能力,促进其理解如何使用计算过程或结构方法来解决不同领域的问题 [1]。
计算思维与解决复杂工程问题能力的培养密切相关。Wing 将计算思维定义为使用处理信息的智能体解决复杂问题所需的一组思维技能、习惯或方法,广泛适用于当前的信息社会 [2]。2008年,她进一步指出计算思维是一种分析思维,在问题解决的不同阶段会用到数学思维,在设计和评价复杂系统时会用到工程思维,在理解概念时会用到科学思维 [3]。计算思维不是要让人类像计算机那样思考,而是多种思维的综合应用,涉及一些解决复杂问题所必需的思维技能,包括抽象和分解、递归、问题减少和转换、纠错以及启发式推理等。
2011 年,美国国际教育技术协会(ISTE)与美国计算机科学教师协会(CSTA)联合发布,计算思维解决问题的过程具有几个特征,包括制订问题并利用计算机和其他工具来解决该问题;合理组织和分析数据;通过模型和仿真等抽象形式表示数据;通过算法思维(一系列有序步骤)实现解决方案的自动化;确定、分析和实施可行的解决方案,实现最有效的过程和资源组合;将问题解决过程推广转化到其他各种各样的问题。与这些特征相关联的有 6 个过程要素,即提出问题、组织和分析问题、表征数据、自动化解决方案、分析和实施解决方案、迁移;9 项核心概念和能力:数据收集、数据分析、数据表征、问题分解、抽象、算法和程序、自动化、模拟、并行化。程序设计是给出解决特定问题程序的过程,包括分析、设计、编码、测试、排错等不同阶段。程序设计过程与应用计算思维解决问题的过程高度重合,程序设计课程是培养和应用计算思维的一门重要课程。
2 应用计算思维解决复杂工程问题能力培养教学设计
传统的程序设计课程内容大多局限于程序设计语法应用,教学各个章节中的知识点与简单的计算过程相对应,缺乏系统性和工程应用,课程结构和设计与具体的实际工程问题问题无法建立关联,不能达到解决复杂工程问题能力培养的要求。
在教学改革中,将教学目标定位在培养学生应用工程思维和计算思维进行算法设计,并能够将习得的思维迁移到解决其他复杂工程问题的过程中。教学设计强调算法和工程两种思维,将程序设计过程提升到计算思维应用层次,分解到程序设计的各个环节中。设计思路如图 1 所示,一是工程思维建立和应用,教学中强化工程问题建模环节,引导学生分解、构造问题,实现对问题的描述及数据处理;二是算法思维建立和应用,应用算法思维进行逻辑分析、抽象、分解,一步步设计算法,然后将相关算法转换成可测试和评估的代码,形成形式化描述。
教学实践中,整个过程不是一个从工程问题建模开始到程序结束的简单直线顺序过程,而是存在从程序到工程任务建模的反向思考和修正,是一个循环迭代过程。在这个迭代过程中,思维模式识别非常重要,每个环节的工程思维和算法思维应用方法和技能都须总结归纳,形成应用习惯,以迁移形成其他复杂工程问题解决方案。
2.1 算法思维培养
算法思维体现为用系统的方法描述解决问题的策略机制,其中有两个基本要素:对数据的运算和操作;程序的控制结构,指令运算或操作之间的顺序。指令运行时能从一个初始状态或初始输入开始,经过有限而清晰定义的一系列状态,最终停止于一个终态并产生输出。语法、控制逻辑规则是算法思维的组成部分,也是程序设计课程的重要内容,教学中既要强调程序设计基础知识,又要强调算法思维的使用及推理过程。
符号化程序设计代码描述的计算机运行和思维过程是抽象的,初学程序设计的学生对于抽象的代码符号与程序执行的过程、算法思维的动态过程以及计算机执行代码过程中内存数据的变化一致性关系理解很困难。此外,算法是思维流动过程,与文本形式的代码静态描述形成反差,使其中应用的计算思维隐式而抽象。如何简单、清晰地表述计算思维,以便让学生更好地理解和内化,一直是很多一线教师在教学设计时考虑的关键问题。
近年来数字可视化技术得到国内外学者和教育界的广泛关注,也被引入程序设计课程教学。研究内容包括思维可视化 [4]、教学设计可视化 [5]等方面。研究表明可视化技术对于学生理解掌握程序设计相关知识、明确算法思路、学会在实践中应用经典算法、形成思维习惯等都有很大帮助。根据要解决的问题,可以选择恰当的可视化方法和工具,以图形或动画改变思维表现形式,可以提高教学效果和学生学习效率。根据程序设计可视化工具的表现形式可以分为静态和动态两类。
(1)静态可视化工具。开发环境是程序设计课程必须要使用的教学工具,很多集成开发环境本身具有图形化功能,充分利用此类功能可以将隐式的计算思维可视化呈现。例如, VisualStudio 中的类图、 Codeblocks 中的流程图等,其特点是与程序代码关联,是对程序代码结构整体性的精确图解,有助于明确语句、对象、变量等代码要素之间的关系,便于学生理解语言的语法规则。
(2)动态可视化工具。随着计算机软件设计的普及,许多用来解释和分析代码运行的计算机专用软件出现在程序设计教学中,这些软件通常不依赖某一门语言,通过拖曳的方式实现程序模块搭建,操作简单、直观形象,其中快速算法原型工具 Raptor[6] 是在 NET Framework 中运行的免费流程图软件包,利用其中的“开始”和“结束”符号,可以将 6 个流程图符号 / 结构中的任何一个拖到编辑区域,形成图形化的“程序”,并可以转换形成 C++, Java, C# 等多种语言的代码,比较适合本科生的程序设计课程。
近几年很多编程可视化网站被应用在程序设计教学中。Vcode EXE 是代码执行过程的可视化工具,可以逐条执行语句,动态展示过程中的内存结构变化,方便观察代码语句中变量或对象与内存数据的对应关系,通过视觉引领强化记忆和理解;Visualgo 可以动画展示大量算法设计思想,在网页右下角可以高亮显示当前动画的代码逻辑,生动展示计算机执行过程。
2.2 工程思维培养
工程思维是与人的工程实践相关联的思维活动,工程实践的多样性决定了工程思维也是复杂纷繁的。工程思维将所有待处理问题视为一个系统,系统模块之间的关系形成一个整体,系统内部都是相互联系的。工程思维核心是模块化系统思维,是技术和原则的有机组合。GuruMadhavan 提出工程思维应用的 3 个特征 [7]:能够看到隐藏在整体表象下的内部结构;擅长在约束下进行设计;依据约束的权衡取舍。
复杂工程问题是具有工程特点的复杂问题,必须依赖计算思维的子集,即工程思维来处理。一般来说,计算思维过程是抽象、分解与组合。Wing 解读“抽象”为忽略所有不相关的复杂细节,而只专注于问题关键部分;“分解”即将问题分割成一个个小的部分,将这些小部分各个击破;最终通过“组合”将各部分重整起来,形成一个针对原问题的解决方案。整个过程充分体现了工程思维的特征,程序设计的流程步骤中渗透工程思维是应用计算思维解决复杂工程问题的必要条件。
2.3 思维应用步骤化
教学中立足于计算思维应用,结合具体的工程问题,强调解题过程的算法思维和工程思维,设计规范的程序设计解题步骤,可以避免学生遇到实际问题无从下手,具体步骤包括:①问题描述;②输入 / 输出描述;③人工计算一个实例;④图示伪码实例;⑤算法设计;⑥代码编写;⑦代码测试。其中,步骤①对工程任务理解和分析,步骤②完成对问题的规划,也是程序设计 IPO 过程中的开始环节,这两步要应用工程思维,将问题作权衡和取舍,符合计算机资源分配和运算规则;步骤③要考虑语言实现的限制,例如过程设计中的函数,面向对象设计中的类、继承、多态等更复杂的系统结构设计,工程思维必不可少;步骤④⑤是程序算法设计,须应用计算思维进行算法分析和设计,是工程思维与算法思维结合的关键关键环节,要应用多种教学方法强化算法思维的建立与应用;步骤⑥⑦用来衡量设计的有效性,在反复测试中,对前面设计的循环式修改是必不可少的,包括代码验证和算法验证,体现出工程的实践性和应用性分析,也是计算思维中评测特征的体现。
上述步骤是教学流程设计的依据,课上教师据此设计案例,课下学生据此解题。同样,这也是循环迭代、修改完善的过程,实际应用中不要求全部经历,可根据实际问题进行裁剪,唯一目的就是各环节可用并有效解决问题。
3 教学实践案例设计
2021 年,笔者分别联系了本校 12 个开设非计算机专业程序设计课程的学院,与相关专业教师和学生探讨了 4 门程序设计课程(C、 C++、Java、 C#)教学存在的问题。教师的反馈集中在学生的程序设计知识不能为专业课提供支撑,遇到专业问题不能很好地应用程序设计思想解决;学生则普遍认为学习过程中程序设计仅基于简单数学公式或模型,一旦遇到专业和实际问题无法形成处理思路。这些问题的解决,正是应用计算思维培养解决复杂工程问题能力的教学设计的初衷。
递归算法与迭代算法在算法和程序设计中应用非常广泛,是计算思维的重要内容,但对于初学者来说,一开始往往难以理解。其中,斐波那契数列计算输出是一个经典案例,通常在授课时教师是从数列的数学定义开始,忽略前面的建模过程,而解决实际工程问题时,这个过程正是困扰学生的难点。
教学设计从走楼梯的实际问题开始:假设一个人住在 2 楼,每次回家都要经过一个 10 级台阶的楼梯,每次可以选择一步走 1 级或 2 级台阶,从楼下到家一共有多少种走法?教学目标是使学生初步掌握动态规划策略思想和工程应用,对比分析理解递归和迭代算法。教学方法采用问题式、探究式和可视化形式。依据程序设计解题步骤的教学流程设计见表 1。
课前,教师提出问题,本案例中是走楼梯问题;学生查找资料,尝试建立数学模型或解题思路。教师适当给出教学提示作为思维引导,引导学生建立 N 级台阶的数学模型;同时布置预习作业,利用 Visualgo 演示迭代和递归算法,使学生建立对课程内容的初步印象。
课中,教学由两个部分组成:一是讨论课前建模问题。教师总结工程思维应用,包括分解问题结构、确定题目的工程约束条件、形成计算斐波那契数列问题、使用可视化工具 Raptor 绘制流程图并运行,帮助学生理解程序设计语言和代码构成的形式化描述方法;学生参与讨论,手算一次输入的计算结果,理解教师给出的求解流程。二是算法设计。教师通过 Visualgo 动态生成的递归分解树型结构,讲解递归各子过程的形成,纠正学生课前的理解误区,对比分析递归与迭代两种算法的优缺点;学生动手编写代码实现算法,运行调试分析测试,利用 Vcode Exe 网站逐行分步执行程序,观察每行语句对应内存数据的变化,使视觉引领性的记忆更为深刻。
课后,教师布置作业题目“分别使用牛顿迭代法和二分法求平方根”,这是工程中常用的线性问题求解方法,要求学生按照课上的步骤写出报告阐述理解过程。学生总结课上形成的思维模式,遵循设计步骤①—⑦完成作业,完成思维模式迁移。
4 结 语
教学实践中,使用可视化工具将抽象的代码和算法思想直观展现,能够提高学生兴趣,减少畏难情绪,实现知识掌握、思维建立和能力提升。建立程序设计解题步骤,从实际工程问题开始,帮助学生在程序设计中引入和应用计算思维。在课程大作业中,布置线性方程组求解问题考查对迭代法的掌握,结果显示在题目描述的引导下学生能够考虑使用迭代法实现建模求解,少数学生尝试了雅可比迭代法、高斯 - 赛德尔迭代法和逐次超松弛迭代法的编程实现,表明通过教学设计提高了学生应用计算思维的意识和解决复杂工程问题能力。
参考文献:
[1] Barr V, Stephenson C. Bringing computational thinking to K-12: What is involved and what is the role of the computer science education community? [J]. ACM Inroads, 2011, 2(1): 48-54.
[2] Wing J M. Computational thinking[J]. Communications of the ACM, 2006, 49(3): 33-35.
[3] Wing J M. Computational thinking and thinking[J]. Philosophical Transactions of the Royal Society A Mathematical Physical & Engineering Sciences, 2008, 366(1881): 1.
[4] 刘杰, 李金玲, 陈星, 等. 思维可视化技术在程序设计教学中的应用研究[J]. 高教学刊, 2020(20): 107-109, 113.
[5] 张开利. 试论当前高校Java语言可视化程序设计教学中存在的问题[J]. 中国管理信息化, 2021, 24(12): 221-222.
[6] 程向前. 基于流程图的可视化程序设计环境对大学计算机基础教学的影响[J]. 计算机教育, 2012(14): 56-59.
[7] Guru M. Applied minds: How engineers think[M]. New York: W.W.Norton Company, 2015: 23-26.
基金项目:北京科技大学教育教学改革与研究项目(JG2020M32,JG2019ZD02,KC2019TS02,KC2019TS01,JG2020Z08,JG2020M30)。
第一作者简介:屈微,女,北京科技大学高级讲师,研究方向为计算机仿真、机器学习、图像处理等, quwei@ustb.edu.cn。
引文格式:屈微,汪红兵,何杰. 应用计算思维解决复杂工程问题能力培养[J].计算机教育,2022(10):41-44.
转自:“计算机教育”微信公众号
如有侵权,请联系本站删除!