---
title: "杭州网易行"
description: "记录网易杭州总部的 iOS 实习面试全过程，包括电话面与技术面的问题还原，以及面试之后对自身基础的反思。"
date: "2014-03-19"
tags: ["杂谈","原创"]
canonical: "https://vonglo.cn/posts/interview-in-netease/"
license: "CC BY-NC-SA 4.0"
licenseUrl: "https://creativecommons.org/licenses/by-nc-sa/4.0/"
---
# 杭州网易行

> 记录网易杭州总部的 iOS 实习面试全过程，包括电话面与技术面的问题还原，以及面试之后对自身基础的反思。

周三接到网易电话，说上次电话面试通过了，让我周末过去杭州总部面试，于是周末就去了趟杭州。这篇文章是关于网易这次面试的相关内容和自己面试后的感想，写出来和大家分享一下。



## 面试过程

3.4号接到网易的电话，说预约第二天下午三点进行电话面试，然后自己就开始准备自我介绍什么的。这里有个乌龙事件，之前投了份网易游戏的实习生，原来以为是游戏实习生的面试，几天之后接到网易游戏部的“虽然您很优秀…”的邮件，才知道原来游戏是招至少硕士学历的，这次电话面试并不是网易游戏的面试（后来才想起是之前投的网易iOS开发工程师实习生的职位，真囧~~）。
下面是第二天电话面试的大致内容，记得不是很清楚了，我大致还原一下当时的情景。忽略一些客气语，下面直接进入正题。

> 面试官（以下以Q代替）：你学习iOS多长时间了？

我（下面以A代替）：十个月的样子。

> Q：你了解MRC和ARC吗？

A：对他们都有一定的了解，但用的更多的是ARC，当然也知道MRC的规则及用法，也有做过相关Demo，由于开始学习iOS的时候ARC已经成为一种趋势，所以用的更多的是ARC。

> Q：好的。你熟悉autorelease吗？谈谈它和ARC的区别是什么？

A：autorelease是将对象添加到NSAutoReleasePool里面，然后在调用[pool drain]方法后，所有在释放池里面的对象均被release。而ARC看起来的效果是一样的，但是实质是不一样的，ARC是系统在适当时候来释放一个对象的。

> Q：嗯。你了解NSObject和NSObject Protocol吗？他们有什么区别，为什么要有NSobject Protocol？

A：NSObject几乎是iOS开发过程中所有类的根类，NSObject协议是为了方便一些并没有继承自NSObject的自定义类，来实现NSObject的一些方法，因为二者的方法大部分是一样的。

> Q：那你知道哪些类是不继承自NSObject的？以及这样做的原因是什么？

A：据我目前见到的情况来看，貌似没有，但肯定有这种类。至于这样做的原因我不太清楚。（面试完后google了一下，大概了解了相关情况）

> Q：你了解运行时吗？

A：了解一点点。

> Q：嗯，没事，那你说说你了解的。

A：运行时就是在运行时来进行判断，比如内省。像respondeToXXX这些方法应该都是运行时才执行的。我知道的大概也就这么多了。

> Q：你用过哪些开源库？

A：暑假做一个游戏客户端的时候用过CocoaAsyncSocket。

> Q：你有仔细看过它的源码吗？你认为它的哪些方面可以优化呢？

A：当时项目比较紧，所以直接拿过来就用了，就看了一些自己需要用到的方法的实现。优化的话，暂时还没有想过。

> Q：那如果你现在再去看这个开源库的时候你觉得你会学到哪些东西？

A：这个库是分TCP和UDP的，当时我们用的是TCP，这次如果再去看的话，应该对UDP也会有一定的了解和学习，同时也可以考虑一些可以优化的地方。

> Q：对于其他的比较经典的关于网络方面的开源库还用过哪些？

A：AFNetworking，ASIHttp。

> Q：嗯，其他的开源库呢？

A：用过那个在ios5，6下实现ios7扁平风格的控件的库，其他的都不记得名字了。

> Q：你了解越狱吗？该怎么判断设备是否越狱？

A：了解一点点。您说的是只用代码判断吗？代码的话我不太清楚。（面试后google了一下，大致思想是检测是否多出越狱的文件目录，网上现成的代码也有，随便一搜就能搞定）

> Q：了解copy和mutableCopy吗？谈谈二者的区别

A：了解。copy只是指针的复制，属于浅拷贝，mutableCopy是深拷贝。（之后他举了个例子，忘记了，反正就是NSString和NSMutableString的一些东西。如果你有疑问，可以看看我之前的文章—>OC内存管理学习）

> Q：怎么判断一个类是否遵循某个协议？

A：可以用respondTo协议里的某个方法来实现。

> Q：还有没有其他的方法呢？

A：其他的应该有但是我不知道。因为我最常用的就是上面的这个方法。

> Q：假如我有一个对象不想实现系统默认的方法，我能够做到吗？

A：可以用分类（categrey）吧，（迟疑片刻后想想不对），应该不行。（面试之后，自己再想了下应该可以复写其父类方法就行，不知道对不对）

> Q：你用过GCD和NSOperation吗？它们常用的场景是什么？谈谈你的看法。

A：都用过。NSOperation是对GCD的封装，属于类级别的，GCD是底层的属于C级别的。GCD的效率可能会更高，因为基本上全是执行block。

> Q：你平时用哪种方式呢？

A：一般图片加载用的是GCD，而其他下载任务用的是NSOperation。

> Q：GCD能够随时停止吗？NSOperation呢？如果能的话又是调用什么方法呢？

A：GCD由于调用的是block，所以它一旦开始在执行完之前是不能停止或取消的。而Operation是可以的，通过KVO即可。当然如果要取消的话，我记得有个方法，名字貌似是close？（面完后查了下是cancel）

之后就是换了一个人，问了下我的相关情况和实习时间的安排，然后让我等电话通知。
五天之后，接到电话，说让我周六下午去杭州面试。然后问了下费用问题，是不报销路费的，本来不打算去了，回来看看车费也不贵，于是想想觉得还是去吧。就算不过，也当长次经验还可以顺带去西湖看看。
坐了一晚的火车，第二天到网易大厦，一进大厅感觉自己是土鳖进城（哎，没见过世面）。下午一点到，在大厅等了45分钟，就有人过来叫我去面试，没想到这次还是技术面，本以为是HR面了。
进到玻璃间，面试官先问了我的一些情况，怎么来的，来这之后住哪里，看你精神不太好啊。我回“坐了通宵火车”等等。听声音感觉是和上一次电面的是同一个。

> Q：上次面完之后你有什么感想？面完之后有没有写blog什么的。

A：感觉自己很多方面的知识很薄弱，有待提高，blog倒是还没整理好，只是网上查了一下上次那些不知道的。

> Q：那现在你对那些问题有了什么新的认识？

A：然后我就说了一下我对于那些知识的一个总结。

> Q：有没有相关的项目经验呢？

A：帮一个公司做过一个类似QQ游戏大厅的客户端。实现登录以及各个游戏的在线人数显示，主要是从安卓端到iOS端的移植。

> Q：那你对安卓应该也有所了解吧，说说他们之间的区别？

A：。。。谈了下自己的认识。

> Q：除了这些，你自己平时有没有做过小的东西来玩一玩？

A：我掏出iTouch，然后拿出几个月前写的计算器给他看，然后介绍了下这个计算器实现的功能。

> Q：（把玩了一下）嗯，看起来还不错，主要精力应该是花在了解析字符串上吧，UI有点。。。

A：确实，几乎都是字符串的解析，然后通过用数组来模拟栈进而实现括号的匹配。UI设计当时确实没怎么在意。（关于计算器，源代码戳这里）

> Q：这个好像是单机的，有没有做过网络方面的？

A：有过，去年的时候加校内的iOS团队，然后他们给我的任务是做一个RSS音乐播放器，主要实现XML的解析，然后下载，还有就是播放器的实现。

然后我也记不清还问了哪些问题，紧接着他拿出一张纸，说这里有两个题目，你看下。先做第一题。一看全是逻辑题，突然觉得自己智商不够用。

> 1.你到了一个十字路口，不知道该往哪边走。路口有两个人，一人只说真话，一人只说假话，但不知道谁说真话，谁说假话。问：你如何才能只问其中一个人问题，就能知道该走哪条路。

> 2.你到了一个十字路口，不知道该往哪边走。一条路通往真话村，一条通往假话村，真话村的人只讲真话，假话村的人只讲假话。这个时候你发现路口有一个人，很显然他不是真话村就是假话村的村民，现在你如何只问他一个问题，就能知道那条路通往假话村。

看到第一题我想，这种题目应该是问其中一个人自相矛盾的问题，然后通过回答的内容来得出答案。虽然点子是对的，但是就是不知道怎么提问。这时候面试官在旁边说，你可以把你的想法说出来，然后我就说了一些。。但是又被自己否定了。然后他就开始提示我，一步步把我往答案的方向带，最后终于在他的点拨下得出了答案。第二题也是一样的情况，只不过一开始他说，这个题目我不会再给你提示了。然后。。我又开始想，好几分钟后，他又开始提示了，这样，又得出了答案。
最后他拿出一个算法题出来让我写，大致就是数电里面的摩根定理，比如NOT AND A，B转化为NOT A OR NOT B这样子。。我一开始说可以用栈来实现，但是仔细想想又不好确定，然后他又提示了，你看看二叉树会不会比栈方便些。大致思路如下

```
    AND（not）             OR
     /  \       --->    /    \
    A    B             NOT   NOT
                        /     \
                       A       B
```

就是把前面有NOT的AND，将NOT作为它的tag，然后操作数分别作为其
左右孩子，这样进一步转化，将AND（not）转换成OR，not下移，操
作数随之移动。到最后，not均被移到底层，即可实现摩根定律。
然后就问我为什么要从事iOS开发？这之后就问我实习时间，然后问我还有没有什么疑问，说结果到时候会通知我。之后就是”Say GoodBye”了。

## 一些感受

这次面试之后总结了一下，发现自己的基础知识掌握的还不是很牢固，项目经验匮乏。尤其是逻辑推理题，自己的思路还不是很清晰，有待于训练。然后觉得很多面试，笔试有些片面，用这种算法题来考。如果有大量时间的话，那些刷题的人对于这些问题岂不是分分钟就解决了，工作后上手项目如果不能灵活运用是不是和当初的选拔目的相违背了。然后仔细想想，这也是没办法的办法，只能通过这种方式来筛选。这里仅仅是个人观点，如果让你觉得不爽请忽略。这两次面试过程中自己都没有紧张感产生，觉得不可思议，可能都是自己比较熟悉的东西，然后现场的气氛也很好的缘故吧，希望这种状态能延续下去。
最后，其实面试官人很好，很nice，在我回答不上的时候一直提示我。更重要的一点，此人有点像一初中同学，一见面就有种亲切感。
---

Canonical: https://vonglo.cn/posts/interview-in-netease/
License: [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)
Author: Vong
