这门软件工程课的教学方案在这里. 根据学生和学校的具体情况, 可以进行调整。 这篇文章主要讨论教学方法 — 怎么有效地教这门课。为了达到这个目的,我们要讲在这个课程中建立什么样的师生关系,怎么样让学生投入进课程中,老师采用什么样的教育方法,如何判分,如何让学生学到软件工程的技能。
教学的基础 – 师生关系
首先要明确的是, 在这门课中的师生关系是什么样的. 大学目前的师生关系是怎样, 什么样才是理想的师生关系nbsp; 我们先看一些例子:
不成关系的蜡烛、春蚕和园丁/strong>一说到老师,很多人就会心情激动,把老师比作燃烧自己的蜡烛,吐丝的春蚕,且不说现在的老师早就不认可这种形象,那么学生是种关系这里面的什么东西呢一个比喻是园丁和树苗, 园丁多么崇高啊! 杏坛讲学, 桃李满天下… 其实未必,龚自珍的《病梅馆记》也描述了园丁的不当行为。 当树苗有自己的思想的时候,“树苗”有时候也不喜欢 “园丁”:
又来给我施肥,剪枝,喷农药!我的枝条就要这样长,你管不着!农药好臭啊,我不要,差评!滚出!
大学生不是植物,而是有自己独立思想、人格的成年人, 他们在这种关系中不是任人摆布的物品。 如果把大学生当作成年人,我们就会进入下面几种比喻的一种:
Retailer / customer (餐馆/食客)nbsp; 一些学生说, 我既然交了学费来上学, 就像交了钱去自助餐厅一样, 想吃什么、吃多少, 都是我决定。如果不喜欢, 下次就不来。上课能这样么nbsp; 在如今的饮食行业, 顾客事先可以查看任何餐馆的评分,吃了之后,还可以给餐馆打分,写评论吐槽。在学校里能这样么前中国只有很少的大学允许学生选课前看到多位老师的教学评估分数,学生的公开点评。即使有这样的信息,学生的 “选课学习” 和 “去餐馆吃饭” 还是不一样的。 食客会赞许 “量大,菜品质量高!” 但是大部分同学不会拍手赞美 “哇,老师好棒! 讲得深入,作业量大,考试严格!” 很多学生偏爱的是 “作业少、不点名、给分高” 的老师。我们说十年树木百年树人, 既然成才需要时间,评价是否也需要时间学生给老师评价,最好的时间是什么时候上课刚结束时考试后到毕业证后业一年后,十年后学习最好的同学和学习最差的同学之间,他们评分的权重应该一样么最有效的评价教学水平的方式,和去餐馆吃饭点评是有很大区别的。单纯依靠学生短期的评价来驱动教学,会迫使老师把一门有价值的课改成一门水课。
令人欣慰的是,有些大学已经做了这样的尝试:
大家可以从各种各样的健身馆中看到这样的关系, 像健身、瑜珈、跑步等等。 在这种关系中, 是谁想提高自己水平nbsp; 是那些学员, 这些学员的想法得足够强烈, 他/她才会花钱去参加这样的健身活动。 在健身活动中, 谁要做各种运动, 流汗呢nbsp; 是学员。 谁在这个活动中对别人指指点点, 提出各种要求,鼓励别人更加努力是教练。
那为什么教练可以这样做nbsp; 因为教练有下面的资源:
- 教练的资质, 教练本身应该在所教的项目中是很有经验的身体力行者。 如果我光看了少量瑜珈的书籍和录像, 或者得到某老师的PPT (如果瑜珈老师用PPT 的话), 我然后就照本宣科去教瑜珈, 虽然我讲的话和一个资深瑜珈教练的话没什么区别 – “现在开始练习冥想, 要尽量让自己内心安静下来,要保持呼吸均匀, 把精神集中在丹田 …” 可以肯定留在我这个班里的学生不会很多。
- 教练有一套训练计划和各种练习方法, 教练(场馆) 有仪器, 工具, 设备, 不是每一个人都打算在家里放一套各种重量的哑铃和杠铃。
- 教练有很多经验,可以随时指出学员锻炼的进步和不足,让学生避免走弯路。
- 教练(场馆) 能召集到有一群相似基础的队友, 这在有些类型的锻炼是很重要的。
为什么教练必须严格要求为学生的真实成绩对自己的口碑,健身馆今后的收入有直接影响。
如果大学里能确定下教练和学员的关系就好办了。 每一个来学习的学生, 都是想学好才来的。 各人条件不同, 学好的目标也未必相同。 有些同学想成为世界一流的软件工程师, 那老师就会以世界一流的标准来要求学生;有些同学只想拿一个及格的分数, 那老师也会告诉他如何才能及格,并严格执行评分标准;有些同学想在某个领域深造,老师也会提供相应的指点。 但是,学生别想只付出 “及格” 的努力,却期望收获“优秀” 的结果,或者没有付出足够的努力,却期望老师最后放水让自己及格。
谁要在这门课中写代码, 做实验, 找需求, 修bugnbsp; 是学生, 不是老师。
谁要看各种与专业相关的文献和博客, 并定期汇 学习心得nbsp; 是学生。
谁给各个学生设计练习, 回答疑问, 点评学生nbsp; 是老师。(强者喜欢批评)
如果学生的努力低于目标的要求, 谁会批评这个学生nbsp; 是老师。
谁会犯错误,并从错误中学习nbsp; 学生,有时老师也会犯错误。
谁是完美无缺的nbsp; 没人。 老师和学生都会犯错误,在快速变化的 IT 领域,我们要不断探索,犯错误是成长必经的道路。
有些学生说:
老师, 你讲得特别好, 我特别想提高, 但是我太忙了, 所以没时间写程序, 我就是来听听。。。
这种情况放在健身学员的类比中会是这样:
教练, 你讲的特别好, 我特别想减肥健美, 但我太忙了, 没时间练, 所以我办了卡, 就放在兜里,有时候拿出来看看。。。
这种学员还真的有, 据说健身场馆的很大一部分利润就是来自于那些办了年卡但是很少来的人。当然,还有来健身房一小时,前五分钟锻炼,后面五十五分钟自拍/修图/发票圈的。
健身教练/健身学员的关系对教练也有要求, 最基本的就是及时给反馈。 很多老师给同学留下语焉不详的作业, 就听之任之了,美其名曰“希望学生自主学习,自我提高”, 这是不合格的教练! 想象一下,一个教练在16周课程中, 只给学生两次反馈(期中,期末考试), 这是合格的健身教练么这种 “教练” 在大学里是不是很常见呢如果你经常去健身俱乐部练习各种器械和套路,你希望你的教练何时给你反馈,纠正你的动作,给你鼓励如果你的教练最后说, “你三月前的某个动作不对,我没有提醒你,你也没有改正,导致你现在的肌肉损伤…”, 你能回忆起这个动作么得这个教练合格么当老师很忙的时候,我们希望助教能担负起及时给反馈的重任。
很多人希望老师和学生之间特别和谐,是否相安无事就是最好希腊学者普罗塔戈说过:「头脑不是一个要被填满的容器,而是一束需要被点燃的火把。」那火把在什么时候会被点燃么最好的情况是不是老师和学生的思维互相撞击,蹦出火花,一起燃烧种情况,会在餐馆/食客, 路人甲/路人乙,狱警/囚犯的模式下发生么显然,教练/学员的关系是最有希望撞击出火星的,老师和学生之间要有足够的工作量,足够的张力。“为学要不疑处有疑”, 有质疑,有冲突,有鼓励,才会出现火花。
如果老师(一个活人)没有给学生及时反馈,也没有和学生进行其他交流,发生思维撞击,那么,这样的老师是否就是 “路人甲”的教学和 上的视频有什么区别呢nbsp;
另一方面,学生作为学员,来健身馆练习,我们对她有什么期望呢望她做到刻意练习。
– 带着具体目的来上课,训练。 而不是 “刚刚睡醒,一脸迷茫也不知道老师会讲什么”, 在作业上也要体现出来目的。
– 学会有效的练习。而不是无效的练习,同学要纠正几个错误的认识:
– 练习可能没有用。 一些同学看了理论,觉得自己懂了,就不练习,找一些借口 “我敲键盘不快”。 其实任何人都可以通过正确的训练来改变自己,关键是要投入时间练习!
– 只要时间长就行。很多同学说自己在以前的课程中 “打了很多代码”,但是实际编程能力还是很差。敲代码但是没有思考和在“学习区”学习,技能并不会持续提高。
– 练习并没有得到反馈和思考。一些同学做完了当前的题目,就高高兴兴地结束了。但是这些题目有很多扩展方向,他们并没有去做,老师给了反馈,也不理会, 这样也不会得到快速提高。
教学的手段 – 师生投入到教学活动中 (Engagement)
“教得好,学得好”有三个要素:
– 学习的材料 (材料在互联 时代应该很丰富,有一个材料定律:对于老师讲的每一个知识点,在 上一定存在比课堂讲解质量更高的教学内容。)
– 学习的动力(想学么① 如果学生的目的就是找到好工作,那么就让有实际经验的工程师告诉他们,目前他们的水平到底能不能通过企业面试。② 现在的学生多才多艺的很多,学生上学之初对大学还是有很多希望的,但是到了大二大三,大部分同学都是动力不高。怎么唤起他们的动力能否让他们不忘初心,从自己的努力的经历中获得新的动力老师让学生回忆自己学习某种技能的过程,这是一个有趣的办法。
– 学习的效率(怎么学老师在课堂上念PPT,学生在座位上昏昏欲睡,这样的学习效率好么于老师来说,怎么让学生投入到教学活动中/span>
如果老师讲课的主要方式就是念PPT,老师投入教学了么/strong>即使老师认认真真地念PPT,学生也认真听了,学生究竟能接受多少们先看一个实验:
老师在心里想一首歌(学生都听过,比较耳熟能详的),然后在心里默唱,双手拍出歌曲的节拍。 问:课堂里的学生能猜对歌曲名字的大约有多少/span>
各类专家做过大大小小的实验,都得到下面的数据:
在表演前, 大家估计应该有 50% 的听众能猜对歌曲名字。 但实际上,只有 2% 的听众能猜对。
这样的比率是否也存在于讲课中老师当然是非常了解教材内容,也认真地念了PPT,我们把上面的比例放到这里,会得出:
老师自己觉得讲课的内容有 50% 能学生能准确无误地接受,但事实上只有 2% 的学生准确地接受了
应该有怎么样的改进办法/span>
– 翻转课堂:既然互联 存在更好的材料,为何不让学生在课前就预习,除了老师准备的内容, 他们还可以在互联 上找更多资料
– 悬念:一个几十集的肥皂剧,为何观众追剧不舍个十几周的课程,学生为什么上课就打瞌睡为剧情有悬念,而PPT 没有。那么怎么产生悬念/span>
– 强调竞争,让同学像玩游戏比赛那样有相互的比较。
– 做有实际用户的项目,不管用户多少,用户反馈如何是真的悬念,效果远远好于没有人用的 “图书馆管理系统”。
– 仪式感:让学生通过公开的方式展现自己进展和产品
– 现场活动:让学生在上课就写程序/博客发布。
– 反馈:及时的反馈,老师一个人不能给几十个同学及时的反馈,怎么办过结对编程 (马上有一对一的反馈),和团队项目的Scrum (每天的反馈),助教的点评(每篇作业后的点评,每周发布学生进展,最后总结为千帆竞发图)。(举例:娄老师的作业, 张老师的作业)
教学手段 – 瀑布 vs 大马哈鱼洄游
那么软件工程课一般是怎么教的呢nbsp; 我在这一篇文章里也提到:
软件学院的小慧老师对阿超抱怨,软件工程这门课看似容易,实际太难教。
小慧说:我是按照经典的瀑布模型来讲课的,本来以为会是高屋建瓴,一泻千里,但是实际情况是这样的:
- 需求分析:学生们都不懂企业的需求是什么,上课睡觉。
- 设计阶段:学生们画了许多 UML 图,用设计工具画了不少矩形框,菱形框,如此而已
- 实现阶段:学生们开始讨论非常细节的问题,UML 图早已经扔到一边。
- 稳定阶段:学生们中十分之一的人开始写代码,其他人不知道在干什么.代码大部分情况下都不能工作,所有设计好的种种黑箱和白箱测试都无从开始。
- 发布阶段:这个只有一天时间,就是最后检查的那一天,同时还有人在调试程序.
- 维护阶段:课程结束了,同学们对自己的产品没有任何维护,放假了!
最后大部分同学们都说这门课特别没用,自己根本没学到什么本事,然后下个学期,新的一批学生进来重复这一过程。。。
我在文章中建议, 软件工程的教学应该考虑让学生一直能保持有具体的事情做, 而且做了之后能看到效果。 不要在学生刚上课的时候就要求写一个需求分析, 学生上哪里分析去nbsp; 如何看到效果nbsp;
所以在《现代软件工程》 这门课中, 我安排了个人项目, 两个结对项目, 让大家充分有时间把个人技术和一对一的合作技术做好, 然后再开始团队项目。 一个理想的流程应该是这样:
- 开始维护以前同学开发出来的程序,理解程序。
- 找bug,改bug,重构小部分代码,以满足用户的需求。
- 一部分同学可以开发测试用例
- 在现有版本的基础上做增量开发
- 理解需求 (这个时候理解了客户需求是什么)
- 设计
- 开发
- 回归测试 (用到上面开发的测试用例)
教学手段 – 全面锻炼
很多学生和老师抱怨《软件工程》课就是记住一些干巴巴的名词和原理,这就是学习的全部目的了么美国教育心理学家布鲁姆(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 个。谁的负担重/span>
所以, 不是我要为难大家, 而是校领导的意思, 同学们可以找校领导说 – 我们不想成为世界一流大学, 成为五道口一带的二流大学就可以了。 如果领导同意了, 我当然可以降低负担, 而且我还可以把师生关系调整为 “哥们/哥们”, 要混还不容易吗
我们可以看看古代的历史, 为古罗马帝国开拓疆土的士兵, 他们是如何培训的呢nbsp; 请选择:
a) 他们不经过培训, 直接上战场
b) 他们只学理论, 没有实战
c) 他们用比实战更轻的武器训练
d) 他们用和实战一样重的武器训练
e) 他们用比实战重一倍的武器训练
先别说成为世界级的士兵或将军, 如果大家想在战场上活得比别人长, 你会选哪一项呢nbsp;
这个道理对IT 行业的学生也是一样的, 在人潮汹涌的招聘市场, 我们可以问一下那些学生 –
你平时在学校里是如何为将来的职业准备的/span>
a) 不经过准备, 直接上
b) 只学理论, 没有实战
c) 用比实际工作要求更低的水平训练
d) 用和实际工作一样的要求训练
e) 用比实际工作高一倍的要求训练
在这片神奇的土地上, 我们或许还可以听到 f) 的回答:
f) 我不用准备, 我爹叫阿刚。
负担通常会带来痛苦, 但是和将来的后悔相比, 哪个更痛一些这个问题也写在 NBA 凯尔特人队的训练馆里:
这样公平么nbsp; 很多人会问。 如果一个同学写了没有任何bug 的程序, 得到10分, 另外的同学程序有 1 个bug, 得到9.5 分, 程序编译都不过的同学, 也得6分, 那你觉得这样对写了全对程序的同学公平么nbsp; 如果一个同学的程序连普通的冒泡排序都比不过, 老师和助教在花时间陪他玩, 还有同学抄袭,耍赖不交作业,这些同学在无端耗费大家的时间, 这样的人不得负分得什么/span>
更详细的打分规则请看这里。
教学手段 – 做中学,真实的项目和人员流动
上《现代软件工程》 的同学, 都是大三到研一的同学, 应该具备基本的学习能力和开发能力, 软件工程和其他类的工程 (如航天工程, 化学工程) 不一样, 我们每天都可以用到软件工程的产物 (软件), 搭建, 学习一个软件开发平台比航天化工要容易很多 (注: 在自家后院放二踢脚不是航天工程), 相关的学习资料也是非常容易获得。 在这个情况下, 学生们可以在“做”的过程中学习, 这也叫”做中学”. 做了, 有疑问, 再问老师, 问专家, 这样学习的效果会好很多。 我为这门课准备了二十本参考书 (对, 20 本), 同学们平时可以多看书。
真实的项目,真的人员流动
在这门课中, 我鼓励学生做自己决定的项目, 但是要求他们要做”真实的项目” – 有真正用户的软件。 那些 “经典” 的项目, 例如图书馆管理系统, 学生学籍管理系统等, 如果没有大量模拟用户,不练习一些实战的功能,是不符合要求的。 项目要有活的用户, 只有活的用户才有活的需求, 才有活的场景, 活的测试用例。 只有活的用户才决定同学们写的软件是否值得使用, 有些团队写的小软件很好用, 在合适的用户群中引起共鸣, 短短时间内, 就会有几千到几万个用户, 也有的团队费了老鼻子劲, 写出来的东西用户量小于10, 自己团队成员包括在内。 这些不同的用户数量会迫使项目团队反思当初在需求分析, 设计上的问题。 另外这门课并不是算法竞赛, 或者代码集中营, 大家比的不是如何快速敲打出某个算法, 而是如何在有限的时间内交付有价值的软件给特定的用户。 “真实”这一条件也促使大家做 “现实”的项目和项目管理。 很多学生有宏大的梦想, 但是在短短的 8 周团队项目时间内, 甚至短短的 16 周课程时间内, 他们发现宏大的构想被自己程序的bug 搞得千疮百孔, 轰然倒地。
既然真实,就会有人员流动的问题,因为:
– 有人想去做更好的项目
– 有人离开公司(退课)
– 有人和团队中的人合不来
– 有人觉得自己应该得到更多 酬 (分数,钱,股票),不愿意在原来的团队干了
– 有人做得很差,团队觉得没有他更好…
这样才会有人员流动,才要让软件保持 “可维护性”, 否则项目没法活下去。 所以,我们在团队项目的 alpha 阶段后,强制所有团队必须有一个人离开。 这个人要自己找能接纳自己的团队(不是原团队),经过新团队的同意,双方谈好了 责任/权利/义务/ 酬,就可以在一个团队工作了。 有不少同学做过了一个项目 alpha 版,觉得应该尝试别的项目,他就可以利用这个机制在一学期内做两种项目,有更多的体验和收获。 有的同学抱大腿,打酱油,不想出力,那么,团队就把他请出去,他自己再找别的团队证明自己的价值。 这不是挺好么细分析在这里。
教学的评价 – 教学成熟度模型
教师工作有很多特殊性,和其他行业相比,有更多的从业道德的要求。但是,教学过程也和 会上的各种活动有共性。例如,它和软件开发过程有很多类似的地方,也是有生命周期, 有重复、迭代发展的过程, 有产品(学生学到了知识和技能), 有各种用户(领导、学生),有具体的效果和反馈。 软件开发过程有成熟度模型 (CMMI), 一个老师的教学是否也有教学成熟度模型呢学,从孔夫子那时候算,有两千多年看历史; 从现代高等教育理念进入中国大陆开始算, 也有一百年。 IT 专业的教学每学期在全国上千所学校中进行, 学生有吐槽的,有无动于衷的,有赞扬的。 如何分析各种程度的教学们借用CMMI 的几个档次来说明一下:
CMMI 一级:初始级
能差不多完成教学任务,但是有关键元素遗漏,课程的各个元素并没有结合起来完成教学的目标。 这个课程里学生学得如何,全靠运气。
如果问老师:您的学生做的项目有源代码么老师通常说:哦,我找一下,好像在哪个U盘里,找不见了。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!