董付国,葛诗煜,陈思佳,李 博,冯泽涛
(山东工商学院 计算机科学与技术学院,山东 烟台 264005)
Python是一门免费、开源、跨平台的高级动态编程语言,代码具有非常强的可移植性,几乎不需要改动即可运行于Unix、Linux、Windows、Mac OS、Android等不同平台。Python可以和C/C++/C#、Java等主流语言完美地结合到一起,充分发挥每种语言的优势。目前Python已经渗透到统计分析、大数据处理、数据分析与可视化、移动终端开发、科学计算可视化、系统安全、网络安全、软件分析与测试、图形图像处理、人工智能、游戏设计与策划、网络应用开发、自动运维、辅助设计等几乎所有行业和领域[1-4]。截至2018年9月,pypi.python.org网站已经维护了超过107万个涉及不同领域的Python扩展库。
多年前Python已经成为卡耐基·梅隆大学、麻省理工学院等国外很多著名大学的程序设计入门教学语言,近几年来北京大学、复旦大学等国内几百所高校也针对不同专业开设了Python程序设计相关的课程,全国计算机等级考试也于2018年9月加入了二级Python的科目[2]。对于如何讲好Python、如何才能发挥Python的最大优势,不同学校有不同的做法,都取得了一定成效。
Python支持命令式编程、函数式编程,完全支持面向对象程序设计,语法简洁清晰、代码优雅、可读性强,并且拥有大量功能强大的标准库和扩展库,可以帮助各领域的工程师、科研人员、策划师和管理人员快速实现和验证自己的思路与创意。Python编程模式非常符合人类的思维习惯,程序员只需要把主要精力放在业务逻辑的设计与实现上,不需要过多考虑语言本身的细节,大幅度缩短了开发周期,在开发速度和运行速度之间达到了完美的平衡,其精妙之处令人击节赞叹[3-9]。
Python官方网站上在非常醒目的位置有一句话“Python is a programming language that lets you work quickly and integrate systems more effectively”,在The Zen of Python中也反复提到类似的语句,例如“Explicit is better than implicit”“Simple is better than complex”等,这些看上去很普通的语句恰恰点明了Python语言的本质和核心所在。作为Python程序员,应尽量从最自然、最简洁的角度出发去思考和解决问题,充分利用内置函数和标准库对象,适当运用扩展库,充分利用函数式编程,这样才能写出更加优雅、更加Pythonic的代码。
与命令式编程相比,函数式编程的代码更加简洁和直观,代码效率也比较高,在教学和开发中应该尽量多使用函数式编程模式。
在讲授Python程序设计课程时,建议采用边讲边练、学生分组合作的方式,精心设计一些案例带领学生一起完成并做好严格的过程管理,经常鼓励和引导学生去思考“还有没有更简洁更快速更直接更好的方法?”类似的问题,激发学生的潜能,同时也充分挖掘Python语言的潜能。
在讲授、学习和应用Python时,切记不要把其他语言的编程习惯和风格带到Python中来。不能使用其他语言尤其是C语言的思路去编写Python程序,那会使得代码变得非常冗长、繁琐、可读性差且难以维护,浪费大量的宝贵时间,无法发挥Python的优势,甚至有可能写出看似正确实则错误的代码。
近年来编程类课程采用边讲边练的形式,与传统的“填鸭式教学”和“满堂灌”方式不同,在整个教学过程中,以教师讲授和辅导为主,学生练习为辅。使用多种形式保证和提高教学质量,例如在线点名、在线提问、在线答疑、在线自测、在线交作业、在线考试,鼓励学生主动提问和回答问题,适当安排学生讲解部分例题,突击布置限时完成的随堂作业,鼓励学生发现教材或讲课内容中的错误,鼓励学生分析课堂教学管理系统源代码并尝试发现其中的漏洞。
在教学过程中,偶尔会指定一小节内容或者一个例题,让学生自学5~10分钟,这段时间内同学之间可以互相讨论或者看书看课件,也可以上网查阅资料,甚至可以场外求助,时间到了以后随机找同学进行讲解。这样不仅可以锻炼学生的自学能力、思考能力,还能锻炼学生的口头表达能力和语言组织能力。
在教学过程中,使用自编软件随机提问正在讲授的内容中涉及的本课程中学过的知识,或者其他课程中学过但是在本课程中要用到的知识,然后根据学生回答情况进行实时计分。每次会提问谁是毫无规律的,无法提前预测,所以每个学生都要认真准备,提高了学生的整体积极性。
在教学过程中,鼓励学生批判地学习老师讲授的内容,引导学生思考“这个问题还有别的解决办法吗?”“这个程序还可以更好吗?”“这个算法和程序还有优化空间吗?”“还有没有考虑周到的地方吗?”之类的问题。在45分钟的课堂上,大部分学生能一直保持思维活跃状态,学习效率非常高。
在教学过程中,每当有学生发现老师讲授的算法或程序源码存在瑕疵,会得到鼓励和表扬,并被计入平时成绩。这样一来,同学们课下也会积极思考和练习,并尝试在教材或课件中查找错误,不仅能够提高学生的学习积极性,还能够培养独立思考能力和批判性思维,敢于挑战老师,敢于挑战权威。
为提高Python程序设计课程教学质量,开发了一套课堂教学管理系统。除Python基础知识之外,该系统还用到了数据库编程、多线程编程、Of fi ce文档操作、GUI编程、网络编程、图像处理等多个领域的知识,既可以用来管理教学过程中的各个环节,又可以根据学生专业从中选择不同的功能作为教学案例,还能让学生阅读和分析源码提高代码阅读能力和软件测试能力。该系统教师端主界面和学生端界面如图1和图2所示。
图1 教师端主界面
图2 学生端主界面
2.2.1 在线点名
虽然大部分同学的自制力较好,但仍有部分同学管不住自己,总想逃课。针对这种情况,在课堂教学管理系统中提供了在线点名功能,使用Socket编程与多线程编程技术可以瞬间完成整个班级的点名,不仅节约了宝贵的课堂时间,还能严格控制点名时间段,让学生无法预测点名时间和规律。并且,系统还记录了学生机器的IP地址、MAC地址和点名时间,可以在技术上防止同学之间的代点名,在很大程度上震慑了个别不爱上课的同学。另外,只要启动了学生端软件,就不允许退出,软件随时准备接收教师端软件发送的屏幕广播信息,保证上课时学生只能听老师讲课,提高了听课学生的比例[4]。2017—2018学年该系统共生成原始点名记录5 956条。
2.2.2 随机提问
在教学过程中,提问环节完全使用自己编写的课堂教学管理系统,只需要选择相应的专业然后单击按钮“看看谁最幸运”即可随机抽取一名同学进行提问,并且根据该同学的回答情况记录成绩。这样可以避免任课老师总是提问固定几个人的惯性思维,也不用对着名单纠结该提问谁,每个同学都会处于紧张状态积极思考,不敢轻易走神,尽最大可能让更多学生处于学习状态[4]。2017—2018学年该系统共生成提问原始加分与减分记录121条。
2.2.3 随堂限时作业与课后大作业
在教学过程中,适当布置限时完成的随堂作业,严格控制作业提交时间段,不仅可以培养学生快速解决问题的能力,还可以节省上课时检查作业的时间。在配套使用的课堂教学管理系统中采用了两种提交作业的方式:全屏截图交作业和上传文件交作业,对于较小的代码片段使用截图交作业的方式,较大的完整程序使用上传文件交作业的方式,并且自动把文件名修改为学生的“学号+姓名+上传时间”,以备事后检查与核对[4]。
另外,使用全屏截图交作业还能随时查看学生屏幕,判断学生是否认真练习老师讲过的知识,这样可以防止学生在练习时偷懒。2017—2018学年两个学期共使用该系统收取作业文件895个。
2.2.4 在线自测
不同学生的学习进度略有差别,有的很快就可以掌握老师刚刚讲过的知识,有的则需要的时间久一些,几十人的班级很难保证步调一致。为此,在课堂教学管理系统中增加了在线自测功能,内置800道客观题和参考答案。每次上课时立刻打开该功能,供学习能力较强、学习进度较快、自制力较好的学生自我测试和检验,也可以用于所有学生对自己的掌握程度进行检验[4]。系统数据显示,2017—2018年度共有154 500人次使用该系统进行了在线自测。
2.2.5 听课认真加分
在讲课过程中,随时注意学生的听课状态,不仅根据同学们的状态进行语速和音量的调整,还在系统中及时记录听课非常认真和非常不认真的同学进行适当加分和减分,这也是期末成绩的一项重要参考。为方便使用,该功能集成到了学生信息查看界面[4]。
2.2.6 挑错加分
在教学过程中或者布置作业时,精心设计几个小错误让同学们尝试发现,经常鼓励同学们尝试发现教材、PPT以及所有讲授内容中可能存在的错误,如果有同学确实发现了错误并给出解决方案就适当加分给予鼓励。事实证明,这个方法非常有效,同学们看书非常认真积极,确实有同学发现过课堂上讲过的例题代码中的bug。
2.2.7 攻击系统加分
该系统已经正式投入使用6个学期,虽然主要功能一直运行非常稳定,但是也确实存在一些小瑕疵,于是在教学过程中鼓励同学们随时对这个系统进行分析和攻击,然后根据他们的攻击情况进行加分,同时也不断对这个系统进行完善和升级。事实证明这是一个非常好的思路,大多数同学觉得这样的方式很有意思并积极参与系统分析和攻击,大幅度提高了学习积极性和安全编程意识,同时也为完善这个系统提供了很多重要参考。例如,系统最初使用IP地址来检测是否存在学生代点名的情况,但是有学生自己编写Python程序自动修改IP地址实现批量点名,于是系统改用了网卡MAC地址检测代点名的情况,有效避免了这个问题;为了避免学生在考试时直接复制题目然后在网上或平时整理的题库中搜索答案,在系统中增加了防作弊功能,在考试模式下不仅禁用了学生端的各种浏览器和文本编辑器软件,还禁用了系统剪贴板。同时,考试模式下的随机抽题功能使得每个学生不可能同时作答同一个题目,最大程度降低了作弊的可能;曾经有学生试图编写自助考试的代码,虽然没有成功,但其中的思路还是不错的。另外,作为大作业,每学期都有几个学生成功实现了系统中题库的批量导出,这需要根据学生端软件源码来分析和推测教师端通信协议和数据库结构,有效锻炼了学生的代码阅读和分析能力。当然,也有极个别同学通过分析学生端源代码发现了独特的作弊手段,例如使用IDLE或其他Python开发环境打开提前准备好的题库和答案,这些问题都被及时发现并且迅速修改系统代码进行了防范[4]。
2.2.8 期末成绩计算
在评定学生的期末成绩时,不单纯使用期末的在线考试成绩,还综合考虑平时的出勤次数、提问情况、作业情况等。其中,出勤次数占总成绩的10%,提问情况占10%,作业情况占20%,在线考试成绩占60%,这些数据的原始记录都可以在系统中查询和汇总。连续6个学期的实践表明,这样的计算方法更加客观,也更能反映学生的综合能力。
我校计算机科学与技术学院数字媒体技术专业、服务外包专业和网络工程专业开设了“Python程序设计”课程,会计学院开设了“Python程序设计基础”,全校范围开设了公共选修课“Python程序设计基础”。到目前为止,已经连续8个学期为不同专业开设Python程序设计有关课程,并应邀在全国巡讲和作报告50余场,在教学和交流过程中积累了大量教学经验和教学案例,提出了基于攻击鼓励和过程管理的教学方式,极大提高了学生的学习积极性,效果非常显著。为更好地实践基于攻击鼓励和过程管理的教学方式,使用Python开发了一套课堂教学管理系统。该系统已经投入使用6个学期,在提高学生学习积极性和综合能力的同时也积累了大量原始数据,对于学生学习情况和学习状态以及学习效果的进一步分析都有很大帮助,这也正是下一步要做的工作。