- 軟件工程實用教程 (第3版)
- 郭寧 閆俊伢
- 3235字
- 2020-06-12 17:12:02
1.1 軟件及軟件危機
隨著計算機應用領域的擴大,軟件規模也越來越大,復雜程度不斷增加,使得軟件生產的質量、周期、成本難以預測和控制,從而出現了軟件危機。軟件工程正是為了解決軟件危機而提出的,其目的是改善軟件生產的質量,提高軟件的生產效率。經過幾十年的實踐與探索,軟件工程正在逐步發展成為一門成熟的專業學科,在軟件產業的發展中起到重要的技術保障和促進作用。
1.1.1 軟件及其特性
軟件是計算機系統的思維中樞,是軟件產業的核心。作為信息技術的靈魂,計算機軟件在現代社會中起著極其重要的作用。
1. 軟件
計算機軟件是由計算機程序的發展而形成的一個概念。它是與計算機系統操作有關的程序、規程、規則及其文檔和數據的統稱。軟件由兩部分組成:一是機器可執行的程序和有關的數據;二是與軟件開發、運行、維護、使用和培訓有關的文檔。
程序是按事先設計的功能和性能要求執行的語句序列。數據是程序所處理信息的數據和數據結構。文檔則是與程序開發、維護和使用相關的各種圖文資料,如各種規格說明書、設計說明書、用戶手冊等。在文檔中記錄著軟件開發的活動和階段成果。
2. 軟件的特點
軟件是一種邏輯產品而不是實物產品,軟件功能的發揮依賴于硬件和軟件的運行環境,沒有計算機硬件的支持,軟件毫無實用價值。若要對軟件有一個全面而正確的理解,我們應從軟件的本質、軟件的生產等方面剖析軟件的特征。
(1)軟件固有的特性
① 復雜性。軟件是一個龐大的邏輯系統。一方面在軟件中要客觀地體現人類社會的事務,反映業務流程的自然規律;另一方面在軟件中還要集成多種多樣的功能,以滿足用戶在激烈的競爭中對大量信息及時處理、傳輸、存儲等方面的需求,這就使得軟件變得十分復雜。
② 抽象性。軟件是人們經過大腦思維后加工出來的產品,一般寄生在內存、磁盤、光盤等載體上,我們無法觀察到它的具體形態,這就導致了軟件開發不僅工作量難以估計,進度難以控制,而且質量也難以把握。
③ 依賴性。軟件必須和運行軟件的機器(硬件)保持一致,軟件的開發和運行往往受到計算機硬件的限制,對計算機系統有著不同程度的依賴性。軟件與計算機硬件的這種密切相關性與依賴性,是一般產品所沒有的特性。為了減少這種依賴性,有關人員在軟件開發中提出了軟件的可移植性問題。
④ 軟件使用特性。軟件的價值在于應用。軟件產品不會因多次反復使用而磨損老化,一個久經考驗的優質軟件可以長期使用。由于用戶在選擇新機型時,通常會提出兼容性要求,所以一個成熟的軟件可以在不同型號的計算機上運行。
(2)軟件的生產特性
① 軟件開發特性。由于軟件固有的特性,使得軟件的開發不僅具有技術復雜性,還有管理復雜性。技術復雜性體現在軟件提供的功能比一般硬件產品提供的功能多,而且功能的實現具有多樣性,需要在各種實現中做出選擇,更有實現算法上的優化帶來的不同,而實現上的差異會帶來使用上的差別。管理上的復雜性表現在:第一,軟件產品的能見度低(包括如何使用文檔表示的概念能見度),要看到軟件開發進度比看到有形產品的進度困難得多;第二,軟件結構的合理性差,結構不合理使軟件管理復雜性隨軟件規模增大而呈指數增長。因此,領導一個人數眾多的項目組織進行規模化生產并非易事,軟件開發比硬件開發更依賴于開發人員的團隊精神、智力,以及對開發人員的組織與管理。
② 軟件產品形式的特性。軟件產品在設計階段成本高昂,而在生產階段成本極低。硬件產品試制成功之后,批量生產需要建設生產線,投入大量的人力、物力和資金,生產過程中還要對產品進行質量控制,對每件產品進行嚴格的檢驗。然而,軟件是把人的知識與技術轉化為信息的邏輯產品,開發成功之后,只需對原版軟件進行復制即可;大量人力、物力、資金的投入,以及質量控制,軟件產品檢驗都是在軟件開發中進行的。由于軟件的復制非常容易,軟件的知識產權保護就顯得極為重要。
③ 軟件維護特性。軟件在運行過程中的維護工作比硬件復雜得多。首先,軟件投入運行后,總會存在缺陷甚至暴露出潛伏的錯誤,需要進行“糾錯性維護”。其次,用戶可能要求完善軟件性能,對軟件產品進行修改,進行“完善性維護”。當支撐軟件產品運行的硬件或軟件環境改變時,也需要對軟件產品進行修改,進行“適應性維護”。軟件的缺陷或錯誤屬于邏輯性的,因此不需要更換某種備件,而是修改程序,糾正邏輯缺陷,改正錯誤,提高性能,增加適應性。當軟件產品規模龐大、內部的邏輯關系復雜時,經常會發生糾正一個錯誤而產生新錯誤的情況,因此,軟件產品的維護要比硬件產品的維護工作量大而且復雜。
1.1.2 軟件危機
20世紀60~70年代,由于軟件規模的擴大、功能的增強和復雜性的增加,使得在一定時間內僅依靠少數人開發一個軟件變得越來越困難。在軟件開發中經常會出現時間延遲、預算超支、質量得不到保證、移植性差等問題,甚至有的項目在耗費了大量人力、財力后,由于實際產品離目標相差甚遠而宣布失敗。這種情況使人們認識到“軟件危機”的存在。
1. 軟件危機的表現
(1)軟件生產率低。軟件生產率提高的速度遠遠跟不上計算機應用迅速普及和深入的趨勢。落后的生產方式與開發人員的匱乏,使得軟件產品的供需差距不斷擴大。由于缺乏系統有效的方法,現有的開發知識、經驗和相關數據難以積累與復用。另外,低水平的重復開發過程浪費了大量的人力、物力、財力和時間。人們為不能充分發揮計算機硬件提供的巨大潛力而苦惱。
(2)軟件產品常常與用戶要求不一致。開發人員與用戶之間的信息交流往往存在障礙,除了知識背景的差異,缺少合適的交流方法及需求描述工具也是一個重要原因。這使得獲取的需求經常存在二義性、遺漏,甚至是錯誤。由于開發人員對用戶需求的理解與用戶的本意有所差異,以致造成開發中后期需求與現實之間的矛盾集中暴露。
(3)軟件規模的增長,帶來了復雜度的增加。由于缺乏有效的軟件開發方法和工具的支持,過分依靠程序設計人員在軟件開發過程中的技巧和創造性,所以,軟件的可靠性往往隨著軟件規模的增長而下降,質量保障越來越困難。
(4)不可維護性突出。軟件的局限性和欠靈活性,不僅使錯誤非常難改正,而且不能適應新的硬件環境,也很難根據需要增加一些新的功能。整個軟件維護過程除了程序之外,沒有適當的文檔資料可供參考。
(5)軟件文檔不完整、不一致。軟件文檔是計算機軟件的重要組成部分,在開發過程中,管理人員需要使用這些文檔資料來管理軟件項目;技術人員則需要利用文檔資料進行信息交流;用戶也需要通過文檔來認識軟件,對軟件進行驗收。但是,由于軟件項目管理工作的不規范,軟件文檔往往不完整、不一致,這給軟件的開發、交流、管理、維護等都帶來了困難。
2. 產生軟件危機的原因
軟件危機是指計算機軟件的開發和維護過程中所遇到的一系列嚴重問題。這些問題不僅局限于那些“不能正確完成功能”的軟件,還包括我們如何開發軟件,如何維護大量已有軟件,如何使軟件開發速度與對軟件需求增長相適應等問題。產生軟件危機的原因主要有以下幾點。
(1)軟件獨有的特點給開發和維護帶來困難。由于軟件的抽象性、復雜性與不可預見性,使得軟件在運行之前,開發過程的進展情況較難衡量,軟件的錯誤發現較晚,軟件的質量也較難評價,因此,管理和控制軟件開發過程相當困難。此外,軟件錯誤具有隱蔽性,往往在很長時間里軟件仍可能需要改錯。這在客觀上使得軟件維護較為困難。
(2)軟件人員的錯誤認識。相當多的軟件專業人員對軟件開發和維護還有不少的錯誤觀念。例如,認為軟件開發就是編寫程序,忽視軟件需求分析的重要性,輕視文檔的作用,輕視軟件維護等。這些錯誤認識加重了軟件危機的影響。
(3)軟件開發工具自動化程度低。盡管軟件開發工具比30年前已經有了很大的進步,但直到今天,軟件開發仍然離不開工程人員的個人創造與手工操作,軟件生產仍不可能向硬件設備的生產那樣,達到高度自動化。這樣不僅浪費了大量的財力、物力和寶貴的人力資源,無法避免低水平的重復性勞動,而且軟件的質量也難以保證。此外,軟件生產工程化管理程度低,致使軟件項目管理混亂,難以保障軟件項目成本、開發進度按計劃執行。
- JSP網絡編程(學習筆記)
- Learning Flask Framework
- Mastering PHP Design Patterns
- R的極客理想:工具篇
- PostgreSQL Replication(Second Edition)
- 快速念咒:MySQL入門指南與進階實戰
- Nginx Lua開發實戰
- 深度學習:Java語言實現
- Hands-On Nuxt.js Web Development
- C++ Fundamentals
- 運維前線:一線運維專家的運維方法、技巧與實踐
- Backbone.js Testing
- 計算語言學導論
- Elasticsearch Blueprints
- 3D Printing Designs:The Sun Puzzle