现代软件工程讲义 0 教学方法

这门软件工程课的教学方案在这里. 根据学生和学校的具体情况, 可以进行调整。 这篇文章主要讨论教学方法  -- 怎么有效地教这门课。为了达到这个目的,我们要讲在这个课程中建立什么样的师生关系,怎么样让学生投入进课程中,老师采用什么样的教育方法,如何判分,如何让学生学到软件工程的技能。 

教学的基础 - 师生关系

首先要明确的是师生关系应该是什么样的? 大学目前的师生关系是怎样,  老师和学生都是成年人,不再是老师教小孩子,那么什么样才是理想的师生关系?  我们先看一些例子:

不成关系的蜡烛、春蚕和园丁?一说到老师,很多人就会心情激动,把老师比作燃烧自己的蜡烛,吐丝的春蚕,且不说现在的老师早就不认可这种形象,那么学生是种关系这里面的什么东西呢?另一个比喻是园丁和树苗, 园丁多么崇高啊! 杏坛讲学, 桃李满天下... 其实未必,龚自珍的《病梅馆记》也描述了园丁的不当行为。  当树苗有自己的思想的时候,“树苗”有时候也不喜欢 “园丁”:

   又来给我施肥,剪枝,喷农药!我的枝条就要这样长,你管不着!农药好臭啊,我不要,差评!滚出!

大学生不是植物,而是有自己独立思想、人格的成年人, 他们在这种关系中不是任人摆布的物品。 如果把大学生当作成年人,我们就会进入下面几种比喻的一种:

Retailer / customer (餐馆/食客)?  一些学生说, 我既然交了学费来上学, 就像交了钱去自助餐厅一样, 想吃什么、吃多少, 都是我决定。如果不喜欢, 下次就不来。上课能这样么?  在如今的饮食行业, 顾客事先可以查看任何餐馆的评分,吃了之后,还可以给餐馆打分,写评论吐槽。在学校里能这样么?目前中国只有很少的大学允许学生选课前看到多位老师的教学评估分数,学生的公开点评。即使有这样的信息,学生的 “选课学习” 和 “去餐馆吃饭” 还是不一样的。 食客会赞许 “量大,菜品质量高!”  但是大部分同学不会拍手赞美 “哇,老师好棒! 讲得深入,作业量大,考试严格!”  很多学生偏爱的是 “作业少、不点名、给分高” 的老师。我们说十年树木百年树人, 既然成才需要时间,评价是否也需要时间? 学生给老师评价,最好的时间是什么时候?是上课刚结束时? 考试后?拿到毕业证后?毕业一年后,十年后? 学习最好的同学和学习最差的同学之间,他们评分的权重应该一样么? 最有效的评价教学水平的方式,和去餐馆吃饭点评是有很大区别的。单纯依靠学生短期的评价来驱动教学,会迫使老师把一门有价值的课改成一门水课。 

令人欣慰的是,有些大学已经做了这样的尝试:

 

当老师和学生的关系完全陷入金钱关系之后,会堕落到这种情况:

  老师,我的家人已经给我找到工作了,未必和你的专业相关,我就差一个学位证就可以上班了。我花钱来上学,就是为了得这个证。 你能不能给我过了?

老师怎么回答?如果大学堕落成卖证的地方,那倒也讲得通啊?! 问题是,大学的目的是什么?大学给学生开各种课的目的是什么?是要保证学生达到毕业的最低标准。

更多的情况下,在校学生未必有确定的工作, 他们必须要在一定期限内选课,完成学分。而老师掌握着最后给学生多少分, 学校掌握着毕业证。  所以这不是餐馆/食客的关系。 学生们有时非但不能成为有主动权的顾客, 反而会被人以分数/学位/毕业证相要挟, 成为下一种关系中的弱者:

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

 

Baby-sitter / Babies (保姆 / 幼儿) ?  有时,  老师像保姆一样, 为学生操办一切, 关心学生的宿舍卫生,生怕学生在学校出什么问题。这种关心的态度是好的,但是在学业上,有些老师把把课程内容煮成婴儿食品, 一勺一勺地喂给同学。 同学们有什么问题, 都去找老师搞定。 学生把老师反复咀嚼过的东西再咀嚼一遍,  会觉得课程很乏味,这样的教学方法可能在幼儿园有用,但是并不适用于大学,保姆虽然对娃娃们有感情,但未必能保证学生们达到毕业的标准。 这个模式和这门课的 “做中学” (Learning By Doing) 有很大的区别。有些人认为,老师的爱这么溢出,学生享受这个保姆的爱也很温暖啊! 其实, 这种畸形的关系是很有副作用的,请大家搜索一下最近的一些副作用的例子。 这种不正常的关系还会恶化成 奴隶主/奴隶 关系,导致违法行为。  正常的大学生并不会感谢保姆,而是想法逃离这种关系。

大学生的幼儿,显示了不少 “巨婴”的可爱之处,例如学校让他们学习扎实的理论和先进的实践, 他们会同时说这两句话:

这门课(高等数学等理论课)我在实际中根本用不着, 为何要教得这么难呢?

这门课(软件工程等实践课)我们又不是全职的工程师,我们只是学生,我们为什么要按照全职工程师的要求来做事呢?

 

Buddies / Buddies (哥们 / 哥们) ? 还有一种情况是, 老师和学生心照不宣一起混,  “你对我好, 我就对你好".  请看新闻:

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

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

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

有不少同学认为,  这种关系挺好的, 老师像哥们一样来关心你。当老师在第一节课说“我们一起来学习软件工程” 的时候,很多同学幻想和老师能形成平等的 “朋友” 关系。 其实,  “平等的朋友” 这种亲密关系很少存在于师生之间。 首先, 你上完大学要找工作,老师已经有很稳定的工作了。 “一起学习”  只不过是套话! 其次,老师要为自己工作与生活奔忙,没有时间和几十个学生做亲密朋友; 最后,  大学的学习就是有难度的,  就是要付出足够的努力才能及格。老师就是要评判你的努力程度,  给你不留情面地打分,   一个幻想中的 "哥们儿" 帮不了你。你上课偷懒,逃课,不交作业, 你的“朋友” 看到后会怎么样?你的老师会有一样的反应么? 

保姆、哥们都是熟人, 在熟人社会的关系网中,你可以撒娇,本来可以上网搜索到的信息,偏要问老师和助教(希望他们马上给答案),不按时交作业,撒个娇就能混过去; 在团队项目中偷懒,期望大家有“都是哥们,帮我一下吧”的热心肠...  这是害了你。  成年人应该要适应“陌生人社交”,遵守共同的规矩,按契约精神办事 -- 大家可以看看熟人社会和陌生人社会的区别

 

Stranger / Stranger (路人甲 / 路人乙)? 很多学校有巨大的新校区,  同学们来到新校区,不知道这是大学一年级,还是高中四年级。开学之后,老师乘车来到新校区,对着百人左右的课堂宣讲幻灯片, 下课后就乘车回老校区或市区的家里。 老师不认识学生, 也未必有精力了解具体学生的情况;学生平时也见不到老师,即使碰上了, 双方也形同陌路。学生看不起、不了解老师,不想听课,那吃亏的是谁呢?请看这个 你为啥要上课认真听讲

 

Prison Guard / Prisoner (狱警 / 犯人)? 还有一种情况是老师想方设法让学生来上课,  点名, 突然测验, 指纹打卡, 诱惑大家会在课堂上划重点,等等.  学生则想方设法逃课。 学生视上课为坐牢, 巴不得早一点解放。对于一些同学来说,  老师就是学生和 “自由” 之间的一道障碍。请看同学们的各种吐槽。  

一些读者幼稚地认为老师和学生的关系未必会堕落如此, 其实还有更差的, 大学老师在学校的教学任务是按照课时来计算的, 只要课时固定, 那么学生太多反而对老师是负担。一个老师如果教得好, 很多学生来选课, 那么这个老师反而吃亏!如果老师严格要求,给差生不及格的分数,她还要准备补考的各种材料,这更浪费了老师的时间。 所以很多大学口头声称  “鼓励选课, 老师热爱教学...", 其实都是烟雾弹。 对于很多管理者来说,最好的情况是:

  学生不能选课,老老实实呆几年毕业滚蛋, 然后学校满怀激情地希望毕业生在社会上马上做一个创新的人才...

这种情形类比于狱警/犯人的场景是很贴切的, 就是狱警希望自己上班时间管的犯人越少越好,越老实越好!  一个餐馆的老板当然希望食客越多越好, 但是狱警却不会这么想。大学生可以问自己的老师 “您希望有更多的学生来上这个课么?”  如果老师不希望, 那么,你的老师对这个课的感情比不上餐馆老板对餐馆的感情,这更像一个 狱警/犯人 的关系。  ;)

 

说了这么多不好的例子,  我心目中理想的师生关系是什么?  是  Coach / Trainee (健身教练 / 健身学员) 的关系。

image

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

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

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

为什么教练必须严格要求?因为学生的真实成绩对自己的口碑,健身馆今后的收入有直接影响。

如果大学里能确定下教练和学员的关系就好办了。 每一个来学习的学生,  都是想学好才来的。  各人条件不同, 学好的目标也未必相同。  有些同学想成为世界一流的软件工程师,  那老师就会以世界一流的标准来要求学生;有些同学只想拿一个及格的分数, 那老师也会在尊重学生选择的基础上,告诉他如何才能及格,并严格执行评分标准;有些同学想在某个领域深造,老师也会提供相应的指点。 但是,学生别想只付出 "及格" 的努力,却期望收获“优秀” 的结果,或者没有付出足够的努力,却期望老师最后放水让自己及格。 

谁要在这门课中写代码, 做实验, 找需求, 修bug?            是学生, 不是老师。

谁要看各种与专业相关的文献和博客, 并定期汇报学习心得?   是学生。 

谁给各个学生设计练习, 回答疑问, 点评学生?               是老师。(强者喜欢批评)

如果学生的努力低于目标的要求,  谁会批评这个学生?        是老师。

谁会犯错误,并从错误中学习?                             学生,有时老师也会犯错误。

谁是完美无缺的?                                         没人。 老师和学生都会犯错误,在快速变化的 IT 领域,我们要不断探索,犯错误是成长必经的道路。 

有些学生说:

    老师, 你讲得特别好, 我特别想提高, 但是我太忙了, 所以没时间写程序, 我就是来听听。。。

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

    教练, 你讲的特别好, 我特别想减肥健美,  但我太忙了, 没时间练, 所以我办了卡, 就放在兜里,有时候拿出来看看。。。

这种学员还真的有,  据说健身场馆的很大一部分利润就是来自于那些办了年卡但是很少来的人。当然,还有来健身房一小时,前五分钟锻炼,后面五十五分钟自拍/修图/发票圈的。

健身教练/健身学员的关系对教练也有要求, 最基本的就是及时给反馈。  很多老师给同学留下语焉不详的作业, 就听之任之了,美其名曰“希望学生自主学习,自我提高”, 这是不合格的教练!  想象一下,一个教练在16周课程中, 只给学生两次反馈(期中,期末考试), 这是合格的健身教练么? 这种 “教练” 在大学里是不是很常见呢? 如果你经常去健身俱乐部练习各种器械和套路,你希望你的教练何时给你反馈,纠正你的动作,给你鼓励? 如果你的教练最后说, “你三月前的某个动作不对,我没有提醒你,你也没有改正,导致你现在的肌肉损伤...”,  你能回忆起这个动作么?觉得这个教练合格么? 当老师很忙的时候,我们希望助教能担负起及时给反馈的重任。另一方面,学生也要及时给老师反馈

很多人希望老师和学生之间特别和谐,是否相安无事就是最好?古希腊学者普罗塔戈说过:「头脑不是一个要被填满的容器,而是一束需要被点燃的火把。」那火把在什么时候会被点燃?那么最好的情况是不是老师和学生的思维互相撞击,蹦出火花,一起燃烧?这种情况,会在餐馆/食客, 路人甲/路人乙,狱警/囚犯的模式下发生么?很显然,教练/学员的关系是最有希望撞击出火星的,老师和学生之间要有足够的工作量,足够的张力。“为学要不疑处有疑”, 有质疑,有冲突,有鼓励,才会出现火花。教育学家 保罗・弗莱雷也严厉批评过传统教育的“银行储蓄观”-- 老师把‘知识’存到学生被动的脑袋里,他提出了著名的“对话式教育观”。弗莱雷认为,我们的教育不是谁教育谁,也不是自己能教育自己,而是人们通过改造世界来相互学习。这种教育是平等的、对话式的,对话是一种解放,而非对话则是一种压迫。软件课程,特别是软件工程课,正是“通过改造来学习”的一个良好环境。 

如果老师(一个活人)没有给学生及时反馈,也没有和学生进行其他交流,发生思维撞击,那么,这样的老师是否就是 “路人甲”?他的教学和网上的视频有什么区别呢? 

另一方面,学生作为学员,来健身馆练习,我们对她有什么期望呢?期望她做到刻意练习

- 带着具体目的来上课,训练。 而不是 “刚刚睡醒,一脸迷茫也不知道老师会讲什么”, 在作业上也要体现出来目的

- 学会有效的练习。而不是无效的练习,同学要纠正几个错误的认识:

- 练习可能没有用。 一些同学看了理论,觉得自己懂了,就不练习,找一些借口 “我敲键盘不快”。 其实任何人都可以通过正确的训练来改变自己,关键是要投入时间练习!

- 只要时间长就行。很多同学说自己在以前的课程中 “打了很多代码”,但是实际编程能力还是很差。敲代码但是没有思考和在“学习区”学习,技能并不会持续提高。

- 练习并没有得到反馈和思考。一些同学做完了当前的题目,就高高兴兴地结束了。但是这些题目有很多扩展方向,他们并没有去做,老师给了反馈,也不理会, 这样也不会得到快速提高。 

 

教学的手段 - 师生投入到教学活动中 (Engagement)

“教得好,学得好”有三个要素:

    - 学习的材料 (材料在互联网时代应该很丰富,有一个材料定律:对于老师讲的每一个知识点,在网上一定存在比课堂讲解质量更高的教学内容。)

    - 学习的动力(想学么?)① 如果学生的目的就是找到好工作,那么就让有实际经验的工程师告诉他们,目前他们的水平到底能不能通过企业面试。② 现在的学生多才多艺的很多,学生上学之初对大学还是有很多希望的,但是到了大二大三,大部分同学都是动力不高。怎么唤起他们的动力? 能否让他们不忘初心,从自己的努力的经历中获得新的动力?娄老师让学生回忆自己学习某种技能的过程,这是一个有趣的办法。

    - 学习的效率(怎么学?)老师在课堂上念PPT,学生在座位上昏昏欲睡,这样的学习效率好么?对于老师来说,怎么让学生投入到教学活动中?

如果老师讲课的主要方式就是念PPT,老师投入教学了么?即使老师认认真真地念PPT,学生也认真听了,学生究竟能接受多少?我们先看一个实验

        老师在心里想一首歌(学生都听过,比较耳熟能详的),然后在心里默唱,双手拍出歌曲的节拍。 问:课堂里的学生能猜对歌曲名字的大约有多少?

各类专家做过大大小小的实验,都得到下面的数据:

        在表演前, 大家估计应该有 50% 的听众能猜对歌曲名字。 但实际上,只有 2% 的听众能猜对。

这样的比率是否也存在于讲课中? 老师当然是非常了解教材内容,也认真地念了PPT,我们把上面的比例放到这里,会得出:

        老师自己觉得讲课的内容有 50% 能学生能准确无误地接受,但事实上只有 2% 的学生准确地接受了

应该有怎么样的改进办法?

- 翻转课堂:既然互联网存在更好的材料,为何不让学生在课前就预习,除了老师准备的内容, 他们还可以在互联网上找更多资料

- 悬念:一个几十集的肥皂剧,为何观众追剧不舍?一个十几周的课程,学生为什么上课就打瞌睡?因为剧情有悬念,而PPT 没有。那么怎么产生悬念?

    - 强调竞争,让同学像玩游戏比赛那样有相互的比较。

    - 做有实际用户的项目,不管用户多少,用户反馈如何?这是真的悬念,效果远远好于没有人用的 “图书馆管理系统”。 

    - 仪式感:让学生通过公开的方式展现自己进展和产品

    - 现场活动:让学生在上课就写程序/博客发布。

- 反馈:及时的反馈,老师一个人不能给几十个同学及时的反馈,怎么办?通过结对编程 (马上有一对一的反馈),和团队项目的Scrum (每天的反馈),助教的点评(每篇作业后的点评,每周发布学生进展,最后总结为千帆竞发图)。(举例:娄老师的作业张老师的作业

 

 

老师和学生应该是如何参与“教学”这个过程的呢?我认为关键是要有 Engagement! Engage 的意思是:参与,形成密切的关系。

 

教学是一个相互交流的过程,但是交流真的发生过么?  Alan Alda 那本书的卷首语就是:

 

The single biggest problem in communication is the illusion that it has taken place.


(翻译:交流中最大的问题是这个错觉:交流真的发生过了)

 

2017年开始,我们软件工程课的第一个作业,就是要求学生描述他们之前大学上课的情况, 很多同学提到了这样的模式 - “老师自顾自地讲PPT,学生在下面玩手机”。 或者是:

 

老师开始讲PPT 的时候, 还是有同学做笔记的,后来有一个学生举手问:老师,课件能下载么? 老师回答:能。 于是,做笔记的人也停下了笔。

 

至于台下睡觉的学生,就更不用提了。这个微博上的软工收集了很多师生在课堂上没有身心投入,就像路人甲/路人乙的关系那样。 

 

你在大学里问几个刚从教学楼里出来的学生,“你刚才上课了么?”  不管他们是在玩手机还是睡觉, 他们绝大多数会答“上了”。 “那么,和老师交流了么?”   很多同学可能迟疑一下,说“交流了啊...”  但是交流真的发生了么? 学生真的有身心投入么?

 

  

 

我在讲课的时候,喜欢走下讲台和学生互动, 有一次我正在讲课,看到一个学生一直望着我,于是我就走到她旁边问她刚才我讲的有什么疑问没有? 我心想既然我们八目相对(我们都戴眼镜),一定有很多可以交流的。  但是这个学生没有回答我的问题, 而是小声地问身边的同学 -- 他刚才讲了啥?

 

原来四目相对之时,心思也未必在课堂上。 那么,怎么样才能提高老师和学生在这个过程里面的参与感呢?软件工程课有这么多高大上的概念要讲,如何让学生参与?

 

- 让学生带着明确的目的来

 

学生学习这个课,表面上是不得不来(大部分情况是必修课),但是追问之下,大家的目的还是不一样的,有人为了下一阶段做准备(找工作,考研,选择研究方向),有人就是拿到学分,有人懵懵懂懂。 课堂的第一节课,就要让学生明确地把上课的目的写出来,具体化, 就像这个工程师能力测试模板一样,让学生看看自己还差在哪里。 即使是为了拿到学分的同学,老师也要让他知道拿到学生应该付出多少努力。

 

明确目的,似乎被很多人忽略(老师讲课,学生上课,他们的目的还要重复么?)。 看这个没有老师,没有教程的“42 学校”,他们就是把学生扔到水里,让他们在水里学习游泳。这个体验和一般大学最大的区别是:42 学校只有一个目的:把题目做出来,就像在水里求生一样,只有一个目的:活下来。 在这唯一强烈的目的驱动下,其他的小问题(如何找到资料,如何学习,如何提高)都不少什么问题了。  一般的大学中,学生有很多目的:我这门课大概混混就可以及格的, 那么,这个学期我要去准备考公务员,考外语,社团有活动,放飞一下自我,美食,朋友,实验室,过节早点回家去玩...  

 

- 让学生带着自己的问题来

 

学生每个人的兴趣,技术基础都不一样,老师如果是阳光普照地给大家讲,那么,这个讲课为何不能做成录像让同学事先就看?学生发现内容并没有针对自己特有的问题,为何他要来课堂?学生看了书,产生了问题,通过实践和更多的阅读,改变了以前的想法(例子),甚至产生了新的问题,导致新的探索。这就是上面讲的  -- 真理之川,从错误之沟渠中流过。当然每个人的真理之川都不一样。

 

 - 因材施教

 

教育大师苏霍姆林斯基说:“没有也不可能有抽象的学生”。 软件的有些概念虽然抽象,师生交流的时候,并不是和一个抽象的学生在交流。但是要看到学生是具体的,活生生的,有不同的目的和困惑。即使两个学生的目的和困惑类似,但是他们可能处于不同的成长阶段(参见《构建之法》图 17-1 能力和动力的四个象限),也要区别对待,给予不同的建议。只有这样, 学生才有身心投入的条件。 

 

- 保持高要求

 

因材施教并不是降低要求。 例如,有学生迟交作业, 怎么办?  优秀的教师说, 这些作业的质量不因为迟交了就降低, 但是, 迟交了作业, 就意味着老师不能及时给这些作业及时的反馈, 从而影响学生的学习。这个责任应该由学生来承担,没有交流的作业,能得多少分呢? 0 分是一个不错的选择! 

 

老师希望看到学生对课程的反馈, 老师期望学生能认真填写反馈意见,对于那些不填的学生,老师应该给多少分呢?如果一个老师不给学生的作业任何反馈, 那么这个老师及格么? 如果一个学生不填写对课程的反馈, 那么这学生及格么?

 

教学手段 - 瀑布 vs 大马哈鱼洄游

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

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

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

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

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

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

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

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

 教学手段 - 全面锻炼

很多学生和老师抱怨《软件工程》课就是记住一些干巴巴的名词和原理,这就是学习的全部目的了么? 美国教育心理学家布鲁姆(Benjamin Bloom)将教育(学习)目标分为认知、情意、技能三类。在认知领域中,由低到高又可细分为知识、理解、应用、分析、综合、评价等六个层次,我们看看《现代软件工程》的教学方案怎么样全面锻炼学生对于软件工程的认知:

知识:就是记忆、认识,能回忆重要名词、事实、方法、规准、原理原则等;(Knowledge)                

    //软件工程的名词,原理,能回忆编程语言的某种知识
理解:是要能对重要名词、概念之意义有所掌握,能转译、解释;(Comprehension)           

    //名词、原理的解释, 能理解单元测试、效能分析工具是怎么帮助
应用:是要能将所学到的知识概念、方法、步骤、原则通则等等应用到不同的情境中; (Application)    

    //把原则应用到各种情境场景中,能开发各种类型的应用程序,和不同类型的人合作
分析:是要将知识的某些讯息,所包含的成分、元素、关系、组织原理等等分解出来,重新加以组合,并厘清之间的关系; (Analysis)   

    //能将用户需求分解为不同优先级,厘清功能之间的依赖关系 
综合:是能将知识讯息的某些要素重新安排或合并为有组织的整体,或呈现其间的关系; (Synthesis)         

    //能用WBS 等方法把项目的目标细化,分配到人,能用燃尽图展现项目进度
评价:是要依照某规准对知识讯息做评价或比较。 (Evaluation)                        

    //能够评价别的软件工程的质量,能分析市面上流行软件的优劣并探究深层原因,能对自己项目进行回顾分析,并提出改进

教学手段 - 负担问题

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

负担是相对的, 这要看大家要跟谁比了。 我在清华大学上课的时候, 也有学生反映“负担太重”, 我只好和他们一起回忆清华大学校长及各级领导提出来的目标 – “建设世界一流大学" .  如果要建设世界一流大学, 那要跟世界一流大学比。  在软件和软件工程方面世界一流的大学是哪一家呢? 我想唯有跟卡内基·梅隆大学 (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 (alpha/beta).
 
team project has 6 people.
rotate team member in each project.

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

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

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

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

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

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

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

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

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

image

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

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

a) 不经过准备, 直接上

b) 只学理论, 没有实战

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

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

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

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

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

image

负担通常会带来痛苦, 但是和将来的后悔相比, 哪个更痛一些? 这个问题也写在 NBA 凯尔特人队的训练馆里:

 

 

把压力当朋友,很多读者看到这里, 会问: 这门课貌似有很多作业和规则,不讲情面的老师,是否压力很大? 人们对待压力主要有两种态度

    ① 压力会影响我的健康

    ② 压力不会影响我的健康

有意思的是, 这两种态度都能导致和态度一致的后果! 请看TED 的演讲

除了态度之外,我们还要有具体的手段来帮助我们卸掉压力,或者,把压力转化为令人心情愉快的动力。 就像上面提到的演讲所言, 如果我们能在有压力的课程中互相帮助, 从老师,业界专家,学长,学弟学妹那里得到帮助, 并且反过来,帮助别人,那么,我们学习的过程就会有很多乐趣,这些乐趣会从心理上和生理上让我们更好地进步。这也是为什么我们的课程中设计了结对项目, 团队项目,互相的交流,点评,帮助环节。  

教学手段 - 如何判分

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

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

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

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

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

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

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

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

以此类推…

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

image

这样公平么?  很多人会问。  如果一个同学写了没有任何bug 的程序, 得到10分, 另外的同学程序有 1 个bug, 得到9.5 分, 程序编译都不过的同学, 也得6分, 那你觉得这样对写了全对程序的同学公平么?  如果一个同学的程序连普通的冒泡排序都比不过, 老师和助教在花时间陪他玩,  还有同学抄袭,耍赖不交作业,这些同学在无端耗费大家的时间, 这样的人不得负分得什么?

更详细的打分规则请看这里

 

教学手段 - 做中学,真实的项目和人员流动

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

真实的项目,真的人员流动

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

既然真实,就会有人员流动的问题,因为:

- 有人想去做更好的项目

- 有人离开公司(退课)

- 有人和团队中的人合不来

- 有人觉得自己应该得到更多报酬 (分数,钱,股票),不愿意在原来的团队干了

- 有人做得很差,团队觉得没有他更好... 

 

 这样才会有人员流动,才要让软件保持 “可维护性”, 否则项目没法活下去。 所以,我们在团队项目的 alpha 阶段后,强制所有团队必须有一个人离开。 这个人要自己找能接纳自己的团队(不是原团队),经过新团队的同意,双方谈好了 责任/权利/义务/报酬,就可以在一个团队工作了。 有不少同学做过了一个项目 alpha 版,觉得应该尝试别的项目,他就可以利用这个机制在一学期内做两种项目,有更多的体验和收获。  有的同学抱大腿,打酱油,不想出力,那么,团队就把他请出去,他自己再找别的团队证明自己的价值。 这不是挺好么?详细分析在这里

 

教学的评价 - 教学成熟度模型

教师工作有很多特殊性,和其他行业相比,有更多的从业道德的要求。但是,教学过程也和社会上的各种活动有共性。例如,它和软件开发过程有很多类似的地方,也是有生命周期, 有重复、迭代发展的过程, 有产品(学生学到了知识和技能), 有各种用户(领导、学生),有具体的效果和反馈。 软件开发过程有成熟度模型 (CMMI), 一个老师的教学是否也有教学成熟度模型呢?教学,从孔夫子那时候算,有两千多年看历史; 从现代高等教育理念进入中国大陆开始算, 也有一百年。 IT 专业的教学每学期在全国上千所学校中进行, 学生有吐槽的,有无动于衷的,有赞扬的。 如何分析各种程度的教学?我们借用CMMI 的几个档次来说明一下:

CMMI 一级:初始级

能差不多完成教学任务,但是有关键元素遗漏,课程的各个元素并没有结合起来完成教学的目标。 这个课程里学生学得如何,全靠运气。

如果问老师:您的学生做的项目有源代码么? 老师通常说:哦,我找一下,好像在哪个U盘里,找不见了。

如果问老师:有哪些好学生? 老师通常说,“哦,前几年有一两个好的, 但是这两年学生质量太差..."

我以前和一位老师合作过,他看过全部的教程, 也参与过scrum 等开发过程。 等到他上课的时候, 原计划是学生要做为期 10 天的冲刺,做出一个版本。 但是学生抱怨:老师我们还要做其他社会活动,找工作...  于是他减少到 7 天。  然后学生继续抱怨求情, 最后他减少到 3 天。 但是,3天的冲刺能做什么呢? 

结果项目评审的时候, 所有学生小组都没有写出能运行的代码, 倒是有精美的PPT.  

这个级别的老师的口头禅是:

  你们是我教过的最差的一届!

  现在的学生不自觉,比以前差多了。他们学不好我也没办法。 (佛系的老师!)

学生觉得:稀里糊涂就过了这个课。 这种老师在学期中也许能获得学生的好评,因为好说话。 但是学生醒悟过来之后,对这种老师的评价就难说了。 

 

 

CMMI 二级:管理级 (可重复)

所有的教学内容都有保存并能检索到,能按照既定的流程讲完全部内容,对整个教学过程有一定的监测,能发现问题。上个学期怎么教的,这个学期还能绝大部分重复下来。这个基本也叫 “可重复” 级。  

学生觉得:要求挺多,能学到一些东西。但是教的东西几年都差不多,问学长拿到以往的考试题目就差不离啦。

领导和同事觉得:能稳定地教完一门课,几年都一样。就像这篇文章说的:教书多年,一直靠年轻时学的那些老本过活

 

CMMI 三级:明确定义级

在前面的基础上,能描述教学质量的关键因素,能初步测量关键因素,并有针对性地逐步提高教学质量。

学生觉得: 这个课程有难度,而且每年都有小改进。

领导和同事觉得:每年都看到一些新意。 

 

CMMI 四级:量化管理级

在前面的基础上,能把各种关键因素量化, 每个重要的作业都有数量化的指标,每年衡量并找到改进的办法。 教学流程趋于稳定,提高管理的精度,降低教学活动在质量上的波动。除了教学的内容, 还开始处理学生学习的心理问题。 

学生觉得:有挑战,有难度,学得累但是有收获。

领导和同事觉得:能进行教学研究工作, 有各种量化的数据,能发表教学研究的文章并有量化数据的支持。 在校内有非常正面的影响力。

 

CMMI 五级:优化级

在前面的基础上,能充分利用各种信息,对教学过程中可能出现的问题加以预防,能主动改善流程,运用新技术和方法,不断优化教学过程。 除了教学内容, 教学中师生关系, 学生的学习心理也达到优化的阶段:学生不再是 “老师要我学”, 而是 “我要学,我希望老师给更多挑战,我也可以和老师平等探讨各种问题”。 

学生觉得:是最有价值的课程之一,基础好的学生和基础差的学生都能获益。 

领导和同事觉得:不断有创新, 不断有同行来学习。 在学校外部有非常正面的影响力。

 

结果:学生的收获

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

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

这个课程不讲什么?  这个课程不具体讲某一个程序设计语言, 也不讲 UML, 设计模式。 这些内容都应该属于其它课程,学生在这门课程中可能会用到新的语言,用到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

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

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

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

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

 

 

posted @ 2011-05-16 20:07  SoftwareTeacher  阅读(22174)  评论(28编辑  收藏  举报