上周得知h1b终于批下来了,因为cap gap在10月1日就过去了,在家等的都发霉了。为了身份煎熬了一年,好在最后身份和跳槽都有了好结果。以下是我2个月以前面完写的找工作心得,分享给大家。
=====================我是正文=====================
在狗家吃鸡吃的不是太开心,想出去看看,就开始今年的面试。以前一直用java刷的题,但是因为工作里写了大量的c艹,想着可能换个语言(实在是不明智)。用了大概4个月时间准备面试,基本就是把平时回家看paper听课的时间变成了准备面试。前期是工作10小时,回家准备4-5小时,一整个周末读design data intersive application和听cmu的advance database。后期就复习和刷面经题。有了狗家背书和以前的经历,投简历是非常顺利,几乎完全没有找内推。。但是基本自己在网上海投的职位都拿到了面试,开了个linkedin的premium,每天邮箱都快炸了。。。大概的时间线是5月开始刷题,7月开始电面,8月末集中onsite,9月中拿到大部分结果,就withdraw了剩下没完成的面试(实在没有假期了去面试了)。准备的资料是刷了400道题,把想去的公司面经题基本都刷了,花了不少时间去研究和背高级的算法(结果没人问)。在网上找了个interview点io的网站练习电面,也面别人找找面试官的心态系统方面读了3遍ddia这本书,听了cmu的15-721,复习了下以前自己学的distributed system,没事吃饭走路用手机反复在看groking the system interview的网页。偶尔读几篇paper或者在youtube搜索相应感兴趣的tech talk听听,稍后我会罗列起来这些资料,感兴趣的同学可以看看。
面试按时间顺序排序
Pony onsite因为有朋友在里面,听说里面都是牛人,自动驾驶也很火热,抱着学习的心态去面试的。电面第一次被鸽子,第二次上来一道medium,矩阵求和这种,秒掉以后给了道面试官自己的题,Huffman compression,顺利做出来拿到onsite请了一天假去onsite,第一轮让实现heap,我都忙着练binary index tree去了,这么基础的东西反而写的磕磕绊绊,最后也没get面试官想问复杂度分析。。系统设计面的更是不好,人家要key-value storage我去给人家讲lsm-tree的底层实现,没给出个完整的答案。总之每一轮都面的不太好。。因为小公司的面试官以前来自不同公司,风格迥异,感觉每个面试官的想要的都不一样,很难把握,面的很失败。但是帮我反思了系统设计应该怎么面。
Airbnb onsite fail一开始特别想去他家,去onsite还特意请了2天假,订了个三番的酒店;94道leetcode刷了87道,结果考的两道题都没刷到。。。而且他家要连屏幕,连上以后我的屏幕是花的,看一会就头晕眼花,加上特别紧张,两道题都没有写完,当时就觉得没戏了。系统设计更是糟糕,一开始的马克笔写在白板上擦不掉,面试官去拿纸巾就浪费了快10分钟,后面他也不是很买账我的设计。下午的experience和cultrure倒是面的很好, 但是因为上午的表现我已经完全不抱希望了。。技术面45分钟本来就紧张,加上这些客观因素,真的感觉发挥很重要。。面的很早,他家很套路,我不太适合针对性这么强的面试,加上一些客观因素,开始认真反思为什么看了那么多资料而系统设计面的这么糟糕。。
Fb offer面完airbnb去面的脸,一如既往的好体验,大公司的流程还是规范,面的很舒服,反馈也非常快。2.5轮算法2轮设计一轮behavior。这次认真准备了系统设计,自己在白板上自言自语了2晚上,把面经设计题都好好看了一遍。结果有一轮算法两道题都有明显bug,但是面试官没有发现,(我感觉好像她也不是很懂,而我的自信把她唬住了)系统设计答的行云流水,面试官也都很友善很买账,一个白板都不够写,最后写了擦了好多,一周后拿到offer,但是后来因为接了wa就withdraw了fb的offerhttp://www.1point3acres.com/bbs/thread-442521-1-1.html
Uber offer电面非常痛苦,小哥的电话非常模糊,我都不知道在说什么,不过还好写出了代码,他也让我过了。match了个西雅图的组去onsiteonsite是2轮系统2轮算法一轮经理聊天,第一轮算法疑似要黑我,只给我30分钟让我做一道代码量不小的hard(大概80行),做完了还让我扩展。。。设计两轮和fb一样都是华人,让我顺利的一步步把我的东西讲给他们,也学到了很多东西。经理人很好,给我讲做什么让我很感兴趣,对我也直接肯定我的经验,面的挺愉快的整体上http://www.1point3acres.com/bbs/thread-442148-1-1.html
WhatsApp offerwa是先选组再面试。。Onsite只有一轮设计,老板亲自面的,超简单web crawler,因为花了好久聊了下之前做过的项目,没有时间聊太多太深入系统设计,也许这也是为啥最后offer没有拿到l4 high end的结果。他家的算法很难,一轮是个medium,其他都挺难的hard level,而且都不是原题,详细看我面镜。发挥的还不错,都找到了最优解,体验也很不错,面试官人都很好http://www.1point3acres.com/bbs/thread-441914-1-1.html
Pinterest offer一开始都不知道这家公司,后来去看了他家的tech blog,写的真的很好,听说也是startup里比较稳定,技术比较好的,越来越喜欢。但是投了3个月,都拿到其他的offer他家recuriter才联系。然后过了karat电面以后情真意切的给recuriter发了个邮件,说真的很喜欢他家,想赶紧面,recruiter非常给力的在2天内安排了onsite,面完1天就发了offer,从电面到offer一共10个自然日,这效率实在是太屌了。最后去了p面的经验相关的组,2轮算法两轮设计,算法其实面的很简单,都是白板,第一轮算法,面试官出题我都坦诚的告诉她,”这题我刷过blahblah“,我觉得这么做其实反而加分了。。。出到第三题她实在不想再找题了就让我做了,先口述了一个解,然后又按照她要的思路给了另外一个解第二轮的算法交流的不太好,但是代码写出来的可能比面试官想的更简单,面试官人特好。系统设计,之前一周特意准备了经验相关的知识和p家的approach,面试官也很友善,答经验相关的设计挺有把握的,白板上花了一大堆,从query rewrite到ads rendering,到event recording一大堆。中午吃饭的大哥因为和我用过的东西挺像的,问了几个点子上的问题,看起来给他说高兴了,一直在那说。。
Robinhood onsite fail非常失败的onsite。第一轮是lunch,然后是4轮技术面。为了聊天没好好吃,到第四轮第五轮已经天旋地转了,需要锻炼身体。第一轮设计其实我答了很多但是感觉三哥面试官挺不友善的,面到中间都给我怼生气了。第二轮算法的面试体验也很差,大哥并没什么兴趣,给了个平衡读写的算法设计,我想给个优化both的方法然后发现并不能,告诉他只能二选一,他并不能理解为什么…换了道题秒掉但是看他在熬时间,最后一轮写代码天旋地转的找不到seg fault的原因…纯酱油的面试
Twitter offer他家还是很注重经验和系统知识的,对刷题不是很难考得。面试设计的非常有意思,给了个四百行的code review家庭作业,面试是有半轮是让你说应该怎么改。一共3轮,每轮一个半小时,两个人连续面你两个主题…挺好玩的其实也就是一轮算法一轮设计一轮经验一轮cr揉在一起面这种感觉,加上一个半小时的经理聊天。面到后面给经理说高兴了,直接问are you ready for the offer,吓到了本宝宝。后来经理特别想要我,不断的给我发短信,还挺感动的。
Snap phone第一次面试我记错时间了,导致面试好像不太高兴,第二次重新约时间,秒掉一道中等难度的题目还是挂了我
Lyft phone自动驾驶,纯面c艹,我觉得答的还可以,改了5道题的,但是有几个细节没说上来,感觉他家应该要的是c艹基础滚瓜烂熟的人,三天收到拒信
Cruise onsite三轮代码一轮经理,那天太忙没顾上吃午饭从mountain view打车进城,大概连续20几个小时没怎么吃饭,最后一轮话都说不好了…也怪自己不是很重视,没有提前请好假,但是最后出乎意料挂了一轮算法,估计是写了无数次的lru那轮,因为那轮的小哥一直很不高兴。BTW,大老远进城面次试就给报30块钱也太抠了
没假期,取消了两个昂赛Apple onsite withdrawXmotors onsite withdraw
单独说下电面,和onsite不一样的,电面更倾向于给你个固定的问题,希望你能写出代码,所以一般还是考算法。现在很多地方都用copad希望能现场编译输出。网上某一些平台可以用来练习这种模式的。也没怎么见过hard难度的题。
下面说下算法。教训就是下次打死也不拿c艹刷题了,大半公司要求现场编译,写起来麻烦,stl库又不好用报错给的信息也没啥用,很难debug。同一题库刷c艹比java我觉得得多付出很多时间,同时面试还要take更多risk处理让你一脸蒙蔽的seg fault。有时候还要紧赶慢赶把代码写完,放弃部分和面试官交流的机会。airbnb我就说交流的太多了最后没时间写完代码…事后真的很懊悔用这个语言。教训2是我用当年准备狗家的方法准备的算法,比如专门去研究很难的算法比如默写binary indexed tree, mancher algorithm, kmp,rmq这种…结果没有一家考到,连union find都没用上。比较难的也都可以用dfs来做。现在貌似大多数公司更倾向让人写product code,可以直接运行(因为c艹吃了点苦头)。所以里扣的题做熟了基本够用了
系统设计其实也有很多套路,或者说表面的东西就那一套。比如设计一个end2end 系统,总可以说有个前段server做lb,然后后端的server可以做aggregation,sharding,replication。具体各种各样的service就可以根据存储和返回的数据讨论了。然后存储方面sql nosql,各种细节可以看我之后提供的资料。
Behavior方面有一个YouTube视频推荐给大家看一下,我觉得非常有帮助。我个人对技术非常有热情,对自己做的项目也都挺用心的。所以按照视频里的方法把真实的自己展现给面试官,再做一些反思就差不多了。https://www.youtube.com/watch?v=PJKYqLP6MRE&t=1892s
再说下其他方面,第一点是不要把自己当超人,一周面三个onsite然后尝试用剩下的时间把一周的活干了的结果就是啥也没弄好,面试也挂了工作的代码写成一坨屎,然后周末累成个植物人…
第二点是心态问题,有时候特别想去的地方反而因为紧张发挥的不好。回想我发挥最好的反而是接了p的offer以后出于礼貌面的Twitter,整个人非常的放松,就当是过去聊天。其实面试这个东西永远没有准备到100%这回事,永远会觉得哎呀我怎么还有这些东西没有看。尤其后期准备的越充分其实运气占的比重越大,心态平和才能面对一些自己没法决定的事比如面试官就是不喜欢你就是想怼你…
第三点,热情是面试者最大的武器。不管是面试时还是谈offer,热情非常能感染别人,谈offer的时候如果你表现的特别想去,这也是个非常大的加分项,让recuriter能帮你争取更好的offer。
最后发感慨写一点正能量。14开始转专业,年底才开始正经写代码,要学的太多,所以一路拼命想赶上那些科班出身,努力又聪明的人,这几年走下来感觉很辛苦很坎坷,但是看到努力有回报的时候觉得特别欣慰。找到自己擅长也喜欢的东西当工作真是种幸福。
先写到这里,想到什么后续再加
两年前开始用课余时间上stanford的certificate,努力的拿a,花了所有休息时间,累的够呛,也花了很多学费,一直很质疑我自己做的选择是不是值得。这次找工作,两年前上的课和面的职位有了关联,付出的努力居然有了回报,让我更相信乔布斯的那句话,引用在下面。今年也做了很多现在还看不到成果的努力,有时候还是很沮丧很失望,也许未来往回看的时候才能找到意义。You can’'t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something - your gut, destiny, life, karma, whatever.
PS1另外最近有很多同学私信问我scpd的问题,之后有时间我会开一个新的帖子,回答大家的问题。
PS2关于系统设计,我用的是grokking the system interview当零散时间的反复温习,主攻design data intensive application,反复认真读了3遍,然后去youtubu自己看cmu 15721,高级数据库的课程,发现对数据库的很多设计原理对理解设计系统时的trade off非常有帮助。听说Element of Programming Interview也不错,我没有读过。然后还看了一些公司的tech blog,uber和pinterest的写的非常好。然后练习就一个人在家里的白板上写写画画,自言自语,真正面试的时候表达自己就通顺多了。
PS3我用interview点io练习了几次电面,想练手的同学可以尝试下,前三次面试可以随便挑时间
PS4撒一下狗粮,感谢老婆对我的支持,异地这么久还支持我追求梦想。