徐振洋 謝萍 武孟
針對大型復雜軟件可靠性低、重大任務運行過程中出現軟件故障的問題,從軟件的全生命周期角度研究軟件可靠性設計方法,從軟件架構設計、軟件冗余設計、軟件健壯性設計、軟件測試設計、軟件可讀性設計、軟件重用設計、數據存儲設計、軟件錯誤恢復設計等方面研究軟件可靠性設計方法,涵蓋了軟件需求、概要設計、詳細設計、測試設計等不同階段,最后以實例進行驗證。
軟件是各個系統的必要組成部分,也是各系統的核心功能所在,隨著SDN/NFV的出現,軟件的地位和作用越來越突出。同時軟件直接面向各級各類運維人員,是網絡整體運行狀態的呈現者,為大型任務網可靠高效運行保駕護航,為重大任務的順利完成提供技術支撐,因此研制高可靠性高質量的軟件勢在必行,研究軟件可靠性設計是非常有意義的課題。本文從軟件生命周期的角度,研究軟件可靠性的各個環節,從軟件需求、軟件體系架構、軟件界面、軟件測試等方面進行研究。
軟件可靠性設計
從軟件體系架構設計、軟件冗余設計、軟件健壯性設計、軟件測試設計、軟件可讀性設計和軟件重用設計方面進行詳細研究。
軟件架構設計
軟件體系架構設計主要從軟件體系設計、模塊化設計、服務化設計等方面進行設計。
①體系化設計:軟件系統越來越復雜,可靠性高的軟件要求采用層次結構設計,層與層之間單向依賴,減少復雜性,提高可靠性,是否進行層次結構設計是關注的重點;
②模塊化設計:是否采用層次結構與模塊化設計相結合的方法,是否進行模塊化設計,模塊化設計是否高內聚、低耦合,模塊之間接口是否清晰明確簡潔,上述都是軟件設計的關注重點;為降低軟件的復雜度,采用層級結構和模塊化設計相結合的思想,將軟件分層,層與層之間只存在單向德依賴關系,在此基礎上分解為若干個功能獨立的模塊。各模塊相互交互,實現軟件的相關功能。但是,隨著軟件模塊的數量增加,軟件模塊間的信息交互勢必大幅增多,增加了軟件的復雜度。因此,軟件模塊的劃分需要考慮軟件模塊的功能單一性(即軟件模塊盡量?。┖蛙浖K間信息交互少的原則。
③服務化設計:將獨立功能的軟件模塊進行了服務化封裝,服務之間的通信是否簡單明確,服務是否進行了注冊、發布、共享,該項目的服務是全新設計還是基于已有項目的設計;是否最大限度重用了服務庫中的服務,重用服務占整個軟件項目服務設計的百分比是多少;因為成熟的入庫服務,均已經經過測試部署使用,其可靠性比較高,直接應用于新項目中既可以縮短開發時間,又可以提高可靠性。
軟件冗余設計
①主備熱備設計:對于可靠性要求極高的軟件,如航天系統相關軟件,一定要采用主備熱備、雙機熱備模式,確保系統故障時的零切換和數據的實時存儲備份。
②重要模塊備份設計:針對系統功能強大復雜,軟件模塊眾多的系統的,要重點設計關鍵硬件、關鍵模塊備份模式,冷熱備份根據實際需求選擇。
③信息冗余設計:針對大型復雜系統,數據庫是重要的信息存儲方式,數據庫的選型,選擇達夢、金倉國產化數據庫,數據高效存儲和讀取。
軟件健壯性設計
軟件健壯性設計包括界面設計、數據設計和軟件操作防護設計:
①在界面設計中:對輸入數據的有效性及合理性進行設計,數據輸入范圍設計。
②數據健壯性設計:對輸入數據的格式和存儲方式進行設計。
③軟件誤刪除防護設計:針對軟件的刪除設計做防范操作,首先進行刪除提示和確認操作設計,同時針對刪除的數據做短時間備份存儲,以便出現誤操作刪除時進行撤銷和數據恢復操作。
軟件測試設計
在軟件測試設計中,主要關注如下方法:
①需求階段:是否有詳盡的需求說明和設計文檔(重點關注是否與用戶進行透徹溝通交流),需求不透徹的話,可能會導致整個系統重新設計翻盤代價甚大。
②概要和詳細階段:進行體系架構設計,軟件模塊劃分設計,軟件流程設計和函數設計,能指導軟件編碼;

③測試階段:設計測試用例、測試策略,黑盒測試和白盒測試,進行軟件正常運行,超負荷運行檢測并采取手段。
軟件可讀性設計
軟件編程風格是否統一、合理,對增加軟件代碼可讀性、提高軟件可靠性、便于軟件的維護等方面有重要影響。要求每一個軟件模塊標準功能、作用、包含函數。要求軟件代碼注釋率不低于15 %。
針對不同的編程語言分別制定了相應的編程規范,建立了專門編程規范執行制度來約束編碼人員按編程規范編寫代碼。統一、合理的軟件編程風格在一定程度上減少了軟件的問題,方便軟件問題的排查和后期維護。
軟件重用設計
軟件重用的所有資料都是經過嚴格篩選,按照規定要求錄入的,被證明是合格、準確和可靠的。
數據存儲設計
隨著業務的多樣化、網絡的復雜化,網絡運行過程中所產生的數據越來越多,數據種類越來越多,除了結構化數據之外,非結構化數據也越來越多,傳統的oracle數據庫存在存取速度慢、存取效率低的弊端越來越難以滿足要求。由于待存儲流量信息巨大,因此采用分級分布式的云計算數據中心結構,每級數據中心的核心存儲平臺采用HADOOP平臺的HDFS分布式存儲集群,具有分布式存取、容災性強、安全性高等特點。由于網絡帶寬資源和存儲資源有限,從系統可靠性的角度出發構建分布式NameNode集群,根據集群的負載和網絡狀況進行數據的安全存儲和安全訪問,從而保證云存儲數據中心的安全和負載平衡。
軟件錯誤恢復設計
系統軟件在運行過程中由于軟件運行環境故障、人員操作異常、軟件自身錯誤等原因造成軟件出錯故障。如何在軟件發生錯誤后盡快的恢復過來、繼續正常運行是軟件可靠性設計考慮的重點。
①日志機制:系統軟件設計采用日志管理設計,提供安全日志、操作日志、登錄日志等各種日志的實時記錄和存儲備份功能,在軟件發生故障后,可以查看日志記錄查找故障原因,快速恢復軟件。
②狀態恢復機制:系統總部級網管中心軟件采用主備雙機熱備備份,在主用發生故障后,備用能迅速啟用,狀態轉化為主用。
③數據恢復機制:系統軟件采取自動保存、數據備份等手段,確保軟件發生故障后,網絡管理數據的可恢復性,提高軟件的可靠性。
實例驗證
以某平臺網管軟件為例,進行可靠性設計實例驗證。
該軟件實現對多個廠商多個型號設備的統一管理,具有軟件規模大、前后臺交互信息量大、頻繁存取數據、適合各級各類操作人員、可視化易操作的特點。
①首先進行軟件需求設計,詳細分解細化需求,提取出軟件功能(五大功能)、性能(7項性能指標)、接口(SNMPv2/ SNMPv3/TELNET/SSH/SYSLOG/NETFLOW)、運行環境(中標麒麟服務器和客戶端操作系統、達夢數據庫)要求。
②進行軟件架構設計,分析得知,需要基于B/S軟件架構設計,檢索軟件重用庫,獲取B/S軟件架構相關指導手冊,軟件源代碼,同時基于重用庫中的軟件界面集成框架進行設計,大量節省時間,同時軟件架構的可靠性和可用性都是經過驗證的。
③進行軟件模塊化、服務化設計,根據需求中規定的五大功能,詳細分解為高內聚、松耦合的軟件模塊,每個軟件模塊盡量完成獨立的軟件功能,同時基于標準化接口進行服務化封裝,服務化模塊之間基于標準的消息進行信息傳輸。
④進行軟件界面設計,基于軟件重用庫中的軟件界面集成框架進行設計,為了增加軟件界面的可視化,減少復雜性和操作盲目性,在每一個界面元中都丟界面元素的名稱、含義數據輸入范圍)進行tip框提示,同時采用能用下拉列表框盡量用下拉列表框的設計思路,減少用戶輸入。
⑤軟件測試設計,進行模塊設計、合格性測試設計、集成測試設計,同時從軟件安裝、卸載、運行負荷、安全性、可靠性等方面也設計相應的測試用例,針對每一個測試用例,都從測試用例設計和編寫要從正常值、邊界值、異常值等多個維度進行設計。測試前要確定測試標準、規范,設計測試用例要盡可能遍歷所有的測試項目,測試要盡可能詳盡,測試要強化輸入,正常值、邊界值、異常值都要測試,盡可能多的發現軟件錯誤剔除軟件錯誤。
⑥容錯設計:針對軟件刪除,進行刪除確認提示,同時提供一個月內的數據刪除備份手段;在軟件服務器方面,采取主備備份機制,主備軟件同時熱備運行,任何一方出現問題都可以即時接管。
通過上述的軟件可靠性設計,相比于未采取本文論述的系列可靠性手段,大大提高了該軟件的可靠性,縮短了研制周期。
軟件在各系統中的占比越來越大,地位越來越重要,核心功能越來越突出。因此做好軟件首先要對軟件各個環節的可靠性進行設計。只有在軟件生命周期的每一個環節和節點充分重視和嚴格執行軟件可靠性設計的規定要求,充分收集并利用各測試階段的可靠性數據,才能設計出高可靠性的軟件。
隨著軟件定義網絡,軟件定義一切的理念和技術深入發展,軟件越來越成為整個系統的靈魂所在,因此其可靠與否直接影響整個系統,所以有必要深入研究軟件定義網絡后的新型軟件可靠性。