>

第七章

去年今日此门中,人面桃花相映红。人面不知何处去,桃花依旧笑春风。

iOS知识结构

计算机三大知识结构:数据结构和算法,网络,操作系统。

这里陈硕在知乎上有个补充:https://www.zhihu.com/question/21405835,主要是谈到了计算机体系结构,这一块涉及到各个层面知识的串联和整合。

本文不会讲的很详细,只是简单罗列一些知识点及其应用场景,具体怎么做不会展开。

主要分几块的内容:iOS开发相关,计算机知识结构,软实力和职业规划。

一、iOS相关

1.iOS基础知识

OC语法,类别(系统类与自定义类的函数覆盖),协议与多重继承的关系,继承是用什么数据结构实现的(C++和OC)

引用计数与内存管理,ARC下什么情况需要自己管理内存

atomic的含义与内部实现,block是否必须用copy修饰?

数据库基础操作(sqlite)

NSThread/NSOperation/GCD使用

事件响应链与事件派发传递流程

H5与OC的交互

2.iOS进阶知识

UI方面:CALayer与CoreAnimation做动画,CoreGraphic绘图,TextKit/CoreText图文混排。

正则表达式

图层混合,离屏渲染的原因及解决方案

UITableView卡顿及其解决方法

OC对象模型,isa与super指向图(可以增加函数和isa混写的基础)

KVC/KVO实现原理,ARC,weak的实现原理,关联对象的原理,自动释放池的实现原理,(可变)数组和字典的实现原理

method swizzle和 isa swizzle

Block的实现原理与破解参数(方法签名),循环引用与解决方案

runtime的应用

runloop的原理与应用(对应安卓的looper以及前端的event loop),与线程的关系,子线程如何保活与销毁

GCD原理(线程池实现原理)

消息转发的流程,如何避免不能识别的方法崩溃

内存泄漏的常见场景及其解决方法,如何查找内存泄漏

Xcode如何调试EXC_BAD_ACCESS,常用LLDB调试命令有哪些

如何保证线程安全,比如数据库/文件/变量

NSProxy,NSHashTable与NSMapTable的应用场景

3.高阶

从HTTP请求到UIView渲染的流程和原理

JavascriptCore的原理

runtime的原理

崩溃库的原理,PLCrashreporter/KSCrash

卡顿监控和抓堆栈的原理

崩溃日志解析流程

APP与extension是如何共享数据的,Macport底层是用哪一种进程间通信方式来实现的

4.开源库

AFNetworking

SDWebImage/FastImageCache

YYCache

MJExtension/YYModel

ASDK

5.技术专项

安装包size

启动时间

流畅性/帧率

稳定性与主线程卡顿

内存消耗与内存泄漏

CPU使用率

网络优化(含弱网)

长连接心跳策略(参考微信)

6.质量相关

代码规范

持续集成

自动化测试

7.其他

直播几种协议的优缺点,如何性能调优,

直播是如何拿到第一帧开始显示的,直播的四大性能指标(直播的四大指标:画质、卡顿率、延时、秒开。画质和卡顿率要看传说的码率,码率高画质高,卡顿率也可能增大。延时跟直播协议直接相关。秒开则主要是减少GOP,即减少 I 帧在视频流的间隔。)

逆向

下拉刷新原理

数据安全(沙盒,HTTPS/二次加密,单次登录token)

代码安全(混淆加固)

音视频处理等特定领域,OpenGL,FFmpeg

二、计算机基础知识

1.网络知识

HTTP/HTTPS(握手流程)

DNS(劫持)

TCP三次握手四次挥手/慢启动/滑动窗口/流量控制/拥塞控制/快速重传/延迟应答/捎带应答,Dos攻击与防护

第三次握手或第四次挥手如果丢包会如何处理?

UDP及其应用

IP(IPV4与IPV6)与数据链路

cookie与session的区别和联系

公钥加密算法,证书信任链和数字签名

HTTP短连接和长连接的区别和联系

从浏览器输入一个字符串后发生了什么?

2.数据结构和算法

数组,链表,哈希表的实现原理

串和KMP

二叉树,二叉排序树,AVL二叉平衡树,红黑树,B数和B+树

队列,栈和堆及其应用

图的最小连接路径(最小生成图),广度遍历与深度遍历

排序和查找算法,不同排序算法的适用场景,如何选择

递归与分治,动态规划和贪心算法

3.操作系统

进程和线程,进程间通信和线程间通信的方式

进程的内存分布区域:代码区,常量区,数据区(已初始化和未初始化),堆和栈

不同锁的区别,什么情况下会死锁,怎么解决

存储管理与置换/淘汰算法

文件系统、数据库索引和B树B+树的关联

多处理机,多计算机和分布式系统的概念

用户态和内核态,用户线程和内核线程的关系/如何切换/映射关系

BSD层和Mach层

4.设计模式和面向对象设计原则

MVC,MVVM,单例,代理,观察者,中介者,组合模式

工厂模式/简单工厂

单一原则,依赖倒置原则,接口隔离原则,迪米特原则(最小知识原则),

无环依赖原则,开闭原则,里氏替换原则

时序图,流程图,UML类图,框架图

三、软实力

沟通与表达

总结复盘与提炼/升华

支撑业务与个人成长/团队成长

个人与团队影响力(技术总结,SDK,培训等给其他团队带来价值)

四、职业规划

技术专家 or 技术管理

全栈 or 架构师

目前看到的国内的现象是,技术管理并不见得核心竞争力有多强,而且换公司之后的可复用性和可落地性,比走技术深度路线似乎更难。

另外全栈工程师的确很厉害,无论在创业公司还是大厂都很喜欢,但是全栈一定要有自己特别擅长的领域,就是说还是T型人才的路子,如果一个领域的技术都不深入,成为每个都会一点每个都不精的万金油,也很尴尬。

架构师的价值主要体现在服务器端,客户端来说,除非产品的DAU在百万以上,否则架构设计真正在推动项目往前走所体现的价值,并没有多大,也就是说,如果业务做不起来,架构设计的再精妙再先进,都没办法创造价值。而往往架构师又是脱离一线业务的,所以你会发现基本架构师都是在大厂的基础架构组做支撑,或者在某个明星项目里成为核心主力,但是在一般的创业公司,或者中小型的公司,则不见得都设有该岗位。。

整体上,技术方向也有风口这一说法,比如大数据在2013年那会儿就很火,千人千面的推荐算法很受欢迎,大厂招人给的溢价也高。现在则是人工智能的子分支,比如计算机视觉里的人脸识别,声音识别,或者自动驾驶等比较火爆。基本上要获得溢价,都是要在某个技术受欢迎,大厂愿意投资,而市场上人才比较紧缺的时候才行。一旦人才供需平衡了,或者技术的风口过了,溢价也容易往下掉。对于普通人来说,如果能抓住某次溢价,把身价往上走一个两个台阶,那还是很爽的,不过现在技术发展越来越成熟,往后的技术风口上的技术,门槛越来越高,像人工智能/自动驾驶这种,已经不是普通本科生能够靠自学学会的了,也不是普通智商的人能玩的转的。平常心吧~

网上看到的一个大神

从图中的描述里,可以看出大神的过人之处,可以以此为榜样去学习和进步~

写在最后

技术能力的提升不是一个线性增长的过程,当你各方面的基础知识基本过关了之后,如果之后不知道如何深入可以尝试去做一些技术专项,最好是跟自己公司的项目有关联的技术专项,既能提升自己在某一块的技术水平,也能对公司有帮助,这是一个互惠互利的过程。

抛开音/视频,AR/VR这种特定领域的技术来说,在通用的技术栈上,如果不知道怎么继续深入了,那就去学习操作系统吧,深挖操作系统的原理和实现,会有很大的好处。目前本菜鸡也在往这个方向深入学习,希望跟大家共勉~

支付二维码

ios开发

0

« 崩溃和卡顿

#