編輯推薦
本書反映了作者10多年來構造系統以及教授軟體工程課程的體會。我們發現,學生常常孤立地學習程式設計技術和軟體工程技術,常常選擇小的問題作為研究實例。所帶來的結果是,學生們能夠有效地解決定義明確的問題,但當他們第一次真正面對複雜而真實的開發項目時,常常會感到束手無策。真實的開發過程需要很多不同的技術和工具,要求開發人員之間進行合作。針對這一情況,現今的軟體工程本科課程體系中通常包括一門軟體工程項目管理的課程,講授組織成一個開發項目所必需的知識。
圖書簡介
編寫本書時,在我們的頭腦中一直有一個課程項目。這個項目除了可以作為課程設計的項目之外,還可以在其他場合使用,例如用作短期集訓或者短期研發的項目等。我們使用了真實系統中的實例,並檢驗UML、基於Java的技術、設計模式、設計原理、配置管理以及質量控制等現代技術之間的互動。此外,我們討論了與項目管理相關的問題,這些問題與上述技術及其對複雜性和變化的影響相關。
前言
十多年以前,我就了解到由卡耐基·梅隆大學(CMU)的Bernd Bruegge講授的一門軟體工程課程。在很多其他大學的軟體工程課程上,通常的做法是,在一個學期中,將3~4個學生分在一個小組中,並給每一個小組分派幾個小問題或項目,其中每一個小問題或項目的研究周期不超過一個月。在這些小項目中,有一個能力較強的主程式設計師,通常通過該主程式設計師的強力帶動而推動整個小組的工作,以完成這些小項目。在這樣的背景之下,通常學生沒有必要學習溝通技能,沒有必要使用建模工具,也沒必要處理實際問題中所存在的歧義性。在這種環境下培養的學生並沒有學會怎樣去處理開發實際項目時將遇到的各種複雜性問題。在Bruegge教授的課程中,全班同學在整個學期中都在完成同一個項目:為匹茲堡市開發一個面向查詢的導航系統。學生們得在上一個學期學生所開發出的互動系統的基礎上,完成進一步的開發。客戶是市規劃部門的經理和領域權威。在該項目中,地理數據和汽車調度數據存在不精確、格式不兼容的情況,在學年結束時,學生們完成了一個超過27 000行代碼的系統,該系統最終被客戶接受。這一結果與許多其他院校教學中使用的軟體工程小項目相比,有多么大的不同啊!CMU的學生通過學習該課程,理解到了處理現實世界複雜性和雜亂性所需要的策略、組織和工具。學生們通過在實例中實踐來學習軟體工程課程,這是學會任何技藝的必由之路。
本書反映的是將軟體開發作為一門工程學科的實用哲學。作者採用一種觀點——一種使用UML面向對象的方法,這使得軟體工程的許多方面能夠為學生所了解到。這些內容包括完成實際項目所需要的建模技術、人與人之間的溝通技巧。除此之外,還包含了如何管理變化的章節內容,這是每一個實際項目中均會出現的話題,但這一內容在其他的軟體工程書籍中又常常被忽略掉。閱讀本書將會使讀者對軟體工程的豐富範疇及其複雜性有深刻的理解。
目錄
目 錄
譯者的話 I
前言 III
序言 V
致謝 XI
第1部分 開 始
第1章 軟體工程導論 3
1.1 導言:軟體工程的失誤 3
1.2 什麼是軟體工程 5
1.2.1 建模 6
1.2.2 問題求解 7
1.2.3 知識獲取 8
1.2.4 基本原理 8
1.3 軟體工程概念 9
1.3.1 參與者與角色 9
1.3.2 系統與模型 10
1.3.3 工作產品 11
1.3.4 活動、任務與資源 11
1.3.6 記號、方法和方法學 12
1.4 軟體工程開發活動 13
1.4.1 需求獲取 13
1.4.2 分析 14
1.4.3 系統設計 16
1.4.4 對象設計 16
1.4.5 實現 16
1.4.6 測試 17
1.5 管理軟體開發 17
1.5.1 溝通 17
1.5.2 基本原理管理 18
1.5.3 軟體配置管理 18
1.5.4 項目管理 18
1.5.6 總結 19
1.6 競技場實例分析 19
1.7 推薦讀物 20
1.8 練習 21
第2章 使用UML進行建模 22
2.1 導言 22
2.2 UML綜述 23
2.2.1 用例圖 23
2.2.2 類圖 24
2.2.3 互動圖 25
2.2.4 狀態機 25
2.2.5 活動圖 26
2.3 建模活動中的概念 27
2.3.1 系統、模型和視點 27
2.3.3 類、抽象類和對象 29
2.3.4 事件類、事件和訊息 31
2.3.5 面向對象建模過程 31
2.3.6 約簡表達和原型構造 33
2.4 UML的深入透視 34
2.4.1 用例圖 34
2.4.2 類圖 39
2.4.3 互動圖 47
2.4.4 狀態機 49
2.4.5 活動圖 51
2.4.6 圖的組織 53
2.4.7 圖的擴展 55
2.5 推薦讀物 56
2.6 練習 56
第3章 項目組織和溝通 58
3.1 引言:一個有關火箭的例子 58
3.2 項目綜述 59
3.3 項目管理概念 62
3.3.1 項目管理 62
3.3.2 角色 65
3.3.3 任務和工作產品 67
3.3.4 進度表 68
3.4 項目溝通中的概念 69
3.4.1 計畫內溝通 69
3.4.2 計畫外的溝通 74
3.4.3 溝通機制 77
3.5 有組織的活動 83
3.5.1 加入一個項目團隊 83
3.5.2 使用溝通基礎設施 84
3.5.3 參加項目團隊情況通氣會議 84
3.5.4 組織客戶和項目總結 86
3.6 推薦讀物 87
3.7 練習 87
第2部分 複雜性處理
第4章 需求獲取 91
4.1 引言:可用性實例 91
4.2 對需求獲取的總的看法 92
4.3 需求獲取概念 94
4.3.1 功能需求 94
4.3.3 完全性、一致性、清晰性和正確性 95
4.3.4 現實性、確認和可追蹤性 96
4.3.5 綠地工程、再工程和界面工程 97
4.4 需求獲取活動 97
4.4.1 標識參與者(Actor) 98
4.4.2 標識場景 99
4.4.3 標識用例 101
4.4.4 求精用例 103
4.4.5 標識參與者和用例之間的關係 105
4.4.6 標識初始的分析對象 108
4.4.7 標識非功能性需求 110
4.5 需求獲取管理 111
4.5.1 與客戶協商規格說明:聯合套用設計 112
4.5.2 追蹤性維護 113
4.5.3 需求獲取的編檔 114
4.6 ARENA實例研究 115
4.6.1 初始問題陳述 115
4.6.2 標識參與者和場景 117
4.6.3 標識用例 120
4.6.4 求精用例與標識關係 122
4.6.5 標識非功能性需求 126
4.6.6 應接受的教訓 126
4.7 推薦讀物 127
4.8 練習 128
第5章 分析 130
5.1 導言:光幻影 130
5.2 分析概述 131
5.3 分析的概念 132
5.3.1 對象模型和動態模型分析 132
5.3.2 實體、邊界和控制對象 132
5.3.3 泛化和特化 134
5.4 分析活動:從用例到對象 134
5.4.1 標識實體對象 135
5.4.2 標識邊界對象 137
5.4.3 標識控制對象 138
5.4.4 使用順序圖將用例映射成對象 139
5.4.5 使用CRC卡建模對象之間的互動 142
5.4.6 標識關聯 143
5.4.7 標識聚集 145
5.4.8 標識屬性 146
5.4.9 建模單一對象的狀態相關的行為 147
5.4.10 建模對象之間的繼承關係 148
5.4.11 分析模型評審 148
5.4.12 分析小結 149
5.5 分析管理 150
5.5.1 分析文檔化 151
5.5.2 分配責任 151
5.5.3 對分析的溝通 152
5.5.4 分析模型的疊代 153
5.5.5 客戶發出的結束信息 154
5.6 ARENA案例研究 156
5.6.1 標識實體對象 156
5.6.2 標識邊界對象 159
5.6.3 標識控制對象 160
5.6.4 建模對象之間的互動 161
5.6.5 評價和加固分析模型 163
5.6.6 應該吸取的教訓 165
5.7 推薦讀物 166
5.8 練習 166
第6章 系統設計:分解系統 168
6.1 導言:一個地板規劃的例子 168
6.2 系統設計概述 170
6.3 系統設計概念 171
6.3.1 子系統與類 171
6.3.2 服務與子系統接口 172
6.3.3 耦合與內聚 173
6.3.4 分層與劃分 176
6.3.5 體系結構風格 178
6.4 系統設計活動:從對象到子系統 184
6.4.1 出發點:線路規劃系統的分析模型 184
6.4.2 標識設計目標 186
6.4.3 標識子系統 188
6.5 推薦讀物 190
6.6 練習 190
第7章 系統設計:選擇設計目標 192
7.1 介紹:一個冗餘系統的例子 192
7.2 系統設計活動概述 193
7.3 概念:UML部署圖 195
7.4 系統設計活動:選擇設計目標 196
7.4.1 將子系統映射到處理器和構件上 196
7.4.2 標識並存儲持久性數據 197
7.4.3 提供訪問控制 200
7.4.4 設計全局控制流 205
7.4.5 標識服務 207
7.4.6 標識邊界條件 208
7.4.7 評審系統設計 210
7.5 管理系統設計 212
7.5.1 系統設計編檔 212
7.5.2 責任分配 213
7.5.3 系統設計交流 214
7.5.4 系統設計疊代 215
7.6 ARENA案例研究 216
7.6.1 標識設計目標 216
7.6.2 標識子系統 217
7.6.3 將子系統映射到處理器和構件 218
7.6.4 標識並存儲持久性數據 220
7.6.5 提供訪問控制 220
7.6.6 設計全局控制流 221
7.6.7 標識服務 222
7.6.8 標識邊界條件 224
7.6.9 課程小結 226
7.7 推薦讀物 226
7.8 練習 227
第8章 對象設計:復用模式解決方法 228
8.1 導言:挫折 228
8.2 對象設計總論 230
8.3 復用的概念:解對象、繼承和設計模式 232
8.3.1 套用對象和解對象 232
8.3.2 定義繼承和實現繼承 233
8.3.3 授權 235
8.3.4 Liskov替換準則 235
8.3.5 設計模式中的授權和繼承 236
8.4 復用活動:選擇設計模式和構件 238
8.4.1 使用Bridge模式封裝數據存儲 239
8.4.2 通過Adapter模式封裝遺留構件 240
8.4.3 用Strategy模式封裝上下文 242
8.4.4 使用Abstract Factory模式封裝平台 244
8.4.6 用Composite設計模式封裝層次 246
8.4.7 選擇設計模式的啟發式準則 248
8.4.8 標識和調整套用框架 248
8.5 管理復用 252
8.5.1 文檔編輯復用 253
8.5.2 分配責任 254
8.6 ARENA案例分析 254
8.6.1 使用Abstract Factory設計模式 255
8.6.2 使用Command設計模式 256
8.6.3 使用Observer設計模式 257
8.6.4 課程回顧 257
8.7 推薦讀物 258
8.8 習題 258
第9章 對象設計:說明接口 260
9.1 導言:一個鐵路的例子 260
9.2 接口規格說明概述 261
9.3 接口規格說明概念 262
9.3.1 類實現者、類擴展者和類用戶 263
9.3.2 類型、簽名和可見性 264
9.3.3 契約:不變式、前置條件和後置條件 265
9.3.4 對象約束語言 266
9.3.5 OCL集合:集合、袋以及序列 269
9.3.6 OCL量詞:全稱量詞forAll和存在量詞exists 272
9.4 接口規格說明活動 272
9.4.1 標識遺漏的屬性和操作 273
9.4.2 說明類型、簽名和可見性 274
9.4.3 說明前置條件和後置條件 275
9.4.4 說明不變式 277
9.4.5 繼承契約 278
9.5 對象設計管理 280
9.5.1 對象設計編檔 280
9.5.2 分配責任 285
9.5.3 在需求分析中使用契約 285
9.6 ARENA案例分析 286
9.6.1 標識在系列賽風格TournamentStyle和回合Round中遺漏的操作 286
9.6.2 定義說明系列賽風格TournamentStyle和回合Round中的契約 288
9.6.3 定義說明淘汰賽風格KnockOutStyle和淘汰回合KnockOutRound
??????契約 290
9.6.4 課程回顧 291
9.7 推薦讀物 291
9.8 練習 292
第10章 將模型映射到代碼 294
10.1 導言:一個關於書的例子 294
10.2 映射的概述 295
10.3 映射的概念 296
10.3.1 模型轉換 296
10.3.2 重構 297
10.3.3 正向工程 299
10.3.4 逆向工程 300
10.3.5 轉換原則 300
10.4 映射活動 301
10.4.1 最佳化對象設計模型 301
10.4.2 將關聯映射到集合 304
10.4.3 將契約映射到異常 308
10.4.4 將對象模型映射到持久存儲模式 312
10.5 管理實現 317
10.5.1 編檔過程轉換 317
10.5.2 指派職責 318
10.6 ARENA案例研究 318
10.6.1 競技場系統ARENA中的統計類Statistics 319
10.6.2 將關聯映射到集合 320
10.6.3 將契約映射到異常 322
10.6.4 將對象模型映射到資料庫模式 323
10.6.5 課程回顧 324
10.7 推薦讀物 324
10.8 練習 325
第11章 測試 327
11.1 導言:測試太空梭 327
11.2 測試概述 329
11.3 測試概念 332
11.3.1 故障、錯誤狀態和失效 333
11.3.2 測試用例 335
11.3.3 測試樁和測試驅動 337
11.3.4 更正 337
11.4 測試活動 338
11.4.1 構件檢查 338
11.4.3 單元測試 340
11.4.4 集成測試 348
11.4.5 系統測試 352
11.5 管理測試 356
11.5.1 制定測試計畫 356
11.5.2 編寫測試文檔 357
11.5.3 分配職責 359
11.5.4 回歸測試 360
11.5.5 使測試自動化 361
11.5.6 基於模型的測試 362
11.6 推薦讀物 364
11.7 練習 365
第3部分 變更管理
第12章 基本原理管理 369
12.1 引言:將火腿切成薄片 369
12.2 基本原理概述 370
12.3 基本原理概念 372
12.3.1 集中式的交通控制 373
12.3.2 定義問題:問題 374
12.3.3 探索問題空間:提議 375
12.3.4 評價求解空間:標準和討論 376
12.3.5 使求解空間崩潰:解決方案 377
12.3.6 執行解決方案:活動項 378
12.3.7 基於問題的模型和系統實例 379
12.4 基本原理的活動:從問題到決策 382
12.4.1 CTC系統設計 382
12.4.2 在會議中獲取基本原理 383
12.4.3 異步獲取基本原理 389
12.4.4 當討論變更的時獲取的基本原理 391
12.4.5 重新構造基本原理 393
12.5 管理基本原理 395
12.5.1 將基本原理文檔化 395
12.5.2 分配任務 396
12.5.3 關於基本原理交流的
啟發式規則 397
12.5.4 問題模型和協商 397
12.5.5 衝突解決策略 399
12.6 推薦讀物 400
12.7 練習 400
第13章 配置管理 402
13.1 引言:一個飛機的實例 402
13.2 配置管理的概要 404
13.3 配置管理的概念 405
13.3.1 配置項和CM聚集 406
13.3.2 版本和配置 406
13.3.3 變化請求 407
13.3.4 升級和發布 407
13.3.5 倉庫和工作空間 407
13.3.6 版本標識方案 408
13.3.7 變化和變化集 409
13.3.8 配置管理工具 410
13.4 配置管理活動 411
13.4.1 配置項和CM聚集標識 413
13.4.2 升級管理 414
13.4.3 發布版本管理 415
13.4.4 分支管理 417
13.4.5 不同版本管理 419
13.4.6 變更管理 421
13.5 對配置管理的管理 422
13.5.1 配置管理的文檔化 422
13.5.2 分配配置管理責任 423
13.5.3 計畫配置管理活動 424
13.5.4 持續集成:測試活動和改進管理 424
13.6 推薦讀物 426
13.7 練習 426
第14章 項目管理 428
14.1 介紹:STS-51L發射決定 428
14.2 項目管理概述 430
14.3 項目管理概念 434
14.3.1 任務和活動 434
14.3.2 工作產品、工作包和角色 435
14.3.4 任務模型 436
14.3.5 技能矩陣 437
14.3.6 組織 438
14.3.7 可視組織結構 440
14.3.8 組織結構圖譜 440
14.3.9 軟體項目管理計畫 441
14.4 項目管理活動 443
14.4.1 計畫項目 444
14.4.2 組織項目 448
14.4.3 控制項目 451
14.4.4 終結項目 455
14.5 Agile項目管理活動 456
14.5.1 項目計畫:創建產品和衝刺後備 457
14.5.2 組織項目 457
14.5.3 控制項目:每一天的衝刺和滅火表(burn down charts) 458
14.5.4 終止項目:對於衝刺的評論 459
14.6 推薦讀物 460
14.7 練習 460
15.1 導言:玻利尼西亞航行 462
15.2 IEEE 1074:開發軟體生命周期過程的標準 465
15.2.1 過程與活動 465
15.2.2 軟體生命周期建模 467
15.2.3 項目管理 467
15.2.4 前期開發 468
15.2.5 開發過程 468
15.2.6 後期開發 469
15.2.7 整體過程(交叉開發過程) 470
15.4 生命周期模型 472
15.4.1 以順序活動為中心的模型 473
15.4.2 以疊代活動為中心的模型 475
15.4.3 以實體為中心的模型 479
15.5 推薦讀物 481
15.6 練習 481
第16章 方法學:綜合考慮各種因素 483
16.1 導言:首次攀登喬戈里峰(K2峰) 483
16.2 項目環境 486
16.3 方法學問題 488
16.3.1 需要做多少個計畫 488
16.3.2 需要在多大程度上考慮復用 489
16.3.3 需要建多少種模型 489
16.3.4 過程包含多少步驟 490
16.3.5 需要多大程度上的控制和監控 491
16.3.6 什麼時候重定義項目目標 492
16.4 方法學領域 492
16.4.1 Royce方法學 493
16.4.2 極限編程(XP) 496
16.4.3 Rugby方法學 500
16.5 案例學習 505
16.5.1 XP項目:ATRACT 506
16.5.2 局部主客戶:FRIEND 508
16.5.3 分散式項目:JAMES 513
16.5.4 案例學習總結 518
16.6 推薦讀物 521
16.7 練習 521
第4部分 附 錄
附錄A 設計模式 525
A.1 Abstract Factory:封裝平台 525
A.2 Adapter:對遺留代碼的包裝 526
A.3 Bridge:允許選擇性實現 527
A.4 Command:封裝控制流 527
A.5 Composite:表示遞歸的層次結構 528
A.6 Facade:封裝子系統 529
A.7 Observer:將實體從視圖中分離出來 529
A.8 Proxy:封裝開銷大的對象 530
A.9 Strategy:封裝算法 531
A.10 選擇設計模式的啟發式準則 532
附錄B 術語表 533
附錄C 參考文獻 557