文/Richard H.B. Sun
真正的面霸是能在自己有兴趣的职位竞争中取得胜利的人,而不是能够获得大量面试机会但却无法得到任何职位的人。作为打工者,转换工作是无法避免的,而面试通常也是更换工作必须经过的一步。作为经常在不同公司提供咨询服务的咨询师,经历面试可说是家常便饭。我在最近一年中更换了三个不同的工作,有不少被烧烤(beinggrilled)的经历,外加最近为我们小组面试应聘者,我基本上熟悉了面试游戏的里里外外。这次我来谈谈IT职位面试中需要注意的地方,帮助你获得想要的职位。
你是否适合这项工作?
招聘者对你进行面试的目的就是要考验你是否胜任这个职位。你在进入公司大门进行面对面的面试之前,就必须回答这个问题“ 我是否合适这份工作?”。最近我在面试这些应聘者时,通过一定的交谈,发现这些人都不适合我们张贴的工作职位,双方都浪费了时间。
我们最先面试的是一个中年黑人工程师,他在软件测试方面作了至少十二年,大概有些C/C++有关程序设计经验,我们问他“你使用C#多久了?”他回答说“至少四年”。但进一步交流后,我们发现他根本不懂C#中最基本的概念,这样的能力既不能胜任开发,更不能胜任测试。后来我问了他一些有关工程管理、测试管理方面的问题,他只能肤浅地谈谈管理概念,无法更深入地解释管理中的问题和解决方案。这样的人显然是无法胜任团队领导职位的。
第二个应聘者是韩国女性,有十八年的开发经验,有不少项目管理和项目开发的经历。我和另外一个面试者与这位应聘者进行了长达一个小时的愉快会谈,最后我的感觉是她的能力也不够胜任测试工程师的职位。我的理由是这样的:首先,她有十八年的开发经历,但是我感觉不出有什么高超之处;然后是感觉她不够诚实,在交谈之初她就拿出了一个自己所经历的程序缺陷发现和根源查询,我怎么听都觉得她所描述的可能不是她所经历的,有点作假之嫌;另外她做了这么久的开发,我实在想听听她在这么多年中所遇到的其他高深问题的解决方案,可她再也没有提到。这让我如何评判她的技术能力?最后总结一下这位应聘者最终失败的原因:她不停地强调工作稳定性和公司的培训机制,那么为何不提一提自己能为公司做些什么贡献来争取工作稳定性和公司的免费培训呢?肯尼迪总统说过“Ask not what yourcountry can do for you; ask what you cando for your country.”,这正是一个公司想要看到的,员工必须为公司做出贡献,而一个规模完善,体制健全公司则不会亏待努力贡献的员工。她做了这么久的开发,一点测试经验都没有,虽然口口声声说自己可以试试测试,但是作为面试方,我们需要的是至少有一点经验的测试工程师,而不是职业倾向已经定型的开发者。
把自己变成专家
我看到网上说你要读XX本书,要什么都精通,你才能变成专业人士。其实这种想法对面试者来说行不通,在短时间内你无法迅速精通你没有使用过的技术。那如何才能在短时间内把自己变成一个专业人士呢?我认为最有效的方法是在工作之余你就要收集面试中可能要问到的问题。目前我所知道的是网上有至少两百道与C#有关的面试题,在找工作之前就要开始准备这些题目的答案。我还发现像SCJP 认证这样的考题练习也是很有用的,一般的入门级编程语言教程只能帮你通过一些过于简单的面试题目,而要想获得高收入,得到被人尊敬的工作,你就必须知道如何回答这些有点难度的面试题目。如果你是Java程序员,你就必须知道如何回答那些SCJP 认证中会见到的问题;如果你是C#程序员,你就必须懂得如何回答MCP 认证中的会见到的问题。举个例子:
class MyTest
{
public static void main(string[] argv)
{
int x = 32;
Int32 x1 = x;
Object intObj = x1;
x1 = intObj;
x = x1;
}
}
这里面有两行会造成编译失败,它们是哪两行?作为专业人士,你应该能告诉我,这个问题是和C# 中的Boxing和Unboxing 有关的问题,就是原始数据类型(Primitive Type)和参照数据类型(Reference Type)相互转换(ImplicitConversion vs. Explicit Cast)的问题,在这样的思考下你就能知道问题在哪里。在解决问题的时候,你要大声和面试人交流你的理解以及是看出其中的问题的。这样你虽然不能全对,但至少能一半对,同时让人知道你不是不会交流的工程人员。
如果你要应聘高级职位,比如构架师,那就应该将自己的能力转换到系统设计的理解,而不是简单地知道编程语言的运用。语言是很容易淘汰的技术,懂得如何设计,如何测试设计,这才是高级人员必须具备的能力。应聘这样的职位,既要掌握基本的能力,如算法、数据结构、系统分析等,也要掌握设计原理,如设计模式及掌握某些相关领域的特殊知识,如数据库设计、测试方法等。这些理论性的东西看似没用,其实不然,因为它们不会很快过时,它们广泛应用于高层设计中,精通它们,基本就可以获得高薪职位,从而脱离低级的程序农民工境况。
那么面试者一般都问些什么问题呢?我最常问的是,Adaptor Pattern是用来解决什么样的设计问题?为什么要使用设计模式?请解释Cohesion和Coupling 的区别?要是碰到研究数据库或者“精通ADO.NET ”的应聘者,则会叫他解释ADO.NET 和ADO的区别?列举数个使用ADO.NET 胜于ADO的好处?或是让他给出两个例子来解释如何使用ADO.NET和ADO,然后再让他列举ADO.NET 胜于ADO 的好处等。
知己知彼,百战不殆
到这里,你应该明白了面试这场游戏的真正意义,虽然不像写程序,但是面试和写程序一样是解决问题。而解决问题的第一步就是了解你所要面对的问题,然后是侦查,你必须想方设法了解你所应聘的职位。如果你是个咨询师,这些信息自然会由对方公司的人事部门和你的联系人进行沟通,如果你的联系人能力很强,他就能够从对方那里获得尽可能多的信息。从这些信息里你必须分析对方所期望的员工素质,然后就要制定作战战术,这个战术无非就是在面试中展示你所提供的价值是对方想要得到的。
接下来是找出你所拥有的技术能力和不足之处。很多人希望自己能够掌握各种各样的语言和技术,我可以直接告诉你,这种想法太理想化,根本无法在短期内实现。一个人有自己的喜好和职业倾向,就连每个人对所用的语言和技术的理解都有基本上的差别,比如我,喜欢用C++,但也喜欢C#与Java,这三种我都懂很多,虽然还算不上专家,但是我极不喜欢Database和Webpage 设计。所以我知道不到万不得已不去接触任何涉及我不喜欢的技术的职业。我这样的选择只是运用一种千年前的战术——扬长避短。如果我和那些精通Database/Webpage设计的应聘者争夺Database/Webpage设计,结果肯定是输。而对于测试,特别是自动化测试,或使用C++/C#/Java,甚至一些和微软的技术有关的职业,那些Database 和Webpage设计的应聘者肯定不是我的对手。
制订战术的第三步是了解招聘者会问的问题,这个你可以直接向对方人事部门询问,不知道对方会问些什么是让你容易丢失应聘工作的基本原因。面试人会有无穷无尽的问题,他们甚至问“我现在正在想一个数字,一到十之间,你说这个数字是什么?”如果你要准备所有的答案来回答这些问题,大脑能承受得了吗?但是你至少要了解面试人一般会在哪些方面问你问题,可以从招聘启事上揣摩,也可以通过电话面试来了解。我所经历的所有电话面试基本都要问两个问题,有没有进入公司复试机会?如果有的话,能不能告诉我复试时需要回答什么样的问题?
我所看到的常见错误中,最常见的一种就是自大。前面我所提到的三个应聘者,都认为自己已经工作了十多年,已经是程序设计界的元老,工作应该是随便给的。事实上技术发展这么快,很多人白天做事,晚上不学习新东西,一种新技术出现之后,随便在工作时用了用就觉得自己“精通”这套技术,慢慢就养成自大的习惯。俗话说“站得高摔得厉害”,这就是自大造成的应聘失败。
以上就是我对程序设计工作面试的一些总结。其实工作面试并不难,成功应聘靠的就是应聘者自己的素质、必胜的决心、正确的自我评估和面试前的热身。
招聘者想要看到的人选也只是能够胜任工作的。应聘者就是要向招聘者展示自己不仅胜任工作,还有多余的经验和能力来为公司做出更多的贡献。知道了这一点,并做好面试前的准备,你就能赢得你想要的工作机会。其他还有许许多多的注意事项,你可以从相关的图书及网络上找到。我做的最差的是行为问题,所以在这里不给你任何建议。祝你好运。
阅读(793) | 评论(0) | 转发(0) |