面试题中有一些一般性的问题,通常是会问到的。面试iOS应聘者时,切入点很重要,不同的切入点会导致不同的结果,没有找到合适的切入点也无法对应聘者有一个全面的了解。所以下面的面试问题更多的是提供方向,没有固定的答案,而且可以根据应聘者的回应引出更多有意思深层次的讨论。
自我介绍
自我介绍时,一定要简洁明了,不要长篇大论。以我个人而言,最不喜欢自我介绍说了一大堆,最后连她/他叫什么名字都没记住。
参考答案:
自我介绍时,突出重点,说话慢一些,在关键点声音大一点。本人回答时,就简单地说:我叫某某某,做iosX年了,曾在XX公司担任过XX职务,在YY公司担任过XX职务,主要负责ZZ工作。业余喜欢做NN(要说积极点的),擅长LL(把自己的特长说明白)等。
最近这两天你有学到什么知识/技能么?
对于这个问题,面试官肯定知道作为求职者,这两天肯定是在忙于找工作、面试。那么,面试官问出这样的问题的目的是什么?如果我是面试官,我最想了解的是这两天你为此次面试准备了什么而不仅仅是告诉面试官这两天学习了某一方面的知识。
这两天为了准备面试,整理了以前所做过的一些项目的笔记,回头看了看以前的工作日志。一来是整理一些在工作中经常遇到的坑,比如cell重用问题、ios6适配问题等;二来是回头告别过去的自己,在思想上、技术上迎来全新的自我;三来定位自己下一个目标:往架构师方向深入研究。
最近有做过比较酷或者比较有挑战的项目么?
这个问题的关键是酷和挑战。其实这里所说的酷对应于开发中的动画,而挑战则对应于开发中的冲刺。对于笔者而言,其实并没有做过特别酷的项目,但是做过有挑战性的项目。但是没有做过并不是就不用回答,面试官想看到的是你的学习能力、应用能力以及解决问题的能力,而不是一句没做过或者没什么挑战性这样的话语。
为什么要学习编程,编程对你而言的乐趣在哪儿?
这样的话题在很多社区都出现过,其实问这样的问题只是想知道应聘者的态度而已。通过应聘者的回答,一方面可初步了解应聘者对编程的认知程度,另一方面可从应聘者口出得出编程对于应聘者而言是什么样的态度。下面是结合笔者的事迹写下的参考答案,仅供参考。
说到这个问题,我曾经也问过自己为什么要学习编程。回想当年高考结果出来的时候,需要选择学校和专业的时候是很迷茫的,不知上大学应该学点什么。后来,我选择了计算机科学与技术专业,并为了这个专业而选择学校。由于高考考得不好,虽然超过一本线,但是高不成低不就,很多高校的计算机专业要求总分达到560(当时一本线是502分)左右才能稳拿到这个专业,而我才考了526分,想想计算机专业很强的高校是很难进的。于是选择了从广西到沈阳这么遥远的地方上学,竟然是为了计算机专业,现在回想起来还自己偷笑。
在大学的时候,大一天天在图书馆提前学习编程,因为动手能力突出,到大二的时候有好多教计算机的老师提前知道了这样的我,感谢他们的认可,在大学这几年,是他们引导我如何编程实战。大学的时候做过很多PC端的软件(.net开发的)、给老师做过教程网站(ASP.net开发的)、参加学习的ACM训练等等,一切的一切,都要感谢那些教导我的恩师们。
后来通过学长了解到未来就业的一些动向,了解到毕业后如何找工作,学习了iOS开发,于是越来越爱她了。如果非要说编程的乐趣在哪里,我想说在讨论技术的时候就像和同学、朋友一起玩LOL的时候;在解决掉一个别人解决不了的bug的时候,那是一种想要向全世界大声说:YES,ICan;当我们与技术总监并肩作战,一起为了项目上线熬夜,总监为我们买夜宵一起吃的时候,那就是兄弟情谊,那会有种相见恨晚的感觉。
如果一个函数10次中有7次正确,3次错误,问题可能出现在哪里?
这样的问题通过应聘者的分析,可以知道应聘者的功底如何。很多人的回答会是很简单的,没有从多方面去分析。这样的问题也是很有意义的,在项目开发中所产生的bug,有的时候会出现这样的情况,而代码量比较大且业务比较复杂时,通过其他工具并不能分析出来是什么bug,但是我们却可以根据出现的频率推测。笔者把这个问题当作测试部反馈过来的bug描述问题来分析一下。
从问题描述可知,bug不会必现的,因此无法直接定位出错之处。从以下角度出现来分析可能出错之处:
自身最大优点是什么,怎么证明?
人最大的敌人不是别人,而是自己。战胜自己,才是最大的胜利。很多人不清楚自己的优点是什么,甚至很多朋友喜欢说我最大的优点是没有缺点。如果是对面试官说这一句话,那么你可能被pass掉了。
我也不清楚我最大的优点是什么,但是我知道我有很多优点。
有没有在GitHub上发布过开源代码,参与过开源项目?
我在GITHUB上发布过很多开源代码,也提供了支持cocoapods的开源项目,现在也有不少人在使用,当然我也会一直维护着,不过我并没有参与过其他人发起的开源项目。
你最近遇到过的一个技术挑战是什么?怎么解决的?
通过应聘者回答所遇到过的技术挑战,其实从侧面就可以看出这个人的水平如何了。如果回答的技术挑战是个简单的问题,而在应聘者这里却是技术挑战,那么就可以知道这水平是初级的。然后应聘者针对这个技术挑战所给出的解决方案也可以看出面对技术挑战,可以看出应聘者处理问题的能力。
最近公司项目中的用户账号出现被盗现象,原因是通信安全问题处理不好。因为公司的项目已经是好几年的老项目了,包括服务端的接口好多是老接口,原来是没有处理任何加密的,因此很容易被盗取账号。现在我们的技术VP要求针对这个问题,做一个版本。因为主动接受挑战,所以这个重任落在了我的身上,由我来牵头做好这个需求。
这真的是一个很有挑战性的技术项目。步骤如下:
为什么要这么麻烦?因为我们既要兼容以前的所有版本,又要保证技术安全,那就不会自己就能说了算的,而且也不仅仅是客户端的问题。
开发常用的工具有哪些?
常用的iOS开发工具有:
熟悉CocoaPods么?能大概讲一下工作原理么?
这个问题不会回答也没有关系,因为很多老项目是不使用CocoaPods的,因此不一定会了解。回答说使用过Cocoapods写过demo,但是不太懂工作原理是没有关系的。因为在我看到这个问题之前,我也没有深入了解过其工作原理,只是熟悉如何使用而已。
关于其原理,大家百度一下或者谷歌一下吧!因为笔者对其工作原理也不会很清楚,只知道它会为我们创建一个工作区间,然后将所有在cocoapods中的引入的第三方库以libPods.a这样的方式引入到我们的工程中,这样就可以直接访问第三方库了。但是,更具体的细节就不了解了,大家想要深入了解的话,还得找谷歌或者百度。
最常用的版本控制工具是什么,能大概讲讲原理么?
关于这个版本控制工具的工作原理,其实也就是对这此命令的操作而已。
最常用的版本控制工具有SourceTree(GIT)和CornerStone(SVN):
今年你最想掌握的一门技术是什么?为什么?目前已经做到了哪个程度?
既然是技术,那么就要说明是什么技术,至于为什么想要掌握,当然是想要在技术上更上一层楼。
你一般是怎么用Instruments的?
这个就是工作经验的问题了。Instruments工具里面有很多个选项,没有必要每个都答,其实笔者也只用过里面的几个而已。
你一般是如何调试Bug的?
这个问题看起来很笼统,但又一针见血。通过应聘者的回答,可很直观地看出这个应聘者的处理bug的能力,以及其解决问题的思维。
Bug分为测试中的Bug和线上的Bug:
你在你的项目中用到了哪些设计模式?
项目中使用了很多的设计模式,我相信面试官最好听到的不仅仅是设计模式的名字,更想听到的是这些设计模式在项目中如何应用。因此,笔者认为这个问题隐式地说明了应该回答设计模式及其在项目中的应用。
就说这么多吧,还有很多的设计模式,不过其它并不是那么常用。
如何实现单例,单例会有什么弊端?
单例在项目中的是必不可少的,它可以使我们全局都可共享我们的数据。这只是简单的问题,大家根据自己的情况回答。
单例确实给我们带来的便利,但是它也会有代价的。单例一旦创建,整个App使用过程都不会释放,这会占用内存,因此不可滥用单例。
iOS是如何管理内存的?
我相信很多人的回答是内存管理的黄金法则,其实如果我是面试官,我想要的答案不是这样的。我希望的回答是工作中如何处理内存管理的。
使用过哪些第三方库?
开发过App,如果回答说没有使用过第三方库,那么这个人一定是刚入门。如果回答者能够说出很多有名的第三方库,并且能说明使用场景,那么可以突出这个面试者的知识面还是很广的,这是可以加分的。
对多线程了解吗?
对GCD熟悉吗?iOS中实现多线程有哪些方式?与这些问题一样,都是考查多线程的知识。
还有一部分是笔者提的问题!!!
写在最后
所有参考答案都是笔者亲自一字一句敲出来的,都是根据笔者的情况而写的参考答案,不具有代表性,仅供参考。