序 今年的冬天,硅谷11月份的天气比以往都要寒冷,通常这个时候有很多人还穿短袖,但今年我包括我们一些同事居然早早穿起了薄薄的羽绒服。不止是天气,职场上大家也都看到了,更是寒气逼人,各大公司都在撸起袖子裁人,哎资本市场就是这么残酷,唯有我们自己变的更强,才能稍以抵御寒冬。向那些兄弟姐妹们致以祝福,希望他们能坚强的挺过来。
本来今年4月份就想写这篇文章,后来有些事情就耽搁了,现在想想还是写下吧,当做自己的一个回忆,如果能帮助到一些人或者即使是只能起到鼓励的作用也满足了。其他有些事我还是先言在先,本文不是为了哗众取宠,请不要人身攻击,我也不是什么大牛,就是普通老百姓发发贴谈谈内心想法而已,如果你有不同的观点欢迎讨论。另外,也请不要带入任何政治话题,作为一个做技术出身的,政治从来都不是我的话题。
我,本来在硅谷一家还算不错的大公司工作。前几年还是一个小manager,手底还管了几个小弟。一线manager真的特别特别累,后来不做了,只做了一个更小的function lead,相对轻松一点。基于两个方面的考虑,决定准备换工作。第一:一项工作做久了确实有疲倦感。第二:有些同事跳到了更好的公司,激发了我们的斗志。这样,大概3年前就开始着手准备,当然像我们做软件的首要目标肯定是瞄准了Google。刚开始准备的那段时间也是挺痛苦的,每天都是在工作之余晚上刷题,而且我还没学过C++,只能一点一点的啃。
就这样3年下来零零碎碎的刷刷题,差不多自己也写了2万多字的总结,把leetcode前面300多道题都刷了2-3遍。但是说老实话,我们这样的年龄,最大的敌人就是遗忘,刷完了一有几个月不复习基本就都忘光了。没办法只能不停的复习复习再复习。
今年的1月份终于狠下心来再全面复习一遍。而且摘出其中具有代表性的100道题打印出来,然后一遍又一遍的手写。这是一个痛苦的过程,真的非常痛苦。但是及其有用,因为很多公司考题是让你现场调试code的,或者是一页空白纸写完后他们到后台运行验证。同时,还需要大量准备system design方面的题,尽管有些岗位可能不需要,但必须要准备。除此之外,我又精选了100道C语言题,以准备嵌入式方面工作岗位面试。再者,像Google和Amazon还需要考leadship方面的题。就这几样,每天就像疯了一样,不停的手写背诵。
功夫不负有心人,准备一个多月后,在2-3月份的连续面试后,顺利地拿到了Amazon,Apple和Google的offer。这里面Apple面试的轮数最大,达到了恐怖的9轮,即使是director那一级别还是一上来就考题,只有到了最后一轮VP,才简单的问问为什么跳槽什么的。Google是等的时间最长的,主要是因为录取是要经过她们的评审委员会review讨论然后才会批准。最后,考虑到多方面的综合因素,还是选择了Google。这里稍讲一点题外话,当年有个朋友跳槽到Google,他带我去Google食堂吃了顿饭,我当时心里就默默在想,要是哪天我也能进来就好。后来我就把那张visitor卡一直保留在身边激励自己,在不久的将来,一定要进入所谓的“软件工程师的殿堂”。
好了,最后就分享一点面试经验吧(当时草草写的),大家共勉。
-------------------------------------------------------------------------------
从1月份开始备战到现在差不多2个月,有点精疲力尽,压力也非常大。本来是本着把Amazon好好面试完的目的,没想到Apple和Google也面的特别好,最后极有可能同时拿到3家的offer,至少现在已经拿到Amazon不错的offer了。自己备战是一方面,也是天时地利人和的综合,非常感谢朋友的帮助。那些平时也没怎么联系的朋友,到了关键时候都挺给力的。所以平时对待朋友还是要真诚、善良、热心,等到将来的某个时候,就会感觉有回报。
最后稍微总结一下面试的方方面面:
1. 简历的书写 -- 个人觉得没有大的语法错误即可,一定要写1-2个亮点,最好是比较前沿的技术,这样才会引起每一个面试官的兴趣,你就有故事可讲。
2. 简历的投递 -- 务必找认识的朋友帮忙投递,否则90%以上石沉大海。试想,hire manager哪有那么多时间从上千到上万封简历中去能看得到你的简历?
3. 一边准备,一边投简历,因为通常HR走流程都很慢(4-8周),而且在通过首轮电面之后,自己可以选时间,从而可以留出更多的时间来复习
4. Coding和技术方面的准备:
a. 算法题:把leetcode上前200-300道的easy和medium难度的题都刷一到两遍,然后精选100道题下来(含括各方面,比如:二分搜索、双指针、链表、树、dp、回溯法、哈希集合、math等等),不停的默写。直到熟的不能再熟了。原因是大公司都需要你在写下来答案后,现场运行代码或者调试,最终能pass。所以平时的默写就起到了关键作用。
b. C语言题:如果是面试embedded领域的software engineer,那C语言是必须要会而且要精通的。建议直接下载网上的c语言面试题,打印下来,也是默写。把每一道题都理解透。
c. System design题:如果是embedded领域的,对这方面没有太多要求,都是比较简单的问题。但纯software的童鞋们,system design应该是要多准备的。比较有名的应该是这里:
https://www.educative.io/courses/grokking-the-system-design-interview,如果想深入,花点钱学习它的课程还是值得的。
d. Leadership:这个是多数人特别忽视的,但非常重要。好像觉得只有Amazon才问这类的问题,其实不是,Google一样也考,apple虽然不大面积的考,但是最后的高层面的时候还是会问这方面的题目。建议先准备Amazon的leadership(每个题目准备至少一个例子,最好有两个例子),然后就可以用例子去套Google的leadship。把这些例子全部用PPT写好,然后打印出来,天天过一遍。到最后就能对答如流了。
e. 最后就是专业知识了。这个没法说,反正就是对你自己做过的领域要非常的熟悉,多复习,因为在面试的时候,除了coding之外,专业领域问的题也是很多的。
5. 如果有机会,面试之前和要面试的同team的朋友多聊聊,有哪些需要注意事项或者以前考过哪些题,有的时候说不定有类似的题目,当然通常是不一样的,因为面试官大概率是不同的人。
6. 面试时要淡定,如果题目实在不能全部写对,但思路要广阔,而且考虑的要多(边界,优化等等)。这样你就能给面试官留下好的印象,至少你思路比较广:方法多,也能很好的考虑到边界条件等等。
最后,祝大家都好运,用新东方老俞的一句话共勉:
平凡的生活,只要你努力就会有意义,关键在于你是否愿意坚持。
--
修改:ruson FROM 73.158.58.*
FROM 73.158.58.*