《现代软件工程》:师生的关系是怎样的?

来源:互联网 发布:海康网络解码器 编辑:程序博客网 时间:2024/04/27 20:18

原文地址:http://www.cnblogs.com/xinz/archive/2011/05/16/2048044.html

作者:邹欣(微软亚洲研究院首席研发经理,《编程之美》作者)

现代软件工程讲义 0 课程概述

这门课的教学方案在这里. 根据学生和学校的具体情况, 可以进行调整。 

师生关系

首先要明确的是, 在这门课中的师生关系是什么样的.  大学目前的师生关系是怎样, 什么样才是理想的师生关系?  我们先看一些例子:

Retailer / customer (餐馆/食客)?

一些学生说, 我既然交了学费来上学, 就像交了钱去自助餐厅一样, 想吃多少, 想吃什么, 都是我决定.  如果不喜欢, 就去下一个餐厅好了。 上课能这样么?  在饮食行业, 顾客拍拍屁股就可以离开一个餐馆.  在一些学校里, 是有不同的老师上类似的课程, 同学们可以根据老师的介绍和师兄师姐的提醒选择适合自己的老师。 但是在学校里,  学生必须要在一定时间内作出选择 (必修课), 老师掌握着最后给学生多少分, 学校掌握着毕业证。  所以不能把餐馆/食客的关系照搬过来。 学生们非但不能成为有主动权的顾客, 反而会被人以分数/学位/毕业证相要挟, 成为下一种关系中的弱者:

Boss / employee (老板 / 雇员)?

在学校里, 很多学生把自己的指导老师叫做 ”老板”, 学生变成打工仔或打工妹。 不光有大老板, 还有小老板,  因为大老板太忙, 平时都是小老板在管理。 在一些学校, 博士生要延期一年才能毕业成为了众多潜规则之一. 学生虽然是"雇员", 但是并没有雇员的权利。

Baby-sitter / babies (保姆 / 幼儿) ?

还有一种情况,  老师像保姆一样, 为学生操办一切, 把课程内容煮成婴儿食品, 一勺一勺地喂给同学.  同学们有什么问题, 都去找老师搞定。 学生把老师反复咀嚼过的东西再咀嚼一遍, 这种模式也许可以叫做 Learning by re-chewing.  这个模式和这门课的 “做中学” (Learning By Doing) 有很大的区别。

Buddies / Buddies (哥们 / 哥们) ?

还有一种情况是, 老师和学生心照不宣一起混,  “你对我好, 我就对你好". 这里有一条新闻:

http://edu.163.com/10/1106/10/6KQ4JC8800293L7F.html  

部分大学课堂师生心照不宣一起混

“老师与学生一起应付”,这并非大学生们学习之余的调侃之语,而是不少大学课堂的真实写照。

Stranger / Stranger (路人甲 / 路人乙)?

很多学校有巨大的新校区,  老师对着百人左右的课堂宣讲幻灯片, 下课后就开车回老校区或市区的家里. 老师不认识学生, 也未必有精力了解具体学生的情况.  双方形同陌路。

Prison Guard / Prisoner (狱警 / 犯人)?

还有一种情况是老师想方设法让学生来上课,  点名, 突然考试, 指纹打卡, 等等.  学生则想方设法逃课。 学生视上课为坐牢, 巴不得早一点解放。对于一些同学来说,  老师就是学生和 “自由” 之间的一道障碍。  

说了这么多,  我心目中理想的师生关系是什么?  是“健身教练 / 健身学员” 的关系。



大家可以从各种各样的健身馆中看到这样的关系,  像健身,减肥,瑜珈等等。 在这种关系中, 是谁想提高自己水平?  是那些学员, 这些学员的想法得足够强烈, 他/她才会花钱去参加这样的健身活动。 在健身活动中, 谁要做各种运动, 流汗呢?  是学员。 谁在这个活动中对别人指指点点, 鼓励别人更加努力? 是教练。

那为什么教练可以这样做?  因为教练有下面的资源:

  1. 教练的资质, 教练本身应该在所教的项目中是很有经验的身体力行者。 如果我光看了很多瑜珈的书籍和录像, 或者得到某老师的PPT (如果瑜珈老师用PPT 的话), 我然后就照本宣科去教瑜珈, 虽然我讲的话和一个资深瑜珈教练的话没什么区别 – “现在开始练习冥想, 要尽量让自己内心安静下来,要保持呼吸均匀, 把精神集中在体内 …” 可以肯定留在我这个班里的学生不会很多。
  2. 教练有一套训练计划和各种练习方法, 教练(场馆) 有仪器, 工具, 设备,  不是每一个人都打算在家里放一套各种重量的哑铃和杠铃。
  3. 教练可以随时指出学员锻炼的进步和不足。
  4. 教练(场馆) 能召集到有一群相似基础的队友, 这在有些类型的锻炼是很重要的。

教练和学员的关系如果确定,  就很好办了。 每一个来学习的学生,  都是想学好软件工程这门技术才来的。  各人的先天条件不同, 目标也未必相同。  有些同学想成为世界一流的程序员,  那老师就会以世界一流的标准来要求学生。

谁要在这门课中写代码, 做实验, 找需求, 修bug?

是学生, 不是老师。

谁要看各种与软件工程相关的书籍, 博客, 并定期汇报? 

是学生。 

谁给各个学生设计练习, 回答疑问? 

老师。

如果学生的努力低于他自己目标的要求,  谁会批评这个学生? 

老师会。

有些学生说 - 老师, 你讲的特别好, 我特别想提高, 但是我太忙了, 所以没时间写程序, 我就是来听听。。。

这种情况放在健身学员的类比中会是这样:

    教练, 你讲的特别好, 我特别想减肥健美,  但我太忙了, 没时间练, 所以我办了卡, 就是来听听。。。

[这种学员还真的有,  据说健身场馆的很大一部分利润是来自于那些办了年卡但是很少来的人]

教学方法

那么软件工程课一般是怎么教的呢?  我在这一篇文章里也提到:

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

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

  1. 需求分析:学生们都不懂企业的需求是什么,上课睡觉。
  2. 设计阶段:学生们画了许多 UML 图,用设计工具画了不少矩形框,菱形框,如此而已
  3. 实现阶段:学生们开始讨论非常细节的问题,UML 图早已经扔到一边。
  4. 稳定阶段:学生们中十分之一的人开始写代码,其他人不知道在干什么.代码大部分情况下都不能工作,所有设计好的种种黑箱和白箱测试都无从开始。
  5. 发布阶段:这个只有一天时间,就是最后检查的那一天,同时还有人在调试程序.
  6. 维护阶段:课程结束了,同学们对自己的产品没有任何维护,放假了!

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

我在文章中建议, 软件工程的教学应该考虑让学生一直能保持有具体的事情做, 而且做了之后能看到效果。  不要在学生刚上课的时候就要求写一个需求分析, 学生上哪里分析去?  如何看到效果?  

所以在《现代软件工程》 这门课中, 我安排了个人项目, 两个结对项目, 让大家充分有时间把个人技术和一对一的合作技术做好, 然后再开始团队项目。 一个理想的流程应该是这样:

  1. 开始维护以前同学开发出来的程序,理解程序。
  2. 找bug,改bug,重构小部分代码,以满足用户的需求。
  3. 一部分同学可以开发测试用例
  4. 在现有版本的基础上做增量开发
    1. 理解需求 (这个时候理解了客户需求是什么)
    2. 设计
    3. 开发
    4. 回归测试 (用到上面开发的测试用例)

 

负担问题

很多学生一听说我给他们安排的学习计划, 第一个反应往往是 - 负担太重了!  让我们回到健身馆,  如果一个体质正常的青年想健美, 教练安排他举杠铃, 他会说什么呢 – “杠铃太重, 我走了!” 

负担是相对的, 这要看大家要跟谁比了。 我在清华大学上课的时候, 也有学生反映“负担太重”, 我只好和他们一起回忆清华大学校长及各级领导提出来的目标 – “建设世界一流大学" .  如果要建设世界一流大学, 那要跟世界一流大学比。  在软件和软件工程方面世界一流的大学是哪一家呢? 我想唯有跟卡内基·梅隆大学 (CMU) 相比,  才能不辱没清华大学的名声。

CMU 有一门本科生的课 - Build Virtual World,   是由已故的Randy Pausch 教授讲授的, 我们可以比较一下。

CMU – Build Virtual World现代软件工程

5 projects/semester

2 week/project, done by 4 person team

Rotate team member in each project

4 project/semester:
     1 Idividual Proj. 
     2 Pair Proj. 
     1 Team Proj. 
 
team project has 6 people. 
rotate team member in each project.

他们一个学期要做 5 个项目, 我们只做 4 个。谁的负担重?

所以, 不是我要为难大家, 而是校领导的意思, 同学们可以找校领导说 – 我们不想成为世界一流大学, 成为五道口一带的二流大学就可以了。 如果领导同意了, 我当然可以降低负担, 而且我还可以把师生关系调整为 “哥们/哥们”, 要混还不容易吗?!

我们可以看看古代的历史,  为古罗马帝国开拓疆土的士兵, 他们是如何培训的呢?  请选择:

a) 他们不经过培训, 直接上战场

b) 他们只学理论, 没有实战

c) 他们用比实战更轻的武器训练

d) 他们用和实战一样重的武器训练

e) 他们用比实战重一倍的武器训练

先别说成为世界级的士兵或将军, 如果大家想在战场上活得比别人长, 你会选哪一项呢?   



这个道理对IT 行业的学生也是一样的, 在人潮汹涌的招聘市场, 我们可以问一下那些学生 -

你平时在学校里是如何为将来的职业准备的?

a) 不经过准备, 直接上

b) 只学理论, 没有实战

c) 用比实际工作要求更低的水平训练

d) 用和实际工作一样的要求训练

e) 用比实际工作高一倍的要求训练

在这片神奇的土地上, 我们或许还可以听到 f) 的回答:

f) 我不用准备, 我爹叫阿刚。 


  

如何判分

“分, 分, 学生的命根。 ”

我在刚开始教这门课的时候, 我看到助教给同学们的作业判分是这样的模式:

最好的作业10分, 次好的9.5, 然后依次平滑下降, 有些学生交作业很迟, 有些学生写的程序都不能编译, 这些学生都得到6分左右。

这样的分数体系看起来非常和谐, 但这不是软件业的实际情况.  我们任选一种软件类型,  例如字处理软件, 最好的软件在市场上有多少份额? 第二名占有多少?  第三名呢? 第四名? 谁知道字处理软件市场的第四名是谁? 搜索引擎呢?  第一名的占有率是多少? 第二, 第三, 第四呢?  第四名的软件也是由优秀的软件人员开发的, 他们也许加班更多,  那为什么只有那么少的份额? 这公平么?

由于软件市场有 ”赢者通吃” 的规律 (第一名会占据 50% 以上的份额),  我们在训练中也要体现这一规律. 所以我规定:

如果大家做同样类型的作业, 则采用以下规则:

完成质量在第一档次的同学(一个或多个), 得满分。

完成质量在第二档次的同学, 得 1/2 的分。

在第三档次的同学, 得1/3 的分数。

以此类推…

在很多作业中,  我或TA会写一个比较平庸的解法 (例如用冒泡排序或线性查找)参加作业评比。 这个平庸的作业会得0分, 那比这个还差的作业, 就会得负分,  从-1, –2, –3 类推下去.  下面是两个评分体系的比较:



这样公平么?  很多人会问。  如果一个同学写了没有任何bug 的程序, 得到10分, 另外的同学程序有 1 个bug, 得到9.5 分, 程序编译都不过的同学, 也得6分, 那你觉得这样对写了全对程序的同学公平么?  如果一个同学的程序连普通的冒泡排序都比不过, 老师和TA在花时间陪他玩,  他欠我们分数, 这样的人不得负分得什么?

做中学

上《现代软件工程》 的同学, 都是大三到研一的同学,  应该具备基本的学习能力和开发能力,  软件工程和其他类的工程 (如航天工程, 化学工程) 不一样, 我们每天都可以用到软件工程的产物 (软件),  搭建, 学习一个软件开发平台比航天化工要容易很多 (注: 在自家后院放二踢脚不是航天工程), 相关的学习资料也是非常容易获得。 在这个情况下,  学生们可以在“做”的过程中学习, 这也叫”做中学”.  做了, 有疑问, 再问老师, 问专家, 这样学习的效果会好很多。 我为这门课准备了三本课本, 一本指定的阅读教材, 二十本参考书 (对, 20 本), 同学们平时可以多看书。

真实的项目

在这门课中, 我鼓励学生做自己决定的项目, 但是要求他们要做”真实的项目” – 有真正用户的软件。  那些 “经典” 的项目, 例如图书馆管理系统, 学生学籍管理系统等, 是不符合我的要求的。  项目要有活的用户, 只有活的用户才有活的需求, 才有活的场景, 活的测试用例。 只有活的用户才决定同学们写的软件是否值得使用, 有些团队写的小软件很好用,  在合适的用户群中引起共鸣, 短短时间内, 就会有几千到几万个用户 (像北航团队开发的魔方程序), 也有的团队费了老鼻子劲, 写出来的东西用户量小于10, 自己团队成员包括在内。 这些不同的用户数量会迫使项目团队反思当初在需求分析, 设计上的问题。 另外这门课并不是算法竞赛, 或者代码集中营, 大家比的不是如何快速敲打出某个算法, 而是如何在有限的时间内交付有价值的软件给特定的用户。 “真实”这一条件也促使大家做 “现实”的项目和项目管理。 很多学生有宏大的梦想,  但是在短短的 8 周团队项目时间内, 甚至短短的 16 周课程时间内, 他们发现宏大的构想被自己程序的bug 搞得千疮百孔, 轰然倒地。 

 

学生的收获

在这门课里, 有付出, 就会有收获, 收获体现在下列方面:

  1. 写出一个可用的, 有实际用户的软件。 这对大多数人来说, 是第一次。
  2. 完整体验软件生命周期, 对于生命周期的各个阶段有实际的了解。对于软件设计有实际的掌握。 对敏捷软件开发的具体技术有实践能力。
  3. 了解软件团队的各个角色, 和各个角色的互动.  对于其中一个角色有实际的深入体验。
  4. 学习如何与不同的角色打交道, 培养团队精神, 学会解决冲突的几种方法

这个课程不讲什么?  这个课程不具体讲某一个程序设计语言, 也不讲 UML, 设计模式。 这些内容都应该属于其它课程。

但是从课后的自我反馈来看, 学生往往在某一门“程序设计语言”很有收获, 为什么呢?  第一是因为这门课的个人项目和结对项目让他们有充分的机会学习和巩固关于某一语言的知识;  另外, 他们第一次把某一门语言用到了一个有分量的实际项目中去, 从而深入地了解这个语言的特性。这可以说是<现代软件工程> 的一个好的副作用。

任何一门课都不会一帆风顺地讲下来, 所有人皆大欢喜。 老师学生需要时间来适应,交流,  才能逐步提高。 吹了这么多, 到底学生反映如何? 下面是清华大学的学生对这门课的不记名评价。

评分内容

2007

2008

2009

热情、认真、投入、严谨,教书育人

95.45±3.80

95.00±3.42

98.90±2.21

讲课思路清晰,重点、难点突出

94.55±4.04

89.29±5.77

98.90±2.21

讲解生动、有吸引力,能激发学生的求知欲

92.73±5.15

90.71±5.37

98.91±2.21

师生互动,鼓励学生质疑,并给予思路的引导

94.55±4.04

93.57±3.69

98.91±2.21

提供或推荐的教学资料有助于学生学习

93.64±4.23

86.43±8.19

99.00±2.21

作业等课程训练有利于课程内容的学习

94.55±4.04

90.00±4.95

99.00±2.21

考核及评价方式能激励学生主动学习与钻研

92.73±5.15

87.86±4.88

97.89±3.04

注重学生创新意识和独立思考能力的培养

92.73±4.37

91.43±4.44

98.91±2.21

对学生课外学习给予指导、建议

92.73±4.37

91.43±4.92

99.00±2.21

学习本门课程后有收获

92.73±4.37

90.00±5.38

97.91±3.04

上好课很难, 老师, 学生都不容易, 这个博客讲了一些。

一些学生清澈的, 充满求知欲的眼神告诉我, 他们最关心的是 -

                怎么用最小的代价, 让我过了这门课!

上了这门课就知道代价了。

原创粉丝点击