(文章可能比较情绪化,一些观点会有失偏颇?欢迎批评)

前言

咱不谈国内教材的风格问题,不谈谭浩强等经典教育家,不谈十年不更新的课件。咱就来看看现在高校中的计算机考核体系(考试制度、评分制度等等)中存在着哪些问题。

首先需要说明的是,此处涉及的计算机类课程是“计算机普及教育”性质的,是面向低年级学生的计算机基础课程,包括中学时的信息技术课程、大一的程序设计基础课程等,而非专业性较强的课程,后者因笔者尚未接触过故不作评价。

所谓考核体系中存在的问题,指的是计算机学科课程的考核无法客观全面地反映学生的能力,造成低能者高分,高能者低分的现象。当然,我并没有做统计,只能拿自己说事。个人看到这样的成绩比较不爽,写篇软文骂骂街,期盼一下更加让人(己)信服的计算机课程考核体系,仅此而已。

标题中所谓范式,指的是当前国内学校普遍采取的这种考核模式。不光浙大如此,大多数学校在计算机学科的考核模式上虽有差异,但总体而言还是如此的。个人比较不喜这样的考核模式,但也不了解其他的模式,对于墙外的教学也不甚了解,无法提出有指导性的教学改进意见。

对这种考核体系的厌恶是自中学时代开始的。从中学开始,我就不喜欢技术这门学科的考试,无论是信息技术,还是通用技术(这里不谈通用)。高一时候还能凭借着信息差稳拿信息技术的第一,但等到大家都明白这门课的套路后就发现它也就这样了。大家都满分,很没意思。(高中同学之前在寝室里吹水哪些课拿过第一的时候把信息拿出来吹,搞邪了你)倒是我会因为乱七八糟的问题满不了。难道分数不比别人高说明我不比别人强?怎么可能。难道每个分高于我的人都比我热爱计算机,都比我有程序设计的思想,都比我更理解算法?怎么可能。但分数就是摆在那里。很不爽。很不爽。高中的信息技术无法在思想深度上作拓展,只得在边边角角上挖坑,坑一坑考试技巧低的人。这到底有什么意思?设置这样一门考试是要考察什么?想不明白,于是我不选技术,选历史。

到了大学,本以为进了计院就不用再接触这些糟心的考试了,但还是事与愿违。

从浙江大学《C语言程序设计》《程序设计专题》课程的情况来看,这类计算机普及课程的考核一般会由project,平时参与情况,期中期末考三部分构成。其中后者为大头,占了50%~60%。我们便来谈谈这考试。不过在说考试之前,我们有必要关注,考试要考察什么。

能力

普及性的计算机学科,需要学生掌握哪些能力呢?中学课本中往往会有office、ps、flash(该换h5啦)的基础操作指南。这些好拿出来考试?有什么思维含量?通过简单的搜索就能掌握的记忆性的知识,完全没必要考察。让学生用文字描述具体的操作过程也挺蠢,有一种独到的滑稽感。说到底,我知道这些内容对中学生而言并非不重要,但感觉用传统的中学教学模式对待计算机课程就有种说不出的拧巴感。

还有呢?程序设计的能力,这实质上是对计算思维的培养,对逻辑思维以外一种独特而有效的解决问题的思维模式的培养,这是相当有价值的。教授一些简单的算法,一些常见的数据结构,足以打开低年级学生(尤其是中学生)的心智,让他们领略到计算机科学的魅力,而不是薪水的魅力。

把宏观的程序设计能力再细分,在具体的程序设计上,我们还需要具备对程序流程的理解能力,对意外事件的处理能力,对程序正确性与复杂度的分析能力,等等等等。虽然归纳地并不细,不过考试大抵也便是考察这些个能力。ok,那我们开始讲试卷,看看它能否较好地检验学生的综合能力。

试卷

考试试卷会由多个部分组成:判断题(理论性较强),填空题(用大脑编译运行程序),程序填空题。这些部分分别能考察什么东西呢?首先是判断题,个人非常讨厌。有些理论书上没提看似值得深挖,但个人觉得真的没啥意思,举个例子:

定义FILE *fp; 则文件指针fp 指向的是()。(1分)

A. 文件在磁盘上的读写位置

B. 文件在缓冲区上的读写位置

C. 整个磁盘文件

D. 文件类型结构体

这种题目要考察什么?如果教师在课堂上对这一知识点有所强调,并能进行知识点的延伸,那这样的题目可作为检验听课情况的一枚试金石。可若是教师对此完全没有提,学生面对这样的题目要怎么办?虽然自学是重要的技能,但我们也应理清什么样的知识是好的,是值得我们投入时间的。计算机课程不是思想道德修养,它里头虽然也有理论,但切不可空谈理论而忽视实践。而在这样一类的题目中,实践的影子,何在呢?

虽然题库中存在许多这样无趣的题目,但无可否认的是,许多题目还是有一定价值的,能够帮助同学们检验知识漏洞。这是值得肯定的。

填空题最大的特点,就是没意思,和实际的工程比较脱节。它是在考察学生对于语法规则,简单的算法的理解能力,但笔者不认为这是一种合格的考核方式。且不谈优先级排序,++++++这种反人类题。填空题与工程的一大脱节便体现在考试的限制上,学生被要求不得打开编译器对程序进行调试。诚然,如果不这么做则填空题的区分度会大幅减少。但这样的规定也在很大程度上破坏了计算机课程可贵的实践性,这和程序填空题的弊端是一致的。本来一个编译运行,几个调试就能发现的低级错误,硬是成了所谓体现区分点的地方。这能区分个什么对语言特性的认识对编程范式的思索,只是停留在大众教育阶段的对于所谓“勤奋”“仔细”的筛选。想到大家在走出高考考场后仍要惦着曾经的那么一些无趣的行为模型,我比较无语。

至少我没有见到过有趣的填空题和程序填空题,虽然都会做,但做起来慌得不行,唯恐哪个细节又没注意到,感觉写下来的都是错的。事实也正是如此,总会因为trivial的错误错掉一些题(虽然中学老师教我们强调细节,不过在大学的context里,“仔细”的重要程度还是第一位吗?)。程序填空题的初衷是好的,希望考察学生对代码的阅读能力与对程序流程的认识。但不得不说这种形式实在不讨喜。码风的不一本应通过建立语言使用的共识(编码规范)来达到一定程度的消除,然而学校并未这么做。另外,对陌生代码细节的把控不当也是所谓“区分点”的一环,而这本应通过测试来消除的。

简言之,这三类题除了选择题尚可,对其他两类题鄙人均比较反感。虽然如此,我也不清楚什么样的题型是自己是大家所喜闻乐见的。感觉计算机学科就不适合笔试。加入一定量的编程题(不可以有码量巨大的模拟题)或许比较好吧,但浙大《程序设计专题》课程今年把编程题取消了,原因不明。

这里顺便吐槽一下PTA系统。死板的填空题检测机制不支持等价写法,程序填空题的评测系统简单粗暴连拼写都不帮你检查一下(变量名错了扣了一堆分,无语)。最让我不爽的是,编程题的题库里放了很多三流学校(浙大不知算不算)三流教师编写的牛逼题,什么答案输出4+-3i才能过,什么手动实现atof函数(还nm是残的,不支持指数写法),什么“题目主要是输入花费大量的时间,如查找出现超时,尝试多次提交。”我还能说什么呢?牛逼,真nmd牛逼。我不知道这样的题目能锻炼我什么能力,只知道我浪费了好多时间好多心情在这种没营养的东西上面。

未来

笔者眼中理想的计算机普及教育课程的评价体系相较于此前模式的改变,大抵如下:

提升project在评价中的占比,达到50%~60%。同时对project的拓展功能进行额外评分(拓展功能与正态分布不可得兼,不当让学生为了不被正太而将简单的project过分复杂化,加上许多“冗余”功能,使得恶性竞争的风气盛行。入门级的计算机课程是简单的,大家都能学得好,搞什么正态分布?猪头领导,不具体问题具体分析,不求是,当什么浙大校长),由教师、助教依据细则、个人判断进行评分。增加project的数目,包括小组project与个人project,两个短学期的课程中,前者一项(工作量较大),后者三项(工作量较小)为宜。互评作为签到性质的任务,在project的评分中只不占比重,只是平时参与情况的一部分,作为同学们相互学习的一环。同时恶意评分者当受到惩罚。

不取消期中期末考试因其还有一定价值,但应降低其比重至20%~30%。保证题库的质量,撤销同学们普遍认为没有价值的题目。教师当对所谓“考试技巧”进行强调,强调考试与工程的差异与考试本身的价值,本身的特点。考试要增加对伪代码的支持,简单粗暴的程序填空题当少,更能反映考生理解力和表达力(可用伪代码表达自己的想法)的简述题当有。添加一定量的编程题。

中学阶段的信息技术课程当向这样的模式看齐,尤其是浙江省的信息技术学科。

以上的方案不尽成熟,还是需要迭代优化的。(所以就鸽在这吧)


开始于2019-07-03

完稿于2019-07-18