2018年 iOS 面试心得

36,035 阅读18分钟

面试了几家公司之后,最后来到了爱奇艺(坐标上海),工作的内容是笔者个人非常感兴趣的领域。能拿到这个结果对于入行两年半&非科班的笔者来说无疑是幸运的。

很感谢面试官给我这次机会,因为并不是所有人都会认可你的努力,生活本来就没有任何理所应当。

具体的面了哪些公司,有哪些面试题在这里就不分享了,因为感觉借鉴意义并不是很大。

  • 面了哪些公司还是不方便在这里公开的。
  • 这几家公司的面试题相差并不大,主要还是需要重视答题质量;而且即便是同一个面试官,在面对不同面试者的时候问的问题也很可能不一样,因为很可能受到答题者的回答影响会问一些计划之外的题,这点我在作面试官的时候有体会。

面试题方面笔者会专门在下一篇出一套自己认为可以用来面试高级 iOS 的面试题,链接:出一套 iOS 高级面试题

本篇主要分享的是笔者在这阶段是如何准备面试的。可能每个人都有适合自己的学习方法,笔者的这套方法更谈不上十分高效,但还是希望对大家可以有一定的借鉴意义。

准备面试

准备面试主要从三个点展开:

  • 使用的工具
  • 面试题的整理
  • 时间管理

使用的工具

在准备面试的过程中使用频率最多的工具有两个:

  • 有道笔记
  • 奇妙清单

1. 有道笔记

  • 用途1:用来收集知识源:有道笔记浏览器插件可以一键快速保存网页,也可以收藏公众号的文章。
  • 用途2:用来整理面试题:支持多级文件夹,可以清晰看到知识结构;支持MarkDown,可以保存代码。

笔记的整理过程就是理解的过程,反复咀嚼自己的笔记可以帮助理解。

2. 奇妙清单

  • 用途1:用来记录突然想到的问题点:有的时候可能在头脑出蹦出一个问题来,但是没办法立刻想出答案。这时候需要在一个自己熟悉的位置保存一下。
  • 用途2:罗列现在为止没有攻克的面试题:可以更直观地看到距离复习完成还有多少任务。

清单这种工具是为了解放大脑,因为大脑是用来思考的,不是用来记忆的。把需要惦记的事情先扔进去,让大脑脱离出来~

这两个工具还有一个非常大的优势就是跨平台:都支持(Mac,Windows,Android,iOS)系统,同步的功能做的也都很好。所以使用它们可以在不方便用电脑的时候随时更新,特别是有一个好想法的时候可以马上在手机上记下来

面试题的整理

面试题分类

笔者尽可能搜罗了网上所有的iOS面试题,难度从低到高,当然也有介绍某个知识点的一些文章。笔者将这些题汇总以后分成了几个主题放在了有道笔记里面:

  • iOS 基础题:例如“KVO的实现原理?”等等。
  • iOS 应用题:例如“可能导致崩溃的几个原因以及如何避免崩溃?”等等。
  • Block:例如:“基本类型的变量和对象被__block修饰与否各有什么区别?”等等。
  • RunLoop:例如“利用RunLoop可以实现哪些功能?”等等。
  • Runtime:例如“从一个对象收到一个它无法响应的方法到崩溃之间发生了什么?”等等。
  • 网络:例如“HTTPS的握手流程?”等等。
  • 多线程:例如“线程同步的几个策略?知道哪几种锁及其它们之前区别?”等等。
  • 计算机系统:例如“内存的几块区域以及职能?”等等。
  • 设计模式:“iOS SDK里面有哪些设计模式的实践?”等等。
  • 架构:例如“MVVM和MVP的区别?”等等。
  • 数据结构:例如“哈希表的实现原理?如何解决冲突?”等等。

算法题的准备

最后还要说一下算法题:笔者因为没有算法方面的基础,而且时间上也比较紧,所以只准备了数组,链表,二叉树为主的算法题,语言是C++。这些题目的来源主要是《剑指offer》和LeetCode上面的题目,一共学习了大概一个月的时间。

笔者把已经掌握的算法题放在了我的GitHub库上面(有答案,而且都是正确的):awesome-algorithm-question-solution。这个库里面的算法题大部分都是移动端面试比较常考的算法题。

目前都基于C++语言,有兴趣的同学欢迎提交Java和Swift的答案。

相关书籍

还有就是可以用来准备面试的书籍:

  • iOS基础

  • 网络

    • 《图解HTTP》:讲解了HTTP相关的知识,浅显易懂。
    • 《图解TCP/IP》:讲解了TCP/IP相关的知识,风格和《图解HTTP》类似。
  • 设计模式

    • 《Objective-C编程之道:iOS设计模式解析》:这本书介绍了 iOS SDK 中使用的设计模式,将理论和实践结合到了一起,是笔者本人比较喜欢的一本书。有一定的 iOS 基础的同学看这本书会比较顺畅一点。不建议基础稍薄弱,业务场景遇到的不多的同学看这本书,因为会感到很晦涩。
  • 数据结构和算法

    • 《剑指offer》:这本书的难度不是很大,如果没有任何基础,可以挑几个感觉是上比较简单的基于数组的算法题去学习。而且这本书中也介绍了一些面试算法题的一些技巧和需要注意的地方(俗称套路)。就算是没有看这里的算法题也会有所收获。
    • LeetCode算法题:如果时间比较紧,可以直接看笔者上面的GitHub仓库(awesome-algorithm-question-solution),因为这里大部分都是移动端比较常考的算法题。然而并不保证算法性能一定是最好的,因为提升算法性能也需要一些时间成本来学习,这里暂时只能保证性能适中,而且肯定是正确的输出结果。

    总的来说如果时间很紧迫,建议先看一些《剑指offer》里面关于算法面试的“套路”方面的讲解。然后就直奔主题,找一些常考的算法题去学习。

  • 计算机系统方面知识

    • 《程序员的自我修养》(俞甲子,石凡,潘爱民):第一章对进程,线程安全,各种锁的讲解比较好。后面的部分偏深一些,如果时间不允许的话可以先不看。

时间管理

好的时间管理策略可以更好地帮助计划的落地。在这里从两个点来介绍笔者的时间管理策略:

  • 每天都做哪些事情
  • 不做哪些事情

每天都做哪些事情

因为当时在职的关系准备面试的时间比较有限,但是每天对不同类型的知识点都有比较固定比例的时间分配:

  • 类型一:全新的知识点。这类知识点是每天都要看的,因为对于新知识需要时间去消化和吸收。所分配的时间大概占一天总学习时间的一半左右。

  • 类型二:不熟悉的知识点。这类知识点是指那些刚理解好的全新的知识点或者比较难以理解的,需要反复看和消化的知识点。大概占一天总学习时间的一半以内。

  • 类型三:很熟悉的知识点。这部分知识点属于理解的比较透彻的,但也需要抽时间复习,是这部分时间占比不是很重,简单扫一眼即可。

另外还要费分配出整理知识点的时间:对于上面这三种知识点其实都需要反复的整理和吸收,尝试着用自己的话表示出来,需要的时间占比也不是很重,但是却很有用。

不做哪些事情

在时间管理这块,笔者个人比较赞同的一个观点是:比起知道做什么,首先知道不做什么更重要。因为人的精力是有限的,一天就只有24个小时,当某件事很重要的时候,其他的事情就要做个让步。

为了准备面试,笔者在今年上半年放弃了很多事情:

  1. 健身卡虽然快过期了,但是一次都没有去。
  2. 同学,家人聚会也婉言谢绝了。
  3. 没有玩儿“吃鸡”,也没有去过电影院。

坦白说在笔者拿到offer以后才去了健身房,和同学家人聚会,也见了老朋友,算是都补上了。他们也都表示比较理解,所以笔者也感觉也蛮欣慰的。

找一份工作并不难,但是找一份目前最适合自己的工作却非常难,希望大家也能够做一些取舍,列好计划并付诸实践,应该是会有好的结果的。

简单讲完了这阶段的面试经历和准备面试的方法策略,下面说一下笔者对一些同行的某些想法想说的。因为这些也包括这上半年面试别人和自己去面试体会到的,所以在这里就和面试心得一起说了。某些地方可能有些主观。

对一些同行的某些想法想说的

“行业不景气了”

这句话每个月都会听到一两次。 今年上半年很多朋友在面试,可能因为有些朋友不是很顺利,有感而发了。 而且笔者上半年也在给公司招人,招的是高级 iOS 开发,有一个感觉就是很难招。虽然年限已经有3,4年了,但是关于设计模式,数据结构,iOS 底层方面的知识了解的甚少,开源库也只看过SDWebimage(或许只是看了网上的解析而已),总之没有达到笔者个人对一个高级 iOS 开发的要求。

但是反过来我也听到好多人去了很不错的公司,比如今日头条,BAT等等,评级也比较高。

所以笔者个人觉得并不是这个行业不景气,而恰恰是很多开发者没有保持一个持续学习的状态,只是将一年的经验重复多年,最终导致自己的能力小于所属年限的能力标准的情况出现

笔者认为既然做为一名软件开发人员,就要不断地突破自己。对于前端的开发人员,要尽可能地多学一些脱离UI层面上的通用性的知识,比如数据结构和算法,网络协议,设计模式,看一些好的开源库也是不错的(上半年面试了不少于10个人,问看过哪些开源库没有一个不说SDWebImage的)。在这里推荐笔者之前写的一些源码解析的博客:

“因为我学历不好,所以很难拿到面试机会”

这些话在跟我比较熟的同行里面听到比较多,他们觉得自己的面试机会受限于学历。

但其实简历上面可以吸引人的地方可以有很多:高质量的博客,高质量的Github代码,优秀的项目经验,有深度的技术分享等等。

有句话笔者个人非常喜欢:

Alter what is changeable, and accept what is immutable

意思是改变能改变的,接收不能改变的。学历既然很难改变了,那就接受它,不去抱怨,不去拿它当借口,应该把精力放在能改变的事情上:

  1. 博客:现在自己搭建博客都是很容易的事情,有现成的框架(hexo),学习成本很低,如果你有一定的技术积累可以在这里做一下介绍。
  2. GitHub:这个就不用介绍了,如果你封装了好用的组件就可以放在上面,不断更新优化,能体现出个人的成长。如果能参与大型的开源项目就更好了。
  3. 项目经验:这个可能也是个人无法掌控的,但是你可以将某个功能点做到极致不是么?
  4. 技术分享:如果你研究了一个新技术,是否可以给同事们分享一下呢?同时也可以锻炼下自己。

笔者个人是比较看重1,2点的:从这两点可以看出这个人对技术的追求,是否热衷于分享,是否有比较好的表达能力和思路。而3,4点由于客观方面的影响比较多一些,所以相对来说笔者个人并不是很侧重。

笔者看到过一项调查:相对来说学历越高,毕业学校越好的开发者往往在GitHub和博客上面产出更多。这不失为一个值得思考的问题,同时也更加说明了学历和毕业学校相对来说不是那么太靠前的开发者更要注重GitHub和博客这两块。

“(大公司)面试造火箭,工作拧螺丝。”

这句话也听过不少次了,能听出来说这句话的人多数带着些许负面情绪说的。

笔者个人认为大公司的这种招人策略是非常道理的:因为既然是大公司,有丰富的资源,它要么是正在造火箭,要么就是准备造火箭,所以招人的话肯定是招那些已经具备造火箭能力的人或者是那些培养之后可以造火箭的基础比较好的人。而且万丈高楼平地起,总不会大家都是围着设计图讨论吧?每个人都有每个人的职责,况且哪个将领不是从士兵开始做起的呢?

所以我们应该以正确的态度去对待这件事情:

  • 如果你真的想进大公司,那么就削尖了脑袋,好好准备底层知识和算法题去争取:拿到offer最好,就算拿不到也肯定会有收获,毕竟你努力了,你也切身体会了一次大公司的要求。
  • 如果你真的不想进大公司,那么就尽量不要去惦记这件事情,更不要去传播这种负面情绪。
  • 如果你还没确定要不要去大公司,那么最好现在就定一下方向,方向有了计划才会有,计划有了才会有成果出来。

“这部分工作中我没遇到过,所以不了解”

今年上半年也为公司招了人,上面这句话是笔者做面试官的时候经常听到的,比如问“NSSet和NSArray的区别”,“iOS有哪些反射实践?”这样的问题的时候,面试者通常把自己没有做过作为自己不会的借口

其实笔者觉得上面这两个知识点和做没做过相应业务没有太直接的关系(笔者本人在实际项目中也没有做过)。

  • 对于第一个问题,如果你学习了哈希表,并顺带去了解其在iOS SDK的实现,或者是调研过除了数组,字典以外的其他集合类的话,就一定会遇到NSSet。再或者你如果看过AFNetworking的源码的话也可以接触到它。
  • 对于第二个问题,如果你知道Java中有反射的概念,那么你如果举一反三去探索iOS的反射的话,就可以知道使用运行时的一些函数就可以实现反射。

所以说无论学习哪个语言,如果可以从一些通用性知识点里探索出该语言对该知识点的实现的话,会更有助于加深对该语言本身的理解,也可以提高相应的业务能力:

比方说如果你仅仅需要一个集合,将来只需要判断元素在不在其中的话,你只需要用NSSet就好了;但是如果你不知道NSSet的存在的话,你可能就只会用NSArray来做,要知道数组的查询速度是要比哈希表低的多的。

所以说做学问最怕的是不知道自己不知道:多接触,多探索总还是好的。

“我不是科班的,所以数据结构和算法我不会”

笔者作面试官的时候发现:在非科班的群体里想主动学习数据结构和算法的人并不是很多。因为每当笔者问一些关于数据结构和算法方面的知识的时候,总会听到以自己不是科班出身作为不会这类题的借口。

笔者认为如果想要在写程序这条路上面走远,这一块是肯定绕不过去的。 有一个公式:

程序 = 数据结构 + 算法

一个好的程序往往跟这两者是分不开的。即是说若想写出好的程序,就要选择好合理的数据结构和算法(至少也要选择正确的数据结构)。

举一个例子: 现在需要你用一个集合来保存一些人名,并提供一个接口来判断传入的人名是否在这个集合里。那么如果让你来实现这个功能,这个集合的数据结构你会用数组,字典,还是Set呢?

如果你不了解Set的优势,那么你很可能就会用数组来做了(通过返回的index来判断)。但是数组查询的时间复杂度是O(N),远不如Set的O(1),所以这就说明了使用合适的数据结构对于性能的帮助会有多大。

笔者也不是科班出身的,但是学习了数据结构和算法之后,发现自己在设计功能,以及理解代码的能力上提高了一大截。像上文所说的笔者也只是掌握了30到LeetCode题,和一些比较基础的数据结构而已。所以很希望各位非科班的同学也可以好好规划自己这一块的学习。而且有一些科班出身的同学,恰恰因为自己是科班出身,所以在工作之后反而就没有主动去精进这方面知识了,所以非科班的同学更要主动去规划自己,以最快速度填补自己的这块漏洞。

以上就是笔者这段时间的一些思考和想法了。

这篇总结就在这里写完了,一共两个部分,希望您能有所收获,也非常欢迎能跟我一起交流~

本篇已同步到个人博客:2018年iOS 面试心得


笔者在近期开通了个人公众号,主要分享编程,读书笔记,思考类的文章。

  • 编程类文章:包括笔者以前发布的精选技术文章,以及后续发布的技术文章(以原创为主),并且逐渐脱离 iOS 的内容,将侧重点会转移到提高编程能力的方向上。
  • 读书笔记类文章:分享编程类思考类心理类职场类书籍的读书笔记。
  • 思考类文章:分享笔者平时在技术上生活上的思考。

因为公众号每天发布的消息数有限制,所以到目前为止还没有将所有过去的精选文章都发布在公众号上,后续会逐步发布的。

而且因为各大博客平台的各种限制,后面还会在公众号上发布一些短小精干,以小见大的干货文章哦~

扫下方的公众号二维码并点击关注,期待与您的共同成长~