Joining Robinhood! (in Chinese)

2 minute read

1

到匹兹堡的时候刚下过雨,天气有点阴。灰狗一如既往的准时。早上六点二十分整,巴士便到站。我从睡梦中被唤醒。

我对匹兹堡卡内基梅隆大学校园之外的记忆都很模糊。记得松鼠山有很多好吃的餐厅;记得有家电影院,我在那里看了《失踪罪》;记得有一个可以坐缆车上去远眺的山;记得某处有个安迪沃荷的画馆。除此之外,就没有什么了。

但我对于卡内的印象却很清楚。哪里是Gates Building,哪里是Wean Hall,哪里是Hunt Library。三年前,我在这里上了人生中第一节计算机课;三年后,我也要在这里才能安心决定人生中第一份全职工作应该加入哪里。

趁着哥大Fall Break,我赶紧逃来这里。

三年前我拍的第一张CMU的照片 – CMU著名标志“送你上青天” 三年前我拍的第一张CMU的照片 – CMU著名标志“送你上青天”

2

跟帆姐吃完小亚洲,聊了聊近况,一路走到了Gates。除了新盖的University Center, CMU的一切都和三年前一样。

我坐在五楼的公共区域 – 那是经常见到“blue hoodie”(15-112这门课的助教,传统就是每人都会有一件蓝色的套头衫,背面写着自己的名字)出没的地方。三年前,我经常和小伙伴聚在这里学习。我们计着时,在公共区域的白板上做着mock quiz,然后一起讨论。所谓“共患难显真情”,说的可能就是我们这群被“折磨”的人:每周的小考和作业要占据12个小时甚至更多的时间,一个学期还有三次考试,学期末还有一个千余行代码的个人term project……学生任务多,助教也不轻松:每天都有2个小时到10个小时不等的答疑时间,在线问答平台 Piazza 上的问题平均回复时间小于5分钟,小考一天判完出成绩,还有各种额外的考试准备,作业答案讲解等等……在这样的“重压”下,难怪四十多位助教们会像一家人一样。而一起上15-112的学生,也仅因为这么一个学期的“磨难”就可以成为挚友。

15-112的Blue Hoodie 15-112的Blue Hoodie

三年前疯狂Debug的我 三年前疯狂Debug的我

我在这门课上也认识了很多人。那时专门负责我所在小组的助教是J和S。J毕业后就回了新加坡,S则在几家公司实习之后选择加入了Google。在我拿到Asana的全职offer后,还专门跟S打了个电话询问他之前在Asana实习的体验,拿到了许多很中肯的建议。

至于小伙伴嘛,三年前一起上课认识的女生E,三年后又在Airbnb一起实习,也是非常巧的再遇了。见面后聊起曾经一起做的recursion的作业,当时被Python函数的默认变量是mutable object所造成的各种bug,现在还是记忆犹新。同一个互帮互助小组的女生H,一年前正式成为了15-112的助教。在Kosbie给她发邮件说我来CMU了之后五分钟,她就冲到了办公室跟我say hi拥抱。即将入职Morgan Stanley IBD的她,说能够0基础survive 15-112,之后辅修计算机,甚至成为15-112的助教,都是因为我当时在互帮互助小组给她的鼓励和帮助。当她说出那句“You are such a great mentor. I won’t be at this place without you”的时候我真的心头一暖。还有男生C,这个夏天在亚麻实习,享受着西雅图的生活甚是愉快。这次我来匹兹堡也是热情款待,让我倍感温暖——说到底,我们可是一起写过俄罗斯方块的交情啊!

当然,最巧的还是我那个学期15-112的Assistant Head TA是我高中的学姐。每次她在办公室,Kosbie都会说她是”Gates楼里最聪明的女生”。三年前印象最深的就是我问学姐为什么选择去Dropbox做全职,我期待着听到比如职场发展好啦,工作有趣啦等等的答案。然而学姐想了一会儿,说:

“因为Dropbox饭好吃吧。我当时在想要不要签offer,然后HR就跟我讲他们昨天吃了啥,今天又吃了啥,我就签了。”

那时我心里想的就是:一,哇塞,太酷了!牛人决定去哪儿的理由果然不一样;二,我也要去吃Dropbox的食堂!事实证明,被誉为可以评“米其林星级”的Tuck shop果真名不虚传,第一次去三番面试Dropbox实习的时候,为了下午不要犯困,吃的很克制,现在想来甚为后悔;第二次在Airbnb实习的时候再去,就毫无压力了。吃够了Airbnb健康餐的我,那天欢欣雀跃从888 Brannan Street直奔333 Brannan Street。提前几分钟到,开心地发现那天有刺身,于是我就守在供应刺身的台前,等着12点一敲钟,“duang!”的一声,就可以“冲”去台前,拿上一盘,大快朵颐了。

Dropbox食堂。图片来自于: https://goo.gl/Arzs2N Dropbox食堂。图片来自于: https://goo.gl/Arzs2N

当然,看食堂选offer这样的操作,也是半认真半讲笑的。在我拿到几个offer不知所措的时候,我去问过学姐该怎么选择。她说,有些公司你去面试,跟你的面试官聊完,你就知道你不会想去那里工作。而有些公司,你一聊就会发现,人很聪明很有趣,跟他们共事也会学到很多。对于这点我不能同意更多。可能在尚未确定着落的时候,所谓“面试是双向选择”这样的说法中听不中用。但一旦心态摆正,想清楚你与公司的关系就是公司花钱买你的时间,谁都不欠谁,这种时候,你的面试官是否聪明,是否专业,是否让你觉得跟他们每天在一起会很开心,就非常重要了。这也是我在最终决定自己第一份工作去哪里时,一个重要的考量:我抓住每次跟人聊天的机会,去了解我的面试官,去了解公司的商业模型,了解工程师文化。跟每个面试官的接触,我都会注意:我讲了一个之前的做的项目,ta是不是很快就能找到其中的难点/有趣的点,然后一起讨论?我有题目做不出来的时候,ta是如何引导我的?如果我提出什么ta可能之前没想过或没见过的方法,ta是强行让我做回ta熟悉的方法,还是能很快给出反例/给我机会去证明新方法也可行?聊到公司的时候,ta是只会泛泛地说“一切都好”,还是可以很走心的举出例子讲出故事来证明“It’s really a great place to work at”?问到公司有什么不好/待改进的地方的时候,ta能不能诚恳的指出目前的问题和解决的办法?我觉得只有用心经营自己的职场发展和真正关心公司的人才会认真思考并能够回答这些问题,而我也希望能成为这样的人。

3

这个暑假离开Airbnb前,我跟我老板的老板S约了一次1对1面谈。听过他各种“超神”的传闻,让我对他甚为好奇。觉得必须要了解了解这个人的故事,听听他的意见,才不枉在这个组实习了三个月。跟S的聊天果然和我期待的不甚一样:我准备了一个列表的问题,诸如大公司好还是小公司好,选公司选组应该注意什么等等,但S却一个都没有回答,而是把他们都reduce到了一个“元问题”上:我真的想要什么?我是想要成为tech lead,在某个领域是专家吗?我想要发财吗?我想要创业吗?S的逻辑很简单:每条道路都有利弊。想要的东西不同,选择的道路就会不一样。所以分析道路好坏是没有用的,与其在这些问题上纠结,不如先分析“自己”,想清楚这个First principle。

然而看起自己谈何容易。想清楚了自己要什么,又能坦然面对并且按照这个去实行,更是难上加难。其实说到底,人的成长就是在于mindfulness(内观)。知道自己是什么样的人。知道自己的技能点加在哪里,优势劣势是什么。知道自己想要什么不想要什么。

我目前的内观,很多都来源于试错:我做了审计的实习,知道自己不适合做审计;我做了投行的实习,感觉比审计有趣,但想要一个更活泼更不那么严肃professional的工作环境;我尝试了做研究,发现自己不是那种喜欢在一个人类未解难题上想几年的人;我去了Airbnb做实习,发现做软件工程师是我目前来讲最享受的一段时光……我不知道做工程师是不是一个最优解——毕竟还有那么多有趣的冒险在等着我;但在这一步步的尝试中,我也知道了哪一类事情我不会喜欢,哪一个行业我可能更感兴趣。这也是我在最终决定自己第一份工作去哪里时另一个重要的考量:我希望我的工作环境可以鼓励我,给我机会去探索工程师之外的世界。

4

Airbnb的暑期实习让我明白了两件事:1. 相比于做infra,data或者quant finance等等,我还是更喜欢做产品(至少现在是);2. 虽然我在Airbnb的体验真的非常非常好(公司culture棒office颜值高,暑期各种高大上的活动什么游艇啦跟大厨做拉面啦去洛杉矶offsite啦,组超赞,manager又美又nice,intern小伙伴们都贼有趣,还有像Airkill狼人杀,吃饭团,电影团等多种社团任你选择),我还是决定不能满足于一个local optimum,而要去面试一下其他的公司,找到我的global optimum。也因此,八月底实习刚结束我就早早开始准备起了full-time的面试。

Airbnb实习生活动之一:Magical Sailing Airbnb实习生活动之一:Magical Sailing

这次全职找工作真的比找实习的时候顺利很多。从拿面试的角度,一方面是之前实习面过的一些公司,即使最后没过/没去,我也都跟HR保持了很好的关系,基本上是一个邮件就能拿到面试(甚至直接onsite);另一方面在实习期间我也认识了更多各个公司的人,对哪家公司感兴趣,基本都能通过朋友或朋友的朋友拿到refer;最后就是,brand name真的很重要,感觉哥大+不错的GPA+Airbnb实习,过大部分公司的简历关应该是够了。

至于面试本身,由于有local optimum (Airbnb return offer)的存在,感觉自己心态轻松很多。Technical(技术面)的话,从找实习开始,我就一直没走所谓的Leetcode“刷题流”。三年前在CMU我就问过Kosbie,对于刷题准备面试他怎么看。Kosbie说,对于面试你要准备,但是不要over-prepare。话说回来,如果一个公司的面试奖励的是那些刷题刷的最多的人,那这样的公司不去也罢。那时候我心想“天哪,可是那些公司我都好想去啊,况且人家也不要我啊”,现在却觉得,这话虽听起来偏激,但也不无道理。之前提到的“面试双向选择”,我觉得也包括面试官会问怎样的问题以及会有怎样的期待吧:是出一道巨难的算法题,一点提示不给,期待我一秒说出最优解刷刷刷15分钟写完呢,还是拿一道以实际问题为基础的题目,跟我一起解题,考察我的CS fundamentals,problem solving,communication甚至coding style。如果是前者,即使我把题做了出来,这个面试本身于我也是没有什么营养和乐趣的吧。

因为我全职面试是抱着寻找global optimum的目标,所以我选择面试下去的九家公司都属于我还比较有兴趣,也有朋友推荐的公司。很开心的是,自己感兴趣的这些公司的面试体验总的来说都很不错,考察的内容也很全面。除了数据结构和算法,有不少的公司也会问new grad系统设计(因为自己之前在面Asana实习的时候在这点上吃过亏,所以特别准备了一下;Airbnb的实习经历也给了这方面很多帮助)。其他还有被问到的包括OS(特别是multi-threading),Computer Network & Web 101(其实就是What happens after you type in an URL in a browser and hit enter),Front-end engineering(写Javascript)等。当然闲聊中根据我上过的课以及面试官的背景,我们就天南地北扯很多了:聊过我compiler的课是怎么用OCaml实现一个Rust-like语言的memory safety feature的;聊过我在15-112做的project是如何写爬虫parse data,如何用PyQt做前端,如何做data persistance的;聊过我正在上的某门课的某一个project用A*替代Dijkstra Algorithm的可行性的;聊我在Airbnb做project是如何遇到了一个React ref和lifecycle相关的issue而被坑的……总之放在简历上的东西,就要准备好用各种姿势花式去聊。当然,如果你所有项目都是认真做的,聊这些应该是非常自然,甚至很享受的一件事吧。(毕竟有人对你做过的东西感兴趣,哈哈)

上面说的是“道”。至于“术”的话,我就列举几点自己感触比较深的地方吧。毕竟没有亲自做过面试官所以不一定准确,所以也欢迎有更多面试/被面试经验的同学分享纠正:

  • Life is short, you need Python.
  • 与面试官要“默契”,要“有来有回”。我一直以来的assumption都是:没有面试官想要挂你。如果你这样想,那他说的每一句话,都是在某种程度上给你提示(hint)。那这个时候,你与面试官是否“默契”就很重要了— 如果面试官给你抛一个hint过来,你能不能很快接住,然后make non-trivial progress?我觉得我面试一直以来做的蛮好的一点就是,我虽然有时会犯错,但我会对于面试官的每一个feedback都很敏感:如果ta让我想一想test cases,那我会想我是不是miss掉了一些edge cases?如果ta在我描述一个想法的时候犹豫了,是不是因为我的方法其实不work?如果我卡住了,然后ta跟我一起walk through了一个小的例子,是不是证明这个例子所用的方法可以generalize到其他的cases?仔细听面试官说了什么,也是展现collaboration的极好办法。
  • 举一反三。类似于上面这点,如果面试官指出来某处的逻辑不太对,千万不要只改这一处。看一下你代码的其他地方,有没有一样或类似的问题?
  • 确认理解题意。如果你还没有完全理解一个题,千万千万不要着急开始分析,更不要上来就写代码。没有比写了30分钟代码后发现你解的是另一道题更让面试者+面试官共同崩溃的了。先人工跑几个小的例子,确认一下步骤和输出对不对。没懂的话就说不懂,然后问clarification questions,会比较有帮助。
  • Talk when you code。这个比较因人而异,我个人喜欢边说边写代码。这个比较类似于“小黄鸭debug法”:当你把自己想写的code一边写一边说出来的时候,你就更不容易犯typo/逻辑混乱,面试官也可以知道你的思考过程和进度,在有问题的时候提早“提醒”你,防患于未然。
  • 对细节敏感。有一些地方是非常容易犯错的:index的计算,for loop的开始与截止(off-by-1),while loop的条件,if 多个条件是AND还是OR,recursion函数的返回值和base case等等。写到这些地方的时候我都会本能的放慢,仔细想清楚。如果一时想不清楚我也会跟面试官说“I may be off-by-one here. Let me finish first and we can come back to figure this out.”

Behavioral (行为面)的话,我经常遇到的问题就包括:

  • Why us?
  • What are you passionate about?
  • Why web engineering / Why product engineering?
  • Why do you switch from business to CS?
  • Among our core values, which one do you agree the most/least?
  • What are you looking for in your first job?
  • What’s your career goal?

遇到这类问题,其实我觉得真的就是那句话:“少一点套路,多一点真诚”。如果你期待一个面试官在一个小时内从不认识到你到strongly vouch for you,那你最好能够让ta了解你,而透过这些问题去讲述你的故事就是最好的方式。比如我对education一直都很有热情(这也与我在15-112所受到的改变人生的教育极有关系),所以即使是一个FinTech公司在问我What are you passionate about的时候,我也坦言教育之于我的意义,而我一直作为社会教育资源的受益者,是如何通过做助教,帮助他人准备面试,回答大家关于计算机相关的问题甚至参加Girls who code的公益活动去回馈社会的。因为这就是真实的我,所以我讲的时候就很具体,很走心,也就更打动人。当然,这样做的话就一定要准备好如何回答“那你对教育行业有这么浓厚的热情,为什么要申请我们公司呢?”这个问题 :)

我觉得Behavioral对于国际学生最大的瓶颈可能还是在于语言等因素的限制,自己有话却说不出来吧。这就让我很欣慰自己本科在香港四年,不说其他,但至少还是学到了如何去communicate my idea和present myself的。事实证明这也在我这次找工帮助很大。所以除了“硬技术”,“软实力”也很重要啊!

5

当天下午四点半我走进Kosbie的办公室。见到Kosbie的第一感觉就是他老了。3年前的他总是充满活力,用非常有感染力的声音跟你对话,四五点钟起床遛狗吃早饭发邮件回Piazza,两个小时的答疑时间经常延长到三四个小时(有一次甚至超时到晚上六七点,直到他老婆打电话催他回家吃饭),让我觉得仿佛他从来不会觉得累。而这次再见面,不知道是从他发白的鬓角,还是偶现的疲惫神态,我清清楚楚地感受到了时间的流逝。

虽然我是主要是为了得到他关于我工作去向的建议而来,但我们聊了很多其他的事情。我们聊这三年发生了什么,聊之后人生和职场的规划。我们聊教育行业,聊美国高中的计算机科学教育的落后,聊他这么多年来在15-112中实践和完善的教学法。聊我的助教经历,聊我是如何被15-112改变,又是如何去努力改变他人。聊为什么他今年去不再教15-112,而是去做CS1 — 一个有着15-112的内核(即problem solving)和风格,面向高中生的第一门(非专业)计算机课程。我们甚至聊到了婚姻,聊到了退休。原定一个小时的见面,最后我们聊了足足两个半小时。我们这种朋友似的促膝长谈,让我想到了Tuesdays with Morrie里,Mitch和他的老师Morrie每周二的“人生一课”。

Tuesdays with Morrie的封面。这是我未来manager Hongxia推荐的一本书。我在去旧金山的飞机上看完最后两章,哭成SB。

Tuesdays with Morrie的封面。这是我未来manager Hongxia推荐的一本书。我在去旧金山的飞机上看完最后两章,哭成SB。

虽然Kosbie说对于我找工作如此顺利收获诸多offer一点都不意外,但可能Kosbie自己都不记得的是,三年前其实我是被Kosbie“劝退”过的人。

那天上午我第一次走进15-112的教室。我从没去过那么大的阶梯教室。我坐在不高不低的位置,懵懵懂懂听了一整节课。我以为第一节课大概就是做一做intro,教教print Hello world,一个多小时的课上半个小时也就差不多了。没想到第一节课就这么intense。print Hello World真的只教了30秒。对,30秒。第一节课,除了所有logistic & admin stuff,我们就讲了input, output, import modules, functions, return v.s. print, different types of error, variable scope…. 我记得特别清楚,当时有个同学举手问“is Python a compiled language or an interpreted language?” ,我听到的就是”is Python a bla or a bla?”,真的一脸懵逼,心想他们在说什么“鸟语”。我这个大三的“好学生”从来没有听一门课的第一节课就这么吃力过,更别提是面向大一新生的课。

下课了我赶紧跑去台前跟Kosbie自我介绍了一下。我说我是来CMU商学院交换一学期的交换生,这第一节课听的我很怕怕,问他选这门课适不适合我。

Kosbie问我,“Why do you want to take this class?” (你为什么想上这门课?)

我说,“Because I want to learn some programming.” (因为我想学一些编程。)

“If you want to learn some programming, you should go take 15-110. It’s less intense, and you may find it more fun.” (如果你只是想学一些编程的话,去上15-110吧。那个课节奏更慢些,你可能会觉得更好玩。)

”If 15-110 is for learning some programming, what is this class for?” (那如果15-110是教一些编程的话,这节课教什么呢?)

“You know, At the end of this 15-week class, students will work on an individual term project. People get Microsoft internship with it.” (在这个课上,上完这15周的课你要做一个单人的编程项目。有学生用这个项目拿到了微软的实习。)

大一新生。上十五周课。拿到微软实习。这是我从来没有想过的事情。 我在卡内基梅隆时写的一篇名为“纠结”的日记恰恰好描述了我当时的心境:

“ my dear diary,

希望我和你的对话能够帮助我搞清楚我究竟该怎么做。 第一次对自己的能力产生了质疑。这是我想要的么?上112。似乎在这个课上做的好了可以证明我自己,但也有很大可能我做不好。 我要花很多很多时间在这上面,但是这值得吗? 对于我的未来 学习这门语言的帮助 到底有多大 我到底想要什么 如果我不去112 是不是我就认输了? 是不是就代表着,我已经承认自己没有编程的天赋了? 112,如果学完,是可以直接出来用python找工作的 我并不一定有机会,在我这辈子,再去学习一门编程语言 可能就不再有机会 在CMU学习 在CMU的这一个学期,可能是我与这所学校唯一的交集 在这短短的一个学期里,我究竟能做什么? 我的交换生涯的目标又是什么?? 我究竟需不需要在交换的这段时间 投入一切的学习它 我能不能完成 光是看到Term project我就觉得毫无头绪 光是听完第一节课我就觉得有很多东西需要消化 一周12小时,15小时甚至20小时 仅仅投入在这一门课上 可我还有很多很多很多事情要做

我真的真的有时间去完成这门课程么? 我不知道 我不知道为什么现在我在纠结 是因为我不敢确定我是否能完成它么? 是英语的问题? 数学的问题? ”

现在重读这篇日记,感觉有些中二,但又很真实。我在日记里问自己“我要花很多很多时间在这上面,但是这值得吗?”假如我有时光机,现在的我一定会不假思索的跳上它,回到2014年的8月26日,回到Morewood Garden四楼那件小小宿舍里的我的旁边,肯定的说:

“没有比这更值得的事情了。”

Prof. David Kosbie在2014年秋季学期的最后一封Piazza note Prof. David Kosbie在2014年秋季学期的最后一封Piazza note

6

其实在我走进Robinhood办公室的一瞬间,在我内心最深处可能我已经知道自己如果拿到offer,会来这里工作了吧;当其他人问我Robinhood给我的感觉是怎样的时候,我会说:

一,当我进到他们办公室的时候,我就被他们的“vibe”(氛围)所吸引— 那是一种“轻松的忙碌”的状态。能听到说话的嗡嗡声,总有人在走来走去,能感觉到有很多事要做;但这种忙碌又不同于很多公司的那种很强硬很压力的忙碌,公司的氛围还是很轻松的。狗狗跑来跑去,也可以看到有同事在开心的聊天说笑。

二,跟面试官聊完之后,我仿佛见到了很多个“我”。大家对于做一个好的product都很有热情;工程师也很重视产品设计和用户研究;而且聊到很多问题的时候都属于双方越聊越high型。聊到激动的时候,我就直接打开airbnb的网站,给他们看哪块是我做的,我是怎么做的;或者在白板上写写画画,讲system或product的design。至于coding的部分,Robinhood也是不同于其他很多公司。问题虽不难,但要求却是要Pythonic code that can check into the production code base。我很喜欢面试官问的一针见血的问题,有些时候也让我看到了自己的思维盲点和代码方面很多值得提升的地方:我的面试官们简直就是我希望自己在几年后成为的样子。

Kosbie其实并没有告诉我第一份工作应该去哪里。但他说在你很难去理性选择的时候,不妨听从你的直觉。

我的直觉说,我属于这里。我喜欢这儿的产品,喜欢这个团队,喜欢这里充满挑战性和影响力的项目,喜欢这儿的文化。

那新的旅程,就从Robinhood开始吧。

Go Robinhood! Go Robinhood!

7

正如我一周前的朋友圈所说,想感谢的人有点多:

先感谢David Kosbie,感谢2014年秋季学期15-112的所有助教和同学,是你们一同改变了我的人生轨迹。

感谢我在Airbnb的manager Claire。你是我tech实习的第一个manager。谢谢你给我的所有support和candid feedback,让我可以成长的这么快!

感谢我在加州实习认识的所有full-time和intern小伙伴!

感谢SEO team!享受跟你们一起讨论买房生娃比特币的时光,还有各种trash talk XD

感谢“做作爆棚”的Airkill团队!作为为数不多从头跟到尾的实习生还参加了offsite特别活动。谢谢大家让我认识到了自己人生如戏戏如人生~

感谢上·进(a.k.a 肾群)intern小分队!谢谢你们给了我一个菠萝味的夏天 :) (大雾)

感谢7月4小分队!每次跟各位的旅行都是对灵魂的拷问。希望下次一起旅行的时候我可以有故事分享给大家lol

感谢所有跟我phone chat/内推我的朋友们,特别感激你们愿意拿出时间回答我的问题,认可并内推我!

感谢Rachel from Asana和Vasusen from Coursera。你们都是我特别特别欣赏的manager & engineer。跟你们的聊天总是特别的有收获。没能加入你们的团队是我的遗憾。希望可以keep in touch!

感谢Robinhood的面试官们选择了我。Special thanks to Hongxia。以后多多指教啦!

感谢Yuyang学姐,Max Zhou还有易姐姐给我很多找工作+职场相关的建议!

感谢温总邀请我加入脑力+体力共同运动的健身小分队!各位健身达人带我举铁,我帮大家回答关于CS的各种问题,也算是”friends with benefit”了XD 谢谢你们让我两个月瘦了五公斤(希望不是累的)!

感谢朱总实力提供三番住宿!

感谢陈总实力提供匹兹堡住宿!

感谢戎姐在我东西海岸飞到快go die的时候carry了我的project们!

感谢我的粑粑麻麻支持我的决定!

感谢所有读到这里的你们 :)