哈囉,大家好,版上已经很久没有 iOS 相关的分享了,而且好像没看过 Senior 的文章
我来分享最近这阵子找工作的经验抛砖引玉,看能不能吸引到各路大神来分享
先自我介绍一下,本人学历是 NTUEE 学硕,在亚东医院的系统/软件公司工作了四年,在
最后有升到 Senior,参与过的事项大概如下
1. 参与过多个 app 的维护,和新 app 开发
2. 帮忙从零开始架设内部的 Jenkins 和 fastlane
3. 从没有 framework 版控的情况导入 CocoaPods 和 SPM
搜寻职缺:
1. 求职网站:
Yourator, CakeResume, Meet.jobs 等等,大部分的职缺距离目标薪资还有一段距离,
不然就是接近上限才能达到,后来我没有从这边丢履历
2. LinkedIn Jobs:
这里比上一个方法好的是容易搜寻可远端的工作,找到感兴趣的职缺还满多的。但后来
都没有投,因为要针对公司来修改 CV 要花很多精力
3. Hunter:
后来先作了一个 CV 的样板,把 LinkedIn 的状态更改为积极求职中,就陆续有 hunter
来联络了。后来有去面试的公司都是从 hunter 来的
Hunter 推荐被拒绝:
9 Count-Wink:这家觉得我开 1.8M 太高了,他们的上限似乎是 1.4~1.5
有投还没结果:
Amazon Ring: 已经在 Ring 内部建档了,但都没消息
进到面试流程的公司:
(新公司), 17-Wave, Xendit, Omlet, Swag, Ubiquiti, Foodpanda
面试的过程都差不多:自我介绍、白板题、测验 iOS 知识、互相问问题
下面如果没有比较特别的事项就不再花篇幅介绍
底下针对每间公司顺序作介绍,新公司放到最后,因为特别想分享他们的面试题目
17-Wave:
第一部分要设计一个聊天室,包括 UI, Cache, DB, API 大概的组成。这部分都是透过口
述进行,所以没办法说得很清楚
如果可以重来的话,应该要开 draw.io 直接画出来,可以避免来回确认,也方便后续讨论
第二部分是前一部分的延伸,如果现在有高流量的讯息要怎么处理?
UI 会不会卡(DB lock, main queue 更新时机)? API 怎么变更设计? ...
这部分我应该就回答得不太好,因为我确实没有处理高流量的经验
结果:Wave 通知 hunter 结束面试
Xendit: (全英文面试)
有面试前的线上测验,十几题选择题和一题程式。
题目内容很广,除了 iOS 以外还有问一些网络、数据库方面的问题
除了有一题问 Http Auth 的完全看不懂以外,其他的我记得不会很困难
据 hunter 的回馈是他推荐的其他人选都没有通过测验就是了
通过测验之后与技术主管面试,刚好前一天去打疫苗,面试的时候头昏昏的
连我自己都觉得讲得很烂,不到半小时就结束面试QQ
结果:Xendit 通知 hunter 结束面试
Omlet:
这家的产品不太作宣传,但用户数量满惊人的,应该是满有潜力的公司
有面试前的作业,内容不能透漏,有测验到的技能是:
data decode, UICollectionView,还有一个加分项目
通过测验之后到现场面试,一次来四个面试官。面试过程没有比较特别的题目
考了两题算法,和一个实作画面(怎么拆 view, 比较复杂的 autolayout 设定)
另外公司有一定比例的外籍人士,有一段面试过程要求用英文回答
结果:隔天收到感谢函
Swag:
有两题面试前的题目,我判断难度应该都是 easy
通过测验之后到现场面试,问问题的过程中,感觉到特别注重 GCD 系列 api 的用法
sync, async, serial concurrent, semaphore, group 等等
履历的部分问得非常详细,是所有面试的公司问得最多的,应该是所有写到的东西都问了
像是我写到有 RxSwift 的经验,就问了导入的时候有遇到什么困难、怎么处理,另外问知
不知道 Rx 后面的原理(Observer),怎么实作
另外我有提到 UI/Unit test, refactor,就问了是从专案的什么方向切入开始作,策略是
什么,怎么兼顾 release 的时程
后面还问了很多以前团队运作的流程、怎么协作分工,以及各式各样的问题。应该是把所
有能想到的东西都问了一遍,是所有面试里面耗时最长的,花了两个小时左右
*很重要的一点,这里以后的主力会是 Flutter 开发,不过团队偏小,我记得目前是5人
结果:等待中
Ubiquiti:
团队目前有这在开发的产品,IOT相关,我猜应该和 Amazon Ring 是类似的东西,但是
Ubiquiti 有网通产品,应该有比较深度的整合。进去之后会加入这个团队
没有问比较特别的问题
结果:收到其他 offer 了,通知 hunter 结束面试
Foodpanda: (全英文面试)
有两题面试前的题目,我判断难度也都是 easy。限时一小时,我19分钟完成 AC 100%
通过测验之后由新加坡的人资面是,根据资我介绍和履历的内容询问过去的经验
另外特别提到目前团队主要使用 MVVM, VIPER
结果:太晚开始这间的面试,加上我判断可能难以 compete offer,婉拒后续面试
新公司: (全英文面试)
第一关: mobile head - 问答 (一小时)
一开始介绍公司的产品,内部的开发流程、团队组成
接下来问了一些 iOS 相关的问题,没有太深入,不过有问到一些没那么常用的 api
- frame, bounds 的区别
- 解释 autolayout 的 compress, hugging priority
第二关: iOS Developer - live coding (一小时)
第一大题是给一个截图实作目标画面,并且从指定的 api 拉资料
先用假资料来把画面建出来:UI 的部分是 CompositionalLayout, DiffableDataSource,
CellRegistration,资料部分是 Codable,这里应该都算基本功
再来是要从 url 下载图片显示到 cell 里,这里就注意 background 和 main 切换
再来问分页式的 api 要在什么时机呼叫,让画面可以随着卷动加载更多资料
第二大题要实作一个 UIScrollView subclass,让他可以有好多个 delegate
有要求一个接口来新增 delegate ( addDelegate(_ delegate: UIScrollViewDelegate )
我的作法是这样
1. init 之后设定 self.delegate = self
2. 宣告一个容器来装所有 delegate (var delegates: [UIScrollViewDelegate])
3. 实作每个 delegate function,传给第二步容器内的每个元素
不过这里有个陷阱是 Swift 并没有 weak array,但又必须让 delegate 是 weak ref
这里有想了一下,在面试官稍微提示之后想出来
第三题问知不知道 Optional 的实作,是两个 Case 的 enum (应该是常识?)
第四题先要我解释一下 weak, strong ref,然后问怎么实作一个像 ARC 的系统
这里的话就是先分析一下 ARC 的规则:
1. A ref B, B ref count +1
2. ref count 归零,物件 release
第一条规则就是系统需要记住 B 被哪些人 ref,这个关系和物件被持有的方向是反过来的
第二条规则就是 A 被 release 之后,需要类似 notification 的机制找到所有被 A ref
的物件,然后把 A 从 ref list 删除
这一关的面试应该算非常顺利,有被面试官称赞对 api 很熟悉,比较困难的部分也在一点
点提示之后就想出解法,面试官看起来很意外,一直被称赞
本来一小时的安排应该只有前两大题,因为前面比较顺利所以又多了后面的部分
第三关: iOS lead - live pseudo coding
考的是系统设计,题目是设计一个西洋棋的系统,让两个玩家可以进行游戏,不用考虑 AI
我的设计是分成 Player, protocol Piece, GameRunner
判断棋子移动和吃子规则写在十作 Piece 的 type 里面
GameRunner 会记录盘面,判断获胜条件等等的
follow up 问:如果现在有个新种类的棋子,是骑士和城堡的合体,要怎么实作
这里就是用 composition 把新的类型实作出来
结果:offer get
薪资:>2M + RSU + sign on
最后结果是只拿到一个 offer,不过已经有达到期望,其他进行中的可能也比较难compete
不然就是要等很久,再加上密集面试也累了,就结束之后的面试
最后分享一些准备面试的心得
- 刷题?
我对白板题的看法是没有需要特别准备,除非你是新人或者要面 FAANG
我自己是刷个一两题 Easy, Medium,找一下解题的手感而已
虽然前公司也是以困难的白板题出名,但这可能是必要之恶
对新人来说,没有经历可以证明程度;对大公司来说,必须快速筛掉大量的履历
但是对 Senior 来说,对苹果生态的熟系度还有建立架构的能力我觉得比解题重要多了
工作中实际需要自己实作的可能也就 BFS, DFS,剩下的在 Foundation 都有了
- 英文能力
我认为有英文沟通的能力绝对是在职涯上更进一步的关键,但这并不表示英文能力是第一
顺位,有一定程度的实力再来加强英文可能是比较适当的做法
加强的办法我自己是多听一些 podcast 和 youtube,习惯一下各种语速和口音
准备面试的部分,可以把自我介绍的内容写成稿,然后务必要试着讲几遍
follow up 会被问的部分心里也要有大概的剧本
再来是回答的时候不要紧张,也不要太担心文法是否正确,慢慢讲,确保内容清楚就好
- 进修资源
等 Xcode compile 或是通勤的时候就可以多翻翻
1. twitter: 很多大佬都挂在上面,可以获得很多第一手踩 bug 的资讯
2. 大佬的网站,推荐几个
- General:
- John Sundell: 大佬中的大佬,特色是用不会太长的篇幅解释各种观念和语法
另外有经营 podcast,邀请各式各样的开发者上节目
- Hacking With Swift: 比较偏初学的资源,但偶尔还是会找到有趣的东西
- SwiftUI:
- Swift with Majid: 比较进阶的技巧,也许是奇技淫巧的范围,有点难拿捏
- Mark Moeykens: 有一些免费的电子书
3. 付费资源:
- PointFree: Composable Architecture 的作者,目前有几十小时的内容,除了介绍
TCA,我觉得更重要的是它引导 functional 观念的部分,大推
- Essential Developer: 处理架构和测试非常厉害,有在 youtube 直播 live
mentoring session,大推
4. 周报类:
- 13: 13 大大的周报
- 老司机周报: 简体中文。这里有时候混很多 Flutter 的玩意就是了,哭啊
- iOS Dev Weekly: 老字号英文周报
5. Swift 本身 Evolution, Proposal:
- 行有余力的话可以来这里看看,也可以翻翻看之前的 roadmap。了解一下大佬的思考
过程,也可以了解一下 Swift feature 是怎么产生的
大家有什么想讨论的,欢迎在下面留言
如果有什么不方便公开讨论,或是想询问我的问题,可以站内信
或是想办法找到我在其他平台的帐号直接私讯我(应该没有很难找?)