詳解軟件危機(jī)與軟件工程化
迄今為止,計(jì)算機(jī)系統(tǒng)已經(jīng)經(jīng)歷了4個(gè)不同的發(fā)展階段,但是,人們?nèi)匀粵](méi)有徹底擺脫“軟件危機(jī)”的困擾,軟件已經(jīng)成為限制計(jì)算機(jī)系統(tǒng)發(fā)展的瓶頸。
為了更有效地開(kāi)發(fā)與維護(hù)軟件,軟件工作者在么0 世紀(jì)b0 平代口期1知隊(duì)真研究消除軟件危機(jī)的途徑,從而逐漸形成」一門新興的上.在子骨—開(kāi)v軟件工程學(xué)(通常簡(jiǎn)稱為“軟件工程”)。
一、軟件危機(jī)
在計(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è)隱含的過(guò)程,除了程序清單之外,沒(méi)有其他文檔資料保存下來(lái)。
軟件危機(jī):在軟件的開(kāi)發(fā)和維護(hù)過(guò)程中所遇到的一系列嚴(yán)重問(wèn)題。
軟件危機(jī)主要包含兩方面的問(wèn)題:
1、如何開(kāi)發(fā)軟件,以滿足對(duì)軟件日益增長(zhǎng)的需求
2、如何維護(hù)數(shù)量不斷膨脹的已有軟件。
從20世紀(jì)60年代中期到70年代中期是計(jì)算機(jī)系統(tǒng)發(fā)展的第二個(gè)時(shí)期,這個(gè)時(shí)期的一個(gè)重要特征是出現(xiàn)了“軟件作坊”,廣泛使用產(chǎn)品軟件。
但是,軟件作坊基本上仍然沿用早期形成的個(gè)體化軟件開(kāi)發(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ù)的。“軟件危機(jī)”就這樣開(kāi)始出現(xiàn)了!1968年北大西洋公約組織的計(jì)算機(jī)科學(xué)家在西德召開(kāi)國(guó)際會(huì)議,討論軟件危機(jī)問(wèn)題,在這次會(huì)議上正式提出并使用了“軟件工程”這個(gè)名詞,一門新興的工程學(xué)科就此誕生了。
1 軟件危機(jī)的介紹
軟件危機(jī)是指在計(jì)算機(jī)軟件的開(kāi)發(fā)和維護(hù)過(guò)程中所遇到的一系列重問(wèn)題。這些問(wèn)題絕不僅僅是不能正常運(yùn)行的軟件才具有的,實(shí)際上,乎所有軟件都不同程度地存在這些問(wèn)題。
概括地說(shuō),軟件危機(jī)包含下述兩方面的問(wèn)題:
(1)如何開(kāi)發(fā)軟件,以滿足對(duì)軟件日益增長(zhǎng)的需求;
(2)如何維護(hù)數(shù)量不斷膨脹的已有軟件。
鑒于軟件危機(jī)的長(zhǎng)期性和癥狀不明顯的特征,近年來(lái)有人建議把軟件危機(jī)更名為“軟件蕭條( depression)”或“軟件困擾(affliction)”。不過(guò)“軟件危機(jī)”這個(gè)詞強(qiáng)調(diào)了問(wèn)題的嚴(yán)重性,而且也已為絕大多數(shù)軟件工作者所熟悉,所以本書仍將沿用它。
具體地說(shuō),軟件危機(jī)主要有以下一些典型表現(xiàn):
(1))對(duì)軟件開(kāi)發(fā)成本和進(jìn)度的估計(jì)常常很不準(zhǔn)確。實(shí)際成本比估計(jì)成本有可能高出一個(gè)數(shù)量級(jí),實(shí)際進(jìn)度比預(yù)期進(jìn)度拖延幾個(gè)月甚至幾年的現(xiàn)象并不罕見(jiàn)。這種現(xiàn)象降低了軟件開(kāi)發(fā)組織的信譽(yù)。而為了趕進(jìn)度和節(jié)約成本所采取的一些權(quán)宜之計(jì)又往往損害了軟件產(chǎn)品的質(zhì)量,從而不可避免地會(huì)引起用戶的不滿。
(2)用戶對(duì)“已完成的”軟件系統(tǒng)不滿意的現(xiàn)象經(jīng)常發(fā)生。軟件開(kāi)發(fā)人員常常在對(duì)用戶要求只有模糊的了解,甚至對(duì)所要解決的問(wèn)題還沒(méi)有確切認(rèn)識(shí)的情況下,就匆忙著手編寫程序。軟件開(kāi)發(fā)人員和用戶之間的信息交流往往很不充分,“閉門造車”必然導(dǎo)致最終的產(chǎn)品不符合用戶的實(shí)際需要。
(3)軟件產(chǎn)品的質(zhì)量往往靠不住。軟件可靠性和質(zhì)量保證的確切的定量概念剛剛出現(xiàn)不久,軟件質(zhì)量保證技術(shù)(審查、復(fù)審、程序正確性證明和測(cè)試)還沒(méi)有堅(jiān)持不懈地應(yīng)用到軟件開(kāi)發(fā)的全過(guò)程中,這些都導(dǎo)致軟件產(chǎn)品發(fā)生質(zhì)量問(wèn)題。
(4)軟件常常是不可維護(hù)的。很多程序中的錯(cuò)誤是非常難改正的,實(shí)際上不可能使這些程序適應(yīng)新的硬件環(huán)境,也不能根據(jù)用戶的需要在原有程序中增加一些新的功能?!翱芍赜玫能浖边€是一個(gè)沒(méi)有完全做到的、正在努力追求的目標(biāo),人們?nèi)匀辉谥貜?fù)開(kāi)發(fā)類似的或基本類似的軟件。
(5)軟件通常沒(méi)有適當(dāng)?shù)奈臋n資料。計(jì)算機(jī)軟件不僅僅是程序,還應(yīng)該有一整套文檔資料。這些文檔資料應(yīng)該是在軟件開(kāi)發(fā)過(guò)程中產(chǎn)生出來(lái)的,而且應(yīng)該是“最新式的”(即和程序代碼完全一致的)。軟件開(kāi)發(fā)組織的管理人員可以使用這些文檔資料作為“里程碑”,來(lái)管理和評(píng)價(jià)軟件開(kāi)發(fā)工程的進(jìn)展?fàn)顩r;軟件開(kāi)發(fā)人員可以利用它們作為通信工具,在軟件開(kāi)發(fā)過(guò)程中準(zhǔn)確地交流信息;對(duì)于軟件維護(hù)人員而言,這些文檔資料更是必不可少的。缺乏必要的文檔資料或者文檔資料不合格,必然給軟件開(kāi)發(fā)和維護(hù)帶來(lái)許多嚴(yán)重的困難和問(wèn)題。
(6)軟件成本在計(jì)算機(jī)系統(tǒng)總成本中所占的比例逐年上升。由于微電子學(xué)技術(shù)的進(jìn)步和生產(chǎn)自動(dòng)化程度的不斷提高,硬件成本逐年下降,然而軟件開(kāi)發(fā)需要大量人力,軟件成本隨著通貨膨脹以及軟件規(guī)模和數(shù)量的不斷擴(kuò)大而持續(xù)上升。美國(guó)在1985年軟件成本大約已占計(jì)算機(jī)系統(tǒng)總成本的90%。
(7)軟件開(kāi)發(fā)生產(chǎn)率提高的速度﹐遠(yuǎn)遠(yuǎn)跟不上計(jì)算機(jī)應(yīng)用迅速普及深入的趨勢(shì)。軟件產(chǎn)品“供不應(yīng)求”的現(xiàn)象使人類不能充分利用現(xiàn)代計(jì)算機(jī)硬件提供的巨大潛力。
以上列舉的僅僅是軟件危機(jī)的一些明顯的表現(xiàn),與軟件開(kāi)發(fā)和維護(hù)有關(guān)的問(wèn)題遠(yuǎn)遠(yuǎn)不止這些。
2產(chǎn)生軟件危機(jī)的原因
在軟件開(kāi)發(fā)和維護(hù)的過(guò)程中存在這么多嚴(yán)重問(wèn)題,一方面與軟件本身的特點(diǎn)有關(guān),另一方面也和軟件開(kāi)發(fā)與維護(hù)的方法不正確有關(guān)。
軟件不同于硬件,它是計(jì)算機(jī)系統(tǒng)中的邏輯部件而不是物理部件。由于軟件缺乏“可見(jiàn)性”,在寫出程序代碼并在計(jì)算機(jī)上試運(yùn)行之前,軟件開(kāi)發(fā)過(guò)程的進(jìn)展情況較難衡量﹐軟件的質(zhì)量也較難評(píng)價(jià),因此,管理和控制軟件開(kāi)發(fā)過(guò)程相當(dāng)困難。此外,軟件在運(yùn)行過(guò)程中不會(huì)因?yàn)槭褂脮r(shí)間過(guò)長(zhǎng)而被“用壞”,如果運(yùn)行中發(fā)現(xiàn)了錯(cuò)誤﹐很可能是遇到了一個(gè)在開(kāi)發(fā)時(shí)期引入的在測(cè)試階段沒(méi)能檢測(cè)出來(lái)的錯(cuò)誤。因此,軟件維護(hù)通常意味著改正或修改原來(lái)的設(shè)計(jì),這就在客觀上使得軟件較難維護(hù)。
軟件不同于一般程序,它的一個(gè)顯著特點(diǎn)是規(guī)模龐大,而且程序復(fù)雜性將隨著程序規(guī)模的增加而呈指數(shù)上升。為了在預(yù)定時(shí)間內(nèi)開(kāi)發(fā)出規(guī)模龐大的軟件,必須由許多人分工合作,然而,如何保證每個(gè)人完成的工作合在一起確實(shí)能構(gòu)成一個(gè)高質(zhì)量的大型軟件系統(tǒng),更是一個(gè)極端復(fù)雜困難的問(wèn)題,這不僅涉及許多技術(shù)問(wèn)題,諸如分析方法、設(shè)計(jì)方法、形式說(shuō)明方法、版本控制等,更重要的是必須有嚴(yán)格而科學(xué)的管理。
軟件本身獨(dú)有的特點(diǎn)確實(shí)給開(kāi)發(fā)和維護(hù)帶來(lái)一些客觀困難,但是人們?cè)陂_(kāi)發(fā)和使用計(jì)算機(jī)系統(tǒng)的長(zhǎng)期實(shí)踐中,也確實(shí)積累和總結(jié)出了許多成功的經(jīng)驗(yàn)。如果堅(jiān)持不懈地使用經(jīng)過(guò)實(shí)踐考驗(yàn)證明是正確的方法,許多困難是完全可以克服的,過(guò)去也確實(shí)有一些成功的范例。但是,目前相當(dāng)多的軟件專業(yè)人員對(duì)軟件開(kāi)發(fā)和維護(hù)還有不少糊涂觀念,在實(shí)踐過(guò)程中或多或少地采用了錯(cuò)誤的方法和技術(shù),這可能是使軟件問(wèn)題發(fā)展成軟件危機(jī)的主要原因。
與軟件開(kāi)發(fā)和維護(hù)有關(guān)的許多錯(cuò)誤認(rèn)識(shí)和做法的形成,可以歸因于在計(jì)算機(jī)系統(tǒng)發(fā)展的早期階段軟件開(kāi)發(fā)的個(gè)體化特點(diǎn)。錯(cuò)誤的認(rèn)識(shí)和做法主要表現(xiàn)為忽視軟件需求分析的重要性,認(rèn)為軟件開(kāi)發(fā)就是寫程序并設(shè)法使之運(yùn)行,輕視軟件維護(hù)等。
事實(shí)上,對(duì)用戶要求沒(méi)有完整準(zhǔn)確的認(rèn)識(shí)就匆忙著手編寫程序是許多軟件開(kāi)發(fā)工程失敗的主要原因之一。只有用戶才真正了解他們自己的需要,但是許多用戶在開(kāi)始時(shí)并不能準(zhǔn)確具體地?cái)⑹鏊麄兊男枰o軟件開(kāi)發(fā)人員需要做大量深入細(xì)致的調(diào)查研究工作,反復(fù)多次地和用戶交流信息,才能真正全面、準(zhǔn)確、具體地了解用戶的要求。對(duì)問(wèn)題和目標(biāo)的正確認(rèn)識(shí)是解決任何問(wèn)題的前提和出發(fā)點(diǎn)﹐軟件開(kāi)發(fā)同樣也不例外。急于求成,倉(cāng)促上陣,對(duì)用戶要求沒(méi)有正確認(rèn)識(shí)就匆忙著手編寫程序﹐這就如同不打好地基就蓋高樓一樣,最終必然垮臺(tái)。事實(shí)上,越早開(kāi)始寫程序,完成它所需要用的時(shí)間往往越長(zhǎng)。
一個(gè)軟件從定義、開(kāi)發(fā),使用和維護(hù),直到最終被廢棄,要經(jīng)歷一個(gè)漫長(zhǎng)的時(shí)期,這就如同一個(gè)人要經(jīng)過(guò)嬰兒、兒童、青年、中年和老年,直到最終死亡的漫長(zhǎng)時(shí)期一樣。通常把軟件經(jīng)歷的這個(gè)漫長(zhǎng)的時(shí)期稱為生命周期。
軟件開(kāi)發(fā)最初的工作應(yīng)是問(wèn)題定義,也就是確定要求解決的問(wèn)題是什么;然后要進(jìn)行可行性研究,決定該問(wèn)題是否存在一個(gè)可行的解決辦法;接下來(lái)應(yīng)該進(jìn)行需求分析,也就是深入具體地了解用戶的要求,在所要開(kāi)發(fā)的系統(tǒng)(不妨稱之為目標(biāo)系統(tǒng))必須做什么這個(gè)問(wèn)題上和用戶取得完全一致的看法。經(jīng)過(guò)上述軟件定義時(shí)期的準(zhǔn)備工作才能進(jìn)入開(kāi)發(fā)時(shí)期,而在開(kāi)發(fā)時(shí)期,首先需要對(duì)軟件進(jìn)行設(shè)計(jì)(通常又分為概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)兩個(gè)階段),然后才能進(jìn)入編寫程序的階段,程序編寫完之后還必須經(jīng)過(guò)大量的測(cè)試工作(需要的工作量通常占軟件開(kāi)發(fā)全部工作量的40%~50%)才能最終交付使用。所以,編寫程序只是軟件開(kāi)發(fā)過(guò)程中的一個(gè)階段,而且在典型的軟件開(kāi)發(fā)工程中,編寫程序所需的工作量只占軟件開(kāi)發(fā)全部工作量的10%~20%。
另一方面還必須認(rèn)識(shí)到程序只是完整的軟件產(chǎn)品的一個(gè)組成部分,在上述軟件生命周期的每個(gè)階段都要得出最終產(chǎn)品的一個(gè)或幾個(gè)組成部分(這些組成部分通常以文檔資料的形式存在)。也就是說(shuō),一個(gè)軟件產(chǎn)品必須由一個(gè)完整的配置組成,軟件配置主要包括程序、文檔和數(shù)據(jù)等成分。必須清除只重視程序而忽視軟件配置其余成分的糊涂觀念。
做好軟件定義時(shí)期的工作,是降低軟件成本提高軟件質(zhì)量的關(guān)鍵。如果軟件開(kāi)發(fā)人員在定義時(shí)期沒(méi)有正確全面地理解用戶需求,直到測(cè)試階段或軟件交付使用后才發(fā)現(xiàn)“已完成的”軟件不完全符合用戶的需要,這時(shí)再修改就為時(shí)已晚了。
嚴(yán)重的問(wèn)題是,在軟件開(kāi)發(fā)的不同階段進(jìn)行修改需要付出的代價(jià)是很不相同的,在早期引入變動(dòng),涉及的面較少,因而代價(jià)也比較低;而在開(kāi)發(fā)的中期,軟件配置的許多成分已經(jīng)完成,引入一個(gè)變動(dòng)要對(duì)所有已完成的配置成分都做相應(yīng)的修改,不僅工作量大,而且邏輯上也更復(fù)雜,因此付出的代價(jià)劇增;在軟件“已經(jīng)完成”時(shí)再引入變動(dòng),當(dāng)然需要付出更高的代價(jià)。根據(jù)美國(guó)一些軟件公司的統(tǒng)計(jì)資料,在后期引入一個(gè)變動(dòng)比在早期引入相同變動(dòng)所需付出的代價(jià)高2~3個(gè)數(shù)量級(jí)。
通過(guò)上面的論述不難認(rèn)識(shí)到,輕視維護(hù)是一個(gè)最大的錯(cuò)誤。許多軟件產(chǎn)品的使用壽命長(zhǎng)達(dá)10年甚至20年,在這樣漫長(zhǎng)的時(shí)期中不僅必須改正使用過(guò)程中發(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ò)充原來(lái)的軟件以滿足用戶不斷變化的需要。所有這些改動(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à)。