Uber
UCLA EE学长分享 | 面挂无数公司的我, 是如何拿到Uber offer的?
大家好, 我是Yifan,在这里跟大家分享一下我找工作的经历,以及个人对于找工作的一些建议。
先说说我自己吧,我是UCLA的EE的master,在校友的推荐下知道的来Offer(我校友在来Offer的帮助下,拿到了hulu的offer)。跟一些同学加入来Offer时的情况不太一样的是,我在加入的时候自以为是有一定的算法功底,并且已经成功拿到了Google的onsite。当时的想法只是想找一个能提供内推的平台,毕竟自己的人脉有限,但在加入了之后,才发现自己是:图样图森破。
记得在第一节试听课的时候,孙老师让我做了一下remove a node in BST那个题。当时没有现场写出来,心里想这题反正算难题,写不出来就写不出来吧。
后来在面试的时候才发现,现在的求职,可不是面试做做题,做出来就能拿offer那么简单了。你知道的那些刷题网站,你面试官也知道。而且就算走运在面试时碰到了一道原题、并做出来了,也不代表你能拿到offer。
面试官要的不是答案。面试官他们更看重的,是你如何解题的这个过程,以及对于他们提出来的follow up问题,你会如何灵活运用自己的所学,来最大限度上地解决这个问题。
至于如何才能让自己在面试中有好的表现,我打算分为以下几个方面来说。
怎么准备面试中的算法题
一般提到想找计算机的工作,大家的第一反应就是两个字:刷题。好像只要自己把题刷了多少多少遍,不管是flag还是这些新兴的独角兽公司都是可以拿下的。
在我看来,想在面试中的算法题部分取得好的结果,需要有“把实际的题抽象、归纳成自己知道的算法和数据结构的想法,然后再把这个想法用code实现出来”的能力。而所谓的“刷题”,就只是在让自己练习这个实现的过程,是手段而不是目的。
给你一个题,当你意识到这是一个图表BFS遍历题的时候,你一般需要多长时间建图?多长时间遍历?需要什么数据结构?什么时候用到哪个数据结构……这些都是空想不出来的,都是要一点一点码code才能给自己答案的。
依稀记得当年面Google的第二轮,面试官给了一个迷宫题,说白了就是个BFS,可是自己当时就是对这个时间没有准确的感觉,才导致最后没有完成这轮coding。
所以,我的建议就是:
当你做题做到自己对自己的实现能力很有把握的时候,就不要再疯狂的做题了,保持一个手感就好。过多的刷题,反而会在遇到做过的难题的时候进入一个“我当时怎么做的来着”的思维。
把每一个见过的题都当成新题,并且能自己一点点分析和说出来自己怎么想的过程,才应该是做题最后的结果。
注重code的质量
前文中提到了把实际的题抽象、归纳成自己知道的东西,这个也正是来Offer所能提供给大家的。
我在上来Offer之前也算是有一点算法基础吧,自我感觉比较良好。 可是我的一个很大的问题,用朋友的话讲就是:“一看你这code就是没证的程序员写的”。
我写的code,若给同是主语言为python的人看,好好看看还是能看懂,但是碰上以java为主语言的人来看,就真的是非常的累。code是程序员之间沟通最好的方式,一份质量高的code是能充分表现出一个人的思维过程的,这也是来Offer所能提供给大家的。
我个人感触最深的就是孙老师对dfs和dp的讲解,如何写一个dfs的形式,如何画recursion tree来分析时间复杂度,以及“linear scan回头看”,“中心开花”……这些简单但又准确表达了算法过程的名字,让我对很多东西都豁然开朗。我还记得,孙老师教我们,在分析时间复杂度的时候,可以把recursion tree画出来,既帮助自己分析,也是一个展现给面试官自己为什么这么想的过程。这让我非常受益。
除此之外,来Offer教案中的选题也是非常经典非常高频的题,希望大家多多复习好好准备,比如reservoir sampling的思想,我在面试中就被问过3次。
来Offer对我另外一个很大的帮助就是大大提升了我debug的能力。
上课是交互的,我在看别人coding的时候,自己也要同时做,并且对比,才会有所提高。人都是在错误中学习的,希望大家不要害怕,在上课的时候踊跃报名去coding pad上code,这是一件锻炼自己且造福别人的攒人品的事儿。
此外,来Offer也给大家提供了一个来把上课所学的这些算法和想法实现的平台,就是laicode,这个之前有学员用得更好一些,大家看看他的心得可能会更有帮助,希望大家多加利用吧。
另外也非常想感谢一下来Offer的这些老师 (尤其闫老师和赵老师)。
我在来Offer算是小众群体,我的主语言的python,从第二次期中考开始基本就是用python来写了,感觉老师中用python的并不多,但是老师们也是一点一点帮助我改进我的coding style,从最开始的“什么玩意儿”到后来的“比较readable”。也感谢吕老师分享给我的一些关于python如何实现、一些常见数据结构的文章,让我对底层有了更多的了解。
注意面试中的沟通,注意心态
这方面,其实还是挺重要的。
我刚进来Offer的时候,经过了从自我感觉良好到知道自己比较菜的一个过程。听课的时候看到有的同学答一些二维甚至多维dp的时候行云流水还是比较羡慕的,因为自己真的达不到啊。
随着上课,能力慢慢提高,发现自己做题能力也不错了,心态也变得浮躁起来。周六的mock五道题也差不多能做出来四道半了,尤其是在面完hulu和Amazon之后,整个人都觉得,太easy了!但是这两家公司无一例外都把我拒掉了。当时整个人就是怨天尤人:“为什么把我拒掉?不就是做做题么,我都做出来了啊!”、“肯定是遇到的面试官都是弱鸡,出的题这么low,这能有什么区分度啊?”、“为什么就是没有地方觉得我厉害啊?”……如此之类的。
在面Amazon之后的两个月,没有任何面试,好不容易有了一个Snapchat的电面,却给了我重重的一击。一个小时,两个题,第二题是个二维dp跟回文相关的题。当我得到朋友给我的回复:“面试官说你code还行,沟通不行,onsite一定跪,所以电面就不给过了吧。”
整个人都是崩溃的。我在心里抱怨Snapchat,“你一个软件公司,不看code看沟通?要是所有都看沟通,我到底怎么做才可以啊,一个电面,难道不是做出来题就好了吗?”
带着这种抱怨的心理,我又接着面了三家,都是做出来了面试题,但都是没过电面。
之后孙老师来LA出差,我终于见到了老师,见面聊了好久,在老师的开导之下,才意识到:面试这件事,是一个很公平的过程,这里的公平,指的是公司判断一个人的时候,是判断他的全方位,而不是只看他会不会做题、有没有背答案。
自己最开始以为的“有能力会解题,面试就应该过”,才是一个不公平的想法。说不定人家就是沟通比你好面试官觉得以后一起工作比较舒服,说不定人家就是天生有优势能带起来全组人的化学反应,说不定面试官就是觉得和你八字不合……
面试不是考试,考试我做对了,老师你再不喜欢我你也得给我分;而面试不是,面试官可能会想,在你之后,还有10几个来面试的人,而且,你又不是美国队长,你也不是钢铁侠,你又不能拯救世界,我跟你相处的不舒服,我为什么要给你过。所以,当面试没过的时候,想想自己有没有犯什么低级错误,比如如何和别人交流,如何让面试官肯定你的能力,而不是自己总觉得“自己牛,自己没错,都是你黑的我”。
面试失败后,学到失败经验了,就行了。不要让已经发生的去影响自己的心情,move on,此处不留爷,自有留爷处。
另外,我是个口吃的人,一着急就说话不清楚。感谢来Offer的老师在这方面对我的帮助。
相信跟我一起上过课的同学都听过,老师劝我放平心态,每次着急回答问题时,先数5个数,相信自己,只要自己慢慢解释慢慢说,面试官是会听懂的。
孙老师教会我怎么在面试中交流,亲自帮我修改英文自我介绍,一遍一遍的教我如何表达和讲解自己做过的项目。
一些个人建议
另外说一个个人建议吧,希望同学们不要让拒信影响自己太多的心情。
找工作并不是一个“我学习好,我知道得多,我能去斯坦福,我也就能去UCLA”的过程。找工作很可能是一个二线公司连机会都不给你,但你却连续斩获一线公司offer的过程。比如我自己,我在面Uber的当天早上收到了houzz的拒信,简历没过,第二天收到EA的拒信,说我不够new grad的minimum requirement。
这里并不是想说某公司比某公司好,当你收到拒信的时候,即使是一个很想去的公司,也不要想自己当初投出去的简历是自己投出去的一个希望,而现在希望破灭了。Dream big, and let it go.
暂时就想到这么多,最后推荐两首歌吧,平时心态浮躁了就听听朴树的《平凡之路》,想象歌词中说的就是自己,面试前听听《butterfly》,让自己燃一些,超进化一下,lol。
最后,祝大家早日都拿到自己心仪的offer。