在FP Complete使用Rust的原因

106 阅读6分钟

在FP Complete,我们长期以来一直在谈论一种软件开发语言的三大支柱:生产力、稳健性和性能。很多时候,这三大支柱是相互冲突的,或者至少看起来是这样。快速进入市场(生产力)往往涉及到对质量保证的吝啬(健壮性),或编写低效的代码(性能)。或者你可以写一些简单的代码,这很容易测试和验证(生产力和稳健性),但最终会有一个缓慢的算法(性能)。优化代码需要时间,并可能引入新的错误。

在我们公司的整个历史中,我们的论点是,虽然这里的某种程度的权衡是不可避免的,但我们可以利用更好的工具、语言和方法论来提高我们在所有这些支柱上的地位。我们最初关注的是Haskell,一种使用强大的类型系统并提供良好性能的函数式编程语言。我们仍然喜欢并继续使用Haskell。然而,意识到代码只是战斗的一半,我们开始采用DevOps方法和工具。

我们怀着极大的兴趣看着Rust编程语言的发展、成熟和在工业界的应用。几乎所有的主要技术公司现在都在为Rust投入大量精力。最近,微软已经相当公开地拥抱了Rust

在这篇文章中,我想分享一些想法,说明为什么我们很高兴看到Rust在工业界的采用,我们在FP Complete使用Rust的原因,并给感兴趣的公司提供一些建议,说明他们如何能够开始采用这种语言。

为什么是Rust?

我们非常相信利用计算机本身来帮助我们编写更好的代码。其中一些可以通过测试驱动开发(TDD)这样的方法论来实现。但在TDD这样的技术链条中,有两个薄弱环节:

  • 它需要积极的努力去思考什么需要被测试
  • 有可能忽略这些测试的失败,并运送坏的代码

后者可能听起来很牵强,但我们已经看到它在工业中发生。测试的局限性是众所周知的,我们以前在博客中推荐过测试策略。不要误会我的意思:测试是软件开发的一个绝对重要的部分,你应该做更多的测试。

但是,行业经验告诉我们,许多bug都是通过测试溜走的。也许最常见和最危险的一类错误是内存安全问题。这些问题包括缓冲区超限、"使用后自由 "和 "双重自由"。这些类型的错误特别令人担忧的是,通常,最好的情况是你的程序崩溃。最坏的情况包括重大的安全和隐私漏洞。

工业标准的方法是通过使用托管语言来绕过这些错误。管理型语言绕过了显式内存管理,而是依靠垃圾回收。这引入了一些缺点,延迟是最大的一个。通常情况下,垃圾收集的语言对内存的需求也更大。这就是上面提到的典型的效率与正确性的权衡。我们一直很乐意自己做出这种权衡,使用像Haskell这样的语言,并接受一定程度的性能冲击。

Rust采取了一种不同的方法,我们对这种方法深感钦佩。通过引入所有权和借用的概念,Rust试图大幅减少内存安全错误的发生,而不引入垃圾收集的开销。这完全符合FP Complete的思维方式,即尽可能使用更好的工具。

这样做的坏处是复杂。了解所有权可能是一个挑战。但请看下面关于如何开始使用Rust的信息。这是FP Complete作为一家公司,以及我个人,对其非常感兴趣的一个领域。

然而,超越内存安全问题的是Rust语言的其他设计。作为一种相对较新的语言,Rust有机会向市场上许多其他语言学习。而在我们看来,它已经从其他语言中选择了一些最好的特性,尤其是我们所喜爱的Haskell。其中的一些特性包括:

  • 强类型
  • 总和类型(又称枚举)和模式匹配
  • 明确的错误处理,但有一个漂亮的语法
  • 异步语法
  • 通过闭包和Iterator 管道的功能风格

换句话说。Rust已经完全接受了使用更好的方法来解决问题的概念,并窃取了已经被尝试和测试的伟大想法。我们相信Rust有可能极大地提高世界上的软件质量,并带来更多可维护的解决方案。我们认为Rust可以在解决全球软件危机方面发挥重要作用。

Rust在FP Complete

到目前为止,我们在FP Complete对Rust采取了三管齐下的方法。这包括:

  • 为内部和外部受众制作教育材料
  • 将Rust用于内部工具
  • 用Rust编写产品代码

我们创建的主要教育产品是我们的Rust速成课程,我们将在这篇文章的最后提供。这个课程是为了解决我们看到的开发者在使用Rust入门时最常见的陷阱。

另外,作为一个个人项目,我决定看看Rust是否可以作为第一种编程语言来教,我认为它可以

对于内部工具和产品代码,我们总是有这样的争论:我们应该使用Rust还是Haskell。在过去的一年里,我们一直给我们的工程师更多的自由,让他们自己做出这个决定。就个人而言,我还是更喜欢用Haskell,这其实并不令人惊讶。我在专业上使用Haskell的时间比Rust存在的时间长。但是我们看到Rust的进步--无论是在库的生态系统还是语言本身--意味着Rust几乎每个月都会变得更有竞争力。

在这一点上,我们有一些特定的时间,Rust是一个明显的赢家:

  • 当性能很重要时,我们更喜欢Rust。Haskell通常足够快,但对Haskell代码进行微优化最终会比用Rust编写代码花费更多时间。
  • 对于客户端代码(例如,命令行工具),我们一直倾向于Rust。总的来说,它比Haskell有更好的跨操作系统支持。
  • 在某些领域,Rust的库覆盖率要比Haskell好得多,那么我们就会倾向于它们。(同样的情况也适用于其他方向)。
  • 由于我们是喜欢玩闪亮的工具的工程师,如果有人想获得额外的乐趣,Rust通常就是这样。在世界上的大多数地方,Haskell可能会被认为是闪亮的玩具。FP Complete在那里是相当出色的。

在FP Complete,我们正开始向Rust的第四个领域拓展:咨询服务。在过去的几年里,Rust的市场一直在稳步增长。我们相信在这一点上,Rust已经准备好被更广泛地采用,我们渴望帮助企业采用这种美妙的语言。如果你有兴趣了解更多,请联系我们的咨询团队以获得更多信息