最近在阮一峰的博客上看了两篇关于面试的文章,一篇是【如何面试程序员】,另一篇是【面试时,如何向公司提问?】。看完了之后,我发现自己对面试这件事儿真的是一无所知,我不知道面试官提问题的背后逻辑,不知道在最后的提问环节应该问点什么问题。这两篇文章虽然都是IT行业相关的,但是我觉得其他行业也可以从中学到很多。

下面是这两篇文章的核心内容:

面试时,如何向公司提问

很多人将面试看作一种单向选择,事实上,面试是一种双向选择:不仅是公司挑选你,也是你挑选公司。面试就是为双方提供互相了解的机会,公司在评估你,你也在评估公司。
面试官也知道这一点,所以他们有心理准备,期待你提出问题,并且会做出回答。所以,面试时不要浪费向公司提问的机会。而且,你主动提问,表明你比较重视这个职位,会加深面试官对你的印象,可能会提高面试的成功率。
有一些注意点,你需要知道:

  1. 面试之前,一定要做准备,多了解公司的情况。
  2. 你提出的问题,应该围绕”这份工作是否合适我”这个中心点,其他与应聘关系不大的问题,不宜多问。
  3. 提问的时候,要自然放松,不要害羞,就把它当作普通的聊天。你要表现出对公司的真诚兴趣。
  4. 提问要直接了当,不要绕圈子。提出问题之后,你要保持安静,让面试官多说话。
  5. 面试官回答的时候,你可以做笔记,或者事先询问能不能做。笔记必须简短,你的大部分时间,要用来全神贯注倾听面试官的回答,并与其有眼神的交流。
  6. 面试结束后一周内,最好打一个电话或发一封邮件,了解公司对你的反馈意见。即使面试失败,你不妨也问一下原因,这会有助于你以后的面试。

下面是一些你可以问的典型问题:

问题一:你们为什么要招聘这个职位? Q1: Why are you currently recruiting for this position? 这个问题会使得面试官开始谈论当前的项目,或者谈论前一位离职人员。无论哪种情况,都会让你了解,一些与你最密切相关的公司情况。 问题二:你们的新员工多吗? Q2: Do you have many new staffs? 这个问题起一个过渡作用,使得谈话导向公司内部的情况。但是,它本身也能说明一些问题。如果公司成立已经超过四年,又没有新项目,但是新员工却很多,这往往说明公司文化不是很健康。 问题三:你们公司(团队)目前面临的最大挑战是什么? Q3: What are the biggest challenges your team are facing right now? 如果面试官开始谈论一些具体的技术问题,这很好;如果他的回答是项目时间紧迫,或者需要更多的资金,那你就要小心一点了,公司管理上面可能有问题。 问题四:什么新技术(编程语言)是你们未来希望采用的? Q4: What technologies/languages would you like to see your team adapt to that aren’t currently being utilised? 如果你申请的是技术职位,面试官恰巧又是技术负责人,那么这个问题将会非常合适。你会对公司的技术路线有所了解和准备,一旦入职,就能更好地适应公司的需要。 问题五:在业务方面,有没有什么地方是你们不满意的,未来想要改进的? Q5: Few companies, if any, are 100% satisfied with the way their business is operating. If you could simply flick a switch to fix it, what one thing would you change? 很少有公司,会百分之百满意自身的现状,即使那些状况很良好的公司也是如此。这个问题可以让你对公司管理层的关注重点和担忧之处,有所了解。 问题六:我申请的这个职位,对公司的业务有何影响? Q6: If you struggle to fill the position I have applied for, what impact would that have on the business? 这个问题会让你了解自己在公司的角色,以及你的岗位对公司是否重要。

如何面试程序员

一、提问之前的准备

首先,最重要的是,你自己一开始就应该想清楚:

  1. 需要新员工完成什么样的任务?
  2. 怎样的人能完成这样的任务?
  3. 哪些途径和方法可以发现这样的人?

只有明确这些根本性的问题,才能正确高效地完成面试。

二、提问的原则

  • 每一个面试问题都有明确的目的。你不仅自己了解,还能向其他面试官解释清楚。
  • 多提一些开放性(Open-ended)的问题,而不是那种用Yes/No就可以回答的问题。这样做使你有机会与面试者展开讨论,并且提出后续的问题,尽可能多地了解对方。
  • 不要问宗教、家庭、健康、个人隐私等方面的问题。
  • 不要问太复杂的问题。因为面试者没有太多思考时间,所以无法周全地回答,你也就无从判断他的能力了。

    三、考察专业能力

    为了确认面试者是胜任的,你可以问一些与职位相关的专业方面的问题。(不过通常来说,一次面试不足以看出一个人的专业能力。)
    比如,你的招聘职位是系统管理员,你可以问”如何快速地在50台机器上部署Linux?”(提示:正确答案不是刻录50张安装光盘。)
    另外,你还应该向面试者了解他的过去,因为过去是未来的最好预测依据。不过,提问的重点不要仅仅是他过去的成果,更要关注在当时的环境中,他是如何决策和实施的。

    四、考察综合素质

    因为人是会发展的,所以某种程度上,面试者的综合素质要比他的专业能力更重要。
    所以,具体的技术问题(如何调用API、什么是设计模式、编程语言的语法等等)可以少问一些,更应该关注面试者的事业心、对工作的热情、进取心、自律能力、毅力等方面。
    下面是一些典型问题:

    Why did you get into development?
    你为什么开发软件? How many technical books did you read in the past year?
    去年你读了几本技术书籍? What was your favorite technical book in the past year? What did you learn from it?
    去年你最喜欢的技术书籍是哪本?你从中学到了什么? What websites do you read regularly, related to development?
    平时你经常访问哪些编程类网站? Do you maintain any open-source projects?
    你有自己的开源项目吗? Do you code in your spare-time?
    业余时间你编程吗? Do you love programming, or do you do it for the money?
    对于你来说,编程是一种爱好,还是一种谋生手段? Have you accomplished anything important in your career yet? Do you want to?
    你的职业生涯之中有什么重要的成就?它是你主导的吗? What would make you feel that you have done something important?
    什么事情会让你很有成就感?

五、考察理性思维

某些情况下,你可能需要了解面试者的分析判断能力,看他能否全面地思考问题、客观地评价自己。
那么,你可以依次提出这样三个问题:

What’s your favorite programming language? Why?
你最喜欢的编程语言是哪种?为什么? If you could add one feature to your favorite language, what would it be? Why?
如果允许你为这种语言加一种功能,你会加什么功能?为什么? If you could remove one feature from it, what would it be? Why?
如果允许你取消一种功能,会是什么功能?为什么?

这里的重点是,让面试者从正反两方面评价一件自己熟悉的东西,看看他的思维是否片面。答案无所谓对错,只要面试者有一个明确的立场,能够从正反两方面说出令人信服的理由,就可以了。比如,某个软件的口碑不好,但是面试者说他很喜欢,而且说得出一大堆理由,清楚地解释了这种软件的优点和缺点在哪里,这样就很好。
你还可以把这些问题,套用在其他东西上面,比如操作系统、文字编辑器等等。