在QCon倫敦2017大會上,Noredink的軟件工程師Richard Feldman介紹了公司轉向Elm開發的決策過程,他們實現了一個具有10萬行代碼的生產系統自2015年以來運行零異常。Feldman也是Manning出版的《Elm in Action》一書的作者。下面,我們將概述Feldman的主要觀點。
Elm是一種編譯成JavaScript的純函數式編程語言,它使用不可變數據和靜態類型(Static Typing)創建基于瀏覽器的應用。Feldman回顧了Noredink是如何從在小型非關鍵業務中采用Elm,直至現在完全采用Elm這一過程。尤其是在完成一個為期數月的React開發項目后,他認識到:
采用Elm會縮短項目的實現時間。它不僅可以讓公司減少開發人員上手及在公司技術棧中引入該項新技術的時間,而且最終結果也更易于維護。
Feldman指出,使用Elm可以增加生產率和可靠性。其中的一些關鍵影響因素包括:
在線編輯器Ellie。Ellie是一種用于Elm的高級REPL環境,為開發人員編寫、編譯和呈現Elm代碼提供了豐富的接口。
Elm禁止null值在系統中自由傳播,這避免了“十億美元錯誤”(One Billion Dollar Mistake)的發生。null值需要顯式地使用Maybe類型值處理。
Elm強制使用單一不可變(Single Immutable)值表示整個UI的狀態。和React中一樣,雖然模型不必是單一值,但是不存在關聯到單個組件的狀態。使用該模型,Elm的行為類似于Virtual DOM,這是實際DOM的diff化,因此只應用與應用相關的更改。在React中使用了同樣的方法維持性能,同時簡化了對不可變值的處理。
將UI表示為一個單一不可變值,這種做法最突出的優點在于,可以通過與UI更改相關聯的不可變值集處理UI的一系列更改。在以調試模式編譯時,Elm可以通過簡單地點擊相應的模型值去查看UI的歷史狀態。此外,還可以導出這一系列值,這使得別的開發人員可快速地重建UI的異常狀態和生成方式。
靜態類型檢查是Elm的一個巨大賣點。據Feldman介紹,Elm幾乎完全適用“一旦編譯,即可工作”原則。
Elm的可靠性主要原因在于其處理JavaScript互操作性的方式。不同于其它大多數編譯成JavaScript的語言,Elm事實上強制使用了一種基于消息的方式,使得JavaScript代碼運行于服務內部。這確保了無類型的JavaScript代碼不會破壞由靜態特性提供的可靠性保證。
最后一點,雖然Elm的軟件包管理工具不如npm那樣包羅萬象,但是它具有自身的強大之處。特別需要指出的是,它僅允許軟件包中包含Elm代碼,也就是說不允許任何的二進制文件,這使得其相比于npm更為安全。此外,它僅支持被正確編譯的軟件包,并自動強制使用了語義版本。
Feldman總結為,JavaScript確保了前端能更快地展示在屏幕上,而Elm確保了更快的整體開發速度。
報告最后提及了使用Elm這類語言時常能聽到的反對聲音,那就是難于找到可用的開發人員。Felman指出,事實上Noredink從使用Elm中取得了兩個優勢:一方面,這使得公司的求職崗位脫穎而出;另一方面,公司吸引了那些對學習Elm特別感興趣的開發人員。
查看英文原文: Zero Runtime Exceptions in Production with Elm