一个刚结束面试地狱的人来分享一下个人心得,不过可能不适用于台湾职场...
很多人都以为面试跟考试一样,给你一个题目,写出正确答案就拿满分,
然后拼命地刷累积题数,深怕考试考到自己没看过的题目就挂掉。
但其实面试结果的评量并不是只有一个面向,并不是说你写对就过,写错就没过,
而是分成好几个讯号来做评分:
1. 沟通能力:
我很喜欢敝公司人资找我去面试前说的一句话,他说“不要把面试官当考官,
而是把他当同事。”,面试其实就是让面试官来评量看看你适不适合当他的同事。
当有一个新的问题出现时,你要怎么和你的组员一起解决那个问题?你是不是可以跟
同事保持专业的讨论,包容新的想法,不让个人情绪影响工作?
所以当白板题出来时,第一件事情不是写code,而是先跟面试官讨论想法,确定问题
是否是你理解的那样,然后提出你想到的解法,分析优缺点,是否有corner case,
最后双方都同意了之后才需要开始写code。
2. 系统性地解决问题的能力:
工程师最有价值的地方其实是找出解决问题的方法,而且可以系统化地运用工具去解决。
考算法白板题最大的好处就在于这些题目通常scope不大,45分钟或1小时通常就可以
提出一些解法。算法本身就是一种工具,他们的存在就是为了解决一些常见的问题。
系统设计的题目也是要看你如何解决问题,只是题目更加开放性,通常不可能在短时间
内就提出完美的作法(现实生活中也不会有完美的做法),但可以提出一个大方向,
并对其中几个部分有更深度的了解。
3. 化抽象为具体的能力:
身为一个码农,要能把code写出来是非常重要的事情,当你提出了做法的时候,你还需要
把你的想法转化成实际的程式码才行,如果你讲得一口好算法却写不出来,就很容易被
当作只会说说的人。另外,概念和实作总会有一点差距,例如程式语言的限制,机器资源
的限制等等,这些都是在面试写code中很好的观察与讨论的点。
4. 产出具有Industrial standard结果的能力
这个对刚毕业的人比较比较无法体会。虽然每一家公司都有自己的标准,但还是一些共同
的基准可以当参考。如果你是个软件工程师,从你写的code里面多少可以看出来是否达到
低标。最简单的就是变量命名是否有意义,程式码是否足够精简,没有不必要的code等等
,现场考写code的话可以让面试官更快的得知这个讯息。
综合来说,面试考现场写code算是一个对公司来说CP值很高的作法,能获得的讯号多,花
的时间又相对少,找进来的人又大多符合预期,所以很多公司还是会采取这样的方式。至
于台湾的公司是不是只学半套就不知道了...
回到原文问的问题,刷leetcode的重点绝对不是刷了几遍刷了几题,而是你是否因为刷题
而改进你的“录取我吧”的信号(第2和第3点)。比起题数,更应该注意的是你是否因为
这题而让你对工具(算法)的使用更加熟练,进而拿它来解决新问题。虽然目前题目数
已经增加到900题,但绝大多数题目都还是用常见的工具去处理,例如BFS, DFS, sort,
hash, binary search等等。如何能够将这些东西用在提出解法,并且熟练的实作出来,
才是写leetcode更重要的意义。之前一亩三分地有个题霸各种刷好刷满,面试几乎全都
秒写最佳解,却一个offer都还没拿到。反而有许多写2.300题的人拿了不少offer。
不能否认的确有些人靠着刷题背答案再加上运气好遇到只出题库的面试官而拿到offer,
但是不该把这些特例当作常态。没有一个面试的系统是完美的,其中有很多trade off,
但是只要录取进来的能有80%是符合预期的就已经很不错了,剩下的就是利用淘汰机制
来处理掉面试系统过滤不掉的人。
至于有些人说考这些不如考工作上会用到的东西,我个人认为这是很困难的事情,因为
不同公司、不同部门、甚至不同人用的工具就有可能差很多,而且没有两个职缺需要的
东西是一模一样的。即使是同样的framework来说,面试官可能随手考一个他最近刚用到
的function但你可能从来没看过,这样一来就无法评断一个人解决问题的能力,而只能
知道这个人有没有用过某种特定的东西而已,这种结果对于找正确的人进来也不会有太大
的帮助。
最后还是声明一下,以上是个人在北美面试的经验,台湾职场可能不适用QQ