马克找工作第二次,万字长文慎入

上周得知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撒一下狗粮,感谢老婆对我的支持,异地这么久还支持我追求梦想。

1 Like

我的方法就是。。不回家。。回家真是太舒服了,回去就没动力了
平时晚上和周末我都去公司自习的到深夜再回。。还有一个周末早上5点才回家的。。
有时候效率也堪忧,可能学1小时就玩1小时,但是回家真是直接撒开玩了。。
在公司的话跟每天干的枯燥工作比,那些paper和课程就有意思多啦

还有一个方法我看别人说的,没尝试过,你可以把学习仪式化,比如在家有一盏灯,称之为学习灯,打开它就必须要学习,养成习惯慢慢就适应了

问题都不小啊,哈哈

  1. 我没啥指标,个人比较感性。
    我就是觉得这两个blog干货很多,比较偏实践,不是照本宣科照抄paper,也不是给自己公司做宣传(不然你看一下youtube的tech blog,相比较以后高下立见),而是真正给你讲他们遇到了什么问题,怎么解决的。工程师就是需要在有限的资源里做抉择,找到一个成本较低的可行解,而不是像paper一样发明个啥(对我这种低级工程师),所以看他们写的东西就觉得眼前一亮。

  2. 我上了4门,都拿了A,大概描述下
    distributed system 教授是david cheriton,亿万富翁,他挺大岁数了,所以教的不是流行的那些软件啊框架啊的,而是一大堆偏理论的概念,比如ds为啥需要时钟系统和需要怎么用时钟系统;ds为啥不能有个最优解,用shared distributed memory之类的。。。当时虽然学了,感觉没有p用啊没教我啥叫zookeeper,啥是paxos。但是这几年回过头,也是因为概念上有更深层次的思考,乱七八糟的system都能看到一些本质的东西,上手快

information retrival chris的课,上课之前提前读了2本权威的书,上了coursera的课,project和作业也是一个人独立坐下来的,因为本人的工作领域和这门课相关,感觉受益匪浅
前半段讲如何存储,后半段讲如何rank,带一点系统的知识也带一些search engine的知识,墙裂推荐

machine learning ng老师的课就不多说了,上课前自学了所有内容,本以为可以轻松应对,但是这门课的课业之重,涉及的数学之intensive还是超乎我的想象。。尤其是发类似paper的final project,投入了大量时间,真正上了这门课才发现自己真是啥都不会,想成为一个能造轮子的ml工程师差得远,还是老老实实回来做infra吧
不过现在成为一个调参(炼丹)师应该没问题

advanced operating system 静读paper的课,这门课没有太认真上,课业也不重,但是总共20篇paper涉猎非常广,有些paper的深入程度也让我花了不少时间补课,虽然做一个偏product的工程师用不到这些,但是还是极大的提高了我对系统的理解

  1. enterprise facing(我猜你说的是b2b?)的比较稳定吧?我也说不好。
    我只知道一些做infra或者prod eng的组压力不算大,oracle,workday这样的看起来也没啥事做,而做cloud的真是亚历山大。。。

我在狗的组就完全的b2c,每天要做的东西就很多很繁琐,需求也是完全没有一个定数,就是来回做来回试,压力挺大的,但是能做出来的话impact也不错

都是个人见解,说的不对希望指正

关于DDIA我说一句… 其实如果对core database的技术感兴趣的话,狗家有一些state-of-the-art的系统是很好的学习资源(对内部开放源码),比如Spanner和F1 – Spanner成名已久,F1也在扩张影响力,今年还发了另一篇VLDB:http://www.vldb.org/pvldb/vol11/p1835-samwel.pdf

DDIA这本书是好书,但只是“内功心法”,结合实践具体的招式例如源码中工程实现的各种best practices就更好了。

14年开始学习的啊
14年初看了一些入门的书 然后暑假一整个泡在图书馆把算法导论都看了
之后进实验室写一些c++ 。。。blahblah

看到你说还没有开始,其实我学这个也没有什么优化的,系统的方法,我比较习惯大力出奇迹的方式。。。
刚开始觉得操作系统很好玩就买那么恐龙书开始啃,然后觉得算法特神奇就一天泡10小时图书馆研究算法导论。。
如果刚开始,入门太难可以找找mooc或者一些名校的好课,比如可以试试berkeley的cs61a 61b和61c。

总之越早开始越好,这个就跟别人问我,题怎么刷的,系统设计怎么准备的。我听到这种问题不知道怎么回答,能给的建议就是别想那么多,撸起袖子开始干就可以了。

感谢楼主的文章,motivates a lot。最后引用的乔布斯的‘connecting the dots’这个概念,好几年前就觉得特别有道理,很多东西现在做了看似没什么用,但是当过了几年回首的时候会发现,一切都是有联系的。也许没有当年在某些方面花下的功夫,就没有了今天你想要的和骄傲的东西。有时候当自己都不知道自己为何要坚持的时候,一定要相信自己的付出在未来的某个时候是会pay off的。

lz能多讲讲关于scpd的课吗?我是stats转cs,虽然现在做着sde的工作,但系统的知识太少,而且在research组,平时写的基本都是python,需求变化的很快,也没有人要求style优化之类,离product太远,感觉没法提高coding
lz感觉scpd的课程设计怎么样呢?对理解industry level的应用(build, deploy, container, distribute)有没有帮助呢?
算法方面书或者刷题是有确定途径获得,这些更大的topic学起来有种不知如何下手的感觉,如果lz能分享一些觉得有用的书、课程就太好了

请问groking the system interview是什么网页?能发一下链接吗?

看到了!在文章最后!

请问这个课和某章算法比有什么不同?范围够吗?

是的
DDIA对我来说算是转专业 补课用的
平时用了很多f1 读完才发现原来f1这么做原来是因为相应的原因,有种打通任督二脉的感觉

我觉得某章也很好,每节课的专题,完整性很好,很系统,面试前我也会看一遍ppt
grokking是一个问题一个问题的解答,适合相对零散的时间,或者更实战模拟的时候看。我主要是走路时,吃饭排队时拿手机读一篇,然后一边吃一边就思考了

多谢大佬指点

design intensive data application 这本书让我有种把学校里学的各种东西,比如database,distributed system,parallel 之类的东西融会贯通的感觉… 发现其实殊途同归…

网上很多名校的课的网站syllabus里都有很多paper当作扩展资料,读书的时候后面也会有reference

你读到的textbook都是二手的,被别人处理过,摘选过的资料,当然读这些效率更高。但是有时候你想看看第一手的资料,作者当时是怎么说的,和一些细节到底是怎么回事,带着问题就会去看paper。细节能体现真正的expertise(但是不要纠缠在无关紧要的细节里)

做一个比喻,你写代码的时候如果用别人的库,你会去看那个库的api是怎么用的。但是如果你有兴趣或者有需求要更深入的了解别人的实现,就要花更多的时间去读代码,这就相当于从读textbook或者老师的ppt到去翻paper