非功能性需求
不直接與系統功能相關的需求
非功能性需求是指依一些條件判斷系統運作情形或其特性,而不是針對系統特定行為的需求,包括安全性、可靠性、互操作性、健壯性等。
在需求分析時,功能性需求是人們普遍關注的,但也不能忽視非功能性需求的分析,因為它所涉及的方面比較廣泛。正因為如此也就往往被人們所忽視。
非功能性需求也可稱之為軟體開發的“約束”,這主要是因為從最簡單的到最複雜的軟體系統,都有反映軟體系統質量和特性的額外要求,它從各個角度對所考慮的可能採取的解決方案起約束和限制作用。軟體的非功能性需求主要是軟體系統的性能、可靠性、運行限制等多個方面。
對於不同的軟體系統,其非功能性需求不可能完全相同。具體的內容要根據需要和可能由軟體和工作環境等具體情況來確定。在進行非功能性需求分析時,重要的是將精力放在那些至關重要的因素上。
非功能性需求是隨著軟體系統的規模成長和複雜性增加這兩個因素才逐漸成為軟體工程師們的新著眼點和關注點的,早期的時候,甲方出於自身對軟體技術的了解和自身對系統文件維護的方便性考慮等,對系統有了諸如:開發平台、技術流派、關鍵實現等等方面的要求,這被稱之為“設計約束”。從甲乙雙方合同的角度,設計約束也是一種需求——一種“非功能”性的需求,後來,軟體的質量問題越來越突出,描述軟體質量目標的要求也成為非功能性需求的一部分。於是,目前業界關於軟體的非功能需求,一般就包括:質量屬性要求和約束性要求。
作為功能需求的補充,非功能需求是指那些不直接與系統的具體功能相關的一類需求,但它們與系統的總體特性相關,如可靠性、響應時間、存儲空間等。非功能需求定義了對系統提供的服務或功能的約束,包括時間約束、空間約束、開發過程約束及應遵循的標準等。它源於用戶的限制,包括預算的約束、機構政策、與其他軟硬體系統間的互操作,以及如安全規章、隱私權保護的立法等外部因素。
按照非功能需求的起源,可將其分為3大類:產品需求、機構需求、外部需求。進而還可以細分。產品需求對產品的行為進行描述;機構需求描述用戶與開發人員所在機構的政策和規定;外部需求範圍比較廣,包括系統的所有外部因素和開發過程。
非功能需求其主要指標為:
觀感需求(界面需求)
主要描述了對產品外觀的期望、情緒和風格。這些需求規定了外觀想要達到的目標,它和詳細的界面設計還是有區別的,體現的是客戶的感覺。界面需求還包括對控制項進行規範和對控制項的使用範圍進行一個規定等方面的內容。可以考慮借用一個原型來描述。
易用性需求與可執行需求
易用性會使產品提高符合用戶習慣的能力以及其對使用的期望。它會對用戶使用產品的生產效率、錯誤率以及用戶對新產品的接收程度產生很大的影響。
可執行需求是指產品可以在給定的時間或者特定的精確度來執行某些任務,或者在一段時間內的極端狀態值。在考慮執行需求時,可以從完成任務的速度、結果的精確度、容量、允許值的範圍、單位時間內完成的任務數、資源的使用效率、兩次故障間的平均無故障時間、連續不停機時間等方面入手。它還應該包括對風險的控制內容。
安全性需求
安全性指產品消除潛在風險的能力和對風險的承受能力。包含保密性、可靠性和完整性三個特性。保密性指的是數據不能被授權用戶以外的任何人訪問的能力。可靠性指的是授權用戶可以不受阻止的訪問數據、與其它軟體的兼容的能力和產品的強壯度。完整性指的是按預期目標完成任務的能力。
一般分為程序安全、系統安全、數據安全。程序安全是指開發的程序是否是安全的,程序上有沒有安全的漏洞,例如Web開發中伺服器代碼沒有對輸入的參數進行驗證,從而導致客戶端機器人輕易的獲取數據。系統安全指的是系統整體的安全,例如安全的粒度,未經授權的用戶是否可以輕易的訪問非法的數據等。數據的安全是對數據的保護,資料庫中數據有沒有做審核,用戶之間是否會共享數據等。
系統的完整性需求
指為完成業務需求和系統正常運行本身要求而必須具有的功能,這些功能往往是用戶不能提出的。典型的功能有:聯機幫助、數據管理、用戶管理、軟體發布管理、在線升級,等等。
並不是所有的系統都必須包括以上所有的功能,而是可以根據產品的使用環境和企業的產品發展決策進行挑選。因此,完整的系統應該包括數據備份、恢復、日誌管理、垃圾數據清除等基本功能,哪怕這些功能的核心只是一條語句或命令。用戶管理功能是另一項必不可少的功能,它定義哪些用戶可以以什麼樣的功能使用系統。好的用戶管理功能不僅可以有效控制用戶對系統的使用,使系統處於一個安全、負載合理的運行狀況,還能提高系統的應用適應性。
系統的可擴充性與可維護性
這裡指的是當系統達到瓶頸的時候怎樣在不修改代碼的情況下提供系統的負載能力,擴展一般分為Scale UP和Scale Out。一般情況下會綜合運用UP和OUT。例如,增加伺服器的性能來提高系統的處理能力,但是任何計算機都會有一定的瓶頸,當增加伺服器性能不能達到提高系統性能的時候,我們需要考慮橫向的擴展伺服器,也即Scale Out。在Scale Out時一般需要我們的系統是狀態無關的,即Stateless。
當技術變化或業務變化時,不可避免將帶來系統的改變——不僅要進行設計實現的修改,甚至要進行產品定義的修改。好的軟體設計應在系統構架上考慮能以盡量少的代價適應這種變化。常用的技術方法有面向對象的分析與設計以及設計模式。
通過認識以上非功能性需求的常見指標,非功能需求的重要性主要程度要看項目具體情況而定,比如對於一個嵌入式系統軟體運行開銷非常重要,如果是實時系統,響應時間就很關鍵,如果是聯機交易系統可靠性、安全性、性能都很重要。
非功能需求檢驗起來非常困難。這此非功能需求可能來自於系統的易用性、可恢復性和對用戶輸入的快速反映性能的要求,同時需求描述的不詳細和不確定也會給開發者帶來許多困難。雖然理論上非功能需求能夠量化,通過一些可用來指定非功能性系統特性的度量的測試可使其驗證更為客觀,但在實際過程中,對需求描述進行量化是很困難的。這種困難性體現為客戶沒有能力把目標需求進行量化的同時,有些目標(如可維護性)本身也沒有度量可供使用。因此,在需求文檔中的目標陳述中,開發者應該明確用戶對需求的優先順序,同時也要讓用戶知道一些目標的模糊性和無法客觀驗證性。