iOS网易面试总结
4月9号接到网易的电话面试通知,预约了电话面试时间;网易的面试流程还是比较快的,电面和二轮面在一周之内就完成了;
从毕业到现在有些事情是一直想做而又没有真正认真去完成,比如一直都想再学一遍软件基础课程(包括数据结构、算法、操作系统、计算机网络等),把在学校期间没有意识到的重要内容重新补一遍,这些内容代表了一个程序员的基础功底和深度;但是真正花在这上面的时间并不多,很多时间都用在了读一些闲书上;
算上毕业之前的实习,做iOS开发也4年多了;这个阶段应该是到了必须要进阶的阶段了;首先业务代码已经可以很好地完成,架构上面、一些技术原理上面都有了一些积累和认识,工作中也经常考虑性能、可维护性、代码结构等问题;但是在实践的过程中总是能感觉到自己在某一些能力上的缺失,经常感觉自己在重复实践已经熟悉的套路,像是程咬金的三板斧;主要原因是一些重要的技术节点还没有过关吧,如设计代码时的设计模式、一些重要开源库的源码等,或许这里存在的就是和真正的大牛之间的差距了;
这些和这次面试的内容还是挺有关联的;二轮面试后面试官说一周内会有反馈,自己评估下来挂掉的可能性比较大,主要问题是一些计算机基础课程的题没答上来,还有一些开源库有关的问题答得不太好;大公司一般都比较注重基础吧,所以这类问题面试的时候经常会问到;
记录一下面试过程中遇到的具体问题,可能记的不太完整了:
电面过程:
1、先介绍一下基本情况?
2、说一下你上一份工作的主要职责是什么,完成了哪些具体的工作内容?
回答的时候提到了对部分代码进行过重构和优化;
追问:你具体是怎么样去重构代码的,优化了哪些内容?
3、了解iOS的沙盒机制吗?
说了一下沙盒机制的大致概念;
追问:能否更具体的说一下,沙盒机制包含哪些文件夹?
回答了应用程序的4个文件夹,以及分别适合用来存储什么数据,与一些系统持久化方案的关系;iCloud的同步特性等内容;
4、我们平时都会说OC是动态语言,主要体现在哪里?
回答了一些和动态运行时有关的概念和原理;OC代码编译完之后,都会在系统的运行时系统上运行,类似于id类型的具体类型推断,对象的创建和具体方法的调用都是发生在运行时的等;
5、http协议了解吗,简单说一下?
这个面试之前刚好看过,所以说了一些大概的协议相关的内容
追问:那https呢,与http有什么不用
比http多了一次握手的过程,数据的传输都是加密后的;是通过SSL/TLS1.2的协议对数据做的加密,使用的是非对称的加密算法;(这里答的有点心虚,TLS1.2协议本身不是很了解)
追问:对称加密和非对称加密的区别?
“对称加密”数据的加密和解密都是用的同一个秘钥,所以只有一个秘钥存在,需要管理并保护好这个秘钥的安全性,常见的加密算法包括AES、DES等;“非对称加密”存在一对秘钥,分为公钥和私钥,一般都是公钥加密,然后私钥去解密,服务端和客户端各保存一个秘钥,我知道的算法是RSA;
追问:post请求的请求体(body)里面支持哪几种数据格式?如果要上传一个文件,应该设置什么格式的body数据;
回答了JSON、XML的格式;上传文件应该设置什么格式并不了解,根据自己的猜想回答了一个大概;后面查了一下,还支持“application/x-www-form-urlencoded”和“multipart/form-data”的数据格式,上传文件应该是属于“multipart/form-data”这一种;
6、说一下OC的消息转发机制是什么样的?
代码编译完之后,都会转化成C语言的代码在运行时系统上运行;方法的调用主要是通过objc_msgSend(...)方法簇完成的;objc_msgSend接收一个消息并调用的过程:消息的接收者如果本身类结构中存在这个方法,就会直接被调用,不存在就在父类中寻找,直到最终成功调用或者抛出unrecognized selector;
电面只持续了差不多半个小时,总体还是比较顺利,感觉答得还可以;电面结束后的第二天,就接到了第二轮面试的通知;
二面过程:
1、先自我介绍一下;
说了两三分钟的自我介绍;
2、网络请求用的是什么协议,网络开源库用的是哪个,有没有了解过内部的实现?
网络请求用过HTTP和Socket协议;HTTP的开源库用的是AFNetworking,内部的实现了解过一点;
追问:如果要对每个请求都添加请求头部信息,每个请求的头部信息可能不一样,应该怎么样去实现?
说了一下大致的思路,然后面试官追问有没有其他更好的方式可以实现?
追问:请求设置头部信息调用的是哪个方法?
方法是requestSerializer对象的setValue:forHttpHeaderField:方法;这个方法名称当时没有说的很准确;
追问:如何设置和获取请求的cookies?
这个没答上来,感觉自己挺low的,肯定也减分不少
3、代码重构具体是怎么样去做的?
首先是在团队中制定了一套规范,然后开发新功能时或者是修改一些功能时,先把原来的不符合规范的代码修改过来,在实现功能时删除掉一些原来不合理的实现和冗余代码等;
这一块面试官根据回答的内容,又追问了一些问题,聊到了一些具体的实践细节;
4、平时工作中有没有做过性能优化方面的工作,是怎么做的?
说了一些以往工作中遇到的性能问题和优化方法,包括time profile工具的使用;同时回答了很多会引起性能问题的原因和解决方案;这个可以看ibireme的博客,里面有很好的总结
追问:有没有在数据上统计过性能优化的结果?
这个统计平时做的并不多
5、runloop是什么概念,有什么作用?
说了一下runloop的作用:在OC层面封装成了一个对象,这个对象管理了线程接收到的事件队列,保证在有需要处理的事件时,线程能及时被唤醒,在没有事件可以处理时,让线程处于休眠状态,避免占用资源;并且runloop与线程之间是一一对应的关系,除了主线程之外,其他线程的runloop只有在主动获取过之后才会存在;
6、平时开发中数据库用的是哪个,如何实现读写隔离的?
现在移动端的数据库主要分两个,SQLite和Realm,平时用的是SQLite;说了一下SQLite通过GCD的一些API如何去实现读写隔离,主要是通过dispatch_barrier_async等隔离操作的API去实现;
追问:平时有没有了解过一些开源的数据库方案的实现?
目前还没有
7、平时有没有学习过一些基础课程,类似操作系统、数据结构和算法方面的知识?
回答时说自己在学校期间学习过这些基础课程,对操作系统和数据结构的基本知识还是有一些了解,然后提到了几个自己比较熟悉的概念;
追问:操作系统死锁是什么概念,怎么形成的?
这一块已经忘得差不多了,根据一点模糊的印象回答了一个大概原理;
追问:快速排序算法的原理是什么?
只记得快速排序算法是对冒泡排序的改进,但是算法的原理也忘记了;排序算法现在只对冒泡和选择还有印象;
追问:平衡二叉树的概念?
树和图这一块在学校就没怎么深入去学,然后直接就坦白说自己忘记了;
8、有没有什么要问我的?
我面的职位是“网易杭州研究院”的高级iOS开发,面试之前了解过职位和产品;所以不知道要问什么,就问了一下面试的结果多久会得到(答:一周之内);
面试总结:
1、面试过程中感觉大公司还是比较注重基础,不光是简单的iOS开发技能;平时经常用到的技术要理解原理,这部分包括方方面面的内容,主要在于平时的积累和查漏补缺;
2、开发中经常使用到的开源库,还是要了解它的源码实现;如AFNetworking、SDWebImage、FMDB等;这也是提高自己专业水平的一个过程,这部分准备从今年开始落实,博客的坑已经挖好了;
3、学习软件基础课程知识,这应该也是成为高级工程师必不可少的过程,懂更多的原理才能在设计中有更多的依据,对自己用到的技术底层才能更清晰;大公司的面试中也经常会问到这类问题,属于基本功;