生活在REPL中,工具與程序一體

最近對《On Lisp》中提到的「自底向上程序設計」——經過改造語言來接近問題領域——有了新的體會:生活在REPL中,工具與程序一體。數據庫

開發一個項目,除了用編輯器敲代碼、編譯器編譯代碼、命令行中運行等,總會用到許許多多輔助的開發工具。好比訪問MySQL數據庫用MySQL Workbench、訪問MongoDB使用Robomongo,還有訪問Redis、訪問RESTful接口……每作一件事情都得有相應的輔助工具。服務器

常見的解決方案就是「IDE」:把這些工具都塞進一個盒子裏。就像IntelliJ IDEA擁有Database、Terminal等一系列插件,幾乎覆蓋了開發經常使用的全部工具,但基本上仍是1+1=2的狀況。數據結構

舉個例子,要求從某些數據庫中抓取數據並輸出到文件中。因而先用MySQL客戶端鏈接目標數據庫,通過不斷的調試和優化,終於寫出能得到目標數據的SQL;但原始數據可能包含敏感信息,返回的結果是通過加密的數據,常見的MySQL客戶端可沒辦法幫你調用解密程序;因此不得不本身編寫代碼處理,但爲了避免干擾現有代碼,決定另起一個新工程,因而數據庫鏈接配置、加解密服務器配置……編輯器

就在我陷入反覆造輪子沒法自拔時,Lisp/Clojure給了我新的啓示:函數

  1. 改造語言,讓它更接近問題領域
  2. 寫代碼的入口是REPL,而不是編輯器

例如我如今維護的系統中,須要訪問多臺數據庫服務器,所以須要一個客戶端能靈活地在多臺數據庫之間快速切換,還能彙總獲取的數據一併處理。因而我經過添加一系列自定義函數來加強Clojure,經過調用(db/all :dbname "SQL statement" argments...)在指定的數據庫中獲取數據,並組裝成Clojure可直接操做的數據結構。工具

如今,通過我個性化定製的Clojure REPL就是個人工做環境,在其中能訪問多臺MySQL、訪問Redis集羣、訪問MongoDB、調用外部RESTful服務、加解密數據……再遇到相似上面例子中的臨時需求時,我直接在REPL中調試SQL,當調試完成時代碼也就寫完了,返回的結果可直接用Clojure處理並保存到文件,這一切渾然天成!開發工具

這讓我想起了SmallTalk,假裝成IDE的操做系統:把工做環境、測試環境、運行環境無縫地融合到了一塊兒,真正能夠爲所欲爲進行個性化定製的環境!測試

相關文章
相關標籤/搜索