Yoosee(有看头)是技威早期开发的一款专业的视频监控APP,为技威方案智能家居产品提供一站式功能支持与服务。
随着接入的设备类型逐年增多,APP功能及业务逻辑日渐复杂,产品体验与研发效率之间的矛盾越来越明显。体验方面,崩溃、卡顿、响应慢、发热等问题趋于严重;研发方面,技术方案混乱、代码臃肿、逻辑算法冗余而低效,模块间耦合严重,APP变得难以迭代更新。
综合以上因素,重构之路,势在必行!
重构不仅要求开发人员熟悉旧项目代码,更要熟悉APP原有业务功能,因此,一般都是由老员工牵头负责的,但由于缺少前期相关开发文档,历史遗留问题也很多,加上人员变动和其他工作内容并行,重构项目承受着巨大的压力。
在有限的人力和时间条件下,我们必须在内容上有所取舍,分阶段完成任务。权衡了重要程度、代码质量、历史问题等多方面关系,我们决定第一阶段优先重构设备列表、设备监控、消息列表、消息通知、设备回放五大模块;第二阶段开始重构SDK、设备配网、设备设置、登录、影像、增值业务等模块;第三阶段是项目组件化,它能够让代码看起来像搭积木一样简单,新品开发、业务分离将不再从零开始。
由于历史原因,项目中存在许多代码与文档和注释有出入的地方,甚至连文档和注释都没有的情况,我们只能通过向其他同事请教或者在设备上验证的方法得到答案,争取做到不漏改、不乱改。对重构的代码我们要求简洁易读,复杂的逻辑要有注释。重构的目的不仅是要将项目代码写好,更是要输出优秀的产品,而良好的编程习惯则是大前提。
技术方案选型上,我们结合Yoosee现有业务模型,适当考虑了将来可能发生的业务变更, 参考大量优秀开源项目及技术文章,对不同技术方案进行多方位考量,遵循收益最大化原则, 再通过讨论选出最佳解决方案。
Swift是苹果公司2014年推出的一门编程语言,它吸收了诸多高级语言的优点,让代码更简洁、灵活、高效,如今Swift已经取代OC成为iOS开发主流, 因此使用Swift重写将是明智之举。而对于未重构的部分,我们采用Swift+OC+C的混编方式,用URL路由方式解决跨语言调用产生的耦合问题,既能隔离新旧代码,也保留了部分原有功能,有助于快速完成第一阶段重构目标。
项目主体采用MVVM框架+RAC响应式编程思想,摒弃原生的MVC框架,使得业务逻辑与UI视图能很好分离,最大化复用代码,也便于进行单元测试,同时为第三阶段实施组件化方案奠定基础。得益于MVVM+RAC的结合,我们不需要每次逻辑输出都要手动刷新UI,而是只需将逻辑输出与UI刷新绑定即可,极大简化了业务处理流程。
网络请求和多线程是本次重构的重点。对于繁重无限制的网络请求,我们采用优先级调度队列,自动根据时间、请求次数及网络回调进行淘汰算法,此策略同时减轻了APP、设备和服务器三方压力。对于泛滥的多线程及无限循环的存在,首先是不利于代码管理,其次是这种调度算法对CPU造成压力,我们重新设计了代码结构,将同一种任务放到同一个任务队列中,由系统根据任务情况自动分派线程,既保证了队列中任务的线程安全,也充分利用多核处理器的优势。
很难想象一个源文件有上万行代码是怎样恐怖的存在,旧项目中存在大量冗余代码,一个细微的UI调整往往需要修改十几个地方。重复而杂乱的工具类和基础类演变为垃圾堆,历史经验表明“common”是垃圾堆的始作俑者。为此,我们花费大量精力对其做了精简和优化,既要拒绝重复造轮子,又要防止造超级轮子。很多文件中存在大量重复代码,我们将其抽取出来,独立于业务逻辑,同时为系统类扩展了很多常用方法,在第三阶段我们会将这些公共方法分类下沉到底层,供上层模块复用。秉承不重复造轮子的理念,我们还选用了20+个稳定可靠的第三方库,以加快项目进度。
历时半年,重构版v5.0于今年6月13日正式上线,这是一个值得举杯同庆的日子。此次重构占用了大量研发资源,但结果无疑是令人欣慰的。从研发角度看,解决了300+个bug,其中历史遗留问题约占30%,代码更健壮了、可读性更好了、迭代更新更敏捷了;相反的,CPU占用率、内存占用率、耗电量、网络带宽占用率等指标至少降低了50%;更棒的是,从产品体验上来看,在流畅度、稳定性、响应速度、交互体验等方面至少提升了一倍。
这一次我们重新确立了项目框架、使用了Swift语言、RAC响应式等前沿技术方案,以更加规范的编程习惯、更加高效的逻辑算法,编写出简洁、高效、灵活的代码,带来了更加优秀的产品体验,为将来走得更快更远奠定了良好的基础。
重构第一阶段落下帷幕,这个版本无疑是开创了新纪元,是具有里程碑纪念意义的。然而,重构的意义不在于“扶大厦之将倾”,更在于“防微患于未然”。我们不会止步于此,因为任何事情都不能一劳永逸,随着技术的进步、业务的发展,新的挑战也会迎面而来。为了避免将来大规模重构,我们应当紧跟技术发展潮流,重视规范和编程思想,加强团队技术交流,定期组织代码评审,将重构融入日常开发中,不断完善与优化。
网友评论