选课类别:未知 | 教学类型:未知 |
课程类别:本科计划内课程 | 开课单位:信息科学技术学院 |
课程层次:未知 | 学分:6.0 |
考试与给分 课程评价中未提到考试的具体内容和给分细节,因此无法提供相关总结。总体来看,该课程更注重项目和实践。
作业 作业负担较重,但非常有收获,设计精巧而富有挑战性。课程分为三个主要项目:个人项目、结对项目和团队项目。
个人项目:词频统计 该项目旨在区分软件工程项目与算法题的不同,着重在性能优化和代码风格上。要求多线程处理,变量名和函数名要有意义,处理目录内文件的鲁棒性。
结对项目:电梯调度算法 此项目没有最优解,旨在训练结对编程、框架内编程和逐步优化的能力。学生需设计电梯调度算法,解决上下班高峰期的电梯调度问题,并通过可视化工具优化算法。
团队项目:敏捷开发产品 团队项目是课程重头戏,采用敏捷开发方法,从自由结组到实际发布产品。通过每日立会和项目管理工具(TFS)追踪项目进度,重视开发过程和实际产品推出。尽管部分项目未达到发布标准,但通过项目,学生深刻体会敏捷开发的重要性,并从中学习到大量实用知识。
教学水平 殷秋丰老师结合《编程之美》作者邹欣的软件工程讲义,课程内容贴合实际,实用性强。与学校传统软件工程课程不同,更强调实践和敏捷开发,学生反响良好。
课程内容 多样化的项目设置,涵盖个人任务、结对编程和团队合作,使学生系统性地掌握软件工程知识。从算法题到实际产品,从理论到实践,每个阶段都有明确的学习目标。课程材料丰富有趣,尤其是《构建之法》一书,深受学生喜爱。课程内容理论与实践结合紧密,能够让学生在实践中掌握软件工程的核心技能。
总体而言,《高级软件工程》课程虽负担重,但通过精心设计的项目和富有实战性的课程内容,使学生能系统性地掌握软件工程的核心知识和技能,值得选修。
这门与微软亚洲研究院联合开设的课负担很重,但的确能学到很多知识。
这门课用的是《编程之美》作者邹欣老师的软件工程讲义,后来结集出版在了《构建之法》里。这个书比学校的软件工程教材实在好太多了!读起来一点也不觉得无聊!
课程分为三个部分:
个人项目
项目的 spec 很简单:一个目录里有若干个文本文件(可能有子目录),要统计这些文件中每个单词出现的数目,按照出现次数降序排列。
初看起来,除了递归查找所有文件的 API 需要临时查一下以外,这不就是一个算法题吗?老师让我们做这个项目,就是要让我们认识到软件工程项目与算法题的区别。
性能方面:
代码风格方面:
鲁棒性方面:
结对项目
这个也是算法题,不过没有最优解的。我觉得主要锻炼三个能力:
spec:一座 20 层的大楼里有 4 部电梯,其中两部电梯比较大(重量限制大),另外两部电梯比较小。电梯在相邻两层之间移动的时间总是 5 个时间单位,开关门的时间也总是 5 个时间单位。大楼里有 1000 名员工,需要用电梯的时候就会按向上或者向下按钮。每部电梯能够知道当前位置、轿厢里的当前重量。开门的一瞬间,电梯可以决定是否切换运行方向;电梯关门的一瞬间可以修改目标楼层(必须是同方向);电梯到达目标楼层就会开门。
每个乘客的平均体重和分布已知。当电梯开门时,首先下客,然后跟电梯相同方向的乘客就会按照先到先得的顺序进入电梯,直到电梯达到重量限制为止。
需要设计一种电梯调度算法,优化在上下班高峰时乘客的平均等待时间:
为了避免把这么好的思考题破坏掉,我就不贴我们组的算法了。
当时为了查看不同调度算法的效果,我专门用 cygwin + C + ncurses 做了一个可视化工具,来动画显示电梯的位置、电梯目标楼层、电梯内人数、各楼层的等待人数、平均等待时间等信息。一开始我们拍脑袋想的算法用可视化工具一看,干了好多傻事。这让我们引入更多的考虑因素和特殊情况判定,不断优化算法。
附上当时我设计的电梯调度算法:AlgorithmDesign.docx
当时提交的代码:elevator.zip
团队项目
团队项目是这门课的重头戏。学校软件工程课一般是让学生写教务系统、报修系统之类无聊又没用的东西,而且搞一大堆设计文档、UML 类图、流程图之类形式化的设计方法。但 MSRA 高级软件工程课程的团队项目是做一个产品并实际发布,采用的也是互联网公司常用的敏捷开发方法。
首先是自由结组,每个团队不超过五个人,大家纷纷开始抱大腿。(事实证明,大腿有时候也靠不住。开发软件的时候,稳定的输出胜过不确定的爆发)团队按照 PM、Dev、Test 来分工,一般是一个 PM,一个 test,剩下的是 Dev。
设计阶段每个人都要写博客来阐述自己的产品构想、用户故事、竞品分析,然后团队选择一个产品写出 NABC(Need、Approach、Benefit、Competitiors),具体开始做。
开发过程重度依赖与 Visual Studio 集成的 TFS (Team Foundation Server)。TFS 除了有类似 SVN 的版本控制功能,还有项目管理功能。开发过程首先被分为两个 milestone(beta、release),每个 milestone 被分为若干个 user story,每个 user story 又细分为若干功能点,每个 milestone、user story、功能点都分配给负责人。
在 TFS 里可以看到项目进度的燃尽图(burn-down graph)和每个人提交代码、新建任务、完成任务的趋势图,只要是不想被鄙视的成员都不会轻易懈怠。
按照规定,我们每周是要开不超过 15 分钟的每日立会,就是在一天的工作开始之前,向团队简要汇报进展和遇到的问题。我们组由于我早上起不来床,以及大家有组会等原因,每日立会是没开成。每周还要开一次大会,汇报一周的进展和分配下一阶段的开发任务。有时候我连大会也翘了,气得 PM 不得了……
开发阶段,每个团队的 PM 每天都要写博客总结当天的进展(daily scrum),但事实上由于大家大多是三天打鱼两天晒网,PM 也往往没得可总结。各组的博客如下:
可以说这四个项目的 idea 都不错,但大概是由于我们没有开发经验,花了很多时间,大多数组交付的产品却没有达到可发布的标准。主要的原因可能是
如果大家有机会去 MSRA 联合培养,高级软件工程课一定不要错过!真该让学校的软件工程老师们去听听课(或者看看《构建之法》),看看敏捷开发到底是什么样,到底是 code 重要还是 document 重要。