實現軟件編程工廠化
FO方法是指面向事實的分析(Fact-Oriented Analysis)、面向結構的設計(Frame-Oriented Design)、面向形式的編程(Form-Oriented Programming) 的軟件開發方法。
本文引用地址:http://www.104case.com/article/202212/441579.htm幾百行代碼,完成了傳統軟件開發需要幾十萬行代碼的軟件系統。這并不是理論上的研究,而是一個正在使用的軟件系統——云計算農村數據服務平臺中的果業數據服務平臺。
該平臺目前包括果業產銷服務,農資服務,物流服務,農機服務,分析預測等近200個系統。并可根據需求,按照全國行政區域劃分,為每個村都配置一個獨立的果業數據服務平臺。今后云計算農村數據服務平臺還可擴展到蔬菜業,養豬業等等。該農村數據服務平臺所管理的數據可無限多,且數據查尋時間快速,及乎不受數據增加的影響。如此龐大的巨復雜軟件系統,所需編制的數千萬行、數億行代碼,都可由FO方發法的幾百行代碼簡便自如地生成。
FO方法在業內率先實現軟件編程的工廠化,使軟件復用在龐大的巨復雜軟件系統成功應用,是軟件工程的具有里程碑意義的創新技術。
當今的計算機硬件發展是如此之快,軟件的開發已經遠遠地落在后面。人類面臨太多的難題需要通過軟件來幫助分析解決。
全球金融危機爆發之前,盡管人們希望開發一些復雜的系統來滿足人們的需要,但是這種需求并不迫切。然而金融危機爆發之后,人類經濟發生了全球性衰退,沒有一個國家能夠幸免于難。20國集團領導人倫敦峰會前后的一系列應對國際金融危機的措施表明,"一場全球性的危機,需要全球性的解決方案";發端于國際金融危機的全球應對,將使世界經濟形勢、全球治理模式、國際關系格局等都出現新的變化,并產生遠遠超出危機應對本身的影響。
一個模擬全球金融體系的巨復雜軟件系統將會更加有效的進行金融監管。然而目前的軟件技術卻無法完成如此復雜、龐大的軟件系統。
能否找到開啟軟件開發的新方法,從根本上解決目前的軟件危機難題,幫助人類開發出模擬現實的真正解決人類難題的軟件系統?幾十年來,國內外的計算機專家一直在尋找這個答案,并且提出了很多創新的思想方法,比如軟件工程的面向對象方法,構件方法,敏捷開發等等。但是始終沒有找到一種方法來解決軟件的根本問題——軟件危機。雖然,軟件工程的某一種創新方法的出現,解決了部分編程的眼前問題,但是當軟件的復雜度增加、軟件系統更加龐大后,新的危機又出現了。而且這種危機比以前更加嚴重。
有沒有銀彈?
圖靈獎的獲得者Fred Brooks博士在1987年所發表的一篇關于軟件工程的經典論文《沒有銀彈》中,把能給軟件產業帶來本質上突變的技術稱為“銀彈”,并且明確地強調真正的銀彈并不存在。他認為沒有任何一項技術或方法可以能讓軟件工程的生產力在十年內提高十倍。這個論斷在這二十多年里一直沒有被打破。
按照Brooks博士的觀點,所有軟件活動包括兩個部分,即根本任務:打造由抽象軟件實體構成的復雜概念結構;次要任務 :使用編程語言表達這些抽象實體,在空間和時間限制內將它們映射成機器語言。
一個相互牽制關聯的概念結構,是軟件實體必不可少的部分,它包括:數據集合、數據條目之間的關系、算法、功能調用等等。這些要素本身是抽象的,體現在相同的概念構架中,可以存在不同的表現形式。盡管如此,它仍然是內容豐富和高度精確的。
所以Fred Brooks博士認為軟件開發中最困難的部分是規格化、設計和測試這些概念上的結構,而不是對概念進行表達和對實現逼真程度進行驗證。當然,程序員還是會犯一些語法錯誤,但是和絕大多數系統中的概念錯誤相比,它們是微不足道的。
事實上,現代軟件系統中存在的一些無法規避的內在特性,即復雜度、一致性、可變性和不可見性,讓軟件開發總是非常困難。因此Fred Brooks博士得到一個結論,天生就沒有銀彈。
目前我們無法確定FO軟件開發方法是否就是真正的“銀彈”,因為只有在更多的實踐中驗證后才能得到明確的結論。但是它可以使用有限的少量代碼實現傳統方法需要數百萬行、數千萬行代碼才能實現的軟件功能,以及它可以建立任意空間復雜度的軟件架構體系,并且這個架構體系結構是可以根據需要隨意調整的。因此至少我們可以認為它是一種高效的軟件開發方法。
FO方法是如何解決“概念結構”難題的?
云計算時代,軟件系統的復雜度比目前已經開發的軟件系統要復雜得多,或許其復雜程度比 Brooks博士想象的還要復雜,而且我們幾乎無法預先知道最終的系統到底有多復雜。開發一個不能預先知道復雜度的軟件系統,聽起來似乎在講一個天方夜談里的故事,然而不幸的是,在云計算時代,它的確是真實的。在西方所有恐怖民間傳說的妖怪中,人狼之所以是最可怕的,是因為我們不知道他們的面孔會變成什么樣的。
為了對付人狼,我們在尋找可以消滅它們的銀彈。這種銀彈是存在的。
那么對于具有人狼特性的軟件,是否也存在銀彈?盡管二十多年前圖靈獎獲得者布魯克斯博士得出了“沒有銀彈”的結論,但是國內外的計算機人員并沒有放棄對“銀彈”的尋找,對希望的渴求以及永不放棄的精神是人類的天性。
作為哲學和軟件技術相結合的產物,FO軟件開發方法是北京乾坤化物數字技術有限公司在多年的實戰中總結出來的方法。而環境的生存壓力是形成這種方法的最大動力。我們不得不考慮如何讓不同行業的軟件使用同樣的代碼,也必須考慮如何用最少而且有限的代碼來構建任意多的功能模塊,以及如何應對不同行業的用戶變化不定的需求。
FO方法是指面向事實的分析、面向結構的設計、面向形式的編程的軟件開發方法。
面向事實的分析是哲學話題而非技術話題。是由行業專家對客戶需求進行邏輯分析,而這種分析是完全不考慮軟件技術的,只是單純地按照哲學方式進行分析,然后建立邏輯模型。因此嚴格來講,它不屬于軟件技術范疇。因為分析人員幾乎不需要和程序員做任何交流,只需要把創建好的邏輯模型交給程序員就可以了。
采用面向結構的設計方法,我們可以得到一個復雜的空間邏輯結構,它將用來處理軟件系統內在特性引發的一些問題,即復雜度、一致性、可變性和不可見性。
復雜度問題。任何一個復雜的現實模型,可以采用哲學方法,分解為簡單對象的連接,而這種連接方式就是結構。因此對一個任意復雜模型的處理就轉換成了對連接方式的處理,也就是對結構的處理。把連接方式進行分類,這樣一個復雜的連接方式就轉換成了由一系列不同類型的簡單連接方式的組合。即得到了一系列的簡單結構。
以云計算農村數據服務平臺為例,得到了樹狀地名分層結構,行業分類結構,表現形式結構,產品分類,服務分類,人員分類,工作類型等等。這些結構組合在一起,就得到了云計算農村數據服務平臺的對象連接方式。
一致性問題。 正如Fred Brooks博士在其論文中所闡述的,并不是只有軟件工程師才面對復雜問題,物理學家甚至在非常“基礎”的級別上面對異常復雜的事物。不過,物理學家堅信必定存在著某種通用原理,或者在夸克中,或者在統一場論中。愛因斯坦曾不斷地重申自然界一定存在著簡化的解釋,因為上帝不是專橫武斷或反復無常的。
但是Fred Brooks博士卻悲觀地認為軟件工程師根本無法用簡單的方法來解決軟件的這些復雜特性。甚至無法象物理學家那樣從信念中獲得安慰。而這種復雜度是人設計的結果,是隨心所欲、毫無規則可言的,這種復雜性引起了軟件的一致性問題。
如同解決軟件復雜度一樣,既然FO方法已經把復雜度問題解決了,自然其一致性問題也就不存在了。因為在每個最簡單的連接方式中,比如行業分類,盡管不同的設計人員在命名或者結構的處理上有差別,但是其本質是一致的。比如我們對果業產品的分類,我們把獼猴桃又劃分為早熟、中熟、晚熟三類,然后對早熟再進行細分,而很多的人沒有增加早熟這一層分類,但是這兩種分類方式在結構上具有一致性。
可變性問題。FO方法把軟件系統分為兩個獨立部分,對象和連接方式(即結構)。軟件結構是一個多維空間架構,每個維是由一組位置數據元素組成。對象又分為兩個獨立的部分,對象的內部特性——形式,對象的外部特性——配置,形式是程序代碼,配置是一組描述數據的集合。
形式作為對象的內部特性,是固定不變的。但是作為外部特性的配置以及作為連接方式的結構是可以變化的。FO方法將通過調整配置和結構來改變軟件,使它更加適應用戶的需求。這種改變不涉及程序代碼,只是對描述數據進行調整,不會增加軟件開發維護的難度。因此可以根據需要隨意改變軟件的功能,以便更加適應環境的需要。
不可見性問題。軟件是不可見的和無法可視化的。軟件的客觀存在不具有空間的形體特征。因此,沒有已有的表達方式,就像陸地海洋有地圖、硅片有膜片圖、計算機有電路圖一樣。當我們試圖用圖形來描述軟件結構時,我們發現它不僅僅包含一個,而是很多相互關聯、重疊在一起的圖形。這些圖形可能描繪控制流程、數據流、依賴關系、時間序列、名字空間的相互關系等等。
FO方法采用具有遺傳特性的無限分層的樹以及線性方式來展示描述軟件的空間形體特征,我們無法描繪軟件的復雜空間結構圖形,但是可以顯示每個維的圖形,比如在云計算農村數據服務軟件平臺里,地名結構樹,分類樹等分別代表軟件空間結構的地名維,分類維,這些是可以采用幾何方式展示的。
幾百行代碼是如何構建傳統方法需要幾十萬行代碼的軟件系統的
面向形式的編程方法(Form-Oriented Programming)的核心思想在于對象的內部特性即對象的存在形式是固定不變的,其外部特性即配置(描述)是可以變化不定的。這種觀點在哲學上已經有明確的推論,比如《邏輯哲學論》等。
對于固定不變的“形式”,我們采用程序代碼方式來完成,即使用一組指令,按照邏輯順序進行排列。配置采用數據描述方式來完成,即制定一種“規定”,用特定的符號來完成對象外部特性的描述。程序只對“規定”里的符號本身做處理,而對符號所代表的具體含義不關心,所以當符號所代表的含義發生改變時,對于程序本身來說,它仍然在做同樣的處理,但是展示給用戶的結果卻發生了改變,是另外一種不同的東西。這是由于人的主觀意識決定的,因為人在大多數時候,是通過外部特性來判斷這個東西是什么,那個東西是什么的,而計算機是通過內部特性來判斷東西的所屬的。
比如在云計算農村數據服務平臺里,物流數據的統計和果品銷售數據的統計,對于人來說,是兩個不同的東西,但是對于計算機來說,它們是一樣的,是對符號做同樣的處理,不同的是作為由符號構成的群,是由不同的同類符號子群構成,每個子群的元素具有相同的構造(處理方法),但是元素的數量可能會有差異。
基于這個特性,就可以采用相同的程序代碼,采用不同的配置(描述),構造出不同行業的大量軟件系統了。比如在我們的“云計算果業數據服務平臺”中,采用幾百行代碼,就已經完成了近200個不同的應用程序,如物流貨運服務,果品銷售服務,農機服務等。而采用傳統的軟件開發方式,完成這樣的系統,如果每個系統使用2000行代碼,至少也需要四十萬行代碼。
接下來我們將開發“云計算蔬菜數據服務平臺”、“云計算養牛數據服務平臺”、“云計算養魚數據服務平臺”、“云計算農村醫療數據服務平臺”、“云計算人口數據服務平臺”等,采用系統同構特性,這些軟件系統將同樣使用這幾百行程序代碼。而采用傳統的軟件開發方法,可能需要幾千萬行代碼。
FO方法的意義
FO方法的意義大致有幾個方面。
一是解決了軟件復雜度問題。FO方法可以快速搭建任意復雜的軟件體系結構,同時可以根據需要隨意修改調整軟件體系結構。這種調整修改可以發生在軟件生命周期的全過程,即開發初期,或者軟件使用過程中。體系結構的調整將形成全新的軟件系統。
從這種意義上講,FO方法使軟件具有可以進化的功能。因為調整的目的是為了讓軟件系統更加適合客戶的需求,每次的調整都可能更加逼近目標。
由于FO方法可以處理任意復雜的模型,所以從理論上講,FO方法可以搭建和現實地球對應的數字地球,在這個數字地球里,有金融體系、商務體系、氣象體系等等。
二是減少了程序代碼的數量。程序代碼的減少,大大增強了軟件的可讀性,可維護性,同時減少的BUG存在的可能性。比如目前的操作系統的代碼達到了數億行,如果采用FO方法,使其代碼的數量限制在幾萬行,那么其維護以及功能的調整修改就容易很多。
三是提高了軟件的安全性。軟件的復雜度以及軟件代碼是導致安全問題的重要因素。大量的安全隱患存在于程序代碼里面。從程序代碼里發現問題并進行處理,是解決安全性的根本途徑。然而在傳統的軟件開發中,由于程序代碼的數量過于龐大,因此預先知道問題的所在是很難的。同時由于軟件的復雜度,有時候即便找到了問題所在,也無法從根本上加以解決,因為這個地方的問題可能已經關聯了N個程序,而我們無法準確的知道那些地方和這個錯誤有關聯。
FO方法通過把復雜的問題轉換為一系列獨立的簡單問題,然后采用解決簡單問題的方法來提高軟件系統的安全性。
四是提高了軟件開發的進度。FO方法采用哲學方法來分析用戶需求模型,采用命題形式來建立邏輯需求模型。程序代碼的編寫過程實際上是對命題的翻譯過程。比如對一個簡單對象的形式進行代碼編寫,實際上已經有了一個哲學上對這個形式的邏輯描述,程序員只需要把這種描述翻譯成計算機語言就可以了,而計算機語言的選擇可以根據需要來選擇,比如java,c等。
和傳統的軟件開發方法比較,FO方法對于大型軟件系統的開發,效果會更加明顯,開發周期可以縮短70%左右。
五是減少了軟件開發成本。軟件開發成本主要是程序員的成本,在一個大型的軟件系統開發中,傳統的方法對程序員的素質以及人員數量的要求很高,軟件是程序員思維過程的記錄,因此人力成本也就很高。同時由于程序代碼的龐大,導致了后期維護成本的不可控,也大大增加了總體成本。
FO方法把軟件開發轉換成為一個簡單的勞動,軟件是現實用戶需求模型在計算機世界的映射。邏輯模型的建立由行業專家采用哲學的方法來建立,程序員只是在完成翻譯工作。因此人力成本相對較低。同時由于代碼數量的減少,后期維護成本也就相對減少很多。
對于大型、復雜的軟件系統開發,FO方法的軟件開發成本會更低,和傳統的軟件開發方法比較,大約會減少60%左右的成本。
六是軟件可以滿足用戶不斷變化的需求。FO方法只把形式部分采用程序代碼方式來實現,而反映對象外部特性的配置部分采用數據描述方式來實現。因此用戶可以根據現實環境的變化來修改軟件配置,以便獲得滿足自己需要的軟件系統。
2010年2月22日
注:此文是中國嵌入式系統產業聯盟網絡空間命運共同體研究會交流文
愿意加入我們研究會和微信群進行共同研討的人士,可掃下面的網絡空間研究會微信群二維碼入和后補填入會豋記表。如您已是中國嵌入式系統產業聯盟理事或會員,只需掃研究會二維碼入群,聯盟秘書處就會為您辦加入研究會的豋記。謝謝!
評論