iOS面试问题
准备技术方面的面试:
在直接切入问题之前,我们先讨论下一些基本的要领来确保你的技术面试尽可能顺利进行。
为每个可能出现的问题准备好答案是不可能的。所以需要更加关注基础方面的内容。确保你对Objective-C 2.0的特性都非常熟悉。可以猜的到会有一些关于通知(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的人更可怕。(译者注:了解更多 method swizzling)
假设有三个对象,一个父类的父类,一个父类和一个子类。父类的父类持有父类的引用(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越多,你越有可能更快的开发出更稳健的代码。所以要坚持练习和学习!
该何去何从?
总结一下:
请熟练掌握计算机语言的基础知识,这样可以让你帮助你在面试中放松自己。在面试中,谈论你要应聘的公司跟公司旗下的产品。始终保持面试答案简明扼要、直奔主题。
在做编码工作的时候,保持头脑的快速运转。你完成任务的速度会决定项目的成败。如果你能更快速的编写好优秀的代码,那你就更有价值,你更有价值,公司就更愿意给你更多的薪水。
Ray 和我都希望你喜欢这个系列的文章!如果你喜欢看更多同类型的文章 – 比如说讨论作为一个iOS开发者你要如何提升你的技能,怎样找到iOS的工作,或者作为iOS开发者你应该期望自己拿多少薪水。如果你喜欢看到这些内容,请让我们知道哦。
另外说一句,你知道我上面提出的那些iOS面试问题的答案么?如果知道的话,加入我们的论坛讨论组,对比下你的答案!