Clojure

University Health Network

2017 年 4 月 11 日

這篇訪談是與 Dmitri Sotnikov 討論他在 University Health Network (UHN) 使用 Clojure 和 ClojureScript 的情況。

UHN

您使用 Clojure 和 ClojureScript 多久了?

我的團隊大約在六年前開始使用 Clojure,去年我們在最新的專案中將 ClojureScript 整合到我們的堆疊中。

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

我們的團隊約有 30 名開發人員,其中一些人使用 Clojure,而另一些人則使用其他語言,例如 Java 和 C#。隨著優點變得明顯,使用 Clojure 的人數一直在穩步增加。我的直屬團隊由八名專門使用 Clojure 的開發人員組成。

您正在建立哪些產品或服務?

University Health Network (UHN) 的臨床醫生在複雜的醫療保健環境中運作,其中許多患者照護方面必須在多個科系之間進行協調。我們的團隊建立的產品可幫助臨床醫生簡化其工作流程。

此類工作流程的一個範例見於肥胖症診所,那裡的肥胖患者需要接受減重手術評估。讓我們來看看我們遇到的問題以及我們如何解決它。

評估是由來自五個科系的專業人員進行的。評估從護士諮詢開始,然後拜訪社工,然後是營養師,然後是心理團隊。最後,安排患者接受外科醫師訪談。外科醫師必須以簡潔的形式取得其他科系收集的資訊。

評估必須按特定順序完成,每個評估都取決於前一個評估的結果。

由於所有評估都使用同一組資料,因此這項任務變得更加複雜。每個領域都需要看到資料的子集,並在參照資料元素時使用不同的術語集。

當資料的一部分被修改時,它可能會觸發資料模型中的更新,包括不屬於使用者正在處理的檢視的部分。由於多個使用者可能同時處理評估的不同部分,因此我們必須特別注意確保應用程式內的資料完整性。

該專案旨在為使用者提供一種新的工作流程,這意味著隨著我們持續收到使用者的回饋,需求會不斷演變。

專案團隊選擇使用敏捷開發方法,以允許更大的彈性。工作流程被分解為每個領域的模組。我們會在每個模組完成時部署它,並在開發其他模組時將使用者的回饋整合到系統設計中。

團隊為撰寫應用程式的畫面和商業邏輯建立了 Clojure DSL。這些定義儲存在資料庫中,並用於在執行階段產生檢視。

此模型讓我們有能力修改評估的任何面向,而無需重新部署應用程式的客戶端或伺服器部分。

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

Clojure 讓我們能夠提供創新的產品,為使用者提供最佳的工作流程。我們的應用程式最終獲得了 2016 ITAC Ingenious Award

透過使用該應用程式,該診所將病患的等待時間大幅減少,從 128 天減少到 63 天。同時,臨床醫生使用的口述時間減少了 80%,迄今為止總共節省了 240,000 美元。

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

我們非常喜歡使用 JVM,並希望繼續為我們的專案利用這個平台。然而,我們也意識到需要一種語言,既能促進快速開發和原型製作,又能讓我們產生健全且可維護的應用程式。

我們先前使用 Java 專案的經驗顯示,它不適合這些需求。同時,Clojure 因各種原因而成為強大的技術選擇。

此語言讓我們可以在我們的專案中無縫使用現有的 Java 函式庫和工具。這讓我們能夠從我們的舊堆疊順利過渡到以 Clojure 為基礎的現代堆疊。

Clojure 讓我們能夠互動式地開發系統,並快速回應專案變動的需求。團隊能夠快速建立原型解決方案,而不會犧牲程式碼品質。這門語言的動態特性讓開發流程比我們使用 Java 時更便宜、更快速。

REPL 驅動開發讓我們能夠互動式地探索問題空間,並透過實驗找出最佳解決方案。我們發現 REPL 工作流程會產生比單元測試更好的回饋迴圈。

基於 Clojure 的解決方案最終只會產生類似範圍專案中使用 Java 撰寫程式碼的一小部分。不僅如此,Clojure 還讓我們更輕鬆地將程式碼意圖與實作細節分開。能夠將正在執行的動作與執行方式分開,會產生更易於維護的程式碼。

Clojure 專注於不可變性,促成了應用程式各部分之間的自然解耦。在沒有共用全域狀態的情況下,可以獨立處理應用程式的各個部分。產生的程式碼需要較少的測試,因為函式是純粹的,且不依賴於整體應用程式狀態。

由於 Clojure 是一種小而專注的語言,因此很容易訓練新開發人員使用它並提高生產力。我們的合作夥伴 CyLogix 能夠在短時間內訓練他們的承包商使用 Clojure。

巨集讓我們能夠建立特定於領域的抽象。這讓我們能夠使用該領域的語意表達特定於領域的邏輯。

最後,Clojure 證明了自己是一個穩定且可靠的平台。我們能夠在整個開發週期中將專案升級到新版本的語言,而無需進行任何變更。

你的堆疊是什麼?

我們使用 Luminus 堆疊作為專案的基礎。我想特別提到的部分函式庫有

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