胡雯婷 HU Wen-ting;史福波 SHI Fu-bo;田志瑋 TIAN Zhi-wei;宋毅杰 SONG Yi-jie;于龍 YU Long
(航天科工智能運籌與信息安全研究院(武漢)有限公司,北京 100074)
計算機在航空航天事業中發揮越來越重要的作用,有著逐漸廣泛的應用,并且和航天航空安全息息相關。與之相對應的,軟件的規模也越來越大,層次越來越復雜,從而軟件出現故障的概率也隨之增大。
1977年9月,由于軟件故障,某國三叉戟導彈飛行試驗失敗。1999年9月,由于軟件故障,歐洲空間局新型Ariana運載火箭宣告失敗。可見,在飛行器設計中,軟件所發揮的作用和價值越來越大,但是同時軟件一旦發生故障也會帶來十分巨大的損失。對于飛行器而言,在一些關鍵應用方面使用質量有問題的軟件,如任務規劃軟件、飛行控制軟件、導航軟件等,很可能造成災難性的后果。為此,當前工程人員需要深入分析如何提高飛行器軟件的可靠性,保證軟件使用安全。
飛行器任務規劃軟件,是飛行器性能的“倍增器”,能夠極大地提升飛行器的性能。飛行器任務規劃需求主要包含以下功能:任務規劃準備、規劃預處理、航跡規劃、規劃檢驗、結果校驗[1]。隨著飛行器任務規劃需求的增加,其軟件規模越來越大,在設計上同樣面臨著如何最大限度提高軟件可靠性的問題,任務規劃軟件一旦發生故障,造成的損失將是毀滅性的。本文結合飛行器任務規劃的特點,對影響其軟件可靠性的因素和提高其可靠性設計的方法進行探討。
從功能上來看,飛行器任務規劃軟件應該具備多項功能,比如任務設定、規劃決策、方案評價、過程播放、方案展示等,這些功能在具體應用中可以體現在如下方面:
①有能力按照指派的計劃任務及計劃決策資源,完成任務計劃,并據此制訂計劃計劃;
②能夠設定并修改任務內容;
③某些問題可通過計算機軟件進行獨立規劃并求解,而非結構性問題則可根據決策者的經驗,采用人機交互方式求解。在規劃實施之前,必須由決策者認真評估、確認,之后方可落實方案;
④能夠有效地控制和管理工作的規劃過程;
⑤能夠可視化檢查驗證飛行計劃方案。
在技術層面上,任務規劃軟件必須具有可重用性,其中可重用性不僅體現在代碼本身,而且體現在設計框架上。在此基礎上,對任務規劃軟件的擴展性需要進行深入探討。任務規劃軟件可重用性是任務規劃軟件設計和開發過程中的一個重要環節。因為軟件系統本身是由多個模塊構成的,所以在軟件開發過程中,必須保證各個功能模塊之間的相互獨立、互不干擾。任何復雜軟件的開發都需要很長的時間。軟件中的每一部分都是相互聯系的。軟件功能的實現并非一朝一夕之功,而是需要隨著應用和需求的不斷增長,不斷地對軟件功能進行優化。這就要求軟件具有很高的可伸縮性,采用模塊化方法能更有效的解決這個問題。因此,在軟件開發過程中,應遵循模塊化的思想,盡可能地將系統劃分為若干模塊,并按照一定的次序進行。另外,軟件中的各個功能模塊之間應該有一個很好的接口,同時軟件應該具備聯網、協同規劃等外部通信接口,這樣在軟件面向應用時,才能有更高的靈活性。
軟件從實用性的角度出發,主要由四個方面組成,即:飛行任務的設置與編輯、任務的規劃設計、任務目標的設置,以及編輯與模擬推演評估[2]。其中,飛行任務規劃是實現該系統功能的關鍵環節,同時也是其難點所在。飛行任務的設置與編輯主要是對飛行任務進行詳細的描述,并進行可視化展示;任務規劃模塊采用任務規劃算法,根據任務分配的任務,對任務進行規劃;任務計劃中的目標設置與編輯模塊,根據任務計劃結果對飛行任務進行編程與展開;仿真推演模塊可以在2D和3D兩個維度上模擬推演飛行計劃,從而對總體計劃方案做出深入的評估。為滿足軟件可重用性與可擴展性的要求,本項目擬將各功能模塊作為一個整體來處理,包括飛行任務設想編輯器、任務規劃器、任務計劃目標設想編輯器以及飛行計劃評價器,且每個模塊又可由若干個較小模塊組成。然后,對軟件體系結構模型進行設計,包括體系結構框架、運行環境框架和數據庫表結構。圖1所示為該軟件的結構示意圖。
圖1 任務規劃軟件結構示意圖
定義[3]:軟件在規定條件和時間內完成任務的能力即為軟件的可靠性。所謂規定條件是指在規定的要求下使用軟件的方法,使用可靠性和使用方法有著密切關系。任務規劃軟件有著很多的使用方式,在一些條件下會導致軟件故障暴露出來,在另外一些用法下不會顯示出軟件故障。為此,相關工作者要深入研究的是如何合理地定義軟件用法并且控制不同環境對軟件產生的影響。
指定的時間指的是軟件循環運行。在軟件維護過程中,應針對不同情況,確定相應的時間區間。軟件的穩定性和時間有著密切的關系,軟件的失效概率隨工作時間而增加。軟件運行的時間、日歷時間和電腦使用的時間均是十分常用的時間概念。任務規劃軟件貫穿整個飛行器的工作時間,在設計過程中,需要根據飛行器的技術指標來進行考核。
完成規定功能指的是沒有出現失效情況的軟件。如果軟件不能完成某項功能,就意味著該軟件是無效的。為了確定一項失敗,必須明確要求執行的功能。具體的功能通常由軟件需求規范來定義。
對于軟件可靠性的概念,僅僅實現定性的定義是不夠的,還需要對軟件質量指標——軟件可靠性進行數量化,也就是運用定量的數學方法對軟件產品的可靠性進行研究分析。早在1975年,Musa就指出了可靠性度量的重要性:可靠性是一個迫切需要量化的重要性能指標。
然而軟件的可靠性定量描述不同于硬件,無法比較直觀和容易實現,任務規劃軟件是飛行器指揮中樞,其可靠性直接關系到飛行器技術指標的達成度,任務規劃軟件的量化方法研究成為可靠性研究的重要方向之一。
因為軟件內部邏輯比較復雜,運行環境千變萬化,并且不同的軟件之間存在著很大的差異,所以軟件失效機理也會表現出不同。如一些故障過程比較簡單,便于后續分析;而且有些失敗的過程非常復雜,難以用語言來描述和分析。為了避免在使用術語時出現不必要的混亂,在對軟件失效機理進行詳細闡述之前,必須先明確一些相關概念[4]。
人為錯誤是指在軟件的生命周期中,出現的非預期或不能接受的人為錯誤,其后果會導致軟件難以正常使用。人為差錯是人類在軟件開發活動中難以規避的過失。
軟件缺陷:是指在軟件中,存在著的偏差不能預期的或不能接受,當軟件在一定的條件下運行時,會出現諸如激活軟件缺陷等類型的軟件故障。軟件缺陷是軟件開發過程中人為失誤所造成的一種靜態現象,其主要類型如圖2所示。
圖2 軟件缺陷主要類型
軟件故障:指軟件在運行過程中出現的不可接受的、非預期的、內部的狀態,如果不采取容錯等相應的處理措施,那么將會導致軟件失敗。軟件失效是軟件啟動時發生的一種動態現象,一旦軟件發生故障那么將難以繼續運行。
軟件失效:指軟件運行過程中出現的不符合預期或不能接受的外部行為的結果。軟件失效后其形同虛設,無法使用。
軟件缺陷和軟件失效在某種程度上分別代表了兩個不同層次的軟件問題。軟件缺陷是軟件本身的問題,也是軟件開發者能夠察覺到的缺陷;軟件故障是一種外因,也是一種可以被用戶感知到的問題。
軟件錯誤將導致軟件失效,任務規劃中的軟件錯誤主要由設計人員在各個階段的錯誤造成,具體表現為:
①軟件需求。用戶如果在實際應用過程中,任務要求不夠全面、不合理、甚至有誤;由于軟件開發者無法及時跟蹤需求變化而導致輸入條件不合理;軟件開發人員和需求提出者之間存在認知偏差等問題,導致軟件的使用無法滿足需求。
②錯誤的設計。比如,對功能和性能的描述有誤等;不正確的工作流或算法;設計中沒有正確處理軟件的輸入量和輸出量之間的關系等。
③不正確的代碼。比如,程序的邏輯錯誤,錯誤的編碼等等。
④不正確的測試定義和不正確的測試執行。
⑤軟體檔案有誤。例如,不完整的軟件文件,內容不一致的文件,版本不一致的文件,文件缺乏完整性和一致性。
從軟件開發的角度來看,軟件缺陷的發現越晚,其影響越大。軟件經過長時間使用后可能產生諸多信息,其產生的影像主要體現在軟件質量的大幅下降;尋找和修改的難度越來越大,成本也越來越高。因此,我們應該盡可能地在軟件開發的早期就把錯誤排除掉。
在軟件項目規劃與需求分析過程中,必須建立一套以可靠性為核心的質量標準。在軟件開發過程中,為了保證軟件開發效率和質量,必須確定一些關鍵的性能指標。這個質量標準包括了很多方面,包括功能的實現、可維護、安全可靠。雖然軟件質量評價尚未形成一個完整的系統,但是我們還是可以用一系列具體的指標為基準來確定。以這些性能指標為依據,評價產品,找出影響產品質量的因素,并確定改進的方向。在后續發展階段,在滿足特定需求的情況下,可以確定產品的性能等級,以便合理的評價和管理軟件。制定質量標準后,設計質量報告及評價表,嚴格執行,并及時完成質量評價報告。
軟件開發方法對軟件可靠性有很大的影響。因此,在軟件開發過程中,必須采用適當的軟件開發方法,以確保軟件程序既能滿足特定的要求,又能保證軟件的可靠性。已有的軟件開發技術中,Parnas法被公認為最早的軟件開發方法,由Parnas于1972年提出。其核心思想是在設計初期就對未來可能發生的變化進行預測,并采用信息隱藏策略來提高軟件的穩定性和可維護性。該方法對軟件的維護有一定的幫助。在軟件設計階段,首先要明確未來可能發生的變動因素,在劃分模塊時,要把這些變動因素隱藏起來,使其它模塊不受影響。這樣既提高了軟件的可維護性,又避免了錯誤信息的傳播,提高了軟件的總體可靠性。該方法降低了對開發者的依賴性,降低了開發成本。在使用面向對象的策略中,由于對高可靠性數據庫的依賴程度較高,從而保證了軟件的可靠性;因此,我們提出了一種面向對象的戰略,并將Parnas與Rayleigh模型相結合,在開發階段融合其它技術,吸收它們的優勢。
充分利用已有的成熟軟件資源,不僅縮短了開發周期,提高了開發效率,而且提高了軟件的可維護性和穩定性。通常情況下,軟件工件的再利用最為普遍。在此基礎上,提出了一種基于組件復用技術的軟件體系結構設計方法。在選擇可再用零件時,一定要嚴格按照挑選零件的標準。這些可再用組件必須經過嚴格測試,或已被證實可靠度及正確性。他們應該是模塊化的,能完成一個完整的功能,結構應該清楚,易于閱讀、理解,合適的比例,以及高度的適應性。
作為開發大型軟件系統必備的內容,開發管理工具至關重要,如果單純地依靠人力進行管理難以達到預期的效果,為此,需要充分借助開發管理軟件、工具,借助這些工具將系統開發過程中出現的問題及時解決,實現開發效率和產品質量全面提升的目標。在國內當前依然缺乏高效的開發管理工具,很多軟件公司依然采取的是人工管理的模式,開發出的軟件質量也有待進一步提升。
在軟件開發前期各階段完成之后,只有加強測試,才能進一步提高軟件的可靠性(圖3)。為了最大限度地消除軟件中的bug,提高軟件的可靠性,必須進行全面的測試。為了實現對大型軟件系統的全面測試,需要確定最小測試個數和最大測試個數的關系,前者屬于技術決策,后者屬于管理決策,實踐中需要設置測試個數的下界。一般來說,如果條件允許,應盡可能地進行全面的檢查。
圖3 軟件單元測試
提高軟件可靠性的方法一般可分為兩類:避免錯誤的發生;該方法采用了冗余思想來實現容錯,其基本思想就是盡量減少軟件中可能存在的錯誤對系統可靠性的影響。被動防錯技術是指當某一計算機程序到達檢驗點之后,對該檢驗點的信息進行檢驗。主動的錯誤預防技術,可以定期的檢查整個過程和數據,也可以在使用的時候發現異常。作為一個項目管理員,應該使用這種方法,雖然它的設計很費時,但它對提高可靠性很有幫助。
不同于硬件可靠性評估,對于軟件可靠性定量進行評估尚無統一有效的方法。對于飛行器系統來說,任務規劃軟件的可靠性直接關系到整個飛行任務的成敗。本文根據飛行器任務規劃軟件的特點,對影響其可靠性的因素進行了分析,并針對這些因素,對能夠提高飛行器任務規劃軟件可靠性的方法進行了探討。