没几天就是圣诞节,又没几天就是元旦,再没有多少天就是春节。一个是洋人的新年,一个是日历上的新年,一个是国人的新年。一个接着一个,都是在说旧岁过而新年始。去年的时候也写过一篇记录。有时看了一下,会觉得回顾和反思中能发现一些过去忽略掉了的事情。今年也是快终了了,继续这个优良的传统。也写一下自己的2016。
今年还是在百度做了一年,主要的方向偏架构和性能优化。花了一年的时间做了网络层的优化和工程效率优化。
关于网络是做的最多的,因为要优化整体的响应时间。对这块做了一些深入的了解。对于HTTP1.1,HTTP2,spdy,http2,tcp,https,tls等有了一个系统化的认知。把他们的文档还有apple网络相关的文档读了又读。收获颇丰。
读文档是个收获非常大的事情。
重构了这边的网络库,用流程建模的思想建立的整体的网络模型。并且为了优化速度,使用了httpdns和HTTP层的心跳强制激活TCP链接。对于包大小的优化,提出了有效负荷的概念。通过必要参数与非必要参数之比,来知道优化包体积。做这个事情,还是略微有些成就感的。只是后期上线的过程很熬人。一个是效果数据收集之路,因为原有基础功能的坑,波折不断。一个是APP突然有段时间,老大说crash率很关键。app那边的人在没有明确的crash log做为依据的情况下,非得说是网络库导致,很有此锅你来背的味道。多番周旋,他们依旧拿不出证据,而且依旧在说:我感觉,就是因为这个。直到现在我都很讨厌这种很不工程师化的解决问题的方式:不依赖逻辑和数据支撑,而是依赖我感觉。虽然他们没有如愿,但也因此得罪了几个人。
其次是,对于模块化的研究。包括通过机制与策略分离来进行模块拆解和模块层次划分。这里理论是自己总结出来的,而且在实践中有多有收获。对于工程效率的优化裨益颇大。我们从SVN迁移到了Git,使用了Git分库的策略。把中间产物framework干掉使用了完全源码的方案。方便了调试和开发。
开发者体验很重要,这个制约着工程进度和质量
在业余时间也做了几个APP,诚意财富,速记还有哟呵校园。其中哟呵校园是个比较又意思的项目。我们只说技术层面的东西,产品和商业策略暂且阁下不表。在这个项目中自己设计并实践了大量的技术创新。有些时候开发者那些无处安放的创造力,需要自己在业务时间去找到合适的项目安放。
关于源码和权限管理使用了repo+git+cocoapods的方案。源码完全托管在自己的阿里云服务器上,使用phabricator开源的服务器。这个工程管理也可以做到。
关于自动化流程使用了Jekins持续构建,用蒲公英进行部署。后来又加入了fastlane+testflight的方式。一个测试包,一个正式包。
本来想把CR的流程也加入进来的,但是可惜只有我一个人。自己Review自己也很是没劲。功能有了,但是一直没用。
还有持续测试,建立了对应的UI测试和单元测试,这块也是刚开始搞,后面会花点时间在这上面。使用Monkey测了稳定性。
对业务模块和底层库进行了比较彻底的拆解,加上第三方的库,现在整个工程中有118个pod。也是蛮大的了。其中很多是自己在做的工程中,抽离出来的业务无关可多工程复用的库,想以后要是做其他APP也会省事很多。
拆啊拆啊拆啊,拆完之后去胶合
为了让业务模块之间低耦合,采用了URL的方案DZURLRoute,来进行资源发现。每个模块之间的调用完全使用URL的方案。
在代码复用,尤其是组合式复用的方向上。进行了思考和时间,设计了ElmentKit这个库,来实现基于TableView和Collection的一整套的复用机制。并且实现了UI和底层控制逻辑的分离。UI与控制逻辑Logic之间低耦合。同一个Logic可以对应不同的UI,同一个UI也可以复用在不同的Logic。这个来说,应该是今年比较大的成就。并且设计并实现了StyleSheet这个库,用于UI样式的复用化编程。
AOP面向协议编程,这个在今年也有很大的进步。前几年在手Q设计红点的时候,就进行过尝试。而今年,将这个东西进行了总结。实现了MRInjectionLogic这个库,用于AOP编程的基础。对Instance进行逻辑注入。并在此基础上显现了MagicRemind和DZDeneyRepeat等功能库。同时还有DZViewControllerAction这个库,设计并实现了针对于iOS中常见的UIViewController进行逻辑注入和AOP编程的基础,这个库提供了两个方式:一种是全局注入,一种是实例注入。在这个的基础上,做到一些有意思的事情,比如某些业务逻辑轻松的从具体的场景中抽离,可以复用在其他地方。比如很多判断firstappear执行固定逻辑的东西,现在不用在父类里面写,现在可以单独作为一个Action的子类去时间逻辑,在需要的ViewController的instance地方register一下就好了。
哟呵这个APP用了TCP+PB的方案作为网络通信层的方案,借着这个机会对于TCP的又有了一个深层次的认知。从TCP之上一点点的去写网络层还是比较有挑战的,尤其是实现一套类似于NSURLSession的API。不过最后还是写出来了,哈哈
其他的就是一些零零散散的小功能,将他做成了类库,比如用户Session的管理了,账户相关的内存数据的注册和清理了之类的….不详细说了。
还有个事情需要记录一下,几年开始尝试量化炒股。使用JoinQuant做为策略平台,跑了最小市值的策略。自己Hack了mac版的富途牛牛,在里面注入了一个CocoaHttp的server用于接受交易指令,直接服用富途牛牛的交易系统去做实盘交易。这个只是把整理流程跑通了,不敢往里面放钱。也一直是在虚拟交易跑着。虽然会走到自己mac上跑的程序上去。这里还是用了各种内网穿透的东西。在自己的Airport上做了端口映射,并用nas做跳板访问自己的机器。非常折腾。