面试题中有一些一般性的问题,通常是会问到的。面试iOS应聘者时,切入点很重要,不同的切入点会导致不同的结果,没有找到合适的切入点也无法对应聘者有一个全面的了解。所以下面的面试问题更多的是提供方向,没有固定的答案,而且可以根据应聘者的回应引出更多有意思深层次的讨论。
注意:以下问题的参考答案均为笔者所答,不代表正确,问题答案因人而异,请根据自己的实际情况回答,若认为不合理,请在评论中指出。下面所有的参考答案,都是笔者站在面试官的角度来分析的,不同的面试官也会不一样。笔者面试过一些人,一问就可以知道对方的底子如何了,虽然如此,一代表参考答案是每个面试官想要的。
自我介绍时,一定要简洁明了,不要长篇大论。以我个人而言,最不喜欢自我介绍说了一大堆,最后连她/他叫什么名字都没记住。
自我介绍时,突出重点,说话慢一些,在关键点声音大一点。本人回答时,就简单地说: 我叫某某某,做 ios
X年了,曾在XX公司担任过XX职务,在YY公司担任过XX职务,主要负责ZZ工作。业余喜欢做NN(要说积极点的),擅长LL(把自己的特长说明白)等。
对于这个问题,面试官肯定知道作为求职者,这两天肯定是在忙于找工作、面试。那么,面试官问出这样的问题的目的是什么?如果我是面试官,我最想了解的是这两天你为此次面试准备了什么而是告诉面试官这两天学习了某一方面的知识。
这两天为了准备面试,整理了以前所做过的一些项目的笔记,回头看了看以前的工作日志。一来是整理一些在工作中经常遇到的坑,比如cell重用问题、ios6适配问题等;二来是回头告别过去的自己,在思想上、技术上迎来全新的自我;三来定位自己下一个目标:往架构师方向深入研究。
这个问题的关键是 酷 和 挑战 。其实这里所说的酷对应于开发中的动画,而挑战则对应于开发中的冲刺。对于笔者而言,其实并没有做过特别酷的项目,但是做过有挑战性的项目。但是没有做过并不是就不用回答,面试官想看到的是你的学习能力、应用能力以及解决问题的能力,而不是一句没做过或者没什么挑战性这样的话语。
我之前所负责的项目大多是电商项目,因此并不会特别酷,但是业务比较多,很有技术挑战性。不过,平时我也深入研究过ios核心动画相关知识,对于常用的动画是很熟悉的。在我看来,用户体验并不是所谓的酷,而是简单、方便且明了。我很在意用户体验问题,在开发中会不断地站在用户的角度地问自己用户讨厌什么、喜欢什么和怎样才能让用户感觉容易上手且使用简单等问题。比如,我会很在意网络状态的变化给用户的提示、请求网络时右上角的转圈圈是否开启、滚动cell时是否有卡顿的问题等。
我待过几家公司,从一个人开发到带领团队,从小公司到大公司,因此对于不同的公司对项目的要求完全不一样。对于大公司,一般项目管理机制相对比较完善,而且会有比较多经验丰富的技术VP,因此对于工作的要求比较高,对于用户的体验及反馈会非常地关注;而对于一些小公司,可能就一个人在开发,而这个人往往是菜鸟的多,因此都是东拼西凑而形成的项目,技术不成熟、水平不够,而且还被压着不断加班,因此几乎不会过多关注用户体验问题,当然这样项目也不会有什么好的构架(初创技术合伙人除外)。
现在我所在的公司不算大,也就1000+号人,而做ios也才40号人左右。本公司是按业务方向划分成多个团队,不同团队开发不同的业务需求,因此这样就面临技术架构问题、安全问题、团队开发如何做到互不干扰等问题了。而我在团队中的主要职责是处理团队之间冲突的问题、如何代码模块化以减少团队之外的依赖问题、移动端安全通信问题、项目存储安全问题、公共框架等问题,这一系列都是非常有技术挑战的,需要花费很多非工作时间去调研、写demo、写文档等。
关于动画的学习,笔者的博客有相关专题:iOS Core Animation
询问最近看过的书或者文章,其实通过所回答的书的性质差不多就可以猜出当前状态下应聘者的技术水平大致处于什么样的水准了。下面的参考答案是笔者的常态。
最近在看 《iOS应用逆向工程》 、 《The Swift Programming Language》 。不过本人更喜欢的是阅读博客文章和官方文档,虽然官方文档是英文的,阅读起来相对要费劲一些,但是一方面可以提高英文阅读能力,另一方面英文原版表达的语义才是最准确的,其他翻译过来的文章会有一些变味之处。
这样的话题在很多社区都出现过,其实问这样的问题只是想知道应聘者的态度而已。通过应聘者的回答,一方面可初步了解应聘者对编程的认知程度,另一方面可从应聘者口出得出编程对于应聘者而言是什么样的态度。下面是结合笔者的事迹写下的参考答案,仅供参考。
说到这个问题,我曾经也问过自己为什么要学习编程。回想当年高考结果出来的时候,需要选择学校和专业的时候是很迷茫的,不知上大学应该学点什么。后来,我选择了计算机科学与技术专业,并为了这个专业而选择学校。由于高考考得不好,虽然超过一本线,但是高不成低不就,很多高校的计算机专业要求总分达到560(当时一本线是502分)左右才能稳拿到这个专业,而我才考了526分,想想计算机专业很强的高校是很难进的。于是选择了从广西到沈阳这么遥远的地方上学,竟然是为了计算机专业,现在回想起来还自己偷笑。
在大学的时候,大一天天在图书馆提前学习编程,因为动手能力突出,到大二的时候有好多教计算机的老师提前知道了这样的我,感谢他们的认可,在大学这几年,是他们引导我如何编程实战。大学的时候做过很多PC端的软件(.net开发的)、给老师做过教程网站(ASP.net开发的)、参加学习的ACM训练等等,一切的一切,都要感谢那些教导我的恩师们。
后来通过学长了解到未来就业的一些动向,了解到毕业后如何找工作,学习了iOS开发,于是越来越爱她了。如果非要说编程的乐趣在哪里,我想说在讨论技术的时候就像和同学、朋友一起玩LOL的时候;在解决掉一个别人解决不了的bug的时候,那是一种想要向全世界大声说:YES,I Can;当我们与技术总监并肩作战,一起为了项目上线熬夜,总监为我们买夜宵一起吃的时候,那就是兄弟情谊,那会有种相见恨晚的感觉。
这样的问题通过应聘者的分析,可以知道应聘者的功底如何。很多人的回答会是很简单的,没有从多方面去分析。这样的问题也是很有意义的,在项目开发中所产生的bug,有的时候会出现这样的情况,而代码量比较大且业务比较复杂时,通过其他工具并不能分析出来是什么bug,但是我们却可以根据出现的频率推测。笔者把这个问题当作测试部反馈过来的bug描述问题来分析一下。
从问题描述可知,bug不会必现的,因此无法直接定位出错之处。从以下角度出现来分析可能出错之处:
人最大的敌人不是别人,而是自己。战胜自己,才是最大的胜利。很多人不清楚自己的优点是什么,甚至很多朋友喜欢说我最大的优点是没有缺点。如果是对面试官说这一句话,那么你可能被pass掉了。
我也不清楚我最大的优点是什么,但是我知道我有很多优点。
就说这么多吧!(因为面试高级人员通常会交谈3个小时左右,所以尽可能地说吧,不要害怕时间过长)
github上的开源项目可以体现应聘者的水平以及对编程的热爱程度。一个不足够热爱编程的人,业余时间是不会花在编程上的,因此更不会有什么开源项目了。
这里我的开源库的地址 标哥的GITHUB ,里面除了一些开源库之外,还有很多的demo,每个demo都有对应的博客文章讲解,那都是我感觉学习的成果。
我在GITHUB上发布过很多开源代码,也提供了支持cocoapods的开源项目,现在也有不少人在使用,当然我也会一直维护着,不过我并没有参与过其他人发起的开源项目。
通过应聘者回答所遇到过的技术挑战,其实从侧面就可以看出这个人的水平如何了。如果回答的技术挑战是个简单的问题,而在应聘者这里却是技术挑战,那么就可以知道这水平是初级的。然后应聘者针对这个技术挑战所给出的解决方案也可以看出面对技术挑战,可以看出应聘者处理问题的能力。
最近公司项目中的用户账号出现被盗现象,原因是通信安全问题处理不好。因为公司的项目已经是好几年的老项目了,包括服务端的接口好多是老接口,原来是没有处理任何加密的,因此很容易被盗取账号。现在我们的技术VP要求针对这个问题,做一个版本。因为主动接受挑战,所以这个重任落在了我的身上,由我来牵头做好这个需求。
这真的是一个很有挑战性的技术项目。步骤如下:
为什么要这么麻烦?因为我们既要兼容以前的所有版本,又要保证技术安全,那就不会自己就能说了算的,而且也不仅仅是客户端的问题。
通过回答这个问题,一方面可以看出这个应聘者在iOS开发领域的深入程度。如果只知道Xcode,Cocoapods,说明是初级或者根本不愿意在业余时间花费精力去扩展。
常用的iOS开发工具有:
这个问题不会回答也没有关系,因为很多老项目是不使用CocoaPods的,因此不一定会了解。 回答说使用过Cocoapods写过demo,但是不太懂工作原理是没有关系的。因为在我看到这个问题之前,我也没有深入了解过其工作原理,只是熟悉如何使用而已。
阅读关于 Cocoapods第三方库管理依赖工具 如何使用。
关于其原理,大家百度一下或者谷歌一下吧!因为笔者对其工作原理也不会很清楚,只知道它会为我们创建一个工作区间,然后将所有在cocoapods中的引入的第三方库以libPods.a这样的方式引入到我们的工程中,这样就可以直接访问第三方库了。但是,更具体的细节就不了解了,大家想要深入了解的话, 还得找谷歌或者百度。
关于这个版本控制工具的工作原理,其实也就是对这此命令的操作而已。
最常用的版本控制工具有SourceTree(GIT)和CornerStone(SVN):
既然是技术,那么就要说明是什么技术,至于为什么想要掌握,当然是想要在技术上更上一层楼。
我现在一直在研究runtime相关知识。掌握runtime相关技术,可以做很多正常状态下做不到的事、可以让做一些自动化处理工作、解决代码依赖问题等。目前已经对runtime中的成员变量、属性、消息转发、Swizzling等可以熟练使用。关于runtime专题,大家可以阅读我的博客专题: iOS Runtime相关知识点
这个就是工作经验的问题了。Instruments工具里面有很多个选项,没有必要每个都答,其实笔者也只用过里面的几个而已。
这个问题看起来很笼统,但又一针见血。通过应聘者的回答,可很直观地看出这个应聘者的处理bug的能力,以及其解决问题的思维。
Bug分为测试中的Bug和线上的Bug:
对于开发中出现的崩溃或者数据显示不正常,那就需要根据经验或者相关工具来检测可能出错之处。当然,团队内沟通解决是最好的。
项目中使用了很多的设计模式,我相信面试官最好听到的不仅仅是设计模式的名字,更想听到的是这些设计模式在项目中如何应用。因此,笔者认为这个问题隐式地说明了应该回答设计模式及其在项目中的应用。
就说这么多吧,还有很多的设计模式,不过其它并不是那么常用。
单例在项目中的是必不可少的,它可以使我们全局都可共享我们的数据。这只是简单的问题,大家根据自己的情况回答。
dispatch_once
来使用,保证单例对象只会被创建一次。如果不小心销毁了单例,再调用单例生成方法是不会再创建的。 单例确实给我们带来的便利,但是它也会有代价的。单例一旦创建,整个App使用过程都不会释放,这会占用内存,因此不可滥用单例。
我相信很多人的回答是内存管理的黄金法则,其实如果我是面试官,我想要的答案不是这样的。我希望的回答是工作中如何处理内存管理的。
_testId
这样的,很多人都没有使用弱引用,导致内存得不到释放。 开发过 App
,如果回答说没有使用过第三方库,那么这个人一定是刚入门。如果回答者能够说出很多有名的第三方库,并且能说明使用场景,那么可以突出这个面试者的知识面还是很广的,这是可以加分的。
关于常用的第三方库,笔者整理了一下自己常用的库,但并不是全部: http://www.henishuo.com/ios-thirdparty/
对GCD熟悉吗?iOS中实现多线程有哪些方式?与这些问题一样,都是考查多线程的知识。
关于GCD,请阅读:GCD由浅入深学习
关于多线程NSOperation,请阅读: iOS多线程NSOperation/Queue
部分问题来源于github上,笔者也是在看到之后,花时间回答了一下,大家可以参考问题,但是无参考答案: https://github.com/lzyy/iOS-Developer-Interview-Questions
还有一部分是笔者提的问题!!!
所有参考答案都是笔者亲自一字一句敲出来的,都是根据笔者的情况而写的参考答案,不具有代表性,仅供参考。若有错误,请大家在评论中指出,谢谢!
如果在使用过程中遇到问题,或者想要与我交流,可加入有问必答 QQ群: 324400294
关注微信公众号: iOSDevShares
关注新浪微博账号:标哥Jacky
如果您觉得文章对您很有帮助,希望得到您的支持。您的捐肋将会给予我最大的鼓励,感谢您的支持!
支付宝捐助 | 微信捐助 |
---|---|