Google

UIUC CS学长分享 | 入职1年后, 我如何成功跳槽谷歌?

Jackie Xiang | UIUC | CS
作为一个科班出身、有工作经验的同学,我认为来Offer的课程非常的详细和系统。刚开始,我只是希望能提升一下system design的能力,但在听课和Mock Interview之后,我才意识到自己在算法、交流、OOD、System Design上都有了极大的进步。在上完来Offer的课之后,我从以前觉得论坛上的人的解法都是正确的,到现在也可以提出自己的更好的解法、给他们做code review了。感谢来Offer,最终帮助我成功跳槽Google。

首先恭喜已经报名来Offer课的同学们,作为“过来人”告诉你们:你们做出了十分正确的决定。 因为来Offer中的老师都是十分senior和experienced的人,你们可以师从武林高手学习各种知识。 比自己一个人在家苦练或者自学各种奇怪的功夫要好多了。

一些求职误区

现在不比两年前,招聘市场竞争已十分激烈,大家的准备也越来越充分,功力稍显不足就会在与面试官过招的过程中,暴露破绽从而痛失offer。所以,大家千万不要觉得“学长学姐们怎么怎么样,我也怎么怎么样”,我就深深因为轻敌而吃了不少亏!因为大家碰到的情况已经不同, 所以一定要跟着老师们的要求来训练自己。

其实同学们想要背个答案,或者套个模板的想法,在武林高手面前也都是一眼就能看出来的,内力如何,一个followup便知。同样的降龙十八掌,郭靖用和宋青书用威力就天差地别了。

关于基本功

我刚找到来Offer的时候,觉得自己也算在算法上有点自信,作为一个experienced hire我希望能提升一下在system design的能力,从而迈向更高的层次。但在mock interview和听了孙老师的课之后,才发现其实自己在算法上、交流上,都是有巨大的问题。大家在学习过程中也要注意,并不要只想怎么system design,而是要从最基本的“武功”,一招一式地按照“师傅们”的教诲去练习。

uiuccsgoogle-1

说到孙老师的课程,我作为一个科班出身的人,觉得老师的课程十分详细和系统!

对于许多转行、转专业的同学,只要认真刻苦学习,是可以快速得到基本的程序员的素养。

对于科班的同学,那就更好了!在温习自己过去的知识的同时,大家还可以学习老师们的思路和分析的方法。比如,如何用已经知道的知识来解决未知的问题,并且与自己之前对这个问题的理解相互比较。虽然,你可能无法在一时之间领悟招式的变化之精巧,但只要认真去思考不同以及为啥不同,或多或少总能温故知新得到新的体会。而这些新的体会,对你们的工作往往也是大有裨益的!我也是在保持仔细体悟、将大师与自己的想法比较的过程中,得以提升。其实抽象一下,这就是锻炼自己的problem solving 能力,这个能力恰恰是日后在工作中、在职场上大展身手的内力。

对于有工作经验的同学,要记住:面试官对你们的要求是非常高的。从naming到算法、到思考分析的能力,你都要展现出一个成熟的武林高手的姿态和能力。每一个细节都要仔细打磨,不可用new grad的要求来要求自己。要把每次面试的问题都是当成一个老板交给的任务,在面试中要体现出自己在工作中的能力与素养,写出能work的code真的只是最低的要求。

uiuccsgoogle-2

关于面试

在面试过程中,我有好几次“因为一个很小的问题而最终导致错过自己非常非常想要的offer”的经历,这时才知道,如果自己能在平时更注意细节、更多地考虑到每种情况,而不是草草地准备,是多么的重要!但往往已经后悔莫及。所以,小心谨慎、细致周密地考量,也是一个senior的工程师必不可少的素质。

对于交流,我之前比较喜欢一下子给出答案,因为很多时候问题的答案是十分显然的。但也有不显然的时候,这个时候如果心虚,就很容易会选择猜一个最有可能的情况来回答。(比如时间复杂度肯定是O(n),O(NlogN), O(n^2)里面几个常见的选嘛……) 但这恰恰正是我交流、或者在面试过程中的最大弱点,因为这表明了我在内心是一个投机主义者,这样的想法是一个成熟的工程师不该拥有的。

如果一眼无法分析出来,就慢慢在纸上把想法写下来,说明了自己的分析想法。就算这次时间关系做不出这题,但O(n)就是O(n), O(n^2)就是O(n^2),如果现在做题都想着投机糊弄,那以后工作还得了,领导同事怎么敢把十分复杂艰难的任务交给你呢?

uiuccsgoogle-3

所以很多问题看起来无非是习惯,是交流,但更深层次的问题往往是自己意识上、思想上的问题。想要变得越来越senior,越来越得到领导和同事的信任,那第一要改掉的就是这种想法,从而踏踏实实工作也好,完成任务也好。改变自己既有的思维习惯往往是最难的,但想要达到更高的层次也是必须的,所以千万不可心急,也不可觉得“别人能做到那我也能在短时间内做到”。

如果能在准备面试的过程中,把自己从一个鲁莽的street smart变成细致周密的book smart,那这些东西对自己生活上也是有益处的。在美国文化中,这是程序正义,一定要每步都做到,才能说自己做好了这个事。

关于提升方法

至于学习的方法,我建议同学们要经常尝试自己重新组织老师讲的知识和内容。

虽然老师讲的很好,同学们听得很过瘾,但这是输入,输入是老师的不是同学的。只有同学们能输出了,自己能从白纸上把整个知识架构画出来,能把每一种题型为啥用这个方法说出来,能把自己之前会做的、不会做的题目归类出来(比如,自己会做的题拥有哪些特征,不会做的题目有那些特征,这题其实就是那种题目,这两题其实本质是一样的等等),拥有拓展迁移的能力,这时候,这武功才是同学们自己的。因为归根结底,面试时,身边不会有老师的指导,你能依靠的,只有自己平时积累的功力。

在经常用不同的角度去组织老师内容的同时,自己静下来的体悟也是一个必不可少的部分。能做到这些的同学的武功修为,可以算是高手高手高高手了。

在上课时如果犯了错误,那更是大大的好事,因为这样能深刻地让你意识到自己思维上的误区。

还有一个简单的让同学们判断自己的武功修为的办法,就是找一个自己之前觉得棘手又无从下手的问题,等到训练完之后再去做,看看自己能不能有新的体悟,如果有,并且能思路清晰、头头是道地分析,那武功就有一定的长进了。

在上完来Offer的课之后,我从以前觉得论坛上的人的解法都是正确的,到现在也可以提出自己的更好的解法、给他们做code review了。

uiuccsgoogle-4

除了老师们的教导之外,我也看了《Effective Java》, 《Clean Code》, 《Refactoring》一些计算机领域的经典,我觉得这些书也有助于提升自己的内功,更能理解高手们为啥这么出招。

比如,对于“有时明明两种写法都可以,为啥要这样写”的情况,很多时候都是老司机们的经验,但新司机们没有遇到过类似的问题,就不会懂。

总之,多学无害,毕竟在成为一个更高级的程序员的道路上还有很多东西要学,很多思想要去理解。希望同学们在入职后也不要放弃提升自己,技术也如逆水行舟,不进则退。

最后,感谢来Offer对我的帮助,祝大家求职顺利!