§1
軟件工程是一門學(xué)科,目的是生產(chǎn)出沒有錯誤的軟件,按時并且在預(yù)算內(nèi)交付,滿足用戶的需求。
軟件工程范疇非常廣,可以歸入數(shù)學(xué)或計算機科學(xué),其他方面可以落入經(jīng)濟學(xué)、管理學(xué)或心理學(xué)的范疇。
軟件危機指軟件產(chǎn)品的質(zhì)量低得通常不能接受,并且不能滿足交付日期和預(yù)算限制??紤]到軟件危機的周期長且難預(yù)測,可能將軟件危機重新命名為軟件蕭條。
生命周期模型是對在構(gòu)建一個軟件產(chǎn)品時應(yīng)當(dāng)完成的步驟的描述。
將整個生命周期模型劃分為一系列較小的步驟,稱為階段。
對某個具體的軟件產(chǎn)品所做的一系列實際步驟,從概念開發(fā)到最終退役,稱為該產(chǎn)品的生命周期。
瀑布模型(傳統(tǒng)生命周期模型的6個階段):
1.需求階段:提取客戶需求
2.分析(規(guī)格說明)階段:軟件項目管理計劃
3.設(shè)計階段:結(jié)構(gòu)設(shè)計(模塊+詳細(xì)設(shè)計)、兩份設(shè)計文檔
4.實現(xiàn)階段:代碼編寫+單元測試、集成后驗收測試
5.交付后維護:糾錯性和增強性維護
6.退役
傳統(tǒng)軟件開發(fā)方法可以描述為開發(fā)——維護模型
回歸錯誤是指對軟件某處進行修改時,不小心在與該處明顯沒有關(guān)聯(lián)的另一處造成了新錯誤。
面向?qū)ο笤O(shè)計也叫職責(zé)驅(qū)動設(shè)計或按合同設(shè)計。
客戶是想建造某一產(chǎn)品的個體。開發(fā)者是小組的成員,負(fù)責(zé)建造該產(chǎn)品。用戶是客戶委托商品所代表利益的人。
客戶和開發(fā)者可能是同一組織的部分?!獌?nèi)部軟件開發(fā)
客戶和開發(fā)者是完全獨立的組織中的成員?!贤浖?br>
商用現(xiàn)貨軟件:可以賣的軟件、開源軟件
§2
進化樹生命周期模型:顯示了事件的順序。而瀑布模型不可以。
特性的蔓延:連續(xù)地向需求中加入小的甚至是瑣碎的特性。
聯(lián)動引起的退化性差錯。
迭代-遞增生命周期模型,有五個核心工作流:需求工作流、分析工作流、設(shè)計工作流、實現(xiàn)工作流、測試工作流
迭代-遞增模型的特點:
1.為檢查軟件產(chǎn)品是否正確提供多個機會
2.在生命周期的相對早期可以確定其蘊涵結(jié)構(gòu)的健壯性(具有可以連續(xù)擴展以包含下一次遞增的屬性)
3.較早地減輕風(fēng)險
4.總是有該軟件的一個工作版
5.經(jīng)驗數(shù)據(jù)表明它很有用
其他模型:
1.編碼-修補生命周期模型
2.瀑布生命周期模型
3.快速原型開發(fā)生命周期模型
4.開源生命周期模型(糾正性、完善性、適應(yīng)性維護)
5.敏捷過程
6.同步-穩(wěn)定生命周期模型(微軟)
7.螺旋生命周期模型
各種生命周期模型的比較:
| 生命周期模型 | 長處 | 短處 |
|---|---|---|
| 進化樹模型 | 與現(xiàn)實世界軟件開發(fā)最接近的模型,與迭代-遞增模型等價 | |
| 迭代-遞增生命周期模型 | 與現(xiàn)實世界軟件開發(fā)最接近的模型,蘊涵統(tǒng)一過程方法 | |
| 編碼-修補生命周期模型 | 適用于不需要任何維護的小程序 | 總的來說不適合重要的程序 |
| 瀑布生命周期模型 | 紀(jì)律性強制的方法,文檔驅(qū)動 | 交付的產(chǎn)品可能不符合客戶的要求 |
| 快速原型開發(fā)生命周期模型 | 確保交付的產(chǎn)品符合客戶的要求 | 還沒有證明無懈可擊 |
| 開源生命周期模型 | 少量實例中工作得相當(dāng)好 | 實用性有限,通常不太起作用 |
| 敏捷過程 | 客戶的需求模糊時能很好地工作 | 似乎只適合小規(guī)模項目 |
| 同步-穩(wěn)定生命周期模型 | 能滿足未來用戶的要求,確保各組件能夠成功集成 | 除了在Microsoft公司,還沒有廣泛地應(yīng)用 |
| 螺旋生命周期模型 | 風(fēng)險驅(qū)動 | 只能用于大型的內(nèi)部軟件產(chǎn)品,開發(fā)者必須精通風(fēng)險分析和風(fēng)險排除 |
§3
今天最主要的面向?qū)ο蟮姆椒ㄊ墙y(tǒng)一過程,統(tǒng)一建模語言UML。
需求流:讓開發(fā)組織確定客戶的要求。(目標(biāo))
步驟:理解問題域并建造業(yè)務(wù)模型。
業(yè)務(wù)模型是說明目標(biāo)產(chǎn)品代價合理性的文檔。
限制條件:最終期限(主要)、可靠性、成本(重要)
最初對客戶需求的調(diào)研有時稱為概念探究。
分析流(提取類):分析和提取需求,以獲得正確開發(fā)軟件產(chǎn)品和易于維護它所必需的需求。(目標(biāo))
模糊是自然語言固有的特性。規(guī)格說明文檔可能是矛盾的。
軟件項目管理計劃:可交付的東西(客戶將要得到的)、里程碑(時間)以及預(yù)算
設(shè)計流(類的設(shè)計):詳細(xì)設(shè)計,細(xì)化分析流的制品,直至材料處于程序員可實現(xiàn)的形式。(目標(biāo))
實現(xiàn)流:用選擇的實現(xiàn)語言實現(xiàn)目標(biāo)軟件產(chǎn)品。(目標(biāo))
測試流:在統(tǒng)一過程中,測試從始至終與其他工作流并行進行。
測試流的性質(zhì)隨著被測試的制品的不同而不同。對所有制品都至關(guān)重要的是可追蹤性。
單元測試:對組件進行系統(tǒng)測試 -> 集成測試:檢查組件是否正確組合在一起 -> 產(chǎn)品測試:對產(chǎn)品功能進行整體測試 -> 驗收測試:客戶用真實數(shù)據(jù) -> 交付后維護:1.檢查要求的改變已經(jīng)正確實現(xiàn)了 2.確保在對產(chǎn)品要求的改變時,不做其他無意識的改變 =>回歸測試
統(tǒng)一過程的各階段:開始、細(xì)化、構(gòu)建、轉(zhuǎn)換
開始階段目標(biāo)(需求流):決定是否值得開發(fā)目標(biāo)軟件產(chǎn)品,主要目標(biāo)是明確提出的軟件產(chǎn)品是否經(jīng)濟上可行
步驟:1.經(jīng)濟效益、按時交付、風(fēng)險 2.明確風(fēng)險
細(xì)化階段目標(biāo)(分析和設(shè)計流):細(xì)化最初的要求,細(xì)化體系結(jié)構(gòu),監(jiān)控風(fēng)險,細(xì)化它們的屬性,細(xì)化商業(yè)案例以及生成軟件項目管理計劃。
構(gòu)建階段目標(biāo)(實現(xiàn)、測試流):產(chǎn)生軟件產(chǎn)品的第一個可工作版本(β版)。
轉(zhuǎn)換階段目標(biāo)(完成后維護):確??蛻舻男枨笄袑嵉玫綕M足。
能力成熟度模型(CMM)是一組用于改進軟件過程的相關(guān)策略,不考慮生命周期模型。
成熟度是過程本身良好程度的度量。
成熟度級別:
1.初始級:臨時過程
2.可重復(fù)級:基本項目管理(根據(jù)經(jīng)驗對產(chǎn)品進行計劃和管理)
3.定義級:過程定義(管理和技術(shù)有明確定義)
4.管理級:過程測量(有質(zhì)量目標(biāo)和生產(chǎn)目標(biāo))
5.最優(yōu)級:過程控制(統(tǒng)計質(zhì)量和過程控制技術(shù)對軟件組織進行指引)
關(guān)鍵過程區(qū)是一個組織在邁向下一級別時要努力實現(xiàn)的目標(biāo)。
統(tǒng)一過程是迄今為止將大型問題作為一些較小,較獨立的子問題解決的最好辦法。
它提供了遞增和迭代的一個框架,這個機制用于解決大型軟件產(chǎn)品的復(fù)雜性。
§4
布魯克斯法則:向一個已經(jīng)延期的軟件項目增加人員會使項目完成得更晚。
民主小組:基本概念(無我編程)
優(yōu)點:對查找錯誤的積極態(tài)度
傳統(tǒng)的主程序員小組方法:關(guān)鍵特性(專業(yè)化和等級性)
主程序員和備程序員
編程秘書-文檔
不實用性:主/備程序員都很難找到,秘書也是
現(xiàn)代編程小組:主程序員由兩人替代(小組領(lǐng)導(dǎo)、小組經(jīng)理)
小組領(lǐng)導(dǎo):負(fù)責(zé)技術(shù),小組經(jīng)理:負(fù)責(zé)所有非技術(shù)型的管理事務(wù)
適當(dāng)分散決策過程
同步-穩(wěn)定小組(微軟)
敏捷過程小組:結(jié)對編程,具備無我編程的特點
開源編程小組
人員能力成熟度模型,描述管理和開發(fā)一個組織的人力資源的最佳實踐。
各小組組織方法的比較:
| 小組組織 | 優(yōu)點 | 缺點 |
|---|---|---|
| 民主小組 | 由于積極地尋找錯誤,因而代碼質(zhì)量高,特別適用于解決難的問題 | 有經(jīng)驗的人反感新手的評價不能從外部強加 |
| 傳統(tǒng)的主程序員小組 | 《紐約時報》項目的主要成功之處 | 不實用 |
| 修改的主程序員小組 | 有許多成功的案例 | 沒有與《紐約時報》項目可比擬的成功范例 |
| 現(xiàn)代分級編程小組 | 小組經(jīng)理/小組領(lǐng)導(dǎo)結(jié)構(gòu)避免對主程序員需求,可擴展,必要時支持分散決策 | 除非明確小組經(jīng)理和小組領(lǐng)導(dǎo)間的負(fù)責(zé)范圍,否則容易產(chǎn)生問題 |
| 同步-穩(wěn)定小組 | 鼓勵創(chuàng)造性,確保大量開發(fā)者為共同目標(biāo)工作 | 在Microsoft公司之外還沒有該方法應(yīng)用的實例 |
| 敏捷過程小組 | 程序員不測試自己的代碼,如果一個程序員離開不會有損失,經(jīng)驗欠缺的程序員可以向其他人學(xué)習(xí),代碼具有小組所有權(quán) | 還沒有更多的實例證實它的功效 |
| 開源小組 | 少數(shù)項目非常成功 | 應(yīng)用面窄,需由出色的有號召力的人領(lǐng)導(dǎo),需頂尖高手參與 |
§5
分析工具:
1.逐步求精法:盡可能將細(xì)節(jié)的定義推延到最后(迭代+遞增),以便集中精力在重要的事項上。
米勒法則:一次一個人最多只能集中精力于7樁事情。
2.成本-效益分析法:對比估計的未來收益和預(yù)測的未來成本。
3.分治:最古老的分析工具。
4.關(guān)注分離
5.軟件質(zhì)量:
產(chǎn)品度量:測量產(chǎn)品本身的某個特性。
過程度量:開發(fā)者使用這些度量推斷軟件開發(fā)過程的信息。
軟件工具(CASE):在開發(fā)過程的較早工作流(需求、分析、設(shè)計)幫助開發(fā)者的CASE工具稱為高端CASE或前端工具,幫助實現(xiàn)流和交付后維護的CASE工具稱為低端CASE或后端工具。
數(shù)據(jù)字典:在產(chǎn)品中定義的所有數(shù)據(jù)的計算機化列表。
另一個用處是為報表生成器和屏幕生成器提供數(shù)據(jù)。報表生成器產(chǎn)生生成報表所需的代碼。屏幕生成器幫助軟件開發(fā)者產(chǎn)生用于數(shù)據(jù)捕獲屏幕的代碼。
編程工具:指諸如文本編輯器這樣的CASE工具。
小編程:單模塊,大編程:模塊級進行的,多編程:由小組進行的軟件開發(fā)
多編程結(jié)合了小編程和大編程兩方面
結(jié)構(gòu)編輯器:可以隨時檢測程序員鍵入的語法錯誤,需要支持在線接口檢查。
軟件版本:修訂版、變種版
構(gòu)建大型產(chǎn)品時,版本控制,配置控制,建造工具是最基本的。
CASE技術(shù)——提高生產(chǎn)力
§10
我們?nèi)祟愄幚硇畔⒘康南拗频囊粋€辦法是使用逐步求精方法。
迭代和遞增都是軟件工程的固有特性。
核心工作流:需求、分析、設(shè)計、實現(xiàn)、測試
主要的面向?qū)ο蠓椒ㄊ墙y(tǒng)一過程,統(tǒng)一過程是使用圖形化語言——統(tǒng)一建模語言UML來表示要開發(fā)的軟件。
模型是一套圖表,表示軟件產(chǎn)品的一個或多個方面。
需求工作流的目標(biāo)是明確客戶需要什么。
分析工作流的目標(biāo)是分析和提煉需求。
實現(xiàn)工作流的目標(biāo)是用選擇的實現(xiàn)語言實現(xiàn)目標(biāo)軟件產(chǎn)品。
測試工作流從始至終與其他工作流并行進行。
成本-效益分析法是對比估計的未來收益和預(yù)測的未來成本。
度量(5種主要的基本度量)(1)規(guī)模 (2)成本 (3)持續(xù)時間 (4)工作量 (5)質(zhì)量
CASE代表計算機輔助軟件工程。最簡形式是軟件工具,例如畫UML圖的工具。
數(shù)據(jù)字典、報表生成器和屏幕生成器
每個制品的特定版本集是這個產(chǎn)品版本的配置。
基線是產(chǎn)品中所有制品的配置。
重用指使用一個產(chǎn)品中的組件來簡化另一個功能不同的產(chǎn)品的開發(fā)。#
§11
需求流的整體目標(biāo)是讓開發(fā)組織確定客戶的需要。
應(yīng)用域是目標(biāo)產(chǎn)品應(yīng)用的特定環(huán)境。
發(fā)現(xiàn)客戶需求的過程稱為需求啟發(fā)(或需求捕獲)。
推敲和補充的過程稱為需求分析。
術(shù)語表:在該領(lǐng)域應(yīng)用的技術(shù)詞匯列表和對應(yīng)的解釋。
業(yè)務(wù)模型是對公司的商業(yè)過程進行的描述。
訪談:程式化的訪談和非程式化的訪談
模型是代表要開發(fā)的軟件產(chǎn)品的一個或多個方面的UML圖。
用例為軟件產(chǎn)品本身和軟件產(chǎn)品的使用者之間的交互建立模型。
系統(tǒng)的使用者可以扮演不止一個角色。參與者不一定是人。
面向?qū)ο蠓缎褪堑9δ苄孕枨笾付繕?biāo)產(chǎn)品必須能夠執(zhí)行的行為。
非功能性需求指定目標(biāo)產(chǎn)品本身的屬性:例如平臺限制、響應(yīng)時間、可靠性
快速原型是倉促建立的軟件,展示目標(biāo)軟件產(chǎn)品的主要功能。
用戶友好一詞指人類與軟件產(chǎn)品溝通的容易性。
窗口、圖標(biāo)和下拉式菜單是圖形用戶界面的要素。
§12
規(guī)格說明文檔是客戶和開發(fā)者之間的一種合同。
結(jié)構(gòu)化系統(tǒng)分析(半形式化技術(shù))共有9個步驟。
步驟1,畫DFD:確定邏輯數(shù)據(jù)流。
步驟2,決定哪部分計算機化以及如何計算機化(批處理或聯(lián)機)
對于處理量大和要求嚴(yán)格控制的情況,經(jīng)常選擇批處理;對于小容量計算機,用聯(lián)機處理。
步驟3,確定數(shù)據(jù)流的細(xì)節(jié):數(shù)據(jù)字典
步驟4,定義處理的邏輯
步驟5,定義數(shù)據(jù)存儲:數(shù)據(jù)實時訪問圖
步驟6,定義物理資源
步驟7,確定輸入-輸出規(guī)格說明
步驟8,確定大小
步驟9,確定硬件要求
有窮狀態(tài)機,在需求分析時做,是形式化技術(shù)。
一個有窮狀態(tài)機包括:狀態(tài)集J 輸入集K 轉(zhuǎn)換函數(shù)T 初始狀態(tài)S 最終狀態(tài)集F
當(dāng)前狀態(tài)與事件與謂詞 => 下一個狀態(tài)
Petri網(wǎng):形式化技術(shù)。
禁止?。簺]有令牌也能轉(zhuǎn)換。
Z:形式化技術(shù)。
一個規(guī)格說明文檔必須既是非形式化的,足以讓客戶理解,又是形式化的,足以讓開發(fā)小組將其作為要建造的產(chǎn)品的唯一描述。
§13
面向?qū)ο蠓治觯∣OA)是面向?qū)ο蠓缎偷陌胄问交治黾夹g(shù)。
分析流的兩個目標(biāo):
1.得到對需求更深的理解
2.按設(shè)計和實現(xiàn)易于維護的思路描述需求。
統(tǒng)一過程有三種類:
實體類為長期存在的信息建模。
邊界類為軟件產(chǎn)品和它的參與者之間的交互行為建模。
控制類為復(fù)雜的計算和算法建模。
抽取實體類:功能建模,實體類建模,動態(tài)建模
實體類建模:名詞抽取法:階段1,用一個段落描述軟件產(chǎn)品;階段2,分辨名詞
分析流的基本目標(biāo)是生成規(guī)格說明文檔。
§14
面向操作設(shè)計,強調(diào)操作,目標(biāo)是設(shè)計具有高內(nèi)聚性的模塊。
面向數(shù)據(jù)設(shè)計,首先考慮的是數(shù)據(jù)。首先確定數(shù)據(jù)結(jié)構(gòu),然后設(shè)計符合數(shù)據(jù)結(jié)構(gòu)的過程。
數(shù)據(jù)流分析(DFA)是一項得到具有高內(nèi)聚模塊的傳統(tǒng)設(shè)計技術(shù)。
程序描述語言(PDL)——“偽碼”
事務(wù)是從產(chǎn)品用戶的觀點來看的一個操作。
統(tǒng)一過程的前提是知道面向?qū)ο笤O(shè)計。
§15
二進制機器碼是第一代語言。
第二代語言是匯編語言。
C、C++、Pascal或Java是第二代語言。
第四代語言:4GL。
實現(xiàn)流的目標(biāo)是用所選的實現(xiàn)語言實現(xiàn)目標(biāo)軟件產(chǎn)品。
單元測試的測試數(shù)據(jù)可以用兩個基本的方法系統(tǒng)地構(gòu)建。
第一個是規(guī)格說明測試,這個技術(shù)也稱為黑盒測試、行為測試、數(shù)據(jù)驅(qū)動測試、功能測試以及輸入/輸出驅(qū)動測試。
另一個是代碼測試,白盒測試。
黑盒測試:
涉及測試用例、等價類劃分、邊界值分析
等價類成員+邊界值+臨近邊界值
白盒測試:語句、分支和路徑覆蓋。
每個新的代碼制品加入到已集成的模塊中時都必須進行測試,這稱為集成測試。
當(dāng)集成過程結(jié)束時,軟件產(chǎn)品作為一個整體進行測試,稱為產(chǎn)品測試。
交給客戶進行驗收測試。
§17
UML是統(tǒng)一建模語言。
空菱形表示聚合,聚合是UML中表示局部-整體關(guān)系的術(shù)語。
線的端點處旁邊的數(shù)字表示多重性。
組合是聚合的一個更強形式,部分-整體的關(guān)系。用一個空心菱形表示。
繼承是泛化的一個特例,用空心三角形表示。
關(guān)聯(lián)的方向需由一個實心三角形式的箭頭來明確。
用例是軟件產(chǎn)品的外部用戶(參與者)和軟件產(chǎn)品自身的交互模型。
包含關(guān)系在UML中當(dāng)作構(gòu)造型對待。
擴展關(guān)系:用例是標(biāo)準(zhǔn)用例的變體。
交互圖顯示軟件產(chǎn)品中的對象與另一個對象交互的方式。
交互圖:順序圖和通信圖(協(xié)作圖)
對象可以向本身發(fā)送消息——自調(diào)用
狀態(tài)圖
活動圖:顯示各種事件是如何協(xié)調(diào)的.
組件圖:顯示軟件組件之間的依存度,包括源代碼、編譯代碼以及可執(zhí)行載入映像。
部署圖:顯示每個軟件組件安裝(或部署)在哪個硬件組件上。