摘要:
2021年3月,我参与了我司人大履职系统产品的构建工作,该系统主要功能包含立法工作、建议管理、信息管理、OA、系统配置等。本人在该系统中担任系统架构师,主要负责系统架构工作。本文以该系统为例,主要论述了软件产品线技术的具体应用。在软件产品线实施背景分析阶段,论述了公司项目现状和实施软件产品化的必要性,在软件产品线设计阶段,对公司项目进行了逆向工程分析,形成了以核心资源库为中心的软目产品线实施方案,在软件产品线实现阶段,使用了分层架构和多种设计模式,成功构建了公司产品的核心资源库,通过软件产品线技术的实施,我司在相同领域内的系统构建方面,取得了快速、可靠、资源投入低的优势。产生了良好的经济效益。
正文:
自2019年以来,我司先后实施了某省代表履职平台、某省建议办理系统、某市建议办理系统、某市立法系统等十多个项目。代表履职平台主要模块有人大代表管理、履职档案模块、代表信息模块、系统设置、议案模块、消息模块、会议模块、代表履职活动模块等。建议办理系统主要包含建议模块、议案模块、代表信息模块、系统设置、消息模块等。立法系统主要包含法规库建设、备案审查模块、系统设置模块、消息模块、代表信息模块、立法征询模块等。上述项目在许多方面用到的功能是通用的,比如系统设置模块,所包含的菜单管理、权限管理、字典管理、配置管理、角色管理等功能是所有项目都需要用到的。消息模块的短信、站内消息、待办消息是通用的。代表信息管理的届次管理、代表个人信息管理、代表统计分析等是共性的。不通用的方面,履职平台的建议管理、议案管理、立法生活费纺的法规相关模块是个性化的模块。公司过往以项目为单元,采用版本分支方案来开发项目。造成开发成本高、项目维护成本高、系统重复造轮子等不良局面。因此决心建设公司产品。本人在产品项目中担任系统架构师职务,主要负责系统的架构设计工作。
软件产品的实施是我司的一项战略性规划,稳定、可靠、可复用占比高、资源投入低的产品有助于我司提高在人大系列项目领域内的核心竞争力和大幅降低开发成本。因此,对产品质量要求较高。在具体实施过程中,产生了许多方面的问题。这些问题包含架构设计、组件设计、业务模块划分、二次开发问题等多个方面。架构设计方面,我们在微服务、单体应用两种方案之间做了权衡,从学习成本、模块扩展性能、使用用户群体规模、历史项目经验等方面。选择了单体应用。但对其做了优化。不再使用庞大的maven聚合项目。而是单个模块单独组件工程开发。然后在具体系统内把各模块打包的jar包依赖进来。组件设计方面,我们对什么是组件、组件应具备哪些特性等做了分析。对组件进行了分类,这些分类有系统通用工具类组件、第三方框架及整合和扩展组件、消息组件、业务模块通用组件等。组件应具备可扩展,稳定性好、可复用的特性。业务模块划分方面,我们使用了UC矩阵等方法,解决了业务模块边界划分的问题。二次开发问题方面,项目怎么修改产品功能以满足二次开发需求是需要解决的。为此,产品采用了责任链设计模式、策略设计模式等方法。解决了修改和扩展问题。
下面,本人将从软件产品线实施背景阶段、软件产品线设计、软件产品线实现三个阶段。详细论述产品线技术在我司产品上的应用。
软件产品线实施背景分析阶段
过往,我司有新的项目所采取的开发方法大多以项目切分支复制方方式。即找一个功能模块大致相同的项目。拉取一个git分支。然后在此基础上改动代码或开发新功能。在项目初期,项目软少、领域知识储备较少、同类型类比项目较少的情况下。这种做法是可行的。项目整体处开一个开荒阶段。具有复制速度快、开发人员熟练度高、项目基本可控的优点。但随着公司在人大业务领域人的深入发展。缺陷逐渐显现出来。这些缺陷体现在很多方面。主要有项目维护困难、问题传播面广、重复造轮子、代码可复用性差、代码可修改性差、人力资源投入大等。项目维护困难方面,已上线的项目需要完善、改正、适用变化时,只能单个单个系统去升级维护,这是一种效率极低的点对点式维护,不能达到由点及面的要求。问题传播面广方面。由于采用了复制式的开发方法。当一个分支的代码有问题时,会扩散到所有项目。每个系统都得单独去修改。重复造轮子方面,系统需要的组件需要负责系统的人员重复编写。
软件产品线分析阶段
团队通过对以往项目作逆向工程分析。总结出过往项目存在许多不足之处,如可修改性差、可复用性差、维护升级困难、可扩展能力差等。比如同一个功能的某个构件可能存在重复造轮子的现象。在某个项目中的代码是一个版本,在另一个项目中的代码又是另一个版本。因此,团队为了避免这类问题的复现,全面的标识出了人大领域内的一些通用构件、通用业务模块、基础版业务模块。通用组件方面,我们抽取了几个大类。比如通用工具类构件、第三方构件的引入及扩展构件、通用的基础类库、消息构件、字典构件、附件构件等。通用业务模块方面,团队将系统设置、代表管理模块、通知公告、资讯服务、活动安排作设计成所有项目通用的模块,这样,项目二次开发可以直接省去这部份的开发工作。基础版本业务模块方面,团队将建议模块、立法模块、会议模块、履职档案模块等各项目的差异的模块进行了需求简化,只保留最精简的那部份功能。在项目上再进行二次开发扩展。
软件产品线实现阶段
架构实现过程中,团队紧紧围绕分析阶段所标识的构件为中心,努力提高代码的可复用性、可扩展性、可修改性、可配置性。为此,团队对代码进行了分层设计和编写,从高到低,依次是核心层、组件层、模块层。下层次代码依赖上层次代码。核心层主要包含基本类库、第三方框架整合、项目依赖版本管理三个方面的代码。基本类库指系统使用的工具类、通用接口等。框架整合指对Spring框架、MyBatis框架所做的整合和扩展。版本管理指在顶层的maven配置里,对整个项目的jar包版本进行管理。组件层指公司独立构建的本地组件库。包含系统安全组件、系统业务通用组件、系统消息组件等。系统安全组件指系统认证、访问控制、访问日志记录等。系统业务通用组件指系统字典管理、系统配置管理、系统流程管理等。系统消息组件包含系统消息、待办消息、短信提醒、通知公告等。系统模块层将业务模块划分成独立的开发单元,根据系统业务范围,将不同的业务模块在具体的项目中进行组装,形成最终系统。
通过软件产品线的实施,公司成功开发出了人大履职系统产品项目。该产品具备了可复用性高、可修改性高、开发周期短、开发资源投入要求低等一系列良好的优点。在取得良好的经济济效益的同时,也提升了公司的核心竞争力。人大产品于2021年11月顺利落地,并先后实施了数个相同领域内的产品,得到了用户的一致好评。
但是,我们在构建人大履职产品的同时,也存在许多不足之处,比如在基于产品做二次开发扩展方面,如果想要修改产品已有的某个功能,可修改性能较低,往往需要重写该功能才能达到目标。为此,团队经过认真分析,对原有的逻辑代码进行了改造。将逻辑代码使用了责任链设计模式配结合XML配置的方式。将逻辑拆分成一组相对独立的微小逻辑单元,然后使用责任链串连起来。在XML配置中可实现对链上节点的移除、添加、替换等操作。 这样一来,大大提高了产品的可修改性能。为公司节省了二次开发时间和人力投入。产生了良好的经济效益。