30 秒看懂
Ron Minsky 与 Jane Street 软件工程师 Ella Ehrlich 讨论 Gord:这个关键系统对交易活动进行标准化并分发数据。两人分析历史设计约束、通过 Kafka 扩展规模、加强类型、测试与部署等改变,以及团队如何在公司持续依赖系统的情况下推进现代化。 Ehrlich 还介绍了面向女性及其他代表性不足群体的宣传和教育项目及其早期结果。文中数字和计划反映的是 2022 年对话时的情况。
- 1中心化交易数据服务Gord 将交易活动标准化并分发,供持仓、风险、清算和监管流程使用;系统中断可能导致交易停止。
- 2灵活的数据,僵硬的依赖字段集合让某些添加操作很容易,但消费者依赖隐含结构,使协议的根本性改变变得困难。
- 3用 Kafka 分发数据拉取式持久数据流和共享快照减少了逐客户端处理的工作,也让慢速消费者可以落后而不立即断开。
- 4明确数据约定带类型的库引导数据生产方提供必需字段,并将逻辑交易与旧格式分离。
- 5测试和自动化部署性能测试和代码内测试提高了信心,预先设置的配置则替代了人工修改各地区符号链接的流程。
- 6扩大招聘范围Ehrlich 介绍面向原本可能不会考虑 Jane Street 的人群开展的宣传和教育项目。
要点建议
- 关键交易数据必须保持准确和可用,尤其是在市场异常繁忙的时候。
- 即使底层数据格式看似灵活,旧接口也可能限制系统变更。
- 持久消息队列可以让慢速消费者和共享快照与核心处理流水线解耦。
- 带类型的接口和测试能让隐含的数据约定更容易理解和修改。
- 将有时间要求的部署步骤自动化,可以减少对人工反复警惕的依赖。
- 招聘宣传可以提供有价值的教育体验,同时扩大潜在申请者群体。
按章节阅读整理后的全文
从游戏到交易技术
Ehrlich 解释实习为何吸引她加入 Jane Street,以及她为何将游戏保留为爱好。她介绍 Gord 在交易数据处理中的作用。
Ron Minsky 介绍 Jane Street 软件工程师 Ella Ehrlich。她多年来一直参与 Gord 的工作,这个系统的历史比她约十年的任职时间还长。Ehrlich 原本对金融兴趣不大,也以为自己会从事游戏设计,但一次实习中的学习和成长经历促使她在 Jane Street 开启职业生涯。
Ehrlich 仍然玩游戏、关注游戏,但很乐意将其作为爱好。她从游戏开发行业的朋友那里听说,这个行业竞争激烈、工作时间很长;她把游戏开发者比作软件行业的音乐人。Minsky 赞同,热情吸引许多人投入艰难且竞争激烈的创造性工作。
Gord 从世界各地的平台和交易所接收交易数据,将其标准化后在 Jane Street 内部分发。消费者利用这些数据计算持仓、向清算公司上传交易、完成结算,并支持其他工作流程。
Ehrlich 用例子解释持仓:买入 100 股 Apple 股票,就形成 100 股持仓;卖出 20 股后还剩 80 股。Minsky 补充,这些信息用于实时风险和盈亏分析、卖空等监管区分,以及与其他市场参与者进行日终对账。
可靠性与历史假设
Gord 必须应对高峰并保持可用。关于合成数据和标准化的历史选择形成了一些难以撤销的承诺。
交易最繁忙的时候,性能尤其重要。Ehrlich 说,团队至少按最近创纪录交易日的两倍、理想情况下按两到三倍来规划容量,因为新高峰可能大幅超过过去纪录。她说在当时,最繁忙的一天达到普通日的 5 倍并不奇怪,尽管具体比较会有差异。
如果 Gord 宕机,Jane Street 会自动停止交易,因为不了解自身交易活动就无法安全决策。系统旨在隔离故障,例如将故障限制在某一个交易所;变更也要经过大量测试。另一个数据中心的生产备用系统处理相同活动,以便机器或网络出现问题时进行故障切换。
Minsky 说,Gord 建成时公司编写软件的经验还较少。团队必须在绕过原始设计中固有决策的同时,扩展系统并增强其可靠性。Ehrlich 描述了早期流水线:系统通过 SSH 持续读取来源文件,数据采用竖线分隔的标签和值。
系统早期承诺在成交记录之前交付订单,即使来源发送了成交记录而没有观察到订单。为了维护这一不变量,系统会合成订单。Ehrlich 现在认为这是个错误,但消费者已经依赖这一行为,因此很难移除这一假设。
Gord 还会标准化证券代码。同一种工具在交易所及 Reuters、Bloomberg 等数据提供商那里可能有不同标识,不同地区和资产类别又带来更多复杂性。用户名也有类似问题:一个平台提供电子邮件地址,另一个则提供专用登录名。
团队逐渐把部分标准化工作移向数据源附近,因为相关知识自然存在于那里。Minsky 指出,原系统消费的是从交易所或经纪商下载的原始文件,因此只有 Gord 能做标准化。现在更多活动经过了解各个交易场所的内部系统。
Gord 还施加了协议层面的不变量。旧系统的核心消息类型包括订单、表示订单关闭的 out,以及成交记录。为了表示拒单,系统会合成一条订单和一条关闭记录,并添加字段说明它来自拒单;消费者必须检查该字段,而不能直接接收一种独立的拒单消息。
数据模式、消费者与容量
灵活的字段映射允许增加数据,却限制了根本性修改。Ehrlich 介绍流水线、客户端扇出和衡量吞吐量的必要性。
客户端最初通过 TCP 直接连接并解码二进制消息。由于协议没有通用的版本管理策略,新信息通常被加进字符串到字符串的映射,而不是顶层类型。可选字段因此容易添加,但字段的含义和使用方式也更难理解。
系统用取消并重新记入整笔成交的方式表示修正和分配,而不是进行更小的调整。Minsky 指出,灵活的格式仍可能变得僵硬:客户端代码会默默依赖其中的结构。数百个客户端里有许多对交易至关重要,破坏这些假设不是可行选项。
对于根本性的协议变更,旧系统必须为每个客户端版本升级或降级消息,可能需要多次序列化同一事件。Minsky 指出,可选字段仍然容易添加,但新交易类型要困难得多。新的高交易量业务也需要比现有大型类型更紧凑的表示。
Ehrlich 介绍系统架构:解析器读取数据源,一个名为 DB 的进程收集数据并可能合成缺失事件,各办公室的标准化进程调整证券代码和用户信息,再将数据分发给客户端。直接向数百个消费者发送完整数据流造成了昂贵的扇出问题。
与数据源之间的隐含约定基本是 Gord 总能跟上且永不失败,吞吐量限制既没有记录也没有强制执行。Ehrlich 建立性能测试,以找出数据源何时需要分片,并衡量单条流水线的容量。
采访时,一条解析器—DB—标准化流水线每秒大约能处理 50,000 条消息,但由于下游还有额外工作,团队把允许速率定在约 25,000 条。独立流水线可以分布到不同机器上,实现水平扩展,而不必把所有活动都塞进一个线程或进程。
系统保证每个上游数据源内部的顺序,但不保证跨数据源的统一全局顺序。不同交易所的事件也很难有一个有意义的统一到达顺序。Minsky 指出,这种较弱的保证还允许办公室在跨办公室连接受损时继续运行。
Kafka 与更强的接口
Kafka 改变了数据分发和快照方式,带类型的生产方库让要求更加明确。团队也开始提供更有针对性的数据流。
团队使用 Kafka 作为分布式消息队列,改变了每个客户端直接连接 Gord 的方式。此前,慢速客户端会积累每个连接各自的缓冲区,最终可能被断开。一些消费者,例如日终报表,只要能在截止时间前处理完数据,就不必在每次市场高峰都实时跟上。
使用 Kafka 后,消费者在准备好时请求消息,即使落后于数据流最新位置也不会立即失败。两人澄清,Kafka 同样使用 TCP;改善来自经过专门设计的队列及其资源管理,而不是避免使用 TCP。消息保留在磁盘上,不再为每个慢速客户端分别积累活跃缓冲区。
Kafka 还改善了快照。此前,每个客户端连接时,Gord 都会为其生成包含此前全部活动的快照。现在独立进程可以消费数据流,定期创建可供共享的现成快照;客户端从快照开始,再从数据流中的对应位置继续处理。
另一个变化针对生产方的数据质量。旧的 FIX 风格标签和值文件有很多可能的字段,但明确约束很少。生产方必须询问 Gord 开发者哪些字段必填——例如债券成交需要结算日期,其他成交则不一定需要。
新库为生产方提供针对特定交易类型的带类型记录,明确告诉他们必须提供什么。库负责将数据转成 Gord 的现有表示,减少沟通协调,也让以后修改底层格式更加容易。采访时,该库仍在开发和完善中。
Minsky 认为,带类型的接口让生产方团队与 Gord 开发者能够围绕结构化交易协作。从长远看,类型可以贯穿整个流水线,使变更在各个应用中清晰可见;共享的单一代码仓库也有帮助,因为当前版本一起编译。
消费者最初只能选择完整数据流或仅成交记录;后来又增加了监控数据流,容纳不影响记账或持仓的活动。随着公司发展,消费者希望获得期权或面向客户交易数据等子集。团队开始提供相对静态的子数据流,按证券代码动态查询仍是未来目标。
测试与更安全的部署
团队增加性能测试和代码内测试,并将脆弱的区域发布流程自动化。持续可用仍是长期目标。
Ehrlich 加入时,系统几乎没有代码内测试。团队会将开发环境输出与生产环境比较数天,并在发布前遵循大量人工流程。过去一年发布几次;到采访时约为每月一次,但仍慢于团队希望的速度。
Ehrlich 增加了性能测试,以便在每次发布时发现性能回退。团队也建立了从输入到输出的代码内测试。此前开发者必须启动完整开发系统并手动构造交易活动;自动测试能够展示预期行为变化,让审查和修改更有信心。
过去的部署流程需要在香港、伦敦和纽约各自的不同时间,人工修改指向生产二进制文件的符号链接。各地区交易日相互重叠,如果错过狭窄的时间窗口,各办公室就可能对哪个实例是主实例产生分歧。
Ehrlich 回忆自己第二次发布时忘记修改伦敦的符号链接,直到该地区已经开始运行才发现。团队不得不回滚并处理一次生产事故。她提到 ADHD 让她难以记住狭窄时间窗口中的任务;更深层的问题是流程依赖人反复保持警惕。
团队用可以提前数天准备的配置取代了人工切换。一个进程负责跟踪某个交易日应由哪个 Gord 实例担任主实例。Minsky 指出,这种复杂性部分源自历史上的区域交易日边界,以及重叠的全球数据共享。
公司正朝更连续的运营方式发展,Ehrlich 希望 Gord 能够更接近全天候可用。停机窗口仍有助于重启和归档,因此动态增删机器属于一项较长期、渐进的转型,而不是已经完成的变化。
招聘与宣传
Ehrlich 讨论 Women in STEM、Insight 以及面向不同职业阶段女性的工作,分享进展和仍待解决的问题。
谈到招聘,Ehrlich 说自己加入 Jane Street 时是公司的第二位女性开发者。她原本没打算从事金融工作,如果没有实习经历,可能根本不会考虑这家公司。因此,宣传工作希望在潜在候选人决定申请去处之前,让他们了解工作、员工和文化。
Women in STEM 邀请高中毕业到大学入学之间的学生与员工见面,了解公司。Minsky 将其视为长期投资:参与者可能要几年后才会申请实习,但有些人最终确实申请了。Ehrlich 说,早期的积极接触可以改变人们对金融业的负面印象。
Insight 邀请大学二年级女生到 Jane Street,用一周学习金融和 OCaml 并与员工交流。Ehrlich 说,这个项目帮助吸引了实习申请者,后来也得到了扩展。女性开发者人数增长到她已无法逐一认识所有人的程度。
在讨论的那个夏天,约 25% 的开发实习生是女性。Ehrlich 认为相比起点这是很大进步,但仍低于她的目标。团队继续寻找方法招聘和留住女性,并保持优秀的工作环境。
招聘团队与校园女性计算机科学组织及更广泛的团体建立联系,其中包括通过 Grace Hopper 大会开展的联系。一旦公司在某所学校建立声誉,消息就可能传播开来。Minsky 询问如何接触 Jane Street 尚未建立关系的学校里的优秀人才;两人没有就 Insight 给出具体答案。
Ehrlich 说,招聘有经验的女性仍然更困难:开发人员招聘中约一半通过实习,另一半来自业界,而社招人员中的女性比例低得多。团队正在尝试多种方法,还没有找到单一解决方案。
她喜欢的一项实验是为科技行业女性举办早午餐,定位为社区活动,而非强硬的招聘宣传。Ehrlich 和一位同事选择了她们自己也愿意参加的形式。即使参与者没有找工作的打算,也可以结识同行;招聘收益可能会随着时间自然出现。
Minsky 将此与更广泛的长期方法联系起来:活动或技术博客既可以支持招聘,也能为参与者或读者提供真正的价值。Ehrlich 喜欢结识其他女性开发者,并希望随着疫情限制放宽,早午餐活动能够恢复。
教育与早期结果
一项面向代表性不足学生的教育项目结合 OCaml 教学和开源工作。Ehrlich 介绍 Insight 和 In Focus 的早期结果。
Ehrlich 还介绍了一项新教育项目,面向科技行业代表性不足群体中处于大学一年级和二年级之间的学生。项目希望接触那些缺少成熟招聘渠道,或缺少能帮助他们准备面试的同伴的人。
项目计划先开展数周 OCaml 教学,再进行开源工作。参与者可以获得教育,也能在简历上介绍公开项目,无论将来申请 Jane Street 还是其他公司的实习都有帮助。开源使工作成果可见,同时无需让参与者进入专有系统。
被问及结果时,Ehrlich 估计约 20% 的 Insight 参与者最终进入 Jane Street 实习,同时指出她不确定最新的总体数字。她记得第一批约 25 名学生中,大约有 5 人在随后的几年里参加了实习。
她记得第一批 In Focus 项目的约 15 名学生中,约有 3 人在第二年夏天加入 Jane Street。这些只是早期结果,团队希望继续改进。许多参与者告诉她,如果没有这些项目,他们不会考虑申请;她认为与员工见面是传递公司文化最有力的方法之一。
Minsky 和 Ehrlich 在讨论了长期工程和招聘工作如何依赖渐进、持续的改进后,结束了对话。
同频道的其他文章
1:48:29EN → 简体中文
1:05:45EN → 简体中文
1:25:00EN → 简体中文
1:16:29EN → 简体中文
4:41EN → 简体中文
1:34:29EN → 简体中文