跳到内容
GitHub 仓库 论坛 RSS-新闻聚合

Diploid 和 Crystal

Peter Schols Ivo Balbaert

这篇客座文章是 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 的相似性,网络框架将成为 Crystal 生态系统的重要组成部分。然而,Crystal 在其他领域也具有很大的潜力。Python 在数据科学领域很流行,但它远非最快的语言。借助 Crystal,数据科学家可以获得 Python/Ruby 的易用性与 C 的性能的结合。这些优势可以使 Crystal 非常适合生物信息学等领域,在这些领域,性能至关重要。

由于生物信息学领域许多人没有正式的 CS/工程背景,因此拥有一种易于学习的语言也很重要。Crystal 在这两方面都表现出色。此外,由于其表达性强且入门门槛低 - 这些特性它从 Ruby 继承而来 - Crystal 是通用脚本和系统软件的强大工具。

你们使用 Crystal 进行开发的体验如何?

从 Ruby 转向 Crystal,感觉像是回家一样。从语法上讲,Crystal 与 Ruby 非常相似:唯一的重大区别是静态类型。虽然这需要一些时间来适应,但过渡非常顺利且轻松。许多代码行实际上可以从 Ruby 项目中复制并粘贴到 Crystal 项目中,它们会直接运行。然而,有些代码行确实需要额外的类型注释。

除此之外,唯一的重大区别是 rubygems(Ruby 库)生态系统非常庞大。Crystal 有自己的 gem 版本,称为 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 新手。与此同时,整个社区似乎都复制了他们为所有对这门非常有前景的语言感兴趣的人提供帮助和指导的态度。

Diploid

Moon 软件