不会开机的男孩

Core Bluetooth Concept

| Comments

Core Bluetooth 里面的名词还是挺多的,这里简单记录一下,一上来的时候,还是很容易混淆的,这里记录一下。

Basic Concept

Bluetooth low energy (BLE,还有地方叫做BTLE,最恨各种简写了) 简单说是一种低功耗的短距离无线传输技术,主要用于低功耗设备传输,比如心率、记步器、智能家居方向,还有连接其他iOS设备。

Core Bluetooth API 支持BLE4.0,做了协议封装,让开发者不需要完整了解BLE协议就可以快速开发APP。

Central and Peripheral

BLE中有2个非常重要的概念就是Central和Peripheral,有一点类似Client Server。

  • Peripheral是数据的发送方(比如运动手环需要把位置,步数等数据传递给其他设备)。
  • Central是数据的接收方(比如手机接收手环传递来的步数)

1-1 Central 和 Peripheral 心率设备和Apple product

Centrals Discover and Connect to Peripherals That Are Advertising

  • Peripheral把advertising packets广播出去,advertising packet 包括会包含一些重要的信息,比如设备名字,所提供的服务。

  • Central 则是扫描自己感兴趣的advertising packet,比如一个APP需要查找当前家里的室温,会通过参数设定,只是检索温度设备发来的packet。

1-2 一个简单的advertising模型

Data structure

  • Peripheral 是最上层的一种服务抽象,比如iOS 系统内置的ANCS服务,另外我们自己也可以创建自己的服务。
  • characteristic 则是用来描述服务中的具体内容(比如手环有传递行走路程的接口,还有行走位置的接口),一个服务可以包含多个characteristics。

1-3 心率检测仪包含1个服务,1个服务中包含2个characteristics,一个用来传递心率,一个用来传递位置

How to

YmsCoreBluetooth 是个不错的框架,有很详细的介绍,这里就不赘述了。

Apple Notification Center Service

| Comments

名词解释与约定

名词解释

  • Apple Notification Center Service 简称 ANCS。
  • ANCS 服务(iOS设备,如iPhone,iPad等)的publisher 称为 Notification Provider。
  • 任意的ANCS服务的client(硬件设备,配件)称为 Notification Consumer。
  • Generic Attribute Profile简称GATT。
  • 在iOS NotificationCenter 显示的通知称为 iOS notification。
  • 通过GATT characteristic 发布的通知称为 GATT notification。
  • iPhone、 iPad等运行iOS系统的设备称为iOS设备

约定

文本档覆盖的内容中除特别描述外,和字节序相关的都是用Little-endian (小端模式)。 文本档覆盖的内容中除特别描述外,和字符串传递相关的都是UTF-8

Note: ANCS 并不保证始终存在,服务开启,关闭机制由iOS系统决定,Device 需要一直检测,查找ANCS是否存在。

协议内容

ANCS的uart profile UUID : ” 7905F431-B5CE-4E99-A40F-4B1E122D00D0”

uart profile 中包括3个 characteristic

  • Notification Source UUID: “9FBF120D-6301-42D9-8C58-25E699A21DBD” (notifiable)
  • Control Point UUID: “69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9”(write with response)
  • Data Source UUID:” 22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB “(notifiable)

Device端Notification Source 是必须实现的。Centrol Point 和 Data Source 可选。

Notification Source Characteristic

Notification Source characteristic 包括3个功能

  • 新的iOS设备通知
  • iOS设备通知修改
  • iOS设备通知删除

当Device端 subscribes Notification Source characteristic时,GATT Notification 会立刻分发出去。所以,Notification consumer (Device)在subscribe之前就需要做好立马接受和处理消息的状态。

Notification Source response format

图2-1 Notification Source characteristic 通过GATT Notification 的格式。

  • EventID:描述iOS设备上面的通知是增加、删除、还是修改。
  • EventFlags: 标志位,描述iOS设备通知(重要, 静默)
  • CategoryID:iOS设备通知类型
  • CategoryCount:给定类型的通知数量,比如有2个未读email消息通知,这时有一个新的未读消息通知push到iOS设备,这时CategoryCount = 3 NotificationUID:通知的唯一标示,这个字段用于和Control Point characteristic 检索更多的信息。

image

表格3-1:CategoryID的描述

image

Notification Source Response Example

Device 获取的来此Notification Source的数据是“00 01 00 01 43 00 00 00”

image

图2-2一个iOS通知的生命周期。

比如当iOS设备(如iPhone)收到一个iMessage消息,iOS NotificationCenter会产生一个Notification,ANCS会通知device 有一个新的通知。当iOS设备阅读这个iMessage消息之后,iOS Not ificationCenter 会删除掉这个通知,ANCS把这个删除通知push到device

Control Point 和 Data Source Characteristic

只是Notification Source 不能获得足够的信息, Control Point 和 Data Source characteristic用来解决这个问题。 Device 向Control Point characteristic 写一个命令,如果成功,会从DataSource characteristic 获得response。

获取通知属性命令

该命令根据NotificationUID 查找通知的详细内容(通知属性)。

image

图2-3 获取通知属性命令格式 CommandID: 必须设置为0 NotificationUID:通知的唯一标示(Notification Source 获得) AttributeIDS:需要检索信息list

image

图3-5 可以检索的通知属性列表,其中Title, subtitle, Message 需要增加2个bytes的字段表示长度。

获取通知属性命令Example “00 43 00 00 00 00 01 FF FF 05”

image

获取通知属性命令Response消息格式

image

图2-4 获取通知属性命令返回数据格式

CommandID: 0 NotificationUID:通知的唯一标示 AttributeList:具体的属性返回数据列表. 如果返回的属性空,长度是0

如果返回的数据长度大于 GATT MTU,那么数据会被分几段传输。Device 需要对数据拼接。

通知属性命令Response 消息格式Example

下图查找 NotificationUID为2的 AppIdentifier、Title、SubTitle、Message Date属性返回数据

image

获取APP属性命令

该命令通过APPIdentifier查找iOS设备中安装的APP的属性。

图2-5 获取APP属性命令格式

CommandID: 必须设置成1 AppIdentifier:字符串’\0’ 结尾。 AttributeIDS:查找ID列表

获取APP属性命令 Example

查找AppIdentifier 为 “com.apple.mobilemail” 的APP属性

image

获取APP属性命令Response消息格式

image

图2-6获取APP属性命令返回数据格式

  • CommandID:必须是1
  • AppIdentifier:字符串 ‘\0’结尾
  • AttributeList:具体的属性返回数据列表. 如果返回的属性空,长度是0

如果返回的数据长度大于 GATT MTU,那么数据会被分几段传输。Device 需要对数据拼接。

获取APP属性命令Response消息格式Example

查找AppIdentifier 为 “com.apple.mobilemail” 的APP属性返回数据 汉字 “邮件”

image

sessions会话

ANCS 的 session 从设备订阅characteristic 开始到取消订阅或是disconnect结束。所有的Identifier 比如 NotificationUID,AppIdentifier 只在当前的session有效。

当session结束后,设备需要删除掉所有的在session中获得的Identifier信息,这些信息会在session建立的时候重新通知设备.

错误代码

  • 未知命令:(0xA0)
  • 无效命令:(0xA1)
  • 无效参数(0xA2) : 比如NotificationUID 找不到

注意:如果产生了上面的错误,都不会再收到任何的GATT 通知。

参考内容

Apple Notification Center Service (ANCS) Specification

Xcode5 Plugins 开发简介

| Comments

这篇文章介绍如何给Xcode5开发插件。如果之前了解iPhone & iPad 开发,那么下面的内容对您非常熟悉。最后我们会开发一个简单的插件,记录Xcode开发中Building的时间。

准备工作

首先编写一个Plugin还是需要不少额外的配置,这里推荐Xcode Plugin Template。用这个templage来帮助我们开发Plugin。

另外,编写插件和之前的iPhone or Mac上的APP不太一样。从某种意义上来说就是用Xcode调试Xcode。所以这里需要额外配置一点东西。

  • 修改Scheme

image

  • Executable 选择Xcode.app

image

当我们Build & Run Project的时候就可以看到启动了一个新的Xcode进程,当然除了Xcode, Mail或是其他程序我们都可以调试。

如何编写插件

因为Apple至今并没有公开Xcode Plugin的文档,所以我们需要通过一些其他方法寻找思路。

1
2
3
4
5
6
7
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationLog:) name:nil object:nil];
  
  - (void)notificationLog:(NSNotification *)notify
  {
      NSLog(@"%@", notify.name);
  }
  

这里稍微有一点特殊,参数notificationName 设为nil,下面是Apple的文档,不是很清楚。

notificationName If you pass nil, the notification center doesn’t use a notification’s name to decide whether to deliver it to the observer.

但是目前来看,似乎可以看到所有的通知。当然绝大部分是重复的,对我们没有意义。很幸运最后我们找到了2个通知是我们需要的,下面的代码,已经做了过滤。

1
2
3
4
5
6
7
8
9
 - (void)notificationLog:(NSNotification *)notify
  {
      if (![notify.name hasPrefix:@"IDEBuildOperation"]) {
          return;
      }

      NSLog(@"%@", notify.name);
  }
  

这2个通知分别是

  • IDEBuildOperationWillStartNotification
  • IDEBuildOperationDidStopNotification

这个我们不得不赞一下cocoa的命名方式,大家都可以猜出这2个通知的含义。剩下的事情就很简单了。统计build时间。

最后

这是项目源代码。有兴趣的同学可以玩玩,看一下自己的编译时间有多长。另外最终的代码中还增加了2个小的features。

  • 查看当前打开Xcode的人数
  • 查看自己打开Xcode专注的时间有多长,这个时间是当Xcode被focus的时候才统计,另外不足1分钟不计算在内。

Have fun!

我的2008-2018

| Comments

5年前拿到人生第一个冠军

因为小时候很贪玩,并没有考好大学。07年上了一个普通大学。08年正好大二,本来我是打算金盆洗手好好学习的,而且大一做的还不错。但是一个叫做Dota的游戏又给了我一次玩的机会。当时玩这个的人还很少,我和室友和另外3个其他学院的家伙们组成了一个电竞战队。我们的能力起初并不被看好,但是我们却拿到了当年全省第一届电竞Dota项目的冠军,也获得了人生第一桶金。再后来还参加了另一个比赛,最后去E世界演播大厅打比赛。一路上来每局都是逆风,但我们都一次次靠团队配合和抓对方失误扳了回来,最后成为一个黑马进入华北赛区8强。

游戏对很多人来说都是玩玩的娱乐项目,但是对我和我的小伙伴们来说,里面有很多个日日夜夜看比赛录像,锻炼意识,枯燥的基本功训练在里面。里面有成功的欢乐(冠军之后,还被媒体采访过)也有遗憾的泪水。我还记得打完最后一场在回旅店的路上。我挺自责的,因为团队中我是中单的Gank发起者(Dota游戏里面一个比较重要的位置),而我觉得我发挥的不够好,连累了大家。我的队长对我说,咱们没有北京这些学校这么好的电竞氛围,能走到这里已经很厉害了。Anyway,此生对游戏再也没有当年的执着劲了。因为能够在正确的时间,在一个玩游戏被众人鄙视的氛围里面遇到一帮子一起玩的人,组成一个团队,并且最后拿到冠军,已经是我能做到的极限了而且还有极大运气。

4年前开始思考未来的工作

在游戏人生将近10年之后,我发现,我还是得回到现实,为自己的未来做打算。因为当时在学生会网络部混日子,给学院和学校做个烂网站。然后有一天其他学院的同学找到我说咱们一起联合做一个项目,参加全国的比赛。也托玩游戏的福,我妈妈觉得她的儿子,这么多年来第一次战胜了“别人家的孩子”,给我买了一个多普达的手机,是我的第一部智能手机。极大的震撼了我,我觉得电脑太笨重了,便携的移动设备一定是王道,因为有大量的碎片时间可以利用,我觉得智能手机一定会超过PC,我的未来一定是在移动方面的。也托这个比赛的福,更刺激了我在移动方面的兴趣,从而在网上认识了一些IT界的大牛,都在大公司,还有在国外工作的,并且参与了他们的开源项目。大二的一个暑假我都在编程中度过的,最后那个比赛获得了优秀奖,全国前20。和他们一起工作,对我的帮助极大,不仅是理论还是实践。而且我相信给我更多的时间可以做的更好,因为我参加的那个开源项目是当时windows mobile上面最好的也是唯一的UI Framework。

3年前开始创业

不知不觉大四了,之前一起参加开源项目的一个家伙,准确说是2个家伙要出来创业了,不准备在大公司呆了,(他们一个在微软一个在中国移动),然后这个家伙给我吹了一个大泡泡,现在想想挺有趣的,当是准备做基于手机联系人的IM,那会还没有米聊和微信。我觉得挺有意思的,这个不就是做一个移动版本的QQ么,而且当是的手机发短信还是挺费钱的,一条信息的流量几乎忽略不计,而且没有字数限制。一定可以改变人们的沟通方式,后面还可以发图片发声音,而不是只是文字。当是的产品原型是国外的Kik Messenger。当然,我们并没有做到最后,因为各种各样的原因,最后我们放弃了这个项目。

在2010年底,我们开始把精力转向在线教育。更准确说的是在线英语教育。我接触在线教育是在小学的时候,在线教育能够把高质量的教学资源给更多的人,而且中国学英语的人会越来越多,市场会越来越大。另外结合手机本身就可以发音的特性,这些都是普通书本不能提供的。最后我们还找到了一家著名的英语培训机构作为我们的内容提供商。另外参考了一家广州企业的盈利模式,然后开始尝试。我在这个过程中开始把之前做IM项目积累的经验,快速应用到这个项目中。而且最后作为我的毕业设计,拿到最高分90,做为我大学生活的结束。

2年前开始转行,拿投资

我第一次看到iPhone是大二的时候,当时我觉得这东西就是一个掌机,后面才发现是手机(别笑话我),而且一直认为这是一个纯装逼的行为。但是当真正做到移动领域的时候,开发设计windows mobile上面App的时候,很多的设计的确都是参考iPhone的。也开始接触iPhone上面的开发,到后面发现windows mobile真的不行了。不管是工业设计,还是App的用户体验都差距巨大,但是价格缺没差多少。。。而Android的开放和便宜(相对于windwos mobile 的license),windows mobile 必然是没有前途的,于是乎开始了和AppStore 斗智斗勇的日子:),最后成为了国内比较早的一批iOS开发者。

创业的这个项目也遇到了问题,很多问题,盈利模式很难复制,用户没有在移动产品上面的付费习惯也缺乏渠道,而且用户量不仅不够,还在不断下滑。团队有部分人因为家庭问题,先走一步了(因为之前日子过的太苦逼,女朋友表示日子没法过)。我也考虑过离开,但是觉得不能以这种方式离开,主要是不能接受这种方式的失败,然后就继续做下去了。付费很难做,但是用户量还是可以有的。最后我们做了一个垂直社交————英语教育社区。当时英语教育软件里面为数不多的(可能是唯一的)移动社区App,我们被AppStore 推荐,iOS下载量一天增长了1W倍,加上Android成功内置电信,最后拿到了200W天使投资。这段日子虽然苦逼,却是我工作上面成长最快的时候,人总是被逼的么,拿着倒计时牌算日子过。中间遇到些问题并请教了很多国外的开发者,自己也写了一些内容比较深的blog(相对在那个时候),自认为在iOS设计和开发上面自己在业内可以排到top 5%,因为不仅产品被资本和Apple Store认可,而且那会自己的很多blog也在Google搜索的最前面。

另外,一个同学去CMU了,我觉得不管是我的工作,还是其他什么的,我都需要把英语学好了。我问他你准备了多长时间,他说4年。从英语到字幕组到论文到申请。 我知道我的大学成绩是这辈子不太可能去CMU了,但是我还是蛮想出国的,然后介于我低下的语言天赋,我觉得我至少需要准备3年英语。

1年前退投资,分手

2012年的开始还是蛮不错的,团队终于没有钱的压力了(暂时)。然后我们搬到了美团,美丽说他们曾经在的地方,创业公司么,大家都希望沾点喜气,而且交通也方便,而且便宜。然后我们3个月没有做事情,因为我们暂时走到了前面,而且前一段时间我们一直在转变,需要想清楚我们应该做什么。当然不是完全没做,只是主线产品没大的升级,做过一些其他的小尝试,但是效果都不好。整个团队都很迷茫,我也不例外。我觉得这样下去,我在年底就没有什么东西可以总结的了(最后显然我把事情想简单了),然后就报了EF的班,开始我的3年英语计划。另外开始健身,减肥。一个月减了20斤,每天游泳1.5km。工作方面开始负责服务器,不仅仅是负责iOS方向。实现并设计了新版本的服务器。时间转眼就到年底了。因为各种原因吧,我们和投资人谈崩,团队整体撤出,产品留给投资人。然后就是换办公室,无外乎就是换一个小房子,然后再清退一些人,有意思的是,这个时候也和女朋友分手了。这就是所谓的祸不单行吧。

2012挺特别的,我的生日正好是末日的那一天,可惜万分期待的末日并没有到来。我意识到我并不是真正的足够了解自己,也并不是真正的清楚自己在做什么,几年前我自认为我在做正确的事情,但是我在那个时候觉得我看不清楚。那会我开始接触MBTI,了解积极心理学,给自己灌超大量的鸡汤,感谢我的老大(leo,cube),感谢我周围的朋友(强X和顺X),当然还有默默关注着我而且始终在背后默默帮我的风哥(突然想起来,最近实在太忙,坑了风哥了,对不住了),最后还要感谢一个远方的笔友。

今年又转行了 Freelance

2013年,移动互联网发生了天翻地覆的变化,一大堆的开发者涌入了这个行业,也有大量的App走到大家面前,我的tutor或是close friend,和他同甘共苦的另一半修成正果了,而且他也比较给力,前一段时间他们团队拿到$2000W的B轮,宝宝也有了,祝福。另外强X拿到Morgan的offer开始自己的职业生涯了。我呢?我觉得前几年过的太累了,按照老大的话,就是过的没有尊严。2013年准备挣挣钱。这一年来说我可以算是一个Freelance。平时就是看看书,学学英语,健健身,遛遛狗。有事情了,然后做一点。到头来还算不错,至少比一般大公司挣得多。不用上下班,没有人约束你做什么,想睡几点睡几点。一年也就工作不到4个月,大部分在休假。但却是我最难受的1年。因为这个生活显然是50岁的节奏,不是一个20多岁的人干得事情。当然这也有好处,就是我有大量的时间和负能量去支持我这个龌龊的灵魂又减了将近20斤,练出6块腹肌并且在年底来了一次马拉松。因为我如果不做一点东西的话,2013年总结的时候我该写点什么呢?

扯远了,移动行业2013年是一个起点,很多传统行业开始意识到移动领域的价值。而这一年中,我们的很多项目也和他们相关。年底也出现了很多将互联网概念和传统行业结合创业的例子,不管是黄太吉还是马佳佳的情趣用品,都在告诉我们移动互联网还有一波浪潮可以淌。很多传统企业在2014年会加大在移动方面的探索。这里面还是有很多机会。我们现在的能力在2014年做到2013年甚至可能比2013年还要好也并不是不可能。但是我却不得不看清楚一个现实就是移动互联网入门的门槛是如此之低。很多一线大公司的平台级别产品极大的简化了开发的风险和时间。而且投行是这个一个行业的方向标,我自己也并不看好自己现在处的行业中的位置————一个纯互联网方案提供商。

小米通过他的品牌不仅卖手机,还要卖路由器,电视等等。我依稀感觉到互联网不仅仅是改变人们的沟通方式,会开始慢慢的走近人们的生活,而且事实上有些地方已经走到前面,包括交通(机票,火车票,打车),运动健康(可穿戴设备),还有一些政府的项目也开始增加了不少移动部分。另外就是后端的XX云概念。而这些都是我现在没有办法做的事情。所以,我又准备转行了。

朋友家人

在创业的风风雨雨中,认识了一些朋友。有的走上正轨,拿到B轮,得到市场认可,而且资本也会让他们继续平稳的走下去。线上教育一直是我喜欢做的事情,但是教育本身就是一种回报很难估算的投资(不像一件衣服好看不好看那么直接),而且还有大量的时间成本。再他们赢得一些用户口碑之后,一段时间不容易被其他产品影响,还会越滚越大。另外一些朋友开始在大公司里面摸爬滚打,也蛮不错的。因为毕竟是主流价值观。有一大推可以借鉴的经验和路子。还有一些朋友准备考GMAT。

我家是一个普通家庭,可能唯一特别一点的就是我有一个特别开明的妈妈,我妈妈认为她最大的遗憾就是当初她老师告诉她要学好电脑,而她没咋当回事。所以她一直很支持我玩电脑。有一天我有意无意的在她的书柜里面找到的一本有关Basic语言的编程书,然后自己写下了我的第一段程序,一个简单的计算器,那会我上小学6年级。我一直觉得我有一个很特别的妈妈,我妈妈是一个大网虫,我的QQ号都是她替我申请的,而且特别喜欢电子游戏。但是,我显然让她失望了。我并没有按照她给我计划好的路子走,而是按照自己的性子来的。走了一条很大的弯路,而且是不归路。我没有考上一个好大学,也没有找一个可以让她安心的工作。而且现在我也没有办法告诉她我什么时候可以结婚生孩子。

妈妈的身体差一点,爸爸的身体比较厉害,打了30多年的拳,虽然比我大30岁但是在我减肥之前我确定他身体比我好。他们2个年轻的时候做过几次正确的投资,现在衣食无忧,自己没事弄点小买卖充实一下无聊的日子,按照我妈的话,这辈子剩下的事情就是等我结婚报孙子。

但是很明显,作为一个26岁,要啥没啥,连个稳定收入都没有的闲杂人等,到哪里给她找儿媳妇去?

2014

2014年我有2个比较大的计划需要尝试。抽象来说,就是给自己找一个大的平台。在这几年来,我深刻的认识到了自己的见识、理解还是能力都远远不够。不得不承认我可能错过了我人生中的第一次机会。我需要的是一个大的平台,让我从中学习理解这个行业。一个是出国,一个是去一家大公司,而且在一个不错的部门里面。我还没有找到这个大平台,但是我能确定一点的是,这个平台是符合主流价值观的。因为我这几年来偏离太多,虽然我自己收获不小,但是我希望能够走一些别人走过的路。最近的1个月来,自己一直在忙这2件事情,估计最晚需要忙到明年6月份。那句老话说得好,人无远虑,必有近忧。我现在还没有办法估计5年后的事情,因为我5年前每一年做的事情,都没有重复的,而且都是某种程度上面不一样的。我唯一能确定的就是2014年,也是一个完全不一样的一年。而且是我人生中最重要的一年。如果我找到一个平台,那么意味着我2013年成为一个美丽的间隔年,而如果没有,那么就是又一个非常大的教训。

困惑 2015-2018

上面的是我在一个月前写的,这几天我一直再思考一个问题,今天又失眠了。我未来的5年应该是什么打算呢?一直想不清楚,所以也不知道该如何写下去。其中有一个很重要的事情,就是成家是否在我的计划之中,同时它还附带了户口,房子,小孩上学等一系列问题。太原眼下,甚至是3年都很难有适合我的工作,但是生活还是未来小孩上学太原都要比北京的条件要好不少。花大量的时间和金钱拿一个北京的户口和房子值么?还是在太原的投资回报率高?抛开工作,太原的生活显然比北京舒适。但问问自己,甘心么?这一切都好难说。而且很多事情还涉及到父母,不是我一个人说了算,头疼。希望2014年底,我可以有一个自己的答案。恩,是希望,不是必须完成的事情。

百度面试

| Comments

百度移动云可穿戴部门的面试经历,面试官都非常热情友好,一上来到弄的我挺不好意思的。下面记录一下自己的面试过程,因为我真的没啥面试经验,需要总结下。

1面

  • Objective C runtime library:Objective C的对象模型,block的底层实现结构,消息发送,消息转发,这些都需要背后C一层的描述,内存管理。
  • Core Data:中多线程中处理大量数据同步时的操作。
  • Multithreading:什么时候处理多线程,几种方式,优缺点。
  • Delegate, Notification,KVO, other 优缺点

runtime有一点追问,category,method 的实现机制,class的载入过程。 1面整体感觉不错,40分钟不到,感觉回答的还可以。被通知一会儿二面。

2面

二面的时间非常长,差不多将近3个小时,直接面到快下班了。1面问的主要是知识点。2面问主要考察的是设计解决方案的能力,另外辅助追问的方式,考察深度和广度,回答过程中需要列出适合的具体例子,方案还需要细致到具体的关键的函数名称,方法。另外考察设计模式的理解,最后还考了算法。因为时间太长,这里记录一些重要的问题。

  1. 设计一个progress bar解决方案,追问到 Core Graphic、CGPath、maskLayer。
  2. 设计一个popup view被追问到 keyWindow、UIWindow的layer、UIView hierarchy。
  3. 从设计模式的角度分析Delegate、Notification、KVO的区别。被追问到自己写的library和开源的项目中用到哪些设计模式,为什么使用,有哪些好处和坏处,现在能否改进。
  4. 算是问题3的追问,设计一个方案来检测KVO的同步异步问题。willChange和 didChange的不同点,然后被追问到有没有其他地方也有类似情况,被追问到Core Data 中falut object。
  5. 这个是问题4的追问,设计一个KVO系统。
  6. Multithreading,什么时候采用Multithreading方案,以及理由。追问到系统还有哪些在后台运行的thread,被追问到view life cycle、iOS6之后的不同以及内存管理。
  7. Multithreading中常常遇到的问题,追问到死锁,优先级翻转,线程池等。
  8. 百度有一个亿级别的APP需要统计用户行为的日志系统。不使用数据库,只是使用普通文件,设计一个系统。被追问到内存映射文件。这个问题本来是服务器的问题,我表示从来没做过,回答很瞎。

算法考了2个。一个是如何求2个集合的交集。另一个是百亿数据中查找相同的数字以及出现的次数。

最后还补充了几个小问题

  • 自己对可穿戴设备的感受
  • 自己如果进入这个team,自己准备做那方面的事情
  • 为什么创业,自己未来规划

一会被告知3面,但是因为太晚,约到次日下午3面。

3面

3面的时间和1面差不多40分钟,问了几个问题,主要是考察精神层面的东西。

  • 为什么做Windows Mobile
  • 为什么改iOS
  • 为什么来百度
  • 为什么iPhone 可以成功,那些吸引你
  • 如何看待AppStore 现在的生态圈

后面就是他说的多一些,介绍团队遇到的困难以及14年团队的打算。最后他给了我2句话的评价,我觉得还是蛮对的。

  • 选择的时候都是经过深思熟虑的
  • 有野心,wanna make a difference

有意思的是,他说他也wanna make a difference。

总结

整体还是挺尴尬的,几乎所有的知识点都是1,2年前积累的,13年积累的东西基本上没有,都是一些虚的东西。 2面挺好的,暴露了自己不少问题,设计模式那部分几乎没有概念了。

最后

面试通过,我个人觉得2面我的问题在思考设计模式上面少,另外在window hierarchy 上面有不足。设计 KVO 上面在 didChange上面考虑不足。这些都是被当场戳穿的。 有一点疑虑的是整个面试中并没有问到Core Animation。这个还是我蛮喜欢的部分。Anyway 个人很喜欢追问的方式,很容易考察出来理解的深度和广度。

整个面试收获很大,发现了很多不足。另外1,2面的面试题目个人觉得也不错。这里分享给大家。