计算机考研的调查和改进建议
几星期前, 我在微博上讨论考研的事, 有专家建议不如把意见整理出来, 说不定可以转告给相关方面。 我没有考过研, 问了公司的同事们, 绝大多数都是保研的, 也没考过。 我从网上下了一份模拟题, 好像还挺难,有一种要翻书的冲动。
全国有多少学生为了考研而奋斗? 据说考计算机专业的研究生每年有七千到一万左右。 我以前接触到清华软件学院的一个研究生, 他为了考研, 在北京漂了两年时间, 租陋室每天学习十多小时, 逐步复习各个科目最后终于考上了。 我当时在感动之余不禁想 - 如果他用这些时间做点实际的软件开发, 那该多好啊。。。 他的身后还有很多复习之后没有考上的同学, 他们努力准备的考研对他们以后的工作有用处么? 考研试卷是专家出的, 水平应该不错,但是我想总有提高的空间吧? 能不能让考研试题更好地甄别优劣, 让考上的同学真正有做科研的能力, 让考不上的同学也没白白浪费时间, 学到的知识还能在以后的工作中有些用处?
批评建议总是容易的, 一拍脑袋就可以来好多,不过我想先调查调查。 我前几天刚好为 微软“编程之美全国挑战赛”颁奖大会做讲座。 听众是来自北京各高校 IEEE 分会的学生会员, 和一些微软俱乐部的学生。 我事先设计了一份调查问卷, 请他们填写。 大约有60多听众, 回收了54 份答卷,有效答卷49 份。 数据如下:
第一页: 背景
2011年 计算机专业考研的考查目标
计算机学科专业基础综合考试涵盖数据机构、计算机组成原理、操作系统和计算机网络等学科专业基础课程。要求考生比较系统地掌握上述专业基础课程的概念、基本原理和方法,能够运用所学的基本原理和基本方法分析、判断和解决有关理论问题和实际问题。
数据结构【考查目标】
1. 理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基本操作的实现。
2. 掌握基本的数据处理原理和方法的基础上,能够对算法进行设计与分析。
3. 能够选择合适的数据结构和方法进行问题求解。
一、线性表 二、栈、队列和数组 三、树与二叉树 三、图 四、查找 五、内部排序
计算机组成原理 【考查目标】
1.理解单处理器计算机系统中各部件的内部工作原理、组成结构以及相互连接方式,具有完整的计算机系统的整机概念。
2.理解计算机系统层次化结构概念,熟悉硬件与软件之间的界面,掌握指令集体系结构的基本知识和基本实现方法。
3.能够运用计算机组成的基本原理和基本方法,对有关计算机硬件系统中的理论和实际问题进行计算、分析,并能对一些基本部件进行简单设计。
一、计算机系统概述 二、数据的表示和运算 三、存储器层次机构
四、指令系统 五、中央处理器(CPU) 六、总线 七、输入输出(I/O)系统
操作系统 【考查目标】
1.了解操作系统在计算机系统中的作用、地位、发展和特点。
2.理解操作系统的基本概念、原理,掌握操作系统设计方法与实现技术。
3.能够运用所学的操作系统原理、方法与技术分析问题和解决问题。
一、操作系统概述 二、进程管理 三、内存管理
四、文件管理 五、输入输出(I/O)管理
计算机网络 【考查目标】
1.掌握计算机网络的基本概念、基本原理和基本方法。
2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理
3.能够运用计算机网络的基本概念、基本原理和基本方法进行网络系统的分析、设计和应用
一、计算机网络体系结构 二、物理层 三、数据链路层 四、网络层 五、传输层
六、应用层
第二页: 调查
(括号内是统计结果)
1) 你是本科生 ( 8 ) 研究生 ( 41 )
2) 你如果是研究生, 你是考研 ( 23 ) 还是保送/推送 ( 18 )
3) 你如果是研究生, 你本科是计算机专业 ( )
或是其他专业, 请填写专业名__专业相当分散, 很多通信电子类的学生。________________________
4) 你了解周围的同学计算机专业考研(通过正式笔试) 和保送的人数各是多少? 考研有 ( ) 人, 保研有 ( )人。
各种比率都有, 大致是一半一半。
请浏览 “计算机考研大纲“的各个知识点, 回答以下问题:
5) 你认为在科研和工作中最有价值,同时最合适出现在笔试试卷上的知识点是:
______________________________________
数据结构 21, 算法 11, 操作系统 4, 体系结构 3, 网络 3, 框架设计 1, 编程 1
6) 有些知识点, 平时了解即可, 使用时可以很快查到, 没必要死记硬背。 你认为在大纲中的知识点, 最不应该出现在笔试试卷上的是:
______________________________________
各种概念 8, 网络 8, 计算机组成 7, 计算机语言的细节 2, 数学公式 1, 操作系统 1, 体系结构 1。
7) 你认为考研应该考一些具体的编程语言么?
请从下列选项中选 _________
A. 不应该 (7) B.汇编语言 (4) C. C 语言 (18) D. 面向对象的语言 (C++, Java, C# 等) (15)
E. 函数式语言 (LISP 等) (5)
8) 如果大纲中开列“最新进展”,每年考研前发布若干篇参考公开论文, 可能从中出题,你能接受吗? 同意 ( 33 ) 不同意 ( 12 )
9) 如果考研改为开卷, 题目更灵活, 更考查真实能力, 你支持 ( 38 ) 或 反对 ( 6 )?
10)你考研是最主要用那些资料复习? 国内自编教材 ( 18 ) 国外经典/翻译教材(6) 考试真题 (17) 其它资料 (2)
11) 你希望计算机考研大纲如何改进, 以更好地选拔出基础扎实, 有动手能力, 有创新精神的学生?
同学的反馈:
实地动手考核 引入最新计算机研究发展 引入机考,不要考那些死记硬背的东西,现场写程序 像ACM 竞赛那样现场做题 算法不要总考那几个经典图论算法,要考察学生设计新算法的能力 附加几道算法题以供选择,考察动手能力 像ACM 那样 笔试初选;有较长时间 (如 1 天) 的上机考试 要考知识点的应用而不是知识点本身 上机部分要加强, 不拘泥于标准答案 上机应占更多比重 不仅限于笔试 开放式命题,减少死记硬背的东西 考察知识点和现实的关联 分数占一半,参考CV 取消考研 应增加编程环节 与实际应用相关的编程题目 加机考 加简单的编程题 考编程 基础+想法
看到这些数据, 我还是有些感想的。。。 [待续]
分析和改进
a) 用户和目的. 计算机考研试题的用户是谁?
有两个:
能够招计算机专业研究生的机构。 例如各大学的计算机系研究生院。他们的需求是什么? 试题有甄别能力, 招到好学生 - 能做科研, 能干活的学生。
来考研的学生们。 他们的需求是什么? 公平, 可预见性 (考卷上的就是大纲里写有的), 复习的东西最好在实际中也有些用处。
谁来考研? 我们研究院的实习生大部分是保研的, 员工似乎也是大部分保研的。 谁要考研? 似乎有这样的说法, 最厉害的出国读研, 其次保研, 其次推荐到其它学校, 再其次考研。 也有很多学生出于种种原因想换到计算机专业, 那这样的话, 考研的试卷是为了 “第三档的其次” 和 转换专业的同学准备的。
一件事通常有许多利益干系人. 考研这事的最大干系人是教育部。 利益干系人最希望什么? 别出乱子; 降低成本。
有了目标用户和干系人就好办了。计算机考研试题的目的是在保证利益干系人的期望值的情况下, 让用户满意。 具体地说, 就是在别出乱子, 成本不高的情况下, 出一套能甄别好学生试题, 试题尽量公平, 知识点实用。
b) 考研试卷要考啥? 同学们 (大部分是考过研的同学) 写得很清楚:
希望考: 数据结构 21, 算法 11, 操作系统 4, 体系结构 3, 网络 3,
不希望考: 各种概念 8, 网络 8, 计算机组成 7, 计算机语言的细节 2
c) 考研应该考一些具体的编程语言么?
计算机科学有很多分支, 微软学术搜索把它分成 22 个子领域。 有些领域的研究不写或不写很多程序, 老科学家可能写得也不多。 但是对于“其次”和转换专业的同学来说, 写程序应该是基本功。 我认为要考, 但是考哪些? 下面是投票结果:
A. 不应该 (7) B.汇编语言 (4) C. C 语言 (18) D. 面向对象的语言 (C++, Java,C# 等) (15)
E. 函数式语言 (LISP 等) (5)
我认为应该轮流考各种语言 {底层语言(汇编), 面向过程(C), 面向对象(C++/Java/C#), 函数式(LISP) } 只要事先公布, 学生能有足够时间准备就可以。 这符合可预见性的需求。 另外, 这类题目不一定非考“写程序”不可 (写程序判卷成本较大), 可以考察 “读程序”, “改程序”, 更考验真功夫。 听说解放军某部三个月就写了90万行程序, 我们不妨每年从中拿一万行来让考生读一读, 改一改。这样可以搞它 90 年。
d) 考研试卷能考科研能力么? 孙志岗老师建议我问同学这个问题:
如果大纲中开列“最新进展”,每年考研前发布若干篇参考公开论文, 可能从中出题,你能接受吗? 同意 ( 33 )不同意 ( 12 )
由于时间限制, 我没有问同学们不同意的理由是什么。 我认为, 在保证可预见性和公开的情况下, 是可以实验一下的。 学生考研是为了做科学研究,不是为了找个老板打工 (这句话有点冷)! 应该在考试中增加对科研能力的考察。
e) 考试形式
如果考研改为开卷, 题目更灵活, 更考查真实能力, 你支持 ( 38 )或 反对 ( 6 )?
回头看看这个问题, 其实设计得不好. 看不出来反馈到底针对哪一个具体措施 (开卷, 题目更灵活, 更考查真实能力)。 开卷考试的成本较大, 利益干系人可能不干。 听说一些机构在复试的时候采用开卷, 这是很合适的做法。
f) 复习资料
你考研是最主要用那些资料复习? 国内自编教材 ( 18)国外经典/翻译教材(6) 考试真题 (17)其它资料 (2)
这是潘爱民老师让我问的。 我很诧异为什么很少的人用 国外经典/翻译教材,难道是学校要求用自己编的教材? 为什么? 是不是有一个 “考研指定教材” 的因素?
总结
计算机考研大纲和其它的“大纲”类似, 在中国的教育系统中有强大的影响力, 纲举目张,哪怕是一点点改良, 都会对众多教师/学生有长久的影响力。 目前大纲精神的具体体现就是 “考试范围”和“考研试卷”。 在我们充分肯定计算机考研试卷的意义 [略去对它的赞美 250 字] 之后, 我觉得它有不少提升的空间。 这些空间早就存在, 不是今天才发现. 但是在天朝这个大家都喊 “深化改革, 锐意创新”的年代, 别说颠覆式的创新, 就是改良式的创新, 或者就是纠正一个众所周知的错误, 都是很困难的。 改进也有一个成本和投入产出比的问题。 我们不妨从成本低, 见效快, 利益干系人容易接受的改进方法入手。
下面是我列出来的从易到难的改进方案 (我曾经设计过微软中国校招笔试题目, 也相当于一种考研试卷)。 就像青年有三种, 这些改进方案也有三个档次:
减少各种概念题目,
增加和实践相关的题目,
增加数据结构/算法的内容。
增加阅读程序并写出程序输出结果的题目
增加阅读程序并改正程序错误的题目 (这些错误不是语法错, 而是设计/逻辑错误)
增加为程序设计测试用例并找出错误的题目
每年大纲提前公布要考的计算机语言, 并出一道用此种语言写程序的题目。
每年出5-6 题编程题目, 同学自选 2 题, 用不同的语言完成
每年大纲中开列“最新研究进展”论文列表, 并从中出题。 (最近 5 年引用数最高的论文)
鲁迅先生曾说过, 国人善于折衷, 如果你说要开一个窗子, 则有关人士断然不同意; 如果你说要把屋顶掀了, 那大家都折衷, 觉得开窗也是可以接受的。 下面的建议类似于 “掀开屋顶”,属于颠覆式的创新:
全部改为上机考试 //成本, 公平, 泄密, 管理问题, 干系人未必同意。
废除考研, 学生可以提交 TopCoder/RobotCup/ImagineCup 比赛结果, 论文, 程序 (GitHub), 技术博客, 老师推荐信, 各获奖证书等,由学校学术委员会决定是否招收。 //美国很多年前有 GRE CS Subject 考试, 后来也没有了, 我们为啥一定要笔试考研?
问题:
这篇文章出来后, 有老师说:
教育部规定:计算机科学与技术专业考研的专业课实行全国统一考试,各校计算机专业怨声载道。因为统一考试分数普遍低,而国家却统一划分数线,所以许多同学过不了总分线而不能录取。浙江一所排前几名的学校去年上线居然是0。现在我们招的大多数学生都是从外专业调剂过来的,对计算机专业发展很不利。 。。。 听说有许多人提[意见]了,但说这样是改革。而其他相近专业不统考,所以考计算机专业的人就少了许多,能够上线的就更少。我们现在的主要任务是把其他专业的本科生培养成计算机专业的研究生。这倒真是学科交叉了,呵呵!
这个有意思, 在现有游戏规则下, 如果计算机考卷比别的专业难, 那过总分线的学生会少。 反而不利于本专业吸引学生… 所以我们试卷要达到高水平, 同时拉开不同水平学生的分数距离, 同时要保证得高分的同学比率不少于别的专业…