“如何快速交付”的问题一直伴随着软件行业的发展。在多年的摸索和实践中,国双不断推进技术架构的演进,引入微服务、组件化、DevOps、灰度发布等手段,建立了由一套工程实施方法论、一个应用架构和一组辅助工具集共同构成的 “积木式开发体系”。该体系有效帮助国双在保证质量的前提下快速响应、快速迭代、快速交付,在提高开发效率的同时,可以实现降低开发成本。本文整理自国双技术总监曹荣权在 QCon 全球软件开发大会(北京站)2019 上的演讲,他介绍了积木式开发体系的原理、应用及实施积木式开发体系的要点。
大家好,我是来自国双的曹荣权,从事 To B 软件研发 15 年,转战电信、能源、航空、餐饮等多个战场,熟悉客户关系管理、数字营销、忠诚度管理等多个领域。很荣幸能够参加 QCon 2019 高效开发解决方案专场,并在这里跟大家分享这些年我们在企业数字化建设中的点滴积累,以及一个 IT 老兵对于积木式开发体系的思考。
我的分享主要包含四个方面,首先我会简单介绍积木式开发体系的诞生背景以及我们所面临的问题,然后介绍具体什么是积木式开发体系,积木式开发体系都包括哪些内容,之后我会重点介绍实施积木式开发体系的要点,最后介绍积木式开发体系在国双取得的成绩。
一、积木式开发体系的诞生“积木式开发体系” 的诞生不是偶然。伴随我们的业务发展,工程效率的问题随之出现。当时,我们面临很多项目,其中比较典型有“某热力集团智慧能效系统”和“某石油生产企业可视化监控系统”,接下来简单介绍一下这两个项目。
“某热力集团智慧能效管理系统”要求我们在 2 个月内接入该热力集团旗下的一百多个热力公司、热源和换热站数据,完成数据的监测与跟踪。从能耗、能效、成本、运营质量、服务质量、环境影响等诸多维度进行数据分析,并完成一套能耗预测模型和一套机构评级体系。此外,还包括一套告警管理系统和基于告警信息的工单流转系统。
另一个项目“某石油生产企业可视化监控系统”是油井数字化的典型应用,我们要在 4 个月内接入该组织下的 200 多口油井和抽油机的数据,从“载荷”、“油压”、“套压”、“平衡度”、“产液量” 等维度对数据进行跟踪、分析。从视频、数据两大监控体系入手,通过图像识别技术和大数据技术,结合功图模型分析油井的工作状态。并对设备状态进行评估和预测,以便油企能够提前进行设备的维护、维修和保养以避免由于设备维护不及时带来的停工和损失。
这几个项目都来得比较“急”,要求我们在很短的时间内完成大量的工作。与此同时,我们也和大家一样,面临“业务”、“效率”、“质量” 三个方面的挑战。
在 业务 方面我们要思考如何兼顾 “行业通用化”和 “企业个性化”?如何响应快速变化的客户需求?如何权衡 “个体需求” 和 “整体一致性”的关系?
在 效率 方面我们要思考怎样匹配项目的资源,什么样的人才可以复用,复用率如何提高?怎样保证产品研发和项目交付的独立性?怎样能尽量少做重复性工作,退一步说怎样才能快速做好这些重复性的工作?
在 质量 方面我们在研究怎么规范研发流程,怎么提高产品质量?怎么解决系统复杂上手难的问题,提高客户满意度?
就是在这样的情况下,我们决定在工程效率方面发力研究。“积木式开发体系” 也就由此诞生。
积木式开发体系是一个梦想,试想如果开发就像小孩搭积木一样照着图纸或者想象力轻松完成那该多好。别笑,梦想还是要有的,要不然拿什么慰藉我们早起晚归疲惫不堪的身体,又拿什么慰藉我们凌晨 3 点下班走在北京街头抬眼望去只有刚上班的环卫工人相伴时那颗孤独的心。当然我们不能停留在梦想阶段,毕竟 做梦不是我们的专业,实现梦想才是 。我们循着这个梦想摸索和实践,我们得出了一套工程实施方法论、一种应用架构、一组配套工具。积木式开发体系的组成如下图所示。
积木式开发体系主要由一套工程实施方法论、一种应用架构、一组配套工具构成。
应用架构是积木式开发体系的重要基础,主要由 “界面堆叠体系” 和 “逻辑堆叠体系” 构成。
界面堆叠体系:软件界面是工程实施过程中的主要组成一部分,积木式开发体系将界面分为最终交付的 “成品”、组件化的 “零件” 及管理组件布局的 “界面装配车间” 三个部分。
逻辑堆叠体系:逻辑是工程实施过程中另外一个重头戏,积木式开发体系在逻辑组织方式上引入事件系统形成 “逻辑流水线”,和数据访问控制、安全、缓存、消息队列及 Workflow 构成的 “基础控制模块” 共同形成逻辑堆叠体系。
三、积木式开发体系的要点在打造积木式开发体系的过程中,有如下几个要点需要注意:
1. 固化渐进式“四问”思维
俗话说 “人的问题是根本性问题”,积木式开发体系中最核心的也是“人”。积木式开发体系设计要求每个参与其中的人都有渐进式的 “四问” 思维模式。这种 “四问” 思维并不是积木式开发体系所特有的。在我们日常工作中其实都在应用。当我们遇到问题时,我们总是会发出一连串的问句——类似事情是不是发生过?如果我们自己没有发生过,那么周围的朋友是否发生过?我当时是怎么应对的?我这次是不是也可以用类似的方式应对?一个典型的例子,当我们站在马路边打不到车时,我们会想有没有在相同的位置打到过车,如果在这里没有打到,我是不是换了另外的位置打到了。遇到技术问题的时候,我们也是一样的,如果我们自己身上没有发生就会问周围的同事,再不行就上网搜索,到 Stack Overflow 这类的社区里面去寻找答案。
在积木式开发体系中,我们将这种思维模式固化下来。“标准解决方案” 就是行业方案,“推荐解决方案” 是我们在个别客户实施的成功经验和典型案例。当我们在行业方案和典型案例中都找不到,我们优先采用简单的 “声明 / 配置” 方式来解决。如果以上办法都行不通,我们要考虑编写代码实现或者寻找第三方的帮助。解决问题的过程通常会反哺我们的经验集。在积木式开发体系中,我们会以系统的方式沉淀这种成功经验。一步一步形成我们自己的 “标准解决方案”。
2. 建立“七层组件” 界面结构
界面是功能的具体体现,自然也是积木式开发体系中实现配置化的重头戏。纵观我们身边的各种企业数字化系统,虽然形式多种多样,但整体上都可以用分层的方式来分析其界面构成。业界有很多不同的方式来组织前端的 “组件化”,积木式开发体系将这种封装(分层)的方式固化下来,形成 “七层组件” 的界面结构。从大到小分别是:
这种七层组件的界面结构井然有序,即能够有足够的规律性支持我们的“配置化”,又能兼顾多终端、企业个性化带来的变化。
3. 理清界面 “拼装” 流程
在 “七层组件” 的界面结构基础上,界面 “拼装” 的流程主要涉及 Client-Side 、 UI Provider 和 Data Provider 三个部分。一个页面要呈现时 Client-Side 首先会向 UI Provider 请求布局数据,在取得布局数据之后 Client-Side 生成界面结构,同时向 Data Provider 请求需要绑定到界面中的业务数据,在布局和数据绑定都完成之后,完成整个界面的渲染工作。是的,过程就这么简单,一个系统的界面就完整地呈现在用户面前。
接下来让我们揭开 Data Provider 的面纱,一起探究背后的秘密——积木式开发体系的逻辑堆叠体系。
4. 建立可定制、可扩展的逻辑处理系统
逻辑和界面的关系,本身也分为几层,第一层就是基本的数据展现,我们的软件首先要做到的是在正确的位置展现正确的数据。如何能够做到整个基本的要求呢?在积木式开发体系中,我们针对 “七层组件” 结构中与业务相关的部分抽取出来,并形成与之对应的 三层逻辑结构 。这三层结构由如下内容构成:
这 三层逻辑结构 ,一方面与界面 七层组件 对应,一方面规范所有业务逻辑的堆叠方式。通过这种机制,形成统一的语言描述业务实体之间的关系,也就形成了统一的上下文描述体系。
5. 建立事件代理体系
业务逻辑的堆叠体系除了业务实体间关系,还有逻辑的处理过程。在积木式开发体系中,逻辑的处理过程我们引入 事件 、 代理 、 声明 三种概念。
我们通过这事件体系形成了统一的逻辑描述体系,深度整合了 AOP 的思想,统一了代码风格,无形中提高了代码质量。同时也在框架级别统一埋点方式为自动化测试提供支持。
6. 快速配置开发工具
有了方法论和 “四问” 思维的指导,也有了从界面到逻辑的堆叠体系,我们的积木式开发体系大体上可以完成。但这些还不够,因为我们还不够快。我们还需要一些配套工具。
有了这些工具的支持,我们才能方便、快捷地完成基于配置的开发工作,积木式开发体系的效率才能最大程度地发挥出来。
四、积木式开发体系的成绩
在国双,我们通过实践 “积木式开发体系” 取得了不小的成绩。在开头提到的 “某热力集团智慧能效系统” 和 “某石油生产企业可视化监控系统” 两个项目中,我们的工作量分别是 1 人月和 3 人月,最终我们顺利完成了项目的交付工作。
通过积木式开发体系的实践,我们在 “业务”、“效率”、“质量” 三个方面都得到了提升:
积木式开发体系也不是银弹,不能适合所有的软件开发。积木式开发适合于 重复性工作多 、 规律性强 、 界面一致性高 、 逻辑课堆叠 的场景。具体表现在界面、实体等复用多的地方。企业应用为了提高工作效率,通常会以各种维度将信息整合在一起,比如顾客、订单、商品、价格、合同、收款等多种实体会相互串联,形成一个无处不通的网状结构。而对于类似 Word、Excel 或者 Photoshop 这种 界面超级复杂 的,或者 纯数据科学、算法 则不太适合。
关于更多的积木式开发体系内容,请关注我接下来的系列文章。
作者介绍:曹荣权,国双技术总监,先后供职于猫扑社区、亚信科技移动事业部。5 年创业经历,2016 年加入国双科技。熟悉客户关系管理、数字营销、忠诚度管理等多个领域,经历涵盖电信、能源、航空、餐饮等行业,是国双积木式研发体系的布道者。