說到科學計算軟體架構設計,有很多人沒有這個概念。說到能寫代碼,絕大多數研究人員都可以做,這本來就是一種本分。能夠寫代碼和能夠寫架構是兩回事。很多課題組都有一些祖傳代碼,無論是經過什麼來由獲得的,自己寫的還是國外帶回來的,代碼本身就可以解決一些問題,有一些歷史的積澱。在此基礎上能夠改寫一些功能,加入一些演算法,甚至對框架進行一些優化都是可能的。有一些水平比較高的研究生可以寫出比較漂亮的代碼,完成很多很炫的功能。從這個角度講,軟體開發似乎也就是個小菜一碟。實際上這是個誤區。軟體什麼時候會面臨問題呢?因人而異。但是大體都在某個時間結點,如果一個軟體功能比較單一,也不怎麼需要與時俱進的加入新功能,那麼就不會存在這個問題。有些水平較高的研究人員,大概一週左右就可以完成幾千到上萬行代碼,而且寫的很不錯。這些人如果碰到軟體加入新功能不方便的時候,很容易想到的就是推倒重來,再寫一個便是了,小菜一碟。這種做法在代碼量在一定時間內是有效的,但是一定有一個時間點或者說代碼量到一定程度,比如說20萬行左右(只是舉個例子),這時無論是重寫還是在原有代碼上改動都很難受。如果遇到類似的問題,纔是真正考驗架構的時刻。架構彈性不足,改寫幾乎是絕望的,重寫設計有基本需要個一年半載。在這一年半載之內會發生很多事情,使之美好的計劃得不到完美的實施。更多的情況是,剛開始信心滿滿,寫到一半發現問題多多,有的時候新的設計某些地方還不如老代碼,甚至會出現爛尾,如同軟體下載到99%的時候突然沒有資源了一樣。所以說如何在不推倒原有設計的同時,能夠不斷改進,持續開發,持續集成,纔是考驗架構設計的關鍵。這裡面有設計模式,對設計模式一無所知也是很難進行架構設計的,但是更重要的是知道如何進行代碼重構。代碼重構是高於設計模式的。不會代碼重構,設計模式也就是空談。

那麼什麼是設計出一個好的架構的原則呢?我個人認為什麼可擴展性可維護性等老生常談都沒啥意思。要點在於寫不出來好的架構,能不能寫出個爛的來?如果可以,就走出了第一步。大多數人第一步也沒這個能力,沒有完整寫一個大型代碼的能力,爛的也寫不出來。只會在已有架構上修改,這種能力不作數。比如對於cfd代碼而言,很多人可以在OpenFOAM,Su2,或者CFL3D上進行開發,但是無論如何改進,也就是上述軟體上的一個功能上的變種,或者是某種意義上的加強版,但是不會是不同的架構。這樣的人員一般不具備架構設計的能力,說到要進行改進,能夠寫出比OpenFOAM,Su2,CFL3D更好的架構對於他們來說是天方夜談。第二步就是已經寫出了一個很爛的架構,能不能在此基礎上持續進行改進,對架構進行演化?這個是目前絕大多數研究單位,研究機構和個人都做不到的。對於架構進行演化,我聽到的最多的聲音就是架構設計好了,就不要動了,老動架構大家都受不了。這種意見有沒有道理,還是有的。但是是一種史前時代的聲音和觀點,那種小國寡民,老死不相往來的時代是可以的。目前的萬物互聯的時代是不可以的。對於這個理解,連微軟這種大公司在互聯網時代都出現了誤判。好啦,如果有了第一步和第二步,能不能夠取得成功?事實上,熟悉數學歸納法的應該知道理論上是可以演化出一個好的架構的。

這個原則已經清楚了,那麼如何保證實施呢?空有理想,理論,沒有實踐和工具也是枉然。這裡面的工具大概有版本管理工具如git,這個非常重要,對架構進行演化需要在版本管理工具的加持下進行操作,而且步子要盡量小(而不是盡量大)。這個實際上是類似於求偏導數,就是在原有功能目標不變的情況下,對架構進行演化。或者說隨便折騰,前提是不能破壞原有功能。也是就是原來能解決的工程問題,新的版本一樣可以解決,不僅如此,還能解決一些新的問題。還有就是對於c++來說,需要cmake這種跨平臺的構建工具,這個也非常重要。第三,與之配合的是包括單元測試在內的自動化測試工具,這裡不詳細論述。也就是自動測試,持續集成,持續部署。

下面在隨便說一下對於如何進行人工智慧對於架構的演化的加持。實際上架構設計這種臟活累活,對於人工智慧來說應該是小菜一碟。設計約束就是維持原有目標集的不變,增加新的功能,使之內部的參數最小化。我經常思考歐幾裏得的幾何設計的精巧,在幾個公理,定理的加持下演化出整個平面幾何原理。這個過程,就是極高水準的架構設計。如何確定公理的個數,太多了好不好?如何確定定理的個數?引理的個數,想起來令人陶醉。這些定義的不合適就會出現,定理沒法復用,每解決一個新問題就要從頭證到尾,即囉嗦,也沒法在文明的基礎上進行生長。也說明對問題理解的不夠深刻。這就是不好的架構設計。再說的深入一些,這裡面有所謂的物理裡面的熵之類的東西,也有最短路徑等拓撲之類的東西。定義不好,就會出現補丁上打補丁,邏輯混亂的情況。

如果平面幾何的定理已經準備完畢,下面可不可以推廣到三維情況,立體幾何的情況?微分流形的情況。人類的認知就是在已有知識的基礎上,用已知的來解決未知,這個過程如果交給機器來做豈不是激動人心?這種對應的就是高級別的架構的演化,按照某種原則生出智能,是一種邏輯動力學,在物理基礎之上的形而上學。這應該不會是課本上的知識。

最後還是提一下國產開源CFD軟體OneFLOW,就是在這些演算法,想法加持下,不斷對架構進行演化的生命力極其頑強的開源代碼,歡迎各位感興趣的人員多交流,共襄盛舉。

推薦閱讀:

相關文章