第一章 概述
1.软件工程产生的背景: 面对不断增长的系统复杂性,导致软件项目面临不可靠,费用超预期,延迟交付等问题,需要采用有效的软件工程方法来应对。
2.好的软件的基本特性:可接受性,可依赖性和信息安全性,效率,可维护性。
3.软件过程:实现软件产品开发的活动序列。包括:软件规格说明,软件开发,软件确认,软件演化。
4.软件工程职业道德(ACM/IEEE-CS软件工程职业道德和行为准则)
第二章 软件过程
1.背景:没有放之四海皆准的软件过程,但需要不断改进组织中落后的软件过程技术。要充分利用工业界软件工程的最佳实践,或者引入UML建模和测试驱动等开发技术来改进自己的过程。
2.通用的软件过程模型:
- 瀑布模型(要求早期的承诺并且在实施变更时要进行系统返工,仅适用嵌入式系统,关键性系统,大型软件系统):
a.需求分析及定义;
b.系统及软件设计
c.实现和单元测试
d.集成和系统测试
e.运行和维护
- 增量式开发(每一增量版本包括用户需求的一部分功能)
优点:a.降低需求变更成本;
b.及时得到客户的反馈意见;
c.客户在较早期可以获得可以交付和部署的未包括所有功能版本。
存在问题:
a.过程不可见,因为系统快速迭代,要产生反映每个版本的文档不合算。
b.增量式开发容易使系统结构退化,敏捷方法建议定期对软件进行重构。
- 集成与配置(面向复用的软件工程)
优点:减低软件开发量,降低成本和风险
缺点:不完全满足客户的真实需求;对可复用构件的新版本不可控制,失去对系统演化的控制。
3.过程改进
目的:通过理解当前的软件过程,对其进行改变以提高产品质量,降低成本和开发时间。
方法:过程成熟度方法(软件过程成熟度等级反馈好的技术和管理实践多大程序得到应用)
敏捷方法(最好的过程是额外开销最低的过程)
第三章 敏捷软件开发
1.敏捷方法原则
a.客户参与
b.拥抱变化
c.增量交付
d.保持简洁
e.人而不是过程
2.敏捷开发技术(极限编程)
极限编程开发实践
a.用户故事(开发团队将用户场景分解为任务,并预计所需工作量及资源)
b.重构(局部修改可能导致软件结构退化,重构改进软件结构及可读性)
c.测试先行的开发
d.结对编程(系统共有共责,非正式评审,鼓励重构)
3.敏捷项目管理(scrum敏捷方法)
目的:解决敏捷项目团队的时间和资源能否充分利用。
scrum过程(冲刺周期):输入产品待办事项,每次迭代产生一个可交付的产品增量。
4.敏捷方法的伸缩(应对不同软件规模及不同组织的变化)
a.实践问题:敏捷开发的非正式性和大型企业基于法律的合同制度有冲突。
敏捷方法适合软件开发而不是软件维护,而大型软件主要成本在于维护。
敏捷方法适合小的,同处一地的团队,对分布全球的团队难以实践。
b.敏捷与计划驱动相结合
c.面向大型系统的敏捷方法
d.面向整个组织的敏捷方法
第四章 需求工程
对一个系统的需求是关于该系统应当提供的服务以及对其运行的约束的描述。
定义:找出,分析,文档化并且检查这些服务和约束的过程称为需求工程。用户需求表示高层的抽象需求,系统需求是对系统应当做什么的描述。
1.功能性需求和非功能性需求
2.需求工程过程
抽取需求-->转换为标准格式(规格说明)-->确认需求
3.需求抽取
目的:理解利益相关者所做的事情以及如何使用一个新系统支持他们的工作。
a.需求抽取技术:访谈,人种学调查
b.故事和场景
4.需求规格说明
a.自然语言规格说明
b.结构图画自然语音说明(基于表格或模版)
c.图形化表示法(UML用况和顺序图)
d.软件需求文档(SRS)
5.需求确认
a.正确性检查(是否反映真实需求)
b.一致性检查(是否互相矛盾的约束)
c.完整性检查(是否包含所有功能及约束)
d.现实性检查(技术实现和预算是否合理)
e.可验证性检查(每一条需求都能够通过测试验证)
6.需求变更