论基于构件的软件开发

  声明:本文为本人在软考系统架构设计师备考期间的练手写作,不保证内容的原创性与正确性,仅供参考,请勿照抄和用于学术论文等正规场合,因不当使用产生后果一律自负。

摘要

  2019年3月,我单位联合某高校研发了《程序在线评测比赛考试系统》。系统以程序代码在线提交自动评测功能为核心,分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等,支持对接教务平台。在项目中我担任系统架构师,负责架构设计工作。
  本文以该系统为例,主要论述了基于构件的软件开发技术在项目中的具体应用。系统基于Spring Cloud微服务框架来进行构件化开发,在构件获取阶段通过对接现有系统、使用构件库、集成第三方软件来实现需求,在构件开发阶段使用了多种设计模式来保证构件的可重用性,在构件组装阶段使用了同步消息、异步消息、工作流方式来实现不同业务类型下构件的组合。最终项目顺利上线并稳定运行,获得用户一致好评。

正文

  笔者在一个专为高校建设计算机专业智能教学一体化平台的单位任职,过往成果有《计算机组成原理仿真实验系统》等。2019年3月,我单位联合某大学研发了《程序在线评测比赛考试系统》项目(以下简称为“OJ系统”),以取代原有传统的编程上机考试平台。
  系统以程序代码的在线提交自动评测功能为核心,主要分为题库模块、评测机模块、实验作业模块、考试模块、比赛模块、抄袭判定模块、用户管理模块等。题库模块主要负责试题和测试用例的管理,用户根据试题要求编写程序代码提交到系统,系统将测试用例与程序代码发送给评测机模块,由评测机自动编译、执行、判分,并将结果发送给其他相关模块进行统计;实验作业模块用于在线布置作业,从题库中选取试题,设置截止日期等要求;考试模块用于学生在线考试,按教师预先设置的参数自动从题库随机抽题生成试卷,以及向教务平台上传考试成绩;比赛模块主要用于ACM竞赛的培训;抄袭判定模块用于鉴定代码与他人代码雷同率;用户管理模块负责用户信息的管理。在这个项目中,我担任了系统架构师的职务,主要负责系统的架构设计相关工作。
  构件技术是指通过组装一系列可复用的软件构件来构造软件系统的软件技术。通过运用构件技术,开发人员可以有效地进行软件复用,减少重复开发,缩短开发时间,降低软件的开发成本。主流的构件技术有三种:CORBA、EJB和COM。CORBA分为对象请示代理、公共对象服务和公共设施三个层次,优点是大而全,互操作性和开放性好,缺点是庞大且复杂,技术标准更新缓慢;EJB基于Java语言,支持跨平台,提供了远程访问、安全、持久化和生命周期等机制,支持分布式计算,缺点是服务治理能力差,逐渐被Spring Cloud等轻量级框架取代;COM基于Windows平台,功能强大、效率高,有一系列开发工具支持,缺点是跨平台性差。基于构件的软件开发过程主要分为模块划分、构件标识、构件获取、构件组装与测试、构件管理等步骤。
  OJ系统采用了基于Spring Cloud的微服务架构开发。这里重点从构件获取、构件开发、构件组装三个阶段说明本系统采用构件化开发的过程。

1. 构件获取

  在OJ系统中,可复用的功能需求和非功能需求从实现方式上分为三类。第一类需要对接现有系统实现,比如需要将学校在用的OA、教务管理两套系统中的学生信息与课程信息同步到OJ系统中,我们通过访问OA、教务管理的开发商网站,联系开发商,取得了相关接口调用的SDK。第二类是常见信息系统中共同具备的用户管理、角色权限管理、日志记录、内容维护、消息中心等基本功能,我们通过取用单位过往项目开发中所积累的构件库中的相应构件(例如RBAC权限管理框架)来实现。第三类需要集成第三方的软件来实现,例如微服务注册中心、API消息路由网关、负载均衡机制、程序评测时调用的编译器、代码抄袭判定的文本比对功能等,无需另行开发,我们使用了Spring Cloud中的Eureka框架来作为微服务注册中心,Nginx反向代理来作为负载均衡机制,GCC、JDK等作为编译器,针对文本比对功能,我们使用了GitHub上的开源程序。此外我们还根据OJ系统的使用场景,重新开发了一些功能构件,以支撑本系统特定的用户需求。

2. 构件开发

  构件的优势体现在其粗粒度的重用性,因此为最大限度保证构件的可重用性和重用力度,保持其高内聚、低耦合的特性,我们在开发中用到了一些经典的设计模式,例如装饰器模式、策略模式、工厂模式等。在题库构件中,存放了全部的试题数据,包括题目介绍、测试用例等公共内容,同一试题在自由练习、实验作业、考试、比赛等不同使用场景下,需要增加不同的扩展功能。我们使用了装饰器模式,来给试题对象动态添加不同职责。在评测机构件中,需要同时支持对C语言、C++、Java、PHP、Python等多种常用编程语言程序的评测,不同语言对应的编译与执行方法存在较大差异。我们使用了策略模式,将不同语言的编译和执行方法封装起来,并使它们可以相互替换。在数据库连接构件中,因不同的业务需求,需要同时支持不同种类型的数据库,包括MySQL、Oracle、SQL Server三种。我们使用了工厂方法模式,有效解决了不同数据库类型对软件程序的影响,具有很好的可扩展性。这样的设计有效地体现了构件的优势。

3. 构件组装

  OJ系统中不同的业务类型,需要采用不同的构件组装方式。在本系统的开发过程中,我们用到了以下三种方式。首先是同步消息方式,以考试功能为例,用户进入考试时,考试构件需要核验考生信息,然后调取题库中的试题信息组成试卷,在此过程中,考试构件使用同步方式,依次向考生构件、题库构件请求数据,等待返回结果后再加工、组合,提供给调用者。其次是异步消息方式,以程序代码的在线提交评测功能为例,评测机构件对代码的编译、执行、判分过程,相比于其他构件的数据处理过程,属于耗时操作,这时如果采取同步方式,将引起调用者阻塞,严重影响了用户体验,甚至出现雪崩效应。因此采用了异步消息队列,代码提交后写入消息队列立即返回原程序执行,待评测机评测完成后再异步显示评测结果。最后是基于工作流的方式,能够通过图形化的界面,动态编排系统构件之间的交互和依赖关系,灵活改变多个构件之间协同工作的顺序,通过简单构件的组合,以实现复杂功能的定制。

总结

  系统自2019年10月正式上线已运行一年有余,在学校的日常教学考试和竞赛培训中投入使用,截至目前已有3000以上的学生用户、评测了70000条以上的程序代码,获得了单位同事领导和学校教师们的一致好评。
  实践证明,OJ系统项目能够顺利上线,并且稳定运行,与系统采用了基于构件的开发方式密不可分。经过这次构件化开发的方法和实施的效果后,我体会到了软件元素重用对开发过程的重要价值。从软件开发的方式看,由机器语言、汇编语言,到面向过程开发、面向对象开发,再到现在基于构件、面向服务的软件开发,软件元素在两个维度上呈现进化趋势:内部功能越来越强大、全面,对外的接口越来越简单、标准。最终各领域软件可在一个统一标准下无缝组装,届时面向协作的软件开发、基于职能的软件开发等新技术都将出现,上层应用功能的实现也将变得异常简单,计算机软件将会无所不在,数字化生活、智能地球等现在还处于概念阶段的事物,将会走进现实。这个目标值得我们每一位软件从业人员为之努力奋斗。

你可能感兴趣的:(系统架构设计师论文,软件架构,软件架构师,架构师)