图书目录

目    录

第1章  概述 1

1.1  软件工程学科——发展和影响 2

1.1.1  工程学科艺术的发展 2

1.1.2  软件危机的一个解决方案 3

1.2  程序与软件产品 4

1.3  为什么研究软件工程 5

1.4  软件工程的出现 5

1.4.1  早期计算机编程 6

1.4.2  高级语言编程 6

1.4.3  基于流程控制的设计 6

1.4.4  面向数据结构的设计 8

1.4.5  面向数据流的设计 8

1.4.6  面向对象的设计 9

1.4.7  其他发展 9

1.5  软件开发实践中的重要变化 10

1.6  计算机系统工程 11

1.7  小结 12

1.8  练习 12

第2章  软件生命周期模型 15

2.1  为什么使用生命周期 16

2.1.1  为什么要记录一个生命周期模型 16

2.1.2  阶段出入标准 16

2.2  经典瀑布模型 17

2.2.1  可行性研究 18

2.2.2  需求分析和说明 19

2.2.3  设计 20

2.2.4  编码和单元测试 21

2.2.5  集成和系统测试 22

2.2.6  维护 22

2.3  迭代瀑布模型 22

2.4  原型模型 24

2.5  进化模型 26

2.6  螺旋模型 27

2.7  不同生命周期模型的比较 28

2.8  小结 29

2.9  练习 30

第3章  软件项目管理 33

3.1  软件项目经理的职责 33

3.1.1  软件项目经理的工作职责 33

3.1.2  软件项目经理所必需的技能 34

3.2  项目规划 34

3.3  项目规模估算的度量 36

3.3.1  代码行 (LOC) 36

3.3.2  功能点度量 37

3.4  项目估算方法 39

3.4.1  经验估算法 39

3.4.2  启发式方法 40

3.4.3  分析估算法 40

3.5  经验估算法 40

3.5.1  专家判断法 41

3.5.2  Delphi成本估算 41

3.6  COCOMO—— 一种启发式估算法 41

3.6.1  基本COCOMO模型 42

3.6.2  中等COCOMO模型 45

3.6.3  完整COCOMO模型 45

3.7  HALSTEAD的软件科学—— 一种分析技术 46

3.7.1  标准C语言的运算符和操作数 47

3.7.2  长度和词汇 47

3.7.3  程序量 47

3.7.4  潜在最小量 47

3.7.5  工作量和时间 48

3.7.6  长度估算 48

3.8  人员配置级别估算 50

3.8.1  Norden的工作 50

3.8.2  Putnam的工作 50

3.8.3  时间表改变对于成本的影响 51

3.8.4  Jensen模型 52

3.9  调度 52

3.9.1  工作分解结构 53

3.9.2  活动网络和关键路径方法 54

3.9.3  Gantt图 55

3.9.4  PERT图 56

3.9.5  项目监测和控制 57

3.10  组织和团队结构 57

3.10.1  组织结构 58

3.10.2  团队结构 59

3.11  人员配置 61

3.12  风险管理 62

3.12.1  风险识别 63

3.12.2  风险评估 63

3.12.3  风险遏制 63

3.13  软件组态管理 64

3.13.1  软件组态管理的必要性 65

3.13.2  组态管理活动 65

3.13.3  源代码控制系统 (SCCS)和RCS 67

3.14  杂项计划 67

3.15  小结 68

3.16  练习 68

第4章  需求分析和规约 73

4.1  需求收集和分析 74

4.2  软件需求规约(SRS) 75

4.2.1  SRS文档内容 76

4.2.2  功能需求 77

4.2.3  如何识别功能需求 78

4.2.4  如何记录功能需求 78

4.2.5  可追踪性 80

4.2.6  好的SRS文档的特征 80

4.2.7  差的SRS文档的例子 81

4.2.8  SRS文档的组织 81

4.2.9  表示复杂逻辑的技术 82

4.3  形式系统开发技术 84

4.3.1  什么是形式技术 84

4.3.2  模型与面向属性的方法 85

4.3.3  操作语义 85

4.3.4  形式方法的优点和局限 86

4.4  公理规约 87

4.5  代数规约 88

4.5.1  辅助函数 91

4.5.2  结构规约 92

4.5.3  代数规约的优劣 92

4.6  可执行规约和4GL 92

4.7  小结 93

4.8  练习 93

第5章  软件设计 97

5.1  什么是一个优秀的软件设计 98

5.2  内聚和耦合 99

5.2.1  内聚力的分类 100

5.2.2  耦合的分类 101

5.3  整齐排列 101

5.4  软件设计的方法 102

5.4.1  面向功能的设计 103

5.4.2  面向对象的设计 103

5.5  面向对象的设计与面向功能的设计 103

5.6  小结 105

5.7  练习 105

第6章  面向功能的软件设计 107

6.1  SA/SD方法总览 107

6.2  结构分析 108

6.3  数据流程图(DFD) 108

6.3.1  用于构建DFD的原始符号 109

6.3.2  与设计DFD相关的一些重要概念 109

6.3.3  开发一个系统的DFD模型 112

6.3.4  DFD模型的缺点 121

6.4  将DFD技术扩展到实时系统 121

6.5  结构设计 122

6.5.1  流程图与结构图 123

6.5.2  将一个DFD模型转换为一个结构图 123

6.6  细节设计 126

6.7  设计审查 127

6.8  小结 127

6.9  练习 127

第7章  使用UML的对象建模 139

7.1  面向对象的概念总览 139

7.1.1  基本机制 140

7.1.2  关键概念 143

7.1.3  相关的技术名词 147

7.1.4  OOD的优势 147

7.2  统一建模语言(UML) 148

7.3  UML图 150

7.4  使用实例模型 151

7.4.1  用例的表示 152

7.4.2  为什么开发用例图 154

7.4.3  如何识别一个系统的用例 155

7.4.4  基本用例与真实用例 155

7.4.5  用例之间的共有属性的因子化 155

7.4.6  用例包 157

7.5  类图 158

7.6  交互图 162

7.7  活动图 164

7.8  状态图 165

7.9  小结 166

7.10  练习 167

第8章  面向对象的软件开发 169

8.1  设计模式 170

8.2  一个泛化的面向对象的分析和设计过程 172

8.2.1  总览 172

8.2.2  用例模型开发 173

8.2.3  域建模 174

8.2.4  实体对象的识别 175

8.2.5  Booch的对象识别方法 176

8.2.6  交互建模 177

8.2.7  CRC卡片 177

8.3  例子 178

8.4  OOD好坏的标准 183

8.5  小结 184

8.6  练习 185

第9章  用户界面设计 187

9.1  一个良好用户界面的特征 187

9.2  基本概念 189

9.2.1  用户指南和在线帮助 189

9.2.2  基于模式的界面与无模式的界面 190

9.2.3  图形用户界面(GUI)与基于文本的用户界面 190

9.3  用户界面的种类 191

9.3.1  基于命令语言的界面 191

9.3.2  基于菜单的界面 192

9.3.3  直接操作界面 194

9.4  基于组件的GUI开发 194

9.4.1  窗口系统 194

9.4.2  控件类型 197

9.4.3  X-Window/Motif概述 198

9.4.4  X架构 198

9.4.5  可视化编程 199

9.4.6  基于组件的GUI的规模度量 200

9.5  用户界面设计方法 200

9.5.1  用户界面设计中的人类认知能力的暗示 200

9.5.2  GUI设计方法 201

9.5.3  任务和对象建模 201

9.5.4  选择一个比喻 203

9.5.5  交互设计和粗略布局 203

9.5.6  用户界面检查 203

9.6  小结 204

9.7  练习 204

第10章  编码和测试 207

10.1  编码 207

10.2  代码复审 209

10.2.1  代码走查 209

10.2.2  代码检查 210

10.2.3  洁净室测试 210

10.2.4  软件文档 211

10.3  测试 212

10.3.1  什么是测试 212

10.3.2  验证与确认 212

10.3.3  测试用例的设计 212

10.4  大型测试与小型测试 213

10.5  单元测试 213

10.6  黑盒测试 214

10.6.1  等价类划分 214

10.6.2  边界值分析 215

10.6.3  黑盒测试集设计小结 215

10.7  白盒测试 216

10.7.1  语句覆盖 216

10.7.2  分支覆盖 217

10.7.3  条件覆盖 217

10.7.4  路径覆盖 217

10.7.5  McCabe的圈复杂性度量 219

10.7.6  基于数据流的测试 220

10.7.7  变异测试 221

10.8  调试 221

10.8.1  调试方法 221

10.8.2  调试指南 222

10.9  程序分析工具 222

10.9.1  静态分析工具 222

10.9.2  动态分析工具 223

10.10  集成测试 223

10.11  系统测试 225

   10.11.1  性能测试 225

   10.11.2  错误撒播 227

10.12  和测试相关的一些一般问题 227

10.13  小结 228

10.14  练习 228

第11章  软件可靠性和质量管理 235

11.1  软件可靠性 235

11.1.1  硬件与软件可靠性 236

11.1.2  可靠性度量 237

11.1.3  可靠性增长建模 238

11.2  统计测试 239

11.3  软件质量 240

11.4  软件质量管理体系 241

11.5  ISO 9000 242

11.5.1  什么是ISO 9000认证 242

11.5.2  软件行业的ISO 9000 242

11.5.3  为什么要得到ISO 9000认证 243

11.5.4  如何获得ISO 9000认证 243

11.5.5  ISO 9001需求概述 244

11.5.6  ISO 9001需求的显著特征 246

11.5.7  ISO 9000认证的缺点 246

11.6  SEI能力成熟度模型 246

11.6.1  ISO 9000和SEI/CMM的比较 248

11.6.2  SEI CMM是否适用于小型组织 248

11.7  个体软件过程(PSP) 249

11.8  六西格玛 250

11.9  小结 251

11.10  练习 251

第12章  计算机辅助软件工程 255

12.1  CASE及其范围 255

12.2  CASE环境 255

12.3  软件生命周期中的CASE支持 257

12.3.1  原型支持 257

12.3.2  结构分析和设计 258

12.3.3  代码生成 258

12.3.4  测试CASE生成器 258

12.4  CASE工具的其他特征 258

12.4.1  硬件和环境需求 259

12.4.2  文档支持 259

12.4.3  项目管理 259

12.4.4  外部界面 259

12.4.5  逆向工程支持 259

12.4.6  数据词典界面 260

12.4.7  教程和帮助 260

12.5  朝着第二代CASE工具前进 260

12.6  一个CASE环境的架构 260

12.7  小结 261

12.8  练习 261

第13章  软件维护 263

13.1  软件维护的特征 263

13.1.1  软件维护的类型 263

13.1.2  软件发展的特征 264

13.1.3  与软件维护相关的特殊问题 264

13.2  软件逆向工程 265

13.3  软件维护过程模型 266

13.4  维护成本的估测 268

13.5  小结 269

13.6  练习 269

第14章  软件复用 271

14.1  什么能够复用 271

14.2  为什么这么久以来几乎没有复用 272

14.3  复用程序中的基本问题 272

14.4  一个复用方法 273

14.4.1  域分析 273

14.4.2  组件分类 274

14.4.3  搜索 274

14.4.4  数据仓库维护 275

14.4.5  无修改的复用 275

14.5  组织级别的复用 276

14.6  小结 277

14.7  练习 278

参考文献 279