本書分別從傳統(tǒng)的結(jié)構(gòu)化軟件開發(fā)方法學(xué)和面向?qū)ο筌浖_發(fā)方法學(xué)兩個方面介紹軟件工程的理論和方法,并將其融入實踐,通過豐富的案例介紹軟件分析與設(shè)計方法及其模型,深入講解軟件開發(fā)各個階段的技術(shù)、方法和管理過程,主要內(nèi)容包括:軟件工程基礎(chǔ),結(jié)構(gòu)化分析、設(shè)計與測試,面向?qū)ο蠓治、設(shè)計與測試,軟件維護與項目管理。
前 言
軟件工程包含一系列軟件開發(fā)的基本原理、方法和實踐經(jīng)驗,用來指導(dǎo)人們進行正確的軟件開發(fā)。軟件工程強調(diào)從工程化的原理出發(fā),按照標(biāo)準(zhǔn)化規(guī)程和軟件開發(fā)實踐來引導(dǎo)軟件開發(fā)人員進行軟件開發(fā)和實踐活動,并進行過程改進,促進軟件企業(yè)向標(biāo)準(zhǔn)化和成熟化的方向發(fā)展。軟件工程是一門理論與實踐相結(jié)合的學(xué)科,更注重通過實踐來理解原理和方法。為此,我們結(jié)合多年的軟件工程教學(xué)和項目開發(fā)經(jīng)驗,通過5個項目實例,從不同的角度、利用不同的方法學(xué)來循序漸進地介紹軟件開發(fā)過程中所涉及的原理、方法和技術(shù)。本書的另一個特色是從問題的角度引導(dǎo)學(xué)生根據(jù)自己的體會來討論軟件開發(fā)過程中的問題,進而理解軟件工程的概念和原理,總結(jié)出一些有效的方法和實踐經(jīng)驗。
編寫思想本書強調(diào)以問題為引導(dǎo)的軟件工程所涉及的概念和方法,進而討論具體的過程及其優(yōu)缺點,并結(jié)合具體案例進行解析,讓學(xué)生對問題產(chǎn)生的原因和新方法的提出有更深入的理解,還支持學(xué)生進行深入閱讀。
我們將傳統(tǒng)的結(jié)構(gòu)化方法學(xué)和面向?qū)ο蠓椒▽W(xué)分開介紹,這有利于學(xué)生理解二者的本質(zhì)區(qū)別,厘清其分析與設(shè)計模型的不同特點,從而針對不同的項目來選擇不同的開發(fā)方法學(xué)和過程。從結(jié)構(gòu)化到面向?qū)ο蟮穆肪也便于學(xué)生逐步接受軟件開發(fā)的思想和本質(zhì)。
結(jié)構(gòu)化方法學(xué)。重點討論開發(fā)過程、原理和方法,這些都可以推廣到面向?qū)ο蟮拈_發(fā)范型中。最后通過胰島素輸送這一高要求系統(tǒng)案例介紹如何將這些方法應(yīng)用到實踐中。
面向?qū)ο蠓椒▽W(xué)。重點討論面向?qū)ο蠓治瞿P秃驮O(shè)計模型的構(gòu)建,強調(diào)它們之間的關(guān)系,抓住面向?qū)ο竽P烷_發(fā)的要點,通過UML建模語言來描述分析和設(shè)計模型,進一步加深學(xué)生對面向?qū)ο竽P捅举|(zhì)的理解,同時也清楚其適用的情況。最后通過POS機這一復(fù)雜系統(tǒng)案例幫助學(xué)生掌握面向?qū)ο蠓治雠c設(shè)計的主要思想。
本書還注重本科生研究性教學(xué)實踐,針對現(xiàn)代軟件開發(fā)方法—敏捷方法,重點介紹結(jié)對編程,在幫助學(xué)生理解結(jié)對編程思想的同時,分析其中存在的問題和解決方法,結(jié)合系統(tǒng)需求進行設(shè)計、實現(xiàn)與測試。通過這一過程可達(dá)到研究性教學(xué)的目的,也可將結(jié)對編程作為學(xué)期項目。
組織結(jié)構(gòu)本書分為四個部分,共14章內(nèi)容。第一部分“軟件工程基礎(chǔ)”(第1~4章)主要從軟件危機引出軟件工程的基本概念和基本原理,介紹軟件開發(fā)的工程化思想和開發(fā)過程等。第二部分“結(jié)構(gòu)化分析、設(shè)計與測試”(第5~9章)針對傳統(tǒng)結(jié)構(gòu)化的軟件開發(fā)方法學(xué),主要介紹其基本概念、分析與設(shè)計過程、分析與設(shè)計模型、軟件測試原理和技術(shù)、高要求系統(tǒng)的分析與設(shè)計方法等。第三部分“面向?qū)ο蠓治、設(shè)計與測試”(第10~12章)將介紹面向?qū)ο蠓椒▽W(xué)的基本概念、用例分析模型及其設(shè)計過程、面向?qū)ο蠓治雠c設(shè)計模型、面向?qū)ο蟮膶崿F(xiàn)以及測試技術(shù)。第四部分“軟件維護與項目管理”(第13、14章)主要介紹軟件維護策略與方法、軟件項目管理概念與原理、軟件成本估算以及項目計劃與管理。
案例由于本書分別介紹了傳統(tǒng)的結(jié)構(gòu)化方法學(xué)和面向?qū)ο蠓椒▽W(xué)兩大體系,因此專門選擇了適合不同方法學(xué)的具有代表性的案例進行研究,以便讀者能夠深入理解其各自的優(yōu)勢。這些案例中既有簡單常見的應(yīng)用系統(tǒng),如面對面結(jié)對編程系統(tǒng)和ATM系統(tǒng);也有比較實用的系統(tǒng),如POS機系統(tǒng);還有一些稍微復(fù)雜的系統(tǒng),如分布式結(jié)對編程系統(tǒng)和胰島素輸送系統(tǒng)。這些系統(tǒng)由簡單到復(fù)雜,循序漸進,引導(dǎo)學(xué)生逐步理解系統(tǒng)的開發(fā)過程和關(guān)鍵問題。
面對面結(jié)對編程系統(tǒng)是一個輔助學(xué)生進行結(jié)對編程和學(xué)習(xí)的系統(tǒng),該系統(tǒng)支持角色交換、信息統(tǒng)計和相容性分析等功能,克服了編程過程中的一些不便,如交換位置、相互干擾等。同時,該系統(tǒng)采用一臺主機支持結(jié)對,還具有節(jié)約實驗室建設(shè)費用等優(yōu)點。
POS機系統(tǒng)是電子收款機系統(tǒng)的簡稱,通過計算機來處理銷售和支付信息。該系統(tǒng)包括計算機終端、條碼掃描儀、現(xiàn)金抽屜、票據(jù)打印機等硬件以及支持系統(tǒng)運轉(zhuǎn)的軟件,能夠為不同服務(wù)的應(yīng)用程序提供接口。收銀員通過條碼掃描儀讀取的或鍵盤輸入的商品條碼號來記錄商品信息,系統(tǒng)自動計算銷售總價。收銀員通過系統(tǒng)能夠處理支付,包括現(xiàn)金支付、信用卡支付和支票支付。經(jīng)理通過系統(tǒng)能夠處理顧客退貨。
ATM系統(tǒng)即自動柜員機系統(tǒng),能夠自動處理銀行儲戶的各種業(yè)務(wù),如取款、存款、轉(zhuǎn)賬、查詢、修改密碼等。ATM軟件系統(tǒng)使客戶能夠直接訪問銀行計算機完成交易,無需銀行工作人員的介入。
分布式結(jié)對編程系統(tǒng)支持跨地域的結(jié)對編程或?qū)W習(xí)。為了支持異地結(jié)對者像在本地一樣方便地工作,系統(tǒng)通過文本、音頻和視頻進行交流。系統(tǒng)與集成開發(fā)環(huán)境進行集成,包括VC++、Eclipse等開發(fā)環(huán)境。系統(tǒng)支持角色交換,但通常不嚴(yán)格遵循“驅(qū)動者”和“領(lǐng)航者”的角色,所以分布結(jié)對編程的工具應(yīng)該允許合作者很容易地訪問控制鍵盤。
胰島素輸送系統(tǒng)是關(guān)于人體胰腺操作(一種體內(nèi)組織)的仿真,其目標(biāo)是幫助那些糖尿病患者控制血糖水平。該系統(tǒng)用于監(jiān)控血糖濃度,根據(jù)需要輸送正確劑量的胰島素,對安全性的要求非常高。
意見與反饋本書第1~4章由竇萬峰編寫,第5~9章由竇萬峰和林燕平編寫,第10~13章由竇萬峰和李亞楠編寫,第14章由竇萬峰和潘媛媛編寫。全書由竇萬峰統(tǒng)稿、校對。
由于作者水平有限,因此難免有疏漏之處,懇請各位讀者指正,意見可發(fā)至郵箱douwf-fly@163.com。尤其是關(guān)于書中所選案例的詳細(xì)程度和多樣性,請讀者多提意見,以便以后進行改進和完善。
作者2016年9月
前言
第一部分 軟件工程基礎(chǔ)
第1章 軟件工程概述2
1.1 引言2
1.2 什么是軟件2
1.2.1 軟件的定義與特性2
1.2.2 軟件技術(shù)的演化3
1.3 什么是軟件工程4
1.3.1 軟件危機4
1.3.2 解決軟件危機的途徑5
1.3.3 軟件工程的定義5
1.4 軟件工程的基本原理與基本原則7
1.4.1 基本原理7
1.4.2 基本原則8
1.5 軟件工程開發(fā)方法學(xué)8
1.5.1 結(jié)構(gòu)化開發(fā)方法學(xué)9
1.5.2 面向?qū)ο箝_發(fā)方法學(xué)9
1.5.3 重型軟件工程與輕型軟件工程10
1.6 小結(jié)10
習(xí)題11
第2章 軟件過程12
2.1 引言12
2.2 什么是軟件過程12
2.2.1 軟件過程的定義12
2.2.2 軟件過程框架13
2.3 軟件產(chǎn)品與過程15
2.4 軟件生存周期17
2.5 軟件工程活動18
2.6 小結(jié)20
習(xí)題21
第3章 軟件過程模型22
3.1 引言22
3.2 什么是軟件過程模型22
3.3 傳統(tǒng)的軟件過程模型22
3.3.1 瀑布模型22
3.3.2 增量模型24
3.3.3 螺旋模型25
3.4 面向?qū)ο竽P?6
3.4.1 構(gòu)件集成模型26
3.4.2 統(tǒng)一過程模型27
3.5 小結(jié)29
習(xí)題29
第4章 敏捷軟件開發(fā)方法30
4.1 引言30
4.2 敏捷軟件開發(fā)過程30
4.2.1 敏捷過程30
4.2.2 敏捷開發(fā)原則31
4.3 Scrum開發(fā)過程31
4.3.1 Scrum的特點31
4.3.2 Scrum模型與過程32
4.4 極限編程 33
4.4.1 什么是極限編程33
4.4.2 極限編程的要素34
4.5 結(jié)對編程35
4.5.1 什么是結(jié)對編程36
4.5.2 結(jié)對編程的優(yōu)勢分析37
4.5.3 結(jié)對編程的分類39
4.5.4 結(jié)對編程的方式39
4.6 小結(jié)41
習(xí)題41
第二部分 結(jié)構(gòu)化分析、設(shè)計與測試
第5章 軟件需求分析44
5.1 引言44
5.2 什么是軟件需求44
5.3 需求分析過程45
5.4 會談技術(shù)49
5.4.1 非正式會談49
5.4.2 正式會談49
5.5 調(diào)查技術(shù)50
5.5.1 確定調(diào)查內(nèi)容50
5.5.2 可靠可信分析51
5.6 場景分析技術(shù)51
5.7 小結(jié)52
習(xí)題52
第6章 結(jié)構(gòu)化分析53
6.1 引言53
6.2 結(jié)構(gòu)化分析模型53
6.3 面向數(shù)據(jù)流的建模方法54
6.3.1 數(shù)據(jù)流建模方法54
6.3.2 實例分析57
6.4 面向數(shù)據(jù)的建模方法58
6.4.1 數(shù)據(jù)建模方法58
6.4.2 實例分析59
6.5 面向狀態(tài)的建模方法60
6.5.1 狀態(tài)建模方法60
6.5.2 實例分析61
6.6 規(guī)格說明書編寫示例62
6.7 小結(jié)70
習(xí)題70
第7章 結(jié)構(gòu)化設(shè)計71
7.1 引言71
7.2 軟件設(shè)計過程71
7.3 軟件模塊化設(shè)計75
7.4 軟件結(jié)構(gòu)78
7.5 結(jié)構(gòu)化概要設(shè)計79
7.5.1 數(shù)據(jù)流模型79
7.5.2 數(shù)據(jù)流設(shè)計方法80
7.5.3 實例分析81
7.6 概要設(shè)計文檔編寫示例83
7.7 詳細(xì)設(shè)計90
7.8 結(jié)構(gòu)化詳細(xì)設(shè)計91
7.9 詳細(xì)設(shè)計文檔編寫示例98
7.10 編碼實現(xiàn)101
7.10.1 編碼語言101
7.10.2 編碼風(fēng)格102
7.11 小結(jié)103
習(xí)題103
第8章 結(jié)構(gòu)化軟件測試106
8.1 引言106
8.2 軟件測試的目的和原則106
8.3 軟件測試的基本過程108
8.3.1 單元測試108
8.3.2 集成測試110
8.3.3 確認(rèn)測試110
8.3.4 系統(tǒng)測試111
8.4 測試用例設(shè)計111
8.5 黑盒測試技術(shù)112
8.5.1 等價類劃分112
8.5.2 邊界值分析113
8.5.3 錯誤推測114
8.5.4 因果圖114
8.6 白盒測試技術(shù)117
8.6.1 邏輯覆蓋117
8.6.2 路徑覆蓋120
8.6.3 循環(huán)路徑測試策略122
8.7 集成測試技術(shù)123
8.7.1 集成策略123
8.7.2 性能測試125
8.7.3 實例分析127
8.8 調(diào)試技術(shù)133
8.8.1 調(diào)試過程133
8.8.2 調(diào)試策略134
8.9 軟件測試文檔135
8.9.1 軟件測試計劃文檔135
8.9.2 集成測試文檔137
8.10 小結(jié)139
習(xí)題139
第9章 高要求系統(tǒng)的分析與設(shè)計140
9.1 引言140
9.2 什么是高要求系統(tǒng)140
9.3 高要求系統(tǒng)的需求分析142
9.3.1 風(fēng)險需求描述143
9.3.2 安全性描述146
9.3.3 信息安全描述146
9.3.4 軟件可靠性描述146
9.3.5 胰島素輸送系統(tǒng)完整的需求描述147
9.4 形式化描述方法149
9.4.1 軟件過程中的形式化描述149
9.4.2 接口描述方法150
9.4.3 行為描述153
9.5 高要求系統(tǒng)的設(shè)計155
9.6 高要求系統(tǒng)的開發(fā)156
9.7 系統(tǒng)驗證160
9.7.1 可靠性驗證160
9.7.2 安全性保證161
9.7.3 信息安全評估164
9.8 小結(jié)165
習(xí)題166
第三部分 面向?qū)ο蠓治觥⒃O(shè)計與測試
第10章 面向?qū)ο蠓治?68
10.1 引言168
10.2 面向?qū)ο竽P?68
10.3 UML170
10.3.1 UML的組成170
10.3.2 UML的視圖171
10.4 面向?qū)ο蠓治鲞^程172
10.5 用例驅(qū)動分析173
10.5.1 用例建模分析173
10.5.2 開發(fā)活動圖177
10.5.3 開發(fā)泳道圖178
10.6 領(lǐng)域與業(yè)務(wù)建模179
10.6.1 識別業(yè)務(wù)類和領(lǐng)域類179
10.6.2 業(yè)務(wù)類圖180
10.6.3 識別屬性和操作181
10.6.4 開發(fā)協(xié)作圖182
10.6.5 開發(fā)包圖182
10.6.6 邏輯架構(gòu)183
10.7 系統(tǒng)行為建模185
10.7.1 系統(tǒng)順序圖185
10.7.2 建立操作契約186
10.7.3 建立順序圖187
10.7.4 系統(tǒng)狀態(tài)圖188
10.8 POS機系統(tǒng)案例分析188
10.9 分布式結(jié)對編程系統(tǒng)分析191
10.9.1 項目概述191
10.9.2 功能描述192
10.9.3 邏輯分析與建模200
10.10 小結(jié)204
習(xí)題205
第11章 面向?qū)ο笤O(shè)計206
11.1 引言206
11.2 面向?qū)ο笤O(shè)計模型206
11.3 構(gòu)件設(shè)計207
11.3.1 構(gòu)件設(shè)計的步驟207
11.3.2 構(gòu)件設(shè)計的原則208
11.4 并發(fā)性設(shè)計209
11.5 設(shè)計模式211
11.5.1 基于職責(zé)的設(shè)計211
11.5.2 常見的設(shè)計模式212
11.6 面向?qū)ο笤敿?xì)設(shè)計215
11.6.1 模型精化216
11.6.2 邏輯架構(gòu)精化設(shè)計219
11.6.3 分層設(shè)計221
11.6.4 類操作設(shè)計223
11.7 方法設(shè)計229
11.8 精化設(shè)計234
11.9 數(shù)據(jù)存儲與持久性設(shè)計238
11.10 部署設(shè)計與構(gòu)件圖243
11.11 小結(jié)244
習(xí)題245
第12章 面向?qū)ο髮崿F(xiàn)與測試246
12.1 引言246
12.2 面向?qū)ο髮崿F(xiàn)246
12.3 POS機系統(tǒng)實現(xiàn)247
12.4 分布式結(jié)對編程系統(tǒng)實現(xiàn)253
12.5 面向?qū)ο鬁y試256
12.6 面向?qū)ο鬁y試策略258
12.7 測試驅(qū)動開發(fā)261
12.7.1 什么是測試驅(qū)動開發(fā)261
12.7.2 測試驅(qū)動開發(fā)的步驟264
12.7.3 編寫測試程序266
12.7.4 代碼重構(gòu)270
12.8 小結(jié)271
習(xí)題271
第四部分 軟件維護與項目管理
第13章 軟件維護274
13.1 引言274
13.2 軟件的可維護性275
13.3 軟件維護的類型275
13.4 軟件維護方法277
13.5 提高軟件的可維護性279
13.5.1 結(jié)構(gòu)化維護與非結(jié)構(gòu)化維護279
13.5.2 提高軟件可維護性的技術(shù)途徑280
13.6 小結(jié)281
習(xí)題281
第14章 軟件項目管理283
14.1 引言283
14.2 軟件項目組織285
14.3 軟件過程管理287
14.3.1 軟件過程度量287
14.3.2 軟件過程改進288
14.3.3 軟件項目度量289
14.4 軟件項目風(fēng)險管理289
14.4.1 風(fēng)險識別289
14.4.2 風(fēng)險預(yù)測290
14.4.3 風(fēng)險管理290
14.5 軟件配置管理291
14.5.1 基本概念291
14.5.2 軟件配置管理過程292
14.6 軟件項目估算293
14.6.1 軟件項目資源293
14.6.2 軟件規(guī)模度量294
14.6.3 估算管理296
14.7 分解技術(shù)296
14.7.1 基于問題分解的估算296
14.7.2 基于過程分解的估算298
14.8 經(jīng)驗估算技術(shù)299
14.8.1 專家類比推斷299
14.8.2 中級COCOMO估算模型300
14.9 軟件質(zhì)量管理303
14.9.1 軟件質(zhì)量保證303
14.9.2 軟件質(zhì)量度量305
14.10 項目進度管理308
14.10.1 項目進度管理計劃308
14.10.2 進度安排309
14.10.3 進度跟蹤管理311
14.11 小結(jié)311
習(xí)題312
參考文獻314