机缘巧合下,一次偶然,让我有机会参与日本东芝公司电制事业部G2平台研发,该平台是用于支撑东芝各类工业嵌入式设备快速研发的技术平台。这段经历,让我惊奇的发现其研发模式完全迥异于我以前的认知。这段经历不仅让我大开眼界,也开始倒逼自己认真思考这种工作模式的优缺点。为何要这样做?这样做的优点是什么?又是如何一步步迭代到目前这个样子的呢?
从表面看,这种研发模式最典型的特征是努力提升工作(包含代码,设计文档甚至培训讲义等,但本书以代码复用为切入点)复用率,当然还有很多可参考借鉴之处,本章我会和大家分享一些这种研发模式中让自己很震惊的特征。
在东芝内部,大家习惯将这种研发模式称之为“平台化”模式。不过平台化这个词估计早就被各行各业用烂了,担心大家望词乱生义,在本书中我喜欢称之为高复用研发模式,或者高复用严格平台化架构,但不可避免的依然会频繁使用到平台化这个词语,希望大家不要误解。
1.3.1 夸张的代码复用率
我刚加入该项目组时,是由一位做规约开发的工程师带我熟悉整个研发流程。借助这个机会,我有幸阅读了他实现的一个规约程序,虽然仅仅是电力系统最常见的IEC104远动规约,但让我在内心中重新定义了“代码复用”这个概念。
我们平时做产品,代码复用是经常的事情。我的产品中需要某个功能,而恰好你的产品中已经实现过了,找你领导商量一下,然后将代码拷过来改一改,OK,搞定。这可能就是我们认为的代码复用。
与我们不一样,该规约项目组复用时不是直接将代码拷贝给其他项目组,而仅仅将编译后的中间文件和头文件导入代码库,其他项目组用配置软件直接导出复用就好。
大家看出关键差异了吗,其关键就在于我们需要改一改,而这儿不需要。因为不需要将一份代码维护成多个版本,这才是一种真正的复用。注意,从今而后,本书中一旦提到复用,都是指这种一个字符都不用修改的复用策略。
做过产品的工程师都知道,即使同样是104规约,很多产品线都存在着多多少少的差异,各个市场也会提出一些特殊的需求。这种情况下,是如何做到代码完全复用的呢。我阅读并分析代码后,发现关键需要做到如下几方面的工作:
-
需要抽象提炼各类数据模型api接口。
规约程序需要访问很多具体的数据模型,如遥测、遥信等,这些数据模型在各类产品中概念大致相似,但或多或少的会存在细节上的差异,且会随着需求而持续变化。为了规约程序不受影响,就需要细致的提炼数据模型api接口。 -
构建动态执行架构,兼容前后台,实时OS或linux等多种运行环境。
工控产品应用领域差异很大,因成本或需求要求不同,有些是前后台裸系统,有些则会使用复杂的强实时OS,或者使用linux系统。大家都知道前后台系统是简单的函数调用,而OS中是一个个的死循环任务函数,不想分别实现一套104规约,就需要构建抽象层,兼容各种运行环境。 -
构建规约数据参数配置表,需要维护软件或配置软件的支撑。
各类装置虽然都使用104规约机制传输,但传输的具体数据却存在很多差异。因此,想让规约代码可复用,代码具体实现中就不能涉及任何特定的数据,用IT术语来说,规约代码只能针对数据接口进行编程。为了应对这种情况,需要额外构建各装置的数据接口配置表。如果规约传输的数据允许用户现场设置,该部分功能一般会内嵌在维护软件中,如果仅允许在厂内修改或合作伙伴二次开发,经常会内嵌在配置软件中(配置软件和维护软件会在后续框架设计中详述)。 -
可扩展程序架构,以支持各种二次开发环境。
104规约虽然是国际标准,但在具体实施的过程中,大家总是会忍不住去扩展或修改它,因此会诞生各种区域版本(我实现过特殊的中东版本)、工程版本、特殊需求版本等。如何应对这种需求呢?最好的策略是分层,将104规约最基本的功能作为可复用模块进行构建,并提供二次修改的机制。最常见的二次扩展机制有参数文件、脚本和二次开发环境等(这些机制各有优缺点,在后续框架设计中都会提及)。 -
依据需求持续优化迭代。
任何设计初期都可能存在不足,有些地方会考虑不周,而有些扩展选项又从未用过等。在实际工作中,我们经常是保持程序架构稳定,但会持续的优化细节。打磨的时间久了,我们就会惊奇的发现针对某一行业的程序改动频率会越来越小,此时,可复用的104规约模块就构建完毕了。
至此,我们终于完成了可复用104规约模块的构建。不知大家有没有意识到,其中提及的api接口、动态执行框架、配置软件、维护软件、脚本系统、二次开发环境等都不是104规约范围内的概念,为了完成104规约的复用,需要诸多模块配合,甚至平台级的支撑,而这,也正是可复用模块不容易做到的底层原因。
困难是有的,但如果你能闭眼想一想,假如我们的产品中,甚至我们部门负责的几条产品线,更甚至我们整个公司,所有的软件模块都是以类似这样的模式构建的,会是怎样的一种情景呢。下图是我当初参与具体研发工作时导出的可复用模块接口配置表(留意滚动条,最终会通过配置软件读取生成接口文件并下载到设备中),大家能感受到我当初的那种震撼心理吗?
基于大量可复用的软件模块,研发新产品就会简单很多了,其主要流程如下图所示: