鄭 丹
中國酒泉衛星發射中心
近年來,國內商業航天得到了快速發展,短短幾年內突破了入軌門檻,但是距離以美國太空探索技術公司(SpaceX)為代表的國外商業航天的發展水平還有較大差距。商業航天的發展必須依賴創新,怎樣高可靠性、低成本地實現創新發展,是國內商業航天面臨的難題和挑戰。從SpaceX公司的扁平化管理、快速試錯、迭代發展的運營模式中,能夠處處看到敏捷項目管理的理念,其快速迭代模式也被國內商業航天公司借鑒。
敏捷軟件開發技術不僅僅是一套軟件開發方法,更是一套適用于復雜系統開發的原則、模式和理念。如果把“敏捷”簡單地理解為“快速”+“低成本”,為實現“快速”而盲目刪減測試項目,為降低成本使用工業級器件代替航天級器件而缺乏相應的容錯機制,那么,由于航天工程的高復雜性和高風險性,只會給商業航天公司的發展帶來不必要的挫折。事實上,“快速”+“低成本”是敏捷開發的結果,而不是敏捷開發的技術要求。因此,本文首先給出敏捷軟件開發的核心思想“迭代開發”對商業航天型號發展的建議,然后詳細分析了敏捷軟件開發的“重構”“自測試”“簡化文檔”“消除重復代碼”等技術要求對商業航天技術創新、管理運營等方面的啟示。
敏捷軟件開發為了應對迅速變化的需求并且實現快速開發,其核心思想是迭代開發。傳統大型軟件的開發方式是采用一個大周期進行開發,而迭代開發則將開發過程拆分成多個小周期,即一次“大開發”變成多次“小開發”,但是每次小開發都會新增一個用戶可以感知的完整功能。迭代開發的好處,一是能夠通過早期交付降低成本,二是能夠及時了解市場需求,降低產品不適用的風險。
SpaceX公司采用了迭代發展的理念。例如它的終極目標是造一個大推力火箭,將人類送往火星。但是,它不是一開始就造大火箭,而是先造一個最簡陋的小火箭“獵鷹”1號,然后開發中型火箭“獵鷹”9號,再開發“獵鷹重型”火箭,最后才開發能夠真正實現火星移民夢想的“超重-星艦”系統。它的每一次迭代都給予了市場(包括NASA)一定的信心,同時也為自己贏得了至關重要的訂單。
國內某些商業航天公司在開發液體火箭型號時,沒有從入軌火箭開始,而是直接研究運載火箭一子級的垂直起降回收技術,雖然從技術難度上來說垂直回收技術在某些方面比一次性入軌火箭的研制難度更大,但是仍然不能給客戶提供完整的功能,因為完整的功能必須是建立在能夠發射有效載荷的能力基礎上的。即使掌握了先進的回收技術,也僅證明了具有顯著降低發射成本的能力,仍需要繼續攻關火箭入軌技術才能盈利,而且這種迭代劃分也沒有遵循從簡單到復雜的研發順序,因此,這種迭代劃分的優勢并不明顯。
在軟件開發過程中,隨著時間流逝和不斷修改代碼,代碼結構逐漸衰弱,代碼質量也慢慢變差。“重構”正好與此相反,在軟件開發過程中持續地進行微小且保持軟件行為的修改,依靠“從量變到質變”的原理,從根本上改善了代碼的質量。由于“重構”過程中始終使代碼保持可工作的狀態,不需要花費額外調試的時間,因此“重構”的這種“小步前進”能夠進展迅速。重構可以改善既有代碼的設計,使軟件更容易理解,也可以使增加新功能變得容易。
SpaceX公司的管理模式也在不斷改進以適應其發展需求,比如它的質量管理部門就是在公司規模擴大后才成立的。建議商業航天公司更加重視產品研制過程中的技術積累和條件建設,對生產運營方式中任何不合理、不順暢的地方進行持續性改進,重構的對象可以是航天產品的生產環節,如產品設計、關鍵技術、元器件、材料、工藝等,也可以是公司的運營方式,如審批流程、會議制度、供貨方管理制度等。即使這個改變非常微小或者簡單,只要能夠降低成本,提高產品的可靠性,就可以改進,最終實現高可靠、低成本的目標,扎扎實實打造公司的核心競爭力。
在傳統軟件開發中,編寫產品代碼和軟件測試是相互獨立的工作,軟件測試由專門的測試人員負責,只把測試結果反饋給軟件開發人員。而在敏捷軟件開發中,產品代碼和測試代碼都由軟件開發人員完成,一起放在軟件里,并且由軟件自動測試,即軟件對自己進行測試并檢查測試結果。自測試的作用是快速發現錯誤并確保錯誤不再復現,是“重構”的重要技術保障。
商業航天如果采用迭代開發模式,那么在頻繁的“重構”和“測試”情況下,必須提高測試的自動性和敏捷性。例如,增強元器件的自檢測功能,不僅能夠顯著減少測試準備時間,還能提高排故效率;實現箭上自主監測和在線排故功能,提高飛行的可靠性;在故障排除后增加測試項目,確保故障永遠不會復現,提高歸零措施的有效性;面向風險開展測試,加強“邊界條件”測試,提高系統可靠性;對供應商或第三方服務執行同樣的測試理念和標準,防止“木桶的短板效應”。最后,測試體系也可以通過“重構”的方式逐漸完善,測試體系是否完備,可以借鑒敏捷軟件開發的一個判斷標準,即“是否具有這樣的信心‘只要通過了測試,就能成功’”。
在敏捷軟件開發中,軟件本身是最好的文檔,這個“軟件即文檔”的敏捷要點使得軟件開發不再花費精力維護大量的文檔。但是,“軟件即文檔”敏捷要點的技術要求是軟件代碼必須像文檔一樣易讀易懂。為了做到這一點,敏捷軟件開發技術采取了數十種編程技巧和規則,例如函數命名規則、函數的長度、變量可見域、無重復代碼等,來保證代碼編寫得像文檔一樣簡潔明了,并且還通過“重構”手段來改善軟件的可讀性。如果僅僅為了節省文檔編寫和維護的時間,盲目取消文檔而不學習和應用這些技巧和規則,那么即使閱讀和修改自己編寫的代碼也很困難,從而使整個軟件團隊的開發走向困境。
商業航天的軟件也可以采用“代碼即文檔”的技術進行編寫,使代碼具有易理解和易修改的特點,進而極大減少軟件文檔的數量和維護成本,提高軟件開發的效率。這就要求整個編程團隊都要遵守“代碼即文檔”背后的各種規則和要求。同時,也需采用比較簡單的文檔或者視頻等手段記錄主要思路等信息,便于其他人快速理解產品軟件。此外,如果商業航天的測發軟件也能夠按照手機軟件的開發標準,滿足“無需操作手冊也能無失誤”的技術要求,那么就可以取消雙崗制,提高測發工作的效率。
敏捷軟件開發的一個重要原則是“消除重復代碼”。重復代碼會帶來很多麻煩,當代碼中有一個錯誤時,很難找到全部的重復代碼進行修改,而忽略了任何一處修改,就會使軟件在實現相同功能時采用不同的行為,特別是這些重復的代碼段還不完全相同的情形,需要逐一分析和修改,極大增加了代碼修改的困難性。代碼重復的原因很多,最常見的操作是在添加新功能時,復制一段類似的代碼然后稍加修改,而避免重復代碼的方法也很簡單:堅持一個功能只使用一段代碼來實現。
傳統火箭研制使用了很多具有類似功能卻在細節上略有不同的元器件,例如在一枚火箭上通常使用了多種型號的發動機或者多種型號的電池,雖然從總體設計上是最優的,但是在使用和維護上都需要重點關注各型號元器件之間的差異性,導致了額外的使用和維護成本。而產品的通用化設計,可以避免這些元器件的重復設計,并且能夠以批量生產的方式分攤設計費,進而降低生產成本。例如,SpaceX公司的“獵鷹重型”火箭一子級的27臺發動機狀態完全一致,給裝配和測試工作帶來了極大便利,而二子級所用的發動機是一子級發動機的高空版,大大縮減了生產成本和生產周期。
通過對若干敏捷要點的分析可知,敏捷開發的背后是更高的技術要求和更多敏捷的測試,商業航天公司要想實現“快速迭代”發展,必須重視“正確的做事方式”,通過持續“重構”和“測試”,扎扎實實打造公司核心競爭力,逐步實現創新發展。商業航天的投資方也應從創新能力、運營管理模式、成本控制等多方面對商業航天公司進行評估,而不是單獨從飛行試驗的成敗“論英雄”,否則商業航天公司很難實踐快速試錯、迭代發展的模式。