本文由同济大学毕业生王同学提供。原文较长,故分为两篇,上一篇主要讲求职经历,本篇主要讲如何 准备面试。原文如下:
下面讲一下如何准备面试。IT 的技术性面试,主要就包括几个方面:
1) 编程语言的细节
2) 算法题
3) 设计题
4) 其他包括操作系统、数据库等知识。
像微软和谷歌主要就是考察2,3类的题,国内的公司偏重1,4类的题更多。
首先编程语言的知识,我觉得首先需要多看书,像 C++的话可以看一下effective c++,exceptional c++,effective stl,C++应用程序性能优化等系列,面试的问题很多是我们平时在编程容易忽略的一些细节知识。另外在平时写代码的时候,根据这些书里的意见,养成好的编程习惯,比如 c++ 里该用const的地方,尽量用等,这样最后面试写出来的代码也会比较规范。另外,平时写代码的时候,尽量不用IDE的代码提示或者直接用vi等编辑器,记住c++ stl里容器、算法的名字、用法等,这样面试时在纸上写代码时也会更得心应手。
其次是算法题,由于这类题都需要直接写出代码,所以很考验编程的基本功。提高这个能力,就需要多做题,虽然我没有参加过 ACM,不过在保研之后那段时间在POJ、topcoder上刷过大量的题,通过刷题可以巩固数据结构、算法书上的很多知识。另外刷题我觉得更重要的不是说你掌握了多少算法,而是通过不断的想问题、写代码、调试程序,可以养成比较好的编程的习惯。在写代码之前一定要先理清楚自己代码的思路,写出来的代码应当尽可能逻辑清晰、简洁。面试的时候,我觉得代码最好是能一次正确地写出来,否则在纸上或白板上涂涂改改,最后不仅思路混乱而且容易给面试官留下不好的印象。另外,写代码的时候碰到递归、循环迭代等的时候,要有计算时间(空间)复杂度的意识,看看会不会出现死循环,栈溢出,计算超时等问题。由于 POJ 上面的题,很多时候不通过的话就是在边界条件上出了问题,所以刷题多了,也能养成良好的检查边界的习惯。此外,对于快速应付面试的话,像编程之美,剑指 offer,Cracking the Coding Interview这些书也都不错,另外有一个网站leetcode则是专门用来刷面试题的,特别适合准备面试。还有在面试写代码的时候,对于输入参数的检查,异常处理等也很重要,另外包括代码中的命名规范等细节也应尽可能做好。
设计题的话,一方面可以看下CareerCup网站上一些面试的设计题,看看大概的回答思路,其次就是一些类的继承关系的设计、设计模式等的应用了。这方面的话,可以看看经典的GOF的设计模式那本书,还有包括设计模式沉思录等,另外在平时使用一些现有的库的时候,多想想别人为什么这样设计,应用了哪些设计模式。在平时做项目的过程中应当有意识的去使用一些设计模式,这样可以加深对设计模式的理解,而且在面试聊项目经验的时候也可以和面试官扯扯这些东西(因为项目的东西,很多时候面试官不懂你做的东西的具体实现细节,但设计模式大多数面试官都知道,然后可以和你探讨一下,本身用设计模式也能说明你写代码比较有经验,给面试加分)。
最后是一些计算机中比较杂的知识,这些可以通过看看往年的笔试/面试的题目,基本考察的点都差不多,临时温习下也比较快。
除了以上4点,在面试前,包括纸上写代码、白板写代码等都可以花点时间训练下,这个感觉和平时在电脑上写还是很不一样的。另外针对外企面试中可能出现的英文面试(我谷歌有2轮是英文面),可以在平时多看一些英文的书,包括算法类和编程语言类(像上面提到的effective系列, 图书馆都有英文版的书),至少一些关键的技术词汇对应的英文都要知道, 因为很多时候需要用英文解释下你的代码,平时在写代码的时候也可以尝试用英文表述下你的解题思路和代码流程,否则面试时候很可能无法和面试官沟通。