月亮我要,六便士我也要
只是总结,不是指南。
todo:
- follow-up email
总纲
这边的面试基本分两种:
- technical interview
- 以考察技术水平为主
- 包括:询问简历,算法题,专项问题,etc
- behavior interview
- 以考察soft skill为主
- communication skill,leadership,team work
- 包括:询问简历/经历,以及对此公司的了解,etc
可以看到在两种interview中,其实都会问到简历/项目。但是要知道在不同类型的interview中,是需要以不同的方式来回答的。若是tech interview中,那就go into more details,罗列出使用的技术,等等;而若是在behavior interview中,就需要讲的尽量浅显易懂,并且体现出自己的热情,与他人合作能力,以及技术与当前面试的公司的共同点,等等。
分辨到底是technical还是behavior,一般都可以直接询问。或者可以根据面试官的背景而定,如果是hr来面,那必然behavior无疑;如果是engineer,那就是technical;如果是engineer背景的manager,那就可能两种都存在了,需要灵机应变。但是总之,提前准备的时候,按照这两种都充分准备好,总是没错的。
面试过程并不是一种没有意义的零和游戏,当然也不是完美的筛选机制。就像各种考试一样,通过一些有标准的,有一定筛选能力的条条框框,给面试者和公司共同带来方便。玩什么游戏,首先需要能够打心底认同游戏规则,然后熟悉它,成为老玩家。面试的过程往往也是双向的,公司挑选你,你同时也在挑选公司。good luck!
算法题
我刷题刷的不多,不过各个方面知识点也算是大概摸到了。主要跟着九章算法过了一遍。这里有我之前做的刷题笔记,基本上有意义的每一道题都有记录:
除了刷题之外,如何跟面试官在交流的时候保持沟通也是一个技术活儿。平常做题的时候可以按如下的步骤,自己念叨着练习:
- 一开始拿到题读懂之后,自己尝试几个case手过一下,同时跟面试官沟通这个过程,保证自己正确理解了题意。完了之后,这会儿基本上就会有那么一点思路了;
然后在开始念叨自己的思路,对不对没关系,直到自己感觉不错了,向面试官询问 “I think I can use XXX to solve this problem, how do you think..?”,一般面试官都会给以提示/探讨。
这里一般都会很有可能被插问:时间/空间 复杂度分析一下?能不能提高?xxx算法能不能用,复杂度怎样?
思路大概对了之后,注意想一些corner case,保证算法的正确。
准备开始写code了,保持一个良好的coding style,先定义好一个函数(or class 根据题目)的signature (input,output, name)
. 开始写code,边写边念叨。这个就得多练,怎么样写的时候又快又能bug free,同时还能跟面试官讲出来(意味着也会写comments)。
基础
我是用Java面试的,于是我就需要准备好Java基础知识,这个也是会被面到的。大概有这么几块:
常用数据结构/方法。
比如 TreeMap,HashMap的内部实现啊差异啊,等等。这一块可以复习CSCI455x;以及多oracle的doc
OOP的基础知识
比如polymorphism, inheritance的概念,以及在Java里是怎么做的?还是 看CSCI455x基本就够了。
Java源码更深一点
这个其实跟1 差不多,不过会更深一点。比如 HashTable跟HashMap的区别?(可能灰更深地去问你
线程
相关的知识)为什么用StringBuilder?等等
设计
对这部分我目前知识体系很欠缺,只是了解OOP的一些。小土刀的总结 很不错,推荐。
面试还会考到的是 系统设计
。但是这个我还没怎么看。这个帖子推荐给有需要的。
BQ
【Cracking the Coding Interview】的BQ章节,仅仅几页,但是按照它准备下来 基本是足够应付的一般遇到的BQ问题。(当然我也知道有面高盛
的同学遇到很变态的BQ。。。那就无能为力了)
心理
虽然自己经验很少,但还想简单说说自己对面试的看法。有时候假设自己是一个面试官,想想其实面试的人做题怎么样真的只是一方面。既然是筛选未来的伙伴,肯定是希望对方最好 一有能力,二好沟通。两者缺一不可吧。
资源链接
- 当然是本人的这篇文章!
- 小土刀的面试刷题笔记,很赞
- 一亩三分地的面筋。