都说今年互联网行情很差,作为被大家喊了好几年“iOS开发没人要了”的iOS行情更差。那真实情况是什么样的呢,以我的经历给大家分析下。应某个朋友建议,去掉这一句啊,目前iOS岗位还是挺多的,你可以这么想只要苹果爸爸不倒,iOS开发就不会没人要。但另一方面,招聘方对iOS开发的要求是在不断提高的,我们不能固步自封,满足现状,只有不断学习,不断进步,才能保持自身竞争力。
我的面试的阶段基本都在6月份,准备的阶段则要再往前推个半个月吧。期间约到了不少一二线互联网公司面试机会,前期由于准备不足也错失了一些机会,在之后的面试中不断总结经验,越来越有信心了,最终选择了爱奇艺。整体来看求职情况还算可以,不是很好但也不是很差,其中会带有一定运气成分,所以要换工作的话一定不要裸辞。
这里总结下这段时间的面试经历和一些心得,后面会附上期间遇到的面试题,大家可以尝试作答一下。
求职准备
如果确定了想要换工作就应该为求职做准备了。
知识准备
在确定了换工作的想法之后,我们就应该为面试做准备了。在回顾知识点的时候我建议分类去梳理:OC语法,Runtime,Runloop,多线程,性能优化等,这些是优先级高的内容,其次是网络知识,数据结构与算法等计算机通识知识。
有一本书非常推荐:《Objective-C高级编程》,建议精读。
开源库的话看Runtime(最新为可编译799.1版本)吧,把类的定义,Runloop,weak,Autoreleasepool相关的代码都看下。
网络的知识点可以参考我的那篇:iOS面试备战-网络篇。数据结构与算法,按照类别刷个几十题应该能应付大多数情况了,iOS面试一般不会有太难的算法题。
简历
简历是求职的第一步,也是你能否获得面试机会的敲门砖,我们一定要好好打磨下。下面是我在脉脉上看到的HR在筛选简历时主要关注的点:
我在今年3月份的时候尝试投过几次简历,并没有太好的结果,后来进行了一些调整优化。6月份再投的时候相对好了些,陆续收到了些回应。本人之前并没有大厂经历,不是一流本科,但也能收到不少大厂的面试机会,所以我感觉自己的简历内容还是起到了一定的作用的。如果想参考我简历的话,可以关注公众号:「iOS成长之路」,回复:简历,进行下载。
上面有提到“高光时刻”,可以理解成亮点。怎么让自己的简历跟同能力水平的求职者不同,那就是找到属于我们的亮点。有一个建议,我们在写简历时,可以刻意夸大自己的能力,或者写我们想成为的样子,再之后我们就对着简历让这些内容一一实现,让它们变成自己的亮点。一定要注意不能只吹牛,不落实,因为被发现“造假”可是很严重的。
简历投递
以我的经历来说,相对靠谱的简历投递方式有:Boss直聘、脉脉、内推。
需要注意的是,Boss直聘和脉脉只有别人联系你,你再投递,反馈率才会高一些。如果是你主动联系的招聘方,那大概率是不会收到回应的。推测很多企业并没有很多的招聘岗位也会把招聘信息挂在上面,这种时候HR是不会关注投递的简历的。这也是为什么能看到很多人晒出投递上百个简历确一个回应的都没有的情况,不要气馁,这不一定代表你能力不行。
等招聘者联系是相对被动的,主动出击会更有效。那就是寻找内推,一般公司内推都有奖励的,所以公司内部人员都乐意去发布职位获取内推人选。脉脉,掘金,V2EX,一些知名公众号都能发现不少内推岗位,我们可以自己去挖掘。
面试流程
目前互联网公司大部分是2轮技术面+1轮HR,或三轮技术面+1轮HR。目前的面试形式多为视频面试,也有些是电话面试。视频面试的话,如果是通过Zoom,企业微信,钉钉等一般是不考察手写代码的。如果是通过牛客网,一般是会考察手写代码的。对于手写代码,仅有算法题会要求准确性,可运行,对于设计类题目,我们写出伪代码即可。
如果到了HR轮基本说明我们已经通过了面试,如果确定入职,接下来就是背调,薪资证明,学历证明,入职体检等一系列操作。
面试题
以下是我面试过程中遇到的面试题,其中网络和多线程问题已经分成两篇单独讲解了,这里就去除了这两部分。
Swift
因为我最近两年多一直在用Swift,面试开始的自我介绍环节,我也会着重提这一点。但是很不幸,我得到的答案基本都是:面试主要考察OC。这也说明了大部分公司对Swift态度还是非常保守的,所以除非招聘信息里写了要求Swift技能,否则我们是没有必要专门准备Swift相关面试的。
当然面试过程中也遇到了几个Swift问题:
1、Swift中struct和class有什么区别?
2、Swift中的方法调用有哪些形式?
3、Swift和OC有什么区别?
4、从OC向Swift迁移的时候遇到过什么问题?
5、怎么理解面向协议编程?
OC语法
1、Block是如何实现的?Block对应的数据结构是什么样子的?__block的作用是什么?它对应的数据结构又是什么样子的?
2、GCD中的Block是在堆上还是栈上?
3、NSCoding协议是干什么用的?
4、KVO的实现原理
5、NSOperation有哪些特性比着GCD有哪些优点,它有哪些API?
6、NSNotificaiton是同步还是异步的,如果发通知时在子线程,接收在哪个线程?
UI
1、事件响应链是如何传递的?
2、什么是异步渲染?
3、layoutsubviews是在什么时机调用的?
4、一张图片的展示经历了哪些步骤?
5、什么是离屏渲染,什么情况会导致离屏渲染?
6、CoreAnimation这个框架的作用什么,它跟UIKit的关系是什么?
引用计数
1、ARC方案的原理是什么?它是在什么时候做的隐式添加release操作?
2、循环引用有哪些场景,如何避免?
3、为什么当我们在使用block时外面是weak 声明一个weakSelf,还要在block内部使用strong再持有一下?
4、Autoreleasepool是实现机制是什么?它是什么时候释放内部的对象的?它内部的数据结构是什么样的?当我提到哨兵对象时,会继续问哨兵对象的作用是什么,为什么要设计它?
5、哪些对象会放入到Autoreleasepool中?
6、weak的实现原理是什么?当引用对象销毁是它是如何管理内部的Hash表的?(这里要参阅weak源码)
Runtime
1、消息发送的流程是怎样的?
2、关联对象时什么情况下会导致内存泄露?
3、消息转发的流程是什么?
4、category能否添加属性,为什么?能否添加实例变量,为什么?
5、元类的作用是什么?
6、类方法是存储到什么地方的?类属性呢?
7、讲几个runtime的应用场景
Runloop
1、讲一下对Runloop的理解?
2、可以用Runloop实现什么功能?
性能优化
1、对TableView进行性能优化有哪些方式?
2、Xcode的Instruments都有哪些调试的工具?
3、讲一下你做过的性能优化的事情。
4、如何检测卡顿,都有哪些方法?
5、缩小包体积有哪些方案?
计算机相关
1、项目编译的流程是什么?手机上的应用程序自点击图标开始到首屏内容展示都经历了哪些步骤?
2、对于基本数据类型,一般是存储到栈中的,它有没有可能存在堆上,什么情况下会存储到堆上?
3、数据库中的事务是什么意思?
4、使用过什么数据库(我回答的Sqlite,Realm),Realm在使用时有哪些注意事项,如何实现批量操作?
5、LRU算法是否了解,如何实现一套LRU算法?
6、知道哪些设计模式,怎么理解设计模式的作用?
7、如果有1000万个Int类型的数字,如何对他们排序?
8、设计一套数据库方案,实现类似微信的搜索关键词能快速检索出包含该字符串的聊天信息,并展示对应数量(聊天记录的数据量较大)。
简历相关问题
1、Lottie实现动画效果的原理是什么?
2、OClint实现静态分析的原理是什么,它是如何做到的?
3、MVVM和MVC有什么区别?
4、静态库和动态库的区别是什么?
5、了解Flutter吗?它有没有使用UIKit?它是如何渲染UI的?
6、二进制重排的核心依据是什么?
7、如何设计一套切换主题的方案?
8、AVPlayer和IJKPlayer有什么区别?用IJKPlayer如何实现一个缓存视频列表每条视频前1s的内容?
9、类似微博的短视频列表,滑动停留播放,如何实现?
10、使用python做过哪些事?如何理解脚本语言?
数据结构与算法
1、什么是Hash表,什么是Hash碰撞,解决Hash碰撞有什么方法?
2、如何遍历二叉树?
3、简述下快速排序的过程,时间复杂度是多少?
4、有一个整数数组,如何只遍历一遍就实现让该数组奇数都在前面,偶数都在后面?
5、假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
6、给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。leetcode 7
7、有红、黄、蓝三种颜色的气球。在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票。
2个红气球+1个黄气球可以兑换1个蓝气球。
2个黄气球+1个蓝气球可以兑换1个红气球。
2个蓝气球+1个红气球可以兑换1个黄气球。
现在牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道自己最多可以兑换多少张彩票。
软技能
1、做过哪些工作职责之外的事情?
2、经历过最难的一次业务开发是什么样的,最终怎么解决的?
3、最近有学习什么新技术吗?有何收获?
4、你最擅长iOS哪方面的知识?怎么体现出来的?
5、常用哪些开源库,有没有研究过他们的原理?
6、如何保持个人成长?
流程型问题
流程性问题基本都会包含下面四个,最好提前准备好
1、请做下自我介绍。
2、你有什么问题要问我的吗?
3、为什么离职?
4、对下份工作的期望是什么样的?
这些问题看似不起眼,但其实还挺重要的,很有可能面试官就是通过这几个问题决定了要不要你通过面试。
自我介绍就不说了,简明扼要介绍自己近几年的经历和成绩就行,控制在一分钟以内。
第二个,最好不要直接说没有问题了,提问面试官是我们整个面试过程中少有的掌握主动权的时刻,它可以体现我们自主思考的能力。最好提前了解下公司和招聘需求,准备几个问题,或者面试过程中提出我们产生的一些疑问。
离职原因,这个如实回答即可,只要不说是因为钱或者跟领导同事不和基本都没有问题。
下份工作的期望,这个就看各自的需求吧。
总结
通过这些面试题,我们可以看出一些端倪。
1、面试官更喜欢“刨根问底”,对着一个概念不断的往深处延展,不断深入的问。这类问题会有很大的区分度,第一问第二问第三问难度逐次提高,用于筛选不同的面试者。这也提醒我们某些知识点不光要知道原理,还要知道为什么这么设计,这么设计的好处是什么。
2、问题范围更全面化,特别是二面时,问题不再局限于iOS端,而是更通用的计算机方向问题,这个需要我们平常多积累;还有就是开始重视个人软技能,学习能力和上进心。
3、围绕简历,还记得上面说过写简历时要吹牛逼吗。在面试的时候一定要把他们成为自己真正掌握的知识。
4、注重软技能,这个比前面几条作用稍微小些,但是如果被问到了,而我们也有很好的贴合点,那绝对就是加分项。我的一次经历是,当我向面试官说自己有写博客的习惯,他问我是否知道medium,我说知道,还翻译过几篇里面的文章,接着说了些我理解的国内外博客平台的现状分析。这种情况就属于加分项了。
另外面试是一次考察自己知识掌握程度的考核,考的好能提升自己自信心,考的不好可以帮助我们定位自身问题,不管怎么说都是不亏的。面试还可以帮助我们了解市场行情,薪资待遇,自身竞争力,流行技术栈等一系列情况。所以真的建议即使不考虑换工作,每年固定时间也可以出去面试几次。