版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第1章軟件工程學(xué)概述1.1軟件危機(jī)1.2軟件工程1.3軟件生命周期1.4軟件過程1.5小結(jié)習(xí)題迄今為止,計(jì)算機(jī)系統(tǒng)已經(jīng)經(jīng)歷了4個(gè)不同的發(fā)展階段,但是,我們?nèi)匀粵]有徹底擺脫“軟件危機(jī)”的困擾,軟件已經(jīng)成為限制計(jì)算機(jī)系統(tǒng)發(fā)展的瓶頸。為了更有效地開發(fā)與維護(hù)軟件,軟件工作者在20世紀(jì)60年代后期開始認(rèn)真研究消除軟件危機(jī)的途徑,從而逐漸形成了一門新興的工程學(xué)科——計(jì)算機(jī)軟件工程學(xué)(通常簡稱為軟件工程)。
1.1軟件危機(jī)
計(jì)算機(jī)軟件發(fā)展至今經(jīng)歷了三個(gè)不同的發(fā)展時(shí)期:程序設(shè)計(jì)時(shí)期(20世紀(jì)50年代——60年代)軟件時(shí)期(20世紀(jì)60年代中期——70年代)軟件工程時(shí)期(20世紀(jì)70年代——現(xiàn)在)
軟件的發(fā)展程序設(shè)計(jì)語言(Programming)機(jī)器語言匯編語言ALGOL60FORTRANCOBOLBASIC軟件(Software)1960程序文檔數(shù)據(jù)軟件危機(jī)引出軟件工程(SoftwareEngineering)軟件開發(fā)工程化1968NATO軟件開發(fā)階段與瀑布模型軟件工程標(biāo)準(zhǔn)
焦點(diǎn)目標(biāo)-----少資源、高效益-----在人力投入、開發(fā)期、成本、質(zhì)量諸方面求得最佳風(fēng)險(xiǎn)----需求:不明與變更----人員流動(dòng)----軟件知識產(chǎn)權(quán)保護(hù)----不存在絕對無缺陷的軟件產(chǎn)品如期完成預(yù)算內(nèi)完成達(dá)到質(zhì)量要求(需求和希望)軟件項(xiàng)目成功的標(biāo)志軟件的特點(diǎn)軟件是一種邏輯實(shí)體,具有抽象性這個(gè)特點(diǎn)使它與其他工程對象有著明顯的差異人們可以把它記錄在紙上、內(nèi)存和磁盤、光盤上,但卻無法看到軟件本身的形態(tài),必須通過觀察、分析、思考、判斷,才能了解它的功能、性能等特性軟件沒有明顯的制造過程一旦研制開發(fā)成功,就可以大量拷貝同一內(nèi)容的副本,所以對軟件的質(zhì)量控制,必須著重在軟件開發(fā)方面下工夫軟件的特點(diǎn)軟件在使用過程中,沒有磨損、老化的問題軟件在生存周期后期不會因?yàn)槟p而老化,但會為了適應(yīng)硬件、環(huán)境以及需求的變化而進(jìn)行修改,而這些修改又不可避免地引入錯(cuò)誤,導(dǎo)致軟件失效率升高,從而使得軟件退化當(dāng)修改的成本變得難以接受時(shí),軟件就被拋棄軟件對硬件和環(huán)境有著不同程度的依賴性這導(dǎo)致了軟件移植的問題軟件的特點(diǎn)軟件的開發(fā)至今尚未完全擺脫手工作坊式的開發(fā)方式,生產(chǎn)效率低軟件是復(fù)雜的,而且以后會更加復(fù)雜軟件是人類有史以來生產(chǎn)的復(fù)雜度最高的工業(yè)產(chǎn)品軟件涉及人類社會的各行各業(yè)、方方面面,軟件開發(fā)常常涉及其他領(lǐng)域的專門知識,這對軟件工程師提出了很高的要求軟件的特點(diǎn)軟件的成本相當(dāng)昂貴軟件開發(fā)需要投入大量、高強(qiáng)度的腦力勞動(dòng),成本非常高,風(fēng)險(xiǎn)也大現(xiàn)在軟件的開銷已大大超過了硬件的開銷軟件工作牽涉到很多社會因素許多軟件的開發(fā)和運(yùn)行涉及機(jī)構(gòu)、體制和管理方式等問題,還會涉及到人們的觀念和心理這些人的因素,常常成為軟件開發(fā)的困難所在,直接影響到項(xiàng)目的成敗OS360操作系統(tǒng)被認(rèn)為是一個(gè)典型的案例。到現(xiàn)在為止,它仍然被使用在IBM360系列主機(jī)中。共約100萬條指令,花費(fèi)了5000個(gè)人年;經(jīng)費(fèi)達(dá)數(shù)億美圓,而結(jié)果卻令人沮喪,錯(cuò)誤多達(dá)2000個(gè)以上,系統(tǒng)根本無法正常運(yùn)行。FredBrooks在隨后他的大作《人月神話》(TheMythicalMan-Month)中曾經(jīng)承認(rèn),在他管理這個(gè)項(xiàng)目的時(shí)候,他犯了一個(gè)價(jià)值數(shù)百萬美元的錯(cuò)誤。財(cái)產(chǎn)的損失:軟件的錯(cuò)誤可能導(dǎo)致巨大的財(cái)產(chǎn)損失。歐洲阿里亞娜火箭的爆炸就是一個(gè)最為慘痛的教訓(xùn)。造成1000萬美元的損失。原因是FORTRAN程序:
DO5I=1,3
誤寫為:DO5I=1.3人員傷亡:由于計(jì)算機(jī)軟件被廣泛應(yīng)用于包括醫(yī)院等與生命息息相關(guān)的行業(yè)。這也使得軟件的錯(cuò)誤導(dǎo)致人員傷亡成為了可能。在工業(yè)上,某些嵌入式系統(tǒng)導(dǎo)致機(jī)器的不正常運(yùn)轉(zhuǎn),從而將一些人推入了險(xiǎn)境。1967年蘇聯(lián)“聯(lián)盟一號”載人宇宙飛船在返航時(shí),由于軟件忽略一個(gè)小數(shù)點(diǎn),在進(jìn)入大氣層時(shí)因打不開降落傘而燒毀。
在計(jì)算機(jī)系統(tǒng)發(fā)展的早期時(shí)代(20世紀(jì)60年代中期以前),通用硬件相當(dāng)普遍,軟件卻是為每個(gè)具體應(yīng)用而專門編寫的。這時(shí)的軟件通常是規(guī)模較小的程序,編寫者和使用者往往是同一個(gè)(或同一組)人。這種個(gè)體化的軟件環(huán)境,使得軟件設(shè)計(jì)通常是在人們頭腦中進(jìn)行的一個(gè)隱含的過程,除了程序清單之外,沒有其他文檔資料保存下來。從20世紀(jì)60年代中期到70年代中期是計(jì)算機(jī)系統(tǒng)發(fā)展的第二代時(shí)期,這個(gè)時(shí)期的一個(gè)重要特征是出現(xiàn)了“軟件作坊”,廣泛使用產(chǎn)品軟件。
但是,“軟件作坊”基本上仍然沿用早期形成的個(gè)體化軟件開發(fā)方法。隨著計(jì)算機(jī)應(yīng)用的日益普及,軟件數(shù)量急劇膨脹。在程序運(yùn)行時(shí)發(fā)現(xiàn)的錯(cuò)誤必須設(shè)法改正;用戶有了新的需求時(shí)必須相應(yīng)地修改程序;硬件或操作系統(tǒng)更新時(shí),通常需要修改程序以適應(yīng)新的環(huán)境。上述種種軟件維護(hù)工作,以令人吃驚的比例耗費(fèi)資源。更嚴(yán)重的是,許多程序的個(gè)體化特性使得它們最終成為不可維護(hù)的?!败浖C(jī)”就這樣開始出現(xiàn)了!1968年北大西洋公約組織的計(jì)算機(jī)科學(xué)家在聯(lián)邦德國召開國際會議,討論軟件危機(jī)問題,在這次會議上正式提出并使用了“軟件工程”這個(gè)名詞,一門新興的工程學(xué)科就此誕生了。按軟件的功能進(jìn)行劃分:系統(tǒng)軟件操作系統(tǒng)數(shù)據(jù)庫管理系統(tǒng)設(shè)備驅(qū)動(dòng)程序通信處理程序等軟件的分類支撐軟件文本編輯程序文件格式化程序磁盤向磁帶向數(shù)據(jù)傳輸?shù)某绦虺绦驇煜到y(tǒng)支持需求分析、設(shè)計(jì)、實(shí)現(xiàn)、測試和支持管理的軟件應(yīng)用軟件商業(yè)數(shù)據(jù)處理軟件工程與科學(xué)計(jì)算軟件計(jì)算機(jī)輔助設(shè)計(jì)/制造軟件系統(tǒng)仿真軟件智能產(chǎn)品嵌入軟件醫(yī)療、制藥軟件事務(wù)管理、辦公自動(dòng)化軟件計(jì)算機(jī)輔助教學(xué)軟件按軟件規(guī)模進(jìn)行劃分:類別參加人員數(shù) 研制期限源程序行數(shù)
微型
1 1~4周0.5k小型
1 1~6月1k~2k中型
2~5 1~2年5k~50k大型
5~20 2~3年50k~100k甚大型
100~10004~5年
1M(=1000k)極大型
2000~50005~10年1M~10M 按軟件工作方式劃分:實(shí)時(shí)處理軟件分時(shí)軟件交互式軟件批處理軟件按軟件服務(wù)對象的范圍劃分:
項(xiàng)目軟件產(chǎn)品軟件按使用的頻度進(jìn)行劃分:一次使用頻繁使用按軟件失效的影響進(jìn)行劃分:高可靠性軟件一般可靠性軟件
軟件危機(jī)是指在計(jì)算機(jī)軟件的開發(fā)和維護(hù)過程中所遇到的一系列嚴(yán)重問題。這些問題絕不僅僅是不能正常運(yùn)行的軟件才具有的,實(shí)際上,幾乎所有軟件都不同程度地存在這些問題。概括地說,軟件危機(jī)包含下述兩方面的問題:如何開發(fā)軟件,以滿足對軟件日益增長的需求;如何維護(hù)數(shù)量不斷膨脹的已有軟件。具體地說,軟件危機(jī)主要有以下一些典型表現(xiàn)。1.1.1軟件危機(jī)的介紹(1)對軟件開發(fā)成本和進(jìn)度的估計(jì)常常很不準(zhǔn)確。實(shí)際成本比估計(jì)成本有可能高出一個(gè)數(shù)量級,實(shí)際進(jìn)度比預(yù)期進(jìn)度拖延幾個(gè)月甚至幾年的現(xiàn)象并不罕見。這種現(xiàn)象降低了軟件開發(fā)組織的信譽(yù)。而為了趕進(jìn)度和節(jié)約成本所采取的一些權(quán)宜之計(jì)又往往損害了軟件產(chǎn)品的質(zhì)量,從而不可避免地會引起用戶的不滿。(2)用戶對“已完成的”軟件系統(tǒng)不滿意的現(xiàn)象經(jīng)常發(fā)生。軟件開發(fā)人員常常在對用戶要求只有模糊的了解,甚至對所要解決的問題還沒有確切認(rèn)識的情況下,就匆忙著手編寫程序。軟件開發(fā)人員和用戶之間的信息交流往往很不充分,“閉門造車”必然導(dǎo)致最終的產(chǎn)品不符合用戶的實(shí)際需要。(3)軟件產(chǎn)品的質(zhì)量往往靠不住。軟件可靠性和質(zhì)量保證的確切的定量概念剛剛出現(xiàn)不久,軟件質(zhì)量保證技術(shù)(審查、復(fù)審和測試)還沒有堅(jiān)持不懈地應(yīng)用到軟件開發(fā)的全過程中,這些都導(dǎo)致軟件產(chǎn)品發(fā)生質(zhì)量問題。(4)軟件常常是不可維護(hù)的。很多程序中的錯(cuò)誤是非常難改正的,實(shí)際上不可能使這些程序適應(yīng)新的硬件環(huán)境,也不能根據(jù)用戶的需要在原有程序中增加一些新的功能?!翱芍赜玫能浖边€是一個(gè)沒有完全做到的、正在努力追求的目標(biāo),人們?nèi)匀辉谥貜?fù)開發(fā)類似的或基本類似的軟件。(5)軟件通常沒有適當(dāng)?shù)奈臋n資料。計(jì)算機(jī)軟件不僅僅是程序,還應(yīng)該有一整套文檔資料。這些文檔資料應(yīng)該是在軟件開發(fā)過程中產(chǎn)生出來的,而且應(yīng)該是“最新式的”(即和程序代碼完全一致的)。軟件開發(fā)組織的管理人員可以使用這些文檔資料作為“里程碑”,來管理和評價(jià)軟件開發(fā)工程的進(jìn)展?fàn)顩r;軟件開發(fā)人員可以利用它們作為通信工具,在軟件開發(fā)過程中準(zhǔn)確地交流信息;對于軟件維護(hù)人員而言,這些文檔資料更是必不可少的。缺乏必要的文檔資料或者文檔資料不合格,必然給軟件開發(fā)和維護(hù)帶來許多嚴(yán)重的困難和問題。(6)軟件成本在計(jì)算機(jī)系統(tǒng)總成本中所占的比例逐年上升。由于微電子學(xué)技術(shù)的進(jìn)步和生產(chǎn)自動(dòng)化程度不斷提高,硬件成本逐年下降,然而軟件開發(fā)需要大量人力,軟件成本隨著通貨膨脹以及軟件規(guī)模和數(shù)量的不斷擴(kuò)大而持續(xù)上升。美國在1985年軟件成本大約已占計(jì)算機(jī)系統(tǒng)總成本的90%。(7)軟件開發(fā)生產(chǎn)率提高的速度,遠(yuǎn)遠(yuǎn)跟不上計(jì)算機(jī)應(yīng)用迅速普及深入的趨勢。軟件產(chǎn)品“供不應(yīng)求”的現(xiàn)象使人類不能充分利用現(xiàn)代計(jì)算機(jī)硬件提供的巨大潛力。
在軟件開發(fā)和維護(hù)的過程中存在這么多嚴(yán)重問題,一方面與軟件本身的特點(diǎn)有關(guān),另一方面也和軟件開發(fā)與維護(hù)的方法不正確有關(guān)。1.1.2產(chǎn)生軟件危機(jī)的原因由于軟件本身的特點(diǎn),管理和控制軟件開發(fā)過程相當(dāng)困難,而且軟件維護(hù)較難軟件是一種高智力活動(dòng),由復(fù)雜的邏輯、復(fù)雜的運(yùn)算和復(fù)雜的關(guān)聯(lián)等構(gòu)成1.1.2產(chǎn)生軟件危機(jī)的原因由于對軟件開發(fā)與軟件維護(hù)的不正確方法,產(chǎn)生了軟件危機(jī)----軟件規(guī)模越來越大,功能越來越強(qiáng),導(dǎo)致軟件結(jié)構(gòu)非常復(fù)雜----忽視軟件開發(fā)前期的需求分析----開發(fā)過程沒有統(tǒng)一的、規(guī)范的方法論的指導(dǎo),文檔資料不齊全,忽視人與人的交流----忽視測試階段的工作,提交用戶的軟件質(zhì)量差----輕視軟件的維護(hù);等等1.1.2產(chǎn)生軟件危機(jī)的原因?qū)浖捶ǖ母淖冊缙谀切┍徽J(rèn)為是優(yōu)秀的程序常常很難被別人看懂,通篇充滿了程序技巧現(xiàn)在人們普遍認(rèn)為優(yōu)秀的程序除了功能正確,性能優(yōu)良之外,還應(yīng)該容易看懂、容易使用、容易修改和擴(kuò)充
軟件不同于硬件,它是計(jì)算機(jī)系統(tǒng)中的邏輯部件而不是物理部件。由于軟件缺乏“可見性”,在寫出程序代碼并在計(jì)算機(jī)上試運(yùn)行之前,軟件開發(fā)過程的進(jìn)展情況較難衡量,軟件的質(zhì)量也較難評價(jià),因此,管理和控制軟件開發(fā)過程相當(dāng)困難。此外,軟件在運(yùn)行過程中不會因?yàn)槭褂脮r(shí)間過長而被“用壞”,如果運(yùn)行中發(fā)現(xiàn)了錯(cuò)誤,很可能是遇到了一個(gè)在開發(fā)時(shí)期引入的在測試階段沒能檢測出來的錯(cuò)誤。因此,軟件維護(hù)通常意味著改正或修改原來的設(shè)計(jì),這就在客觀上使得軟件較難維護(hù)。
軟件不同于一般程序,它的一個(gè)顯著特點(diǎn)是規(guī)模龐大,而且程序復(fù)雜性將隨著程序規(guī)模的增加而呈指數(shù)上升。為了在預(yù)定時(shí)間內(nèi)開發(fā)出規(guī)模龐大的軟件,必須由許多人分工合作,然而,如何保證每個(gè)人完成的工作合在一起確實(shí)能構(gòu)成一個(gè)高質(zhì)量的大型軟件系統(tǒng),更是一個(gè)極端復(fù)雜困難的問題,不僅涉及許多技術(shù)問題,諸如分析方法、設(shè)計(jì)方法、形式說明方法、版本控制等,更重要的是必須有嚴(yán)格而科學(xué)的管理。軟件(software)是計(jì)算機(jī)系統(tǒng)中與硬件(hardware)相互依存的另一部分,它包括:程序(program)——是按照事先設(shè)計(jì)的功能和性能要求執(zhí)行的指令序列相關(guān)數(shù)據(jù)(data)——是程序能正常操縱信息的數(shù)據(jù)結(jié)構(gòu)說明文檔(document)——是與程序開發(fā)維護(hù)和使用有關(guān)的各種圖文資料什么是軟件軟件本身獨(dú)有的特點(diǎn)確實(shí)給開發(fā)和維護(hù)帶來一些客觀困難,但是人們在開發(fā)和使用計(jì)算機(jī)系統(tǒng)的長期實(shí)踐中,也確實(shí)積累和總結(jié)出了許多成功的經(jīng)驗(yàn)。如果堅(jiān)持不懈地使用經(jīng)過實(shí)踐考驗(yàn)證明是正確的方法,許多困難是完全可以克服的,過去也確實(shí)有一些成功的范例。但是,目前相當(dāng)多的軟件專業(yè)人員對軟件開發(fā)和維護(hù)還有不少糊涂觀念,在實(shí)踐過程中或多或少地采用了錯(cuò)誤的方法和技術(shù),這可能是使軟件問題發(fā)展成軟件危機(jī)的主要原因。
與軟件開發(fā)和維護(hù)有關(guān)的許多錯(cuò)誤認(rèn)識和作法的形成,可以歸因于在計(jì)算機(jī)系統(tǒng)發(fā)展的早期階段軟件開發(fā)的個(gè)體化特點(diǎn)。錯(cuò)誤的認(rèn)識和作法主要表現(xiàn)為忽視軟件需求分析的重要性,認(rèn)為軟件開發(fā)就是寫程序并設(shè)法使之運(yùn)行,輕視軟件維護(hù)等。
事實(shí)上,對用戶要求沒有完整準(zhǔn)確的認(rèn)識就匆忙著手編寫程序是許多軟件開發(fā)工程失敗的主要原因之一。只有用戶才真正了解他們自己的需要,但是許多用戶在開始時(shí)并不能準(zhǔn)確具體地?cái)⑹鏊麄兊男枰?,軟件開發(fā)人員需要做大量深入細(xì)致的調(diào)查研究工作,反復(fù)多次地和用戶交流信息,才能真正全面、準(zhǔn)確、具體地了解用戶的要求。對問題和目標(biāo)的正確認(rèn)識是解決任何問題的前提和出發(fā)點(diǎn),軟件開發(fā)同樣也不例外。急于求成,倉促上陣,對用戶要求沒有正確認(rèn)識就匆忙著手編寫程序,這就如同不打好地基就蓋高樓一樣,最終必然垮臺。事實(shí)上,越早開始寫程序,完成它所需要用的時(shí)間往往越長。
一個(gè)軟件從定義、開發(fā)、使用和維護(hù),直到最終被廢棄,要經(jīng)歷一個(gè)漫長的時(shí)期,這就如同一個(gè)人要經(jīng)過胎兒、兒童、青年、中年和老年,直到最終死亡的漫長時(shí)期一樣。通常把軟件經(jīng)歷的這個(gè)漫長的時(shí)期稱為生命周期。軟件開發(fā)最初的工作應(yīng)是問題定義,也就是確定要求解決的問題是什么;然后要進(jìn)行可行性研究,決定該問題是否存在一個(gè)可行的解決辦法;接下來應(yīng)該進(jìn)行需求分析,也就是深入具體地了解用戶的要求,在所要開發(fā)的系統(tǒng)(不妨稱之為目標(biāo)系統(tǒng))必須做什么這個(gè)問題上和用戶取得完全一致的看法。
經(jīng)過上述軟件定義時(shí)期的準(zhǔn)備工作才能進(jìn)入開發(fā)時(shí)期,而在開發(fā)時(shí)期首先需要對軟件進(jìn)行設(shè)計(jì)(通常又分為概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)兩個(gè)階段),然后才能進(jìn)入編寫程序的階段,程序編寫完之后還必須經(jīng)過大量的測試工作(需要的工作量通常占軟件開發(fā)全部工作量的40%~50%)才能最終交付使用。所以,編寫程序只是軟件開發(fā)過程中的一個(gè)階段,而且在典型的軟件開發(fā)工程中,編寫程序所需的工作量只占軟件開發(fā)全部工作量的10%~20%。
另一方面還必須認(rèn)識到程序只是完整的軟件產(chǎn)品的一個(gè)組成部分,在上述軟件生命周期的每個(gè)階段都要得出最終產(chǎn)品的一個(gè)或幾個(gè)組成部分(這些組成部分通常以文檔資料的形式存在)。也就是說,一個(gè)軟件產(chǎn)品必須由一個(gè)完整的配置組成,軟件配置主要包括程序、文檔和數(shù)據(jù)等成分。必須清除只重視程序而忽視軟件配置其余成分的糊涂觀念。作好軟件定義時(shí)期的工作,是降低軟件成本提高軟件質(zhì)量的關(guān)鍵。如果軟件開發(fā)人員在定義時(shí)期沒有正確全面地理解用戶需求,直到測試階段或軟件交付使用后才發(fā)現(xiàn)“已完成的”軟件不完全符合用戶的需要,這時(shí)再修改就為時(shí)已晚了。
嚴(yán)重的問題是,在軟件開發(fā)的不同階段進(jìn)行修改需要付出的代價(jià)是很不相同的,在早期引入變動(dòng),涉及的面較少,因而代價(jià)也比較低;而在開發(fā)的中期軟件配置的許多成分已經(jīng)完成,引入一個(gè)變動(dòng)要對所有已完成的配置成分都做相應(yīng)的修改,不僅工作量大,而且邏輯上也更復(fù)雜,因此付出的代價(jià)劇增;在軟件“已經(jīng)完成”時(shí)再引入變動(dòng),當(dāng)然需要付出更高的代價(jià)。根據(jù)美國一些軟件公司的統(tǒng)計(jì)資料,在后期引入一個(gè)變動(dòng)比在早期引入相同變動(dòng)所需付出的代價(jià)高2~3個(gè)數(shù)量級。圖1.1定性地描繪了在不同時(shí)期引入一個(gè)變動(dòng)需要付出的代價(jià)的變化趨勢。圖1.1引入同一變動(dòng)付出的代價(jià)隨時(shí)間變化的趨勢
通過上面的論述不難認(rèn)識到,輕視維護(hù)是一個(gè)最大的錯(cuò)誤。許多軟件產(chǎn)品的使用壽命長達(dá)10年甚至20年,在這樣漫長的時(shí)期中不僅必須改正使用過程中發(fā)現(xiàn)的每一個(gè)潛伏的錯(cuò)誤,而且當(dāng)環(huán)境變化時(shí)(例如硬件或系統(tǒng)軟件更新?lián)Q代)還必須相應(yīng)地修改軟件以適應(yīng)新的環(huán)境,特別是必須經(jīng)常改進(jìn)或擴(kuò)充原來的軟件以滿足用戶不斷變化的需要。所有這些改動(dòng)都屬于維護(hù)工作,而且是在軟件已經(jīng)完成之后進(jìn)行的,因此維護(hù)是極端艱巨復(fù)雜的工作,需要花費(fèi)很大代價(jià)。統(tǒng)計(jì)數(shù)據(jù)表明,實(shí)際上用于軟件維護(hù)的費(fèi)用占軟件總費(fèi)用的55%~70%。軟件工程學(xué)的一個(gè)重要目標(biāo)就是提高軟件的可維護(hù)性,減少軟件維護(hù)的代價(jià)。
為了消除軟件危機(jī),首先應(yīng)該對計(jì)算機(jī)軟件有一個(gè)正確的認(rèn)識。正如1.1.2節(jié)中講過的,應(yīng)該徹底消除在計(jì)算機(jī)系統(tǒng)早期發(fā)展階段形成的“軟件就是程序”的錯(cuò)誤觀念。一個(gè)軟件必須由一個(gè)完整的配置組成,事實(shí)上,軟件是程序、數(shù)據(jù)及相關(guān)文檔的完整集合。其中,程序是能夠完成預(yù)定功能和性能的可執(zhí)行的指令序列;數(shù)據(jù)是使程序能夠適當(dāng)?shù)靥幚硇畔⒌臄?shù)據(jù)結(jié)構(gòu);文檔是開發(fā)、使用和維護(hù)程序所需要的圖文資料。1.1.3消除軟件危機(jī)的途徑
1983年IEEE為軟件下的定義是:計(jì)算機(jī)程序、方法、規(guī)則、相關(guān)的文檔資料以及在計(jì)算機(jī)上運(yùn)行程序時(shí)所必需的數(shù)據(jù)。雖然表面上看來在這個(gè)定義中列出了軟件的5個(gè)配置成分,但是,方法和規(guī)則通常是在文檔中說明并在程序中實(shí)現(xiàn)的。更重要的是,必須充分認(rèn)識到軟件開發(fā)不是某種個(gè)體勞動(dòng)的神秘技巧,而應(yīng)該是一種組織良好、管理嚴(yán)密、各類人員協(xié)同配合、共同完成的工程項(xiàng)目。必須充分吸取和借鑒人類長期以來從事各種工程項(xiàng)目所積累的行之有效的原理、概念、技術(shù)和方法,特別要吸取幾十年來人類從事計(jì)算機(jī)硬件研究和開發(fā)的經(jīng)驗(yàn)教訓(xùn)。應(yīng)該推廣使用在實(shí)踐中總結(jié)出來的開發(fā)軟件的成功的技術(shù)和方法,并且研究探索更好更有效的技術(shù)和方法,盡快消除在計(jì)算機(jī)系統(tǒng)早期發(fā)展階段形成的一些錯(cuò)誤概念和做法。應(yīng)該開發(fā)和使用更好的軟件工具。正如機(jī)械工具可以“放大”人類的體力一樣,軟件工具可以“放大”人類的智力。在軟件開發(fā)的每個(gè)階段都有許多繁瑣重復(fù)的工作需要做,在適當(dāng)?shù)能浖ぞ咻o助下,開發(fā)人員可以把這類工作做得既快又好。如果把各個(gè)階段使用的軟件工具有機(jī)地集合成一個(gè)整體,支持軟件開發(fā)的全過程,則稱為軟件工程支撐環(huán)境??傊?,為了解決軟件危機(jī),既要有技術(shù)措施(方法和工具),又要有必要的組織管理措施。軟件工程正是從管理和技術(shù)兩方面研究如何更好地開發(fā)和維護(hù)計(jì)算機(jī)軟件的一門新興學(xué)科。1.第一代軟件工程
—
傳統(tǒng)的軟件工程2.第二代軟件工程—對象工程3.第三代軟件工程—過程工程4.第四代軟件工程—構(gòu)件工程軟件工程的發(fā)展已經(jīng)歷了四個(gè)重要階段:1.2軟件工程1.第一代軟件工程
—
傳統(tǒng)的軟件工程
60年代末到70年代為了克服“軟件危機(jī)”(Softwarecrisis)提出“軟件工程”的名詞,將軟件開發(fā)納入工程化的軌道,基本形成軟件工程的概念、框架、技術(shù)和方法。稱為傳統(tǒng)的軟件工程。2.第二代軟件工程—對象工程
80年代中到90年代,面向?qū)ο蟮姆椒ㄅc技術(shù)得到發(fā)展,研究的重點(diǎn)轉(zhuǎn)移到面向?qū)ο蟮姆治雠c設(shè)計(jì),演化為一種完整的軟件開發(fā)方法和系統(tǒng)的技術(shù)體系,稱為對象工程。3.第三代軟件工程—過程工程
80年代中開始,人們在軟件開發(fā)的實(shí)踐過程中認(rèn)識到:提高軟件生產(chǎn)率,保證軟件質(zhì)量的關(guān)鍵是“軟件過程”,是軟件開發(fā)和維護(hù)中的管理和支持能力,逐步形成軟件過程工程。4.第四代軟件工程—構(gòu)件工程
90起年代,基于構(gòu)件(Component)的開發(fā)方法取得重要進(jìn)展,軟件系統(tǒng)的開發(fā)可通過使用現(xiàn)成的可復(fù)用構(gòu)件組裝完成,而無需從頭開始構(gòu)造,以此達(dá)到提高效率和質(zhì)量,降低成本的目的。稱為構(gòu)件工程。概括地說,軟件工程是指導(dǎo)計(jì)算機(jī)軟件開發(fā)和維護(hù)的一門工程學(xué)科。采用工程的概念、原理、技術(shù)和方法來開發(fā)與維護(hù)軟件,把經(jīng)過時(shí)間考驗(yàn)而證明正確的管理技術(shù)和當(dāng)前能夠得到的最好的技術(shù)方法結(jié)合起來,以經(jīng)濟(jì)地開發(fā)出高質(zhì)量的軟件并有效地維護(hù)它,這就是軟件工程。人們曾經(jīng)給軟件工程下過許多定義,下面給出兩個(gè)典型的定義。1.2.1軟件工程的介紹1968年在第一屆NATO會議上曾經(jīng)給出了軟件工程的一個(gè)早期定義:“軟件工程就是為了經(jīng)濟(jì)地獲得可靠的且能在實(shí)際機(jī)器上有效地運(yùn)行的軟件,而建立和使用完善的工程原理?!边@個(gè)定義不僅指出了軟件工程的目標(biāo)是經(jīng)濟(jì)地開發(fā)出高質(zhì)量的軟件,而且強(qiáng)調(diào)了軟件工程是一門工程學(xué)科,它應(yīng)該建立并使用完善的工程原理。1993年IEEE進(jìn)一步給出了一個(gè)更全面更具體的定義:“軟件工程是:①把系統(tǒng)的、規(guī)范的、可度量的途徑應(yīng)用于軟件開發(fā)、運(yùn)行和維護(hù)過程,也就是把工程應(yīng)用于軟件;②研究①中提到的途徑?!?/p>
雖然軟件工程的不同定義使用了不同詞句,強(qiáng)調(diào)的重點(diǎn)也有差異,但是,人們普遍認(rèn)為軟件工程具有下述的本質(zhì)特性。1.軟件工程關(guān)注于大型程序的構(gòu)造
“大”與“小”的分界線并不十分清晰。通常把一個(gè)人在較短時(shí)間內(nèi)寫出的程序稱為小型程序,而把多人合作用時(shí)半年以上才寫出的程序稱為大型程序。傳統(tǒng)的程序設(shè)計(jì)技術(shù)和工具是支持小型程序設(shè)計(jì)的,不能簡單地把這些技術(shù)和工具用于開發(fā)大型程序。事實(shí)上,在此處使用術(shù)語“程序”并不十分恰當(dāng),現(xiàn)在的軟件開發(fā)項(xiàng)目通常構(gòu)造出包含若干個(gè)相關(guān)程序的“系統(tǒng)”。2.軟件工程的中心課題是控制復(fù)雜性通常,軟件所解決的問題十分復(fù)雜,以致不能把問題作為一個(gè)整體通盤考慮。人們不得不把問題分解,使得分解出的每個(gè)部分是可理解的,而且各部分之間保持簡單的通信關(guān)系。用這種方法并不能降低問題的整體復(fù)雜性,但是卻可使它變成可以管理的。注意,許多軟件的復(fù)雜性主要不是由問題的內(nèi)在復(fù)雜性造成的,而是由必須處理的大量細(xì)節(jié)造成的。3.軟件經(jīng)常變化絕大多數(shù)軟件都模擬了現(xiàn)實(shí)世界的某一部分?,F(xiàn)實(shí)世界在不斷變化,軟件為了不被很快淘汰,必須隨著所模擬的現(xiàn)實(shí)世界一起變化。因此,在軟件系統(tǒng)交付使用后仍然需要耗費(fèi)成本,而且在開發(fā)過程中必須考慮軟件將來可能的變化。4.開發(fā)軟件的效率非常重要目前,社會對新應(yīng)用系統(tǒng)的需求超過了人力資源所能提供的限度,軟件供不應(yīng)求的現(xiàn)象日益嚴(yán)重。因此,軟件工程的一個(gè)重要課題就是,尋求開發(fā)與維護(hù)軟件的更好更有效的方法和工具。5.和諧地合作是開發(fā)軟件的關(guān)鍵軟件處理的問題十分龐大,必須多人協(xié)同工作才能解決這類問題。為了有效地合作,必須明確地規(guī)定每個(gè)人的責(zé)任和相互通信的方法。事實(shí)上僅有上述規(guī)定還不夠,每個(gè)人還必須嚴(yán)格地按規(guī)定行事。為了迫使大家遵守規(guī)定,應(yīng)該運(yùn)用標(biāo)準(zhǔn)和規(guī)程。通常,可以用工具來支持這些標(biāo)準(zhǔn)和規(guī)程??傊?,紀(jì)律是成功地完成軟件開發(fā)項(xiàng)目的一個(gè)關(guān)鍵。6.軟件必須有效地支持它的用戶開發(fā)軟件的目的是支持用戶的工作。軟件提供的功能應(yīng)該能有效地協(xié)助用戶完成他們的工作。如果用戶對軟件系統(tǒng)不滿意,可以棄用該系統(tǒng),至少也會立即提出新的需求。因此,僅僅用正確的方法構(gòu)造系統(tǒng)還不夠,還必須構(gòu)造出正確的系統(tǒng)。有效地支持用戶意味著必須仔細(xì)地研究用戶,以確定適當(dāng)?shù)墓δ苄枨蟆⒖捎眯砸蠹捌渌|(zhì)量要求(例如,可靠性、響應(yīng)時(shí)間等)。有效地支持用戶還意味著,軟件開發(fā)不僅應(yīng)該提交軟件產(chǎn)品,而且應(yīng)該寫出用戶手冊和培訓(xùn)材料,此外,還必須注意建立使用新系統(tǒng)的環(huán)境。7.在軟件工程領(lǐng)域中是由具有一種文化背景的人替具有另一種文化背景的人創(chuàng)造產(chǎn)品這個(gè)特性與前兩個(gè)特性緊密相關(guān)。軟件工程師是諸如Java程序設(shè)計(jì)、軟件體系結(jié)構(gòu)、測試或統(tǒng)一建模語言(UML)等方面的專家,他們通常并不是圖書館管理、航空控制或銀行事務(wù)等領(lǐng)域的專家,但是他們卻不得不為這些領(lǐng)域開發(fā)應(yīng)用系統(tǒng)。缺乏應(yīng)用領(lǐng)域的相關(guān)知識,是軟件開發(fā)項(xiàng)目出現(xiàn)問題的常見原因。軟件工程師不僅缺乏應(yīng)用領(lǐng)域的實(shí)際知識,他們還缺乏該領(lǐng)域的文化知識。例如,軟件開發(fā)者通過訪談、閱讀書面文件等方法了解到用戶組織的“正式”工作流程,然后用軟件實(shí)現(xiàn)了這個(gè)工作流程。但是,決定軟件系統(tǒng)成功與否的關(guān)鍵問題是,用戶組織是否真正遵守這個(gè)工作流程。對于局外人來說,這個(gè)問題更難回答。
自從1968年在聯(lián)邦德國召開的國際會議上正式提出并使用了“軟件工程”這個(gè)術(shù)語以來,研究軟件工程的專家學(xué)者們陸續(xù)提出了100多條關(guān)于軟件工程的準(zhǔn)則或“信條”。著名的軟件工程專家B.W.Boehm綜合這些學(xué)者們的意見并總結(jié)了TRW公司多年開發(fā)軟件的經(jīng)驗(yàn),于1983年在一篇論文中提出了軟件工程的7條基本原理。他認(rèn)為這7條原理是確保軟件產(chǎn)品質(zhì)量和開發(fā)效率的原理的最小集合。1.2.2軟件工程的基本原理
這7條原理是互相獨(dú)立的,其中任意6條原理的組合都不能代替另一條原理,因此,它們是缺一不可的最小集合,然而這7條原理又是相當(dāng)完備的,人們雖然不能用數(shù)學(xué)方法嚴(yán)格證明它們是一個(gè)完備的集合,但是,可以證明在此之前已經(jīng)提出的100多條軟件工程原理都可以由這7條原理的任意組合蘊(yùn)含或派生。下面簡要介紹軟件工程的7條基本原理。1.用分階段的生命周期計(jì)劃嚴(yán)格管理有人經(jīng)統(tǒng)計(jì)發(fā)現(xiàn),在不成功的軟件項(xiàng)目中有一半左右是由于計(jì)劃不周造成的,可見把建立完善的計(jì)劃作為第一條基本原理是吸取了前人的教訓(xùn)而提出來的。
在軟件開發(fā)與維護(hù)的漫長的生命周期中,需要完成許多性質(zhì)各異的工作。這條基本原理意味著,應(yīng)該把軟件生命周期劃分成若干個(gè)階段,并相應(yīng)地制定出切實(shí)可行的計(jì)劃,然后嚴(yán)格按照計(jì)劃對軟件的開發(fā)與維護(hù)工作進(jìn)行管理。不同層次的管理人員都必須嚴(yán)格按照計(jì)劃各盡其職地管理軟件開發(fā)與維護(hù)工作,絕不能受客戶或上級人員的影響而擅自背離預(yù)定計(jì)劃。2.堅(jiān)持進(jìn)行階段評審
當(dāng)時(shí)已經(jīng)認(rèn)識到,軟件的質(zhì)量保證工作不能等到編碼階段結(jié)束之后再進(jìn)行。這樣說至少有兩個(gè)理由:第一,大部分錯(cuò)誤是在編碼之前造成的,例如,根據(jù)Boehm等人的統(tǒng)計(jì),設(shè)計(jì)錯(cuò)誤占軟件錯(cuò)誤的63%,編碼錯(cuò)誤僅占37%;第二,錯(cuò)誤發(fā)現(xiàn)與改正得越晚,所需付出的代價(jià)也越高(參見圖1.1)。因此,在每個(gè)階段都進(jìn)行嚴(yán)格的評審,以便盡早發(fā)現(xiàn)在軟件開發(fā)過程中所犯的錯(cuò)誤,是一條必須遵循的重要原則。3.實(shí)行嚴(yán)格的產(chǎn)品控制在軟件開發(fā)過程中改變需求是難免的,只能依靠科學(xué)的產(chǎn)品控制技術(shù)來順應(yīng)這種要求。也就是說,當(dāng)改變需求時(shí),為了保持軟件各個(gè)配置成分的一致性,必須實(shí)行嚴(yán)格的產(chǎn)品控制,其中主要是實(shí)行基準(zhǔn)配置管理。所謂基準(zhǔn)配置又稱為基線配置,它們是經(jīng)過階段評審后的軟件配置成分?;鶞?zhǔn)配置管理也稱為變動(dòng)控制:一切有關(guān)修改軟件的建議,特別是涉及到對基準(zhǔn)配置的修改建議,都必須按照嚴(yán)格的規(guī)程進(jìn)行評審,獲得批準(zhǔn)以后才能實(shí)施修改。絕對不能誰想修改軟件,就隨意進(jìn)行修改。4.采用現(xiàn)代程序設(shè)計(jì)技術(shù)從提出軟件工程的概念開始,人們一直把主要精力用于研究各種新的程序設(shè)計(jì)技術(shù),并進(jìn)一步研究各種先進(jìn)的軟件開發(fā)與維護(hù)技術(shù)。實(shí)踐表明,采用先進(jìn)的技術(shù)不僅可以提高軟件開發(fā)和維護(hù)的效率,而且可以提高軟件產(chǎn)品的質(zhì)量。5.結(jié)果應(yīng)能清楚地審查軟件產(chǎn)品不同于一般的物理產(chǎn)品,它是看不見摸不著的邏輯產(chǎn)品。軟件開發(fā)人員(或開發(fā)小組)的工作進(jìn)展情況可見性差,難以準(zhǔn)確度量,從而使得軟件產(chǎn)品的開發(fā)過程比一般產(chǎn)品的開發(fā)過程更難于評價(jià)和管理。為了提高軟件開發(fā)過程的可見性,更好地進(jìn)行管理,應(yīng)該根據(jù)軟件開發(fā)項(xiàng)目的總目標(biāo)及完成期限,規(guī)定開發(fā)組織的責(zé)任和產(chǎn)品標(biāo)準(zhǔn),從而使得所得到的結(jié)果能夠清楚地審查。6.開發(fā)小組的人員應(yīng)該少而精這條基本原理的含義是,軟件開發(fā)小組的組成人員的素質(zhì)應(yīng)該好,而人數(shù)則不宜過多。開發(fā)小組人員的素質(zhì)和數(shù)量是影響軟件產(chǎn)品質(zhì)量和開發(fā)效率的重要因素。素質(zhì)高的人員的開發(fā)效率比素質(zhì)低的人員的開發(fā)效率可能高幾倍至幾十倍,而且素質(zhì)高的人員所開發(fā)的軟件中的錯(cuò)誤明顯少于素質(zhì)低的人員所開發(fā)的軟件中的錯(cuò)誤。此外,隨著開發(fā)小組人員數(shù)目的增加,因?yàn)榻涣髑闆r討論問題而造成的通信開銷也急劇增加。當(dāng)開發(fā)小組人員數(shù)為N時(shí),可能的通信路徑有N(N-1)/2條,可見隨著人數(shù)N的增大,通信開銷將急劇增加。因此,組成少而精的開發(fā)小組是軟件工程的一條基本原理。7.承認(rèn)不斷改進(jìn)軟件工程實(shí)踐的必要性遵循上述6條基本原理,就能夠按照當(dāng)代軟件工程基本原理實(shí)現(xiàn)軟件的工程化生產(chǎn),但是,僅有上述6條原理并不能保證軟件開發(fā)與維護(hù)的過程能趕上時(shí)代前進(jìn)的步伐,能跟上技術(shù)的不斷進(jìn)步。因此,Boehm提出應(yīng)把承認(rèn)不斷改進(jìn)軟件工程實(shí)踐的必要性作為軟件工程的第7條基本原理。按照這條原理,不僅要積極主動(dòng)地采納新的軟件技術(shù),而且要注意不斷總結(jié)經(jīng)驗(yàn)。
軟件工程包括技術(shù)和管理兩方面的內(nèi)容,是技術(shù)與管理緊密結(jié)合所形成的工程學(xué)科。所謂管理就是通過計(jì)劃、組織和控制等一系列活動(dòng),合理地配置和使用各種資源,以達(dá)到既定目標(biāo)的過程。通常把在軟件生命周期全過程中使用的一整套技術(shù)方法的集合稱為方法學(xué)(methodology),也稱為范型(paradigm)。在軟件工程領(lǐng)域中,這兩個(gè)術(shù)語的含義基本相同。1.2.3軟件工程方法學(xué)
軟件工程方法學(xué)包含3個(gè)要素:方法、工具和過程。其中,方法是完成軟件開發(fā)的各項(xiàng)任務(wù)的技術(shù)方法,回答“怎樣做”的問題;工具是為運(yùn)用方法而提供的自動(dòng)的或半自動(dòng)的軟件工程支撐環(huán)境;過程是為了獲得高質(zhì)量的軟件所需要完成的一系列任務(wù)的框架,它規(guī)定了完成各項(xiàng)任務(wù)的工作步驟。目前使用得最廣泛的軟件工程方法學(xué),分別是傳統(tǒng)方法學(xué)和面向?qū)ο蠓椒▽W(xué)。1.傳統(tǒng)方法學(xué)傳統(tǒng)方法學(xué)也稱為生命周期方法學(xué)或結(jié)構(gòu)化范型。它采用結(jié)構(gòu)化技術(shù)(結(jié)構(gòu)化分析、結(jié)構(gòu)化設(shè)計(jì)和結(jié)構(gòu)化實(shí)現(xiàn))來完成軟件開發(fā)的各項(xiàng)任務(wù),并使用適當(dāng)?shù)能浖ぞ呋蜍浖こ汰h(huán)境來支持結(jié)構(gòu)化技術(shù)的運(yùn)用。這種方法學(xué)把軟件生命周期的全過程依次劃分為若干個(gè)階段,然后順序地完成每個(gè)階段的任務(wù)。采用這種方法學(xué)開發(fā)軟件的時(shí)候,從對問題的抽象邏輯分析開始,一個(gè)階段一個(gè)階段地進(jìn)行開發(fā)。
前一個(gè)階段任務(wù)的完成是開始進(jìn)行后一個(gè)階段工作的前提和基礎(chǔ),而后一階段任務(wù)的完成通常是使前一階段提出的解法更進(jìn)一步具體化,加進(jìn)了更多的實(shí)現(xiàn)細(xì)節(jié)。每一個(gè)階段的開始和結(jié)束都有嚴(yán)格標(biāo)準(zhǔn),對于任何兩個(gè)相鄰的階段而言,前一階段的結(jié)束標(biāo)準(zhǔn)就是后一階段的開始標(biāo)準(zhǔn)。在每一個(gè)階段結(jié)束之前都必須進(jìn)行正式嚴(yán)格的技術(shù)審查和管理復(fù)審,從技術(shù)和管理兩方面對這個(gè)階段的開發(fā)成果進(jìn)行檢查,通過之后這個(gè)階段才算結(jié)束;如果沒通過檢查,則必須進(jìn)行必要的返工,而且返工后還要再經(jīng)過審查。審查的一條主要標(biāo)準(zhǔn)就是每個(gè)階段都應(yīng)該交出“最新式的”(即和所開發(fā)的軟件完全一致的)高質(zhì)量的文檔資料,從而保證在軟件開發(fā)工程結(jié)束時(shí)有一個(gè)完整準(zhǔn)確的軟件配置交付使用。文檔是通信的工具,它們清楚準(zhǔn)確地說明了到這個(gè)時(shí)候?yàn)橹?,關(guān)于該項(xiàng)工程已經(jīng)知道了什么,同時(shí)奠定了下一步工作的基礎(chǔ)。此外,文檔也起備忘錄的作用,如果文檔不完整,那么一定是某些工作忘記做了,在進(jìn)入生命周期的下一個(gè)階段之前,必須補(bǔ)足這些遺漏的細(xì)節(jié)。把軟件生命周期劃分成若干個(gè)階段,每個(gè)階段的任務(wù)相對獨(dú)立,而且比較簡單,便于不同人員分工協(xié)作,從而降低了整個(gè)軟件開發(fā)工程的困難程度;在軟件生命周期的每個(gè)階段都采用科學(xué)的管理技術(shù)和良好的技術(shù)方法,而且在每個(gè)階段結(jié)束之前都從技術(shù)和管理兩個(gè)角度進(jìn)行嚴(yán)格的審查,合格之后才開始下一階段的工作,這就使軟件開發(fā)工程的全過程以一種有條不紊的方式進(jìn)行,保證了軟件的質(zhì)量,特別是提高了軟件的可維護(hù)性??傊?,采用生命周期方法學(xué)可以大大提高軟件開發(fā)的成功率,軟件開發(fā)的生產(chǎn)率也能明顯提高。
目前,傳統(tǒng)方法學(xué)仍然是人們在開發(fā)軟件時(shí)使用得十分廣泛的軟件工程方法學(xué)。這種方法學(xué)歷史悠久,為廣大軟件工程師所熟悉,而且在開發(fā)某些類型的軟件時(shí)也比較有效,因此,在相當(dāng)長一段時(shí)期內(nèi)這種方法學(xué)還會有生命力。此外,如果沒有完全理解傳統(tǒng)方法學(xué),也就不能深入理解這種方法學(xué)與面向?qū)ο蠓椒▽W(xué)的差別以及面向?qū)ο蠓椒▽W(xué)為何優(yōu)于傳統(tǒng)方法學(xué)。因此,本書不僅講述面向?qū)ο蠓椒▽W(xué),也講述傳統(tǒng)方法學(xué)。2.面向?qū)ο蠓椒▽W(xué)當(dāng)軟件規(guī)模龐大,或者對軟件的需求是模糊的或會隨時(shí)間而變化的時(shí)候,使用傳統(tǒng)方法學(xué)開發(fā)軟件往往不成功,此外,使用傳統(tǒng)方法學(xué)開發(fā)出的軟件,維護(hù)起來仍然很困難。結(jié)構(gòu)化范型只能獲得有限成功的一個(gè)重要原因是,這種技術(shù)要么面向行為(即對數(shù)據(jù)的操作),要么面向數(shù)據(jù),還沒有既面向數(shù)據(jù)又面向行為的結(jié)構(gòu)化技術(shù)。眾所周知,軟件系統(tǒng)本質(zhì)上是信息處理系統(tǒng)。離開了操作便無法更改數(shù)據(jù),而脫離了數(shù)據(jù)的操作是毫無意義的。數(shù)據(jù)和對數(shù)據(jù)的處理原本是密切相關(guān)的,把數(shù)據(jù)和操作人為地分離成兩個(gè)獨(dú)立的部分,自然會增加軟件開發(fā)與維護(hù)的難度。與傳統(tǒng)方法相反,面向?qū)ο蠓椒ò褦?shù)據(jù)和行為看成同等重要,它是一種以數(shù)據(jù)為主線,把數(shù)據(jù)和對數(shù)據(jù)的操作緊密地結(jié)合起來的方法。概括地說,面向?qū)ο蠓椒▽W(xué)具有下述4個(gè)要點(diǎn)。(1)把對象(object)作為融合了數(shù)據(jù)及在數(shù)據(jù)上的操作行為的統(tǒng)一的軟件構(gòu)件。面向?qū)ο蟪绦蚴怯蓪ο蠼M成的,程序中任何元素都是對象,復(fù)雜對象由比較簡單的對象組合而成。也就是說,用對象分解取代了傳統(tǒng)方法的功能分解。(2)把所有對象都劃分成類(class)。每個(gè)類都定義了一組數(shù)據(jù)和一組操作,類是對具有相同數(shù)據(jù)和相同操作的一組相似對象的定義。數(shù)據(jù)用于表示對象的靜態(tài)屬性,是對象的狀態(tài)信息,而施加于數(shù)據(jù)之上的操作用于實(shí)現(xiàn)對象的動(dòng)態(tài)行為。(3)按照父類(或稱為基類)與子類(或稱為派生類)的關(guān)系,把若干個(gè)相關(guān)類組成一個(gè)層次結(jié)構(gòu)的系統(tǒng)(也稱為類等級)。在類等級中,下層派生類自動(dòng)擁有上層基類中定義的數(shù)據(jù)和操作,這種現(xiàn)象稱為繼承。(4)對象彼此間僅能通過發(fā)送消息互相聯(lián)系。對象與傳統(tǒng)數(shù)據(jù)有本質(zhì)區(qū)別,它不是被動(dòng)地等待外界對它施加操作,相反,它是數(shù)據(jù)處理的主體,必須向它發(fā)消息請求它執(zhí)行它的某個(gè)操作以處理它的數(shù)據(jù),而不能從外界直接對它的數(shù)據(jù)進(jìn)行處理。也就是說,對象的所有私有信息都被封裝在該對象內(nèi),不能從外界直接訪問,這就是通常所說的封裝性。
面向?qū)ο蠓椒▽W(xué)的出發(fā)點(diǎn)和基本原則,是盡量模擬人類習(xí)慣的思維方式,使開發(fā)軟件的方法與過程盡可能接近人類認(rèn)識世界解決問題的方法與過程,從而使描述問題的問題空間(也稱為問題域)與實(shí)現(xiàn)解法的解空間(也稱為求解域)在結(jié)構(gòu)上盡可能一致。傳統(tǒng)方法學(xué)強(qiáng)調(diào)自頂向下順序地完成軟件開發(fā)的各階段任務(wù)。事實(shí)上,人類認(rèn)識客觀世界解決現(xiàn)實(shí)問題的過程,是一個(gè)漸進(jìn)的過程。人的認(rèn)識需要在繼承已有的有關(guān)知識的基礎(chǔ)上,經(jīng)過多次反復(fù)才能逐步深化。在人的認(rèn)識深化過程中,既包括了從一般到特殊的演繹思維過程,也包括了從特殊到一般的歸納思維過程。用面向?qū)ο蠓椒▽W(xué)開發(fā)軟件的過程,是一個(gè)主動(dòng)地多次反復(fù)迭代的演化過程。面向?qū)ο蠓椒ㄔ诟拍詈捅硎痉椒ㄉ系囊恢滦?,保證了在各項(xiàng)開發(fā)活動(dòng)之間的平滑(即無縫)過渡。面向?qū)ο蠓椒ㄆ毡檫M(jìn)行的對象分類過程,支持從特殊到一般的歸納思維過程;通過建立類等級而獲得的繼承性,支持從一般到特殊的演繹思維過程。正確地運(yùn)用面向?qū)ο蠓椒▽W(xué)開發(fā)軟件,則最終的軟件產(chǎn)品由許多較小的、基本上獨(dú)立的對象組成,每個(gè)對象相當(dāng)于一個(gè)微型程序,而且大多數(shù)對象都與現(xiàn)實(shí)世界中的實(shí)體相對應(yīng),因此,降低了軟件產(chǎn)品的復(fù)雜性,提高了軟件的可理解性,簡化了軟件的開發(fā)和維護(hù)工作。對象是相對獨(dú)立的實(shí)體,容易在以后的軟件產(chǎn)品中重復(fù)使用,因此,面向?qū)ο蠓缎偷牧硪粋€(gè)重要優(yōu)點(diǎn)是促進(jìn)了軟件重用。面向?qū)ο蠓椒ㄌ赜械睦^承性和多態(tài)性,進(jìn)一步提高了面向?qū)ο筌浖目芍赜眯浴?/p>
概括地說,軟件生命周期由軟件定義、軟件開發(fā)和運(yùn)行維護(hù)(也稱為軟件維護(hù))3個(gè)時(shí)期組成,每個(gè)時(shí)期又進(jìn)一步劃分成若干個(gè)階段。軟件定義時(shí)期的任務(wù)是:確定軟件開發(fā)工程必須完成的總目標(biāo);確定工程的可行性;導(dǎo)出實(shí)現(xiàn)工程目標(biāo)應(yīng)該采用的策略及系統(tǒng)必須完成的功能;估計(jì)完成該項(xiàng)工程需要的資源和成本,并且制定工程進(jìn)度表。這個(gè)時(shí)期的工作通常又稱為系統(tǒng)分析,由系統(tǒng)分析員負(fù)責(zé)完成。軟件定義時(shí)期通常進(jìn)一步劃分成3個(gè)階段,即問題定義、可行性研究和需求分析。1.3軟件生命周期開發(fā)時(shí)期具體設(shè)計(jì)和實(shí)現(xiàn)在前一個(gè)時(shí)期定義的軟件,它通常由下述4個(gè)階段組成:總體設(shè)計(jì),詳細(xì)設(shè)計(jì),編碼和單元測試,綜合測試。其中前兩個(gè)階段又稱為系統(tǒng)設(shè)計(jì),后兩個(gè)階段又稱為系統(tǒng)實(shí)現(xiàn)。維護(hù)時(shí)期的主要任務(wù)是使軟件持久地滿足用戶的需要。具體地說,當(dāng)軟件在使用過程中發(fā)現(xiàn)錯(cuò)誤時(shí)應(yīng)該加以改正;當(dāng)環(huán)境改變時(shí)應(yīng)該修改軟件以適應(yīng)新的環(huán)境;當(dāng)用戶有新要求時(shí)應(yīng)該及時(shí)改進(jìn)軟件以滿足用戶的新需要。通常對維護(hù)時(shí)期不再進(jìn)一步劃分階段,但是每一次維護(hù)活動(dòng)本質(zhì)上都是一次壓縮和簡化了的定義和開發(fā)過程。下面扼要介紹軟件生命周期每個(gè)階段的基本任務(wù)。1.問題定義問題定義階段必須回答的關(guān)鍵問題是:“要解決的問題是什么?”如果不知道問題是什么就試圖解決這個(gè)問題,顯然是盲目的,只會白白浪費(fèi)時(shí)間和金錢,最終得出的結(jié)果很可能是毫無意義的。盡管確切地定義問題的必要性是十分明顯的,但是在實(shí)踐中它卻可能是最容易被忽視的一個(gè)步驟。通過對客戶的訪問調(diào)查,系統(tǒng)分析員扼要地寫出關(guān)于問題性質(zhì)、工程目標(biāo)和工程規(guī)模的書面報(bào)告,經(jīng)過討論和必要的修改之后這份報(bào)告應(yīng)該得到客戶的確認(rèn)。2.可行性研究這個(gè)階段要回答的關(guān)鍵問題是:“對于上一個(gè)階段所確定的問題有行得通的解決辦法嗎?”為了回答這個(gè)問題,系統(tǒng)分析員需要進(jìn)行一次大大壓縮和簡化了的系統(tǒng)分析和設(shè)計(jì)過程,也就是在較抽象的高層次上進(jìn)行的分析和設(shè)計(jì)過程。可行性研究應(yīng)該比較簡短,這個(gè)階段的任務(wù)不是具體解決問題,而是研究問題的范圍,探索這個(gè)問題是否值得去解,是否有可行的解決辦法??尚行匝芯康慕Y(jié)果是使用部門負(fù)責(zé)人作出是否繼續(xù)進(jìn)行這項(xiàng)工程的決定的重要依據(jù),一般說來,只有投資可能取得較大效益的那些工程項(xiàng)目才值得繼續(xù)進(jìn)行下去??尚行匝芯恳院蟮哪切╇A段將需要投入更多的人力物力。及時(shí)終止不值得投資的工程項(xiàng)目,可以避免更大的浪費(fèi)。3.需求分析這個(gè)階段的任務(wù)仍然不是具體地解決問題,而是準(zhǔn)確地確定“為了解決這個(gè)問題,目標(biāo)系統(tǒng)必須做什么”,主要是確定目標(biāo)系統(tǒng)必須具備哪些功能。用戶了解他們所面對的問題,知道必須做什么,但通常不能完整準(zhǔn)確地表達(dá)出他們的要求,更不知道怎樣利用計(jì)算機(jī)解決他們的問題;軟件開發(fā)人員知道怎樣用軟件實(shí)現(xiàn)人們的要求,但是對特定用戶的具體要求并不完全清楚。因此,系統(tǒng)分析員在需求分析階段必須和用戶密切配合,充分交流信息,以得出經(jīng)過用戶確認(rèn)的系統(tǒng)邏輯模型。通常用數(shù)據(jù)流圖、數(shù)據(jù)字典和簡要的算法表示系統(tǒng)的邏輯模型。在需求分析階段確定的系統(tǒng)邏輯模型是以后設(shè)計(jì)和實(shí)現(xiàn)目標(biāo)系統(tǒng)的基礎(chǔ),因此必須準(zhǔn)確完整地體現(xiàn)用戶的要求。這個(gè)階段的一項(xiàng)重要任務(wù),是用正式文檔準(zhǔn)確地記錄對目標(biāo)系統(tǒng)的需求,這份文檔通常稱為規(guī)格說明書(specification)。4.總體設(shè)計(jì)這個(gè)階段必須回答的關(guān)鍵問題是:“概括地說,應(yīng)該怎樣實(shí)現(xiàn)目標(biāo)系統(tǒng)?”總體設(shè)計(jì)又稱為概要設(shè)計(jì)。首先,應(yīng)該設(shè)計(jì)出實(shí)現(xiàn)目標(biāo)系統(tǒng)的幾種可能的方案。通常至少應(yīng)該設(shè)計(jì)出低成本、中等成本和高成本等3種方案。軟件工程師應(yīng)該用適當(dāng)?shù)谋磉_(dá)工具描述每種方案,分析每種方案的優(yōu)缺點(diǎn),并在充分權(quán)衡各種方案的利弊的基礎(chǔ)上,推薦一個(gè)最佳方案。此外,還應(yīng)該制定出實(shí)現(xiàn)最佳方案的詳細(xì)計(jì)劃。如果客戶接受所推薦的方案,則應(yīng)該進(jìn)一步完成下述的另一項(xiàng)主要任務(wù)。
上述設(shè)計(jì)工作確定了解決問題的策略及目標(biāo)系統(tǒng)中應(yīng)包含的程序,但是,怎樣設(shè)計(jì)這些程序呢?軟件設(shè)計(jì)的一條基本原理就是,程序應(yīng)該模塊化,也就是說,一個(gè)程序應(yīng)該由若干個(gè)規(guī)模適中的模塊按合理的層次結(jié)構(gòu)組織而成。因此,總體設(shè)計(jì)的另一項(xiàng)主要任務(wù)就是設(shè)計(jì)程序的體系結(jié)構(gòu),也就是確定程序由哪些模塊組成以及模塊間的關(guān)系。5.詳細(xì)設(shè)計(jì)
總體設(shè)計(jì)階段以比較抽象概括的方式提出了解決問題的辦法。詳細(xì)設(shè)計(jì)階段的任務(wù)就是把解法具體化,也就是回答下面這個(gè)關(guān)鍵問題:“應(yīng)該怎樣具體地實(shí)現(xiàn)這個(gè)系統(tǒng)呢?”這個(gè)階段的任務(wù)還不是編寫程序,而是設(shè)計(jì)出程序的詳細(xì)規(guī)格說明。這種規(guī)格說明的作用很類似于其他工程領(lǐng)域中工程師經(jīng)常使用的工程藍(lán)圖,它們應(yīng)該包含必要的細(xì)節(jié),程序員可以根據(jù)它們寫出實(shí)際的程序代碼。詳細(xì)設(shè)計(jì)也稱為模塊設(shè)計(jì),在這個(gè)階段將詳細(xì)地設(shè)計(jì)每個(gè)模塊,確定實(shí)現(xiàn)模塊功能所需要的算法和數(shù)據(jù)結(jié)構(gòu)。6.編碼和單元測試這個(gè)階段的關(guān)鍵任務(wù)是寫出正確的容易理解、容易維護(hù)的程序模塊。程序員應(yīng)該根據(jù)目標(biāo)系統(tǒng)的性質(zhì)和實(shí)際環(huán)境,選取一種適當(dāng)?shù)母呒壋绦蛟O(shè)計(jì)語言(必要時(shí)用匯編語言),把詳細(xì)設(shè)計(jì)的結(jié)果翻譯成用選定的語言書寫的程序,并且仔細(xì)測試編寫出的每一個(gè)模塊。7.綜合測試這個(gè)階段的關(guān)鍵任務(wù)是通過各種類型的測試(及相應(yīng)的調(diào)試)使軟件達(dá)到預(yù)定的要求。最基本的測試是集成測試和驗(yàn)收測試。所謂集成測試是根據(jù)設(shè)計(jì)的軟件結(jié)構(gòu),把經(jīng)過單元測試檢驗(yàn)的模塊按某種選定的策略裝配起來,在裝配過程中對程序進(jìn)行必要的測試。所謂驗(yàn)收測試則是按照規(guī)格說明書的規(guī)定,由用戶對目標(biāo)系統(tǒng)進(jìn)行驗(yàn)收。
必要時(shí)還可以再通過現(xiàn)場測試或平行運(yùn)行等方法對目標(biāo)系統(tǒng)進(jìn)一步測試檢驗(yàn)。為了使用戶能夠積極參加驗(yàn)收測試,并且在系統(tǒng)投入生產(chǎn)性運(yùn)行以后能夠正確有效地使用這個(gè)系統(tǒng),通常需要以正式的或非正式的方式對用戶進(jìn)行培訓(xùn)。通過對軟件測試結(jié)果的分析可以預(yù)測軟件的可靠性;反之,根據(jù)對軟件可靠性的要求,也可以決定測試和調(diào)試過程什么時(shí)候可以結(jié)束。應(yīng)該用正式的文檔資料把測試計(jì)劃、詳細(xì)測試方案以及實(shí)際測試結(jié)果保存下來,作為軟件配置的一個(gè)組成部分。8.軟件維護(hù)維護(hù)階段的關(guān)鍵任務(wù)是,通過各種必要的維護(hù)活動(dòng)使系統(tǒng)持久地滿足用戶的需要。通常有4類維護(hù)活動(dòng):改正性維護(hù),也就是診斷和改正在使用過程中發(fā)現(xiàn)的軟件錯(cuò)誤;適應(yīng)性維護(hù),即修改軟件以適應(yīng)環(huán)境的變化;完善性維護(hù),即根據(jù)用戶的要求改進(jìn)或擴(kuò)充軟件使它更完善;預(yù)防性維護(hù),即修改軟件為將來的維護(hù)活動(dòng)預(yù)先做準(zhǔn)備。雖然沒有把維護(hù)階段進(jìn)一步劃分成更小的階段,但是實(shí)際上每一項(xiàng)維護(hù)活動(dòng)都應(yīng)該經(jīng)過提出維護(hù)要求(或報(bào)告問題),分析維護(hù)要求,提出維護(hù)方案,審批維護(hù)方案,確定維護(hù)計(jì)劃,修改軟件設(shè)計(jì),修改程序,測試程序,復(fù)查驗(yàn)收等一系列步驟,因此實(shí)質(zhì)上是經(jīng)歷了一次壓縮和簡化了的軟件定義和開發(fā)的全過程。每一項(xiàng)維護(hù)活動(dòng)都應(yīng)該準(zhǔn)確地記錄下來,作為正式的文檔資料加以保存。在實(shí)際從事軟件開發(fā)工作時(shí),軟件規(guī)模、種類、開發(fā)環(huán)境及開發(fā)時(shí)使用的技術(shù)方法等因素,都影響階段的劃分。軟件過程是為了獲得高質(zhì)量軟件所需要完成的一系列任務(wù)的框架,它規(guī)定了完成各項(xiàng)任務(wù)的工作步驟。在完成開發(fā)任務(wù)時(shí)必須進(jìn)行一些開發(fā)活動(dòng),并且使用適當(dāng)?shù)馁Y源,在過程結(jié)束時(shí)將把輸入轉(zhuǎn)化為輸出。因此,ISO9000把過程定義為“使用資源將輸入轉(zhuǎn)化為輸出的活動(dòng)所構(gòu)成的系統(tǒng)?!贝颂帲跋到y(tǒng)”的含義是廣義的:“系統(tǒng)是相互關(guān)聯(lián)或相互作用的一組要素?!?.4軟件過程過程定義了運(yùn)用方法的順序、應(yīng)該交付的文檔資料、為保證軟件質(zhì)量和協(xié)調(diào)變化所需要采取的管理措施,以及標(biāo)志軟件開發(fā)各個(gè)階段任務(wù)完成的里程碑。為獲得高質(zhì)量的軟件產(chǎn)品,軟件過程必須科學(xué)、有效。沒有一個(gè)適用于所有軟件項(xiàng)目的任務(wù)集合。因此,科學(xué)、有效的軟件過程應(yīng)該定義一組適合于所承擔(dān)的項(xiàng)目特點(diǎn)的任務(wù)集合。通常,一個(gè)任務(wù)集合包括一組軟件工程任務(wù)、里程碑和應(yīng)該交付的產(chǎn)品。通常使用生命周期模型簡潔地描述軟件過程。生命周期模型規(guī)定了把生命周期劃分成哪些階段及各個(gè)階段的執(zhí)行順序,因此,也稱為過程模型。實(shí)際從事軟件開發(fā)工作時(shí)應(yīng)該根據(jù)所承擔(dān)的項(xiàng)目的特點(diǎn)來劃分階段,但是,下面講述典型的軟件過程模型時(shí)并不是針對某個(gè)特定項(xiàng)目講的,因此只能使用“通用的”階段劃分方法。由于瀑布模型與快速原型模型的主要區(qū)別是獲取用戶需求的方法不同,因此,下面在介紹生命周期模型時(shí)把“規(guī)格說明”作為一個(gè)階段獨(dú)立出來。此外,問題定義和可行性研究的主要任務(wù)都是概括地了解用戶的需求,為了簡潔地描述軟件過程,把它們都?xì)w并到需求分析中去了。同樣,為了簡潔起見,把總體設(shè)計(jì)和詳細(xì)設(shè)計(jì)合并在一起稱為“設(shè)計(jì)”。
在20世紀(jì)80年代之前,瀑布模型一直是惟一被廣泛采用的生命周期模型,現(xiàn)在它仍然是軟件工程中應(yīng)用得最廣泛的過程模型。傳統(tǒng)軟件工程方法學(xué)的軟件過程,基本上可以用瀑布模型來描述。圖1.2所示為傳統(tǒng)的瀑布模型。按照傳統(tǒng)的瀑布模型開發(fā)軟件,有下述的幾個(gè)特點(diǎn)。1.4.1瀑布模型圖1.2傳統(tǒng)的瀑布模型1.階段間具有順序性和依賴性這個(gè)特點(diǎn)有兩重含義:①必須等前一階段的工作完成之后,才能開始后一階段的工作;②前一階段的輸出文檔就是后一階段的輸入文檔,因此,只有前一階段的輸出文檔正確,后一階段的工作才能獲得正確的結(jié)果。2.推遲實(shí)現(xiàn)的觀點(diǎn)對于規(guī)模較大的軟件項(xiàng)目來說,往往編碼開始得越早最終完成開發(fā)工作所需要的時(shí)間反而越長。這是因?yàn)椋懊骐A段的工作沒做或做得不扎實(shí),過早地考慮進(jìn)行程序?qū)崿F(xiàn),往往導(dǎo)致大量返工,有時(shí)甚至發(fā)生無法彌補(bǔ)的問題,帶來災(zāi)難性后果。瀑布模型在編碼之前設(shè)置了系統(tǒng)分析與系統(tǒng)設(shè)計(jì)的各個(gè)階段,分析與設(shè)計(jì)階段的基本任務(wù)規(guī)定,在這兩個(gè)階段主要考慮目標(biāo)系統(tǒng)的邏輯模型,不涉及軟件的物理實(shí)現(xiàn)。清楚地區(qū)分邏輯設(shè)計(jì)與物理設(shè)計(jì),盡可能推遲程序的物理實(shí)現(xiàn),是按照瀑布模型開發(fā)軟件的一條重要的指導(dǎo)思想。3.質(zhì)量保證的觀點(diǎn)軟件工程的基本目標(biāo)是優(yōu)質(zhì)、高產(chǎn)。為了保證所開發(fā)的軟件的質(zhì)量,在瀑布模型的每個(gè)階段都應(yīng)堅(jiān)持兩個(gè)重要做法:(1)每個(gè)階段都必須完成規(guī)定的文檔,沒有交出合格的文檔就是沒有完成該階段的任務(wù)。完整、準(zhǔn)確的合格文檔不僅是軟件開發(fā)時(shí)期各類人員之間相互通信的媒介,也是運(yùn)行時(shí)期對軟件進(jìn)行維護(hù)的重要依據(jù)。(2)每個(gè)階段結(jié)束前都要對所完成的文檔進(jìn)行評審,以便盡早發(fā)現(xiàn)問題,改正錯(cuò)誤。事實(shí)上,障改正錯(cuò)誤所需付出的代價(jià)也越越是早期階段犯下的錯(cuò)誤,暴露出來的時(shí)間就越晚,排除故高。因此,及時(shí)審查,是保證軟件質(zhì)量,降低軟件成本的重要措施。傳統(tǒng)的瀑布模型過于理想化了,事實(shí)上,人在工作過程中不可能不犯錯(cuò)誤。在設(shè)計(jì)階段可能發(fā)現(xiàn)規(guī)格說明文檔中的錯(cuò)誤,而設(shè)計(jì)上的缺陷或錯(cuò)誤可能在實(shí)現(xiàn)過程中顯現(xiàn)出來,在綜合測試階段將發(fā)現(xiàn)需求分析、設(shè)計(jì)或編碼階段的許多錯(cuò)誤。因此,實(shí)際的瀑布模型是帶“反饋環(huán)”的,如圖1.3所示(圖中實(shí)線箭頭表示開發(fā)過程,虛線箭頭表示維護(hù)過程)。當(dāng)在后面階段發(fā)現(xiàn)前面階段的錯(cuò)誤時(shí),需要沿圖中左側(cè)的反饋線返回前面的階段,修正前面階段的產(chǎn)品之后再回來繼續(xù)完成后面階段的任務(wù)。圖1.3實(shí)際的瀑布模型瀑布模型有許多優(yōu)點(diǎn):可強(qiáng)迫開發(fā)人員采用規(guī)范的方法(例如,結(jié)構(gòu)化技術(shù));嚴(yán)格地規(guī)定了每個(gè)階段必須提交的文檔;要求每個(gè)階段交出的所有產(chǎn)品都必須經(jīng)過質(zhì)量保證小組的仔細(xì)驗(yàn)證。各個(gè)階段產(chǎn)生的文檔是維護(hù)軟件產(chǎn)品時(shí)必不可少的,沒有文檔的軟件幾乎是不可能維護(hù)的。遵守瀑布模型的文檔約束,將使軟件維護(hù)變得比較容易一些。由于絕大部分軟件預(yù)算都花費(fèi)在軟件維護(hù)上,因此,使軟件變得比較容易維護(hù)就能顯著降低軟件預(yù)算??梢哉f,瀑布模型的成功在很大程度上是由于它基本上是一種文檔驅(qū)動(dòng)的模型。但是,“瀑布模型是由文檔驅(qū)動(dòng)的”這個(gè)事實(shí)也是它的一個(gè)主要缺點(diǎn)。在可運(yùn)行的軟件產(chǎn)品交付給用戶之前,用戶只能通過文檔來了解產(chǎn)品是什么樣的。但是,僅僅通過寫在紙上的靜態(tài)的規(guī)格說明,很難全面正確地認(rèn)識動(dòng)態(tài)的軟件產(chǎn)品。而且事實(shí)證明,一旦一個(gè)用戶開始使用一個(gè)軟件,在他的頭腦中關(guān)于該軟件應(yīng)該做什么的想法就會或多或少地發(fā)生變化,這就使得最初提出的需求變得不完全適用了。事實(shí)上,要求用戶不經(jīng)過實(shí)踐就提出完整準(zhǔn)確的需求,在許多情況下都是不切實(shí)際的??傊?,由于瀑布模型幾乎完全依賴于書面的規(guī)格說明,很可能導(dǎo)致最終開發(fā)出的軟件產(chǎn)品不能真正滿足用戶的需要。所謂快速原型是快速建立起來的可以在計(jì)算機(jī)上運(yùn)行的程序,它所能完成的功能往往是最終產(chǎn)品能完成的功能的一個(gè)子集。如圖1.4所示(圖中實(shí)線箭頭表示開發(fā)過程,虛線箭頭表示維護(hù)過程),快速原型模型的第一步是快速建立一個(gè)能反映用戶主要需求的原型系統(tǒng),讓用戶在計(jì)算機(jī)上試用它,通過實(shí)踐來了解目標(biāo)系統(tǒng)的概貌。1.4.2快速原型模型通常,用戶試用原型系統(tǒng)之后會提出許多修改意見,開發(fā)人員按照用戶的意見快速地修改原型系統(tǒng),然后再次請用戶試用……一旦用戶認(rèn)為這個(gè)原型系統(tǒng)確實(shí)能做他們所需要的工作,開發(fā)人員便可據(jù)此書寫規(guī)格說明文檔,根據(jù)這份文檔開發(fā)出的軟件可以滿足用戶的真實(shí)需求。從圖1.4可以看出,快速原型模型是不帶反饋環(huán)的,這正是這種過程模型的主要優(yōu)點(diǎn):軟件產(chǎn)品的開發(fā)基本上是線性順序進(jìn)行的。能做到基本上線性順序開發(fā)的主要原因如下:圖1.4快速原型模型(1)原型系統(tǒng)已經(jīng)通過與用戶交互而得到驗(yàn)證,據(jù)此產(chǎn)生的規(guī)格說明文檔正確地描述了用戶需求,因此,在開發(fā)過程的后續(xù)階段不會因?yàn)榘l(fā)現(xiàn)了規(guī)格說明文檔的錯(cuò)誤而進(jìn)行較大的返工。(2)開發(fā)人員通過建立原型系統(tǒng)已經(jīng)學(xué)到了許多東西(至少知道了“系統(tǒng)不應(yīng)該做什么,以及怎樣不去做不該做的事情”),因此,在設(shè)計(jì)和編碼階段發(fā)生錯(cuò)誤的可能性也比較小,這自然減少了在后續(xù)階段需要改正前面階段所犯錯(cuò)誤的可能性。
軟件產(chǎn)品一旦交付給用戶使用之后,維護(hù)便開始了。根據(jù)所需完成的維護(hù)工作種類的不同,可能需要返回到需求分析、規(guī)格說明、設(shè)計(jì)或編碼等不同階段,如圖1.4中虛線箭頭所示??焖僭偷谋举|(zhì)是“快速”。開發(fā)人員應(yīng)該盡可能快地建造出原型系統(tǒng),以加速軟件開發(fā)過程,節(jié)約軟件開發(fā)成本。原型的用途是獲知用戶的真正需求,一旦需求確定了,原型將被拋棄。因此,原型系統(tǒng)的內(nèi)部結(jié)構(gòu)并不重要,重要的是,必須迅速地構(gòu)建原型然后根據(jù)用戶意見迅速地修改原型。
UNIXShell和超文本都是廣泛使用的快速原型語言,最近的趨勢是,廣泛地使用第四代語言(4GL)構(gòu)建快速原型。當(dāng)快速原型的某個(gè)部分是利用軟件工具由計(jì)算機(jī)自動(dòng)生成的時(shí)候,可以把這部分用到最終的軟件產(chǎn)品中。
增量模型也稱為漸增模型,如圖1.5所示。使用增量模型開發(fā)軟件時(shí),把軟件產(chǎn)品作為一系列的增量構(gòu)件來設(shè)計(jì)、編碼、集成和測試。每個(gè)構(gòu)件由多個(gè)相互作用的模塊構(gòu)成,并且能夠完成特定的功能。使用增量模型時(shí),第一個(gè)增量構(gòu)件往往實(shí)現(xiàn)軟件的基本需求,提供最核心的功能。第二個(gè)增量構(gòu)件提供更完善的編輯和文檔生成功能;第三個(gè)增量構(gòu)件實(shí)現(xiàn)拼寫和語法檢查功能;第四個(gè)增量構(gòu)件完成高級的頁面排版功能。1.4.3增量模型把軟件產(chǎn)品分解成增量構(gòu)件時(shí),應(yīng)該使構(gòu)件的規(guī)模適中,規(guī)模過大或過小都不好。最佳分解方法因軟件產(chǎn)品特點(diǎn)和開發(fā)人員的習(xí)慣而異。分解時(shí)惟一必須遵守的約束條件是,當(dāng)把新構(gòu)件集成到現(xiàn)有軟件中時(shí),所形成的產(chǎn)品必須是可測試的。
采用瀑布模型或快速原型模型開發(fā)軟件時(shí),目標(biāo)都是一次就把一個(gè)滿足所有需求的產(chǎn)品提交給用戶。增量模型則與之相反,它分批地逐步向用戶提交產(chǎn)品,整個(gè)軟件產(chǎn)品被分解成許多個(gè)增量構(gòu)件,開發(fā)人員一個(gè)構(gòu)件接一個(gè)構(gòu)件地向用戶提交產(chǎn)品。從第一個(gè)構(gòu)件交付之日起,用戶就能做一些有用的工作。顯然,能在較短時(shí)間內(nèi)向用戶提交可完成部分工作的產(chǎn)品,是增量模型的一個(gè)優(yōu)點(diǎn)。圖1.5增量模型增量模型的另一個(gè)優(yōu)點(diǎn)是,逐步增加產(chǎn)品功能可以使用戶有較充裕的時(shí)間學(xué)習(xí)和適應(yīng)新產(chǎn)品,從而減少一個(gè)全新的軟件可能給客戶組織帶來的沖擊。使用增量模型的困難是,在把每個(gè)新的增量構(gòu)件集成到現(xiàn)有軟件體系結(jié)構(gòu)中時(shí),必須不破壞原來已經(jīng)開發(fā)出的產(chǎn)品。此外,必須把軟件的體系結(jié)構(gòu)設(shè)計(jì)得便于按這種方式進(jìn)行擴(kuò)充,向現(xiàn)有產(chǎn)品中加入新構(gòu)件的過程必須簡單、方便,也就是說,軟件體系結(jié)構(gòu)必須是開放的。但是,從長遠(yuǎn)觀點(diǎn)看,具有開放結(jié)構(gòu)的軟件擁有真正的優(yōu)勢,這樣的軟件的可維護(hù)性明顯好于封閉結(jié)構(gòu)的軟件。
因此,盡管采用增量模型比采用瀑布模型和快速原型模型需要更精心的設(shè)計(jì),但在設(shè)計(jì)階段多付出的勞動(dòng)將在維護(hù)階段獲得回報(bào)。如果一個(gè)設(shè)計(jì)非常靈活而且足夠開放,足以支持增量模型,那么,這樣的設(shè)計(jì)將允許在不破壞產(chǎn)品的情況下進(jìn)行維護(hù)。事實(shí)上,使用增量模型時(shí)開發(fā)軟件和擴(kuò)充軟件功能(完善性維護(hù))并沒有本質(zhì)區(qū)別,都是向現(xiàn)有產(chǎn)品中加入新構(gòu)件的過程。從某種意義上說,增量模型本身是自相矛盾的。它一方面要求開發(fā)人員把軟件看作一個(gè)整體,另一方面又要求開發(fā)人員把軟件看作構(gòu)件序列,每個(gè)構(gòu)件本質(zhì)上都獨(dú)立于另一個(gè)構(gòu)件。除非開發(fā)人員有足夠的技術(shù)能力協(xié)調(diào)好這一明顯的矛盾,否則用增量模型開發(fā)出的產(chǎn)品可能并不令人滿意。
圖1.5所示的增量模型表明,必須在開始實(shí)現(xiàn)各個(gè)構(gòu)件之前就全部完成需求分析、規(guī)格說明和概要設(shè)計(jì)的工作。由于在開始構(gòu)建第一個(gè)構(gòu)件之前已經(jīng)有了總體設(shè)計(jì),因此風(fēng)險(xiǎn)較小。圖1.6描繪了一種風(fēng)險(xiǎn)更大的增量模型:一旦確定了用戶需求之后,就著手?jǐn)M定第一個(gè)構(gòu)件的規(guī)格說明文檔,完成后規(guī)格說明組將轉(zhuǎn)向第二個(gè)構(gòu)件的規(guī)格說明,與此同時(shí)設(shè)計(jì)組開始設(shè)計(jì)第一個(gè)構(gòu)件……用這種方式開發(fā)軟件,不同的構(gòu)件將并行地構(gòu)建,因此有可能加快工程進(jìn)度。但是,使用這種方法將冒構(gòu)件無法集成到一起的風(fēng)險(xiǎn),除非密切地監(jiān)控整個(gè)開發(fā)過程,否則整個(gè)工程可能毀于一旦。圖1.6風(fēng)險(xiǎn)更大的增量模型軟件風(fēng)險(xiǎn)是任何軟件開發(fā)項(xiàng)目中都普遍存在的實(shí)際問題,項(xiàng)目越大,軟件越復(fù)雜,承擔(dān)該項(xiàng)目所冒的風(fēng)險(xiǎn)也越大。軟件風(fēng)險(xiǎn)可能在不同程度上損害軟件開發(fā)過程和軟件產(chǎn)品質(zhì)量。因此,在軟件開發(fā)過程中必須及時(shí)識別和分析風(fēng)險(xiǎn),并且采取適當(dāng)措施以消除或減少風(fēng)險(xiǎn)的危害。1.4.4螺旋模型
構(gòu)建原型是一種能使某些類型的風(fēng)險(xiǎn)降至最低的方法。正如1.4.2節(jié)所述,為了降低交付給用戶的產(chǎn)品不能滿足用戶需要的風(fēng)險(xiǎn),一種行之有效的方法是在需求分析階段快速地構(gòu)建一個(gè)原型。在后續(xù)的階段中也可以通過構(gòu)造適當(dāng)?shù)脑蛠斫档湍承┘夹g(shù)風(fēng)險(xiǎn)。當(dāng)然,原型并不
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年鐵嶺衛(wèi)生職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試模擬試題及答案詳細(xì)解析
- 2026年浙江工商職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試模擬試題及答案詳細(xì)解析
- 2026年湖北工業(yè)職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試模擬試題含詳細(xì)答案解析
- 2026年晉城職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試模擬試題含詳細(xì)答案解析
- 2026年安慶醫(yī)藥高等專科學(xué)校單招綜合素質(zhì)考試參考題庫含詳細(xì)答案解析
- 2026年民辦四川天一學(xué)院單招綜合素質(zhì)考試模擬試題含詳細(xì)答案解析
- 2026年河南檢察職業(yè)學(xué)院單招職業(yè)技能考試備考試題含詳細(xì)答案解析
- 2026年廣州城市職業(yè)學(xué)院單招職業(yè)技能考試模擬試題含詳細(xì)答案解析
- 2026上海市閔行區(qū)浦瑞幼兒園招聘考試重點(diǎn)題庫及答案解析
- 2026年臺州市第二人民醫(yī)院招聘編外工作人員4人考試重點(diǎn)題庫及答案解析
- GB/T 13320-2025鋼質(zhì)模鍛件金相組織評級圖及評定方法
- 深海資源勘探中的分布式感知系統(tǒng)布設(shè)與效能評估
- 化工生產(chǎn)安全用電課件
- 2026屆湖北省武漢市高三元月調(diào)考英語試卷(含答案無聽力原文及音頻)
- 110kV~750kV架空輸電線路施工及驗(yàn)收規(guī)范
- (2025年)山東事業(yè)單位考試真題及答案
- 質(zhì)量檢驗(yàn)部2025年度工作總結(jié)與2026年度規(guī)劃
- 民辦高中辦學(xué)方案
- 樹脂鏡片制作課件
- 企業(yè)對賬函模板11
- GB/T 20452-2021仁用杏杏仁質(zhì)量等級
評論
0/150
提交評論