- 軟件工程理論與實踐(第2版)
- 呂云翔等編著
- 4730字
- 2023-06-28 15:52:03
1.3 軟件工程
本節講述軟件工程的概念、研究內容、目標和原則、知識體系,以及軟件工程的發展。
1.3.1 軟件工程的概念
1968年,在北大西洋公約組織舉行的一次學術會議上,人們首次提出了軟件工程這個概念。當時,該組織的科學委員們在開會討論軟件的可靠性與軟件危機的問題時,提出了“軟件工程”的概念,并將其定義為“為了經濟地獲得可靠的和能在實際機器上高效運行的軟件,而建立和使用的健全的工程規則”。這個定義肯定了工程化的思想在軟件工程中的重要性,但是并沒有提到軟件產品的特殊性。
經過幾十年的發展,軟件工程已經成為一門獨立的學科,人們對軟件工程也逐漸有了更全面、更科學的認識。
IEEE(電氣與電子工程師學會)對軟件工程的定義為:①將系統化、嚴格約束的、可量化的方法應用于軟件的開發、運行和維護,即將工程化應用于軟件。②對①中所述方法的研究。
具體說來,軟件工程是借鑒傳統工程的原則和方法,以提高質量、降低成本為目的,指導計算機軟件開發和維護的工程學科。它是一種層次化的技術,如圖1-4所示。
軟件工程的根基就在于對質量的關注;軟件工程的基礎是過程層,它定義了一組關鍵過程區域的框架,使得軟件能夠被合理和及時地開發;軟件工程的方法提供了建造軟件在技術上需要“做什么”,它覆蓋了一系列的任務,包括需求分析、設計、編程、測試和支持等;軟件工程的工具對過程和方法提供了自動的或半自動的支持。而軟件工程本身是一個交叉學科,涉及多種學科領域的相關知識,包括工程學、數學、計算機科學、經濟學、管理學、心理學等。

圖1-4 軟件工程層次圖
軟件工程以關注質量為目標,其中過程、方法和工具是軟件工程的三要素。
1.3.2 軟件工程研究的內容
軟件工程研究的內容主要包括以下兩個部分。
●軟件開發技術。主要研究軟件開發方法、軟件開發過程、軟件開發工具和環境。
●軟件開發過程管理。主要研究軟件工程經濟學和軟件管理學。
必須要強調的是,隨著人們對軟件系統研究的逐漸深入,軟件工程所研究的內容也在不斷更新和發展。
1.3.3 軟件工程目標和原則
軟件工程要達到的基本目標如下:
●達到要求的軟件功能。
●取得較好的軟件性能。
●開發出高質量的軟件。
●付出較低的開發成本。
●需要較低的維護費用。
●能按時完成開發工作,及時交付使用。
為了達到上述目標,軟件工程設計、工程支持以及工程管理在軟件開發過程中必須遵循一些基本原則。著名軟件工程專家B.Boehm綜合了有關專家和學者的意見,并總結了多年來開發軟件的經驗,提出了軟件工程的7條基本原則。
1.用分階段的生命周期計劃進行嚴格的項目管理
將軟件的生命周期劃分為多個階段,對各個階段實行嚴格的項目管理。軟件開發是一個漫長的過程,人們可以根據軟件的特點或目標,把整個軟件的開發周期劃分為多個階段,并為每個階段制訂分階段的計劃及驗收標準,這樣有益于對整個軟件開發過程進行管理。在傳統的軟件工程中,軟件開發的生命周期可以劃分為可行性研究、需求分析、軟件設計、軟件實現、軟件測試、產品驗收和交付等階段。
2.堅持進行階段評審
嚴格地貫徹與實施階段評審制度可以幫助軟件開發人員及時發現錯誤并將其改正。在軟件開發的過程中,錯誤發現得越晚,修復錯誤所要付出的代價就會越大。實施階段評審,只有在本階段的工作通過評審后,才能進入下一階段的工作。
3.實行嚴格的產品控制
在軟件開發的過程中,用戶需求很可能在不斷地發生著變化。有些時候,即使用戶需求沒有改變,軟件開發人員受到經驗的限制以及與客戶交流不充分的影響,也很難做到一次性獲取到全部的、正確的需求。可見,需求分析的工作應該貫穿整個軟件開發的生命周期。在軟件開發的整個過程中,需求的改變是不可避免的。當需求更新時,為了保證軟件各個配置項的一致性,實施嚴格的版本控制是非常必要的。
4.采用現代程序設計技術
現代的程序設計技術,如面向對象的軟件開發技術,可以使開發出來的軟件產品更易維護和修改,同時還能縮短開發的時間,并且更符合人們的思維邏輯。
5.軟件工程結果應能清楚地審查
雖然軟件產品的可見性比較差,但是它的功能和質量應該能夠被準確地審查和度量,這樣才有利于有效的項目管理。一般軟件產品包括可以執行的源代碼、一系列相應的文檔和資源數據等。
6.開發小組的人員應該少而精
開發小組成員的人數少有利于組內成員充分交流,這是高效團隊管理的重要因素。而高素質的開發小組成員是影響軟件產品質量和開發效率的重要因素。
7.承認不斷改進軟件工程實踐的必要性
隨著計算機科學技術的發展,軟件從業人員應該不斷地總結經驗,并且主動學習新的軟件技術,只有這樣才能不落后于時代。
B.Boehm指出,遵循前6條基本原則,能夠實現軟件的工程化生產;按照第7條原則,不僅要積極主動地采納新的軟件技術,而且要注意不斷總結經驗。
1.3.4 軟件工程知識體系
IEEE在2014年發布的《軟件工程知識體系指南》中將軟件工程知識體系劃分為以下15個知識領域。
1)軟件需求(Software Requirement)。軟件需求涉及軟件需求的獲取、分析、規格說明和確認。
2)軟件設計(Software Design)。軟件設計定義了一個系統或組件的體系結構、組件、接口和其他特征的過程,以及這個過程的結果。
3)軟件構建(Software Construction)。軟件構建是指通過編碼、驗證、單元測試、集成測試和調試的組合,詳細地創建可工作的和有意義的軟件。
4)軟件測試(Software Testing)。軟件測試是為評價和改進產品的質量、標識產品的缺陷和問題而進行的活動。
5)軟件維護(Software Maintenance)。軟件維護是指由于一個問題或改進的需要而修改代碼和相關文檔,進而修正現有的軟件產品并保留其完整性的過程。
6)軟件配置管理(Software Configuration Management)。軟件配置管理是一個支持性的軟件生命周期過程,它是為了系統地控制配置變更,在軟件系統的整個生命周期中維持配置的完整性和可追蹤性,而標識系統在不同時間點上的配置的學科。
7)軟件工程管理(Software Engineering Management)。軟件工程的管理活動建立在組織和內部基礎結構管理、項目管理,以及度量程序的計劃制訂和控制3個層次上。
8)軟件工程過程(Software Engineering Process)。軟件工程過程涉及軟件生命周期過程本身的定義、實現、評估、管理、變更和改進。
9)軟件工程模型和方法(Software Engineering Model and Method)。軟件工程模型特指在軟件的生產與使用、退役等各個過程中參考模型的總稱,如需求開發模型、架構設計模型等都屬于軟件工程模型的范疇;軟件開發方法主要討論軟件開發各種方法及其工作模型。
10)軟件質量(Software Quality)。軟件質量特征涉及多個方面,保證軟件產品的質量是軟件工程的重要目標。
11)軟件工程職業實踐(Software Engineering Professional Practice)。軟件工程職業實踐涉及軟件工程師應履行其實踐承諾,使軟件的需求分析、規格說明、設計、開發、測試和維護成為一項有益和受人尊敬的職業,還包括團隊精神和溝通技巧等內容。
12)軟件工程經濟學(Software Engineering Economics)。軟件工程經濟學是研究為實現特定功能需求的軟件工程項目而提出的在技術方案、生產(開發)過程、產品或服務等方面所做的經濟服務與論證、計算與比較的一門系統方法論學科。
13)計算基礎(Computing Foundations)。計算基礎涉及解決問題的技巧、抽象、編程基礎、編程語言的基礎知識、調試工具和技術、數據結構和表示、算法和復雜度、系統的基本概念、計算機的組織結構、編譯基礎知識、操作系統基礎知識、數據庫基礎知識和數據管理、網絡通信基礎知識、并行和分布式計算、基本的用戶人為因素、基本的開發人員人為因素,以及安全的軟件開發和維護等方面的內容。
14)數學基礎(Mathematical Foundations)。數學基礎涉及集合、關系和函數,基本的邏輯、證明技巧、計算的基礎知識、圖和樹、離散概率、有限狀態機,數值精度、準確性和錯誤,以及數論和代數結構等方面的內容。
15)工程基礎(Engineering Foundations)。工程基礎涉及實驗方法和實驗技術、統計分析、度量、工程設計、建模與模擬和建立原型,以及標準和影響因素分析等方面的內容。
軟件工程知識體系的提出,使軟件工程的內容更加清晰,也使得其作為一個學科的定義和界限更加分明。
1.3.5 軟件工程的發展
隨著軟件項目規模和難度的逐漸增大,以個人能力為基礎的軟件開發的弊端也體現了出來,隨之出現了“軟件危機”。NATO(北約)科學委員會在這種情況之下,在1968年和1969年召開了兩次里程碑式的“軟件工程會議”,許多頂尖的研究員和工程師參加了會議,真正意義上的“軟件工程”就此誕生。
20世紀70年代,人們開始采用與60年代的“編碼和組裝”相反的過程,先做系統需求分析,再設計,最后編碼,并把50年代硬件工程技術最好的方面和改進的軟件方向的技術加以總結,提出了“瀑布模型”。需要指出的是,瀑布模型本身在被提出時,是一個支持迭代和反復的模型。然后,為了更方便地對軟件進行約束,瀑布模型總是被解釋為一種純順序化的模型,另外,對瀑布模型的固定過程標準的解釋也加深了這種誤解。
另一方面,Bohm-Jacoponi提出了“goto語句是有害的”論點,并提出所有程序都可以通過3種邏輯,即順序、分支、循環來實現,奠定了結構化編程的基礎。隨后,很多種結構化軟件開發方法被提出,極大地改善了軟件質量,提高了軟件開發效率。數據結構和算法理論迅速發展,取得了很多重要成就;形式方法和程序證明技術也成為人們關注的發展焦點。
然而,隨著形式化模型和連續化的瀑布模型所帶來的問題大幅度增加,對于一個缺乏經驗的團體來說,用形式化的方法,軟件在可靠性和有用性上要達到要求十分困難。瀑布模型在文檔編寫時消耗很大,而且速度慢,使用起來代價大。
伴隨20世紀70年代開發的一些“最佳實踐”,80年代開始了一系列工作以處理70年代的遺留問題,并且開始改進軟件工程的生產效率和可測量性。COCOMO模型、CMM模型等被提出,軟件體系結構相關研究和技術日益成熟,關系數據庫被提出。
在軟件工具方面,除了20世紀70年代已經出現的軟件需求和設計工具,其他領域一些重要的工具也得到了改進,如測試工具和配置管理工具。工具集和集成開發支持環境先后出現,最終人們將范圍擴展到了計算機輔助軟件工程(CASE),軟件開發的效率進一步得到提高。
在其他方面,也出現了一些潛在的提高軟件生產率的方法,如專家系統、高級程序語言、面向對象、強大的工作站以及可視化編程等。Brooks在1986年IFIP發表的著名論文《沒有銀彈》中對所有的這些方法發表了看法。他提出軟件開發面臨4個方面的核心挑戰:高等級的軟件復雜度、一致性、可變性和不可視性。關于如何解決這些挑戰,他嚴重質疑了將技術說成是軟件解決方案的“銀彈”觀點。Brooks解決這些核心挑戰的候選方案包括:良好的設計者、快速原型、演化開發和通過復用降低工作量。
20世紀90年代,面向對象方法的強勁勢頭得以持續。這些方法通過設計模式、軟件體系結構和體系結構描述語言以及UML技術的發展得到了加強。同時,Internet的繼續擴展和WWW的出現也增加了面向對象的方法以及市場競爭環境下軟件的危險性。
軟件在市場競爭中的作用不斷增強以及縮減軟件推向市場時間的需要,引發了從順序的瀑布模型向其他模型的轉變潮流,這類模型應該強調并行的工程性的需求、設計和編碼,產品和過程以及軟件和系統。軟件復用成為軟件開發中重要的內容,開源文化初露頭角,可用性以及人機交互也成為軟件開發中的重要指標。
20世紀90年代末,出現了許多的敏捷方法,如自適應軟件開發、水晶項目開發、動態系統開發、極限編程、特征驅動開發和Scrum等。這些主要的敏捷方法的創始人在2001年聚集一堂并發表了敏捷開發宣言。
進入21世紀,對快速應用開發追求的趨勢仍在繼續,在信息技術、組織、競爭對策以及環境等方面的變革步伐也正在加快。云計算、大數據、物聯網、人工智能和機器學習、移動互聯網、增材制造、可穿戴式技術、虛擬現實、增強現實、社交媒體、無人駕駛汽車和飛機等技術不斷涌現。這種快速的變革步伐引發了軟件開發領域越來越多的困難和問題,更多的軟件開發過程、方法和工具也相繼出現,軟件工程在持續的機遇與挑戰中不斷發展。“大規模計算”“自治和生化計算機”“模型驅動體系結構”“構件化軟件開發”等新領域都可能成為接下來軟件工程發展的主要方向。