工作一年多,本来还没打算跳槽,linkedin上猎头联系,电话聊了之后发现机会还不错,就接着面下去了。因为是计划外的跳槽,加上个人原因最近很忙,所以并没有一次面很多公司,也没有自己去投大公司。面了几家风格迥异职能不同的公司,基本都给了口头offer,但因为各种原因最后只拿到一家的正式offer,目前还在讨论offer细节。技术面可以参看我之前的面经贴。
我并没有提前几个月就系统地准备跳槽,很多时候面试都是提前几天突击。当然,还有自己平日工作中的积累。跟2年前作为new grad申请相比,能明显感到自己现在面试时心态的变化,这里就总结一下这些“变化”。
1. 工作中的日常积累
1)总结知识点
上班跟上学不一样,不太有机会能够系统地学习新知识,很多时候都是一些零星的知识碎片和概念技巧,学了不记下来马上就忘了。我的一个mentor教我用google doc分门别类地及时记录新知识点,然后不定期地整理总结。比如关于evaluation metrics,书本上写的跟自己工作中实际用到的,肯定有不同的理解。这样长时间积累下来就会有很多自己独创的“使用手册”。
也可以利用上班时间查漏补缺地学习相关的知识,不算是干私活。如果公司里有其他组用到某些tooling,自己就可以在工作之余学习。
Learning on the job,在工作中学到的东西确实很多。
2)精读基础书
为了更好地深入了解巩固某些概念,精读一些经典的基础书总是好的,特别是像我这种从STEM转行的同学,在学校没有读过统计名著。现在重新读ESL,虽然真的很吃力,但很多时候有豁然开朗的满足感。读numerical optimization也对优化有了更加深入的认识。
精读的时候可以自己推导公式,思考算法逻辑,自己implement,读一些博客文章,看看youtube上一些讲得很好的视频加深理解。
至于时间安排,我自己是利用每天通勤的2小时看书看视频,然后周末用几个小时推导公式进行总结。
3)了解行业发展和前沿
关注科技博客medium, 知乎的技术专栏,微信的IT类公众号,提高自己的姿势水平。
2. 了解面试官
基本在面试前都会知道面试官的名字,这是非常有用的信息。我一般都会linkedin + google去搜面试官的背景、经历、之前的工作方向,在面试的时候可以作为谈资,特别是在面试最后问问题的时候,如果能够针对面试官的背景提问,就显得你做足了功课。
举几个例子
1)面试官A之前在大公司担任要职,现在在一个startup,问问他之前经验那么丰富,为什么现在选择了小公司?想要实现什么?
2)面试官B跟你一个学校,就可以聊聊他在学校时上过的课,哪个最有帮助?
3)面试官C跟你一样是博士转行,问问他转行的感受,5年之后有什么计划?
4)面试官D之前发了不少paper(你google发现的),可以问他paper细节(如果你读了),问他工作中是否也要求发paper呢?发paper的idea是谁的呢?
5)面试官E之前一直在小公司工作,现在在大公司,问问他工作环境有什么不同
人啊,都喜欢聊自己,如果能够让面试官感受到你对他很关注很感兴趣,让他对自己的经历侃侃而谈,会留下不错的印象。
3. 了解公司和产品
除了公司官网介绍和技术博客,我也是准备面试的时候才发现youtube是一个很好的了解公司产品的平台。很多公司会把自己的meet up,tech talk,conference talk放在youtube上,这些视频对了解面试公司非常有帮助。
举几个例子
1)我在网上读到说你们现在用这个技术X,你能给我介绍一下么?
2)我看了一个你们的tech talk,里面提到你们的平台Y,能告诉我一些细节么?
3)你觉得工作中最大的技术挑战是什么?
4)你觉得你们最大的竞争对手是什么?是A,B,C么?你觉得你们的优势是什么?
最后一个问题一般可以问pm或者manager。问的时候可以加入自己的理解,表示自己确实在思考这个问题,而不是纯粹发问。
4. 突击ML系统设计
这里的突击是指像我这样的非计划面试。如果你定了计划打算准备几个月再面试,那就可以把【突击】改成【持久战】,可以参考地里准备的帖子。
我这里主要就是对那些下周就面试了,还没系统学过系统设计的同学。
1) 工作中保持全局观,始终思考着system和pipeline。即使自己只是做一个环节一个model,也可以跟engineer跟其他组员聊,从大局上了解整个流程。比如你做了一个新feature,怎么scale,怎么evaluate,怎么productionalize,怎么上线,怎么monitor。就算自己不做,也可以问问多了解别的同事怎么做的。
2)看youtube视频学习。速成是不可能速成的,但一些概念性和框架性的东西,其实也不难理解。
3)看经典系统设计书design data intensive applications。当然如果有时间还是要精读,但突击的时候可以花1、2天时间浏览一下,同样是熟悉概念和词汇。
5. 突击刷题
首先,你得系统上过至少一节算法/数据结构的课(网课或者学校),不然连概念都不熟悉。上过课做过作业应该就熟悉常用算法,那么刷题就是时间和熟练度的问题,所以突击的效果肯定远远比不上几个月的刷题。
但是如果平时你的工作偏建模或者分析,基本没刷过题,面试的大多数公司也不考蠡口,但下周的一个面试要考蠡口,与其坐以待毙,不如有技巧地突击刷个题,尽人事。
这里我推荐下youtube上cracking the coding interview作者的视频,她非常系统条理清楚地讲了常见的问题和解题思路。这些视频不只是突击的时候可以看看,大家长时间刷题之余也可以看看巩固自己的知识点。
当然还要看看地里和glassdoor的面经,如果能刷到高频题就luckyyyy
6. 好好准备自我介绍
一般面试的第一步都是自我介绍,大概1-2分钟。这算是第一印象,也决定了面试官之后技术提问的内容。如果你不想让面试官问你NLP,就不要在介绍中说自己做过NLP的项目。如果你觉得自己pipeline做得很好,那就可以强调自己做过end to end。
这个介绍不宜太长,可以说完之后跟面试官说, 如果你有兴趣我们可以接着说。
7. 短处、处理人际冲突的2个故事
长处不说了,单说这两个负面的行为问题。
New grad面试的时候我还在用常见的模板,比如完美主义,同组同学不干活……工作之后发现这些问题其实很常见QAQ
短处基本工作中跟manager聊天的时候都会提到,自己刚开始工作肯定也有遇到各种不适和问题,意识到自己图样图森破。短处不一定是你已经改好了的,比如我的短处就是有时候太偏research而没有考虑到production的可行性,可以举例说明因为自己的短处导致项目不成功之类的,现在自己意识到并且在努力改善。
至于人际冲突,当然还是有套路的,出现矛盾然后约咖啡单独聊天。主要是体现你这个人能够接受别人的意见,并且能够妥协达成一致。
8. 态度和沟通
常言道,说啥固然重要,但话怎么说更重要。面试从开始都最后,我们的态度都要是自信正面积极乐观的,最好还能带点幽默和适当的自嘲。从基本的礼仪来说,见到面试官主动打招呼握手,讲话的时候尽量直视面试官的眼睛,在别人讲话时不打断别人说话,但也要engaged适时给些诸如“厉害了,牛逼,怎么做到的“之类的正面反馈,自己讲话的时候注意别人的反应,不要独白太长时间。
想象面试官是每天坐在你旁边的同事,他的问题可能就是他工作中遇到的问题,来找你讨论。所以回答问题的时候,我觉得可以就用跟同事聊天的语气,而不是学生回答老师提问的语气。当然这个可能也因公司而异,tech公司一般比较随意,传统行业以及咨询公司可能就得稍微端着。总之,入乡随俗。
Non-verbal的态度(肢体语言)也很重要,挺胸不驼背,肩膀挺直,不要坐立不安,也不要总是盯着天花板。
遇到不会的问题,及时说明自己的思路和想法,如果面试官知道你在哪里卡住了,就可以给你hint。
用我一个朋友的话,面试的时候就乐呵呵的,谁也不想找一个苦大仇深或者动辄就崩溃的同事。工作中肯定会有困难、不会、卡壳的时候,这个时候最好能够保持冷静和学习的态度,遇到问题,解决问题,寻求帮助,共同进步。
举几个例子:
1) 面试官问了个SQL 的问题,你在他问完之后马上就知道用个join groupby count就解决了。但设想一下这是日常工作,那么最好就先重复一下他的问题,确定需求没有搞错,然后一步步地先说明自己的思考方向和理由,要实现X,我们得先join这两个表,用这个column X,然后我们根据column Y看每个不同的Y的情况,这里我们可以用groupby,最后我们数一下每个Y的数目。解释完思路问,sounds good? 然后你就可以开始写SQL了。如果在任何时候,面试官提问说这个不清楚,或者那个不对,你就可以及时停笔跟他交流,解释自己的思路和想法。
2) 面试官问怎么设计用户流失模型,你脑中立马搜索到相关的pipeline和专业知识。但设想一下如果这是日常工作,那第一步还是先确定需求和目标,然后大方向地讨论一下,解释自己的思路框架,然后再说细节和优化。
3)面试官问你如何监测一个模型,你在brainstorm地说了几个思路之后,他都说不太对,你确实没有思路了,这个时候可以问,能给我一点hint 么?我有点stuck。一般这时候面试官都会给你指点,对这个hint可一定要听明白了,然后举一反三,并且对面试官表示感谢。
整体上传达出I know my sh*t, and I am eager to learn things that I don’t know。
最后,祝大家面试顺利。