Citadel 跟大厂区别很大。不问LeetCode原题,不考八股。全程场景驱动,围绕交易系统聊。面试官是写交易系统的工程师,追问很深,会一直问到你不会为止。我顺利通过 OA 与三轮 Onsite,以下是详尽面经,包含 Citadel interview questions 、我的解答思路、面试官反馈以及备战建议。

第一轮:OA + Tech Screen
OA(90分钟) 两道算法 + 一道系统设计,时间很紧。
算法1:滑动窗口极值
实时价格流,固定窗口大小,每次滑动一格,要求 O(n) 返回窗口内 max 和 min。
解法:两个单调队列(双端队列)分别维护最大值和最小值候选。
- 入队时弹出不满足单调性的元素;
- 出队时判断队首是否滑出窗口。 重点处理窗口初始化和队列为空的边界。 写完代码后补充了时间/空间复杂度说明(为什么是 O(n) 而非 O(nk)),面试官很关注代码风格和注释习惯。
算法2:并发安全的订单簿
支持多线程插入/删除订单、价格查询、撮合。读写比约 7:3,高吞吐下保证一致性。
方案:
- 按价格档位分段加读写锁(std::shared_mutex),降低锁竞争;
- 撮合跨价格层级时按固定顺序加锁防死锁;
- 用无锁队列做写入缓冲,后台线程批量消费平滑延迟。 解释了不用全局锁(会成为瓶颈)和完全无锁(复杂度高易出错)的原因。用了原子操作 + memory order(release/acquire)。
系统设计:低延迟日志系统
交易系统产生海量日志,不能阻塞主路径,还需支持时间范围/关键词快速查询。
分层存储方案:
- 热数据:内存 Ring Buffer + 预分配内存池,写入 O(1);
- 温数据:mmap 文件,利用 OS 页缓存,异步批量刷盘,零拷贝;
- 冷数据:LSM-tree 压缩存储,适合查询; 额外提到 sendfile 零拷贝。 说明不用传统关系型数据库的原因(B+树随机 IO 延迟高)。
Tech Screen(45分钟)
自我介绍项目:学校做的分布式消息队列(Go)。 核心点:Topic 分片 + Raft 共识、sendfile 零拷贝、令牌桶背压、WAL 持久化。
追问:
- 吞吐翻倍如何水平扩展?→ 一致性哈希 + 动态再平衡,过渡期双写 + 幂等去重。
- 节点宕机如何不丢不重?→ WAL 保证不丢,消息唯一 ID + 布隆过滤器 + Redis 消费者去重,实现 Exactly-Once 效果。
特别环节:用非技术语言解释分布式锁。
比喻:就像机场共享充电宝柜子,每人扫码拿唯一柜门号,防止冲突。面试官认可,认为和 Trader/Quant 沟通时这种表达很重要。
小概率题:策略胜率 55%,盈亏比 1:1,交易 100 次,至少盈利 60 次的概率? 用二项分布 + 正态近似(μ=55,σ≈4.97),得出约 15%-18%。强调真实交易更看重风控和生存能力。
第二轮:Onsite(60分钟)—— 全市场场景题
做市商场景 股票现价 100 美元,突然大额卖单砸盘,如何调整报价?
回答框架:
- 正常报价:理论中间价挂单,动态 spread + 量,库存中性化;
- 订单流监控:买/卖单到达率失衡时拉宽 spread、减量;
- 极端应对:立即撤买单、触发熔断、限仓,波动率上升后进一步保守。
Fermi 估算:曼哈顿每天消耗多少杯咖啡? 假设白天总人口 300 万,分人群(白领、服务业、游客)估算日均消费,最终得出约 420 万杯。强调假设透明和逻辑链条。
底层实现:低延迟订单簿
- 数据结构:std::map(红黑树)维护价格层级,每个价格对应 FIFO 订单队列;
- 优化:无锁跳表、内存池、CPU 亲和性、缓存行对齐(alignas(64) 防伪共享)。
手撕:时间轮定时器(订单超时撤单) 分层时间轮(毫秒→秒→分钟),添加/删除 O(1),槽位级自旋锁 + 对象池。
第三轮:终面(60分钟)—— Tech Lead
Tech Lead面,一半技术一半行为面。
Why Citadel
Citadel Securities工程团队规模小但人均产出高,工程师代码直接影响当日盈亏。大厂写的模块可能只是大系统一环,离最终结果远。这里离问题域近,做什么为什么做都清楚。
Behavioral
实习时做回测框架,量化研究员认为功能正确就行不用管性能。我跑profiling定位热点函数,用数据沟通:优化后回测时间大幅缩短,策略迭代更快。对方同意后,用SIMD指令重写核心计算模块,回测速度提升40%且数值结果一致。后续其他研究员也用了这套代码。讲的时候结构:背景、冲突、行动、结果,突出数据驱动的沟通方式。
分布式交易系统设计
需求:全球跨时区交易,订单从纽约、伦敦、东京接入,路由到对应交易所。延迟毫秒级,可用性99.999%。
架构:
- 多活数据中心:纽约、伦敦、东京、新加坡各部署完整服务,就近接入
- DNS智能解析加Anycast路由,自动导向最近机房
- 跨区域走专线或最优网络路径,避免公网延迟
- 每中心内部:接入层做前置风控,撮合引擎在内存完成,交易网关连交易所
一致性:
- 账户余额、持仓等全局数据用多主复制
- 跨区域冲突用版本向量解决,写入带版本号,冲突按规则合并
- 大部分场景接受最终一致性,延迟低于阈值内允许短暂不一致
- 交易执行路径追求强一致性,用分布式事务或Saga模式
可用性:
- 每层冗余,单机故障自动切备机
- 心跳检测,秒级发现故障
- 关键路径无状态或状态可快速重建
- 熔断降级:某交易所连不上时缓存订单稍后重试,不影响其他交易所
追问跨区域延迟与一致性tradeoff:交易系统优先低延迟和可用性,一致性极端情况可短暂牺牲但最终收敛。同一用户多订单路由到不同区域,短期可能看到不一致,但执行结果以交易所确认为准,最终同步到全局状态。
反问环节
问应届生成长建议。面试官说少花时间学框架,框架会过时。把操作系统、网络、编译原理打扎实,理解计算机怎么工作。交易系统核心能力是在不确定条件下快速决策和权衡风险,不是看书能学会的,在真问题里练出来的。
从方向模糊到拿下Citadel Offer
这次 Citadel 面试能顺利通过,我最想说的是:一个人硬扛真的太难了。后来我找到了 Programhelp,他们的学长为我提供了全程 OA 实战辅助和面试深度辅导,包括真题预测、代码优化、系统设计推演和高强度模拟面试,让我在真实面试中明显更有底气和条理。
如果你也在准备 Citadel、Jane Street、NVIDIA、Point72 等高强度面试,感觉一个人复习效率低,强烈建议了解一下 Programhelp。他们专注提供 OA 实战辅助和面试指导,学长会直接跟你沟通,根据你的情况制定针对性方案。
有需要的同学可以直接联系 Programhelp 详谈。