- 軟件工程案例教程(第2版)
- 魏雪峰
- 6871字
- 2019-11-18 14:55:57
知識鏈接 軟件工程基礎
1 軟件危機
1968年NATO會議(Garmisch, Germany)提出的“軟件危機”,在今天仍然存在。軟件危機是指在計算機軟件的開發和維護過程中所遇到的一系列嚴重問題。這些問題絕不僅僅是“不能正常運行的”軟件才具有的,實際上幾乎所有軟件都不同程度地存在這些問題。
1.1 軟件危機的表現
軟件危機主要有下述一些表現:
(1)軟件開發成本和進度的估計不準確。實際成本比估計成本有可能高出一個數量級,實際進度比預期進度拖延幾個月甚至幾年的現象并不罕見。
(2)用戶對“已完成的”軟件系統不滿意,這些不滿意可能是功能或者性能上不能滿足用戶需求,也可能是操作上不太方便,還有可能界面不美觀等。
(3)軟件產品的質量往往靠不住。
(4)軟件常常是不可維護的。很多程序中的錯誤是非常難改正的,因為實際上不可能使這些程序適應新的硬件環境,也不能根據用戶的需要在原有程序中增加一些新的功能。
(5)軟件通常沒有適當的文檔資料。軟件不僅僅是程序,還應該有一整套文檔資料。這些文檔資料應該是在軟件開發過程中產生出來的,而且是與該軟件系統相匹配的。
(6)軟件開發生產率提高的速度遠遠跟不上計算機應用迅速地普及深入的趨勢。軟件產品“供不應求”的現象使人類不能充分利用現代計算機硬件提供的巨大潛力。
1.2 軟件危機產生的原因
在軟件開發和維護的過程中存在很多嚴重問題,一方面與軟件本身的特點有關,另一方面也和軟件開發與維護的方法不正確有關。
(1)軟件不同于硬件,軟件缺乏可見性,在寫出程序代碼并在計算機上試運行之前,軟件開發過程的進展情況較難衡量,軟件開發的質量也較難評價。
(2)軟件的一個顯著特點是規模龐大,而且程序復雜性將隨著程序規模的增加而成指數上升。圖形用戶界面(GUI)、客戶/服務器結構、分布式應用、數據通信、超大型關系式數據庫,以及龐大的系統規模使得軟件及系統的復雜性呈指數增長。
(3)用戶需求不明確。對用戶要求沒有完整準確的認識就匆忙著手編寫程序,是許多軟件開發工程失敗的主要原因之一。編寫程序只是軟件開發過程中的一個階段,而且在典型的軟件開發工程中,編寫程序所需的工作量只占軟件開發全部工作量的10%~20%。
(4)目前相當多的軟件專業人員對軟件開發和維護還有不少糊涂觀念,使其在實踐過程中或多或少地采用了錯誤的方法和技術,這可能是使軟件問題發展成軟件危機的主要原因。
(5)缺乏文檔等配置信息。一個軟件產品必須由一個完整的配置組成,里面主要包括程序、文檔和數據等部分。軟件專業人員應該清除只重視程序而忽視軟件配置其余成分的糊涂觀念。
(6)輕視維護。許多軟件產品的使用壽命可以長達10年甚至20年,在這樣漫長的時期中不僅必須改正使用過程中發現的每一個潛伏的錯誤,而且當環境變化時(例如硬件或系統軟件更新換代)還必須相應地修改軟件以適應新的環境,特別是必須經常改進或擴充原來的軟件以滿足用戶不斷變化的需要。統計數據表明,實際上用于軟件維護的費用占軟件總費用的55%~70%。軟件工程學的一個重要目標就是,提高軟件的可維護性,減少軟件維護的代價。
1.3 軟件危機經典事例
事例一:千年蟲
“千年蟲”問題的根源始于20世紀60年代。當時計算機存儲器的成本很高,如果用四位數字表示年份,就要多占用存儲器空間,這就會使成本增加。因此,為了節省存儲空間,計算機系統的編程人員采用兩位數字表示年份。隨著計算機技術的迅猛發展,雖然后來存儲器的價格降低了,但在計算機系統中使用兩位數字來表示年份的做法卻由于思維上的慣性勢力而被沿襲下來。年復一年,直到新世紀即將來臨之際,大家才突然意識到用兩位數字表示年份將無法正確辨識公元2000年及其以后的年份,當系統進行(或涉及到)跨世紀的日期處理運算時(如多個日期之間的計算或比較等),就會出現錯誤的結果,進而引發各種各樣的系統功能紊亂甚至崩潰。1997年,信息界開始拉起了“千年蟲”警鐘,并很快引起了全球關注。
事例二:愛國者導彈防御系統
1990年2月25日,海灣戰爭期間,美軍在沙特阿拉伯的城市宰赫蘭部署的愛國者導彈防御系統因浮點數舍入錯誤而失效,該系統的計算機精度僅有24位,存在0.0001%的計時誤差,所以有效時間閾值是20個小時。當系統運行100個小時以后,已經積累了0.3422秒的誤差。這個錯誤導致導彈系統不斷地自我循環,而不能正確地瞄準目標。結果未能攔截一枚伊拉克飛毛腿導彈,致使飛毛腿導彈在美國軍營中爆炸,造成28名美國陸軍士兵死亡。
事例三:奧運會門票訂票系統
2011年,倫敦4月26日消息,2012年倫敦奧運會660萬張門票的網上預訂在最后時刻重蹈了北京奧運會覆轍,網站訂票系統抵擋不住巨大的訪問量需求而崩潰,最后不得不臨時緊急延長了一個小時來解決這一尷尬問題。
按計劃,這批為期六周、面向公眾銷售的660萬張奧運門票原定于當地時間26日晚22:59截止。然而隨著截止日期的臨近,網上訂單日益增加,在最后一周的下單數更是達到了此前五周訂單總和的三到四倍,而在截止時間前的一小時則飆升到超過預期的峰值,被奧組委官員形容為需求“沖破了屋頂!”這一情形在2008年北京奧運會第二階段門票預售中也出現過。由于北京奧運實行“先到先得、售完為止”的售票方案,公眾紛紛搶在第一時間訂票,致使票務官網壓力激增,承受了超過自身設計容量8倍的流量,導致系統癱瘓,并導致奧運門票暫停銷售5天。
事例四:IOS8
2014年9月18號,“果粉們”終于等來了iOS8正式版的推送。在iOS8正式上線僅一周之后,蘋果公司出人意料地發布了iOS8的升級補丁。更出人意料的是,在一個小時后,蘋果公司又緊急撤回了這個補丁,因為用戶發現,升級這個補丁之后可能導致無法撥打電話。
想想看,還知道哪些軟件危機的事例?
1.4 解決軟件危機的辦法
在軟件危機相當嚴重的背景下,軟件工程產生了。在引入工程化的思想后,人們總結了出現軟件危機的原因并提出了相應的解決對策。主要內容是:
(1)充分吸收和借鑒人類長期以來從事各種工程項目中積累的行之有效的有效原理、概念、技術與方法,特別是吸取幾十年來人類從事計算機硬件研究和開發的經驗教訓。在開發軟件的過程中努力做到良好的組織,嚴格的管理,相互友好的協作。
(2)推廣在實踐中總結出來的開發軟件的成功技術和方法,并研究更好、更有效的技術和方法,盡快克服在計算機系統早期發展階段形成的一些錯誤概念和做法。
(3)根據不同的應用領域,開發更好的軟件工具并使用這些工具。將軟件開發各個階段使用的軟件工具集合成一個整體,形成一個很好的軟件開發環境。
總之,為了解決軟件危機,既要有對過去經驗的歸納總結,有技術措施(方法和工具),又要有必要的組織管理措施。
2 軟件工程
2.1 軟件工程的概念
軟件工程一直以來都缺乏一個統一的定義,很多學者、組織機構都分別給出了自己的定義:
(1)美國工程院院士、軟件工程專家Barry Boehm:運用現代科學技術知識來設計并構造計算機程序及為開發、運行和維護這些程序所必需的相關文件資料。
(2)IEEE在《軟件工程術語匯編中》的定義:軟件工程是:①將系統化的、嚴格約束的、可量化的方法應用于軟件的開發、運行和維護,即將工程化應用于軟件;②對①中所述方法的研究。
(3)德國計算機科學家FritzBauer在NATO會議上給出的定義:建立并使用完善的工程化原則,以較經濟的手段獲得能在實際機器上有效運行的可靠軟件的一系列方法。
(4)《計算機科學技術百科全書》中的定義:軟件工程是應用計算機科學、數學及管理科學等原理,開發軟件的工程。軟件工程借鑒傳統工程的原則、方法,以提高質量、降低成本。其中,計算機科學、數學用于構建模型與算法。工程科學用于制定規范、設計范型(paradigm)、評估成本及確定權衡。管理科學用于計劃、資源、質量、成本等管理。
目前比較認可的一種定義認為:軟件工程是研究和應用如何以系統性的、規范化的、可定量的工程化方法去開發和維護軟件,以及如何把經過時間考驗而證明正確的管理技術和當前能夠得到的最好的技術方法結合起來。
2.2 軟件工程的要素
軟件工程包括三個要素:方法、工具和過程,如圖1-1所示。

圖1-1 軟件工程層次圖
軟件工程方法為軟件開發提供了“如何做”的技術。它包括了多方面的任務,如項目計劃與估算、軟件系統需求分析、數據結構、系統總體結構的設計、算法過程的設計、編碼、測試及維護等。目前常見的軟件開發方法是結構化方法和面向對象方法。
軟件工具為軟件工程方法提供了自動的或半自動的軟件支撐環境。目前,已經推出了許多軟件工具,這些軟件工具集成起來,建立起稱之為計算機輔助軟件工程(CASE)的軟件開發支撐系統。CASE將各種軟件工具、開發機器和一個存放開發過程信息的工程數據庫組合起來形成一個軟件工程環境。
軟件工程的過程則是,將軟件工程的方法和工具綜合起來,以達到合理、及時地進行計算機軟件開發的目的。過程定義了方法使用的順序、要求交付的文檔資料、為保證質量和協調變化所需要的管理、及軟件開發各個階段完成的里程碑。
軟件工程是一種層次化的技術,以有組織的質量保證為基礎。全面的質量管理和類似的理念刺激了不斷的過程改進,正是這種改進導致了更加成熟的軟件工程方法的不斷出現。支持軟件工程的根基就在于對質量的關注。
2.3 軟件工程的基本原理
著名的美國軟件工程專家Boehm綜合了學者們的意見,并總結了TRW公司多年開發軟件的經驗,于1983年在一篇論文中提出了軟件工程的七條基本原理。他認為這七條原理是確保軟件產品質量和開發效率的原理的最小集合。這七條原理是互相獨立的,其中任意六條原理的組合都不能代替另一條原理。然而這七條原理又是相當完備的,人們雖然不能用數學方法嚴格證明它們是一個完備的集合,但是可以證明在此之前已經提出的100多條軟件工程原理都可以由這七條原理的任意組合蘊含或派生。
下面簡要介紹軟件工程的七條基本原理:
(1)用分階段的生命周期計劃嚴格管理
這一條是吸取前人的教訓而提出來的。統計表明,50%以上的失敗項目是由于計劃不周而造成的。在軟件開發與維護的漫長生命周期中,需要完成許多性質各異的工作。這條原理意味著應該把軟件生命周期分成若干階段,并相應制定出切實可行的計劃,然后嚴格按照計劃對軟件的開發和維護進行管理。Boehm認為,在整個軟件生命周期中應指定并嚴格執行6類計劃:項目概要計劃、里程碑計劃、項目控制計劃、產品控制計劃、驗證計劃、運行維護計劃。
(2)堅持進行階段評審
統計結果顯示:大部分錯誤是在編碼之前造成的,大約占63%。錯誤發現得越晚,改正它所付出的代價就越大,要差2到3個數量級。因此,軟件的質量保證工作不能等到編碼結束之后再進行,應堅持進行嚴格的階段評審,以便盡早發現錯誤。
(3)實行嚴格的產品控制
開發人員最痛恨的事情之一就是改動需求。但是實踐告訴我們,需求的改動往往是不可避免的。這就要求我們要采用科學的產品控制技術來順應這種要求。也就是要采用變動控制,又叫基準配置管理。當需求變動時,其他各個階段的文檔或代碼隨之相應變動,以保證軟件的一致性。
(4)采納現代程序設計技術
從20世紀六七十年代的結構化軟件開發技術,到目前的面向對象技術,從第一、第二代語言,到第四代語言,人們已經充分認識到:方法大似氣力。采用先進的技術既可以提高軟件開發的效率,又可以減少軟件維護的成本。
(5)結果應能清楚地審查
軟件是一種看不見、摸不著的邏輯產品。軟件開發小組的工作進展情況可見性差,難于評價和管理。為更好地進行管理,應根據軟件開發的總目標及完成期限,盡量明確地規定開發小組的責任和產品標準,從而使所得到的標準能清楚地審查。
(6)開發小組的人員應少而精
開發人員的素質和數量是影響軟件質量和開發效率的重要因素,應該少而精。這一條基于兩點原因:高素質開發人員的效率比低素質開發人員的效率要高幾倍到幾十倍,開發工作中犯的錯誤也要少得多。當開發小組為N人時,可能的通信信道為N(N-1)/2??梢婋S著人數N的增大,通信開銷將急劇增大。
(7)承認不斷改進軟件工程實踐的必要性
遵從上述七條基本原理,就能夠較好地實現軟件的工程化生產。但是,它們只是對現有的經驗的總結和歸納,并不能保證趕上技術不斷前進發展的步伐。因此,Boehm提出應把承認不斷改進軟件工程實踐的必要性作為軟件工程的第七條原理。根據這條原理,不僅要積極采納新的軟件開發技術,還要注意不斷總結經驗,收集進度和消耗等數據,進行出錯類型和問題報告統計。這些數據既可以用來評估新的軟件技術的效果,也可以用來指明必須著重注意的問題和應該優先進行研究的工具和技術。
2.4 軟件工程的目標
軟件工程的目標是:在給定成本、進度的前提下,開發出具有可修改性、有效性、可靠性、可理解性、可維護性、可重用性、可適應性、可移植性、可追蹤性和可互操作性(簡稱“十性原則”),并且滿足用戶需求的軟件產品。
追求這些目標促進軟件工程提高軟件質量、降低軟件成本、滿足用戶要求,主要體現在以下方面。
(1)付出較低的開發成本
軟件開發成本主要指軟件開發過程中所花費的工作量及相應的代價。不同于傳統的工業產品成本,軟件的成本不包括原材料和能源的消耗,主要是人力的消耗——人員工資。另外,軟件也沒有一個明顯的制造過程。它的開發成本不是以一次性開發過程所花費的代價來計算的,而是整個軟件開發過程所花費的各種費用。降低軟件開發成本一直是軟件工程的目標。
(2)達到要求的軟件功能
軟件功能,即軟件能夠“做什么”,它是軟件的價值體現。由于軟件開發人員和用戶知識領域的差異,往往造成雙方對功能理解不一致,導致軟件功能不能完全符合用戶要求。一個成功的軟件應能夠完全滿足用戶需要。
(3)取得較好的軟件性能
軟件的性能是軟件的一種非功能特性,它關注的不是軟件是否能夠完成特定的功能,而是在完成該功能時展示出來的及時性。由于感受軟件性能的主體是人,不同的人對于同樣的軟件性能有不同的主觀感受,而且不同的人對于軟件性能關心的視角也不同。軟件性能的好壞通常從響應時間、吞吐量、并發用戶量、資源利用率等方面進行衡量,取得較好的軟件性能是軟件工程的重要目標。
(4)開發的軟件易于移植
軟件移植是將軟件從一種計算機上轉置到其他計算機上。軟件移植是實現功能的等價聯系,而不是等同聯系。從一種計算機向另一種計算機移植軟件時,首先要考慮所移植的軟件對宿主機硬件及操作系統的接口,然后設法用對目標機的接口代換之。因此,開發容易改造接口的軟件,是軟件工程的目標。
(5)需要較低的維護費用
軟件維護主要是指根據需求變化或硬件環境的變化對應用程序進行部分或全部的修改。軟件維護是軟件生命周期中最長的一個階段,有很多軟件由于前期管理或技術失誤導致后期維護費用激增,收益在維護中耗盡。因此,維護費用的高低是一個軟件是否優秀的衡量標準。
(6)能按時完成開發工作,及時交付使用
軟件是一種信息產品,具有可延展性,屬于柔性生產,進度通常難以把握,拖延工期幾個月甚至幾年的現象并不罕見,這種現象降低了軟件開發組織的信譽。因此,能按時完成開發工作,及時交付使用是軟件工程的目標。
小結
軟件是計算機程序及其有關的數據和文檔的結合。軟件危機是指在計算機軟件開發和維護時所遇到的一系列問題。軟件危機主要問題:一是如何開發軟件以滿足對軟件日益增長的需求;二是如何維護數量不斷增長的已有軟件。
軟件工程采用工程的概念、原理、技術和方法來開發與維護軟件。軟件工程的目標是實現軟件的優質高產。其主要內容是軟件開發技術和軟件工程管理。軟件工程是研究和應用如何以系統性的、規范化的、可定量的過程化方法去開發和維護軟件,在軟件開發中如何把經過時間考驗而證明正確的管理技術和當前能夠得到的最好的技術方法結合起來。
軟件開發方法學是編制軟件的系統方法。它確定軟件開發的各個階段,規定每一階段的活動、產品、驗收的步驟和完成準則。常用的軟件開發方法有結構化方法、面向數據結構方法和面向對象方法等。
通過正反兩個案例來認識什么是軟件危機、軟件危機的表現。通過軟件危機的經典故事來思考其產生的原因及解決方法。
習題
一、選擇題
1.下面不屬于軟件工程的3個要素是(?。?。
A.工具
B.過程
C.方法
D.環境
2.軟件工程方法的產生源于軟件危機,下列( )是產生軟件危機的內在原因。
Ⅰ 軟件的復雜性
Ⅱ 軟件維護困難
Ⅲ 軟件成本太高
Ⅳ 軟件質量難保證
A.Ⅰ
B.Ⅲ
C.Ⅰ和Ⅳ
D.Ⅲ和Ⅳ
3.軟件工程的出現主要是由于(?。?。
A.程序設計方法學的影響
B.其他工程科學的影響
C.軟件危機的出現
D.計算機的發展
4.軟件工程學一般包含軟件開發技術和軟件工程管理兩方面的內容,下述(?。┦菍儆谲浖_發技術的內容。
Ⅰ.軟件開發方法學
Ⅱ.軟件工程過程
Ⅲ.軟件工程經濟學
A.Ⅰ
B.Ⅲ
C.Ⅱ和Ⅲ
D.Ⅰ和Ⅱ
5.軟件工程學一般應包括:軟件開發技術和軟件工程管理兩部分內容,下述(?。┦擒浖こ坦芾淼膬热?。
Ⅰ.人員組織
Ⅱ.進度安排
Ⅲ.質量保證
Ⅳ.成本核算
A.Ⅰ和Ⅱ
B.Ⅱ和Ⅲ
C.Ⅲ和Ⅳ
D.都是
6.軟件工程學中除重視軟件開發的研究外,另一重要組成內容是軟件的(?。?。
A.工程管理
B.成本核算
C.人員培訓
D.工具開發
7.軟件工程的目的是(?。?。
A.建造大型的軟件系統
B.軟件開發的理論研究
C.軟件的質量的保證
D.研究軟件開發的原理
二、思考題
1.火星業務支撐軟件失敗的因素。
2.騰訊成功的原因。
3.軟件工程是什么?
4.怎樣按時完成高質量的軟件?