《軟件工程》根據CC2004對軟件工程課程的要求,從軟件的開發、維護和管理等方面闡述了軟件工程的基本概念和常用方法。內容包括:軟件工程基礎、結構化軟件開發方法、面向對象軟件開發方法、軟件生存期模型與軟件體系結構、軟件維護與管理。各章節均結合實例講解,使讀者易于理解和掌握。
《軟件工程》可作為高等院校計算機專業或信息類相關專業本科生或研究生教材,也可作為軟件開發人員的參考書。
《軟件工程》作者具有較為豐富的教學實踐及軟件項目開發實踐經驗。在《軟件工程》的編寫過程中,作者參考了若干國內外相關教材,并結合各自多年的教學體會,做了多次研討。議題始終圍繞著《軟件工程》如何解決好:材料的組織符合于人的認識規律;基本概念與基本方法的結合;經典方法與流行方法兼顧;以及如何體現技術性內容為主,同時提供必要的項目管理知識等原則。
·《軟件工程》較全面地論述了軟件工程的概念、原理和方法。在講解理論的過程中盡量結合實例,避免抽象和枯煤的論述。
·在兼顧傳統的結構化方法的同時,注重當前廣為采用的面向對象方法。緊密結合當前技術的新發展,在闡述理論知識的同時側重實用性。
·既充分重視技術性內容,使其作為初學者必須掌握的知識和技能,同時也兼顧軟件工程實踐中必不可少的基本管理知識。
軟件工程領域的經典教材
掌握軟件開發的必經之路
軟件專業人員的良師益友
投身軟件事業的立足根基
軟件工程是計算機科學的重要分支,又是最為年輕的_T程學科。然而,它卻隨著信息化社會的到來和計算機在人們生產和生活各個領域的廣泛應用越來越顯示出重要的作用。
許多高等學校計算機專業的畢業生工作多年以后,回顧他們在校所學的專業課時,往往提到軟件工程課程是工作中最為實用的課程之一。事實上,在校學生學好這門課也將使他們在今后的職業生涯中受益。出于這一認識,本書作者深深地理解組織編寫好這一教材的重大責任。為此在編寫過程中開展了多次討論和交流,并且吸取了以前的教學經驗和讀者對過去軟件工程教材的反饋意見。
本書編寫時作者力圖遵循的原則如下。
(1)既要強調和突出基本概念、基本方法,又要盡可能使材料內容的組織符合學生的認識規律,由淺入深,由具體到一般。
(2)既要認真對待傳統的經典開發方法(如結構化方法),又要兼顧當前流行和廣為采用的開發方法(如面向對象方法)。
(3)既要充分重視技術性內容,使其作為初學者必須掌握的知識,并且占有足夠的分量,同時也要兼顧軟件工程實踐中必不可少的管理知識(如本書的后三章),而其篇幅又不可過多。
參與本書編寫的作者除本人外,還有華北電力大學的馬素霞教授和北京大學的麻志毅教授。他們在軟件工程的教學和軟件開發的實踐方面均有豐富的經驗。
作者十分歡迎來自各方面的意見和建議,也希望吸收這些意見和建議后,在再版修訂時采納。
鄭人杰,清華大學教授。清華大學畢業后留校任計算數學專業、軟件專業教師及清華大學軟件中心副主任、清華同方公司 .副總工程師及顧問。現任中國軟件行業協會理事、軟件過程改進分會常務副會長。2009年榮獲“推動中國軟件產業發展杰出人物”獎。多年來在軟件工程、軟件質量及測試、軟件過程改進方面從事教學、研究和開發工作,編寫《實用軟件工程》、《計算機軟件測試技術》、《基于軟件能力成熟度模型的軟件過程改進》等書。
第1部分 軟件工程基礎
第1章 軟件及軟件工程介紹 1
1.1 軟件與軟件危機 1
1.1.1 軟件的作用 1
1.1.2 軟件的概念及特性 2
1.1.3 軟件危機 3
1.2 軟件工程及其基本原理 4
1.2.1 軟件工程的概念 4
1.2.2 軟件工程的目標 4
1.2.3 軟件工程的基本原理 5
1.3 軟件生命周期 6
1.4 軟件工程方法學 8
1.4.1 結構化方法學 8
1.4.2 面向對象方法 9
1.5 軟件工程知識體系及知識域介紹 9
1.6 軟件產業的形成與發展 12
1.6.1 我國軟件產業的形成 12
1.6.2 全球軟件產業的發展 13
1.6.3 軟件產業的發展模式 13
1.6.4 軟件工程在軟件產業中的作用 15
小結 15
習題 16
第2章 軟件需求獲取與確認 17
2.1 軟件需求獲取的任務 17
2.2 軟件需求的獲取與確認過程 18
2.3 快速原型化方法 19
2.4 基于用況的方法 20
2.4.1 系統邊界 20
2.4.2 參與者 21
2.4.3 用況 22
2.4.4 用況圖 27
2.5 需求管理 28
小結 29
習題 29
第2部分 結構化軟件開發方法
第3章 結構化分析建模 31
3.1 軟件需求分析階段的任務 31
3.2 結構化分析方法簡介 33
3.3 功能建模 33
3.3.1 數據流圖的基本圖形符號 33
3.3.2 環境圖 34
3.3.3 數據流圖的分層 35
3.3.4 實例研究 36
3.4 數據建模 38
3.4.1 數據對象 38
3.4.2 屬性 39
3.4.3 關系 39
3.5 行為建模 41
3.5.1 狀態 41
3.5.2 狀態轉換 41
3.5.3 事件 42
3.6 數據字典 43
3.6.1 詞條描述 43
3.6.2 數據結構描述 44
3.7 加工規格說明 46
3.7.1 決策表 47
3.7.2 決策樹 48
3.8 需求規格說明 49
3.8.1 軟件需求規格說明 49
3.8.2 數據需求說明 50
小結 51
習題 51
第4章 總體設計 53
4.1 軟件設計的概念及目標 53
4.1.1 軟件設計的概念 53
4.1.2 軟件設計的目標 53
4.2 軟件設計的任務 56
4.2.1 軟件設計的階段與任務 56
4.2.2 結構化設計與結構化分析的關系 57
4.3 模塊結構與數據結構 57
4.3.1 模塊結構及表示 58
4.3.2 數據結構及表示 61
4.4 創建良好設計的原則 62
4.4.1 分而治之和模塊化 62
4.4.2 模塊獨立性 63
4.4.3 提高抽象層次 68
4.4.4 復用性設計 69
4.4.5 靈活性設計 69
4.4.6 預防過期 69
4.4.7 可移植性設計 70
4.4.8 可測試性設計 70
4.4.9 防御性設計 71
4.5 面向數據流的設計方法 71
4.5.1 設計過程 71
4.5.2 典型的數據流類型和系統結構 72
4.5.3 變換型映射方法 74
4.5.4 事務型映射方法 76
4.5.5 軟件模塊結構的改進方法 79
4.5.6 實例研究 82
4.6 接口設計 86
4.6.1 接口設計概述 86
4.6.2 人機交互界面 87
4.7 數據設計 89
4.7.1 文件設計 89
4.7.2 數據庫設計 90
4.8 軟件設計規格說明 90
小結 91
習題 92
第5章 詳細設計與編碼 93
5.1 結構化程序設計 93
5.1.1 結構化程序設計的概念與原則 93
5.1.2 自頂向下、逐步細化的設計 過程 94
5.2 過程設計的工具 96
5.2.1 程序流程圖 96
5.2.2 N-S圖 99
5.2.3 PAD圖 100
5.2.4 偽代碼 101
5.3 程序設計語言 103
5.3.1 程序設計語言的性能 103
5.3.2 程序設計語言的分類 104
5.3.3 程序設計語言的選擇 106
5.4 程序設計風格 107
5.4.1 源程序文檔化 107
5.4.2 數據說明標準化 109
5.4.3 語句結構簡單化 109
5.4.4 輸入/輸出規范化 112
5.5 程序復雜程度度量 113
5.5.1 McCabe方法 113
5.5.2 Halstead方法 115
小結 116
習題 116
第6章 軟件測試 118
6.1 軟件測試的基本概念 118
6.1.1 什么是軟件測試 118
6.1.2 軟件測試的目的和原則 119
6.1.3 軟件測試的對象 120
6.1.4 測試信息流 121
6.1.5 測試與軟件開發各階段的關系 122
6.1.6 白盒測試與黑盒測試 122
6.2 白盒測試的測試用例設計 124
6.2.1 邏輯覆蓋 124
6.2.2 語句覆蓋 125
6.2.3 判定覆蓋 125
6.2.4 條件覆蓋 125
6.2.5 判定-條件覆蓋 126
6.2.6 條件組合覆蓋 126
6.2.7 路徑測試 127
6.3 基本路徑測試 128
6.4 黑盒測試的測試用例設計 131
6.4.1 等價類劃分 131
6.4.2 邊界值分析 134
6.5 軟件測試的策略 136
6.5.1 單元測試 137
6.5.2 組裝測試 139
6.5.3 確認測試 142
6.5.4 系統測試 144
6.5.5 測試的類型 144
6.6 人工測試 147
6.6.1 靜態分析 147
6.6.2 人工測試的幾種形式 148
6.7 調試 149
小結 150
習題 150
第3部分 面向對象軟件開發方法
第7章 面向對象方法概述 153
7.1 面向對象的基本思想 153
7.2 面向對象的主要概念及基本原則 154
7.2.1 面向對象的主要概念 154
7.2.2 面向對象的基本原則 156
7.3 面向對象方法的發展史及現狀簡介 157
7.4 關于統一建模語言 158
小結 160
習題 160
第8章 面向對象分析 161
8.1 什么是面向對象分析 161
8.2 建立基本模型——類圖 164
8.2.1 對象與類 164
8.2.2 定義屬性與操作 168
8.2.3 建立關系 173
8.3 建立行為模型 187
8.3.1 順序圖 187
8.3.2 活動圖 191
8.3.3 狀態機圖 195
8.4 建立組織模型——包圖 202
8.4.1 概念與表示法 202
8.4.2 如何劃分與組織包 204
小結 205
習題 205
第9章 面向對象設計與測試 207
9.1 什么是面向對象設計 207
9.2 問題域部分的設計 208
9.2.1 為復用類而增加結構 208
9.2.2 提高性能 209
9.2.3 增加一般類以建立共同協議 210
9.2.4 按編程語言調整繼承 211
9.2.5 對復雜關聯的轉化并決定關聯的實現方式 213
9.2.6 調整與完善屬性 214
9.2.7 構造及優化算法 215
9.2.8 決定對象間的可訪問性 215
9.2.9 定義對象 216
9.3 人機交互部分的設計 216
9.3.1 什么是人機交互部分 216
9.3.2 如何分析人機交互部分 217
9.3.3 如何設計人機交互部分 218
9.4 控制驅動部分的設計 222
9.4.1 什么是控制驅動部分 223
9.4.2 控制流 223
9.4.3 如何設計控制驅動部分 223
9.5 數據管理部分的設計 227
9.5.1 什么是數據管理部分 228
9.5.2 數據庫和數據庫管理系統 228
9.5.3 如何設計數據管理部分 229
9.6 面向對象測試的概念 235
9.6.1 面向對象軟件測試的問題 235
9.6.2 面向對象軟件測試的參考過程模型 236
9.7 面向對象測試方法 237
9.7.1 面向對象的分析與設計測試 237
9.7.2 面向對象的程序測試 237
9.7.3 面向對象的系統測試 239
小結 239
習題 239
第4部分 軟件生存期模型與軟件體系結構
第10章 軟件生存期模型 241
10.1 軟件過程框架 241
10.1.1 軟件過程框架的內容 241
10.1.2 通用過程框架 241
10.1.3 典型的普適性活動 243
10.2 傳統軟件過程模型 243
10.2.1 瀑布模型 243
10.2.2 快速原型模型 245
10.2.3 增量模型 245
10.2.4 螺旋模型 247
10.2.5 噴泉模型 248
10.3 現代軟件過程模型 249
10.3.1 基于構件的開發模型 249
10.3.2 形式化方法模型 250
10.3.3 面向方面的軟件開發 251
10.3.4 統一過程 251
10.3.5 敏捷過程模型 253
小結 255
習題 256
第11章 軟件體系結構 257
11.1 軟件體系結構的基本概念 257
11.1.1 什么是體系結構 257
11.1.2 體系結構模式、風格和框架的概念 258
11.1.3 體系結構的重要作用 259
11.2 典型的體系結構風格 259
11.2.1 數據流風格 259
11.2.2 調用-返回風格 260
11.2.3 倉庫風格 262
11.3 特定領域的軟件體系結構 264
11.3.1 類屬模型 264
11.3.2 參考模型 265
11.4 分布式系統結構 266
11.4.1 多處理器體系結構 266
11.4.2 客戶機/服務器體系結構 267
11.4.3 分布式對象體系結構 271
11.4.4 代理 272
11.5 體系結構框架 272
11.5.1 模型-視圖-控制器 272
11.5.2 J2EE體系結構框架 273
11.5.3 PCMEF與PCBMER框架 274
11.6 體系結構建模 276
11.6.1 類及其依賴性 277
11.6.2 接口及其依賴性 279
11.6.3 包及其依賴性 281
11.6.4 構件及其依賴性 282
11.6.5 結點與部署圖 284
小結 285
習題 285
第5部分 軟件維護與軟件管理
第12章 軟件維護 287
12.1 軟件維護的概念 287
12.1.1 軟件維護的定義 287
12.1.2 影響維護工作量的因素 288
12.1.3 軟件維護的策略 288
12.2 軟件維護活動 289
12.2.1 軟件維護申請報告 289
12.2.2 軟件維護工作流程 290
12.2.3 維護檔案記錄 291
12.2.4 維護評價 291
12.3 程序修改的步驟及修改的副作用 291
12.3.1 分析和理解程序 291
12.3.2 修改程序 292
12.3.3 修改程序的副作用及其控制 293
12.3.4 重新驗證程序 294
12.4 軟件的可維護性 295
12.4.1 軟件可維護性的定義 295
12.4.2 可維護性的度量 296
12.5 提高可維護性的方法 298
12.5.1 建立明確的軟件質量目標和優先級 298
12.5.2 使用提高軟件質量的技術和工具 298
12.5.3 質量保證審查 298
12.5.4 改進文檔 300
小結 301
習題 301
第13章 軟件項目管理 302
13.1 軟件項目管理概述 302
13.1.1 軟件項目管理的目標 302
13.1.2 軟件項目管理涉及的幾個方面 302
13.2 項目估算 304
13.2.1 項目策劃與項目估算 304
13.2.2 軟件規模估算的功能點方法 305
13.2.3 軟件開發成本估算 310
13.3 風險管理 316
13.3.1 什么是軟件風險 316
13.3.2 風險管理的任務 318
13.3.3 風險評估 319
13.3.4 風險控制 322
13.3.5 做好風險管理的建議 325
13.4 進度管理 325
13.4.1 進度控制問題 325
13.4.2 甘特圖 328
13.4.3 時標網狀圖 329
13.4.4 PERT圖 329
13.5 需求管理 331
13.5.1 系統需求與軟件需求 331
13.5.2 需求工程 333
13.5.3 需求變更 335
13.5.4 需求變更控制 337
13.5.5 可追溯性管理 340
13.6 配置管理 341
13.6.1 什么是軟件配置管理 342
13.6.2 軟件配置標識 342
13.6.3 變更管理 344
13.6.4 版本控制 348
13.6.5 系統建立 349
13.6.6 配置審核 350
13.6.7 配置狀態報告 351
小結 351
習題 352
第14章 軟件工程標準及軟件文檔 353
14.1 標準的概念 353
14.2 軟件標準化的意義 354
14.3 標準的分類與分級 355
14.4 軟件工程標準的制定與實施 358
14.5 軟件組織內的標準化工作 359
14.6 軟件文檔的作用和分類 360
14.7 軟件基本文檔的內容要求 362
14.8 對文檔編制的質量要求 366
14.9 文檔的管理和維護 368
小結 369
習題 369
第15章 軟件過程與軟件過程改進 371
15.1 軟件過程概述 371
15.2 軟件生存期過程國際標準 373
15.3 軟件過程成熟度 377
15.3.1 什么是軟件過程成熟度 377
15.3.2 過程制度化 379
15.4 軟件能力成熟度模型(CMM/CMMI) 381
15.4.1 CMM與SEI 381
15.4.2 CMM的演化 382
15.4.3 CMM族和CMMI 382
15.4.4 CMMI 1.2簡介 383
15.4.5 CMMI評估 391
15.5 軟件過程改進 392
15.5.1 軟件過程改進的IDEAL模型 392
15.5.2 軟件過程改進框架 393
15.5.3 有效的軟件過程 394
小結 395
習題 396
參考文獻 397
計算機技術經過了50年的發展歷程,取得了突飛猛進的發展。計算機的應用領域已從單純的科學計算發展到軍事、經濟、教育、文化等社會生產及生活的各個方面,推動了其他行業及領域的發展,改變了人們學習、工作及生活方式。進入21世紀,人類已從工業社會跨人了信息社會。
計算機軟件系統是信息化的重要組成部分。計算機軟件已形成了獨立的產業,成為國民經濟新的增長點和重要支柱。軟件工程在軟件開發中起著重要的作用,對軟件產業的形成及發展起著決定性的推動作用。本章對軟件、軟件產業及軟件工程相關的概念,軟件開發的過程及方法進行簡要介紹。
1.1 軟件與軟件危機
1.1.1軟件的作用
20世紀80年代初我國大學生中知道軟件的人并不多,甚至很多人從未聽說過這個詞,即使是當初軟件專業畢業的學生也不曾想到軟件的發展速度如此之快。今天的軟件已無處不在,滲透到了各個行業之中。隨著計算機大量進入家庭,計算機已經成為我們日常生活、學習和工作都離不開的工具,同時也改變了人們的學習方式、交流方式、思維方式及商業模式。
計算機軟件已經成為世界舞臺上最為重要的科技領域,商業、科學和工程都離不開軟件技術。現在的軟件技術具有產品和產品生產載體的雙重作用。作為產品,軟件顯示了由計算機硬件體現的計算能力,扮演著信息轉換的角色:產生、管理、查詢、修改、顯示或者傳遞各種不同的信息。而作為產品生產的載體,軟件提供了計算機控制(操作系統)、信息通信(網絡),以及應用程序開發和控制的基礎平臺(軟件工具和環境)。
計算機軟件的地位在50多年的時間中發生了巨大變化。硬件性能的極大提高、計算機結構的巨大變化、內存和存儲容量的擴大,還有種類繁多的輸入和輸出方法都使得計算機系統的結構變得更加復雜,功能更加強大。計算機硬件的發展會受到物理極限的制約,而計算機軟件的復雜程度卻沒有極限,復雜的結構和功能可以產生驚人的效果,具有無限的潛力。鄭人杰,清華大學教授。清華大學畢業后留校任計算數學專業、軟件專業教師及清華大學軟件中心副主任、清華同方公司 .副總工程師及顧問。現任中國軟件行業協會理事、軟件過程改進分會常務副會長。2009年榮獲“推動中國軟件產業發展杰出人物”獎。多年來在軟件工程、軟件質量及測試、軟件過程改進方面從事教學、研究和開發工作,編寫《實用軟件工程》、《計算機軟件測試技術》、《基于軟件能力成熟度模型的軟件過程改進》等書。