新書推薦:
《
甲骨文丛书·波斯的中古时代(1040-1797年)
》
售價:HK$
88.5
《
以爱为名的支配
》
售價:HK$
62.7
《
台风天(大吴作品,每一种生活都有被看见的意义)
》
售價:HK$
53.8
《
打好你手里的牌(斯多葛主义+现代认知疗法,提升当代人的心理韧性!)
》
售價:HK$
66.1
《
新时代硬道理 广东寻路高质量发展
》
售價:HK$
77.3
《
6S精益管理实战(精装版)
》
售價:HK$
100.6
《
异域回声——晚近海外汉学之文史互动研究
》
售價:HK$
109.8
《
世界文明中的作物迁徙:聚焦亚洲、中东和南美洲被忽视的本土农业文明
》
售價:HK$
99.7
|
編輯推薦: |
本书介绍了建模与设计、UML、模式、基于测试的软件开发、质量保证、配置管理、全生命周期的敏捷原理。作者讲述步骤清晰,深入浅出,在理论介绍过程中提供了大量实例,便于读者理解、实践。内容包含过去十年间软件工程发展的很多方面,既有在美国以及全球的大学和公司里讲授的课程,也有行业内外软件工程项目的应用素材。从面向对象方法学出发,对软件工程进行重新演绎,全面、系统、清晰地介绍了面向对象软件工程的基本概念、原理、方法和工具,通过实例说明了面向对象软件开发的整个过程,是一部值得推荐的经典之作。
|
內容簡介: |
第1部分引言与系统工程。这部分由前3章构成,它提供了观察软件生命周期行为的视角。尤其是,它覆盖了软件过程模型、方法学的概念、过程与方法的区别以及系统工程。 第2部分分析和体系结构设计。这部分介绍了计划阶段的行为,包括需求提取、领域建模和架构设计。 第3部分交互式系统的建模和设计。这部分主要处理建模与交互系统设计问题,共包括6章。这6章介绍了如何根据需求识别出用例、如何对参与者系统交互以及对象交互行为进行建模和设计、如何应用职责分配模式、如何得到作为设计蓝本的设计类框图,以及如何设计用户交互界面。 第4部分其他类型系统的建模和设计。这部分包括3章,每章介绍一种类型系统的建模与设计。具体来说,第13章介绍事件驱动系统的建模与设计;第14章介绍迁移系统的建模与设计;第15章介绍基于业务规则的系统的建模与设计。 第5部分应用情景特定模式。这部分由两章构成,主要介绍如何应用情景特定模式。其中使用了一个案例分析,即状态图编辑器的设计来帮助理解这个过程。 第6部分实现和质量保证。这部分包括3章,包括实现时要考虑的问题、软件质量保证的概念和行为以及软件测试。 第7部分维护和配置管理。这部分包括两章,内容覆盖了软件维护与软件配置管理。 第8部分项目管理和软件安全。本书的*后一部分由两章构成,一章介绍软件项目管理,另一章介绍软件安全,包括涉及安全软件系统的建模与设计的生命周期行为。
|
目錄:
|
目录
第1部分引言与系统工程
第1章引言3
1.1什么是软件工程3
1.2为什么要用软件工程4
1.3软件生命周期行为5
1.3.1软件开发过程5
1.3.2软件质量保证8
1.3.3软件项目管理9
1.4面向对象的软件工程10
1.4.1面向对象的建模和设计
语言10
1.4.2面向对象的开发
过程10
1.4.3面向对象的开发
方法11
1.4.4OO会取代传统的
方法吗11
1.5软件工程和计算机科学11
小结12
深入阅读12
章节复习问题13
练习13
第2章软件过程和方法14
2.1系统开发的挑战14
2.2软件过程15
2.3瀑布模型的优势和问题16
2.4软件开发是一个险恶问题16
2.5软件过程模型17
2.5.1原型过程18
2.5.2演化过程18
2.5.3螺旋模型18
2.5.4统一过程19
2.5.5个人软件过程20
2.5.6团队软件过程24
2.5.7敏捷过程26
2.6软件开发方法30
2.6.1过程和方法的区别30
2.6.2方法的好处31
2.6.3结构化方法32
2.6.4经典的面向对象
方法32
2.7敏捷方法32
2.7.1动态系统开发
方法DSDM34
2.7.2Scrum35
2.7.3特征驱动的开发35
2.7.4极限编程36
2.7.5敏捷还是计划驱动36
2.8本书中的过程和方法一览37
小结41
深入阅读41
章节复习问题42
练习42
第3章系统工程43
3.1什么是系统43
3.2什么是系统工程44
3.3系统需求定义47
3.3.1识别业务需求47
3.3.2定义系统需求48
3.4系统结构设计48
3.4.1系统分解49
3.4.2需求分配51
3.4.3结构设计图52
3.4.4子系统功能和接口规
格说明55
3.5子系统开发56
3.5.1面向对象的上下文图56
3.5.2面向对象的上下文图
的用途57
3.5.3工程团队的协作58
3.6系统集成、测试和部署58
3.7系统配置管理58
小结60
深入阅读60
章节复习问题60
练习60
第2部分分析和体系结构设计
第4章获取软件需求65
4.1什么是需求获取65
4.2获取需求的重要性67
4.3获取需求的挑战67
4.4需求的类型68
4.5获取需求的步骤69
4.5.1收集信息70
4.5.2构建分析模型73
4.5.3获取需求和约束74
4.5.4需求规格标准77
4.5.5进行可行性研究77
4.5.6审查需求规格说
明书77
4.6应用敏捷原则79
4.7需求管理和工具80
小结81
深入阅读81
章节复习问题81
练习82
第5章领域建模84
5.1什么是领域建模84
5.2为什么要进行领域建模85
5.3面向对象和类图85
5.3.1外延定义和意向
定义85
5.3.2类和对象86
5.3.3对象和属性87
5.3.4关联88
5.3.5多重性和角色89
5.3.6聚合90
5.3.7继承90
5.3.8继承和多态91
5.3.9关联类91
5.4领域建模的步骤93
5.4.1收集应用领域信息94
5.4.2头脑风暴94
5.4.3对头脑风暴结果
分类95
5.4.4领域模型可视化98
5.4.5领域建模审查
清单102
5.5综合103
5.6领域建模的方针105
5.7应用敏捷原则106
5.8领域建模的工具支持107
小结108
深入阅读109
章节复习问题109
练习109
第6章架构设计111
6.1什么是架构设计111
6.2架构设计的重要性112
6.3架构设计过程112
6.3.1确定架构设计
目标113
6.3.2确定系统类型114
6.3.3应用架构样式117
6.3.4进行定制的架构
设计124
6.3.5明确子系统功能和
接口124
6.3.6审查架构设计125
6.4架构样式和包图125
6.5应用软件设计准则126
6.5.1什么是软件设计
准则127
6.5.2为改变而设计127
6.5.3关注点分离128
6.5.4信息隐藏129
6.5.5高内聚129
6.5.6低耦合129
6.5.7保持简单和直接130
6.6架构设计的方针131
6.7架构设计和设计模式131
6.8应用敏捷原则132
小结132
深入阅读132
章节复习问题133
练习133
第3部分交互式系统的建模和设计
第7章从需求获取用例137
7.1什么是参与者137
7.2什么是用例138
7.3业务过程、操作和活动138
7.4从需求获取用例的步骤140
7.4.1识别用例140
7.4.2明确用例范围146
7.4.3用例上下文可
视化147
7.4.4检查用例规约151
7.4.5将用例分配给
迭代152
7.5导出用例的方针153
7.6应用敏捷原则155
7.7用例建模的工具支持155
小结157
深入阅读157
章节复习问题157
练习158
第8章参与者系统交互建模159
8.1什么是参与者系统交互
建模159
8.2参与者系统交互建模的
重要性160
8.3参与者系统交互建模的
步骤160
8.3.1初始化一个两列
的表161
8.3.2明确参与者系统交互
的步骤161
8.3.3检查参与者系统交互
规约161
8.4明确可替换的流162
8.5使用用户界面原型163
8.6不要显示异常处理166
8.7用例的先决条件和后置
条件166
8.8包含其他用例167
8.9用其他用例继续167
8.10常见问题168
8.11应用敏捷原则170
小结170
深入阅读171
章节复习问题171
练习171
第9章对象交互建模172
9.1什么是对象交互建模172
9.2UML顺序图173
9.2.1概念和表示法173
9.2.2展示类的实例173
9.2.3顺序图说明174
9.2.4顺序图用于分析和
设计176
9.2.5正确使用表示
方法178
9.3对象交互建模的步骤179
9.3.1收集业务过程的
信息180
9.3.2识别非普通步骤180
9.3.3为非普通步骤书写
场景181
9.3.4构建场景表183
9.3.5怎么写场景183
9.3.6从场景表得到顺
序图188
9.3.7对象交互建模检查
清单194
9.4应用敏捷原则195
9.5对象交互建模的工具支持197
小结197
深入阅读197
章节复习问题197
练习198
第10章应用职责分配模式199
10.1什么是设计模式199
10.2为什么要用设计模式200
10.3情景特定模式和职责分配
模式200
10.4模式规约201
10.5控制器模式202
10.5.1激励示例202
10.5.2什么是控制器204
10.5.3应用控制器
模式204
10.5.4控制器的类型206
10.5.5跟踪记录用例
状态 206
10.5.6臃肿的控制器207
10.5.7比较不同的
设计208
10.5.8何时应用控制器
模式209
10.5.9使用控制器的
方针210
10.6专家模式210
10.6.1信息专家210
10.6.2应用专家模式211
10.6.3包含不止一个对象
的专家模式212
10.6.4何时应用专家
模式213
10.6.5使用专家模式的
方针213
10.7创建者模式213
10.7.1什么是创建者213
10.7.2应用创建者
模式214
10.7.3创建者模式的
优势215
10.7.4何时应用创建者
模式215
小结216
深入阅读216
章节复习问题216
练习217
第11章获取设计类图219
11.1什么是设计类图220
11.2设计类图的用途220
11.3获取设计类图的步骤221
11.3.1识别类221
11.3.2识别方法222
11.3.3识别属性224
11.3.4类之间的关系226
11.3.5识别关系226
11.3.6设计类图检查
清单228
11.4用包图组织类228
11.5应用敏捷原则230
11.6设计类图的工具支持231
小结231
深入阅读231
章节复习问题231
练习231
第12章用户接口设计232
12.1什么是用户接口设计232
12.2用户接口设计为什么
重要233
12.3图形用户接口组件234
12.3.1容器组件235
12.3.2输入、输出和信息
展示组件235
12.3.3使用GUI组件的
方针237
12.4用户接口设计过程237
12.4.1案例研究: 为状态
图编辑器设计用户
接口238
12.4.2识别系统主要显示
方式238
12.4.3生成布局设计
草图240
12.4.4明确交互行为242
12.4.5构建原型242
12.4.6用户评估用户接口
设计243
12.4.7用户接口设计检查
清单244
12.5设计用户支持功能245
12.6用户接口设计的方针245
12.7应用敏捷原则247
12.8用户接口设计的工具
支持247
小结248
深入阅读248
章节复习问题248
练习249
第4部分其他类型系统的建模和设计
第13章事件驱动系统的对象状态
建模253
13.1什么是对象状态建模253
13.2为什么要进行对象状态
建模254
13.3基本定义254
13.4对象状态建模的步骤255
13.4.1收集和分类状态
行为信息256
13.4.2构建领域模型来
展示上下文258
13.4.3构建状态迁移表260
13.4.4状态迁移表的
用途261
13.4.5将状态迁移表转换
为分析状态图262
13.4.6将分析状态图转换
为设计状态图264
13.4.7状态建模检查
清单265
13.5状态模式265
13.5.1约定的方法265
13.5.2什么是状态
模式266
13.5.3应用状态模式266
13.6实时系统的建模与设计269
13.6.1转换图式270
13.6.2定时状态机271
13.6.3中断处理272
13.7应用敏捷原则273
13.8对象状态建模的工具
支持274
小结274
深入阅读275
章节复习问题275
练习275
第14章转换型系统的活动建模278
14.1什么是活动建模278
14.2为什么使用活动建模279
14.3活动建模: 技术背景279
14.3.1流程图280
14.3.2佩特里网280
14.3.3数据流图281
14.4UML活动图282
14.5活动建模的步骤283
14.5.1识别活动和工
作流284
14.5.2产生一个初步活
动图286
14.5.3引入条件分支、分叉
和连接287
14.5.4精炼复杂的活动287
14.5.5活动建模审核检
查表288
14.6与其他图之间的关系288
14.7应用敏捷原则289
14.8活动建模的工具支持289
小结289
深入阅读290
章节复习问题290
练习290
第15章基于规则的系统的建模与
设计291
15.1什么是决策表292
15.2决策表的用处293
15.3系统化的决策表构造293
15.4渐进式决策表构造294
15.5检查所需的属性295
15.6决策表合并296
15.7根据决策表生成代码296
15.8应用解释器模式297
15.8.1定义业务规则
语法297
15.8.2在类图中表示
规则298
15.8.3构建解析器和变量
查找上下文299
15.8.4解释业务规则299
15.8.5动态更新规则300
15.8.6解释方法的
优点300
15.9在测试驱动开发中使用
决策表300
15.10决策树301
15.11应用敏捷原则301
小结302
深入阅读302
章节复习问题302
练习303第5部分应用情景特定模式
第16章应用模式来设计状态图
编辑器307
16.1应用模型的过程308
16.2案例研究: 状态图编
辑器310
16.3处理复杂的结构311
16.3.1表示递归的整体
部分结构311
16.3.2使用策略提供布局
选择315
16.3.3用迭代器访问复杂
的结构316
16.3.4通过访问者分析复
杂的结构317
16.3.5通过备忘录存储和
恢复对象状态320
16.4创建和构造复杂的对象321
16.4.1创建系列产品321
16.4.2构建大型的复杂
对象324
16.4.3通过享元重用
对象326
16.5图形用户界面的设计和
显示327
16.5.1跟踪编辑状态327
16.5.2响应编辑事件328
16.5.3转换接口330
16.5.4提供上下文相关的
帮助333
16.5.5使用装饰增强显示
能力335
16.6应用敏捷原则338
小结338
深入阅读338
章节复习问题339
练习339第17章应用模式来设计持久性
框架340
17.1直接访问数据库会出现的
问题340
17.2通过桥隐藏持久存储341
17.3将数据库请求封装为
命令344
17.4用远程代理隐藏网络
访问348
17.5用模板方法共享通用
代码351
17.6通过工厂方法检索不同
的对象353
17.7用原型减少类的数量355
17.8应用敏捷原则358
小结358
深入阅读358
章节复习问题358
练习358
第6部分实现和质量保证
第18章实现方面的考虑363
18.1编码标准363
18.1.1什么是编码
标准363
18.1.2为什么要建立
编码标准367
18.1.3代码审查清单367
18.1.4编码标准实施
准则367
18.2组织实现部件369
18.3根据设计生成代码370
18.3.1实现类和接口370
18.3.2从顺序图到方法
代码骨架370
18.3.3实现关联关系371
18.4给团队成员分配任务372
18.5结对编程372
18.6测试驱动开发373
18.6.1测试驱动开发的
工作流程373
18.6.2测试驱动开发的
优点375
18.6.3潜在问题375
18.7应用敏捷原则376
18.8对实现的工具支持376
小结376
深入阅读377
章节复习问题377
练习377
第19章软件质量保证379
19.1软件质量保证的益处379
19.2软件质量属性379
19.3质量测量和度量381
19.3.1质量测量和度量的
实用性382
19.3.2常规质量度量382
19.3.3对面向对象软件
重用传统度量387
19.3.4面向对象质量
度量387
19.4软件验证与确认技术389
19.4.1审查389
19.4.2走查390
19.4.3同行审查391
19.5生命周期中的验证和
确认392
19.6软件质量保证功能393
19.6.1过程和标准的
定义394
19.6.2质量管理396
19.6.3过程改进397
19.7应用敏捷原则398
19.8SQA的工具支持399
小结399
深入阅读400
章节复习问题400
练习400
第20章软件测试401
20.1什么是软件测试402
20.2为什么进行软件测试402
20.3传统的黑盒测试403
20.3.1功能性测试: 一个
例子403
20.3.2等价类划分404
20.3.3边界值分析405
20.3.4因果分析407
20.4传统的白盒测试407
20.4.1基路径测试408
20.4.2圈复杂度409
20.4.3流图测试覆盖
准则409
20.4.4测试循环410
20.4.5数据流测试411
20.4.6数据流测试的覆盖
准则412
20.4.7过程间数据流
测试412
20.5测试覆盖率413
20.6一个通用的软件测试
过程413
20.7面向对象的软件测试415
20.7.1基于用例的
测试415
20.7.2用ClassBench进行
对象状态测试416
20.7.3测试类的层次
结构418
20.7.4测试异常处理
能力419
20.8测试Web应用程序420
20.8.1Web应用程序测试
的面向对象模型420
20.8.2使用面向对象模型进
行静态分析421
20.8.3使用面向对象模型生
成测试用例421
20.8.4用httpUnit进行Web
应用程序测试422
20.9非功能性需求的测试422
20.9.1性能和压力
测试422
20.9.2安全测试423
20.9.3测试用户界面423
20.10生命周期中的软件测试424
20.11回归测试426
20.12什么时候停止
测试426
20.13应用敏捷原则427
20.14测试的工具支持427
小结427
深入阅读428
章节复习问题428
练习428
第7部分维护和配置管理
第21章软件维护433
21.1什么是软件维护433
21.2软件变化的因素434
21.3系统演化的雷曼定律434
21.4软件维护的类型435
21.5软件维护过程和活动435
21.5.1维护过程模型436
21.5.2理解程序437
21.5.3变更识别和
分析437
21.5.4配置变更控制439
21.5.5变更实施、测试和
交付440
21.6逆向工程440
21.6.1逆向工程工作流
440
21.6.2逆向工程的用途
440
21.6.3逆向工程: 案例
研究441
21.7软件再工程441
21.7.1再工程的目标441
21.7.2软件再工程的
过程442
21.7.3软件再工程: 案例
研究443
21.8软件维护的模式444
21.8.1用外观模式简化
客户端接口444
21.8.2用中介者模式简化
组件交互445
21.8.3软件维护的
模式445
21.9应用敏捷原则449
21.10软件维护的工具支持449
小结450
深入阅读450
章节复习问题450
练习450
第22章软件配置管理452
22.1软件生命周期的基准452
22.2什么是软件配置管理453
22.3为什么需要软件配置
管理454
22.4软件配置管理的功能454
22.4.1软件配置识别455
22.4.2软件配置变更
控制456
22.4.3软件配置审核457
22.4.4软件配置状态的
审计458
22.5敏捷项目中的配置管理458
22.6软件配置管理工具458
小结460
深入阅读460
章节复习问题460
练习461
第8部分项目管理和软件安全
第23章软件项目管理465
23.1项目组织466
23.1.1项目形式466
23.1.2团队结构467
23.2工作量评估方法468
23.2.1功能点方法468
23.2.2COCOMO Ⅱ模型
469
23.2.3Delphi评估方法
474
23.2.4敏捷评估474
23.3项目计划和调度476
23.3.1PERT图476
23.3.2Gantt图和人员
分配477
23.3.3敏捷规划478
23.4风险管理479
23.4.1风险识别479
23.4.2风险分析和优先级
划分480
23.4.3风险管理规划482
23.4.4风险解决和监控
482
23.5过程改进482
23.6应用敏捷原则484
23.7项目管理的工具支持484
小结485
深入阅读485
章节复习问题486
练习486
第24章软件安全488
24.1什么是软件安全489
24.2安全要求489
24.3安全软件设计原则490
24.4安全软件设计模式491
24.5软件安全的7个最佳
实践493
24.6通过攻击树进行风险
分析494
24.7生命周期中的软件安
全性494
24.7.1规划阶段的安全
495
24.7.2迭代阶段的安全
501
24.8应用敏捷原则503
24.9软件安全的工具支持504
小结504
深入阅读505
章节复习问题505
练习506
附录A个人软件过程: 估计、规划和
质量保证507
A.1PSP中的工作量估计507
A.2PSP中的软件质量保证508
A.3设计和质量508
附录BJava技术510
B.1使用数据库连接510
B.1.1什么是数据库连接
510
B.1.2设置数据源510
B.1.3从程序中访问数据库
511
B.2使用Swing512
B.2.1用JFrame创建主
窗口512
B.2.2利用布局管理器
来布局组件513
B.2.3使用动作监听器
处理按钮事件515
B.2.4实现绘图功能515
B.3使用JSP517
B.3.1什么是JSP517
B.3.2JSP工作流517
B.3.3用JSP容器安装Web
服务器518
B.3.4使用JSP518
附录C软件工具521
C.1NetBeans521
C.2使用JUnit522
C.3在NetBeans中运行
JUnit525
C.4Emma覆盖工具525
C.5Cobertura覆盖工具526
C.6使用HttpUnit测试Web
应用程序527
C.6.1配置IDE以使用
HttpUnit527
C.6.2在HttpUnit中实现
测试用例528
C.7在NetBeans中使用cvs和
Subversion529
C.7.1创建CVS远程存
储库529
C.7.2在NetBeans中安装
Subversion530
C.7.3从存储库检出文件
531
C.7.4编辑源和查看变更
533
C.7.5查看文件状态533
C.7.6比较文件版本534
C.7.7合并存储库中的
更改534
C.7.8解决冲突534
C.7.9更新本地副本534
C.7.10提交本地文件到
存储库535
C.7.11导入文件到存储库
535
附录D项目概要536
D.1汽车租赁系统536
D.2国家贸易展览服务系统536
D.3海外留学管理系统537
D.4UML类图编辑器539
D.5无线电通信模拟器540
D.6对象状态测试环境541
参考文献543
|
內容試閱:
|
译者序计算机已经渗透到社会生活的方方面面。计算机之所以能够被广泛使用,其背后的推动力就是市场经济。但是,实际上是软件在指挥着计算机按照人们想要的方式在工作。软件或者说计算机程序由成千上万条指令构成,这些指令指挥着计算机进行复杂的运算并且控制计算机硬件设备的运行。近些年对于计算机软件的需求快速增长。为了能够满足软件开发工程师或系统分析师的工作需求,学习软件工程的相关知识是非常必要的。软件工程关注三个环节软件开发过程、软件质量保证和软件项目管理的行为,这些行为贯穿于软件生命周期中,并同时发生;而面向对象的软件工程objectoriented software engineering, OOSE是软件工程的一个专门学科。OOSE将世界和各种系统看作是由相互联系和相互作用的对象构成。在20世纪80年代,C的迅速传播激起了对引导OO软件开发工作的开发方法的需求。提出了三个有影响的、在软件业内被广泛使用的OO软件开发方法,即Booch框图、对象建模技术Object Modeling Technique, OMT和用例工程。业界很快发现使用不同的方法将设计和实现的系统集成起来是一个非常大的挑战,原因就是不同的方法使用不同的建模概念和标记。为了解决这个问题,对象管理组织Object Management Group, OMG采用统一建模语言Unified Modeling Language, UML作为OMG标准。UML是一个框图的集合,这些框图用于给一个OO系统的方方面面进行建模和设计。UML框图用于需求分析阶段来帮助开发团队理解线性系统的业务流程,也作为设计说明的一部分用于设计阶段。本书大量展示了UML框图。感谢德克萨斯大学阿灵顿分校的David C. Kung先生。敏捷过程、设计模式以及测试驱动的开发testdriven development, TDD激发了他写本书的巨大兴趣。敏捷过程强调团队合作、为改变而设计、对软件系统的每个小增量进行快速部署,以及与客户和用户共同开发。设计模式是对常见设计问题的有效解决方案,设计模式促进了软件重用并增进了团队沟通。总之,本文主要关注将UML、设计模式、OO软件测试、TDD集成起来的敏捷统一方法学。软件是你的作品,需要用心血去创作。我们可以用编程语言来准确反映我们的思想,我们应该做得更好,也可以做得更好。只要遵循科学的方法学,一定可以创作出好的软件作品。本书由邢颖翻译,牟永敏统稿。由于译者水平有限,译文中的不当之处在所难免,真诚希望广大读者和同行不吝赐教,我们将不胜感激。
译者2016年11月面向对象软件工程序言序言背景计算机被广泛应用于人类社会的方方面面,它与基于其运行的应用软件一起发挥了很多不同的作用。因此,软件工程师的岗位需求也在井喷式增长。2006年3月的Money杂志将软件工程师评为美国最好的50个工作岗位的第一名。根据美国劳工统计局Bureau of Labor Statistics, BLS20102020预测,应用程序开发工程师岗位将从520 800增长到664 50027.6%,而系统分析师的岗位将从544 400增长到664 80022.1%。为了能够满足对应用程序开发工程师或系统分析师的要求,接受软件工程方面的教育是非常有必要的。但是根据BLS发布的数据,2006年在软件工程领域只授予了160个学士学位和600个硕士学位,而在计算机科学领域则授予了10 289个学士学位和4512个硕士学位。因此,在软件工程人才的需求和供给之间有巨大的鸿沟,尤其是研究生。很多人都不清楚软件工程的研究范围以及它到底有什么用途,这门学科也经常被误解。许多媒体似乎将软件工程定义为写Java程序。有的学生认为软件工程包括与软件相关的一切。另外一些人则认为软件工程就是画UML框图,这个我们后面会提到。多年前,在第一节面向对象的软件工程objectoriented software engineering, OOSE课后,一位学生对我说: 教授,你应该知道这门课对于我来说很容易,因为我们以前都画过太多的UML图了。学期末,那个学生又来找我,他说: 教授,我想说我们很努力地学习,但我们学的是OO设计。这门课并不是我想象的画UML图。所以到底什么是软件工程呢?作为一门学科,它包含为了明显提高软件的生产率和质量,同时降低成本和投放到市场的时间所需的工程过程、方法、质量保证和项目管理研究、教育及应用。OOSE是软件工程的一个分支,其特点是将世界和系统看成是相关联系和相互作用的独特视角。20世纪80年代C语言的出现标志着OOSE时代的到来。从那时起,软件产品开始了其前所未有的世界范围的增长,并因统一建模语言unified modeling language, UML和统一过程unified process, UP的产生以及世界范围的应用而进一步加速增长。严格来说,软件过程描述了一些阶段以及在各个阶段应该做什么。它不会详细定义在每个阶段如何实施各种行为。类似UML这样的建模语言会定义用于交流和记录分析及设计思路的标记、语法和语义。UML和UP都很好,也很必需,但是还不够。这是因为还没有介绍如何产生画UML图的分析和设计思路。动机为了填补上文提到的鸿沟,我们需要一个方法学,或者称之为食谱。与过程不同,方法学是对于一些步骤的详细描述,或者是如何实施一些行为使得初学者也可以学习从而生成并部署所需的软件系统。没有方法学,一名刚入门的软件工程师可能会花费数年在职的训练才能学会OO设计、实现和测试技巧。写本书的动机也包括作者被敏捷过程、设计模式以及测试驱动的开发testdriven development, TDD所激发的巨大兴趣。敏捷过程强调团队合作、为改变而设计、对软件系统的每个小增量进行快速部署,以及与客户和用户共同开发。设计模式是对常见设计问题的有效解决方案。设计模式促进了软件重用并增进了团队沟通。TDD鼓励可测试的软件,并需要在软件实现前产生测试脚本从而使得软件可以立刻被测试,经常被测试。这类似开发一个游乐场的思路。整个过程包括如下阶段: 计划、公共支持、分析设计、筹措资金、画施工图纸、施工、采购设备、安装设备、试运行、剪彩。但是,光了解整个过程是不够的。开发团队必须知道如何实施各阶段的行为。例如,计划行为包括产生初步概念、可行性分析、总体规划。主题公园团队必须知道如何实施这些行为。分析设计行为包括从利益相关者那里获取需求、实地调查、公园布局设计、公园不同区域主题设计、建模从而研究布局设计和主题、进行总体规划。与描述不同阶段行为的过程不同,一套方法学详细描述了一些步骤,或者是如何实施这些行为。游乐场的开发是一个数年的项目,且花费达数十亿美元。投资者希望公园越早产生收益越好,但是如果按照上述方法开发,投资者必须一直等到公园完工。由于传统过程所施加的约束,总体规划一旦结束就不能被轻易修改。而一旦公园完工,如果公园不能满足利益相关者的期待,则其改变的代价很大。敏捷开发旨在解决这些问题。使用敏捷开发,主题公园初步需求被迅速获取,并允许在开发过程中进行演化。然后从中提取出游乐和娱乐设施的需求,并将其认真归类。生成计划来在相对短的时期内开发和部署这些分类设施,即小增量的快速部署。因此,不同于一刀切的总体规划,开发过程每次只设计和部署一类设施。在这些设施部署好并投入运营后,就寻求反馈,并与利益相关者制订出关于开发计划、预算和时间表的需求变化,即联合开发。另外,应用架构设计模式来提高公园对改变的适应能力和质量,也即为改变而设计。强调团队合作是因为团队之间以及团队成员之间有效的协作能够确保这些设施按时无缝地开发和部署。敏捷过程有一些优点: 投资者能较早获得收益,因为这些设施能按照计划投入运营而且是可行的;由于少量的设施是同时开发和部署的,可以容易改正错误并进行改变。总之,本文主要关注将UML、设计模式、OO软件测试、TDD集成起来的敏捷统一方法学。本书中的方法学叫做统一方法学,因为它使用UML作为建模语言并遵循敏捷统一过程。当然这并不意味着对于所有项目都将其他方法统一起来或被当成一个统一方法使用。读者本书的读者为计算机科学或软件工程的学生,以及软件开发的专门人士。本书尤其适合作为高年级本科生的基础教材,以及研究生课程和IT业专业培训课程的入门教材。本书包含过去十年间的很多内容,既有在美国以及全球的大学和公司里讲授的课程,也有行业内外软件工程项目的应用素材。这些素材让我能够近距离观察学生和软件工程师如何应用UP、UML、设计模式和TDD,以及他们所面对的困难。他们的反馈让我能够持续更新本书的内容。组织本书有24章,被分为以下8个部分:第1部分引言与系统工程。这部分由前3章构成,它提供了观察软件生命周期行为的视角。尤其是,它覆盖了软件过程模型、方法学的概念、过程与方法的区别以及系统工程。第2部分分析和体系结构设计。这部分介绍了计划阶段的行为,包括需求提取、领域建模和架构设计。第3部分交互式系统的建模和设计。这部分主要处理建模与交互系统设计问题,共包括6章。这6章介绍了如何根据需求识别出用例、如何对参与者系统交互以及对象交互行为进行建模和设计、如何应用职责分配模式、如何得到作为设计蓝本的设计类框图,以及如何设计用户交互界面。第4部分其他类型系统的建模和设计。这部分包括3章,每章介绍一种类型系统的建模与设计。具体来说,第13章介绍事件驱动系统的建模与设计;第14章介绍迁移系统的建模与设计;第15章介绍基于业务规则的系统的建模与设计。第5部分应用情景特定模式。这部分由两章构成,主要介绍如何应用情景特定模式。其中使用了一个案例分析,即状态图编辑器的设计来帮助理解这个过程。第6部分实现和质量保证。这部分包括3章,包括实现时要考虑的问题、软件质量保证的概念和行为以及软件测试。第7部分维护和配置管理。这部分包括两章,内容覆盖了软件维护与软件配置管理。第8部分项目管理和软件安全。本书的最后一部分由两章构成,一章介绍软件项目管理,另一章介绍软件安全,包括涉及安全软件系统的建模与设计的生命周期行为。本书素材可以满足若干软件工程课程的需求,例如:1. 第1~3部分与第6~8部分的一些主题对于面向对象的软件工程OOSE或软件工程课程的入门,都是一个很好的组合。既可以作为大学本科的课程,也可以作为入门的研究生课程。2. 第2部分和第5部分以及其他部分的部分章节可以构成软件设计模式的课程。建议将上述OOSE课程作为这门课的先修课。但是可能有些国外的学生没学过OOSE这门课,在这种情况下,建议先使用2~4周的时间大概了解一下第2和第3部分介绍的方法,因为这些方法为应用模式提供了框架。3. 第6和第7这两部分可以以很多种方式讲授。它们可以形成一门课质量保证、测试和维护。也可以当成两门课来教,分别是软件质量保证,以及软件测试和维护。当然也可以作为三门课来教,分别是软件质量保证、软件测试和软件维护。4. 第13~15章和第19~20章以及其他章的部分模式可以形成关于建模、设计、复杂系统的验证与确认这门课。5. 第1和第6~8这几部分以及其他部分的部分章节可以形成软件项目管理这门课。6. 最后,第1部分和第2部分以及第24章加上其他章节的部分模式和主题可以构成软件安全概论这门课程。教员可以增加素材使得课程内容更加丰富。在网站http:www.mhhe.comkung上可以找到教学辅助素材,包括PowerPoint教学幻灯片、随堂测试题和测试生成软件、测试问题的数据库、课程描述及要点、实验手册,以及软件工具。尤其对于没上过这门课的新教师来说,这些教学工具可以帮助减少备课的时间和工作量。致谢我想感谢我的众多学生,他们的提问、反馈、热情,以及将课程内容应用于实际项目的努力都在不断激励我。学生们也阅读和使用本书以及教学素材。他们提供给我宝贵的反馈和改进的建议。有些人实地参加到了本书中某些方法的设计和实现中。有些人参加到了评估本书方法效果的实验中。很多人毕业后继续将本书方法应用于行业内,并和我分享他们的宝贵经历。我想感谢我的女儿Jacquelyn Kung帮我编辑草稿的部分章节。感谢McGrawHill环球出版社的工程和计算机科学部的Raghu Srinivasan提供给我宝贵的改进建议和对出版流程的指导。感谢评论家们提出的意见和建议。这些意见和建议对于本书的结构组织、内容显示以及很多方面都有极大的帮助。在漫长的写作过程中,我的妻子Cindy Kung和很多学术界及业内的同事都给予我持续的鼓励和无私的帮助,在此也对他们表示感谢。
都志辉2012年8月于清华园
|
|