Clojure

Swing Education

2018 年 1 月 24 日

Swing Education

您使用 Clojure 或 ClojureScript 多久了?

Swing Education 自 2015 年初創立以來,便開始使用 Clojure 和 Clojurescript。我個人從 2013 年底開始使用 Clojure。

您使用 Clojure 或 ClojureScript 的團隊規模有多大?

我們目前的工程團隊目前由三位全職工程師組成。我們的程式碼庫基本上 100% 是 Clojure。我們積極為 2018 年第一季招聘,並希望將團隊擴展到五位工程師和一位更專注於設計/UI-UX 但仍可能會使用 Clojure 的人員。

您使用 Clojure 或 ClojureScript 正在建構什麼產品或服務?

我們的首要產品是學校用於發布代課教師需求的線上市場。我們協助學校取得更多代課教師,並試圖透過軟體自動化管理代課教師群組(招募、篩選、薪資等)相關的繁瑣工作。我們的網路為代課教師提供更廣泛的工作機會,以累積經驗並建立專業網路。

您最喜歡使用哪個 Clojure 或 ClojureScript 函式庫?

嚴格來說可能不是函式庫,但無論如何,Datomic 使用起來非常令人滿意。以下是一些重點

  • 能夠將資料庫視為一個值,讓我們的程式碼大部分都極具確定性,並移除許多不同類型的潛在錯誤,因為「這個值在執行期間已變更」,因為資料庫值是一致的。

  • d/transact 會在交易後傳回結果資料庫值,這會移除傳統上在讀取複本發生寫入後讀取時會出現的問題。

  • tx-data 以簡單的向量和對應表示,讓我們能夠優雅地撰寫交易,並讓以程式方式產生一次建立或修改多個實體的程式碼變得更為容易。

  • 交易監聽佇列是一種優雅的方式,用於監聽需要觸發通知的資料變更,而不會與交易執行點緊密結合。如果我們的通知程序需要關閉或重新啟動,我們可以使用 d/tx-log 從我們最後已知的通知點再次瀏覽記錄(更不用說延遲了!)。

  • d/as-of 和 d/since 已用於協助時間旅行,以了解使用者在特定時間看到什麼,或系統在執行時看到什麼。當與預期資料庫為參數的程式碼結合使用時,已在製作環境中以這種方式確認錯誤和正確行為。

  • 交易中繼資料讓我們能夠輕鬆記錄誰在何時如何以及為何執行某項操作,然後查詢並使用對應的 tx-log 實體作為 d/as-of 和 d/since 的參數,以了解系統中發生了什麼事。

  • 透過 d/with 的推測交易和記憶體中資料庫,測試和開發人員設定已大幅簡化,讓我們不必管理或設定外部程序。

  • 透過 d/filter 進行資料庫篩選提供了一個優雅的方式來重複使用查詢。例如,我們有查詢報告系統上的總活動,然後重複使用完全相同的查詢,但套用資料庫篩選器來按地理區域或時間範圍細分(請求在過去 7 天、過去一個月等時間內建立)。

    請注意,這比在單次傳遞期間撰寫一個單獨的函式來執行每個區域層級的彙總效率低一些,但對我們而言,總資料集仍然相當小,因此 CPU 處理時間無關緊要。對我們而言,能夠靈活地從查詢中篩選出資料,並且無法超越實作的容易性,這一點更為重要……

  • 透過 d/datoms 和基於資料庫值 d/index-range 的延遲反覆運算!我們大多數的資料處理一次只會在一個小型的資料子集上執行,或僅需要最小的聚集狀態。

    透過傳統的 SQL 系統執行這項工作很困難,因為雖然你可以撰寫 Clojure 函數來產生延遲序列的 LIMIT/OFFSET 呼叫,但你對世界的觀點並不一致。

使用 Clojure 或 ClojureScript 對你來說最有價值的是什麼?

對我們來說最有價值的特性是只有一個程式語言可以在所有地方使用,並允許我們在資料庫(透過載入到交易器類別路徑的 jar 檔或透過交易函數)、網路伺服器和客戶端之間共用程式碼。

Clojure 或 ClojureScript 中你最喜歡的功能是什麼?

可能是主機互操作。在必要時透過互操作利用兩個生態系統中的現有函式庫的能力,允許 Clojure/Script 寄生在這些龐大的生態系統上,同時在上面提供額外的價值。

為什麼使用 Clojure 或 ClojureScript 對你的業務有價值?

Clojure 允許我們透過 REPL 驅動的開發更快速地開發程式碼。產生的程式碼通常較不容易出錯,因為所有內容都是不可變的,函數是可重入的,而且也讓測試變得更容易。透過巨集和強調資料來減少樣板程式碼的設施允許更好的重複使用,並導致較少的程式碼重複和較高階的程式設計。

由於強調核心語言和更廣泛的 Clojure 開源社群的簡潔性和穩定性,我們的程式碼相當容易維護。

你的堆疊是什麼?

在伺服器端,我們使用 Datomic,並以 DynamoDB 作為底層儲存。我們的網路伺服器執行 http-kit。我們使用 Compojure 進行路由,並使用 Sente 進行即時通訊。

在客戶端,我們使用 DataScriptReagent 進行網路客戶端,並有一個行動應用程式實作在 ClojureScript 中,並在 React Native 上執行 iOS。

如果您想分享您的 Clojure 故事,請 填寫此表單