《现代软件工程》 教学心得

标签:
软件工程邹欣微软 |
分类: 文化 |
编者按:微软亚洲搜索工程院首席研发主管、《编程之美》作者邹欣老师自2007年至今一直在工作之余承担了清华、北航及中科大三所高校《现代软件工程》的教学工作。他将自己5年多的教课心得、教学方法、教学调研及反馈总结如下,不论是对教授软件相关课程的老师还是学习计算机相关专业的学生都有非常深刻的学习和借鉴意义!
作者:微软亚洲搜索工程院首席研发主管 邹欣
缘起
2005年底,我从微软公司总部Visual Studio部门回到微软亚洲研究院工作,担任研发主管,负责研究成果向产品的转化,同时负责实习生和新员工的工程培训。当时微软亚洲研究院和清华大学的姚期智教授正在商讨教学合作,由研究院给姚教授班上的学生讲一些高水平课程,我也参与其中,并负责《软件工程》这门课。我从2007年秋季到2010年秋季讲了四年。由于讲课效果较好,我随后在北航计算机学院和中科大计算机实验班(在微软亚洲研究院上课)也开讲了这门课。为了和学校已有的软件工程课和软件工程试验课区别开来,我给这门课起名叫《现代软件工程》。
在这些课程中, 我是主讲老师, 学校给我配备了一名助教 (研究生或是刚毕业的博士生)。学生的数量从20到60之间。在此之外,我也经常去别的院校(例如北大软件和微电子学院)讲课,但并不是主讲老师,那些课程不在本文讨论范围之内。
软件工程这门课涉及的内容很广, 其中的各项技术和项目管理的各种方法对于即将投身IT 产业的大学生来说是非常重要的。它也被很多同学们抱怨较空洞乏味【注1】。经过几年的探索, 我总结了一套教学计划,能在16周的时间内,让同学们通过 “做中学 (Learning By Doing)”的模式,掌握实用的软件工程技术。这个教学计划的很多做法都是在这几年的实践中摸索改进而定型的。到今年为止, 这门课的课件已经积累了50 多篇,都放在网上【注2】。我上这门课的目的是:
让同学们在实践中开发出实用的软件, 从而掌握现代软件工程的理论和工具, 在专业水平上可以通过一流软件企业的面试。
在这篇文章中, 我想分享一下这几年上课的心得。
方法
在2007年开始讲第一次课之前,我参加过2006年全国软件学院的评审工作, 也访问过10个以上的软件学院和计算机系,从很多渠道了解到软件工程课程在中国大学里的教学情况。我已经在研究院做过几次实习生培训和新员工培训,都是为期三周,以“做中学”为指导,以实际项目的生命周期为主线,重视及时的反馈和总结。大家反映很不错。所以我在学校的课程也以这一种方法为主导。在学校的课程大致安排如下:
第1-2周: 完成“个人项目”,团队分组,结对项目人选确定,开始阅读作业。
第3-4周: 完成“结对编程项目”,团队决定项目目标,人员角色。
第5-8周: 完成 “团队项目”的alpha 阶段。根据项目进展讲述软件工程的各项要点。
第9-10周: 回顾,团队项目评分/总结,一些同学换组,准备 beta 阶段。
第11-14周: 完成“团队项目”的beta 阶段。根据项目进展讲述软件工程的各项要点。
第15-16周: 完成项目最终评审,同时让同学们完成第二个“结对编程项目”。同学们写各种总结汇报。
详细课程安排见网上的课件【注2】。
中国的大学生的素质,动机和微软的实习生、新员工还是有不少区别,中国大学的教学方法,氛围也有很大提升空间。光怀着一腔热情去讲课,未必成功。在这几年教学的过程中,我尝试了很多方法,有些没有太大用处,有些效果不错,下面我主要分享几条有较好效果的方法:
- 事先沟通。和校方沟通:获得各位领导的支持,您想培养什么样的学生,是世界一流,是中国一流,还是本省二流?
有什么样的期望,就有什么样的要求。 我上课的学校中,它们都把自己定位为世界一流,或中国一流,那我就要用世界一流和中国一流的标准来要求同学们,否则我就是不称职的老师。要和本课的助教(TA)就怎么教好课程达成一致意见。 (我知道很多系领导会说没有资金支持 TA, 其实,非不能也,是不为也)。值得一提的是,北航的校领导和学院领导对这样的教学方法非常支持。 -
和同学沟通:我在第一堂课就讲述这门课里师生关系是什么【注3】,
这堂课如何打分,分数如何构成,最终分数的分布概况。这样,想得高分的学生知道如何行动,想混的学生也知道怎么才能混过去,想退课的也可以友好分手。 - 简明的规则,及时反馈:
助教在每一次作业之后, 都公布所有同学 (只显示学号后几位)
目前的得分,以及推算出来的最终分数。根据分数的分布情况,
TA 通常把 最后10% 的同学划到不及格这一栏中。迟交作业一律 0 分,不交作业一律倒扣分。用客观数据来评分: 老师太忙,不能仔细地批阅每一次作业,研究每一个项目的各项细节,怎么办? 把学生的作业做成比赛, 比程序速度, 比测试用例的数量, 比博客的阅读量… 相对的分数自然就出来了。团队项目一定要做解决实际问题,能公开发布和使用的项目,这样有很多实际用户给学生们评分。例如一组同学的魔方软件有3 万多下载量【注5】; 而另一组的软件有 10 个下载, 谁好谁坏,不用老师去查阅代码了。 -
循序渐进: 这几年我也看到一些公司的工程师到学校讲课,他们迫切地想让同学们马上掌握最先进的理念和实践方法。但是,不出意外的话,你会发现学生的动手能力很差,
学生之间从来没有正经合作过! 你想让他们马上组成一个团队,扮演各种角色, 完成一个实际的项目,是不可能的! 怎么办? 我这门课设计了三种项目: -
- 个人项目:让每个人练手,同时实践基本项目管理的工具和操作,测试用例设计和程序效能测试
- 两人项目:两个人合作完成一个比较难的作业,锻炼交流能力,合作能力。同时练习软件工程中的 “结对编程”,接口设计,代码复审,简单的界面设计,同时让学生有机会学到不同语言,不同的框架设计,不同的表现层的实现。这类项目可以安排两次,每次换人做。
- 团队项目:分两个阶段(alpha/beta),beta 结束后直接公开发布产品。有了前面的准备和锻炼,同学们应该在团队项目能有所作为。
- 让学生有更多的控制,鼓励自我学习和管理,要相信学生想做好,能做好: 在课程的三种项目中,学生对项目的控制越来越多:
-
- 个人项目: 学生可以选择编程语言,其它由老师指定。
- 两人项目: 学生可以选择语言,界面,
- 团队项目: 和老师协商后,学生可以选择具体项目,各人的角色, 如何实现, 如何推广,等等。
有些学生某个项目搞砸了,怎么办? 没问题,课程中有一定的“附加分数”是学生通过自由发挥能挣到的,
例如主动为大家服务,写测试工具,写更多的读书报告, 等等。学生能自行计划,挣到分数。 我要求学生自己先看全部教材(三本教材任选一本,再加上网上的课件和参考书),然后发博客提问题。同学们大部分都做到了。在课程结束的时候,我要求同学们看看自己最初提出的问题,再总结一下,大多数同学都可以回答学期之初自己的问题 —— 这不就是上课的作用么?
- 理论,工具和实践结合: 很多目前的软件工程课程都太偏向理论,把活生生的软件工程理论抽象为一些大而空的原则,名词定义,知识点,希望用闭卷考试的方式强迫学生记住这些 ”知识“。殊不知没有工具的支持,再美妙的理论也无法实现;没有实践,再完备的定义也是一句空话。绝大多数的学生都不会成为软件工程领域的科研工作者,他们需要在实践中通过使用软件工具来设计和维护软件。学生在具体的项目中,通过Visual Studio等工具来理解极限编程,单元测试,代码耦合,敏捷开发中的SCRUM, Sprint等概念。我还让学生通过广泛的阅读和讨论来学习业界的经验教训,讨论“习而学的工程教育”,“为什么计算机系的老师教不好软件工程”等有挑战性的论题【注4】。
- 杜绝打酱油:这是软件工程课老师面临的一个老问题,组队做项目,每个成员都得一样的分数,如何杜绝打酱油的南郭先生? 我给每个团队分配一定数量的分数作为“奖金“, 让每个团队决定如何分配这些“奖金“ ,不能平均分配。这样,每个人的付出和收益能更好地结合起来。通过这个锻炼,团队成员体验了IT 企业中如何做绩效评估, 团队管理,如何衡量 “我在团队中的地位”, “我在别人心目中的分量”。
- 模拟实战:
据我了解,大部分软工的“项目”是同学们从头写的 1.0版本, 但是IT
行业的绝大部分软件是有复杂历史的老系统,不接触老系统,
如何学到软工的各种原理和实践? 只要肯想办法,总是有很多途径可以模拟实战的:
a)
把历届学生的项目都用版本控制软件管起来, 这样后来的学生可以在前人的基础上继续开发。 b)
鼓励同学在别人的基础上开发 (开源, 以前的项目, 等等) c)
在项目的alpha 和 beta 阶段之间,让部分同学跳槽,从一个小组换到另一个小组中。这样同学们就有很多机会亲身体会到文档的重要性,如何理解老代码,如何做回归测试等等软件工程的相关内容。
- Deadline:学生行为是由什么驱动的?
是对老师规定的服从,是对技术的热情,还是交作业的期限(deadline)?
大部分人的作业都是在交作业的前一天夜里搞出来的。 但是一个晚上搞不出来实用的软件, 为此我在课程中设置了很多小的 deadline - 检查点,让同学们在平时抓紧时间工作:
a)
每个团队项目alpha/beta阶段的结束都要求公开发布博客。 b)
要求项目有两个公开发布 (alpha, beta) c)
要求每个阶段要有 10 天的 SCRUM会议【注8】, 并把每次会议结果 (每个成员昨天做了什么,今天打算做什么, 碰到什么障碍) 列出来, 并用软件工程的工具自动生成进度表,例如:
没有这些检查点,同学们会潇洒地拖拉,在最后演示的时候哀求:”我们尽力了,搞了三天三夜,这次给我们及格吧,我们以后一定会继续改进的!“。他们得到及格的分数后,就杳无音讯了。
结果
有了这些要求,学生的投入怎么样呢?下表是2009 年在北航和清华大学收集到的数据(学生匿名反馈)。
可以看到,《现代软件工程》的同学比普通课程的同学要多花不少时间,代码量是2倍以上。同学们的收获怎么样呢? 我设计了一个自我评价调查问卷,包含18项内容,让学生根据下面的标准填写数字:
下面是不同班级的同学对自己上课之后水平的自我评价:
可以看出,上了《现代软件工程》课程的学生,课后软件工程总体自评平均值为4.87,也就是“基本的理论和实践知识;可以通过企业面试”。上传统《软件工程》课程的学生,各方面也有提高,但是课后水平在 [3.1..3.8] 区间,总体为3.5, 也就是“基本的书面知识“。
在大作业量,大阅读量,实际项目的压力下,同学们对老师的评价如何呢? 下面是清华大学的学生对我的评价:
注:在讲课的过程中,我也试验了一些不同的方法,2008 学期中采用的不同方法(如API 设计,书面答题等)引起了同学们的热烈讨论和反馈,导致一部分评分较低和方差较大。详细的评价表见【注9】
一些学生写了很不错的总结和反馈,作为老师,我也从中受益良多,一些比较有代表性的文章在【注2】的附录部分。
总结
中国大约有一千所高校开设了软件工程课(计算机系,软件学院,各类相关院系,三本学院等),但是从我了解的信息来看,绝大部分学生上课之后没有掌握到软件工程的具体技能。从这几年微软校园招聘的经历来看,大部分211/985高校的学生的软件工程的能力还是非常差的。这些学生走上工作岗位,就会给广大用户写网上银行软件,政府网站,手机软件,把他们教好,是每一个软件工程教育者义不容辞的责任。软件工程的老师们,软件学院,计算机学院的领导们,大家尽到责任了么?
上好软件工程课,并不需要特别的渠道或高额的费用。当然我是在微软公司工作,头上还有微软亚洲研究院,《编程之美》的作者等等光环,但是上好这门课并不需要任何公司的任何特别技术或头衔。我在课上介绍了微软Visual
Studio
的各种开发和项目管理工具,但是类似的工具在别的平台也有,有些同学也使用了。我用的一些方法,也不是世界首创,而是在世界上的大学中使用了多年,
虽然从量化的评价和文字反馈来看,同学在这门课收获不少,但是很多同学反映上课非常吃力,负担比较重。如果学生们在其它先修课程(程序设计语言,面向对象的设计,数据库等)得到了足够的锻炼,他们理应有更好的基础,更有效率地学好软件工程这门课。这门课的开始的作业 “个人项目” 和 “结对项目” 就是给同学们补课的,如果同学们的基础好,他们可以用这些时间更深入地学习和体会软件工程的核心内容。
一些读者也许会说“清华、北航、中科大的学生素质很高,所以才会有较好的结果…”。我同意学生的水平对这门课的成效有帮助,但是我相信中国所有IT 专业的大学生都可以成为合格的IT 业从业人员。如果有别的学校和老师想为改进软件工程教学马上做一些实事,欢迎讨论。
另: 这门课2012 年在北航的大部分教程都已经录像。感谢北航计算机学院高小鹏,罗杰老师对这门课的支持,同时感谢他们以及微软研究院学术合作经理马歆对本文提出的许多修改意见。
作者简介:
邹欣 1991年获北京大学计算机软件学士学位;1996年获得美国Wayne
State University 计算机软件硕士学位。他从1996年起在微软公司工作,参加过Outlook,Visual Studio
的开发,2005-2012年在微软亚洲研究院任研发主管;现任微软亚洲搜索工程院首席研发主管。著有《移山之道》、《编程之美》。
注解
注1: http://www.cnblogs.com/xinz/archive/2013/02/06/2908169.html
注2: http://www.cnblogs.com/xinz/archive/2011/11/27/2265425.html
注3: http://www.cnblogs.com/xinz/archive/2011/05/16/2048044.html
注4: 参见
http://www.cnblogs.com/buaashine/archive/2012/12/12/2813931.html
注5: http://www.cnblogs.com/xinz/archive/2010/11/27/1889970.html
注6: http://popol1991.github.com/blog/2012/12/12/cs2103-in-nus-ruan-jian-gong-cheng/
注7: http://www.arc-trooper.com
注8: http://www.cnblogs.com/xinz/archive/2012/10/05/2712602.html
注9: http://www.cnblogs.com/xinz/archive/2011/05/16/2048044.html
____________________________________________________________________________
相关阅读:
IT行业的创新—创新的迷思(二)
IT行业的创新—创新的迷思(三)
普适计算中的设计
欢迎关注
微软亚洲研究院官方微博:http://e.weibo.com/msra/profile
微软亚洲研究院人人主页:http://www.renren.com/600674137