上一篇说了一下面试准备和 behavior question 的准备方式,这篇说一下面试过程中各个阶段的准备方法,
screen interview
general question
这些是第一轮 HR 给你说的,无法就是你对他们公司有什么了解,为什么想换工作,如果 relocate,会不会把家人带过来。我觉得最重要的一点就是你的动机,也就是你为什么要来面试?以下是几点千万不能说的
1. 因为你们是大公司,我就想来大公司。我面试 facebook 的时候就这么说过,HR 直接说不希望你来只是因为我们的平台。
2. 我就想出国。。。
每个人的情况都不一样,但是一定要想个好的说辞,反正可以反复用的。
算法
这个算是一个比较大的障碍了,因为确实工作中很少用到算法,虽然去刷题有应试之嫌,但是这就是游戏规则。刷题的话,我一般都是去 www.leetcode.com,刷题的方式没个人都不一样,有人喜欢按照 topic 刷,有人喜欢按照难度刷,我的方式是 easy 和 medium 全部写完(hard 级别的因为我不是去硅谷的公司,所以就放弃了),以下是我的建议:
0. 总结出常用的模板,例如这个帖子就是一个用双指针来解字符子串题目的模板,https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-problems。这样的模板还有很多,多看看 leetcode 上每个题目的 discussion 版块,看看其他人的思路。
1. focus,有人写题的时候,还听歌,时不时刷刷朋友圈。但是实际面试的时候,会有压力,也有时间的限制,所以最好要有在高压状态下解题的能力。leetcode 上有个 mock 的功能挺好的,推荐试试。
2. 不要用 ide,有时候的面试是要求你的 code 能 compile 的,所以最好有徒手写代码的能力。
3. 注意代码格式。
4. 对于题目千万不要记代码,要记住原理。我曾经面试一个公司,on screen 的时候,出了一道原题,我取巧,就把之前写过的答案给敲上去了。但是面试官问我为什么这样解是对的,我突然就想不起来了,结果面试挂了。如果你要记录代码,还不如记录这个题目的思路,以后碰到了把思路想起来,现写代码,都比记代码强。
5. 注意和面试官的沟通,考察算法题目,其实不是考察你会不会这个算法,更多的是关注你去解决问题的能力,即使你对这个题目已经心知肚明,也要按照这个“套路”走一遍,一来把面试时间给耗完,二来也显示你不是背答案。基本上的“套路”是这样:
一: 面试官给你一个问题,这个问题可能是已经用程序描述好的,比如从一个有序的整形数组中找到一个特定的值。有些是需要你对于一个现实的问题去建模,映射成一个方法或者函数,例如有从地图上从 A 到 B 点如何距离最短,这个情况下就需要你自己定义输入输出,并且和面试官沟通好,比如我用二维数组代表这个地图,最后用返回一个整形值表示路径长度。
二: 明确一些边界条件,这个和重要。有些面试甚至特意给你一些模糊的描述,然后看你如何明确需求的。例如上面的两个问题,你可以问面试官的问题有:
-
- 这个整形数组的数据来源是什么?是一些随机值,还是一些有业务含义的值,比如客户的 ID 号,年龄?
- 如果找到了特定值,需要返回什么?是返回一个 boolean 还是数组的下标?如果找不到怎返回什么?如果有多个值满足条件应该返回什么。
三:明确定义了问题以后,你还不能着急写代码,你要跟面试官说我准备这样这样做,把你的思路给说出来,如果有白板,就画出来。关键是要 think out loud。
四:这个时候,就到你写代码的时候了。如果解法不是最优的也没有关系,关键是有个能 work 的 solution。
五:写完以后,主动说要测试一下,如果是在线代码的话,就写几个单元测试,如果是白板,就说需要测试哪几种输入。我一般会关注 边界值,空值,Null 值等等。
六:面试官会问你算法的时间复杂度和空间复杂度是多少,然后会问你能不能优化。这个时候,你就可以试着优化一下。优化不了也没有关系,其实就是看你的能力边界值在哪里。
特别推荐一个 youtube 的视频, How to: Work at Google — Example Coding/Engineering Interview,一个典型的算法面试流程。
general technical 和 system design
除去算法面试,还会有些技术问题,例如什么是 SOLID 原则,ACID 之类的,如何使用 git 去做你们的版本控制。这个就纯靠平时积累了,值得注意的有些关于软件工程的最佳实践,国外公司很看重,但是这是国内工程师会比较少涉及到的,推荐看看《clean code》,《重构,改善既有代码的设计》,《代码大全》等书。
对于系统设计,要注意的是可能会让你设计一个 电梯,动物园,停车场之类的,面对这种问题,还是看看《GOF》吧。
onsite
有些公司没有 onsite,有些有。我建议如果有 onsite 的机会还是可以去看看,一来看看这个城市是不是你想生活的,二来看看这个公司的环境怎么样。我 onsite 过一次,公司还挺好的。能到 onsite 的话,基本上拿到 offer 的机会很大了。基本上和 on screen 的流程一样,不过现场面试的时候,请一定注意交流,我很喜欢开玩笑,所以他们都觉得我很 funny。这是很好的,谁不希望和一个有意思的人一起工作呢?所以 onsite 的时候是展示你的个人魅力的时候,但是感觉国外的人不是很 care 客户第一,鞠躬尽瘁那一套。如果大家都不加班,你说你很努力,可以加班,作为面试官你希望你和这样的人工作吗?
写在最后
其实出国工作也只是换一个环境工作而已,做的事情都一样,不要想的那么难,但是困难也会有一点。比如说语言,面试机会少,对于国外公司的评价标准不清楚等等。希望我这篇文章能有所帮助。
一些参考资料
- coursera 上的 课程,https://www.coursera.org/specializations/english-interview-resume
- 《crack the code interview》
- http://www.geeksforgeeks.org/fundamentals-of-algorithms/ 这个网站上对于很多种算法问题都有很全面的分析,对于理解算法特别有帮助,也有各个公司的面试算法题。
- https://www.careercup.com , https://www.glassdoor.com 公司的评论,面试的经历。
- leetcode 题解的博客 http://blog.csdn.net/effective_coder,https://www.hrwhisper.me/leetcode-algorithm-solution/,