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