论软件系统建模方法
摘要
我所在的单位是教育行业某企业,2018年5月我公司开始某市教育云平台的建设工作,平台以《教育信息化2.0行动计划》为指导,面向全市老师、学生、家长,以及教育局管理人员提供针对性的、多元化的教育服务。我在该项目中担任软件架构师一职,主要负责技术架构设计工作,本文以该项目架构建模为例,论述了常用的几种软件开发模型,以及建模方法,然后结合我参与项目的实际情况,说明在这次项目中所涉及的技术架构,最后是分享该项目取得实践效果。
正文
《教育信息化2.0行动计划》提出,要加大教育信息化投入力度,坚持试点先行、典型引路的推进机制,形成以点带面的发展路径,大力开展各级各类学校教师、校长和管理者培训。从而教育行业面临的变化和影响主要体现在(a)教育治理的改变,管理部门有针对性的教育和管理,将会更加科学和精准; (b) 学生学习方式的改变,获取知识途径增加,掌握知识的效率提高;(c)教学方式的改变,新工具、新技术、新视野将会改变传统的教学模式,教师从“教”转向“启发者”。
根据调研结果,我们把该项目的核心需求列出,1:业务范围广,面向省、市、县三层机构的信息管理,以及多角色的参与,如老师、学生、家长、教育局管理人员;2:核心应用多,如直播、大赛、备课、网络教研、网络画板、视频会议、考阅等等数十个应用,另外还需要支持可配置接入新应用的能力;3:属于试点工程,的起到示范作用,因此对于非功能性需求要求高,如可用性、性能、可修改、安全性等;4:由于项目涉及业务、人员较多,且最后需要通过监理公司的验收。经过分析讨论,我们最终采用以瀑布开发模型为主,采用结构化开发方法进行项目发。
瀑布模型也称为生命周期法,它把软件的开发过程分为6个阶段:计划阶段、需求分析阶段、软件设计阶段、软件编码阶段、软件测试阶段、软件部署运维阶段,其核心思想从上到下、相互衔接固定次序,如瀑布流水逐级开发。本文主要以计划阶段、需求分析阶段、软件概要设计、软件详细设计的角度来阐述软件开发以及软件建模的主要过程。
计划阶段
我们主要完成该项目的可行性分析、目标的确立,以及相关文档的输出,如总体上确定了本平台需要完成的功能,主要包括基础平台开发、核心应用开发、开放平台开发(接入自研或三方成熟应用)、数据中心开发这几部分工作。可行性方面我们调研了平台开发准备采用的一些技术框架以及快速开发框架,在应用接入方面我们调研了主流SSO实现技术,如 cas以及 springoauth2 的解决方案;在接入缓存方面,我们调研了主流的分布式缓存方案,如 redis、 memcache;在数据库建模方面,我们调研了基于 powerdesigner的建模工具,以及梳理学习了数据建模的主要阶段。
需求分析与需求建模
在该环节,我们采用多种方式进行需求的获取和确认,如采用调查问卷方式、专家访谈,以及结合原型的方式和目标用户沟通交流、快速迭代等。经过对需求获取的资料进行分析,并以此建立起来的模型称之为需求分析模型,需求分析模型主要描述软件目标系统的数据信息、处理功能、用户界面以及运行的外部行为,它充分体现了分而治之的概念,把复杂的困难问题分解细化后,帮助系统分析员理解系统的信息、能和行为,使得需求分析任务更加容易实现,结果更加系统化。在收集完需求以后,分析人员可以挑选出其中的关键字,将关键字转换成特定模型元素,按照系统中数据处理的流程,用数据流图(DFD)来建立系统的功能模型,从而完成需求分析建模工作。 为了表达数据处理过程的数据加工情况,需要采用层次结构的数据流图。按照系统的层次结构进行逐步分解,并以分层的数据流图反应这种结构关系。在多层数据流图中,顶层流图仅包含一个加工,它代表被开发系统。 它的输入流是该系统的输入数据,输出流是系统所输出数据。低层流图是指其加工不需要在做分解的数据流图,它处在最底层。中间层流图则表示对其上层父图的细化。它的每一加工可能继续细化,形成子图。
在有了初步的数据流图之后,我们需要对数据流图里面的存储模块进行进一步设计、描述,我们采用了基于powerdesiner 建模工具来对其进行数据建模工作,数据建模过程主要分三个阶段,1:概念建模,这个阶段仅涉及系统主要实体,以及实体和实体之间的关系,从宏观的角度体现系统构成,如在备课应用中围绕老师相关的实体包括作业、教案、资源等;2:逻辑建模,该阶段涉及到了实体的具体属性列,以及属性的类型(可选),如资源实体的属性列可能包含了教材、版本、科目、章节、单元、资源类型、资源来源、知识点等,资源类型的字段类型为数字、长度 2,资源内容的类型为字符串大字段 CBLOB 等;3:物理建模,该阶段是以上过程进一步的细化、约束,增加了主外键约束,它不仅仅是概念理论上的内容了,我们可以通过建模工具直接生成mysql或者 oracle 的实体表结构;
软件设计阶段
软件设计阶段主要是对基于DFD的功能模型的细化和对基于ER图的数据模型的细化,在该阶段分两个步骤,概要设计和详细设计,概要设计主要包括系统的功能架构建模、接口建模、数据库建模等,详细设计主要从代码结构的角度出发,如代码层级结构设计、功能模块设计、核心算法,以及部分伪代码等最终形成详细设计文档。
概要设计阶段,首先我们根据数据流图推导出整体功能架构,用结构图来表示,如项目包括了市、县、校多级结构,平台最上面是统一门户入口,往下是业务应用层,再往下基础平台、资源平台、单点登录、数据中心等应用系统做支撑,最下面是分布式缓存、分布式文件系统,以及关系型数据库系统负责数据存储、数据缓存工作,另外有全局的安全体系保驾护航,核心数据加密、核心服务开启 https等。其次我们依据数据流图以及数据字典,进一步完善数据模型,基于概念模型进一步补充实体关系、实体列、以及列的类型、主外键约束等。最后是接口部分,通过数据流图、数据字典,我们梳理出系统需要交互的部分形成 api接口,在该系统我们主要采用 rest风格的方式对外提供接口,它有轻量级依赖(基于http)、较少设计(都是常用方法,很少单独设计)等优点。
详细设计阶段,该阶段更多的是代码级别的考虑,以及完成具体功能的设计、UI界面等,如我们的代码层级主要包括对外接口、安全认证、异常处理、业务逻辑层、数据逻辑层等,项目中还设计到多种算法,如基于一致性hash 的分布式缓存存储、基于选举算法的注册发现服务、优质资源推荐算法等。我们基于spring-oauth2做用户认证、基于非对称以及对称加密相结合的方式完成接口认证工作,使用 spring 技术框架以及基于3种基本控制结构(顺序、选择和重复)构造程序,基于 mybatis 来完成数据层的工作和数据库交互,另外基于性能和共享同步数据的需求,我们引入了基于 kafka 的消息机制来完成数据同步;
非功能性需求补充
此外我们在基于软件质量方面也进行了综合考虑与设计,软件的质量属性主要包括性能、可用性、可修改性,以及安全性。在性能方面,首先从代码逻辑角度能并行的并行,能异步的异步;在可用性方面,我们所有的模块均基于无状态设计,支持分布式集群,有个别服务处问题可以很快快由其他服务替代,我们针对接口服务做了限流、熔断策略,在服务压力大的情况下可以部分服务降级或关闭等;在安全方面,我们针对重要数据存储脱敏加密,针对服务调用、数据交换有统一授权管控,同时我们的生产运行环境达到国家要求的安保等级。在可修改性方面,我们会尽量依据高内聚低耦合的指导思路对服务进行设计与开发,从而提高软件的易修改、易扩展特性。
经验与教训
在本次平台系统建设过程中也遇到了一些难题,以及存在待优化改进的地方,如接入的三方应用质量参差不齐,需要有更完善的监控、统计、预警功能;某些应用依赖过多,导致服务本身质量下降,可能更适合走数据中心,而不是调用大量服务接口;业务系统很多,多套技术框架并存,从而引发过多设计、框架冲突等问题。
取得的实践效果
通过对该平台系统的开发,我体会到软件架构设计的重要性,以及了解了多种开发模型、多种建模技术,总之国家以及企业的信息化程度越高,所需的技术以及架构就越复杂,也越需要我们多思考最适合我们的架构以及开发模型。经过7个月的连续奋战,平台顺利上线并稳定运行至今一年多,目前已在全市多个区县推广,得到了领导、员工、客户的一致好评。
评论区