DiploidとCrystal
このゲスト投稿は、Ivo BalbaertがDiploidのPeter Scholsと、Crystalの本番環境での利用について行ったインタビューです。このインタビューは、Ivoが執筆中のProgramming Crystalにも掲載される予定です。とても楽しみです!
お二人には、貴重な経験を共有していただき、感謝申し上げます。また、本番環境でCrystalを使用している他の企業や個人の方々にも、ぜひ経験を共有していただきたいと思います。ご希望の方はご連絡ください!
Diploidでは、かなり前からCrystalを使用しています。このインタビューでは、本番環境でのCrystalの利用を検討している企業にとって関心の高い質問に答え、私たちの経験を共有したいと思います。
Diploidについて
Diploidは、ベルギーのルーヴェンに拠点を置く企業です。臨床ゲノム解析を用いた希少疾患の診断のためのサービスとソフトウェアを、病院や研究所に提供しています。
Crystalを使用している本番環境プロジェクトは何ですか?
私たちは、人工知能を用いて希少疾患を自律的に診断する初のソフトウェアパッケージであるMoonの一部にCrystalを使用しています。Moonは、重度の遺伝性疾患を持つ患者の診断のために、世界中の病院で使用されています。このソフトウェアは、患者の症状とゲノムデータを入力として必要とし、患者の状態を説明する可能性が最も高い変異を提示します。
Moonが登場する以前は、遺伝子学者は特別なソフトウェアを使用して、手作業で変異をフィルタリングしてランク付けし、診断に到達する必要がありました。このプロセスには数時間から数日かかる場合があります。Moonはフィルタリングとランク付けを自動的に行い、3分以内に診断を提案します。
Moonは、主にRubyで書かれています。Rubyを選んだ理由はいくつかあります。迅速な開発、表現力豊かな構文、豊富なライブラリと優れたエコシステムなどです。これらはすべて、開発者の幸福と開発サイクルの短縮につながります。しかし、RubyはMoonの大部分では十分な速度ですが、コードベースの中で最もパフォーマンスが重要な部分では遅くなる可能性があります。そのため、Crystalなどを評価し、最終的にCrystalでの開発を決定しました。
なぜこれらのアプリケーションにCrystalを使用することにしたのですか?
Rubyコードベースのパフォーマンスが重要なコードを置き換えるために使用できる言語を探しているとき、Swift、Elixir、Go、Crystalなど、多くの選択肢を評価しました。具体的には、パフォーマンス、構文、使いやすさを評価しました。パフォーマンスは、ゲノム解析に典型的なパフォーマンスが重要な操作(主に文字列操作)を含む小さなベンチマークスクリプトを使用して評価しました。パフォーマンスリストのトップはGoで、Crystalがそれに続きました。驚くべきことに、RubyはSwiftよりも優れたパフォーマンスを示しました。Goは明らかにパフォーマンス基準で勝利しました。しかし、パフォーマンスがすべてではありません。インフラストラクチャは開発者の時間と比較して非常に安価です。Goは優れた並行性モデルを持つ興味深い言語ですが、他のいくつかの領域が不足しています。Rubyや他の言語では当然のこととなっている演算子のオーバーロードやキーワードの拡張性、真のOOPなどの機能は、Goでは利用できません。RubyからGoに移行することは、言語設計における20年間の進歩を無視するようなものです。
2番目に優れたパフォーマンスを持つ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と非常によく似ています。主な違いは静的型付けです。静的型付けには少し慣れる必要がありますが、移行は本当にスムーズで簡単でした。多くのコード行は、RubyプロジェクトからCrystalプロジェクトに文字通りコピー&ペーストするだけで動作します。ただし、一部の行には追加の型注釈が必要になります。
それ以外に、主な違いは、rubygems(Rubyライブラリ)のエコシステムが非常に広範であることです。Crystalには、shardsと呼ばれる独自のgemsがあります。shardの数は過去数か月で指数関数的に増加していますが、rubygemsエコシステムやGoエコシステムにはまだ及んでいません。
Crystalには、顧客満足度に特に役立つ側面はありますか?
本番環境で使用しているCrystalコードは、Rubyから移植されたものではなく、Crystalで最初から書かれたものです。しかし、パフォーマンスの違いをテストするために、そして純粋な好奇心から、CrystalからRubyにコードを移植しました。この特定のプロジェクトでは、Crystalバージョンが4.4倍から6.1倍高速であることがわかりました。これはユーザーエクスペリエンスに大きな違いをもたらしました。つまり、小さなデータセットの場合、Moonはほぼリアルタイム(約540ミリ秒)で結果を表示でき、ユーザーにとっては瞬時に感じられます。対応するRubyプログラムは、同じタスクに2.5秒かかります。大きなデータセットを分析する場合、その差はさらに大きくなります。平均27秒のCrystalに対し、ほぼ同じRubyコードでは2分50秒で、6倍以上の高速化が実現しました。数百のサンプルを分析する場合、これらの時間差はさらに重要になります。
Crystalアプリケーションを本番環境にデプロイすることで、どのような利点または欠点がありましたか?
前述のように、速度の向上は非常に重要です。さらに、バイナリを作成できるため、デプロイが容易になります。バイナリをコンパイルすることで、社内ユーザーやテスターとソフトウェアを簡単に共有することもできます。Rubyでは、rvmまたはrbenvをセットアップし、最新のRubyバージョンをインストールし、rubygemsをインストールし、必要なすべてのgemsをインストールする必要があります。Crystalでは、1つのファイルをコピーするだけです。
他の言語と比較して、Crystalの最も気に入っている点はどこですか?
パフォーマンス、真のバイナリを作成できること、そしてRubyに似た構文は、私にとってCrystalの最も重要なセールスポイントです。もう1つの利点は、CrystalではCライブラリへのバインディングを非常に簡単に作成できることです。Cコードを書く必要はありません。最後に、Crystalには、フレンドリーで熟練した開発者からなる素晴らしいコミュニティがあります。ManasのAry、Juan、Brianが言語を作成し、Crystal初心者の支援から始まりました。今では、コミュニティ全体が、この非常に有望な言語に興味を持つすべての人に、助けとポインタを提供するという彼らの姿勢を受け継いでいるようです。