WOT谯洪敏:滴滴前端工程化思维

· 团队成员越来越多

· 跨团队协作越来越多

· 业务系统越来越复杂

· 框架越来越多

· 性能要求越来越高

· 可维护性越来越差

滴滴出行租售业务前端负责人谯洪敏在WOT2018全球软件与运维技术峰会上从组件与模块设计理念,复用性、规范化、效率工具、基于Git-flow的分支管理和埋点等方面对以上前端问题进行了详细的讲解。

WOT谯洪敏:滴滴前端工程化思维

图1 滴滴出行租售前端负责人谯洪敏

WOT谯洪敏:滴滴前端工程化思维

组件与模块设计理念

随着web应用系统的复杂度不断提升,需要兼顾开发效率和产品实际运行效率,而组件化和模块化的价值又在于分治,所以会在开发阶段运用组件化和模块化的手段分离关注点,结合构建工具合理打包。

而组件与模块另一个价值——粒度控制,需要在运行前进行粒度拆分,拆分后最细的粒度是UI, 而在架构上,CORE和Bridge JS、增量更新等也是不可忽略的一部分。

粒度控制

WOT谯洪敏:滴滴前端工程化思维

图2 粒度控制架构图

粒度控制在级别上又可拆分成UI级、BC业务组件级、Page页面级、Module模块级、项目级(UI之上是BC业务组件、BC组成Page、Page组成功能模块、功能模块组成业务模块、业务模块汇聚成一个系统。)。由于国内组件和解决方案太多,谯洪敏老师认为可以把有效的时间放到BC业务组件级和Page页面级方面。

对于那些复杂、无规范性和大量依赖的架构来说,架构的治理也显得必不可少,目前为止最好的方式就是同时集成SPA(single page web application,单页Web应用)和MPA(多页)的优点,整合出具有SPA的高效体验,加上MPA的灵活性,避免大型SPA的内存管理困难及臃肿。按照微服务的理念,把混乱的服务依赖有条理的进行梳理,让整个前后端的整理可维护性更强。另外在接入层就可以给前端暴露比较规范的API(Application Programming Interface,应用程序编程接口),这样前后端的结合才会更加顺畅。

如果说架构是软件搭建的骨架,那么代码就是骨架上的血肉。架构的问题在于复杂、无规则,而代码的问题在于不同需求同时开发的代码合并该如何解决。在分支管理出现之前,代码合并是编码人员最头疼的问题之一,在经过分支改造以后,这一难题迎刃而解,其中最好的模式,就是Git-flow,现在,在基础上不断的进化之后,Git-flow已经是业界最佳的实践了。

基于Git-flow的分支管理

WOT谯洪敏:滴滴前端工程化思维

图3 Git-flow分支管理

在Git-flow的分支模型中,有两个主分支master和develop,还有几个额外的分支来支持代码的版本管理。下面先简要介绍一下这些分支的特点。

1. master

·master分支只有一个,基于master上线,上线前打tag标识。

·master分支上的代码总是稳定的,随时可以发布出去。

·平时一般不在master分支上操作,当release分支和hotfix分支合并代码到master分支上时,master上代码才会更新。

·当仓库创建时,master分支会自己创建。

2. develop

develop分支只有一个。

新特性的开发是基于develop分支的,但不直接在develop分支上开发业务需求,特性的开发是在feature分支上进行,develop分支永远是融合最快且最不稳定的分支,这种不稳定会有很多好处,因为团队成员在协作的过程中不断的面对这种不稳定,也就可以及早发现问题。

当develop分支上的特性足够多以至于可以进行新版本的发布时,可以基于develop分支创建release分支。

3. feature

可以同时存在多个feature分支,新需求特性的开发正是在此分支上面。

可以对每个新特性创建一个新的feature分支,当该特性开发完毕,将此feature分支合并到develop分支。

4. release

当完成了特性的开发,并且将feature分支上的内容融入到develop分支上,这时可以开始着手准备新版本的发布,release分支正是作为发布而开设的分支。

release分支是多个即将上线的feature分支融合而成,其生命周期较短,只是为了发布而使用。这意味着,在release分支上,只是进行较少代码修改,比如bug的修复,原有功能的完善等。不允许在release分支增加较大的功能,因为这样会导致release分支的不稳定,不利于发布的进行。

5. hotfix

当发现master分支出现一个需要紧急修复的bug,可以使用hotfix分支。hotfix分支基于master分支,是用来修复bug的,当完成bug的修复工作后,需要将其融回master分支,但其生命周期较短。

根据各分支的功能可以分成核心分支、功能分支、发布分支、维护分支。

核心分支

· master分支对应线上实际发布版本

·develop分支作为功能的集成分支

WOT谯洪敏:滴滴前端工程化思维

图4 核心分支

功能分支

·feature自己的分支从develop分支拉出

·功能完成后再合并进develop分支

WOT谯洪敏:滴滴前端工程化思维

图5 功能分支

发布分支

· release分支从develop分支切出但只做bug修复等工作

·发布准备做完后再合并进master分支并打上tag,同时合并进develop分支

WOT谯洪敏:滴滴前端工程化思维

图6 发布分支


维护分支

·hotfix分支从master分支切出做补丁修复

· 修复完成合并进master分支并打上tag,同时合并进develop分支

WOT谯洪敏:滴滴前端工程化思维

图7 维护分支

分支的使用可以将每个开发者从开发主线上分离开(即脱离主分支),然后在不影响主线的同时继续编程工作,但Git-flow的分支是”与众不同”的,无论创建、切换和删除分支,Git-flow在1秒钟之内就能完成,大大提高了分支效率。但是随着互联网公司越来越关注数据的转化、新增、留存,编程人员已经不满足于解决分支管理的问题了,而是放眼到数据采集问题上,所以“埋点”又成为一项重中之重的任务。

埋点

所谓“埋点”就是在数据采集领域(尤其是用户行为数据采集领域),针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。“埋点”基本可以分为三大类:手工埋点、可视化埋点和无埋点。

手工埋点(手动埋点)

手动埋点让使用者可以方便地设置自定义属性、自定义事件。所以当需要深入下钻,并精细化自定义分析时,比较适合使用手动埋点。但是手工埋点也有缺点,当项目工程量大时,需要埋点的位置就会增加,而且需要产品开发运营之间相互反复沟通,容易出现手动差错,如果出现错误,重新埋点的成本也很高。这会导致整个数据收集周期变的很长,收集成本变的很高,而且效率很低。因为手动埋点需要开发人员完成,所以每次有埋点更新,或者漏埋点,都需要重新进行上线发布流程,更新成本也高,对线上系统稳定性也有一定危害。

可视化埋点(框架式埋点、无痕埋点)

可视化埋点解决了纯手动埋点的开发成本和更新成本问题,通过可视化工具快速配置采集节点(圈点),在前端自动解析配置,并根据配置上传埋点数据,比起手动埋点更无痕,配置数据可以设置过滤条件,避免针对所有元素(比如全埋点),可以在调用开启自动监控API时通过设置特征属性来过滤不符合条件的元素,实现只针对某些元素进行自动上报数据的需求。

可视化埋点配置化能力相对手动埋点更强,是对手动埋点的补充而不是代替,很多手动埋点都可以通过好的规划和架构变为可视化埋点。

无埋点(自动埋点、全埋点)

无埋点并不是没有任何埋点,所谓“无”只是不需要工程师在业务代码里面插入侵入式的代码。只需要简单的加载一段定义好的SDK(Software Development Kit,软件开发工具包)代码,技术门槛更低,使用与部署简单,避免了需求变更、埋点错误导致的重新埋点。

通过这个SDK代码,前端会自动全量采集全部事件并上报埋点数据,能够呈现用户行为的每一次点击、每一次跳转、每一次登录等全量,并且可以实时监控用户行为数据,在这些数据传到后端后,可通过用户分群、漏斗对比等功能,分析不同访问来源、不同城市、不同广告来源等多维度的不同转化细节。

无埋点相比可视化埋点,在解决数据“回溯”问题上更有优势。如果想分析某一天某个控件的点击情况,在没有针对这个按钮做可视化埋点的情况下,只能从针对这个按钮做可视化配置的这一时刻之后才有埋点数据,而无埋点,则从部署SDK那一刻就一直有数据在收集。

但无埋点也有劣势,其自定义属性不灵活,传输时效性差,数据可靠性欠佳,耗费网络流量,还会增加服务器负载,而且兼容性也不佳。

相关推荐