标题:IT职位面试与流程


笔试

一般来说,获得了面试资格的朋友,接下来可能会有一场笔试,尤其是招聘单位应征人数太多的时候,往往会安排一场集中笔试。而应届生的朋友或者是工作年限少于3年的朋友,也可能会被安排笔试。

笔试考查的一般是计算机领域的基础知识和编程的基本技能。一般包括C/C++,Java的语法知识,程序设计与调试的基本技能,简单的算法设计等,也有可能存在智力测试题。但智力测试题一般区分度偏低。微软以前很开出一些智力测试题,但是现在智力测试题已经很少出现在他们的笔试与面试里面了。

很多朋友能够很容易得到面试机会,也做了不少重要的项目,却在笔试环节总过不去。那么,这是什么原因造成的呢?很可能就是你的基础不扎实,平时缺乏对基础的学习和掌握。那么我建议你们好好学习本书第一篇即技术篇。要想顺利通过笔试环节,必须要有扎实的编程基本知识和基本技能。这些包括但并不局限于:开发语言的基本知识,算法设计基本知识,操作系统基本知识,甚至还包括网络与数据库的基本知识和基本技能。

下面是我为某国际知名跨国公司出的C语言笔试题,不知道读者朋友对这8道题有什么想法呢?很遗憾的是当时来参加笔试的朋友,很少有答对一半以上的。

个人认为,设置笔试环节是恰当的。它往往能比项目面试具有更大的区分度。因此,读者朋友们应该在平时注重基础的学习,注重编程知识和技能的积累。并适当接触一些笔试题。

1. tell the difference among NULL, 0, \0

2. what's C Language calling convention, and try to explain them

3. what's the result of the following code:

int a, b;
a = a^b;
b = a^b;
a = a^b;

int x;
x&(x-1);
4. what's the max value of rptr of the following code:
unsigned rptr = 0;
while(1)
{
    rptr++;
    rptr&=0x00ff;
}
5. int a[10][20]; what's the result of a + 1 and &a+1
6. what's the result of the following code under the little-endian platform and why?
#include
int main()
{
    int a[5] = {1, 2, 3, 4, 5 };
    int *ptr1 = (int *)(&a +1);
    int *ptr2 = (int *)((int)a + 1);
    printf("%x,%x", ptr[-1], *ptr2);
    return 0;
}
7. find the max and min value of an array with O(n)
8. delete one word in a string with high performance

面试

求职过程中的最重要环节开始了,那就是面试。当我们得到了这个面试机会,我们应该值得庆幸。在众里挑一的激烈职场竞争环境下,我们能够获得面试机会,说明企业已经对我们感兴趣,并给了我们有机会成为其公司一员的机会。

在庆幸的同时我们应该保持清醒的头脑,八字还没一撇呢。面试一般分为3到5轮,有的还多达8到9轮。每一轮稍不注意,也许就被淘汰出局。 面试前必须要花一两天时间来准备。尽管很多朋友已经有了扎实的基础知识和编程经验,但是,面试前的准备是必要的。笔者曾经遇到过一个情况就是,曾经掌握得很好的知识,由于时间隔得较久了,在面试官问话的时候,居然忘记了该部分知识。还有笔者曾经在被面试官问起用过的一个调试器的名字的时候,尽管笔者曾经一度用过这个调试器,而且非常熟练的用它来做反汇编分析,结果在面试现场把它忘记了。 通过笔者的经历,足见面前准备是多么重要。

1. 面前准备

那么面前需要做哪些准备呢?

首先我觉得我们应该把相关的编程语言的相关知识复习一下。无论你面的是C/C++职位,还是Java职位,应该复习其中的重点和难点。比如C的指针,C++的多态机制等。还应该复习一下你申请职位要求的相关技术的基本知识。比如你要是申请的Linux的内核开发,那么你就应该复习Linux操作系统的原理和内核知识。你要是申请网络开发,你就应该复习网络协议模型,网络堆栈,TCP链接建立等。

其次是要复习平时做的笔记积累的相关经验。好记性不如烂笔头。一个渴望进步的程序员都会有一个笔记本(不是笔记本电脑),用来记录他在实际编程过程中所学习到的知识和技能。因此,在面试前应该打开自己的笔记本,一页页的过一遍,让曾经陌生了的知识再巩固一遍。

紧接着,要把自己做过的重要项目重新梳理一遍。对项目中的算法,原理,使用技术,流程重新做一个总结。简历中的项目,是面试的时候很多考官必问之处。因此,你必须对自己的项目了如指掌,才能对答如流。而有的项目可能做得比较久了,你也可能忘记了。所以,在面试前重新温习一下是必要的。

如果是面试外企,你还得准备一个简短的英语自我介绍。这个自我介绍,是面试中必定包含的环节。

此外,你还可以通过搜索引擎搜索一下该企业的别人总结并放在网上的一些面试环节和面试经验。对你来说,可以做到知己知彼,百战不殆。

2. 项目面试

项目面试就是指面官针对简历中的项目向应聘者提出问题,以考查应聘者在项目中的开发能力和解决问题的能力。

项目面试是一般公司都很重视的环节,都会紧追你所列出的项目问个不停。因此,我们已经指出,在面试前读者朋友们应该把自己列在简历中的项目好好复习一下,最好能画出项目算法的流程图。另外,在项目中使用的技术点也要有好的全面的总结,切忌摸棱两可,一知半解。

此外还应该对项目中存在的问题,比如算法的性能,算法的健壮性,算法的不足都要做到心中有数,并想好解释这些不足和问题的理由。

为了在项目面试的过程中能够达到更好的效果,建议在简历的时候把重要的项目和有把握的项目写在前面。不重要的项目和参与得少不是很有把握的项目应该避免列在简历中。

3. 技术面试

技术面试就是指对应聘者的编程技能进行深入考查,涉及编程语言的重点和难点以及底层机制的考查,更重要的一点是对应聘者编程能力的考查,主要即为算法设计与优化。

有的公司重视项目面试,有的公司重视技术面试。而个人更觉得技术面试有更大的区分度。考查的是程序员的共性,即程序基础知识的掌握和算法设计与优化能力。

一些知名大公司,比如微软,甚至只进行技术面试,重点考查应聘者的算法设计能力,而对你简历中的项目兴趣并不是很大,也很少问你关于项目的问题。面试官一走上来,就给你一道算法设计题,而且尤其是字符串算法设计是微软最爱考查的。当应聘者给出了算法后,面试官又会进一步问到:有没有更优的方案?如何设计测试案例来测试你所设计的算法?

4. 英语介绍

遇到英语面试,各位不要紧张。毕竟英语不是对程序员考查的重点。根据本人经验,初中英语水平就可以应付一些简单的英语面试。

常见的英语面试可以分为:

1)个人自我介绍。在外企面试的时候,一段英语的自我介绍几乎不可避免。建议大家在面试前准备一份简短的自我介绍。下面是一个自我介绍的例子:

My name is Zhou XX. I am now woking at Sun Microsystems. I have three years work expierence. I am good at C/C++ language. I graduated from Institute of Software, Chinese academy of sciences with a master degree. I feel honored to be here for a face-to-face interview.

由于我们的母语不是英语,所以在说的时候不要担心出错,也提倡使用简单句,因为简单句不但使用简单,还可以减少出错的可能。

2)技术面试官是一个老外。这个也没什么大不了的。尽量与之沟通,只要你有初中英语水平,我认为与他沟通就没有问题。说话的时候尽量用简单的句子。不明白的地方用疑问句问。对,就是疑问句。如何造疑问句可是我们初中英语老师教我们的哦。

3)最后面试的老大是个老外。也就是说,你的技术面也过了,HR面也过了,最后需要见一下老大,而这个老大是个老外。此时很少涉及技术问题了。因此你们也就是聊聊家常。所以要放轻松心情,你甚至可以自己主动找一些轻松的话题。记得曾经一个老外在这个环节面我。面到最后,老外问我,你还有什么问题要问的吗?我就问了俩问题:1. Where are you from? 2. Do you like Sichuan hot food?老外听见这两个问题,就兴致勃勃的说起来。到最后甚至要求来公司之后,让我请他吃四川菜。哈哈。这不就告诉我,我已经被录取了吗?

此外,我觉得作为一个程序员,英语还是非常重要的,因为很多技术资料都是用英语发表的,你必须具备阅读这些英语资料的能力。在外企里面,我们还随时有可能和外国同事交流。比如笔者在Sun时,为了做一个大项目,每个星期都和美国洛杉矶的同事召开电话会议。笔者还曾受邀前往美国加州为那边的美国同事做一个项目方面的技术报告。这些都离不开英语。所以建议朋友们在平时可以多看自己相关领域的英语资料,并注重提高自己的英语口语能力。

5. HR面试

通过了技术面试,那么很高兴你已经完成了面试过程中最重要和最关键的环节。接下来的是HR的面试。一般来说,HR的面试不涉及技术问题。但是HR关心下列几个问题:

1)为什么要离开现在的公司?

这个问题是在间接的想了解你在上家公司的工作表现情况。尤其是那些换工作比较频繁的朋友们一定要仔细考虑一下自己换工作的原因。从我们内心来说,常见的原因包括为了更好的发展,待在原公司发展潜力有限。或者为了更好的待遇。待在原来的公司,薪水的提升空间有限,导致自己穷则思变。这些理由都是合情合理的。

但是HR问这个问题,其意图有二:一是深入了解你申请新工作的内在动因,是嫌过去的工资低?还是本人能力差、表现不好而让人辞退?还是生性好动,老是这山望着那山高,哪儿都呆不住、呆不长?等等。而这些恰恰是所有用人单位最讨厌的地方。二是考查该人的工作态度和应变能力。一般来说,企业和HR很忌讳你在上个公司因为与同事和领导不和而辞职。或者因为自己表现不佳而被辞退。因此回答这个问题的策略:

首先这类问题都是非常敏感的话题,答问时宜慎重思考、从容作答。在你被问及为什么"跳槽"时,不宜强调的理由有:

(a)市场不景气,是随大流被辞退的;
(b)跟原单位的领导不和;
(c)想多挣钱;
(d)想找离家近点的地方,等等。这类回答易使用人单位觉得你不是最好的职工,弄不好你会故伎重演,所以要小心对待。

比较合理的理由:

(a)能实现个人的抱负;
(b)有更大的机会获得提升和发展;
(c)欣闻贵公司要扩展业务,想施展个人的才能以报效社会,等等

1) 期望的待遇是多少?

HR会询问你现在的待遇情况,以及你的期望薪水。我们可以如实的说出现在的薪水待遇,因为很多企业会有一个背景调查或者要求你开出上个工司的收入证明。我们可以告诉对方,目前挣多少并不重要,重要的是我的能力是不是你所需要的,而且我也相信薪水范围是公正的。而对于期望的薪水,则根据我们的能力和对方公司的实力。一般来说,低于现在薪水20%的涨幅,就不具有竞争力。因此我们一般要求涨幅要达到现在20%以上。除非我们确实希望换工作,而且对方的公司确实有吸引自己的地方。比如发展潜力比现在的大,从事的工作岗位和职位方向有很广的应用前景,方便以后再换工作也不愁找不到下家,或者处于转行的考虑。

一般HR会尽量的压低你的薪水,而对你大谈特谈这个公司是多么好,福利是多么完善。我们也可以告诉HR,自己具备什么样的能力,因此要求什么样的待遇。这是对自己价值和公司对自己重视程度的体现。

笔者非常幸运的是在第一次换工作后,薪水的涨幅达到了200%。当时S公司的HR打电话给我谈待遇,问我期望是多少?我说12000RMB/月。HR问我,你为什么要这么高?我说现在物价这么高,12000RMB/月并不高,而且干IT的这个行情在这里,我也自信自己的能力能达到这个数。结果,HR打电话给我确认待遇时,居然给的数高于了这个数字好几千。笔者很庆幸自己在第一个工作里学到了很多东西,也全靠自己在第一个工作之间不断的努力学习和提高,厚积薄发,才能这么顺利的达到了如此高的涨幅。当然也非常感谢S公司对工程师价值的看重,对方能开出比自己要求高的待遇,这还是我遇到的第一次。

而对于应届生的朋友们,待遇的谈判一般没有太大的变动。幅度也不会太大。对于各个企业的应届生薪水情况,建议搜索各界毕业生薪酬水平调查。这几年年年都有人把这些企业的薪水待遇调查并做了一个统计公布在网上,而且准确率很高。

谈了上面两个问题,HR还会在谈话的过程中暗中考查你这个人的性格和态度。因此希望朋友们在与HR对话过程中,态度诚恳,不卑不亢,争取给HR留下一个好的印象。

6. 总监面试

总监面试一般是最后一面了。而且总监面试也不会考查具体的技术问题(微软公司可能会例外,因为笔者曾经经历过在最后一轮还有两道编程题)。他可能会关心你做的项目,会要求你介绍下简历上他关心的一个项目。总监常常会问的问题:

1)你有哪些优点?
2)你有哪些缺点?
3)你期望的待遇是多少,如果我给你的薪水比你现在的少你来吗?

大家在面试之前,应该好好想一想自己究竟有哪些优点,哪些缺点。当然,优点应该是你要介绍的重点,这也是你展示自己的一个很好的机会,所以在介绍优点的时候不要谦虚,当然更不要浮夸,而是不卑不亢,如实的说出自己的优点,比如你的算法很好,比如你动手能力强,学习能力强,比如你能够很快的适应一个新的项目的开发,比如你能够承受很大的工作压力并能够把一些复杂的困难的任务很出色的完成等等;而对于缺点,我们可以诚恳的说出来,点到为止,并希望在以后的工作中能够克服。当然我们不能说自己没缺点,也不能把那些明显的优点说成缺点,但更不能挑严重影响所应聘工作的缺点,或者说令人不放心、不舒服的缺点。可以说出一些对于所应聘工作“无关紧要”的缺点,甚至是一些表面上看是缺点,从工作的角度看却是优点的缺点。

至于第3个问题,薪水待遇我们可以自信的提出来,而如果对方说出给你的薪水比现在少,那么你应该态度鲜明不假思索的表达出自己的观点,那就是:不能接受薪水比现在低。至少你要告诉他,如果开出的薪水比现在低,你会更加慎重的考虑和选择。所谓人往高处走,水往低处流。如果对方给的薪水比现在低,这个公司就根本没有承认你的价值。实际上,总监这么问你,也很可能是在考查你是否自信,是否有底气。如果你不假思索的回答能接受,一是自降身价,二是让对方认为你不自信,因此会怀疑你是否有出色的工作能力,你是不是在原来那个公司待不下去要被裁员,走投无路了才被迫接受这个条件。因此这次面试没准就功亏一篑。实际上,既然薪水比我们现在的还低,还有什么理由值得我们换工作呢?除非对方确实有吸引你的地方,比如更大的发展潜力,能学到更多的东西。


看文字不过瘾?点击我,进入周哥教IT视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注