简街资本与OCaml:构建系统的发展历程

不爱学习 2025-01-31 17:42:37

简街资本(Jane Street Capital)作为全球领先的做市商之一,以其在金融交易领域的深厚技术和深度的专业知识闻名。公司成立于 2000 年初,员工人数超过 800 名,2020 年平均每日交易超过 20 亿美元的股票。简街资本对外投资中,最大的持仓是标普科技 ETF,占总投资组合的 7.48% 。

简街资本在金融交易系统开发中广泛使用 OCaml 编程语言。OCaml 是一种强类型的函数式编程语言,具有以下独特特性:

1. 静态类型系统:OCaml 采用静态类型系统,编译器在编译时进行类型检查,能够在编译阶段发现大部分类型错误,保证了编程的正确性和可靠性。这使得 OCaml 在大规模软件开发中能够提供较好的支持,减少了运行时错误。

2. 函数式编程:OCaml 是一种强调函数式编程的语言,支持高阶函数、匿名函数以及递归等特性。函数可以作为一等公民,可以作为参数传递给其他函数,也可以作为返回值。这样的特性使得 OCaml 非常适合解决数学计算、程序验证等领域的问题。

3. 模式匹配:OCaml 提供了强大的模式匹配机制,可以对不同的数据结构进行匹配和处理。这样的特性使得代码编写更加简洁和易读,通过模式匹配可以有效地处理复杂的逻辑判断和数据转换。

4. 并发编程支持:OCaml 提供了对并发编程的支持,使得开发者可以更容易地编写并发程序。

简街资本选择 OCaml 作为其主要编程语言的原因在于 OCaml 的函数式编程风格和清晰的表达性。这使得非程序员的交易者可以执行代码审查,以验证高性能代码是否能够完成预期的工作。此外,OCaml 帮助简街资本快速适应不断变化的市场条件,并以更少的努力从原型转向生产系统。

Jenga 的诞生与困境

大约在 2012 年,简街资本对当时 OCaml 的标准构建系统 OMake 感到不满,决定自行开发一个名为 Jenga 的构建系统。Jenga 在简街资本内部表现良好,他们认为这个系统可能会对更广泛的社区有用,于是决定发布 Jenga。然而,事与愿违,Jenga 并没有受到广泛欢迎。一方面,它无法在 Windows 上运行;另一方面,采用 Jenga 意味着要完全接受简街资本的 OCaml 构建方式。由于采用率较低,简街资本最终决定停止开源 Jenga。

Jbuilder 的出现与流行

到了 2016 年,简街资本决定开发一个简单的跨平台工具 Jbuilder,允许外部用户在不完全采用 Jenga 的情况下构建他们的代码,同时也避免了使用当时新兴的 OCamlbuild 标准重写构建的麻烦。Jbuilder 能够理解 Jenga 使用的 jbuild 文件进行构建配置,并按拓扑顺序执行所有必要的编译命令。但它并不是传统意义上的构建系统,因为它每次都会重新执行所有命令,而不是仅重新执行输入已更改的命令。

然而,Jbuilder 却意外地受到欢迎。人们开始使用它来构建不仅限于简街资本的软件包,还有他们自己的项目。尽管 Jbuilder 最初只是一个兼容层,但它的速度优势使其成为了一个有吸引力的选择。Jbuilder 的编译速度比 OCamlbuild 快约 5 倍,加上其可移植性和易于修改的特点,吸引了早期采用者和贡献者。

Dune 的发展与完善

在与 OCaml Labs(以及现在的 Tarides)合作下,简街资本开始将 Jbuilder 发展成为一个更完整的构建系统,以满足更广泛的开源世界的需求。但在此过程中,他们遇到了一个棘手的问题 —— 名称冲突。由于 Borland 已经有一个名为 “JBuilder” 的 Java IDE,尽管该系统已经停用,简街资本还是尝试联系了当前的版权持有者,但未能获得使用该名称的许可。因此,他们决定选择一个新名称,通过社区投票,“Dune” 最终成为获胜者。

随着 Dune 的流行,简街资本发现自己陷入了需要维护和支撑两个构建系统的尴尬境地。很明显,Dune 是更好的系统,它具有重新设计的架构,对大多数人的构建来说更快,采用了更广泛的方案,并且拥有更好的 API 和用户体验。这引发了何时将简街资本的项目迁移到 Dune 的问题。尽管这个工具的起源令人感到荒谬,但他们确实面临这样的选择。

由于构建系统团队需要应对不断增长的代码库,迁移工作被一再推迟。2016 年 Dune 开始时,简街资本有 400 万行 OCaml 代码;而如今,他们已有 6500 万行 OCaml 代码,外加 500 万行 Python 代码。迁移工作令人望而生畏,但他们还是乐观地估计,这项工作可能会在接下来的六到十二个月内完成。

Dune 的最终胜利与未来展望

直到去年,简街资本才决定下定决心进行迁移。他们已经将构建系统团队扩充到五名全职工程师,因此认为自己终于有实力来应对这个长期令人畏惧的挑战。

他们最初没有充分意识到的一项重要工作是让 Dune 能够扩展到他们庞大的代码库。Dune 在外部用户中表现出色,但这部分是因为大多数用户的项目规模相对较小,与简街资本 7000 万行代码的代码库相比微不足道。而 Jenga 也并非停滞不前,在过去的十年里,他们不断改进 Jenga 的实现,以应对代码库的增长。这使得 Jenga 在处理大规模项目方面已经相当优化,并且能够很好地满足他们单体代码库的需求。现在,这些优化工作中的大部分需要移植到 Dune 中。

此外,还有其他一些问题需要解决。构建系统被多种不同的工作流程调用,尤其是来自三种不同的编辑器 —— Vim、Emacs 和 VSCode。每种编辑器都有其自定义的 Jenga 集成,这些集成需要逐一迁移到 Dune。

经过一年多的专注工作,他们终于完成了迁移。在切换时,Dune 的性能在各方面都与 Jenga 一样好,甚至在某些情况下更好。特别是在大多数构建工作已经在缓存中的情况下(这实际上是一个非常常见的情况),构建速度提高了 2 - 3 倍。

他们所做的许多改进 Dune 性能的工作将被开源,其中一些已经开源。他们非常注意避免再次出现两个构建系统的情况 —— 一个简街资本专用的 Dune 和一个外部的 Dune,因此他们投入了很多精力将他们的更改上游化。

Dune 为开展新工作提供了非常好的基础。部分原因是 Dune 的代码库更简单,更容易处理;部分原因是他们可以专注于一个系统。像分布式构建、浅构建(也称为 “无字节构建”)以及构建图的缓存加载等功能,现在都比以往更接近实现。

现在,他们拥有了一个单一的系统,并且改进它的速度大幅提升。团队已经扩充到 12 名全职工程师,分别位于纽约、伦敦和新加坡,这意味着他们现在可以 24 小时不间断地进行开发和维护工作。这一举措对于简街资本来说具有重大的战略意义,因为构建系统性能的提高可以改善开发者的投产比,从而成为公司竞争的护城河。

0 阅读:4
不爱学习

不爱学习

感谢大家的关注