Diploid 與 Crystal
這篇客座文章是 Ivo Balbaert 對 Diploid 的 Peter Schols 進行的訪談,內容關於他們在生產環境中使用 Crystal 的故事。這次訪談也將收錄在 Ivo 撰寫的 Programming Crystal 書籍中,我們迫不及待想閱讀這本書!
我們感謝他們兩位撥冗分享經驗,並邀請其他在生產環境中使用 Crystal 的公司或個人也分享他們的經驗,如果您願意分享,請 聯絡我們!
在 Diploid,我們使用 Crystal 已經有一段時間了。我們想透過這次訪談分享我們的經驗,並回答那些想在生產環境中使用 Crystal 的公司所關心的問題。
關於我們
Diploid 是一家位於比利時魯汶的公司。我們為醫院和實驗室提供服務和軟體,以利用臨床基因組分析診斷罕見疾病。
你們使用 Crystal 的生產專案有哪些?
我們使用 Crystal 來開發 Moon 的部分功能,Moon 是第一個使用人工智慧自主診斷罕見疾病的軟體套件。世界各地的醫院都在使用 Moon 來診斷患有嚴重遺傳疾病的患者。該軟體需要患者的症狀以及他/她的基因組數據。然後,它會找出最有可能解釋患者病情的突變。
在 Moon 之前,遺傳學家必須使用特殊的軟體手動篩選和排名突變,才能做出診斷。這個過程可能需要數小時甚至數天。Moon 可以自動進行篩選和排名,並在 3 分鐘內提出診斷結果。
Moon 主要以 Ruby 編寫。我們選擇 Ruby 的原因有幾個:快速開發、具表現力的語法、大量的可用程式庫以及一個很棒的生態系統。所有這些都有助於開發人員的快樂和更快的開發週期。但儘管 Ruby 對 Moon 的大部分功能來說都夠快,但對於我們程式碼庫中最需要效能的區域來說,它可能很慢。這就是為什麼我們評估了 Crystal 等其他語言,並最終決定使用 Crystal 進行開發。
你們為什麼決定將 Crystal 用於這些應用程式?
當我們尋找可以用來取代 Ruby 程式碼庫中需要高效能程式碼的語言時,我們評估了許多選項:Swift、Elixir、Go 和 Crystal。我們特別評估了效能、語法和易用性。效能是使用一個小型基準測試腳本來評估的,該腳本包括基因組分析常見的需要高效能的運算(主要是字串運算)。Go 在效能列表中名列前茅,其次是 Crystal。令人驚訝的是,Ruby 的效能勝過 Swift。Go 明顯贏得了效能標準。然而,效能並不是一切:與開發人員的時間相比,基礎設施非常便宜。雖然 Go 是一種有趣的語言,具有很棒的並行模型,但它在其他幾個方面有所欠缺。在 Ruby 或其他語言中理所當然的功能,在 Go 中不可用。範例包括運算子多載或關鍵字可擴展性,以及真正的 OOP。從 Ruby 轉到 Go 有時感覺像是忽略了程式語言設計 20 年來的進展。
Crystal 作為效能第二好的語言,將這種仍然卓越的效能與非常類似 Ruby 的語法結合在一起。鑑於我們的程式碼庫的其餘部分是用 Ruby 編寫的,這是一個很棒的組合。此外,Crystal 具有類似 Go 的並行模型,因此它基本上結合了 Ruby 世界(具表現力的語法、完整的 OOP)的最佳優勢,並將其與 Go 的最佳優勢(並行模型、效能)結合在一起。
Crystal 最擅長解決哪些類型的問題?
目前由 Ruby、Python、Go 或 Rust 解決的任何問題,都有可能在 Crystal 中解決。鑑於它與 Ruby 的相似性,Web 框架將會是 Crystal 生態系統的重要組成部分。然而,Crystal 在其他領域也具有很大的潛力。Python 在數據科學中很受歡迎,但它遠不是最快的語言。有了 Crystal,數據科學家可以結合 Python/Ruby 的易用性和 C 的效能。這些優勢可以使 Crystal 非常適合生物資訊學等效能非常重要的領域。
由於生物資訊學領域的許多人沒有正式的 CS/工程背景,因此擁有一種易於學習的語言也很重要。Crystal 在這兩方面都做得很好。此外,由於其具表現力的本質和低入門門檻(這是它從 Ruby 繼承的特點),Crystal 也是一般腳本和系統軟體的絕佳工具。
您使用 Crystal 開發的體驗如何?
從 Ruby 轉到 Crystal,感覺就像回到家一樣。在語法上,Crystal 非常相似:唯一的重大差異是靜態類型。雖然這需要一點時間來適應,但轉換過程非常順利且容易。許多程式碼行可以從 Ruby 專案中直接複製並貼上到 Crystal 專案中,它們就可以正常運作。不過,有些程式碼行確實需要額外的類型註解。
除此之外,唯一的重大差異是 rubygems (Ruby 程式庫) 生態系統非常廣泛。Crystal 有自己的 gems 版本,稱為 shards。雖然 shards 的數量在過去幾個月中呈指數級增長,但它仍然遠遠落後於 rubygems 生態系統,或者 Go 生態系統。
Crystal 的哪些方面特別有益於客戶滿意度?
我們在生產環境中使用的 Crystal 程式碼不是從 Ruby 移植過來的,而是從頭開始用 Crystal 編寫的。然而,為了測試效能差異(也出於純粹的好奇心),我們將程式碼從 Crystal 移植到 Ruby。對於這個特定的專案,我們注意到 Crystal 版本的速度快了 4.4 倍 - 6.1 倍。這對使用者體驗產生了很大的影響。這表示對於較小的資料集,Moon 幾乎可以即時呈現結果(約 540 毫秒),這對使用者來說感覺是立即的。對應的 Ruby 程式對於相同的任務需要 2.5 秒。當分析較大的資料集時,差異甚至更大:Crystal 平均需要 27 秒,而幾乎完全相同的 Ruby 程式碼需要 2 分 50 秒,速度提升超過 6 倍!當分析數百個樣本時,這些時間差異變得更加重要。
在生產環境中部署 Crystal 應用程式,您體驗到哪些優缺點?
如前所述,速度提升非常顯著。此外,建立二進位檔的功能非常方便,因為它可以輕鬆部署。編譯二進位檔也讓我們可以輕鬆地與內部使用者和測試人員分享軟體。使用 Ruby,我們需要設定 rvm 或 rbenv、安裝最新的 Ruby 版本、安裝 rubygems 以及安裝所有必要的 gems。使用 Crystal,就像複製一個檔案一樣容易。
與其他語言相比,您最喜歡 Crystal 的哪些方面?
效能、建立真正的二進位檔的能力以及類似 Ruby 的語法,對我來說是 Crystal 最重要的賣點。另一個優點是 Crystal 可以非常輕鬆地建立與 C 程式庫的綁定,無需編寫 C 程式碼。最後但並非最不重要的一點是,Crystal 擁有一個由友善且技術精湛的開發人員組成的優秀社群。它始於 Manas 的 Ary、Juan 和 Brian,他們創建了這個語言並幫助 Crystal 新手。同時,似乎整個社群都複製了他們的態度,為每個對這個非常有前景的語言感興趣的人提供幫助和指導。