一名计算机教师的年度教学总结
金旭亮
年底通常是一个做总结的时间。回顾这一年,上半年给北理工本科生和研究生讲了OOAD,下半年给本院(计算机学院)2009级本科生讲Java,刚刚批改完所有试卷及课程设计作业,感到最值得说的还是这学期Java课程的分析。
本学期选修Java课程的学生超过90名,我不从事学生管理工作,不太清楚本院2009级共有多少学生,估计选课的学生占全部学生总数的1/3左右,因此,分析的结果应该还是有一定代表性的。
(点此下载我本学期所主讲的Java课程的所有课件及示例源码)
本次Java课程成绩由两部分组成:期中作业和期末考试。其中期中作业我给了两个题目:四则运算计算器和解线性方程组。绝大多数学生选的是四则运算计算器。
(对于课程设计的具体要求请点这里下载)
开发一个四则运算计算器,看似简单,其实并不容易,要做出一个好的计算器,算法/数据结构/用户交互设计/程序健壮性等一个都不能少,比较高兴的是,几乎所有的同学都回过头去重新学习了相关数据结构和算法等理论课程,也都反映通过编程开发实践学到悟到了许多东西。有部分学生在用户交互设计上下了不少功夫,设计的计算器界面美观实用,有的学生展示出较强的自学能力,无师自通地开发出了对应的Android版本,更有部分学生在算法设计与程序性能评估分析上展现出扎实的基础理论基础,让我很开心,很不错啊,比我当年强多了……
这门课程的考试我采用了开放的方式:就是允许学生带任意资料,带电脑,也允许上网搜索……,有个学生在文档中说这是“前无古人”的。之所以采用这种方式,是因为我认为象程序设计这种注重实践与培养开发技能的课程,闭卷考试是一种最无聊的考核方式。但考试完毕,学生议论纷纷,为此,我写了一篇博文——《学习,只有勤奋是不够的……》(http://blog.csdn.net/bitfan/article/details/7005005),发表之后,有不少的评论。
在这里,我只想就允许学生在考试时上百度搜索试题答案作一下说明,以免有人说我鼓励学生“偷懒”:
我在设计试题时就考虑到学生会上网搜索,因此,大多数题目都是我自己设计的,就算是学生在网上搜索到了类似的题,他也必须理解找到的资料并加以修改才能答题,这其实也是一种非常重要的能力:在互联网时代,要学会搜索、筛选和理解海量的信息。有些学生没注意到这点,结果在考试时时间就不够了,有很多题没做。
这次考试的试卷自我感觉有一大失误——要手写的内容过多。有名学生的评论很能说明问题:CPU够、内存够、就是外设(打印机)太慢……。下一届学生的试题将会有相应的调整。
下面对这次考试的部分试题做个分析,向同学们介绍我的出题意图。
(完整的试题请点此从CSDN下载频道下载)
10分判断题主要考核一些知识点,没有什么好说的。
30分简答题中有一些值得点评.
题目:在Java技术的学习过程中,会接触到两个很容易弄混淆的术语:primitivetype和raw type,请说出这两个术语之间的区别。
点评:primitive type大家都知道,raw type其实是Java泛型技术中出现的,可以百度找到答案,我的PPT教案中也有介绍。如果没答出来的,基本上可以知道此学生很少用搜索引擎找技术资源,或者是逃课了。
题目:如果在程序运行时需要判断某个对象是否是某个类的实例,你有几种方法?
点评:能回答出两种以上方法的学生,肯定是比较善于总结和梳理知识的,这是一种需要注意培养的良好学习习惯。
题目:JDK文档中说,String变量的内容是不可改的,那么为什么我们可以写出以下的语句?
Stringstr="ab";
str+="cd"; //这里难道不是修改了str变量的内容吗?
System.out.println(str);//输出:abcd
请解释发生上述现象的原因(提示:可以使用javap工具反汇编字节码)。
点评: 此题主要是考察学生知不知道使用工具去分析问题,理解Java编译器的作用。只需用javap反汇编一下字节码,就可以知道看到“+=”实际导致调用的是StringBuilder的相关方法。
题目:序列化技术能让我们将一个对象保存到流中,请举三个你想到的可以应用此技术的实用场景,并给予简要的说明。
点评:此题主要是提醒学生在学具体技术时一定要注意它们可以用在何处,不要仅以“知道”为学习目的,这题很多学生都回答不好。
题目:如果要你使用多线程技术开发一个银行排号系统(每个人申请一个号,只要有一个柜台完成了当前业务,就会广播通知下一个顾客到此柜台办理业务),你将会使用哪些线程同步对象?简述一下你的实现思路。
点评:这题答得好的,Java多线程技术是基本掌握了。
编程题出了50分,以强调开发能力的重要性。
题目:请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”,你的类应该是线程安全的。
点评:考察学生是否知道可以使用同步(synchronized)的静态方法+静态字段达到目的。多线程技术是当前Java程序员必须掌握的。
题目:当一个类实现了Comparable接口时,这个类所创建的对象就可比较大小。请编写一个泛型方法Sort<E>,此方法接收一个对象集合作为其参数,集合中的对象都实现了Comparable接口,Sort<E>方法的功能是对集合中的对象进行排序。
点评:考查学生是否知道对象大小比较的基础知识,是否掌握了泛型编程的基本技能。
本次考试最大的变化之一是添加了一个10分的“软件设计能力考核题”。以下是题目内容:
题目:以下是一款广受欢迎的手机游戏“割绳子”的屏幕截图,图中的糖块被绳子固定住,玩家需要以特定的顺序割断绳子,让糖块正好掉入青蛙的嘴中。
如果要由你来开发这个游戏,请设计一组类表达出绳子、糖和青蛙之间的关系。注意绳子与糖的联接方式在不同关卡中是不一样的(每一关绳子的条数、长短都可以不一样),你选择的数据结构必须能方便地表达出不同的绳子与糖联接方式。
你需要在试卷上完成以下的工作:
(1)使用UML图或文字等手段展示出你的设计方案
(2)当玩家割断一条绳子,糖块将偏离原来的位置并移到另一个位置,如果所有绳子都被割断了,糖块将落到地上。那么应该如何判断在哪种情况下青蛙可以吃到这块糖?请使用文字、流程图或其他的手段简要给出你对这个问题的解答。
点评:我本意是想通过此题了解学生应用面向对象思想设计与解决问题的能力,并提醒他们技术要用于解决实际问题。然而很遗憾,由于我出的题量过大,绝大多数学生没有时间完成这道题目。
从学生在提交给我的文档中可以看到:大多数学生都能从我这门课中有所收获,有相当多的学生表示对编程产生了兴趣,这也是作为一名教师感到非常欣慰的事,对于软件技术而言,有了兴趣,一切就好办了。我的感触是,只要教师用心教且教学方法得当,绝大多数学生都还是愿意学习的。
有约6.5%的学生能同时在卷面考试和期中作业取得高分,如果我试题出得合适,相信这个比例还会提升一点。程序作业优秀的学生通常具有较强的开发与学习能力,但在这次考试中“失手”导致成绩一般的约占全部学生的10%。考试优秀但程序糟糕的不到1%。其余的考试成绩与写出的程序水平基本一致。
总之,觉得这次考试试题出得比较失败。
当前大学“抄袭成风”,是个顽疾,但这次从交上来的程序和文档中,我没有发现有抄袭的现象,不管学生自己基础与能力如何,我感到几乎所有学生都是自己动手完成程序设计作业的,这在我近10年的教学生涯中几乎从没出现过,让我很高兴,所以我决定:这次让所有的学生都及格,优秀的学生给与高分!
从学生的反馈中,我发现到了大三,优秀的学生与普通学生的能力差距已相当明显,基础较差的学生普遍反映我讲课的内容过多过快,来不及吸收,而好的学生则表示了不同的看法。我观察好学生与其余普通学生的重大差别之一在于他们的学习更有效率,主动性更强,比如有个学生在文档中说他这一学期就选修了“图像处理”,JAVA,“人工智能”,“嵌入式系统”四门较难的专业选修课,能学这么多,而且他的Java最终成绩高达90多分,不能不说这名学生确实比较厉害。这些有潜力的学生还有好几个。
从整个学期的教学情况来看,通过C++(大二学的)和Java两门课程,大多数学生都已经掌握了面向对象编程的基础知识与技能,这为我下学期要讲的OOAD课程打下了良好的基础,我计划在下学期的OOAD课程中地为学生讲授更多的面向对象理论(比如重构、设计模式等)和更多的技术,开拓他们的视野,让学生在理论的指导下进一步提升开发能力,同时将采用分组的方式,让多个学生协同完成一个较大规模的软件,以培养他们的团队协作开发能力。最后,我会在大四上学期再开设一门《.NET高级软件开发技术》,让学生能比较深入地掌握Windows平台下的应用软件开发技术,期望每个学生或小组都能拿出一个“漂亮的”软件作为展现自己能力的成果,最后送他们一程。
《Java程序设计》-->《OOAD》-->《.NET高级软件开发技术》,我期望能通过三个学期的三门首尾相接的课程,让学生能在大学校园就跟上技术发展,能学以致用,为他们的未来发展打下基础。
回顾一下,我教了近10年书,曾经教过的各届学生中感觉2004级总体上比较出色,而从Java这门课来看,2009级的学生也有很大的潜力。
我是70后,过去教的2004级等届学生是80后,而现在的2009级则是90后,与他们相比,我等确实是“IT老人”了,脑力、体力等都在下降,未来是80后90后的,希望后生们一代更比一代强!