Jane Street Production Engineer挂经

Viewed 63

注:本文中所述面试发生在2023年第四季度,之前没有发到某恶臭论坛上,现在发出来给大家分享。由于时间久远,一些细节的记忆可能有所疏漏。如果发现问题请在评论区指正。

猎头Reach out. 以前没怎么面过金融公司,就随便面一下。岗位是Production Engineer.

电面 Coding

题目是实现一个类似于Candy Crush游戏一样的数据结构。这题好像金融公司时常面到。输入给一个按列存储的二维数据结构,每个元素是整数,代表游戏里不同的颜色(类型)的方块。水平或者垂直方向上连续三个相同的方块可以消除掉,消除以后其余的方块会由于重力作用向下掉落。题目是要找出所有能消除的方块,以及消除过后游戏数据结构的状态。
这个题目不难,但是要考虑一些边界情况。具体细节我记不清楚了,不过当时应该写得还行。

电面 Troubleshooting

题目给了一个专门为面试设计的模拟网站,可以查阅交易系统的日志,上面还有简单的搜索功能。同时还给了一个系统架构图,系统有很多个worker, 他们会从一个dispatcher那里获取orders. 然后执行orders. 多个worker可以同时获取同一个order, 但是其中只有一个会交易成功,其余的就自动丢弃(这部分逻辑当时我也没有很明白)。现在的情况是,收到了警报,dispatcher上面order的交易延迟大幅增加,从几毫秒级别增加到了几百毫秒,要求查阅日志,然后分析可能的原因以及解决方案。
一开始面试官还跟我讨论了一下系统架构,比如这种多个worker可以同时获取order但是只有一个可以执行成功的架构具体应该怎么设计。当时我应该是没怎么弄明白,稀里糊涂瞎说了一通。不过后面debug还行,找出了延迟的原因,不过具体细节记不清楚了。要是有小伙伴面到过类似的问题请补充一下。

Onsite Coding 1

面试官是一名亚裔小哥和一名白人小哥。题目如下。

首先给出ETF的定义,比如一股SPY里包含3股AAPL, 5股MSFT, 2股META. 这个叫做成分股 compositions. 数据类型是 Dict[str, float] (不一定是整数)
然后给出exposure的定义,就是一个portifolio里,某一个股票和它在各个ETF里的总价值。比如,portifolio里有10股AAPL, 5股SPY, 当前AAPL的股价是$10, 那么AAPL的exposure就是 10*$10 + 5*3*$10 = $250.

首先写一个function, 计算一个股票的exposure. 输入的参数是 compositions, prices, 输出一个 dollar value.

def compute_exposure(compositions: Dict[str, Dict[str, float]], prices: Dict[str, float]) -> float:
    pass

然后要实现一个class, 来计算如何 minimize the exposure of a stock. 比如现在的持仓里AAPL的exposure有$3000, 我们要把这个exposure降低到$2000. 那么应该如何卖出股票和ETF, 同时还要尽量减小对其他股票的exposure的影响。注意,股票的股数不一定是整数。

class TradeSystem:

    def __init__(compositions: Dict[str, Dict[str, float]], prices: Dict[str, float], positions: Dict[str, float]):
        pass

    def on_composition_change(etf: str, composition: Dict[str, float]):
        pass
    
    def minimize_exposure(symbol: str, minimize_goal: float) -> List[Tuple[str, float]]:
        pass

这题看似不难,但是要写对很麻烦。尤其是面试官对变量的命名非常挑剔,竟然要求我把所有单词写完整,于是就浪费了很多时间,最后也没全写完。估计挂就挂在了这一轮。

Onsite Troubleshooting

给了一台Windows电脑,可以用Putty通过SSH连一个server. 服务器上是一个为面试设计的系统。这个系统每天晚上会把当天的交易记录通过FTP(对,就是FTP, 很多银行还在用老旧的技术)传给银行,结算当天的资金。银行结算完以后,会用另一种形式的文件把清算的结果发回来。然后服务器上会有程序去校验清算的结果。
交易记录是用一种私有的数据结构记录的,文件是文本的形式,可以直接查看。服务器上还给了一些utils, 都是用OCamel写的,可以用来查询交易记录。

题目是,校验清算结果的时候,发现了一些不一致的情况,要找出问题出在哪里。具体细节我记不清楚了,大概是上传交易记录的代码对pagination的处理有个bug, 导致一些错位。这个bug修起来不难,虽然是写OCamel, 但是其实根本不需要懂OCamel.

中午吃饭的时候要等recruiter去收集上午两轮的面试结果,如果不行的话就直接送走。还好我前两轮都还行,顺利进行到了下午。

Onsite Coding 2

下午第一轮还是Coding, 面试官是亚裔小哥,带了另一个亚裔小哥。面试题是实现terminal里的历史命令检索功能。实际上就是fzf这个工具实现的效果。大家可以看一下链接里的demo.

给的代码是一个class的框架,里面包含了几个用户的行为,比如按下键盘上的键,按上下左右光标键,按回车键等等。需要实现上述效果。

这题对于用过fzf的人来说很容易理解,写起来不难。但是没用过的话,根据面试官口述可能不太容易正确理解题目需要实现的目标。

Onsite Project Deep Dive

这轮就是hiring manager和另一个面试官一起,让我详细讲述以前做过的项目,期间他们会仔细询问一些设计上的取舍,reliability等等。细节就不讲了。

最后没面过,大概是挂在了onsite的第一轮coding. 而且不幸的是,我onsite期间的报销一直没批,损失了近100刀差旅费用。

0 Answers
Related Experiences