面向卓越工程师培养的C++教学实践与建议
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
85
计算机教育
Computer Education
第 10 期2018 年 10 月 10 日
中图分类号:G642
0 引 言
卓越工程师教育培养计划(简称卓越计划)旨在培养造就一大批创新能力强、适应经济社会发展需要的各类型高质量工程技术人才,为国家走新型工业化发展道路、建设创新型国家和人才强国战略服务。
按照教育部的设想[1]
,卓越计划具有3个特点:①行业企业深度参与;②学校按通用标准和行业标准培养工程人才;③强化学生的工程和创新能力。
显然,卓越计划的实施离不开具有卓越培养水平的大学教师。
目前,信息化技术已经渗透到每一个工科领域,我国高校工科专业已普及程序设计课程,如何在课程教育中有效贯彻卓越计划,值得每个教师深思。
我国C++教育工作者对贯彻卓越工程师教育的理论方法进行了大量的探索,典型如:①培养学生计算思维[2-4];②针对教学内容与学科专业脱节的弊端,变革教学内容的组织和设置[5],串联教学内容、方法和实践[6-7];③针对以往教学实践性不足的问题,研究贯彻卓越计划的分阶段教学模式[8-10];④研究基于案例、项目及问题导向的教学模式[11-12];⑤研究以学生算法逻辑训练和工程应用能力培养为导向的考核方法[7, 11]。
上述探索研究有效培养了学生的计算思维能力、应用能力和创新能力,推动了高校工科
基金项目:江苏高校品牌专业建设工程(测控技术与仪器专业)资助项目(PPZY2015B125)
;东南大学校级教改项目“面向卓越工程师培养的C++课程教学实践”(5222007109)。
第一作者简介:张小国,副教授,研究方向为图像视频处理,xgzhang@。
计算机教育水平的提高。
1 程序设计语言教学的卓越工程师思维与能力要求分析
程序设计语言课程旨在使工科学生深入理解使用计算机解决问题的基本原理与方法,学会科学计算和数据处理,树立以算法为基础的程序设计理念,锻炼逻辑思维能力,为学习专业相关的信息处理技术打下基础。
对照卓越计划,笔者认为程序设计与算法语言(C/C++)课程对应的卓越工程师思维和能力应体现在以下几点。
1)快速设计并有效转化为计算问题的能力。
程序设计课程实践性强,能否开发出满足功能的程序是最直接的教学效果评判标准。
通过课程学习,学生应具备将专业问题转化为计算问题的能力,合理设计数据模型及数据结构,开发算法,实现计算机求解,这正是周以真教授提出的计算思维能力[13]。
2)敏捷定位并迅速解决软件缺陷的能力。
软件缺陷(bug )指软件中破坏正常运行的问题、错误或隐藏的缺陷等。
快速定位bug 并给出针对性解决方案,是软件开发和维护的常态需
面向卓越工程师培养的C++教学实践与建议
张小国,祝雪芬
(东南大学 仪器科学与工程学院,江苏 南京 210096)
摘 要:分析程序设计课程应培养的卓越工程师思维模式和解决问题能力,包括快速实现需求、敏捷定位bug、自主学习、良好交流等,提出在C++课程教育中贯彻卓越工程师培养计划的几点认识,如规范编程习惯、建立代码安全与可信计算理念、强化调试技巧、培养自学能力等。
关键词:卓越计划;程序设计;
C++;教学方法文章编号:1672-5913(2018)10-0085-04
2018
86
计算机教育
Computer Education
求。
软件全生命周期往往涉及不同的开发和维护人员。
在不熟悉整体架构和代码前提下,技术人员需要快速复现和定位bug 并给出解决方案,这是本课程需着力培养的基本能力。
3)自主学习并灵活运用新知识的能力。
课堂教学难以面面俱到,卓越的内涵还在于快速学习新知识、新技能并快速应用。
通过学习本课程,学生应具备如下技能:①快速自学本编程语言相关知识;②快速自学新计算机语言;③快速自行实现相关算法;④快速熟悉一个已有计算机系统等技能。
4)有效沟通且循规蹈矩的能力。
现代软件大工业多用跨国、多地、并行开发模式,从需求、设计、代码、测试、修复到后期维护都离不开人际交流,良好的计算机相关交流和交互能力是项目顺利实施的保证。
这种能力包含两个层面的内容:①良好的口头和书面交流能力;②遵循工程实践中成文及约定俗成的规范,保证编码和文档的可读性和可维护性。
2 贯彻卓越工程师计划的C++教学实践
综上,笔者参考在工业界7年实践及学术界科学研究和系统开发的经验,在C/C++程序设计语言教学中,将前述4点需要着力培养的能力转化为图1右侧的6种教学实践与建议。
2.1 理清概念,应用导向但不纠缠于细枝末节
教师对教学内容的深刻理解是一切教学改革和实践的根基。
理清概念有助于学生深入理解知识点,避免误解,少走弯路。
在教学过程中,既要避免照本宣科,又要反对故弄玄虚。
教师应尽量用浅显直白的语言传递概念,用身边的例子作比喻,充分使用学生已有的生活经验作关联,引发有效联想。
例如指针章节,可以将内存分配比喻成到酒店住宿,把指针比喻成房卡;又如面向对象,强调派生的本质在多数场合下就是类型细分,小类对象本质上就是大类对象,派生类对象和基类对象的相互转化规则也就了然于心了。
在教学过程中要有所侧重,关键是传递学习方法和帮助学生总结提炼,澄清典型理解偏差,如不鼓励学生记忆字符的ASCII 值、大小写字符的ASCII 差值、I/O 流输出格式规范等,不鼓励学生死记硬背运算符的优先级(建议学生多用括号)等。
要达到上述效果,教师应多学习国外先进教材并深入研究C/C++规范,没有捷径。
2.2 规范编程,身体力行潜移默化
算法可灵活、编码须老实。
编程者要牢记“程序是写给别人看的”这一准则,保证程序可读可维护。
大学新生多属初次接触编程,容易写出不易识别的代码。
教师应身体力行引导,要及时指出学生编程中的不良习惯并督促其改进。
(1)代码书写和展示遵循工业规范或约定俗成的规矩,采用名副其实而非莫名其妙的变量名、函数名、类名,让人一目了然。
(2)介绍谷歌等公司的编码规范,推荐一些书写优美的代码,使学生感知编码美学。
(3)组织学生讨论评判不同的编码风格和编码习惯,使之理解好和坏评判的内在逻辑。
(4)引导学生把握整体架构,感知编码的动态演化过程,贯彻自顶向下的程序设计逻辑,展示在整体结构把握上的代码编写方法论和整体美学。
2.3 健全思维,传递逻辑完备与计算可信概念
逻辑缺陷和计算错误是导致软件bug 的主因之一。
帮助学生建立代码安全(Security programming )和科学计算可信度(Reliability of scienti fic computing )的基本观念,有助于学生平滑进入科学研究和研发工作。
图 1 基于工程实践视野的卓越工程师能力分析与能力
培养对应关系图
䬚䷄䒘ࡂ㘩߇
㼏۟㑦䮣㘩߇
㜖႒Ό㘩߇
Ⱔξ⇋䕆㘩߇
⤲⌱Ắᔡ㻰㠯㑂⼷
֑ڔᕉ㐠ᑦࡂ䄯䄁ഥڧ㜖႒
҈͆ᑁᄨ
ࡿ䊶⼷ጴᕉ㐠স㘩߇ഥڧ
㘩߇ܲ᪅႒䌡̺ᐦ䃚
第 10 期87
教育与教学研究
代码安全涉及知识广,课堂难以全面覆盖,但可有选择强调部分内容,并实践之。
(1)帮助学生建立全面的逻辑思维模型。
讲解基本语法时,要提示学生考虑所有执行分支,如if逻辑要考虑else,switch语句要考虑未被case捕捉而进入default的情况,for循环要考虑循环何时开始、改变趋势、终止条件,递归有无考虑终止条件等。
(2)强化学生对内存分配的理解。
C++不支持垃圾收集,程序灵活,客观性上增加了bug产生的可能性,要让初学者明白内存分配和内存销毁的对应关系,将bug扼杀在萌芽中。
(3)强调变量和指针的初始化。
不初始化指针容易导致访问野指针现象,不初始化变量容易将脏数据带入执行过程,因此要求对所有的指针和变量赋安全初值。
(4)让学生评议自己作业中的典型错误,引发讨论和思考,加深他们对可能出现bug场景的认识,形成对逻辑完备的条件反射。
工科学生学习编程的主要目的是科学计算,而计算机采用有限二进制表达现实,误差难免。
本科学生很少接触到计算方法或数值分析这类课程,因此需要对这类思维进行有意识培养。
在教学过程中,可用例程让学生逐步建立可信计算的概念:
(1)整数除以整数等于整数;
(2)比较两个实数是否相等一般不直接用==比较;
(3)数字相加可导致向上溢出,比如平均值计算可能因为和的向上溢出而出错等。
2.4 强化调试,弄清静态逻辑和动态变化
软件缺陷难以杜绝是共识。
软件调试是对程序的排错过程,包括了编译时和运行时两个阶段,前者消除编译期错误,后者检查运行时缺陷。
笔者在教学过程中发现:①在学习早期,学生对语法不熟悉,容易受困于基本语法错误而无法深入;②随着学习的深入,学生可以成功编译程序,但常常花费成倍的时间定位和修改缺陷。
这容易挫伤学生学习的积极性和自主性,使之产生畏难情绪。
在工业界,工程技术人员常常需要在对软件整体非常不熟悉的情况下在极短时间内完成bug 修改。
开发维护软件中,处理一大堆不知道何人何时完成的历史遗留代码是工作常态,这种能力已成为工业界判断优秀和平庸的标准。
笔者在教学工作中,主要采取了两步法提高学生程序调试能力。
(1)在学习初期,以强化基本语法为主,采用双语教学模式让学生具备基本技术英语阅读能力,引导学生自己理解编译器报错和警告信息,让学生对典型错误建立起基本的概念,鼓励学生通过帮助系统和互联网查询错误原因并且搜寻相关解决方案。
(2)在学生对基本语法有一定素养的前提下,强化学生对动态工程问题的定位能力,对软件常见bug分类,言传身教设置断点、单步调试、watch变量等基本的调试方法,讲解实例,分析原因,演示debug过程并讲解关键技巧。
2.5 授之以渔,培养快速自学能力
C++课程实践性强,涉及知识包罗万象,课堂教学不是全部,应避免灌输式教学,强化“做中学、学中做”,使学生在犯错中不断进步。
同时,程序设计语言日新月异,教师需要在教学过程中强化学生对计算机语言特点、计算思维、算法的理解,让学生学会一门语言就可以快速短时间掌握其他计算机语言、快速自己查询资料、快速设计新算法,提高运用能力。
(1)用问题的形式启发,让学生自己亲自验证和体验,提高学习效果。
(2)避免有问必答的教学,鼓励学生用IDE help或网络解决,并跟踪过程。
(3)让学生自学部分章节,如C++流的部分细节内容,鼓励学生在编程中“做中学”。
(4)给有余力的学生提供一些相对高级教程或者推荐一些课外读物,鼓励其自由发展。
2.6 精心设计,循序渐进安排课后作业
程序设计课程教学离不开上机实战,作业太容易难以锻炼学生的能力,太难会打击学生的积极性,总体上应该合理安排、循序渐进,用容易的题目巩固教学使学生积累信心,难一点的题目引发学生思考和接受挑战,从而让学生真正并理解和掌握教学内容。
2018
88
计算机教育
Computer Education
在作业环节,要重视工业界对信息化的需
求,致力于提高学生的实践能力和协作能力,对学生在实践中暴露的问题,给予仔细的指导。
(1)强化对字符串、指针、动态内存分配的训练,将这种训练贯穿C++整个教育过程;
(2)强化对重要数据结构的训练,要求学生对动态数组、链表、队列等数据结构按STL 标准接口编程实现,使之掌握STL 接口,对C++面向对象思想有更深刻的认识;
(3)设置大作业环节让学生实践本专业工程计算问题,从最基本的曲线拟合到方程求解、矩阵运算,从报文处理到信号滤波,从图形绘制到图像处理等。
在教学实践中,教师要高度重视作业方面的师生互动:一是对学生作业的典型问题重点讲解和引导;二是特定学生屡犯的错误要针对性提醒。
这种教学互动可以及时了解学生对知识的掌握和运用程度,并依据这些反馈信息及时调整教
学内容、方法和进度。
3 结 语
教师对教学内容本身的深刻理解、对实际工作技能需求的清晰认识,是任何教学改革和教学实践的根基,离开了这一点讨论卓越工程师思维培养或者教学改革是难以取得良好效果的。
几年的实践表明,本文讨论的这些执行层面的教学方法取得了不错的教学效果,激发了学生的学习热情并培养了动手能力。
以近3年为例,学生后续参加美国ACM 、北斗杯等国际或国家级竞赛获特等和一等奖10余项。
需要指出的是,实施上述教学方法不需要专门的时间单独执行,可以是分散穿插到日常的教学过程中进行,并有意识针对性地应用。
这些举措显然无法承载卓越工程师培养的全部使命,但可以潜移默化提高学生在计算机方面的卓越工程师素养。
参考文献:
[1] 中华人民共和国教育部. 教育部关于实施卓越工程师教育培养计划的若干意见[S]. 教高[2011]1号. [2] 胡兵. 计算思维的培养在C++教学中的应用与实践[J].科教导刊, 2013(28): 132-133.
[3] 黄丽达, 陈湘涛. 将计算思维融入程序设计课程的教学方法研究[J]. 计算机教育, 2014(3): 70-74.
[4] 张银霞, 耿蕊, 李敬有. 融合计算思维的“C++程序设计”案例教学实践[J]. 工业和信息化教育, 2016(11): 42-46.[5] 赵晋陵. 物联网工程专业 C++ 程序设计教学改革探索[J]. 计算机教育, 2014(2): 30-33.
[6] 赵海冰, 李瑛,邢翠芳. 浅谈项目教学与任务驱动在“C 程序设计”教学中的应用[J]. 计算机工程与科学, 2014(增刊2): 319-321.[7] 刘添华, 周屹, 运海红. C 语言程序设计课程教学改革研究[J]. 黑龙江工程学院学报(自然科学版), 2015(3): 77-80.[8] 许秋艳. 面向“卓越工程师教育培养计划”的 C++ 程序设计课程教学模式探讨[J]. 科教文汇, 2014(24): 70-71.[9] 傅翀, 李巧勤, 钱伟中. 软件工程卓越工程师培养中专业基础课建设的探讨[J]. 科教文汇, 2015(9): 64-65.[10] 张燕红, 李瑛, 杜晶, 等. 计算机程序设计课程的“六步式”探究教学模式[J]. 计算机教育,2016(2): 51-54.[11] 周立章. 基于CDIO 工程教学模式的C++程序设计教学改革探索[J]. 大众科技, 2011(10): 208-210.
[12] 李洪国, 刘启明, 岳峻, 等. 以培养卓越工程师为目标的程序设计基础教学[J].计算机教育, 2014(8): 80-82.[13] 李廉. 计算思维: 概念与挑战[J]. 中国大学教学, 2012(1): 7-12.
(编辑:孙怡铭)。