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