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