对大学 IT 专业教育的反馈

[这是2009 年 写的文章, 一部分收集到 <IT 小小鸟> 这本书里了。 这两天看到软件学院同学对教学的反馈,  看来好些问题都没有得到解决。 教育部门时不时会开教学研讨会, 去世界有名的大学, 公司参观, 他们还要参观多少年?  他们会请已经毕业的学生来提意见么? 学生要年复一年地等它变好?  (2011,2015,2016年都做过少量更新。)]

 

中国的大学生教育体系中,大约有10% 的学生属于 IT 相关的专业 (计算机科学,软件,MIS,电子工程, 软件工程,网络工程,电子商务,等)。 这些学生毕业之后,就成为IT 产业的从业者或用户,他们是IT 行业的希望。 这些学生在接受了 4-6 年的教育之后,对这个教育系统有什么反馈呢? 我问了一些刚刚毕业的软件专业的同学,软件教育迫切要改变的做法是什么? 下面是一些回答:

 

*** 同学们想说什么 ***

a) 实践! 软件教育离不开实践,不要太强调闭卷考试, 老师一定要让学生实践,实习。给一个真实的客户做项目和自己幻想一个需求来做项目是有很大区别的。自己从头写程序和维护别人写的代码是有很大区别的。 没有真实的需求,没有软件的增量开发,没有团队合作,程序设计和软件工程中的大部分理论都沦为空谈。

b) 讲为什么! 学生上了很多课,反而觉得很迷茫,这些课的意义是什么? 为什么有这么多的原理,数据结构, 红的树,黑的树,模式和算法? 不知道我学的东西有什么用,怎么用。老师似乎不想告诉我们这些课程在实践中的意义 (或者他们也没实践过? )。学生只有死记硬背来应付考试,考试后全忘记。

c) 打好基础,其他自学! 好好学基础课,特别是算法, 数据结构, 编译原理,操作系统 。 其他课的内容用到了自己学就可以了。

d) IT 教育不光是代码! 软件教育不是孤立体,希望在软件教育中把文科的知识联系进来,和设计联系起来; 把软件/IT 行业有趣的发展历史放进来 (讲讲图灵,冯·诺依曼,讲讲Smalltalk, 各种语言的源和流)。培养学生对这个行业的兴趣、热情和敏感。 提倡互动,介绍同学上相关的论坛,网站,开拓视野。

[建议大家看 《浪潮之巅》]

 

*** 我看到的现象 ***

由于工作的关系,我在过去的几年中访问了十多所软件学院或计算机学院,和不少老师,学生座谈过。我在微软亚洲研究院里也接触了来自各个学校的学生,谈得多了,就有下面的一些想法。这里我主要谈计算机软件的教育。

想来的人来不了

学校里都是按照高考/考研的成绩决定专业去向,我听到一些喜欢玩游戏的学生特别想来软件学院,但是由于成绩不够好,来不了。 一些成绩挺好的学生优先选择了软件专业,因为大家都说这个专业好找工作。 但是到了快毕业的时候才发现 不对劲, 于是有人后悔: “其实我不喜欢写程序,我想转行。” 咳,如果你的位置留给当初那些喜欢玩游戏的学生该多好。

 

教务处的规定

老师反映说,本来想锻炼同学的团队协作精神,期末大作业让同学们分组合作完成一个项目,但是没想到教务处不同意。 教务处坚持大作业必须每个同学单独做,不能搞团队协作,其理由是团队协作之后,有人就会偷懒!

其实,让学生一个人去做,他/她也有可能去糊弄,抄袭。 而且正因为缺少协作,一个人不能完成很高质量的软件,单干的同学更有可能去抄。 最后老师争不过教务处,只好让每个同学单独做一个项目了事,一个普通学生很难做完一个项目,怎么办? 那只好 “参考” 别人的东西,有人负责测试么? 没有。这也是每个班的四五十个学生作业只有4-5 个版本的原因之一。这么多项目,老师能一一仔细审阅么? 显然也不行。 但是这事教务处的规定,就这么糊弄过去吧。 据说在一些学校里,教务处非常强势,能决定老师的绩效考核。

 

知识和技能

很多人认为,大学是传授知识的地方。很多知识 (Knowledge)可以讲授,同学们也可以自己查找,学习。 例如程序设计语言的一些边边角角的规定,在工作中如果忘了,那就现查资料,或者写一个测试程序验证一下。 但是技能 (Skill) 则要通过实际的反复训练,才能获得,并优化。 我看到同学们经常能够背诵 “在设计中应该高内聚,低耦合”, 但是在实际中根本不知道如何应用。 就如同大家都可以在理论上掌握如何下围棋 - “要让每一步占领全局最有价值的要点”, 但是在实战中下的棋却支离破碎,溃不成军。

我们在考试的时候,能不能少考一些死的知识,而多考一些技能? 学校里能练习什么技能呢?很多:

  • 自己学习的能力 (能不能自己学习一门语言,然后应用? 为什么非得先要老师讲解?)
  • 理解别人的意思和动机 (inter-personal awareness)
  • 表达自己想法的能力 (不妨分析已有软件的优劣, 明明白白地写一篇博客,描述自己项目的规划,等等)
  • 说服,影响同伴的能力 (大家一起合作,如何能让团队按自己的想法前进?)
  • 制定计划,并执行计划的能力 (是自己的计划,而不是老师给订的计划,能坚持到底)
  • 总结,改进的能力 (一个项目之后,能否心平气和地总结,改进?)

更多关于知识, 技能, 和技能的反面:

技能的反面 - 魔方和模仿

基础知识很扎实 - 但是面试就是做不出来, 怎么办?

 

新的,旧的,合适的,用心的,还是图省事的

很多同学对IT 相关课程的第一个抱怨就是 “我们那里还在用VC6.0!”, 用老的工具来教学,合适么?这要看情况,如果是讲授数据结构和算法入门,VC6.0, Turbo C,或者三十年前的Unix 系统上的C 就足够了,问题是,老师用了这些旧的(稳定的)工具,给学生们讲了什么呢?  老师是否用心改进课程呢? 老师是否意识到,当所有学生都有自己的笔记本电脑的时候, 是否还要坚持大家去 “机房” 上机,是否利用便利的网络环境给大家分享阅读和视频教学的内容? 老师是否意识到,当所有学生都有手机的时候, 是否可以不在要求做传统的 “图书馆管理系统”, 而是做一些手机端的软件,同样也能锻炼学生的专业能力? 一步一步追问下去,大家可能意识到老师也就是要图省事,用最少的精力把教学任务完成了,把主要精力花在 “科研”, “横向项目”,“申报课题” ... 上面去。

说到用老的教材,二十多年来,国外一些一流大学一直在用 SCIP 作为新生的编程入门教程,怎么样,我们敢用么?

大学之道 vs. 职业培训

在我和许多中国大学老师交流的过程中,当我介绍了 “构建之法”的教学方法之后, 一定会出现这样的反馈: “我们大学的教育使命,和职业培训是有区别的...”,似乎在教学中使用了工业界流行的工具, 使用了流行的博客、MOOC 等方法,让学生为职业做了很好的准备,就是不入大学法眼的 “职业培训” ?!  虽然绝大多数的学生上大学的目的就是要找好的工作,但是很多专家不以为然,从他们的言谈中,可以看出,他们认为大学是培养完整的人, 高尚的人,是培养科学家的,而不是做一般工作的...   科学家和其他工作类别的高低且不论, 我们退一万步,姑且同意大学就是培养科学家的, 那么:

  • 科学家也是一种职业,大学在找科研带头人的时候,也是和公司招人一样,列出各种条件,为何大学不能把科学家的职业要求明明白白地教给学生呢?
  • 中国的大学在招 “科学家” 的时候,招聘流程和其他行业招人也很类似,说明也是按 “职业” 的规律来招人的, 而且有些学校通常会限定许多条件, 例如必须在国外获得某些学位等等, 这么说中国的大学培养不了科学家? 这不是和上面提到的中国大学主要目的互相打脸了么?
  • 科学家(或者说科技工作者)也是一类职业,也有它本身的规律,也有原理,知识,技能。 它不是隔绝于其他职业之外,而是和其他职业有很多共性。成功的科学家和成功的其他职业人士一样,展现出良好的分析,表达,个人管理,时间管理的能力,正确处理 “合作+竞争”的关系,还有项目管理的能力,等等。 这些能力的获得,都需要练习,特别是 “专注的,有反馈的,持续改进的” 练习。为何这些技能不能在大学里训练呢?这样的训练不就是职业培训的一种方式么?
  • 科学家作为一种职业,也要持续地给自己充电,通过出席研讨会、阅读、或参加课程来学习。例如最近一些科学家都参加了如何使用 “云计算” 来帮助科研的课程,或者参加 “教育心理学” 的课程。 科学家在参加这种课程的时候, 也有企业的人员或中小学老师参加, 大家不都是一样职业的培训么? 为何看不起职业培训呢? 在培训过程中,有人获得顿悟,立即成为 “完整的人,高尚的人”; 也有人是渐悟,逐渐提高了自己的修养;还有人就是学到了一些技能,这也无妨,对吧?
  • 或曰:"大学是培养人心智的地方,急于把自己安塞到社会中的某个岗位会让大学生急功近利,失去本真的学习快乐。"  对IT 专业来说,心智如何培养?平时抄作业,考前哀求老师画重点,就能得到心智? 想偷懒,不想面对现实,那就直说,不要拿“心智”来搪塞, 要格物致知,要深入研究,练习,要分析IT行业发展的源和流。 没有脚踏实地的实践而奢谈 “心智”, 仿佛临渊羡鱼,或幻想空中楼阁。
  • “大学之道,在明明德...”  , "为天地立心,为生民立命,为往圣继绝学..."  古人的话,真的很美。但别自我麻痹太多,现代的大学之道应该能分解为可衡量的,可执行的,可具体传授的各个部分。教育者要分而治之,把大学生的职业培养搞好,让大学生毕业后能跻身于一流的研究院或大学,一流的企业。或者,毕业生去了一些普通的单位,甚至没有单位,但是他们有信心在社会上自立。这,就是最基本的大学之道。

很多持有“大学之道” 这种心态的人, 他们想象中的老师就是不食人间烟火的得道之人,学生是来求道,但是有时你看老师的生活和工作也很憋屈,他们得 “道” 了么?如果没得道,怎么能教学生呢?大学的师生关系应该如何?请看这个详解。 

学校教育的目的

有一年, 我教的一个班是大三的学生, 他们反映课程压力很大 (同时上编译原理, 数据库等), 我跟系里建议是否把软件工程挪到大四去上, 这样他们学的数据库知识能更好地用上. 系里的老师列出了很多担心, 其中最重要的一点是 - 学生们大四的时候要考研, 所以不能上太累的课, 要让他们有时间为考研复习! 我们谈论了许久, 我终于明白学校在选择 “让学生上有意义的课” 和 "让学生有时间准备考研" 两者之间, 选择了后者。 其实天朝学校的目的大抵如此 - 让学生顺利地升入下一个阶段, 就成功了。 在这种思想指导下:

小学六年级开始复习, 准备小升初;
初三开始复习, 准备升好的高中;
高三开始复习, 准备升好的大学;
大四开始复习, 准备考研;

有些同学还要花很多时间准备考一个 “国考”。

最后, 学生到了社会上, 发现再也没有考试了, 要靠真本事, 怎么办? 学校可曾教过他们? 老师们, 你自己锐意改革过么? 你们可曾真的教过学生 “锐意改革, 开拓创新”? 

想创新, 如何教创新

到大学里听领导的报告,你会听到很多次 “创新”和与“创新”相关的词汇。 你觉得这个学校的领导的确非常想创新。 但是另一方面,我听到一些同学反映教材,教案,教学方法都是几年甚至十多年不变的老一套,和实际非常脱节。 难道老师们不想在教学上创新么? 后来有比较了解内情的人跟我说,现在软件相关的专业非常热门,毕业前景也不错,一些计算机系的老师能拿到不少项目,资金也不少, 老师和领导都忙着开公司去了。他们为什么要在教学上创新? 重用几年前的教案不也这样过来了么?!

在软件学院里,怎么教创新? 除了让学生打下坚实的专业基础之外,学校可以做的一件事就是 -

 

允许学生实验,失败,再实验,再失败。

 

我不用重复爱迪生经过几千次失败才发明可以实用的电灯的故事了,创新不是公式推导,不是一旦学好例题,就能模仿炮制的解题方法。 要给同学们试验和失败的机会。 有人问 - 学生失败了,课程怎么给分呢? 如果同学们能够认真总结经验。同样也可以得到比较好的分数。 这些同学真正到了工作中, 以前失败经验教训就能帮助他们更好地创新。我在给学生上《软件工程》课程的时候的评分标准大致是:

  1. 有创新的想法,并成功实现,优。
  2. 有创新的想法,但是失败了,能认真总结,优。
  3. 无创新的想法,能成功地实现平庸的计划。 良好。

一些关于创新的博客:

创新 - 王屋村的魔方们

IT 行业的创新 - 创新的迷思

 

清一色

一方面,计算机系和软件学院的各年级学生年龄一样,背景一样。 老师像种庄稼一样,一茬一茬的播种和收割。每次课程和作业,同学们都是从头开始。大家懂得一样多, 大家都是理工科学生的思维。

一些软件学院收了双证的学生后,情况好了一些,毕竟有一些别的行业,别的经历的同学进来了。这些人组成的团队能互相取长补短,对学生们很有帮助。 我建议要尽量打破 “清一色” 的配置模式, 很多学校有 “工业设计” 等设计类专业,“经济管理”等管理类专业,他们其实可以在学校里就和软件专业的学生一起上课, 做项目, 拿学分。

 

三文鱼模型

很多学生在学校里认真学习了很多软件知识,在同学中间也很牛的样子,于是他们踌躇满志地毕业了。 但是到了工作单位,他们发现项目组中老中青,各种背景的人都有。 没有人请自己从头设计全新的软件, 自己得从读别人的代码,维护软件系统上手。 我在《移山之道》 这本书里写过 “三文鱼模型”:

 

软件学院的小慧老师对阿超抱怨,软件工程这门课看似容易,实际太难教。

小慧说:我是按照经典的瀑布模型来讲课的,本来以为会是高屋建瓴,一泻千里,但是实际情况是这样的:

1. 需求分析:学生们都不懂企业的需求是什么,上课睡觉。

2. 设计阶段:学生们画了许多 UML 图,用设计工具画了各种形状的图形,仅此而已。

3. 实现阶段:学生们开始热烈讨论,UML 图早已经扔到一边。

4. 稳定阶段:学生们中十分之一的人开始写代码,其他人不知道在干什么.代码大部分情况下都不能工作,所有设计过的种种黑箱和白箱测试都无从开始。

5. 发布阶段:这个阶段只有一天时间,就是最后检查的那一天,同时还有人在调试程序.

6. 维护阶段:课程结束了,同学们对自己的产品没有任何维护,放假了!

最后大部分同学们都说自己根本没学到什么本事,然后下个学期,新的一批学生进来重复这一过程。。。

阿超沉吟半晌,说,事实上,一个软件工程师在现实世界中的职业发展好像和瀑布相反:

1. 毕业进入公司,开始维护一些已有的软件(维护阶段)

2. 能够在项目中改一些bug,然后发布小规模的更新版本 (稳定/发布阶段)

3. 负责重写一个小小的模块,没有文档,写很多代码(实现阶段)

如果做得还可以, 就会进入下一阶段:

 

4. 有机会设计比较大的模块,自己写一些文档 (设计阶段)

 

过了很长时间,才发展到下面这个阶段…

5. 有机会去和用户谈新的项目 (需求分析)

 

那软件工程的课程能否也像这样安排? 可以试一试这样的流程:

1. 开始维护以前同学开发出来的程序,理解程序。

2. 找bug,改bug,重构小部分代码,以满足用户的需求。

3. 一部分同学可以开发测试用例

4. 在现有版本的基础上做增量开发

    a) 理解需求 (这个时候理解了客户需求是什么)

    b) 设计

    c) 开发

    d) 回归测试 (用到上面开发的测试用例来保证软件质量)

小慧问:那这是什么模型?

阿超说:嗯,看起来像是从瀑布下方一步一步上溯到源头,不妨叫“大马哈鱼洄游模型” , 或者简称“三文鱼模型”

我们在学校里,不妨多实验一些不同的模型和学习方法。

 

参观学习

很多学校貌似也很重视和业界交流, 他们的领导经常去世界高水平的学校和公司考察。 参观, 感慨, 吃饭, 合影, 回国 … 又参观, 感慨, …

我就不多说什么了, 看下面的两则笑话:

 

http://sports.sina.com.cn/c/2011-10-27/08005804467.shtml

前日本足协主席川渊三郎这样说,在他的记忆中,中国足协几乎每年都会派考察团到日本学习。 至于效果,他直言不讳:“这么多次考察,都白来了,中国足球没有任何提高。”

还有日本足坛人士提到:你们总是喜欢强调“国情”,当然我们也很理解,毕竟大家属于两种不同的社会制度,但这绝对不是理由,也不应该老挂在嘴边。

 

王屋村的果冻到阿超家, 说是找一个东西, 阿超帮他找了半天, 无果。 最后两人都累了, 阿超请果冻吃了炸酱面。

阿超问: 你想想, 东西到底是在哪里丢的?

答: 很可能在我自己家里。

问: 那为什么来我家找?

答: 我家没灯, 你这儿有灯, 亮堂! (还有炸酱面...)

 

期望

很多人都对学校有各种期望, 我也有过期望, 希望 (http://www.cnblogs.com/xinz/archive/2010/11/27/1889829.html).

但是, 期望越高, 反而被动, 失望也越大, 就像有人说的 - 上大学, 结果却被大学上了.

马克·吐温说过一句话:

I have never let my schooling interfere with my education.

 

我年轻的时候不知道这句话是什么意思, 现在好像懂一点了.  人的成长, 成熟, 也许绝大多数都不能只依赖于学校, 去埋怨学校说 - 你为什么没有把我教好? 

 

你不但不应该浪费时间去依赖, 埋怨学校, 而且还要有意地摆脱学校 (以及其他”体制”) 对你的影响 – you own your own education, don’t let your school interfere with it.   你对你自己的教育和成长负责, 课本不好? 有网络, 象牙塔不爽? 到社会去。 

有人说:

人都是在路上成熟的

 

但是你得上路啊, 靠体制, 靠青年导师, 靠... 都不如靠自己, 自己走吧.

   "青年又何须寻那挂着金字招牌的导师呢?不如寻朋友,联合起来,同向着似乎可以生存的方向走。你们所多的是生力,遇见深林,可以辟成平地的,遇见旷野,可以栽种树木的,遇见沙漠,可以开掘井泉的。问什么荆棘塞途的老路,寻什么乌烟瘴气的鸟导师 ! "

 

posted @ 2011-12-03 09:24  SoftwareTeacher  阅读(11705)  评论(30编辑  收藏  举报