iOS面试宝典《一》--面前准备


面试官喜欢什么样的人,来自一个面试官的话

一个招人的部门或个人,如何从众多的候选人中挑到真正比较优秀的程序员?

面试是个技术活,其本质上是一次沟通的过程。候选人要在限定的时间和条件内向面试官展现自己的才能,而面试官同样也要在有限的时间和条件内发现候选人是否适合该职位。对于候选人的观察,很多人存在误区,那就是:技术主导,只要技术牛,那就是我要找的人。其实我认为这样是非常不靠谱的,为什么?因为我认为,无论什么行业,作为一个部门负责人或者团队负责人,在选择候选人的时候,应该把德行放在第一位,其次才是技术水平,第三是身体状况和其他因素。下面我就这三点展开来谈一谈。

  • ==第一:德行==

对于一个程序员候选人来说的话,如何评判一个候选人的德行呢?我觉得有以下几点:

==眼神==

注意观察候选人眼神是否飘忽不定,是否总是不敢直视你的眼睛,或者回答问题的时候总是往左右两边瞟。一般来说,眼神是一个人性格的直观表现之一,如果眼神不够沉稳坚定,说明此人不踏实,心境飘忽,很有可能不诚信(比如爱撒谎,不诚实,不讲信用等等)。

==身体语言==

如果一个候选人在跟你聊的过程中,整个人吊儿郎当,身体左摇右晃,一会二郎腿,一会把脚放到大腿上(别怀疑,我真遇到过),那么说明此人一定不沉稳,性格轻佻浮躁,最好谨慎考虑。相反,如果候选人坐姿规矩,谈话间体态得体,自然,不紧张,不做作,那么该候选人应该比较有家教,个人习惯很好,性格比较稳定。

==沟通==

在跟候选人对话时,注意对方的语气语调。如果候选人语速平缓,吐字铿锵,说明此人准备比较充分,不急躁。当遇到一些一时回答不上的问题时,能够保持冷静,集中精神思考,如果实在不会,没有打算糊弄过关或者顾左右而言他,而是直接答复不知道,那么就说明该面试人性格比较沉稳,而且比较诚实,不滑头。甚至你可以故意说错一些细节,看看对方以何种方法给予纠正或者不纠正。你也可以直接故意用错误去质疑对方正确的表述,看看对方的反映,如果对方一下就被点燃了一样蹦起来,或者总打断你说话,说明对方性格比较急躁,这是程序员的大忌。当然此招能少用尽量少用,而且一次足矣,如果老这样,会让候选人觉得面试官不行,而心生鄙视。

==细节==

例如微笑,电话静音或挂掉电话等,素质体现。

  • ==第二:技术==

技术排第二不是说技术不重要,作为一个程序员岗位,技术当然是非常重要的。很多企业喜欢让程序员做卷子作为首面的内容。我认为这是不妥当的,是面试官在偷懒的表现。不是说做卷子不能反映问题,只是这种方式太死板,并不能真正过滤掉不合格的面试者。比如,我其实没有什么技术能力,但是我面试前背了很多书,那么做卷子这一关我有可能可以过,到真正面试的时候才会被拒。所以,做卷子只能过滤那些真正没有技术,而且没有背书的面试者。但是,即便是直接面试,面试官真的碰到这样的面试者,又花的了几分钟就可以判断出来再拒绝呢?所以,我建议,不要做卷子,直接面试,并且分成以下几个内容来考察面试者。

==过往经验==

可以让候选人介绍最近一个项目,并且描述自己的工作内容。首先看看候选人是否能够说得清楚这个项目,比如有哪些模块,每个模块有哪些功能,实现了一个什么业务逻辑,自己负责的这一块的详细业务逻辑又是怎样的,等等,如果连这些都说不清楚,那么基本上可以判断候选人在撒谎。了解了项目之后,可以通过候选人负责的内容进行深入技术提问,候选人说使用了多线程,那么就多线程相关的知识进行提问,但是注意要由浅入深,不要一上来就问一些很难很深的问题。一般来说如果候选人没有撒谎,那么应该来说还是可以回答一些不太难的问题的。

==基础知识==

一定要考察候选人的基础知识。很多候选人在说起自己做过的项目的时候眉飞色舞,一套一套的,甚至满嘴都挂着一些热门的词汇,比如大数据,高并发,云计算,等等。但是一问基础知识就傻眼,最简单的值类型引用类型都不知道有什么本质区别。很多候选人都会辩称,自己会编程,能够实现业务逻辑,为什么还要去背那些概念性的东西,殊不知,那些他们认为没有的概念性的东西,正是我们构筑大厦的根基所在。举个例子,我造一所房子,地基打了10米,你造一所同样的房子,没有地基。我们都造好以后,在风和日丽的时候,看上去一模一样,你会笑话我,"看,我们一样,但是我比你不知道省了多少工序",但是你要知道,并不是每天都会风和日丽,总会遇到狂风暴雨,等到考验真正来临的时候,谁的房子更不容易倾塌呢?

==分类考察==

在面试候选人的时候,最好是分类进行考察,每个类别准备5个问题左右,并且由浅入深。顶尖的互联网公司就那么几个,一般的公司招聘没必要搞那么高大上,两个字,务实!。

  • ==第三:身体状况及其他原因==

为什么把身体状况单独拎出来说呢?因为谁都不想刚招进来的人三天两头的请假看病,面试官在招聘时,一定要注意候选人身体状态,如果有明显的身体状态问题或者不正常,千万要慎重考虑。另外,需要考虑的还有下面的因素:

==候选人是否准备创业==

有些候选人因为首次创业失败,需要找个地方打工解决一下生活问题,一旦缓过劲来,就会离职重新创业,太不稳定。

==之前换工作太频繁==

一般我认为,正常情况下,IT行业换工作频率在2年一次以上是比较正常的,当然后写不正常情况另当别论,例如公司倒闭老板跑路,例如被收购后辞退,等等。但是,如果正常情况下,连续3分以上工作的更换频率在1年以下,那么这种候选人需要谨慎对待。

==其他==

比如提一些无理要求的,期望薪水过高的,完全不尊重人的,等等,这些候选人都要谨慎考虑。


面试的时候要做什么准备,来自一个国外大牛的话

在直接切入问题之前,我们先讨论下一些基本的要领来确保你的技术面试尽可能顺利进行。

为每个可能出现的问题准备好答案是不可能的。所以需要更加关注基础方面的内容。确保你对Objective-C的特性都非常熟悉。可以猜的到会有一些关于通知(messaging),协议(protocols),动态类型(dynamic types),转发(forwarding),分类(categories),posing, method swizzling等方面的问题。面试者想考察你对现有的或者是之前出现的问题了解有多少。花几个小时去 StackOverflow 或国内网站上看下最近经常提问到有关iOS方面的问题会对你有很大帮助。

读一遍Apple’s Objective-C guides,确保你没有任何觉得比较薄弱的主题。像google式问法的那种问题,比如说一个小车需要多少个高尔夫球才能填满(250,000),或是在旧金山有多少扇窗户(大于10亿),现在大部分公司都停止问了。当你要面对这些类型的问题的时候,你的思路比你的答案要更重要,关于这个问题你是如何思考的 - 这才是面试官关心的问题。

==准备好在白板上编码==

如果你是面对面的面试,他们可能希望你在白板上直接编程。确保在你面试之前做了一些练习,因为在一群人面前直接编写代码会非常有压力,没有代码自动补全功能的编码难度远远大于你的想象。

为你在简历上写的熟悉的编程语言做好在白板上写代码的准备。我的一个朋友在面试中被要求在白板上用Erlang来编程,Erlang是他在简历中列出来的编程语言。他得到了那份工作。地球上知道Erlang的仅有三个人,我确定他是其中的一个。

==面试礼节==

如果是进行面对面面试,先询问下公司的着装要求。如果面试官穿短裤T恤,而你穿着西装,这样就会比较尴尬,而且面试官也可能会很不愉快。如果你穿球衣而其他人穿西装的话也会是同样的结果。关于这点,可以事先询问招聘经理,他会很乐意给你一些相关建议。

确保手机调成静音。如果你知道我在面试的时候听到过多少次电话响起的声音,你一定会惊讶的。大多数情况下你都不应该在面试中接电话或者查看下你的手机。如果有一些潜在的紧急情况,例如你的妻子马上要分娩或者是你的丈夫正在做手术,请提前告诉你的招聘经理,这样的话你接电话的行为还可以被接受。

在面试过程中,无论是身体还是精神都需要放轻松。尽量把面试时间定到一段你相对空闲的时间(之后你不会有其他的事情需要做)。如果你把面试定到你目前工作的午休时间,那肯定不会达到最好的效果。有时我甚至需要缩短面试时间就只因为面试者的现任老板需要他去工作! 请避免增加你目前已有的压力。

进行面对面的面试,请早到15分钟左右,但不要太早。对于电话面试,如果是在线会议的话,确保提前两分钟拨号进入。直接打电话来的,确保能按时准备好。

==准备好问题==

在面试的结尾,面试官通常会问你关于公司和工作,你还有哪些问题。请事先准备好你的问题,把你想要问的问题写到纸上。这会表明你对这份工作真的感兴趣而不是仅仅走走过场。很多面试者在这个环节中都不会问任何内容,这让我感到很惊讶。如果你觉得这个工作适合你的话,这是一个了解公司的很好的机会。

==面试题目==

你期待已久的内容到了 - 题目!

我们的技术性面试通常持续1个小时。有一张包含75个问题的表单,刚开始我会从里面随机抽取题目。之后我根据对候选人知识方面的了解,有选择的缩小问题的范围。例如,如果我怀疑候选人哪块儿有薄弱的知识点,我会继续深入的问那块儿内容。

当回答这些问题的时候,尽量使你的答案简明扼要,如果必要的话解释下你的思路。面试官不是因为不知道答案而来问你这些问题的,他们要知道的是你对你所说的内容了解程度有多少。

如果你还不是很了解这些内容的话, 记住学习的过程是极富有乐趣的一个过程!


直接进入正题,这些是技术性面试的一些样例题目。

请解释下method swizzling,并说出你一般什么时候会用到它?- 我喜欢问这个问题因为这属于较为深层次的语法。大多数人都没有使用swizzling的需求(言外之意会用到swizzling的一般开发过一些核心的内容了)。而且通过开发者关于这个问题的回答,我还可以了解他们对复杂代码的执行有多大程度上的约束。一个人如果说他 swizzle所有的代码,那比那些说从来没用过swizzle的人更可怕。

假设有三个对象,一个父类的父类,一个父类和一个子类。父类的父类持有父类的引用(retain),父类持有子类的引用(retain),子类持有父类的引用(retain)。父类的父类释放(release)父类,解释下会发生什么。 -——即使有ARC,我依然喜欢问一些内存相关的问题,这显示了这个人有一定时间的开发经验,而且明白核心的框架是如何运作的。

当一个空指针(nil pointer)调用了一个方法会发生什么?——了解处理基础的Objective-C相关问题是很重要的,有好多次我都听到了错误的回答,这很令我震惊。

为什么retainCount绝对不能用在发布的代码中?请给出两个相对独立的解释。—— 考察这个问题会有两个好处:一是可以确定面试者目前确实没有使用retainCount,并且看看他们是否知道为什么他们不应该使用。

请说明一下你查找或者解决内存泄露的处理过程。这个可以深入了解面试者对内存管理方面的知识,instruments的运用及其调试的处理过程。——有时候我会听到一些可怕的回答:“注释掉部分代码直到内存泄露问题被修复”。

解释下自动回收池(autorelease pool)在程序运行时是如何运作的。 -——这类型的问题已经超出代码基础了,一个程序员只有阅读过一部分开发类书籍才能学到这些内容。这些问题也同样能考察他对程序底层代码运作的了解程度。

当处理属性申明的时候,原子(atomic)跟 非原子(non-atomic)属性有什么区别?-——好多人都不知道这个问题的答案,我又一次震惊了。很多人他们都是看别人是怎么声明的,他们就怎么来声明。类似这种的题目会暴漏出来很多问题。

在C语言中,你如何能用尽可能短的时间来倒转一个字符串?—— 我不大喜欢深入问计算机的核心内容, 但是通过这个问题可以让我了解到他们是如何思考的,同样也可以了解到他们的C语言背景。深入询问时间复杂度(big O notation)也能让我了解面试者的水平。

遍历一个NSArray和一个NSSet,哪一个更快? ——另一个深入的提问。有时候一个类解决了问题并不能代表你就应该用这个类。

解释代码签名(code signing)是如何运作的。 —— 很多候选人都完全不了解代码签名是如何运作的,然后抱怨说他们一直被一些代码签名的一些问题所困扰。

Objective-C中的posing指的是什么? —— Posing是一个Object-C的小众语法特性。像 swizzling那个问题一样,这个问题可以让我了解面试者对语言的深入程度。

列举标准Xcode版本中的6个工具。 —— 通过这个问题我可以大致的了解到面试者会在这些工具上花费多少时间。提示:至少得用10%的写代码的时间来用这些工具。

**copy跟retain有什么区别? **—— 最近好多开发者都开始用ARC了,内存方面的问题就更能反映出一个开发者的知识水平了。

frames跟bounds有哪些区别? -——我不会问很多界面相关 (GUI-type)的问题,我应该问的多一些,不过通过这个问题我差不多能了解到一个开发者做了多少界面工作。

执行如下的代码会发生什么情况?

Ball *ball = [[[[Ball alloc] init] autorelease] autorelease]; 

另一个内存相关的问题,这个问题的答案不能单用会崩溃来回答,我想要知道为什么崩溃,何时会崩溃。

列举5个iOS app的状态。—— 几乎没有人能正确的回答出这个问题,通常我会给出一个例子,诸如后台运行的状态(background state),这样他们就知道我在说的是那块儿内容了。

你认为这次面试能很好的体现出来你作为开发者的能力么?—— 一些人说可以测试的很好,但是有些人不这么认为。我倾向于给面试者一些表达他们自己想法的机会。自信是非常重要的品质,而对应这个问题的回答也能很好的反应出一个人的自信程度。

我在提问这些问题的时候顺带会附加一些问题,类似“为什么会发生这种状况?”或者是“请解释下你的解题思路”。技术性面试的关键取决于面试者对语言跟平台方面了解的程度,这不仅仅包含技术的广度,还有技术的深度。

实际编码的面试

这是我们最重要的面试,这场面试可以直接反映出面试者是否可以胜任工作。我们将提供给面试者一个名为 The Dragon’s Test的app,目前已知这个app有很多问题。然后给面试者一个bug清单,根据面试者解决问题的能力和时间来评定面试者的等级。

我们公司给一些大的企业法人提供iOS开发服务,我们旨在用最快速的转换模式来给客户提供最可靠的结果。所以实际编码的面试是有效评估面试者开发能力的重要面试, 因为它能让我确定在公司盈利的前提下,应该支付给这个面试者多少薪水。对软件面试本身来说,能找出快速解决问题的开发者就是最大的幸事。

在完成细节跟完成时间之间,有一个微妙的平衡点。如果有个人用1/3的时间完成了95%,另一个人用了更多的时间完成了100%的话,那我倾向于选择前者。还有一个秘密可以告诉你,我们也是坚持通过这种实际编码的测试来选择员工主管的。

幸运的是(或者也可以说这是不幸的,取决于你是如何看待这个问题的),准备实际编码的面试的最好的方式就是勤练习。你做的app越多,你越有可能更快的开发出更稳健的代码。所以要坚持练习和学习!

该何去何从?

总结一下:

请熟练掌握计算机语言的基础知识,这样可以让你帮助你在面试中放松自己。在面试中,谈论你要应聘的公司跟公司旗下的产品。始终保持面试答案简明扼要、直奔主题。

在做编码工作的时候,保持头脑的快速运转。你完成任务的速度会决定项目的成败。如果你能更快速的编写好优秀的代码,那你就更有价值,你更有价值,公司就更愿意给你更多的薪水。

你可能感兴趣的:(iOS面试宝典《一》--面前准备)