軟體系統中的配置檔案
每個小人物的心中都有一個成為大人物的夢想,配置檔案也不例外。
當我們還是程式設計新手的時候,經常會有一些前輩告訴我們:軟體開發中要將一些可能變動的引數放到配置檔案中,這樣就可以在不改變程式碼且無需重新部署程式的情況下改變程式行為。
1、軟體實踐中的配置檔案
正如前輩告誡我們的那樣,『將一些可能變動的引數放到配置檔案中』,可以使得程式更加靈活,適應多種業務場景。於是我們謹遵他們的教誨,在日常的開發過程中,將資料庫連線引數,日誌路徑等線上環境相關的易變值加入配置檔案。的確好用,當我們的DB想要擴容,當我們的日誌儲存想要變更,僅需修改配置檔案即可。如此好用,某一天我們可能也會將軟體中的某一個功能特性開關移步到配置檔案中。不止於此,我們開始將更多的可變引數寫在配置檔案中,已達到更高的靈活度,更有甚者將一些業務邏輯操作從程式碼中挪到配置檔案中。於是,某一天我們突然發現自己大部分的時間並不是在寫程式碼,而是寫配置檔案。
2、每一個配置檔案都想成為一個DSL
每個工具都想發展成為一個平臺,無獨有偶,每一個配置檔案都想成為一個DSL( Domain Specific Language,領域專用語言 )。
正如第一部分描述的那樣,起初配置檔案中只是一些與程式碼執行環境有關的引數配置(供系統管理員使用),到最後,隨著一些『業務行為』也被加入到配置檔案中,它則慢慢地進化成為了一種DSL。但並不是每一個軟體系統都需要一套自己的DSL,也不是每一個DSL都會被設計地那麼易懂與易用。有些僅僅是增加了複雜度。
有人發明了『 配置檔案複雜讀時鐘 』的概念來描述配置檔案這樣的一個發展過程,十分貼切。
- 12點:所有邏輯均是寫在程式碼裡,有些甚至是硬編碼 - 對應業務起步期。
- 3點:前輩們告訴我們,將一些可能變動的引數放到配置檔案中 - 業務發展早期
- 6點:需求快速變化,業務邏輯越來越複雜,配置檔案也越來越複雜,引入一些條件判斷,異常處理等- 業務發展中期。
- 9點:有一些定製化的需求開始出現,為了應對這種變化,配置檔案開始走向大量定義軟體行為的方向,並且與業務規則緊密耦合在一起 - 業務發展頂峰期
- 12點:最後的最後又回到原點,所以的業務邏輯均寫在配置檔案中,包括硬編碼 - 業務發展瓶頸期。
於是,軟體開發人員從面向程式碼程式設計變成了面向配置檔案程式設計。其實,這個時期,配置檔案儼然已變成了一種程式語言。
那麼回過頭來想一想,在業務發展過程中,衍生出了一門配置程式語言,這有必要嘛?
配置檔案有時候的確很好用,可以幫助軟體開發人員快速應對一些變化。但是如果過度依賴配置檔案,卻不得不提它帶來的缺陷:
- 不通用:配置檔案引入了非通用的語法、語義,這對專案專案新人來說,無疑增加了學習難度,也降低了團隊的合作效率。
- 除錯困難:不像程式碼,配置檔案無法在軟體系統發生異常時進行有效地除錯,致使無法快速定位問題,修復問題,降低了軟體系統的健壯性。
- 可維護性差:每一門程式語言都基本上有一套自身的通用編碼規範,並隨著開發者社群而得到進一步的完善,而配置檔案,大多數軟體系統都會定義一套自己特殊的語義。相對而言一份使用通用程式語言編寫程式碼的專案比軟體自帶配置檔案要更好維護。
- 高度耦合:配置檔案就如同系統對外API,一旦對外暴露就很難收回。作為模組的API,應該儘可能地小而窄,保持高內聚,低耦合
- 圖靈完備性 :很多帶有『行為』的配置檔案根本不是圖靈完備的(即無法表達出計算機的所有行為),而基本上所有的程式語言都是圖靈完備的。
本質上:配置檔案與程式碼代表了兩種程式設計正規化: 宣告式 (Declarative programming)與 命令式 (Imperative programming)。
當前,幾乎所有計算機的硬體工作都是命令式的,也幾乎所有計算機的硬體都是設計來執行機器程式碼,使用命令式的風格來寫的。從這點來講,大部分場景使用程式碼實現業務邏輯要優於配置檔案。
3、程式碼 OR 配置檔案
要回答這個問題,需要對配置檔案的目的作出一個定義。
對於大部分的軟體系統而言,配置檔案是為軟體系統的管理員而準備的,方便他們正確而高效地 使用 軟體系統。這樣的場景下,應強於程式碼而弱於配置檔案。
這裡總結了一些tips,僅供參考:
- 應當僅將簡單的key-value配置放到配置檔案中。
- 如果允許非開發人員快速改變程式行為,那麼可以考慮配置檔案。
- 任何涉及業務邏輯的地方都應該放到程式碼裡實現,配置檔案不建議加入業務『行為』。
- 如果配置改變需要程式碼改變,那麼需要謹慎使用。
- 如果配置項僅僅是開發者理解的資料結構,那麼需要謹慎使用。
- 使用者為配置負責,開發者為程式碼負責。
凡事終有例外。如這樣的一個場景:應用程式需要允許使用者(使用者)動態地配置複雜的規則(郵件使用者想要定義複雜的郵件過濾規則),另外一些成熟的商業規則系統中也常用配置檔案(作為DSL)解決一些特定領域的問題。