2017年7月更新: 《构建之法 - 现代软件工程》第三版已经出版。(第三版的豆瓣讨论,第二版,多看 电子版, 对我的采访,微博)
****
这是迄今为止采用《构建之法》 的情况 (很多学校采用了网上课堂的形式,可以前往围观):
注:排名按照学校所在地大致由北向南排列, 一个学校采用《构建之法》 的情况有多种方式,包括:作为教材,作为参考书,使用课件或参考课件,采用 “做中学”的教学方法,采用有工程经验的助教帮助教学,等等。 (对,我们有老师和助教的微信群,欢迎加入)
学校 | 任课 教师 | 学生 级别 |
博客/Github (部分) | 部分优秀学生博客 |
东北师范大学 | 杨贵福 | 研究生 | 课程名:软件项目管理 教学博客 | 郑蕊 濮成林 演奏者 |
沈阳航空航天大学 | 张翼飞 | 大三 下 | 教师博客 助教博客 | 薛鹏飞 Ray |
北京工业大学 / 耿丹学院 | 冯花平 | 大三 | 周阳 | |
北京工业大学 (本部) | 杨红丽 | 大三 | ||
清华大学 软件学院 | 刘强 | 大二 下 | 学生博客: | ZhaoYang |
北京航天航空大学 计算机学院 | 罗杰 | 大三 | 教师博客。 | SkyJoker 传奇 殷鹏程 zmpy VeryBigMan 黄可嵩 刘乾 |
人民大学 | 刘青 | |||
北京电子科技学院 信息安全系 | 娄嘉鹏 | 大二 下 |
| lwr 刘伟康 |
天津大学 软件学院 | 章亦葵 | 研一 | ||
石家庄铁道大学 软件工程系 | 王建民 | 大二 下 | 教师博客:http://www.cnblogs.com/wangjm1975/ | |
齐鲁工业大学 软件工程系
| 赵培英 | 大二 下 | 教师博客:http://www.cnblogs.com/qluZhao/ 助教博客1:http://www.cnblogs.com/math/p/4567801.html | |
南通大学 计算机科学与技术学院 | 鞠小林 | 大三 上 | 苗中峰 | |
安徽巢湖学院 | 卜华龙 | 大三 | ||
上海海洋大学 | 葛艳 | 大三 | ||
河南职业技术学院 软件工程系 | 陈红根 | 大二上 | ||
四川师范大学计算机系
| 廖雪花 | 研一,本科 | ||
东华理工大学 软件工程系 | 李祥 | 研一 | ||
华中科技大学 机械学院 | 陈冰 | 大四 | ||
中国地质大学(武汉) | 范萍 | |||
武汉大学 | 李小红 | |||
湘潭大学 | 宋小波 | |||
福州大学 数学与计算机科学学院 | 张栋 | 大三 | ||
福建闽江学院 | 测试课程 | 大三 | ||
广州商学院 信息工程与技术学院 | 杜云梅 | 大二 下 | ||
微软亚洲研究院 创新人才培训班 (各个学校的优秀学生) | 大四 |
软件工程牵涉的范围很广, 同时也是一般院校的同学反映比较空洞乏味的课程 (不信就请看 微博上的软工)。 但是软件工程的技术对于投身IT 产业的学生来说是非常重要的。 经过几年的探索, 我总结了在16周的时间内让同学们通过 “做中学 (Learning By Doing)” 掌握实用的软件工程技术的教学计划。这几年教书的过程中, 我学习了一些 好老师的建议, 还有些教课的心得, 也对中国大学的 IT 教育有些反馈。近两年高等教育有不少创新的尝试, 希望这个软件工程课也能实践一些创新的点子。
在正式编辑出版前,这套讲义在下面的学校正式课程中运用过:
2007 – 2010 清华大学理论计算机科学研究中心 (姚班) 主要是大四上学期
2009, 2012 北航计算机系 大三上学期
2010,2011,2012 秋季 中科大-微软 计算机实验班 (微软亚洲研究院创新人才班 ) 大四上学期还有在北大合作的教学:
2007 - 2009 北京大学软件学院 研究生课程 (课程名叫 - 微软软件实现技术, 我是讲师之一, 只讲了本课件的少部分内容)
这套讲义有这样的特点:
理论和实践相结合,讲现代理论,同时讲体现理论的工具
结构紧凑,个人项目/结对项目/团队项目紧密配合, 能在16 周讲完。
面向实战,强调做中学 (learning by doing), 项目都公开发布,用户数量和反馈是项目重要的评价标准。
讲人在软件工程中的不同角色和作用 (软件过程, 软件工具, 软件人员的技术能力和职业能力)
有丰富的材料给教师/TA 使用 (见下面的 “学生作业”)
练习量大 (其实学生工作量和国际一流大学相仿), 内容多: 参考书 (20 本)
讲义内容:
1. 概述
- 课程教学方法 - 这门课应该有什么样的师生关系?
- 习而学的软件工程教育 - 怎么教工程类的专业?
- 软件工程概述
- 项目剖析 微软学术搜索项目 10个版本的历程
- 练习与讨论
2. 个人开发技术
- PSP: Personal Software Process,
- 程序效能分析
- 单元测试 (在最小的编程单元上保证正确性) & 回归测试 (保证程序在修改的过程中, 原有的功能保持稳定 )
- 技能的反面
- 练习与讨论 (个人技术) & 练习与讨论 (工程师的成长),软件工程师能力自我评定表
3. 两人合作
a. 代码规范和代码复审
b. 结对编程, 有记载的最早的结对编程发生在 1987年3月…
d. 练习与讨论
4. 软件过程/方法论
- 各种方法概述
- 敏捷方法: 酒后的敏捷, 敏捷宣言,敏捷原则
- Scrum/Sprint, TDD, FD
- MSF-Agile
- 支持软件过程的工具 (TFS)
- 练习与讨论: 团队与流程 & 敏捷 & MSF
5. 团队中的角色与合作
- 团队的类型,团队合作的阶段
- 团队成员不同的投入和心态 - 猪/鸡/鹦鹉
- 角色 – PM PM Spec, PM 的成长, 项目管理的细节 练习与讨论: PM
- 角色 – Dev Dev 的成长 软件开发不是闭卷考试 顶级程序员的心得–Coders at Work
- 角色 – QA & Test 质量保证和测试, QA 的闰年问题,QA/Test 的角色和分工,练习与讨论: 测试, 质量保证
6. 需求
a. 项目需求分析和建议
b. 用户调研的方法
c. 目标和远景 - 反面例子画扇面
f. 练习与讨论
7. 设计和开发
- 基本的分析和设计方法
- 模块API 的设计 (例子: elevator design, mvc/mvvm, interface)
- 开发阶段的日常管理
- 用户界面,用户体验的设计
- 源代码管理 - 你的团队能做到这些么?
- 练习与讨论: 场景设计 & 软件设计与实现 & 用户体验
8. 稳定阶段, 发布和维护
a. 测试的计划和执行
c. 练习与讨论
9. 软件和 IT 业的创新
b. 创新 - VCD 的故事
c. 创新的时机
d. 魔方的创新
e. 如何提出靠谱的项目建议 (NABC)
f. 创新的出路 - 走进作坊; 创新的招数
g. 练习与讨论
10. 软件项目的管理
- 绩效管理
- 代码量和树叶量
- Postmortem - 事后诸葛亮会议
- 软件工程师的职业道德
- 人的问题 (同学的感想)
- 练习与讨论
附录, 参考书, 论文阅读
教材 (3本, 同学选择一本, 同时借阅另外两本) :
1. Rapid Development Steve McConnell (ISBN 1-55615-900-5)
中文版 快速软件开发斯蒂夫·迈克康奈尔 著 译者: 席相霖 等 ISBN 9787505372856
2. Code Complete (2nd Ed)Steve McConnell ISBN: 9780735619678
中文版 代码大全 (第二版)斯蒂夫·迈克康奈尔 ISBN: 7121022982
3. 构建之法 - 现代软件工程 邹欣 (ISBN: 9787115369161)
主要参考书:
Dreaming in Code by Scott Rosenberg, ISBN: 9781400082469
中文版《梦断代码》, 译者 韩磊, ISBN: 9787121066795
-------
软件工程的作业
-------
很多老师反映软件工程的作业题不好出,学生做的“大作业”也是了无新意。怎么办?师生们身处轰轰烈烈的软件产业的大环境,但是在软件工程课上做的题目却是非常简陋,没有起到应有的作用,这的确是一个很有讽刺意义的事情。有很多因素导致这一结果,在这里不能详细阐述。我们看到,程序 = 算法 + 数据结构;软件 = 程序 + 软件工程,软件工程的编程作业,是不同于 “实现某个算法” 这样的算法课作业的。
一个简单的程序通常是做这种简单的事情:
对输入数据进行处理,并输出。
此类 “程序”可以从几个维度扩展,成为很有锻炼价值的软件工程作业。下面举例说明。
从数据方面扩展:
- 从数据本身的属性扩展,例如处理“最大子数组的和”的程序,可以扩展到大数(超过64位的数字),这样引入大数的处理。
- 从数据的数量扩展,很多老师出题就假设数组只有六七个元素,直接写死在程序中。如果这个数组有一万个,十万个元素呢?
- 从数据的维度扩展,如果数据是在多维数组中呢?
- 从数据的其它属性扩展,例如,如果你的程序能处理北京的地铁数据,如何改进你的程序,让它能动态处理上海或其他城市的数据呢?这样就引入了工程的需求。
从需求方面扩展,很多程序的需求都是非常抽象,可以用数学公式描述和验证的,例如:“找出数组中的最大值”。下面有几种扩展的方式:
- 不是仅仅要求结果,而是要让程序把计算的过程显示出来。请搜索各种“动画显示排序过程”的程序,我们的同学也做了一个类似的题目。
- 从需求的维度方面扩展,例如学生写了一个“统计程序有多少行” 的程序,我们可以进一步要求,能把注释行,空行,只有一个字符的行去掉么?能处理目录里面的多个文件么?
- 重复一个成熟的、学生比较熟悉的需求,这是也是可行的,关键是要体现 “工程”的特点。 例如做一个文档编辑软件,要求能处理10M 大小的文本文件;做一个图书信息系统,要求有10万本书,100万条借书,还书记录。很多同学做的图书馆信息系统只有不到10本书的记录,这是图书馆么?
- 在已有的需求上增量改进,例如,让文档编辑软件支持markdown 语法,支持无限的“后悔”操作;让图书馆信息系统支持手机客户端。
- 探索创新的方式来满足已有的需求,或即将出现的需求。
从用户的方面扩展,绝大部分大作业都是单机运行,给一个用户(老师)看一次,看完就万事大吉。我们可以考虑下面的扩展方式:
- 单用户第二次使用这个软件的时候,能有什么功能,让单用户更喜欢这个软件?(例如:记住上次的状态,自动展现上次文档最后编辑的地方,等)
- 如果多用户使用这个系统,会出现什么问题,例如,学生的图书馆信息系统考虑到有100人同时查询的情况么?如何模拟这样的测试?
- 用户从世界各地来,怎么办?你的“程序”能提供多种语言的界面么?
- 用户有善意的和恶意的,如何让你的程序更安全?如何测试安全性?
从软件构建方面扩展:
- 如果是改进一个已有的软件,怎么办?
- 大多数的“程序”都是用单一的语言写的,如果软件有多个语言写成的不同模块,如何定义彼此的接口(API)?
- 如果软件已经在服务中(例如图书馆信息系统,如何升级部分模块,同时尽量减少系统下线的时间?)
个人项目:
现代软件工程 作业 1: 个人项目 个人项目和结对项目练习 地铁 现代软件工程 作业 4: 阅读和调查作业 期末作业附加题 (同学的读书笔记)
结对项目:
团队项目:
源代码管理的10个问题
-------
部分学生的感想:
http://www.cnblogs.com/-OwO-/p/5116725.html
http://www.cnblogs.com/wx1306/p/5117461.html
http://www.cnblogs.com/malinlin/p/5058509.html
http://www.cnblogs.com/dasusu/p/5061566.html
http://www.cnblogs.com/maxx/p/5060565.html
http://www.cnblogs.com/lizanqirxx/p/5066399.html
现代软件工程系列 学生的精彩文章 (6) 我们其实还不懂互联网
现代软件工程系列 学生的精彩文章 (3) 如何在Bug 不断的情况下还能保持平常心... [zz]
现代软件工程系列 学生的精彩文章 (2) 到底是谁的 bug?
2012 部分北航学生的感想:
所有讲义, 作业都可以分享给教师用于教学, 只要注明引用来源即可, 不必事先取得同意。
欢迎反馈和意见。
转载请注明本文地址: 现代软件工程讲义 目录