我开始学 iOS 应用程序开发是去年暑假,跌跌撞撞,做了将近一年。回头看看自己的 Git 记录,难免会觉得当年图样图森破,按一些同学的说法是:觉得以前写得矬是因为你进步了。好吧,我就勉为其难地承认了哈哈。毕业季,和我一起实习的同学很多都拿到了国外牛校的 Offer(膜拜!苟富贵毋相忘啊!),然后就要离我而去……公司战斗力大减,急需补充壮丁。因此,我有幸当了几次 iOS 开发的面试官(谁叫你们都走了呢?)深知自己才疏学浅,所以几场 Interview 都算是低端局。低端局也有低端局的玩法,咱就来说说这几场 iOS Dev Interview。

先列数据吧。总共面了 5 位开发者,都是社招。从简历来看,虽不能算是牛人,但起码有丰富的开发经验。让我这种战斗力只有 5 的渣,充满期待。不过后来事实证明,光看简历是很不靠谱的……5 位候选人中,有 3 位在前 3 分钟就被直接爆死,有 1 位在中期被 DOT 耗尽血量而死,只有 1 位符合(超过)咱低端局的预期。

这把低端局流程是这样的:来了先写一个 demo,然后回答一些技术性的问题,最后结合简历上的内容聊聊做过的项目,自己的兴趣爱好啊什么的(这部分咱就不搀和了)。为什么要让人先做 demo 呢?我们觉得在没有靠谱同事推荐的情况下,还是谨慎为好。看一个同学写程序时的各种细节,我能对它有一个比较真实、具体的印象。再加上之后的问答,基本上可以摸清这位同学的开发能力了。最后就交给大 BOSS 们去做决策吧。

1 Demo

为了节省双方的时间,这个 demo 要实现的功能很简单:

  • 用天气预报站点(比如中国天气)的 API 抓中国省会城市当日的天气情况(天气、气温)。
  • 把结果用 UITableView 展示一下
  • demo 可以使用各种开源库

写到这,肯定有同学要嘲笑我低端了。咱承认,这道题简直太特么没技术含量了!所以这是一个最低标准,倘使这也完成不了,对不起,CS 193P欢迎你。

在上机题里只考察了最基本的技能,他们包括:

  • 网络
  • 数据解析
  • 基本控件的用法
  • 最基本的设计

我想这对于一位稍微写过点 iOS 应用程序的同学都不是难事,即使之前没接触过网络、异步、JSON 什么的,稍微查查文档也能顺利解决。

先来说说那三位一上来就被暴死的同学。他们有以下共同特点:

  1. 一上来打开百度,输入“UITableView 天气”进行搜索;
  2. 无一例外全程百度+中文无责任转载博客,而不用 Apple 文档、Stack Overflow 等资源;
  3. 基本类的基本方法不熟,按上述方法找教程;
  4. 变量名、缩进什么的咱就不提了。

对于第一点,那叫弄不清问题本质。第二、第三点那叫非主流编程。虽是低端局,起码也冒充个主流编程派别吧,什么 Github clone 流,Stack Overflow cp 流,咱还是可以接受的。第四点,虽然有同学觉得无所谓,但我还是挺关心的。变量名不规范,缩进糟糕的同学往往给人一种不注重细节,不靠谱的印象。

因此,在很短的时间内,这三位同学在面试官心里已经失去了位置。有两位同学在花了一个小时候主动放弃,还有一位坚持了两个小时,终于有了点结果。考虑到手生,环境不适等因素,为了避免疏漏,还是对应聘者做了一对一问答。

2 问题

好吧,一些基本的问题:

  1. 有用过 ARC 吗?
    • 能说说 ARC 和非 ARC 之间的区别吗?
    • __weak 有用过吗?在什么场景下呢?为什么要这么声明呢?
  2. 能说说 @property@synthesize 这些关键词的用法吗?
    • 为什么要用 getter 和 setter?
  3. 知道 copy 吧?!
    • 它和 retain 或者 strong 有啥区别?
    • 什么情况下要 copy 而不是 retain
  4. Category 写过吗?
    • 能达到什么目的呢?
    • 能举个例子吗?
  5. 你一般怎么处理异步网络任务的?
  6. 能说说常用的几种多线程实现方式吗?
  7. 用过 NSOperationQueue 吗?
    • 你用它来做什么事情的?
  8. 用 block 时一般要注意哪些问题呢?
  9. 能比较一下 NSNotification 和 KVO 吗?
  10. iOS 里哪些持久化方式呢?
  11. 有处理过多线程 Core Data 的问题吗?
    • 是怎样一个情况?
    • 你是怎么做的?
  12. 有试过不用 Interface Builder,直接在代码里写界面吗?
    • 有定制过 View 吗?
    • 如何动态对 View 进行布局呢?
  13. 能说说 UITableView 里 cell 的重用机制吗?
    • 如果我的每个 cell 高度要根据内容的多少有所区别,怎么实现呢?
  14. 用过 Core Graphics?
    • 用它做了什么事情?
  15. 用过 Cora Animation 吗?
    • 能告诉我是什么一个情形吗?
    • 做了哪种类型的动画?
  16. 还有很多很多……

面试时当然不是每个都问,选择性挑了几个。我对 Core Animation,Core Graphics 并不精通(做这个的高富胖同学要去 Cornell 了),所以,这方面的问题在我这种低端局里没怎么出现……

实际的回答情况并不理想。比如有同学不知道 Category,没听过 block,没写过多线程,把 ARC 说成是语言特性,分不清 strongweakassigncopy,不知道 - (void)layoutSubviews 可以做布局,不知道 drawRectsetNeedsDisplay 的用法……就此打住,再下去咱可能就变成纯吐槽了。我想说,这些稍微底层点的机制还是要了解的,对它们不清不楚,很容易在程序造出一堆 bug。它们中的绝大多数并不高端,是基础。如果我这种低端局都没法玩转,怎么能谈得上“iOS 开发经验丰富”呢?

3 小结

之前一直听到别人说招个 iOS 程序员真难,现在想想,招人真难啊。好在自己正好做毕业设计请假了,没去面更多人,不然时间可是哗啦啦地浪费掉了。

低端局怎么玩呢?

我觉得基础很重要,平时为了达到某个目的,Google 惯了,SO 惯了,Github 惯了,会导致不扎实,不系统。短时间内貌似成长很快,但是越到后来,越容易在基础上出问题。抽点时间把基础补一补绝对很值得。 其次,学好英语真的很重要,变量名能取合适了,文档能看懂了,Stack Overflow 也能玩转了。 然后,确保自己写过很多代码,起码自己独立完成一个小型项目吧……我觉得很多东西的好坏不通过实践完全没法感受到。“为什么要那么做呢?”——“实践告诉我那样做很好!”

如果,你能轻松解决上述 demo 和绝大多数问题,那么玩玩低端 iOS 技术面试应该木有问题。倘使再配上强有力的作品,那么我觉得中端局也能轻轻松松超神。至于高端局,咱也不知道长啥样,我等屌丝估计要吓尿。当然,如果上述问题对你来说还有不少困难,那我觉得最好再刷刷等级,这样既节约 HR 的时间,也节约自己的时间不是吗?

最后打个小广告:戳 链接