2018年 iOS 面试心得

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

很感谢面试官给我此次机会,由于并非全部人都会承认你的努力,生活原本就没有任何理所应当。git

具体的面了哪些公司,有哪些面试题在这里就不分享了,由于感受借鉴意义并非很大。程序员

  • 面了哪些公司仍是不方便在这里公开的。
  • 这几家公司的面试题相差并不大,主要仍是须要重视答题质量;并且即使是同一个面试官,在面对不一样面试者的时候问的问题也极可能不同,由于极可能受到答题者的回答影响会问一些计划以外的题,这点我在做面试官的时候有体会。

面试题方面笔者会专门在下一篇出一套本身认为能够用来面试高级 iOS 的面试题,连接:出一套 iOS 高级面试题github

本篇主要分享的是笔者在这阶段是如何准备面试的。可能每一个人都有适合本身的学习方法,笔者的这套方法更谈不上十分高效,但仍是但愿对你们能够有必定的借鉴意义。面试

准备面试

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

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

使用的工具

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

  • 有道笔记
  • 奇妙清单

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 的内容,将侧重点会转移到提升编程能力的方向上。
  • 读书笔记类文章:分享编程类思考类心理类职场类书籍的读书笔记。
  • 思考类文章:分享笔者平时在技术上生活上的思考。

由于公众号天天发布的消息数有限制,因此到目前为止尚未将全部过去的精选文章都发布在公众号上,后续会逐步发布的。

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

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