[TOC]
iOS开发现状
目前我们在看到一个JD的时候,iOS开发一般会特指iOS互联网App开发,主要关注与用户体验和互联网交互。
这样看起来,主要有两条线,其一是互联网,其二是用户体验,所有的技能基本上都是从这两个点出发的。
我们来假定一个场景:
老板:我们需要开发活动,元旦前要上线
iOS:后台API是什么
后台:API定义好了,还没有数据,需要爬一些数据
iOS:产品稿定义好了吗
PM:产品稿已经好了
iOS:设计和交互都有了吗
交互:没问题,已经确定好了
设计:已经设计完了,还差切图就好了
iOS开始评估这个需求,然后对这个需求提出了几个问题
这个交互动画比较难搞,如果这么设计的话,元旦前做不好
这个页面是纯展示的页面,能不能让前端做
这个需求哪些地方需要埋点做数据分析,要尽快整理出来
这个页面弹窗不太符合苹果的设计规范
API什么时候有数据可以调试
QA可以开始准备用例了
这是一个典型的开发场景,对于大部分的iOS开发来讲是一个不断重复的过程,这里我们可以清楚的看到合作的不同角色以及iOS开发在其中的定位。
iOS开发 - 入门
iOS的入门是非常容易的,有一台mac基本上就可以了,买几本教程或者看看视频,很快就能入门。
为了衡量自己的水平,那么开始做自己的第一个App吧
这个时期对app开发的认知基本上就是页面,一个个的页面,不管你有多少需求,我自然可以开发出对应的页面,可以叫做页面开发工程师。可以说没有搞不定的需求,只有不合理的需求。
语言
语言是必备的工具,主要是Objective-C,这个阶段掌握OC的基本语法和应用,以及基础的OOP
系统
使用系统提供的各种framework
push
定位
相册
。。。
交互相关
页面基本上是交互的基本组成了,不同页面之间的跳转构成了app的使用路径。这个里面主要包含的技能有:
-
uikit
基本控件
tableview
布局
导航
-
简单动画
- uiview animation
互联网相关
大部分公司的API都是通过http来调用的,所以这个阶段只需要会调用http的相关库就可以了
- http
数据
因为http下载到数据基本上都会是json格式的
- json到模型
工程
这个阶段基本不关注工程,只要会用git的基础操作即可
掌握了这些技能基本上就可以开发简单的应用了,需要一些高级的功能,都可以通过第三方库来实现,所以这个阶段会说自己熟练使用和掌握各种第三方库,无非是用pod把第三方库引入进来使用罢了。
写代码速度也非常快,自动布局,模型转换,网络下载都得心应手,偶尔也会引入一些MVVM等架构的概念。
iOS开发 - 晋升之路(Dive Into)
知其然而知其所以然
开发入门之后慢慢会觉得有一种全面掌控的感觉,在慢慢遇到挫折之后会静下来思考人生。
之后会开始对之前用的东西产生怀疑,然后自己考虑实现一些第三方库或探索第三方库的源码,从优秀的代码中学习;
场景设计:PM拿着手机来找程序
PM:你看脉脉这里有一个动画,我们要做一个一样的
iOS:这个效果不错啊,好酷
。。。两分钟
PM:我们做这个效果要多久
iOS:我先研究一下~~
这个时候会扫描自己的技能列表,发现居然不能完成这个动画,怎么办?
程序员的好朋友google,stackoverflow,github能够给出大部分的答案
PM:我们的程序为啥比别人慢
PM:我们的安装包为啥比别人的大那么多
PM:有用户反映我们的app用起来发热
PM:有用户反映我们的app偷跑流量
PM:老板说要改一个文案,线上的可以改吗
PM:我们的app要根据手机壳更换主题颜色
PM:~~~
面对PM各种别出心裁的需求,入门级选手很快就慌了,还是多请教请教老司机,毕竟老司机开过的车比较多
在比较好的公司里面,技术传承是非常重要的,每个新人有一个mentor是非常重要的。
基本上在这些公司呆上两三年多,就能可以解决以上大部分多问题了。
语言
除了Objective-C之外还可能掌握Swift,Swift不是必须的。
OC Runtime,最著名的奇技淫巧如swizzle这些
OOP设计模式和设计原则SOLID
FRP,主要是RAC的应用
MVVM / MVP 等页面架构
Cocoa
对iOS系统程序的运行原理有更深的理解,能够解决一些比较诡异的bug
runloop
autorelease pool
内存管理
锁
多线程和异步开发
交互相关
除了布局之外,还对手势,事件响应过程,动画有更深入的了解
-
UIKit
layer
collectionview
页面的绘制和更新过程
页面的渲染优化
自定义手势
-
动画
页面transition动画
CA动画
displayLink动画
其他
互联网相关
对于更多的网络传输,缓存,加速等有一定的了解
-
区分url和uri
- 对url encode有深刻的了解
-
http/https
- Http2/http3(QUIC)
-
长链接
自研
websocket
等等
DNS优化
数据
除了json可能还会有各种二进制数据如protobuf等,但是更主要的还是下面这些的应用和处理
缓存
数据库
数据一致性
调试
-
lldb
- 各种断点技巧
instrument
工程
进阶路上肯定会对工程有一定对研究和使用,主要来讲就是
CI的使用和配置
-
工程的管理
pod
carthage
submoudle
编译过程和加速
单元测试和代码覆盖
Appstore
经过上面的大部分问题的洗礼,基本上就可以带人带小团队了,这个过程因人而异,可能是二三年,也可能是四五年,对于各种技术的选型和分析基本上都是没问题的
iOS开发 - 更高发展 (break out)
上面一个阶段之后一般也会有一段时间的迷茫期,很容易受网上的一些文章的影响,比如说iOS开发没有前途,移动开发要被取代等等,会对自身的价值和未来的发展产生一些疑问,这个时候就要跳出来,打破iOS开发字面的约束,才能有更高的发展。
一般情况下会在靠近的领域,比如大前端,比如全栈进行一些适量的探索。
iOS和前端
Hybrid模式是一个非常常见的模式,iOS和Android对webview进行扩充使网页可以通过js调用系统的能力,从而给前端开发带来更多的可能,实现一种快速开发,跨端的开发模式。这种情况下需要开发人员对webview有较深入的了解,对js有较好的理解。深入的话可以去了解node以及相对应的开发框架,尝试自己搭建简单的前端页面和服务。
iOS和服务器
iOS和服务器之间主要就是数据交互了,彼此之间相互了解可以解决一些问题,比如减少请求次数和流量,尝试使用非http的服务
跨平台的搅局者
Hybrid方案有天然的优势和劣势,主要劣势还是webview本身的渲染和交互会比较慢,让交互效果打折扣,所以就有了各种框架来提供,原生应用的运行效率,H5的开发效率,实现双赢,最出名的就是RN了,其次是Weex以及最近火爆的Flutter。
除了框架外,还有语言的侵入,原生iOS应用一般都是OC或Swift来开发,不过也有一些其他语言希望加入进来,早期有微软的c#,现在有Jetbrain的kotlin,以及一直期望进入的各种js衍生品,一些大牌的公司还会使用C++来开发一些核心逻辑。
开发思维的转变
从设计模式上来看有很多优秀的范例,我们可以去使用套用这些模式来解决我们代码中的结构问题,另外也要从设计模式中跳出来。
OOP思想是目前的主流思想,不过近些年的开发语言或多或少都会提到一些函数式开发语言的特性,不懂鞋函数式编程语言都不好出去聊天了,了解一些FP是很有必要的,还有GP,RP等等也都是非常常用的一些技能。
工程上的变化
面对工程的体量越来越大,更多的公司提出了自己的解决方案,不再是单纯的pod能够解决的,一个完整的工程编译一次一个小时,修改一个代码也要编译十分钟,这些都是很容易碰到的问题
更多
除了能够总结的知识,还有很多领域的知识,比如图像,视频,即时通讯,仿真,模式识别等等数也数不完的
还有
和PM相爱相杀,慢慢的也明白更多产品的思维,能够从更多的角度去思考问题
能够从团队的角度去思考,关注团队的成长和公司的成长,培养更多的人才
是去做架构还是去做管理都是见仁见智,各有发展
谈谈算法和面试
算法是不是重要,很多人都说,公司面试造核弹,入职拧螺丝,主要就是说这个了吧,很多公司都会面试算法,尤其是外企,国内公司反而是面试项目和经验更多一些,外企有的会有甚至有三四轮算法面试。
对于大部分工程师来讲,确实用不到更高深的算法,因为前头我们说了,大部分都是页面工程师,所以用不到,但是当你要做深入了,需要考虑这个问题了。
面试的时候面试算法主要是用来评价一个人的能力和潜力,顺带考察一些沟通能力,软素质等等,而针对简历和项目以及iOS知识的面试主要是来判断经验,国内公司希望到岗后马上进入需求开发阶段,所以对经验更看重一些,比如要求技术栈是一样的才能面试。外企很多更注重能力,就算你没做过iOS开发,但是通过算法和计算机的基础知识判断你是一个能力没问题的候选人也有很大几率入选。同样来讲如果候选人较多的话,肯定会综合考虑经验和能力。
刷题是非常常见和有效的,尤其是很多公司的算法题是有固定套路的,只要刷一些leetcode或者网上搜一些面试题就能准备和通过,针对这种情况,需要面试官在题目上多一些变化,并在面试的时候把这些变化拿出来讨论,不要只单独的看结果,多讨论过程比看最后的代码要好。
刷iOS知识点也很常见,这个有时候不好甄别,所以建议面试的时候拿一些具体的场景来让候选人进行设计和实现,了解其思路,是否可以有效识别其中蕴含的一些障碍和陷阱。