师生关系

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

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 (狱警 / ×××)?

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

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

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

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

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

  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. 回归测试 (用到上面开发的测试用例)